В самом конце программы делает нули заместо матрицы. Не понимаю почему. Две недели уже сижу над этим. =/ ML и MD сортирует положительные и отрицательные. Все работает сначала нормально, но потом преобразованная таблица заполняется неверно! Помогите пожалуйста
Федосеев Павел
19.04.2016 22:32
При попытке компилировать FreePascal получаю сообщения
Цитата
Program.pas(64,10) Warning: Function result does not seem to be set Program.pas(180,4) Warning: Label not defined "L1" Program.pas(255,4) Error: Label used but not defined "L1"
Два первых - предупреждения, а последнее - ошибка.
Т.е. даже посмотреть из-за чего
Цитата
В самом конце программы делает нули заместо матрицы.
Не могу.
Может вы доведёте до компиляции программу?
И кроме того, приведите тестовые данные, т.к. трудно представить, что должно быть вместо нулей.
Могу её отформатировать для удобства автоматическим форматтером (но по прежнему, она не компилируется):
program Z21;
uses crt; {Вывод на экран}
type matr = array [1..6, 1..6] of integer; {Описание переменных} matr2 = array[1..6, 1..6] of integer; var a: matr; tabl: matr2; Error: integer; for_0, for_1, for_2: char; i, j, n, k: byte; ch: char; {переменная для хранения кода символа нажатой клавиши} nam_e: string; {строковый литерал} label L1; {Описание меток}
{---------------Ввод значений элементов массива(имя, строки, столбцы)---------------} procedure Mv(var n, k: byte; var nam_e: string); var error: integer; begin {1} Gotoxy(2, 3); textcolor(green); Write('Введите имя матрицы: '); Readln(nam_e); Clrscr; repeat {Начало цикла с постусловием} Gotoxy(4, 4); textcolor(lightblue); Writeln('Максимально допустимая размерность матрицы - 6х6 элементов');
{---------------Ввод размерности матрицы---------------} gotoxy(4, 6); textcolor(lightcyan); Write('Введите количество строк матрицы: ', nam_e, ': '); {$i-} ; Readln(n); error := IOresult; {$i+} ; if (n < 1) or (n > 6) or (Error <> 0) then begin {2} Textattr := lightred; Writeln('Ошибка! Количество строк матрицы - от 1 до 6. Повторите ввод!'); end; {2} until (n >= 1) and (n <= 6) and (Error = 0); {Конец цикла с постусловием} begin {3} repeat Gotoxy(4, 8); Textattr := cyan; Write('Введите количество столбцов матрицы ', nam_e, ': '); {$i-} ; Readln(k); error := IOresult; {$i+} ; if (k < 1) or (k > 6) or (Error <> 0) then begin {4} Textattr := lightred; Writeln('Ошибка! Количество столбцов матрицы - от 1 до 6. Повторите ввод!'); end; {4} until (k >= 1) and (k <= 6) and (Error = 0); end; {3} end; {1} {---------------Ввод элементов матрицы (случайные числа)---------------} function Random(n, k: byte; var A: Matr): integer; var i, j: byte; begin {1}
for i := 1 to n do begin {2} for j := 1 to k do begin {3} A[i, j] := system.random(19) - 9; Write(A[i, j]: 4); end;{3} end; {2} end; {4}
{---------------Ввод элементов матрицы(положительные)---------------} procedure Ml(var TABL: Matr2); var i, j: integer; begin {1} gotoxy(3, 4); textattr := yellow; writeln('Положительные элементы: ');
for i := 1 to n do begin {2}
for j := 1 to k do begin {3} if a[i, j] > 0 then Write(a[i, j]: 4) else Write(' '); TABL[i, j] := A[i, j]; writeln; end; {3} end; {2}
end; {1} {---------------Ввод элементов матрицы(отрицательные)---------------} procedure Md(var TABL: Matr2); var i, j: integer; begin {1} gotoxy(3, 4); writeln('Отрицательные элементы: ');
for i := 1 to n do begin {2}
for j := 1 to k do
if a[i, j] < 0 then Write(a[i, j]: 4) else Write(' '); TABL[i, j] := A[i, j]; writeln;
end; {2} readln; end; {1}
{---------------Ввод элементов матрицы(Расположение исходной и преобразованной)---------------} procedure Raspl(for_2: char); var I, j: byte; label L1; begin {1} clrscr; gotoxy(25, 1); Textattr := lightgreen; writeln('Исходная матрица'); Textattr := yellow; writeln(nam_e); writeln; Textattr := lightblue; Gotoxy(1, 3); for i := 1 to n do begin {2} for j := 1 to k do Write(A[i, j]: 5, ' '); writeln; end; {2}
case for_2 of {3} #112, #80: begin {1} gotoxy(n + 38, 2); {Справа от исходной} Textattr := yellow; writeln(nam_e); writeln; window(40, 3, 80, 15); Textattr := lightblue; for i := 1 to n do begin {2} for j := 1 to k do Write(TABL[i, j]: 5, ' '); writeln; end; {2} end; {1}
#76, #108: begin {1} Textattr := yellow; {Под исходной} Gotoxy(2, k + 7);
writeln(nam_e); writeln; gotoxy(1, k + 10); Textattr := lightblue; for i := 1 to n do begin {2} for j := 1 to k do Write(TABL[i, j]: 5, ' '); writeln; end; {2} end; {1} end; {3} end; {1} begin Mv(n, k, nam_e); clrscr; textattr := magenta; Writeln('Какие числа использовать в матрице?R-случайные,U-собственные'); readln(for_0); case for_0 of {2} #82, #114: Random(n, k, A); #85, #117: begin {3} clrscr; textattr := white; writeln('Введите элементы матрицы'); {Ввод элементов матрицы} for i := 1 to n do begin {4} for j := 1 to k do begin {5} repeat Write('Введите a[', i, ' ', j, ']'); {$i-} ; readln(a[i, j]); error := IOresult; {$i+} ; if (a[i, j] < -10000) or (a[i, j] > 10000) or (Error <> 0) then begin {6} Textattr := lightred; Writeln('Ошибка!Повторите ввод!'); end; {6}
until (a[i, j] <= 10000) and (a[i, j] >= -10000);
end; {5} writeln; end; {4} end; {3} end; {2}
clrscr; textattr := lightgreen; writeln('Какие элементы матрицы вывести? М-положительные,Q-отрицательные '); readln(for_1); case for_1 of {7} #77, #109: Ml(TABL); #81, #113: Md(TABL); end; {7} clrscr; textattr := green;
textattr := white; Write('Хотите начать заново?Y-Да, N-нет'); window(1, 1, 80, 25); Write; case readkey of {8} #89, #121: goto L1; #78, #110: exit; end; {8}
end. {1}
Lepsik1777
19.04.2016 22:40
Исправил, проблема теперь в том, что там где исходная и новая матрица, не пишется новая
Федосеев Павел
19.04.2016 22:56
Я ставлю точку останова на строку 148. Запускаю, выбираю отобразить справа, но на точке останова не останавливаюсь. Это означает, что нужно не умничать #112,#80, а записывать 's', 'S'.
Lepsik1777
20.04.2016 0:04
Цитата(Федосеев Павел @ 19.04.2016 23:56)
Я ставлю точку останова на строку 148. Запускаю, выбираю отобразить справа, но на точке останова не останавливаюсь. Это означает, что нужно не умничать #112,#80, а записывать 's', 'S'.
теперь он пишет две одинаковые матрицы так если исходная и есть новая то есть он печатает не новую справа от исходной или под а саму исходную дважды
Федосеев Павел
20.04.2016 0:24
Я не знаю, что у вас за программа. Вижу модификацию переменной TABL в процедурах Md и Ml. Посмотрите в отформатированном мною некомпилирующемся исходнике и увидите, что в Ml просто копируется TABL[i, j] := A[i, j]; а в Md происходит странное присвоение за пределами цикла for j.
Возьмите за привычку периодическое форматирование исходников - половина проблем легко находится. Форматируйте JCF (Jedi Code Formatter) - тут я описывал как установить.
Lepsik1777
20.04.2016 0:35
Цитата(Федосеев Павел @ 20.04.2016 1:24)
Я не знаю, что у вас за программа. Вижу модификацию переменной TABL в процедурах Md и Ml. Посмотрите в отформатированном мною некомпилирующемся исходнике и увидите, что в Ml просто копируется TABL[i, j] := A[i, j]; а в Md происходит странное присвоение за пределами цикла for j.
Возьмите за привычку периодическое форматирование исходников - половина проблем легко находится. Форматируйте JCF (Jedi Code Formatter) - тут я описывал как установить.
Я понимаю что проблема в присваивании Но как сделать иначе-то? чтобы печаталась и старая и новая
Федосеев Павел
20.04.2016 0:43
Это шутка?
Вы не формируете новую матрицу, вернее полностью её копируете. Без малейших изменений. Вот где здесь формирование отличий A от TABL?
{---------------Ввод элементов матрицы(положительные)---------------} procedure Ml(var TABL: Matr2); var i, j: integer; begin {1} gotoxy(3, 4); textattr := yellow; writeln('Положительные элементы: ');
for i := 1 to n do begin {2}
for j := 1 to k do begin {3} if a[i, j] > 0 then Write(a[i, j]: 4) else Write(' '); TABL[i, j] := A[i, j]; writeln; end; {3} end; {2}
end;
Почти так же и здесь
{---------------Ввод элементов матрицы(отрицательные)---------------} procedure Md(var TABL: Matr2); var i, j: integer; begin {1} gotoxy(3, 4); writeln('Отрицательные элементы: ');
for i := 1 to n do begin {2}
for j := 1 to k do
if a[i, j] < 0 then Write(a[i, j]: 4) else Write(' '); TABL[i, j] := A[i, j]; writeln;
end; {2} readln; end; {1}
Всё что мог, я уже диагностировал. Дальше вы должны предпринять меры по исправлению.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.