Некорректно работает проверка

У меня есть код. В коде есть 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 шт):

Автор решения: Vladimir Afanasyev

Во-первых, у вас стоит условие 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];
→ Ссылка