Помогите Найти Ошибку В Программе

  • Автор темы yaroslavbondarev
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Y

yaroslavbondarev

#1
Дана целочисленная матрица {Aij}i=1...n;j=1..n , n<=100. Если в матрице есть две одинаковых строки, заменить минимальные элементы столбцов на наибольший из простых элементов матрицы. Использовать процедуры и функции!
Код:
Program Variant3;
uses crt;
const l=100;
type	 matrix=array[1..l,1..l] of integer;
var						  i,j,n:integer;
a:matrix;
k,s:text;
t,f:boolean;
procedure Vvod(var n:integer);
var i,j:integer;
Begin
write('n= ');
readln(n);
For i:=1 to n do begin
for j:=1 to n do begin
read(a[i,j]);
end;
end;
end;


procedure Vyvod(n:integer);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
end;

function Poisk(n:integer):boolean;
var				 i,j,o:integer;
t,f:boolean;
Begin
f:=false;
for i:=1 to n-1 do begin
for j:=i+1 to n do begin
t:=true;
for o:=1 to n do
if a[i,o]<>a[j,o] then begin
t:=false;
break;
end;
if t=true then begin
f:=true;
break;
end;
end;
end;
Poisk:=f;
End;

function prost(a:integer):boolean;
var i:integer;
begin
prost:=true;
if a<2 then prost:=false
else
for i:=1 to round(sqrt(a)) do
if a mod i=0 then
begin
prost:=false;
break;
end;
end;

procedure			 Zamena (n:integer);
var	  y,stop,min,mini,max,i,j:integer;
f:boolean;

begin
max:=0;
for i:=1 to n do begin
for j:=1 to n do
if Prost(n)=false then
if (max=0) or (max<a[i,j]) then max:=a[i,j];
for j:=1 to n do begin
min:=a[1,j];
mini:=1;
for i:=1 to n do
if min>a[i,j] then begin
minI:=i;
min:=a[i,j];
end;
a[mini,j]:=max;
end;
end;
end;

Begin
Vvod(n);
if Poisk(n)=true then Zamena(n);
Vyvod(n);
End.
 
09.11.2009
665
1
#3
Код:
....
procedure			 Zamena (n:integer);
var	  y,stop,min,mini,max,i,j:integer;
f:boolean;

begin
//поиск первого простого числа
for i := 1 to n do
for j := 1 to n do
begin
if prost(a[i,j])=true then
begin
max:=a[i,j];
break;
end;
end;
//поиск паксимального простого числа
for i := 1 to n do
for j := 1 to n do
begin
if (prost(a[i,j])=true)and(max<a[i,j]) then
max:=a[i,j];
end;

for j:=1 to n do
begin
min:=a[1,j];
//поиск минимума в столбце
for i:=1 to n do
begin
if min>a[i,j] then
begin
min:=a[i,j];
end;
end;
//замена минимумов в столбце на макс
for i:=1 to n do
begin
if min=a[i,j] then
begin
a[i,j]:=max;
end;
end;
end;
end;
....
 

Titan

Well-known member
10.06.2004
105
0
#4
yaroslavbondarev Вы, для начала, вопрос научитесь формулировать. Собственно сам вопрос в посте отсутствует как таковой.

В чем вам помочь ? откомпилировать ? проверить скорость алгоритма ? и т.д
 
Y

yaroslavbondarev

#5
Dock1100 вставил вашу процедуру, мне минимальный элемент столбца заменяет на единицу в любом случае
 
09.11.2009
665
1
#6
Вы в этом уверены?
Ибо это всё же поиск максимального.
Код:
for i := 1 to n do
for j := 1 to n do
begin
if (prost(a[i,j])=true)and(max<a[i,j]) then
max:=a[i,j];
end;
 
Y

yaroslavbondarev

#7
Titan у меня программа неправильно работает:
Код:
Program Variant3;
uses crt;
const l=100;
type	 matrix=array[1..l,1..l] of integer;
var						  i,j,n:integer;
a:matrix;
k,s:text;
t,f:boolean;
procedure Vvod(var n:integer);
var i,j:integer;
Begin
write('n= ');
readln(n);
For i:=1 to n do begin
for j:=1 to n do begin
read(a[i,j]);
end;
end;
end;


procedure Vyvod(n:integer);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
end;

function Poisk(n:integer):boolean;
var				 i,j,o:integer;
t,f:boolean;
Begin
f:=false;
for i:=1 to n-1 do begin
for j:=i+1 to n do begin
t:=true;
for o:=1 to n do
if a[i,o]<>a[j,o] then begin
t:=false;
break;
end;
if t=true then begin
f:=true;
break;
end;
end;
end;
Poisk:=f;
End;

function prost(a:integer):boolean;
var i:integer;
begin
prost:=true;
if a<2 then prost:=false
else
for i:=1 to round(sqrt(a)) do
if a mod i=0 then
begin
prost:=false;
break;
end;
end;

procedure			 Zamena (n:integer);
var	  y,stop,min,mini,max,i,j:integer;
f:boolean;

begin
for i := 1 to n do
for j := 1 to n do
begin
if prost(a[i,j])=true then
begin
max:=a[i,j];
break;
end;
end;
for i := 1 to n do
for j := 1 to n do
begin
if (prost(a[i,j])=true)and(max<a[i,j]) then
max:=a[i,j];
end;

for j:=1 to n do
begin
min:=a[1,j];
for i:=1 to n do
begin
if min>a[i,j] then
begin
min:=a[i,j];
end;
end;
for i:=1 to n do
begin
if min=a[i,j] then
begin
a[i,j]:=max;
end;
end;
end;
end;

Begin
Vvod(n);
if Poisk(n)=true then Zamena(n);
Vyvod(n);
End.
у меня минимальный элемент столбца заменяет на единицу в любом случае, даже если ее нет в матрице

Добавлено: Dock1100 ну вы же сами это написали, а что не так?
 

hosm

* so what *
18.05.2009
2 442
6
#8
function prost(a:integer):boolean;
var i:integer;
begin
...
for i:=1 to round(sqrt(a)) do
if a mod i=0 then
begin
prost:=false;
break;
end;
end;

Вы думаете, есть натуральное число, которое делится на 1 с остатком?

Добавлено: round(sqrt(a)) - лучше заменить округлением квадратного корня в большую сторону :O_0:
 
Y

yaroslavbondarev

#9
все, исправил) всем спасибо! кому интересно, рабочая программа

Код:
Program Variant3;
uses crt;
const l=100;
type	 matrix=array[1..l,1..l] of integer;
var						  i,j,n:integer;
a:matrix;
k,s:text;
t,f:boolean;
procedure Vvod(var n:integer);
var i,j:integer;
Begin
write('n= ');
readln(n);
For i:=1 to n do begin
for j:=1 to n do begin
read(a[i,j]);
end;
end;
end;


procedure Vyvod(n:integer);
var i,j:integer;
begin
for i:=1 to n do begin
for j:=1 to n do
write(a[i,j]:4);
writeln;
end;
end;

function Poisk(n:integer):boolean;
var				 i,j,o:integer;
t,f:boolean;
Begin
f:=false;
for i:=1 to n-1 do begin
for j:=i+1 to n do begin
t:=true;
for o:=1 to n do
if a[i,o]<>a[j,o] then begin
t:=false;
break;
end;
if t=true then begin
f:=true;
break;
end;
end;
end;
Poisk:=f;
End;

function Prost(X: LongInt): boolean;
var i: integer;
Begin
Prost:=false;
if x<2 then Exit;
if not odd(x) and (x<>2)
then exit;
i:=3;
while i <= sqrt(x) do
begin
if x mod i = 0 then Exit;
inc(i,2);
end;
Prost:=true;
End;

procedure			 Zamena (n:integer);
var	  y,stop,min,mini,max,i,j:integer;
f:boolean;

begin
for i := 1 to n do
for j := 1 to n do
begin
if prost(a[i,j])=true then
begin
max:=a[i,j];
break;
end;
end;
for i := 1 to n do
for j := 1 to n do
begin
if (prost(a[i,j])=true)and(max<a[i,j]) then
max:=a[i,j];
end;

for j:=1 to n do
begin
min:=a[1,j];
for i:=1 to n do
begin
if min>a[i,j] then
begin
min:=a[i,j];
end;
end;
for i:=1 to n do
begin
if min=a[i,j] then
begin
a[i,j]:=max;
end;
end;
end;
end;

Begin
Vvod(n);
if Poisk(n)=true then Zamena(n);
Vyvod(n);
End.
 
Статус
Закрыто для дальнейших ответов.