Программа для нахождения С.Д.Н.Ф. по двум заданным числам - C (СИ)
Формулировка задачи:
помогите перевести код на си с ява
вот код:
Листинг программы
- import java.io.*;
- import java.util.*;
- /*----------------------------------------------------------/
- /Программа для нахождения с.д.н.ф. по двум заданным числам. /
- /Казарин М.В. гр. 4102 РГР - 2014г. /
- /----------------------------------------------------------*/
- public class Disk
- {
- public static void main(String[] args)
- {
- Scanner in = new Scanner(System.in);
- try
- {
- PrintWriter wrt = new PrintWriter(new OutputStreamWriter(new FileOutputStream("result.txt")), true);
- System.out.print("Введите N1: ");
- int n = in.nextInt();
- int[] ar = translate(n);
- int[][] br = mat();
- System.out.println("С.д.н.ф. для N1: " + sdnf(ar, br) + "\n");
- wrt.println("С.д.н.ф. для N1=" + n + ": " + sdnf(ar, br));
- System.out.print("Введите N2: ");
- int n2 = in.nextInt();
- int[] ar2 = translate(n2);
- System.out.println("С.д.н.ф. для N2: " + sdnf(ar2, br) + "\n");
- wrt.println("С.д.н.ф. для N2=" + n2 + ": " + sdnf(ar2, br));
- }
- catch (Exception e)
- {
- System.out.println("Ошибка! Вы ввели неверное число.");
- }
- }
- /*----------------------------------------------------------/
- / Перевод числа в двоичную систему. /
- /----------------------------------------------------------*/
- public static int[] translate(int n)
- {
- int[] a = new int[8];
- for (int i = 0; i < 8; i++)
- {
- a[i] = (n % 2);
- n = (n / 2);
- }
- for (int i = 0; i < 4; i++)
- {
- int k = a[i];
- a[i] = a[7-i];
- a[7-i] = k;
- }
- return a;
- }
- /*----------------------------------------------------------/
- / Таблица истинности (таблица переменных). /
- /----------------------------------------------------------*/
- public static int[][] mat()
- {
- int[][] b = new int[8][3];
- b[0][0] = 0;
- b[0][1] = 0;
- b[0][2] = 0;
- for (int i = 1; i < 8; i++)
- {
- if (b[i-1][2] == 0)
- b[i][2] = 1;
- else b[i][2] = 0;
- }
- for (int i = 1; i < 8; i=i+2)
- {
- if (i!=7)
- {
- b[i][1] = b[i-1][1];
- if (b[i][1] == 0)
- b[i+1][1] = 1;
- else b[i+1][1] = 0;}
- else b[i][1]=b[i-1][1];
- }
- for (int i = 1; i < 4; i++)
- {
- b[i][0] = 0;
- }
- for (int i = 4; i < 8; i++)
- {
- b[i][0] = 1;
- }
- return b;
- }
- /*----------------------------------------------------------/
- / Нахождение с.д.н.ф. /
- /----------------------------------------------------------*/
- public static String sdnf(int[] a, int[][] b)
- {
- String s = "";
- String s1 = "(x&";
- String nes1 = "(!x&";
- String s2 = "y&";
- String nes2 = "!y&";
- String s3 = "z)";
- String nes3 = "!z)";
- int k = 0;
- for (int i = 0; i < 8; i++)
- {
- if (a[i] == 1)
- {
- if (k!=0)
- s = s + "v";
- if (b[i][0] == 1)
- s = s + s1;
- else s = s + nes1;
- if (b[i][1] == 1)
- s = s +s2;
- else s = s + nes2;
- if (b[i][2] == 1)
- s = s +s3;
- else s = s + nes3;
- k++;
- }
- }
- return s;
- }
- }
Решение задачи: «Программа для нахождения С.Д.Н.Ф. по двум заданным числам»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- #define STR_LEN 128
- int* translate(int);
- int** mat(void);
- char* sdnf(int*,int**);
- int main(void)
- {
- int n, *ar, **br, n2, *ar2;
- FILE *wrt = fopen("result.txt", "w");
- if(!wrt) return -1;
- setlocale(LC_ALL, "ru");
- printf("Введите N1: ");
- scanf("%d", &n);
- ar = translate(n);
- br = mat();
- printf("С.д.н.ф для N1: %s\n", sdnf(ar, br));
- fprintf(wrt, "С.д.н.ф для N1=%d: %s\n", n, sdnf(ar, br));
- printf("Введите N2: ");
- scanf("%d", &n2);
- ar2 = translate(n2);
- printf("С.д.н.ф для N2: %s\n", sdnf(ar2, br));
- fprintf(wrt, "С.д.н.ф для N2=%d: %s\n", n2, sdnf(ar2, br));
- }
- int* translate(int n)
- {
- int *a = malloc(sizeof(int) * 8), k;
- for(int i = 0; i < 8; ++i)
- {
- a[i] = n % 2;
- n /= 2;
- }
- for(int i = 0; i < 4; ++i)
- {
- k = a[i];
- a[i] = a[7-i];
- a[7-i] = k;
- }
- return a;
- }
- int** mat(void)
- {
- int **b = malloc(sizeof(int*) * 8);
- for(int i = 0; i < 8; ++i)
- b[i] = malloc(sizeof(int) * 3);
- b[0][0] = b[0][1] = b[0][2] = 0;
- for(int i = 1; i < 8; ++i)
- if(b[i-1][2] == 0)
- b[i][2] = 1;
- else b[i][2] = 0;
- for(int i = 1; i < 8; i += 2)
- {
- if(i != 7)
- {
- b[i][1] = b[i-1][1];
- if(b[i][1] == 0)
- b[i+1][1] = 1;
- else b[i+1][1] = 0;
- }
- else b[i][1] = b[i-1][1];
- }
- for(int i = 4; i < 8; ++i)
- b[i][0] = 1;
- return b;
- }
- char* sdnf(int *a, int **b)
- {
- int k = 0;
- char *s = malloc(STR_LEN);
- char s1[] = "(x&";
- char nes1[] = "(!x&";
- char s2[] = "y&";
- char nes2[] = "!y&";
- char s3[] = "z)";
- char nes3[] = "!z)";
- s[0] = '\0';
- for(int i = 0; i < 8; ++i)
- {
- if(a[i] == 1)
- {
- if(k != 0)
- strcat(s, "v");
- if(b[i][0] == 1)
- strcat(s, s1);
- else strcat(s, nes1);
- if(b[i][1] == 1)
- strcat(s, s2);
- else strcat(s, nes2);
- if(b[i][2] == 1)
- strcat(s, s3);
- else strcat(s, nes3);
- k++;
- }
- }
- return s;
- }
Объяснение кода листинга программы
- Входные данные: n - число для которого необходимо найти С.Д.Н.Ф., ar, br - массивы для хранения полученных результатов.
- Выполняется функция translate(n), которая принимает число n и возвращает его двоичное представление в виде массива a.
- Результат функции translate(n) сохраняется в переменной a.
- Выполняется цикл, который проходит по всем битам числа a.
- Если бит равен 1, то к строке s добавляется соответствующая часть С.Д.Н.Ф.
- Выполняется функция mat(), которая возвращает матрицу b, представляющую собой таблицу истинности функций.
- Результат функции mat() сохраняется в переменной b.
- Выполняется функция sdnf(a, b), которая принимает массив a и матрицу b и возвращает С.Д.Н.Ф. в виде строки s.
- Результат функции sdnf(a, b) сохраняется в переменной s.
- Результат выводится на экран с помощью функции printf().
- Открывается файл
result.txt
для записи результатов. - В цикле запрашивается ввод двух чисел N1 и N2.
- Для каждого числа выполняются шаги 2-10.
- Результаты выводятся на экран и записываются в файл
result.txt
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д