Нужно перевести код с С++ на пхп - PHP
Формулировка задачи:
Это метод Квайна написанная на С++ её нужно перевести на язык PHP.
Заранее спасибо!
#include <iostream> #include <conio.h> #include <string> using namespace std; #define R 4 #define SR 16 string S[SR*2]; string Rez[SR*2]; int Flag[SR*2]={0}; int Y[SR]; int IndexS; int IndexRez; FILE *FData = NULL, *FRez = NULL; /*Функция формирования дизъюнкта*/ string MakeDiz(int Number) { string res; for(int i=0; i<R; i++){ res.insert(res.begin(),((Number >> i) & 0x01) + 48); } return res; } /*Функция склеивания*/ void Splice(const string &S1, const string &S2, int IndexS1, int IndexS2) { int k=0,n; /*кол-во разных*/ for(int i=0; i<R; i++) if(S1[i]!=S2[i]){ k++; n=i; } switch (k){ case 0: Rez[IndexRez] = S1; Flag[IndexS1] = Flag[IndexS2] = 1; IndexRez++; break; case 1: if((S1[n]!='*')&&(S2[n]!='*')){ Rez[IndexRez] = S1; Rez[IndexRez][n] = '*'; Flag[IndexS1] = Flag[IndexS2] = 1; IndexRez++; } break; } } /*Функция проверки на удаление пустого дизъюнкта*/ bool Del(string &S) { bool del = false; int k = 0; for(int i=0; i<R; i++) if(S[i]=='*') k++; if(k==R) del = true; return del; } void Clear() { IndexS = 0; for(int i=0; i<SR*2; i++){ Flag[i]=0; S[i]=""; } for(int i=0; i<IndexRez-1; i++) if(Flag[i]==0) for(int j=i+1; j<IndexRez; j++) if(Rez[i]==Rez[j]) Flag[j] = 1; for(int i=0; i<IndexRez; i++) if(Flag[i]==0){ S[IndexS] = Rez[i]; IndexS++; } } /*Вывод на экран массива Rez*/ void PrintRez(int Step) { cout << "{------------------------------------------------}\n"; fprintf_s(FRez, "{------------------------------------------------}\n"); if(Step==0){ cout << "Исходная ДНФ."; fprintf_s(FRez, "Исходная ДНФ."); }else{ cout << "Шаг номер :" << Step << "."; fprintf_s(FRez, "Шаг номер :%d.",Step); } cout << " Количество дизьюнктов :" << IndexS << endl; fprintf_s(FRez, " Количество дизьюнктов :%d\n", IndexS); for(int i=0; i<IndexS; i++){ cout << S[i] << endl; fprintf_s(FRez, "%s\n",S[i].c_str()); } _getch(); } int main(void) { setlocale(0,""); fopen_s(&FRez, "result.txt", "w"); fopen_s(&FData, "func.txt", "r"); /*Считать массив Y из файла*/ for(int i=0; i<SR; i++) fscanf_s(FData, "%c ", &Y[i]); fclose(FData); /*Получить массив S*/ for(int i=0; i<SR; i++) S[i] = MakeDiz(i); /*Преоразовать S: оставив только те элементы, для которых Y=1. Результата в Rez*/ IndexRez = 0; for(int i=0; i<SR; i++) if(Y[i]=='1'){ Rez[IndexRez]=S[i]; IndexRez++; } for(int i=0; i<SR*2; i++) S[i] = Rez[i]; IndexS = IndexRez; PrintRez(0); /*склеивание*/ for(int i=0; i<R; i++){ /*подготовка массива Flag под склеивание*/ IndexRez = 0; for(int j=0; j<SR*2; j++){ Flag[j] = 0; Rez[j] = ""; } /*склеивание*/ for(int j=0; j<IndexS-1; j++) for(int k=j+1; k<IndexS; k++) Splice(S[j],S[k], j, k); /*копирование несклеившихся компонент*/ for(int j=0; j<IndexS; j++) if(Flag[j]==0){ Rez[IndexRez] = S[j]; IndexRez++; } Clear();/*удаление одинаковых дизъюнктов*/ PrintRez(i+1);/*вывод результата на экран*/ } IndexRez = 0; /*Удалить все дизъюнкты вида **...* */ for(int i=0; i<IndexS; i++) if(!Del(S[i])){ Rez[IndexRez] = S[i]; IndexRez++; } PrintRez(R+1); for(int i=0; i<IndexS; i++){ cout << '('; for(int j=0; j<R; j++) if(S[i][j]!='*') cout << (S[i][j]=='0'?"-":"") << 'X' << j+1; cout << ')'; if(i!=(IndexS-1)) cout << " V "; } cout << endl; _fcloseall(); return 0; }
Решение задачи: «Нужно перевести код с С++ на пхп»
textual
Листинг программы
<?php define('R', 4); define('SR', 16); $S = array(); $Rez = array(); $Flag = array(); $Y = array(); $FData = null; // Подготовка массивов for ($i = 0; $i < SR * 2; $i++) { $S[$i] = null; $Rez[$i] = null; $Flag[$i] = 0; } for ($i = 0; $i < SR; $i++) $Y[$i] = null; // Функция формирования дизъюнкта function make_diz($number) { $res = ''; for ($i = 0; $i < R; $i++) $res = (($number >> $i) & 0x01) . $res; return $res; } // Функция склеивания function splice(&$s1, &$s2, $index_s1, $index_s2) { global $Rez, $Flag, $indexRez; // кол-во разных $k = 0; $n = null; for ($i = 0; $i < R; $i++) if ($s1[$i] != $s2[$i]) { $k++; $n = $i; } switch ($k) { case 0: $Rez[$indexRez] = $s1; $Flag[$index_s1] = $Flag[$index_s2] = 1; $indexRez++; break; case 1: if ($s1[$n] != '*' && $s2[$n] != '*') { $Rez[$indexRez] = $s1; $Rez[$indexRez][$n] = '*'; $Flag[$index_s1] = $Flag[$index_s2] = 1; $indexRez++; } break; } } // Функция проверки на удаление пустого дизъюнкта function del(&$s) { $del = false; $k = 0; for ($i = 0; $i < R; $i++) if ($s[$i] == '*') $k++; if ($k == R) $del = true; return $del; } function clear() { global $S, $Rez, $Flag, $indexRez; $indexS = 0; for ($i = 0; $i < SR * 2; $i++) { $Flag[$i] = 0; $S[$i] = ''; } for ($i = 0; $i < $indexRez - 1; $i++) if ($Flag[$i] == 0) for ($j = $i + 1; $j < $indexRez; $j++) if ($Rez[$i] == $Rez[$j]) $Flag[$j] = 1; for ($i = 0; $i < $indexRez; $i++) if ($Flag[$i] == 0) { $S[$indexS] = $Rez[$i]; $indexS++; } return $indexS; } // Вывод на экран массива Rez function print_rez($step, $indexS) { global $S; echo '<hr/>'; if ($step == 0) echo '<b>Исходная ДНФ</b><br/>'; else echo '<b>Шаг номер: ' . $step . '</b><br/>'; echo 'Количество дизьюнктов: ' . $indexS . '<br/>'; for ($i = 0; $i < $indexS; $i++) echo $S[$i] . '<br/>'; } $FData = fopen('func.txt', 'r'); // Считать массив Y из файла for ($i = 0; $i < SR; $i++) $Y[$i] = fgetc($FData); fclose($FData); // Получить массив S for ($i = 0; $i < SR; $i++) $S[$i] = make_diz($i); // Преоразовать S: оставив только те элементы, для которых Y=1. Результата в Rez $indexRez = 0; for ($i = 0; $i < SR; $i++) if ($Y[$i] == '1') { $Rez[$indexRez] = $S[$i]; $indexRez++; } for ($i = 0; $i < SR*2; $i++) $S[$i] = $Rez[$i]; $indexS = $indexRez; print_rez(0, $indexS); // Склеивание for ($i = 0; $i < R; $i++) { // подготовка массива Flag под склеивание $indexRez = 0; for ($j = 0; $j < SR * 2; $j++) { $Flag[$j] = 0; $Rez[$j] = ''; } // склеивание for ($j = 0; $j < $indexS - 1; $j++) for ($k = $j + 1; $k < $indexS; $k++) splice($S[$j], $S[$k], $j, $k); // копирование несклеившихся компонент for ($j = 0; $j < $indexS; $j++) if ($Flag[$j] == 0) { $Rez[$indexRez] = $S[$j]; $indexRez++; } // удаление одинаковых дизъюнктов $indexS = clear(); // вывод результата на экран print_rez($i+1, $indexS); } $indexRez = 0; // Удалить все дизъюнкты вида **...* for ($i = 0; $i < $indexS; $i++) if (! del($S[$i])) { $Rez[$indexRez] = $S[$i]; $indexRez++; } print_rez(R+1, $indexRez); echo '<hr/>'; for ($i = 0; $i < $indexS; $i++) { echo '('; for ($j = 0; $j < R; $j++) if (isset($S[$i][$j])) if ($S[$i][$j] != '*') echo ($S[$i][$j] == '0' ? '-' : null) . 'X' . ($j+1); echo ')'; if ($i != ($indexS - 1)) echo ' V '; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д