Нужно перевести код с С++ на пхп - 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 ';
}

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


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

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

12   голосов , оценка 4.333 из 5