Программа для нахождения С.Д.Н.Ф. по двум заданным числам - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д