C/C++ Хромает логика.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Spot, 22 Mar 2011.

  1. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Задача.

    Дана строка с состояниями.

    1) |1|0|0|1|1|0|1|1|

    Надо вычислить последующую строку при помощи "соседей".

    |1|0|0|1|1|0|1|1|
    |A|B|C|D|E|F|G|I|

    Что бы вычислить а, нам нужно просмотреть состояние её соседей.Если количество соседей будет иметь 2 или 4 единицы, то на место А пишется 1, если нет, то 0.
    Пример:

    A={1,0,0}=1.Write 0
    |1|0|0|1|1|0|1|1|
    |0|B|C|D|E|F|G|I|

    B={1,0,0,1}=2.Write 1
    |1|0|0|1|1|0|1|1|
    |0|1|C|D|E|F|G|I|

    C={1,0,0,1,1}=3.Write 0
    |1|0|0|1|1|0|1|1|
    |0|1|0|D|E|F|G|I|

    D={0,0,1,1,0}=2. Write 1
    |1|0|0|1|1|0|1|1|
    |0|1|0|1|E|F|G|I|

    E={0,1,1,0,1}=3.Write 0
    |1|0|0|1|1|0|1|1|
    |0|1|0|1|0|F|G|I|

    F={1,1,0,1,1}=4.Write 1
    |1|0|0|1|1|0|1|1|
    |0|1|0|1|0|1|G|I|

    G={1,0,1,1}=3.Write 0
    |1|0|0|1|1|0|1|1|
    |0|1|0|1|0|1|0|I|

    I={0,1,1}=2.Write 1
    |1|0|0|1|1|0|1|1|
    |0|1|0|1|0|1|0|1| Вот и наша готовая строка.


    Теперь непосредственно к заданию.Нужно написать скрипт, который бы вычислял каждую последующую строку.Первая строка будет заносится в массив рандомно, на её базе нужно просчитывать последующие.

    Параметры пассива: 100*80.

    Вот сам код:
    Code:
    #include <iostream>
    #include <math.h>
    #include <Windows.h>
    #include <time.h>
    using namespace std;
    
    void main()
    {
    
    
    int all_array [100] [80] = {NULL};//массив 100 - количество строк, 80 - количество ячеек в каждой строке.
    int r = 0;
    
    srand((int)time(NULL));
    for(int r = 0; r<80;r++)
    {
    	all_array [0][r] = 0+(int) (2*rand()/(RAND_MAX+1.0));
    	cout<<all_array [0] [r];
    	//Рандомно запихиваем числа в массив с индексом [0][r]
    	//числа: 0,1.
    
    
    }
    cout<<"\n\n";
    
    for(int i = 1; i<100;i++)//Цикла для левого индекса(100 строк) all_array[left] [right]
    {
    
    
    	for(int j = 0; j<80;j++)//Цикла для правого индекса(80 ячеек) all_array[left] [right]
    		//Таким образом поле имеет 100 "мест" в высоту и 80 в ширину.
    	{
    		int anzahl= 0;//считаем количество X(1) в ближайших пяти ячейках.
    	
    		if(j==78||j==79)// если поле в ширину заканчивается
    		{
    			for(int sl_for=j-2;sl_for==79;sl_for++){
    												if(all_array [i-1][sl_for]==1){anzahl++;
    												
    												if(anzahl == 2||anzahl == 4){all_array [i][j]=1;anzahl=0;}else{all_array [i][j]=0;}
    												
    												}else{}
    
    			}
    		}
    		if(j>=2)//индекс правого массива более на отметке 2 или более
    							{
    											for(int sl_for=j-2;(sl_for<=j+2)||(sl_for==79);sl_for++){
    												if(all_array [i-1][sl_for]==1){anzahl++;
    												//cout<<"Check_if2";
    												if(anzahl == 2||anzahl == 4){all_array [i][j]=1; anzahl=0;}else{all_array [i][j]=0; }
    												
    												}else{}
    
    											}
    		}
    		if(j==1)//индекс массива стоит на 1(то бишь под номером 2)
    		{
    			for(int sl_for=j-1;sl_for<=j+1;sl_for++){
    				if(all_array [i-1][sl_for]==1){anzahl++;
    				
    				if(anzahl == 2||anzahl == 4){all_array [i][j]=1;anzahl=0;}else{all_array [i][j]=0;}
    
    				}else{}
    
    											}
    		}
    		if(j==0){//начало
    
    				for(int sl_for=j;sl_for<=j+2;sl_for++){
    					if(all_array [i-1][sl_for]==1){ anzahl++;
    					
    					if(anzahl == 2||anzahl == 4){all_array [i][j]=1;anzahl=0;}else{all_array [i][j]=0;}
    					
    					}else{}
    											}
    		}
    	
    	}
    
    
    
    		
    
    
    
    
    }
    for(int h = 0; h<100 ; h++)
    {
    	
    	cout<<h<<"\n";
    	for(int check = 0; check<80;check++)
    	{
    
    		cout<<all_array [h][check];
    		//if(all_array [h][check]== 1)
    		//{cout<<'X';}else{cout<<"-";}//выдаём вместо чисел знаки 'X'=1, '-' = 0.
    	check++;
    	}
    	system("pause");
    }
    }
    	
    Проблемы на лицо если запустить.Во первых по какой то причине в массив заносится только половина высчитанной строки.Во вторых, я что-то намудрил с логикой, в итоге строка высчитывается неверно.

    Будьте добры гляньте свежим взглядом.

    Спасибо.
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Всё

    Ошибка найдена, случайно не заметил в конце переменной check++; из -за этого не правильно шла запись в массив.
     
    #2 Spot, 22 Mar 2011
    Last edited: 22 Mar 2011
Loading...