Некорректно работает проверка
У меня есть код. В коде есть 2 проверки в циклах repeat..until на вводимые данные. Вопрос такой: почему эти проверки не работают корректно? Т.е., цвет текста не окрашивается в красный и текст выводится постоянно, даже если число в необходимом диапазоне. Ещё у меня есть проблема с окрашиванием в белый цвет (закомментированные строки). Строки становятся вообще бесцветными. В чем может быть проблема?
Код:
uses crt;
var a:array[1..24,1..24] of integer;
n,m,i,j,k,v,tmp:integer; {размеры матрицы,счетчики циклов, буфер для обмена}
begin
randomize();
writeln();
writeln('------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
writeln();
writeln(' Ввод размеров матрицы....................... ');
write(' Введите количество строк n > ');
repeat
readln(n);
if (n < 1) and (n > 23) then
textcolor(12);
writeln('Ошибка ввода, попробуйте снова. Число строк должно быть в диапазоне от 1 до 23!');
{textcolor(0);}
write(' Введите количество строк n > ');
until n in [1..23]; {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
write(' Введите количество столбцов > ');
repeat
readln(m);
if (m < 1) and (m > 23) then
textcolor(12);
writeln('Ошибка ввода, попробуйте снова. Число столбцов должно быть в диапазоне от 1 до 23!');
{textcolor(0);}
write(' Введите количество столбцов > ');
until m in [1..23]; {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
writeln();
textcolor(13);
writeln('------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
writeln();
writeln('Исходная матрица:');
writeln();
writeln();
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(500)-250;{заполним матрицу случайными числами в инт[0,499]}
write(a[i,j]:7);
end;
writeln();
end;
writeln('------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
writeln();
{сортировка матрицы}
for k:=1 to n * m do {повторяем сколько элементов в матрице}
for i:=1 to n do
for j:=1 to m do
begin
if j <> m then {если элемент в строке не последний}
begin
if a[i,j+1] < a[i,j]
then
begin
tmp:=a[i,j+1];
a[i,j+1]:=a[i,j];
a[i,j]:=tmp;
end;
end
else
if (a[i+1,1] < a[i,j])and(i <> n) {если строка не последняя}
{меняем первый элемент в следущей строке с последним элементом в текущей строке}
then
begin
tmp:=a[i+1,1];
a[i+1,1]:=a[i,j];
a[i,j]:=tmp;
end;
end;
textcolor(14);
writeln('------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
writeln();
writeln('Отсортированная матрица:');
writeln();
writeln();
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:7);
writeln();
end;
writeln('------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
writeln();
end.
Ответы (1 шт):
Во-первых, у вас стоит условие n < 1 И n > 23. Такое в принципе невозможно - нужно использовать ИЛИ, т.е. or вместо and.
Во-вторых, тело программы, которое должно выполняться при верном условии ифа не заключено между begin-end.
В-третьих, textcolor(0) - это черный цвет, а черное на черном будет восприниматься прозрачным. Белый цвет - textcolor(15).
Вот верный кусок кода (в остальных местах нужно подправить это по аналогии):
repeat
readln(n);
if (n < 1) or (n > 23) then
begin
textcolor(12);
writeln('Ошибка ввода, попробуйте снова. Число строк должно быть в диапазоне от 1 до 23!');
textcolor(15);
write(' Введите количество строк n > ');
end;
until n in [1..23];