Программа для нахождения С.Д.Н.Ф. по двум заданным числам - 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.