Программа для нахождения С.Д.Н.Ф. по двум заданным числам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

помогите перевести код на си с ява вот код:
Листинг программы
  1. import java.io.*;
  2. import java.util.*;
  3. /*----------------------------------------------------------/
  4. /Программа для нахождения с.д.н.ф. по двум заданным числам. /
  5. /Казарин М.В. гр. 4102 РГР - 2014г. /
  6. /----------------------------------------------------------*/
  7. public class Disk
  8. {
  9. public static void main(String[] args)
  10. {
  11. Scanner in = new Scanner(System.in);
  12. try
  13. {
  14. PrintWriter wrt = new PrintWriter(new OutputStreamWriter(new FileOutputStream("result.txt")), true);
  15. System.out.print("Введите N1: ");
  16. int n = in.nextInt();
  17. int[] ar = translate(n);
  18. int[][] br = mat();
  19. System.out.println("С.д.н.ф. для N1: " + sdnf(ar, br) + "\n");
  20. wrt.println("С.д.н.ф. для N1=" + n + ": " + sdnf(ar, br));
  21. System.out.print("Введите N2: ");
  22. int n2 = in.nextInt();
  23. int[] ar2 = translate(n2);
  24. System.out.println("С.д.н.ф. для N2: " + sdnf(ar2, br) + "\n");
  25. wrt.println("С.д.н.ф. для N2=" + n2 + ": " + sdnf(ar2, br));
  26. }
  27. catch (Exception e)
  28. {
  29. System.out.println("Ошибка! Вы ввели неверное число.");
  30. }
  31. }
  32. /*----------------------------------------------------------/
  33. / Перевод числа в двоичную систему. /
  34. /----------------------------------------------------------*/
  35. public static int[] translate(int n)
  36. {
  37. int[] a = new int[8];
  38. for (int i = 0; i < 8; i++)
  39. {
  40. a[i] = (n % 2);
  41. n = (n / 2);
  42. }
  43. for (int i = 0; i < 4; i++)
  44. {
  45. int k = a[i];
  46. a[i] = a[7-i];
  47. a[7-i] = k;
  48. }
  49. return a;
  50. }
  51. /*----------------------------------------------------------/
  52. / Таблица истинности (таблица переменных). /
  53. /----------------------------------------------------------*/
  54. public static int[][] mat()
  55. {
  56. int[][] b = new int[8][3];
  57. b[0][0] = 0;
  58. b[0][1] = 0;
  59. b[0][2] = 0;
  60. for (int i = 1; i < 8; i++)
  61. {
  62. if (b[i-1][2] == 0)
  63. b[i][2] = 1;
  64. else b[i][2] = 0;
  65. }
  66. for (int i = 1; i < 8; i=i+2)
  67. {
  68. if (i!=7)
  69. {
  70. b[i][1] = b[i-1][1];
  71. if (b[i][1] == 0)
  72. b[i+1][1] = 1;
  73. else b[i+1][1] = 0;}
  74. else b[i][1]=b[i-1][1];
  75. }
  76. for (int i = 1; i < 4; i++)
  77. {
  78. b[i][0] = 0;
  79. }
  80. for (int i = 4; i < 8; i++)
  81. {
  82. b[i][0] = 1;
  83. }
  84. return b;
  85. }
  86. /*----------------------------------------------------------/
  87. / Нахождение с.д.н.ф. /
  88. /----------------------------------------------------------*/
  89. public static String sdnf(int[] a, int[][] b)
  90. {
  91. String s = "";
  92. String s1 = "(x&";
  93. String nes1 = "(!x&";
  94. String s2 = "y&";
  95. String nes2 = "!y&";
  96. String s3 = "z)";
  97. String nes3 = "!z)";
  98. int k = 0;
  99. for (int i = 0; i < 8; i++)
  100. {
  101. if (a[i] == 1)
  102. {
  103. if (k!=0)
  104. s = s + "v";
  105. if (b[i][0] == 1)
  106. s = s + s1;
  107. else s = s + nes1;
  108. if (b[i][1] == 1)
  109. s = s +s2;
  110. else s = s + nes2;
  111. if (b[i][2] == 1)
  112. s = s +s3;
  113. else s = s + nes3;
  114. k++;
  115. }
  116. }
  117. return s;
  118. }
  119. }

Решение задачи: «Программа для нахождения С.Д.Н.Ф. по двум заданным числам»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6. #define STR_LEN   128
  7.  
  8. int* translate(int);
  9. int** mat(void);
  10. char* sdnf(int*,int**);
  11.  
  12. int main(void)
  13. {
  14.     int n, *ar, **br, n2, *ar2;
  15.     FILE *wrt = fopen("result.txt", "w");
  16.     if(!wrt) return -1;
  17.     setlocale(LC_ALL, "ru");
  18.    
  19.     printf("Введите N1: ");
  20.     scanf("%d", &n);
  21.     ar = translate(n);
  22.     br = mat();
  23.     printf("С.д.н.ф для N1: %s\n", sdnf(ar, br));
  24.     fprintf(wrt, "С.д.н.ф для N1=%d: %s\n", n, sdnf(ar, br));
  25.    
  26.     printf("Введите N2: ");
  27.     scanf("%d", &n2);
  28.     ar2 = translate(n2);
  29.     printf("С.д.н.ф для N2: %s\n", sdnf(ar2, br));
  30.     fprintf(wrt, "С.д.н.ф для N2=%d: %s\n", n2, sdnf(ar2, br));
  31. }
  32.  
  33. int* translate(int n)
  34. {
  35.     int *a = malloc(sizeof(int) * 8), k;
  36.  
  37.     for(int i = 0; i < 8; ++i)
  38.     {
  39.         a[i] = n % 2;
  40.         n /= 2;
  41.     }
  42.     for(int i = 0; i < 4; ++i)
  43.     {
  44.         k = a[i];
  45.         a[i] = a[7-i];
  46.         a[7-i] = k;
  47.     }
  48.     return a;
  49. }
  50.  
  51. int** mat(void)
  52. {
  53.     int **b = malloc(sizeof(int*) * 8);
  54.  
  55.     for(int i = 0; i < 8; ++i)
  56.         b[i] = malloc(sizeof(int) * 3);
  57.    
  58.     b[0][0] = b[0][1] = b[0][2] = 0;
  59.  
  60.     for(int i = 1; i < 8; ++i)
  61.         if(b[i-1][2] == 0)
  62.             b[i][2] = 1;
  63.         else b[i][2] = 0;
  64.    
  65.     for(int i = 1; i < 8; i += 2)
  66.     {
  67.         if(i != 7)
  68.         {
  69.             b[i][1] = b[i-1][1];
  70.             if(b[i][1] == 0)
  71.                 b[i+1][1] = 1;
  72.             else b[i+1][1] = 0;
  73.         }
  74.         else b[i][1] = b[i-1][1];
  75.     }
  76.  
  77.     for(int i = 4; i < 8; ++i)
  78.         b[i][0] = 1;
  79.  
  80.     return b;
  81. }
  82.  
  83. char* sdnf(int *a, int **b)
  84. {
  85.     int k = 0;
  86.     char *s = malloc(STR_LEN);
  87.     char s1[]   = "(x&";
  88.     char nes1[] = "(!x&";
  89.     char s2[]   = "y&";
  90.     char nes2[] = "!y&";
  91.     char s3[]   = "z)";
  92.     char nes3[] = "!z)";
  93.  
  94.     s[0] = '\0';
  95.  
  96.     for(int i = 0; i < 8; ++i)
  97.     {
  98.         if(a[i] == 1)
  99.         {
  100.             if(k != 0)
  101.                 strcat(s, "v");
  102.             if(b[i][0] == 1)
  103.                 strcat(s, s1);
  104.             else strcat(s, nes1);
  105.  
  106.             if(b[i][1] == 1)
  107.                 strcat(s, s2);
  108.             else strcat(s, nes2);
  109.  
  110.             if(b[i][2] == 1)
  111.                 strcat(s, s3);
  112.             else strcat(s, nes3);
  113.             k++;
  114.         }
  115.     }
  116.     return s;
  117. }

Объяснение кода листинга программы

  1. Входные данные: n - число для которого необходимо найти С.Д.Н.Ф., ar, br - массивы для хранения полученных результатов.
  2. Выполняется функция translate(n), которая принимает число n и возвращает его двоичное представление в виде массива a.
  3. Результат функции translate(n) сохраняется в переменной a.
  4. Выполняется цикл, который проходит по всем битам числа a.
  5. Если бит равен 1, то к строке s добавляется соответствующая часть С.Д.Н.Ф.
  6. Выполняется функция mat(), которая возвращает матрицу b, представляющую собой таблицу истинности функций.
  7. Результат функции mat() сохраняется в переменной b.
  8. Выполняется функция sdnf(a, b), которая принимает массив a и матрицу b и возвращает С.Д.Н.Ф. в виде строки s.
  9. Результат функции sdnf(a, b) сохраняется в переменной s.
  10. Результат выводится на экран с помощью функции printf().
  11. Открывается файл result.txt для записи результатов.
  12. В цикле запрашивается ввод двух чисел N1 и N2.
  13. Для каждого числа выполняются шаги 2-10.
  14. Результаты выводятся на экран и записываются в файл result.txt.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы