20:26

pascal

nothing is real unless it happens on television.
ребят, а кто-нить из вас изучал паскаль?
можете мне помочь решить задачу?
я как ни пытаюсь-не получается

вот собсно задача:

решить задачу, использую подпрограммы.
в тех строках матрицы А(12,14) для которых выполняется условие: К-ый элемент от начала строки равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. в других строках заменить на ноль минимальный положительный элемент.

я нарешала какую-то фигню:

слабонервным не читать

@темы: Pascal, Информатика

Комментарии
10.05.2008 в 21:10

На плечах гигантов, на спинах электронов
october 31.
навскидку первый вопрос:
в тех строках матрицы А(12,14) для которых...
Почему:
const RazmN=3;
RazmM=4;
?
Какая матрица у вас получается?
И, кстати, где выдается ошибка?
10.05.2008 в 21:15

nothing is real unless it happens on television.
Дилетант я взяла размеры поменьше, чтоб по 100 раз не заполнять.)

2 ошибки я исправила
вместоM[i,nmin]=0
M[i,nmax]=0;

вместо равно, равно с двоеточием, я пропустила.

компилирует все нормально.
ошибка выводится, когда уже в программе заполняю матрицу построчно
просто вылетает из программы в окно и пишет exitecode=201
я пыталась найти что это, но не могу.
такая же фигня у меня в другой задаче.
10.05.2008 в 21:17

На плечах гигантов, на спинах электронов
october 31.
ладно, сейчас посмотрю повнимательней
10.05.2008 в 22:25

На плечах гигантов, на спинах электронов
october 31.
ошибок масса...

Сейчас укажу только на часть из них:

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

На плечах гигантов, на спинах электронов
october 31.
Там понятно, в чем дело!
Области определения переменных в Паскале!
Нельзя матрицу передавать параметром в процедуру!
Она тогда не изменяется вне процедуры.
Т.е.
вместо:
procedure MINel(M:matr; i:byte; RazmM:byte);
нужно:
procedure MINel(i:byte; RazmM:byte);

И так же для Maxel.
И соотвественно, изменить их вызов.
Тогда всё работает.
Понятно излагаю, или пояснить?
10.05.2008 в 22:47

nothing is real unless it happens on television.
Дилетант вау.. просто слов нет.))
сейчас буду исправлять
вроде все понятно
а если что можно обратиться?
10.05.2008 в 23:05

На плечах гигантов, на спинах электронов
october 31.
можно, конечно)
10.05.2008 в 23:11

nothing is real unless it happens on television.
Дилетант а с функцией PP1 нормально все?

p:=PP1(M)
так можно писать? или надо PP1(M,i)?
11.05.2008 в 11:32

На плечах гигантов, на спинах электронов
october 31. или надо PP1(M,i)?
Да, конечно, это я забыла исправить (((
Сейчас выложу текст, который у меня вчера работал))
(Вдруг я еще что-то здесь упустила).
11.05.2008 в 11:34

На плечах гигантов, на спинах электронов
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; 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

На плечах гигантов, на спинах электронов
Там, кстати, в РР1 можно без промежуточной переменной р обойтись.
Но я уж не стала. Работает, и хорошо)))

Т.е. у вас главные ошибки были в инициализации начальных значений min и max (использование индексов i j до их задания), ну и задание параметров процедуры.
Там есть отличие: параметры по ссылке и по значению.
Если не знать, как это работает, то там, где это возможно, лучше переменные объявлять глобально (в главной программе) и не передавать их параметрами.
Совет этот не сильно грамотный с точки зрения распределения памяти (хорошие программисты так не сделают))) но он убережет вас от многих ошибок)))
11.05.2008 в 22:32

nothing is real unless it happens on television.
Дилетант аааа, волшебница!!
все работает!
Там есть отличие: параметры по ссылке и по значению. во, да, этого я толком и не поняла.
там тип надо формальные параметры указывать, а когда вызываешь-фактические. я всегда путаю.. я еще не очень понимаю какие параметры указывать в скобках, а какие просто через var. и почему матрицу нельзя указывать в скобках...

спасибо огромное, даже не знаю как благодарить! редко встретишь незнакомого человека, готового потратить на тебя свое время. спасибо!!!
12.05.2008 в 19:43

На плечах гигантов, на спинах электронов
october 31.
:)
да не за что!
На здоровье )))
Я рада, что помогло!
А про параметры лучше в какой-нибудь хорошей книжке почитать.
Они не только на формальные и фактические делятся. Они еще всяческими нюансами отличаются. Ну, это если действительно надо. А если нет, достаточно помнить, что тут много подводных камней, и делать, как я говорила: объявлять глобальные переменные там, где это можно :-D
18.05.2008 в 23:41

nothing is real unless it happens on television.
Дилетант это снова я) извини что опять напрягаю

у меня теперь проблемы с работой над множествами
я вроде как понимаю как делать, компилятор опять не выдает ошибок, но все равно не работает.(

задача звучит так:
вводится непустая строка из строчных русских букв, заканчивающаяся точкой.
отдельные слова в ней разделены запятыми (<=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

Когда ребенок вырастает, он многое перестает понимать
october 31.
посьба новые задания публиковать в новых постах: Вам же удобнее: больше экспертов смогут его увидеть и помочь)
19.05.2008 в 22:25

На плечах гигантов, на спинах электронов
october 31.
не разбираясь особо, вставила твой код.
У меня глючит crt.
Она-то и выдает деление на 0! Может, у тебя то же самое.
Я убрала
uses crt;
и clrscr.

Выдавать деление на ноль перестало, но всё зациклилось)))))))))
Попробуй убери и ты, и посмотри, что будет.


Dimaris Camestres прости, что я здесь отвечаю. Дайри глючат страшно. Боюсь выкинут меня отовсюду (((
19.05.2008 в 23:48

nothing is real unless it happens on television.
Dimaris Camestres ок, спс. сейчас опубликую)

Дилетант все равно эта ужасная ошибка 201. ух, как же оня меня достала!!
20.05.2008 в 02:33

Когда ребенок вырастает, он многое перестает понимать
Дилетант
прости, что я здесь отвечаю. Дайри глючат страшно. Боюсь выкинут меня отовсюду (((
Раз уж просьбу здесь написали, то логичнее отвечать тут, и не надо просить прощения :)
19.12.2010 в 14:13

решить задачу, использую подпрограммы.
в тех строках матрицы А(12,14) для которых выполняется условие: К-ый элемент от начала строки равен К-му элементу от конца строки (к=1,2,3...) заменить на ноль максимальный элемент. в других строках заменить на ноль минимальный положительный элемент.

Можно эту задачу в фортран перевести?????