Консультация № 178182
03.05.2010, 18:01
0.00 руб.
0 20 1
Помогите, пожалуйста, найти ошибку в логике программы.

Условие:
В заданной квадратной матрице значения некоторых диагональных элементов равняются нулю. Переставить строки или столбцы матрицы таким образом, чтобы диагональные элементы стали ненулевыми (главная диагональ). Если это невозможно сделать, вывести соответствующее сообщение.

Во вложении мой код программы на С++, который не переставляет почему-то нулевые элементы.
Так же привожу аналогичный код, но на Паскале, который корректно работает и переставляет нули на главной диагонали.
Мне кажется, что я что-то напутала с индексами элементов. Помогите исправить ошибку. Буду благодарна любой помощи. Заранее огромное СПАСИБО!


Приложение:
Код:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;
int i,iz,jz,j,m;
char key;
bool flag;

void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
int ch(int **a)
{
int k, tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
flag=true;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
flag=true;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}
void im(int **a)
{
int k,l;
{
flag=false;
for (int j=0;j<n; j++)
{
i=0;
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
cout<<"impossible"<<endl;
flag=true;
}
if(flag=true)
break;
}
for (int i=0;i<n; i++)
{
j=0;
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
cout<<"impossible"<<endl;
flag=true;
}
if(flag=true)
break;
}
}
}
void ChColumn(int **a)
{
int k,tmp;
bool flag;
flag=false;
for(int j=jz; j<n;j++)
{
if (a[iz][j]!=0) ;
{
flag=true;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
if (a[n-1][n-1]==0)
for(int j=0; j<n-1;j++)
if (a[iz][j]!=0);
{
flag=true;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
if(flag=false)
cout<<"impossible"<<endl;
}
}
void zero(int **a)
{
int i,j;
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
iz=i;
jz=i;
ch(a);
}
j=0;
for (int j=0;j<n; j++)
for (int i=0;i<n; i++)
if(a[i][i]==0)
ch(a);
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
}

int main (void)
{
srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
arr=vvod();
im(arr);
zero(arr);
output(arr);
cout<<"Change matrix:"<<endl;
output(arr);

getch();
return 0;
}


Паскаль:
Код:
uses crt;
var
a:array[1..10,1..10] OF integer;
n, {size of matrix}
i,iz,jz,j,m:integer; {indexs rov, culumn}
key:char;
flag:boolean;


procedure output;
begin
for i:=1 to n do
begin
for j:=1 to n do
write( a[i,j], ' ');
writeln;
end;
end;

Procedure CH;
var k:integer;
tmp:integer;
flag:boolean;
begin
Flag:=false;
For i:=iz to n do
begin
If a[i,jz]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[iz,k];
a[iz,k]:=a[i,k];
a[i,k]:=tmp;
end;
end;
If a[n,n]=0 then
for i:=1 to n-1 do
If a[i,jz]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[iz,k];
a[iz,k]:=a[i,k];
a[i,k]:=tmp;
end;

end;
end;
end;


procedure ran;
begin
randomize;
writeln('input size of matrix');
readln(n);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(5);
output;
end;

procedure im;
var k,l:integer;
begin
flag:=false;
for j:=1 to n do
begin
I:=0;
k:=0;
repeat
I:=i+1;
if a[i,j]=0 then k:=k+1;
if k=n then
begin
writeln('imposible');
flag:=true;
end;
until i=n;
if flag=true then break;
end;
for i:=1 to n do
begin
j:=0;
k:=0;
repeat
j:=j+1;
if a[i,j]=0 then k:=k+1;
if k=n then
begin
writeln('imposible ');
flag:=true;
end;
until j=n;
if flag=true then break;
end;
end;

Procedure ChColumn;
Var k,tmp:integer;
flag:boolean;
begin
Flag:=false;
For j:=jz to n do
begin
If a[iz,j]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[k,jz];
a[k,jz]:=a[k,j];
a[k,j]:=tmp;
end;
end;
If a[n,n]=0 then
for J:=1 to n-1 do
If a[iz,j]<>0 then
begin
flag:=true;
for K:=1 to n do
begin
tmp:=a[k,jz];
a[k,jz]:=a[k,j];
a[k,j]:=tmp;
end;

end;
end;
if flag=false then
writeln('Imposible');
end;



procedure Zero;
var i,j:integer;
begin
for i:=1 to n do
if a[i,i]=0 then
begin
iz:=i;
jz:=i;
CH;
end;
j:=0;
repeat
j:=J+1;
for i:=1 to n do
if a[i,i]=0 then CH;
until j=n;
For i:=1 to n do
if a[i,i]=0 then ChColumn;

end;




begin
clrscr;
im;
ran;
Zero;
writeln('Change matrix:');
output;
readln;
end.

Обсуждение

давно
Профессор
230118
3054
03.05.2010, 20:02
общий
maura:
Пытаюсь разобраться. Пока могу сказать - больше комментируйте код, тогда, может быть, будет самой видна ошибка.
давно
Профессор
230118
3054
03.05.2010, 20:20
общий
maura:
На Паскале после генерации случайных чисел выполняется функция Zero; На С++ - im(arr); zero(arr); После этого матрица выводится дважды
давно
Профессор
230118
3054
03.05.2010, 20:49
общий
maura:
Замечание по реализации.
Функция im определяет невозможность решения задачи. Поэтому ее лучше сделать булевской. Тогда при определении этого можно вернуться из функции сразу. В main определяется возвращаемое значение и в случае ложности программа тоже возвращается без дальнейших манипуляций. Надобность переменной флаг отпадает.
bool im(int **a)
.....
if (k==n)
{
return false;
}
Даже вывод cout<<"impossible"<<endl; лучше перенести в main
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
давно
Профессор
230118
3054
03.05.2010, 22:21
общий
maura:
Процедуры CH и CHColumn написаны неправильно, особенно после условия if (a[n-1][n-1]==0). Понятно, что для последнего элемента следующих строчек нет, поэтому Вы пытаетесь обменять с предыдущими, но почему это все находится в цикле? Алгоритм должен быть следующий для любого значения: если не удалось обменять со следующими строчками, меняем с предыдущими, но следим за тем, чтобы уже достигнутый ненулевой элемент не поменялся с нулевым. Вместо flag=true; применяйте оператор break. Не нужно переставлять столбцы - если задача может быть решена, то она может быть решена только перестановкой строк.
Неизвестный
03.05.2010, 22:30
общий
Честно говоря ваши обьявленые переменые не соответствуют стандарту.Нельзя обьявлять переменые с тем же именем дважды.У вас переменые int i,j; обьявлены глобально а это значит что они действительны на протяжение всей програмы и тем временем вы опять их обьявляете уже в циклах и блоках функций.Надеется что такая програма будет работать коректно,глупо.Поетому набросал вот такой вариант.Посмотрите и прокоментируйте тут.Правильно ли я вас понимаю в задаче и вапще подходит ли это или вы хотите что бы имено ваш код исправили.(Честно говорю не стоит это делать.)


#include <cstdlib>
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
int mass[6][6]=
{{0,0,0,0,0,0}, /тут мы понимаем что индекс и инициализацию массива псевдослучайным числом мы можем реализовать позже
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0}};

cout<<"Matrica zapolnena nuliami\n\n";

for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
cout<<mass[i][j];
if(j == 5) cout<<"\n";}}

cout<<"\n\nI Diagonal nize\n\n\n";

for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
if(mass[i][i] == 0){mass[i][i]=1;} //тут мы понимаем что числа на диагонали мы можем менять не только на единицу
cout<<mass[i][j];
if(j == 5) cout<<"\n";}}

system("PAUSE");
return EXIT_SUCCESS;
}
давно
Профессор
230118
3054
03.05.2010, 23:17
общий
Valeraja:
Замечание о переменных абсолютно справедливо. Но 1) старайтесь следить за правописанием даже в мини-форуме, здесь с этим строго. 2) Не вижу перестановок в Вашем коде. Исправить программу можно, и для автора вопроса полезно это сделать самостоятельно, поэтому пока не даю готового ответа.
Неизвестный
03.05.2010, 23:24
общий
Перестановки я заметил позже если честно. Но не в этом суть моего поста.Иногда авторы ждут конкретно решения задачи.Нельзя знать кто чего хочет.Поэтому выложить "каркас" програмы это моя тактика.Что касается правописания придётся смирится потому что я иностранец для вас.
давно
Профессор
230118
3054
03.05.2010, 23:27
общий
Valeraja:
А я из Армении. Но тут такие правила.
Неизвестный
04.05.2010, 00:04
общий
Гаряка Асмик:
Спасибо огромное за помощь!!!
Вот не много еще переделала программу. Посмотрите, пожалуйста, что не так. Заранее спасибо!

Код:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;
int i,iz,jz,j,m;
char key;
bool flag;

void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
int ch(int **a)
{
int tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
break;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
//for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
break;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}
bool im(int **a)
{
int k;
{
for (int j=0;j<n; j++)
{
i=0;
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
for (int i=0;i<n; i++)
{
j=0;
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}

/*void ChColumn(int **a)
{
int k,tmp;
bool flag;
flag=false;
for(int j=jz; j<n;j++)
{
if (a[iz][j]!=0) ;
{
flag=true;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
if (a[n-1][n-1]==0)
for(int j=0; j<n-1;j++)
if (a[iz][j]!=0);
{
flag=true;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
if(flag=false)
cout<<"impossible"<<endl;
}
}*/
void zero(int **a)
{
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
iz=i;
jz=i;
ch(a);
}
j=0;
for (int j=0;j<n; j++)
for (int i=0;i<n; i++)
if(a[i][i]==0)
ch(a);
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
}

int main (void)
{

srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
arr=vvod();
zero(arr);
output(arr);
cout<<"Change matrix:"<<endl;
output(arr);
getch();
return 0;
}
давно
Профессор
230118
3054
04.05.2010, 02:35
общий
maura:
Сами перестановки лучше выделить в функцию. Будет короче и понятней.
Неизвестный
04.05.2010, 12:34
общий
Гаряка Асмик:
Перестановки по столбцам и строкам и так в отдельных функциях. Или еще что-то нужно отделить?
Помогите, пожалуйста, последняя надежда на Вас!
давно
Профессор
230118
3054
04.05.2010, 12:50
общий
maura:
Я имею в виду выделить в функцию такой кусочек:
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
Неизвестный
04.05.2010, 13:10
общий
Вот еще переделала...

Код:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;
int i,iz,jz,j,m;
char key;
bool flag;

void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
/*int ch(int **a)
{
int tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
break;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
//for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
break;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}*/
bool im(int **a)
{
int k;
{
for (int j=0;j<n; j++)
{
i=0;
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
for (int i=0;i<n; i++)
{
j=0;
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
void ch(int **a)
{
int k,tmp;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
void ChColumn(int **a)
{
int k,tmp;
bool flag;
flag=false;
for(int j=jz; j<n;j++)
{
if (a[iz][j]!=0) ;
{
break;
ch(a);
}
if (a[n-1][n-1]==0)
for(int j=0; j<n-1;j++)
if (a[iz][j]!=0);
{
break;
ch(a);
}
if(flag=false)
cout<<"impossible"<<endl;
}
}
void zero(int **a)
{
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
iz=i;
jz=i;
ChColumn(a);
}
j=0;
for (int j=0;j<n; j++)
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
}

int main (void)
{

srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
arr=vvod();
zero(arr);
output(arr);
cout<<"Change matrix:"<<endl;
output(arr);
getch();
return 0;
}
давно
Профессор
230118
3054
04.05.2010, 13:26
общий
maura:
Переместите output(arr); перед zero(arr);, чтобы мы могли видеть первоначальный вид матрицы.
Неизвестный
04.05.2010, 13:38
общий
Гаряка Асмик:
Переместила, но всё равно что-то не то.

Код:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;
int i,iz,jz,j,m;
char key;
bool flag;

void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
/*int ch(int **a)
{
int tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
break;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
//for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
break;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}*/
bool im(int **a)
{
int k;
{
for (int j=0;j<n; j++)
{
i=0;
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
for (int i=0;i<n; i++)
{
j=0;
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
void ch(int **a)
{
int k,tmp;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
void ChColumn(int **a)
{
int k,tmp;
bool flag;
flag=false;
for(int j=jz; j<n;j++)
{
if (a[iz][j]!=0) ;
{
break;
ch(a);
}
if (a[n-1][n-1]==0)
for(int j=0; j<n-1;j++)
if (a[iz][j]!=0);
{
break;
ch(a);
}
if(flag=false)
cout<<"impossible"<<endl;
}
}
void zero(int **a)
{
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
iz=i;
jz=i;
ChColumn(a);
}
j=0;
for (int j=0;j<n; j++)
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
}

int main (void)
{

srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
arr=vvod();
output(arr);
zero(arr);
cout<<"Change matrix:"<<endl;
output(arr);
getch();
return 0;
}
давно
Профессор
230118
3054
04.05.2010, 14:02
общий
Что это?
if (a[iz][j]!=0);
{
break;
ch(a);
}
После условия стоит ; -это пустой оператор, поэтому блок в скобках будет выполняться всегда. break; должен быть после обмена, а не до ch(a); который вообще не вызывается.
давно
Профессор
230118
3054
04.05.2010, 14:40
общий
это ответ
Здравствуйте, maura.

Исправленный код программы в приложении.

Приложение:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;


void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
/*int ch(int **a)
{
int tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
break;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
//for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
break;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}*/
bool im(int **a)
{
int k;
{
for (int j=0;j<n; j++)
{
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
for (int i=0;i<n; i++)
{
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
void ch(int **a, int jz, int j)//obmen jz na j
{
int k,tmp;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}

void ChColumn(int **a, int jz)
{
int j;
bool flag;
flag=false;
for(j=jz+1; j<n; j++)
{
if (a[jz][j]!=0)
{
ch(a,jz,j);
flag=true;
break;
}
}
if (flag==false)
{
for(j=0; j<jz;j++)
if (a[jz][j]!=0 && a[j][jz]!=0)
{
ch(a,jz,j);
flag=true;
break;
}
}
if(flag==false)
cout<<"impossible"<<endl;
}

void zero(int **a)
{
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
ChColumn(a,i);
}
}

int main (void)
{
int jz,j;
srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
arr=vvod();
output(arr);
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
zero(arr);
cout<<"Change matrix:"<<endl;
output(arr);
getch();
return 0;
}
5
Спасибо огромное! Вы меня выручили!
Неизвестный
04.05.2010, 14:40
общий
Гаряка Асмик:
Еще что-то с выводом матрицы не то...программа прерывается, когда ввела количество элементов.

Код:
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int n=9;
int i,iz,jz,j,m;
char key;
bool flag;

void output(int **a)
{
for(int i=0; i<n;i++)
{
for(int j=0; j<n;j++)
cout << setw(2) << a[i][j]<< ' ';
cout << endl;
}
}

int **vvod()
{
int **a=new int*[n];//создаём массив указателей на строки
for(int i=0;i<n;i++)
{
a[i]=new int[n];//создаём строки
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=rand()%5;//теперь с индексацией всё впорядке
}
return a;
}
/*int ch(int **a)
{
int tmp;
bool flag;
flag=false;
for(int i=iz; i<n;i++)
{
if (a[i][jz]!=0)
{
break;
for(int k=0; i<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
if (a[n-1][n-1]==0)
//for(int i=0; i<n-1;i++)
if (a[i][jz]!=0)
{
break;
for(int k=0; k<n;k++)
{
tmp=a[iz][k];
a[iz][k]=a[i][k];
a[i][k]=tmp;
}
}
return 0;
}
}*/
bool im(int **a)
{
int k;
{
for (int j=0;j<n; j++)
{
i=0;
k=0;
for (int i=0;i<n; i++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
for (int i=0;i<n; i++)
{
j=0;
k=0;
for (int j=0;j<n; j++)
if(a[i][j]==0)
k++;
if (k==n)
{
return false;
}
}
}
void ch(int **a)
{
int k,tmp;
for(int k=0; k<n;k++)
{
tmp=a[k][jz];
a[k][jz]=a[k][j];
a[k][j]=tmp;
}
}
void ChColumn(int **a)
{
int k,tmp;
bool flag;
flag=false;
for(int j=jz; j<n;j++)
{
if (a[iz][j]!=0)
{
ch(a);
break;
}
if (a[n-1][n-1]==0)
for(int j=0; j<n-1;j++)
if (a[iz][j]!=0)
{
ch(a);
break;
}
if(flag=false)
cout<<"impossible"<<endl;
}
}
void zero(int **a)
{
for (int i=0;i<n; i++)
if(a[i][i]==0)
{
iz=i;
jz=i;
ChColumn(a);
}
j=0;
for (int j=0;j<n; j++)
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
for (int i=0;i<n; i++)
if(a[i][i]==0)
ChColumn(a);
}

int main (void)
{

srand((unsigned)time(NULL));
cout<<"\nLab5"<<endl<<"\nInput number of array's members: ";
cin>>n;
int **arr;
if( !im(arr))
{
cout<<"impossible"<<endl;
return 0;
}
arr=vvod();
output(arr);
zero(arr);
cout<<"Change matrix:"<<endl;
output(arr);
getch();
return 0;
}
давно
Профессор
230118
3054
04.05.2010, 14:43
общий
maura:
А вот im не надо было перемещать до генерации элементов.
Неизвестный
04.05.2010, 15:31
общий
Гаряка Асмик:
Спасибо Вам огромное за внимание и помощь!!!
Форма ответа