ребят, а кто-нить из вас изучал паскаль?
можете мне помочь решить задачу?
я как ни пытаюсь-не получается
вот собсно задача:
решить задачу, использую подпрограммы.
в тех строках матрицы А(12,14) для которых выполняется условие: К-ый элемент от начала строки равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. в других строках заменить на ноль минимальный положительный элемент.
я нарешала какую-то фигню:
слабонервным не читать
Program Podprogrammu;
const RazmN=3;
RazmM=4;
type matr=array[1..RazmN,1..RazmM] of integer;
var M:matr;
i,j:byte;
min, max:integer;
p:boolean;
Procedure VVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('введите матрицу',RazmN,'*',RazmM);
for i:=1 to RazmN do
begin
writeln('введите строку',i,' ');
for j:=1 to RazmM do
Read (M[i,j]);
readln;
end;
END;
Procedure VIVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('полученный результат');
for i:=1 to RazmN do
begin
for j:=1 to RazmM do
write(M[i,j],' ');
writeln;
end;
END;
function PP1(var M:matr):boolean; {выполняется ли условие в итой строке}
var i,j:byte;
p:boolean;
BEGIN
p:=true; {все элементы равны}
for j:=1 to RazmM do
begin
if (M[i,j]<>M[i,RazmM-j+1]) and (p=true)
then p:=false;
end;
PP1:=P;
END;
procedure MAXel(M:matr; RazmN:byte; RazmM:byte); {максимальный элемент в строке заменяем на ноль}
var i,j,nmax:byte; {n-номер макс элемента в строке}
max:integer;
BEGIN
max:=M[i,j];
for j:=1 to RazmM do
begin
if M[i,j]>max then begin
max:=M[i,j];
nmax:=j;
end;
end;
M[i,nmax]=0;
END;
procedure MINel(M:matr; RazmN:byte; RazmM:byte); {минимальный положительный элемент в строке и замена его на ноль}
var i,j,nmin:byte;
min:integer;
f:boolean;
BEGIN
f:=false; {первый положит элемент не найден}
for j:=1 to RazmM do
begin
if (M[i,j]>0) and (f=false)
then begin
min:=M[i,j];
f:=true;
end
else begin
if (M[i,j]>0) and (f=true) and (M[i,j]<min)
then begin
min:=M[i,j];
nmin:=j;
end;
end;
end;
M[i,nmin]=0
END;
BEGIN
writeln('в тех строках матрицы А(12,14), для которых выполняется условие: К-ый элемент от начала равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. В других строках заменить на ноль минимальный полож элемент.');
VVOD(M, RazmN, RazmM);
p:=PP1(M);
for i:=1 to RazmN do
begin
if p=true then MAXel(M, RazmN, RazmM)
else MINel(M, RazmN, RazmM);
end;
VIVOD(M, RazmN, RazmM);
END.
@темы:
Pascal,
Информатика
-
-
10.05.2008 в 21:10навскидку первый вопрос:
в тех строках матрицы А(12,14) для которых...
Почему:
const RazmN=3;
RazmM=4;
?
Какая матрица у вас получается?
И, кстати, где выдается ошибка?
-
-
10.05.2008 в 21:152 ошибки я исправила
вместоM[i,nmin]=0
M[i,nmax]=0;
вместо равно, равно с двоеточием, я пропустила.
компилирует все нормально.
ошибка выводится, когда уже в программе заполняю матрицу построчно
просто вылетает из программы в окно и пишет exitecode=201
я пыталась найти что это, но не могу.
такая же фигня у меня в другой задаче.
-
-
10.05.2008 в 21:17ладно, сейчас посмотрю повнимательней
-
-
10.05.2008 в 22:25ошибок масса...
Сейчас укажу только на часть из них:
Program Podprogrammu;
const RazmN=3;
RazmM=4;
type matr=array[1..RazmN,1..RazmM] of integer;
var M:matr;
i,j:byte;
min, max:integer;
p:boolean;
Procedure VVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('введите матрицу',RazmN,'*',RazmM);
for i:=1 to RazmN do
begin
writeln('введите строку',i,' ');
for j:=1 to RazmM do
Read (M[i,j]);
readln;
end;
END;
Procedure VIVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('полученный результат');
for i:=1 to RazmN do
begin
for j:=1 to RazmM do
write(M[i,j],' ');
writeln;
end;
END;
function PP1(var M:matr):boolean; {выполняется ли условие в итой строке}
"здесь должен быть параметр: номер строки i, т.е. должно быть:
function PP1(var M:matr; i:byte):boolean; {выполняется ли условие в итой строке}
var
i,j:byte; -------> var j:byte;p:boolean;
BEGIN
p:=true; {все элементы равны}
for j:=1 to RazmM do
begin
if (M[i,j]<>M[i,RazmM-j+1]) and (p=true)
then p:=false;
end;
PP1:=P;
END;
procedure MAXel(M:matr; RazmN:byte; RazmM:byte); {максимальный элемент в строке заменяем на ноль}
здесь то же самое: параметром должен быть номер строки, а количество строк — не нужно!:
procedure MAXel(M:matr; i:byte; RazmM:byte); {максимальный элемент в строке заменяем на ноль}
var
i,j,nmax:byte; {n-номер макс элемента в строке} ----> var j,nmax:byte;max:integer;
BEGIN
max:=M[i,
j]; ------- здесь должно быть: max:=M[i,1]; nmax:=1;for j:=2 to RazmM do
begin
if M[i,j]>max then begin
max:=M[i,j];
nmax:=j;
end;
end;
M[i,nmax]=0;
END;
procedure MINel(M:matr; i:byte; RazmM:byte); {минимальный положительный элемент в строке и замена его на ноль}
var
i,j,nmin:byte; ----> var j,nmin:byte;min:integer;
f:boolean;
BEGIN
f:=false; {первый положит элемент не найден}
for j:=1 to RazmM do
begin
if (M[i,j]>0) and (f=false)
then begin
min:=M[i,j];
f:=true;
end
else begin
if (M[i,j]>0) and (f=true) and (M[i,j]<min)
then begin
min:=M[i,j];
nmin:=j;
end;
end;
end;
M[i,nmin]=0
END;
BEGIN
writeln('в тех строках матрицы А(12,14), для которых выполняется условие: К-ый элемент от начала равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. В других строках заменить на ноль минимальный полож элемент.');
VVOD(M, RazmN, RazmM);
p:=PP1(M);
for i:=1 to RazmN do
begin
if p=true then MAXel(M, i, RazmM)
else MINel(M, i, RazmM);
end;
VIVOD(M, RazmN, RazmM);
END.
Так она почему-то всё равно не работает...
Сейчас еще гляну...
-
-
10.05.2008 в 22:38Там понятно, в чем дело!
Области определения переменных в Паскале!
Нельзя матрицу передавать параметром в процедуру!
Она тогда не изменяется вне процедуры.
Т.е.
вместо:
procedure MINel(M:matr; i:byte; RazmM:byte);
нужно:
procedure MINel(i:byte; RazmM:byte);
И так же для Maxel.
И соотвественно, изменить их вызов.
Тогда всё работает.
Понятно излагаю, или пояснить?
-
-
10.05.2008 в 22:47сейчас буду исправлять
вроде все понятно
а если что можно обратиться?
-
-
10.05.2008 в 23:05можно, конечно)
-
-
10.05.2008 в 23:11p:=PP1(M) так можно писать? или надо PP1(M,i)?
-
-
11.05.2008 в 11:32Да, конечно, это я забыла исправить (((
Сейчас выложу текст, который у меня вчера работал))
(Вдруг я еще что-то здесь упустила).
-
-
11.05.2008 в 11:34const RazmN=3;
RazmM=4;
type matr=array[1..RazmN,1..RazmM] of integer;
var M:matr;
i,j:byte;
min, max:integer;
p:boolean;
Procedure VVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('введите матрицу',RazmN,'*',RazmM);
for i:=1 to RazmN do
begin
writeln('введите строку',i,' ');
for j:=1 to RazmM do
Read (M[i,j]);
readln;
end;
END;
Procedure VIVOD(var M:matr; RazmN:byte; RazmM:byte);
var i,j:byte;
BEGIN
writeln('полученный результат');
for i:=1 to RazmN do
begin
for j:=1 to RazmM do
write(M[i,j],' ');
writeln;
end;
END;
function PP1(var M:matr; i:byte):boolean; {выполняется ли условие в итой строке}
var j:byte;
p:boolean;
BEGIN
p:=true; {все элементы равны}
for j:=1 to RazmM do
begin
if (M[i,j]<>M[i,RazmM-j+1]) and (p=true)
then p:=false;
end;
PP1:=P;
END;
procedure MAXel(RazmM:byte; i:byte); {максимальный элемент в строке заменяем на ноль}
var j,nmax:byte; {n-номер макс элемента в строке}
max:integer;
BEGIN
max:=M[i,1];
nmax:=1;
for j:=1 to RazmM do
begin
if M[i,j]>max then begin
max:=M[i,j];
nmax:=j;
end;
end;
M[i,nmax]:=0;
writeln (M[i,nmax]);
readln;
END;
procedure MINel(RazmM:byte; i:byte); {минимальный положительный элемент в строке и замена его на ноль}
var j,nmin:byte;
min:integer;
f:boolean;
BEGIN
f:=false; {первый положит элемент не найден}
for j:=1 to RazmM do
begin
if (M[i,j]>0) and (f=false)
then begin
min:=M[i,j];
nmin:=j;
f:=true;
end
else begin
if (M[i,j]>0) and (f=true) and (M[i,j]<min)
then begin
min:=M[i,j];
nmin:=j;
end;
end;
end;
M[i,nmin]:=0;
END;
BEGIN
writeln ('Begin');
VVOD(M, RazmN, RazmM);
for i:=1 to RazmN do
begin
p:=PP1(M, i);
if p=true then MAXel(RazmM, i)
else MINel(RazmM, i);
end;
VIVOD(M, RazmN, RazmM);
END.
-
-
11.05.2008 в 11:40Но я уж не стала. Работает, и хорошо)))
Т.е. у вас главные ошибки были в инициализации начальных значений min и max (использование индексов i j до их задания), ну и задание параметров процедуры.
Там есть отличие: параметры по ссылке и по значению.
Если не знать, как это работает, то там, где это возможно, лучше переменные объявлять глобально (в главной программе) и не передавать их параметрами.
Совет этот не сильно грамотный с точки зрения распределения памяти (хорошие программисты так не сделают))) но он убережет вас от многих ошибок)))
-
-
11.05.2008 в 22:32все работает!
Там есть отличие: параметры по ссылке и по значению. во, да, этого я толком и не поняла.
там тип надо формальные параметры указывать, а когда вызываешь-фактические. я всегда путаю.. я еще не очень понимаю какие параметры указывать в скобках, а какие просто через var. и почему матрицу нельзя указывать в скобках...
спасибо огромное, даже не знаю как благодарить! редко встретишь незнакомого человека, готового потратить на тебя свое время. спасибо!!!
-
-
12.05.2008 в 19:43да не за что!
На здоровье )))
Я рада, что помогло!
А про параметры лучше в какой-нибудь хорошей книжке почитать.
Они не только на формальные и фактические делятся. Они еще всяческими нюансами отличаются. Ну, это если действительно надо. А если нет, достаточно помнить, что тут много подводных камней, и делать, как я говорила: объявлять глобальные переменные там, где это можно
-
-
18.05.2008 в 23:41у меня теперь проблемы с работой над множествами
я вроде как понимаю как делать, компилятор опять не выдает ошибок, но все равно не работает.(
задача звучит так:
вводится непустая строка из строчных русских букв, заканчивающаяся точкой.
отдельные слова в ней разделены запятыми (<=70 симв). вывести на печать в алфавитном порядке:
все главные, которые входят в каждое четное слово и не входят ни в одно нечетное слово.
я делаю так:
Program mnowestva;
uses crt;
var St, St1, sl: string[70];
l,lsl,z,i:byte;
mnT, mnR1, mnR2,MnR, et: set of 'а'..'я';
p:boolean;
c,b:char;
Begin clrscr;
repeat
repeat
writeln('введите строку < 70 символов и заканчивающуюся точкой');
writeln('ВНИМАНИЕ: слова в строке должны быть разделены запятой!');
readln(st);
l:=length(st); {длинна строки}
if (st[l]<>'.') then
writeln('строка не верна. повторите ввод');
until (st[l]='.') and (l>0) and (l<70);
et:=['а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я']; {эталонное множество из гласных}
mnT:=[]; {текущее множество}
MnR1:=et; {результирующее по нечетным словам}
MnR2:=et; {результирующее по четным словам}
MnR:=[]; {результат}
p:=true;
i:=1;
while l>0 do begin { repeat}
z:=pos(',',st);
if z=0 then z:=l+1; {если вся строка - одно слово, то позиция z+1}
sl:=copy(st,1,z-1);
lsl:=length(sl);
for i:=1 to lsl do
begin
c:=sl[i];
if c in et then mnT:=mnT+[c];
end;
if p=true then MnR1:=MnR1-MnT {разность}
else MnR2:=MnR2*MnT; {пересечение}
p:=not p;
delete(st,1,z);
l:=l-z;
end; { until(l<=0);}
MnR:=MnR1*Mnr2;
for c:='а' to 'я' do
if c in MnR then writeln(c);
writeln('еще предложение?y/n');
readln(b);
until(b='n');
end.
вроде все нормально, но опять эта дурацкая ошибка 201.
может ты видишь в чем проблема? я голову сломала((
-
-
19.05.2008 в 14:28посьба новые задания публиковать в новых постах: Вам же удобнее: больше экспертов смогут его увидеть и помочь)
-
-
19.05.2008 в 22:25не разбираясь особо, вставила твой код.
У меня глючит crt.
Она-то и выдает деление на 0! Может, у тебя то же самое.
Я убрала
uses crt;
и clrscr.
Выдавать деление на ноль перестало, но всё зациклилось)))))))))
Попробуй убери и ты, и посмотри, что будет.
Dimaris Camestres прости, что я здесь отвечаю. Дайри глючат страшно. Боюсь выкинут меня отовсюду (((
-
-
19.05.2008 в 23:48Дилетант все равно эта ужасная ошибка 201. ух, как же оня меня достала!!
-
-
20.05.2008 в 02:33прости, что я здесь отвечаю. Дайри глючат страшно. Боюсь выкинут меня отовсюду (((
Раз уж просьбу здесь написали, то логичнее отвечать тут, и не надо просить прощения
-
-
19.12.2010 в 14:13в тех строках матрицы А(12,14) для которых выполняется условие: К-ый элемент от начала строки равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. в других строках заменить на ноль минимальный положительный элемент.
Можно эту задачу в фортран перевести?????