Задача 3 Урок 20

Задача 3 Урок 20 Имеется текстовый файл в котором содержится не более 30 строк, в каждой строке не более 30 символов (пробелы тоже считаются символами). Цифры и другие символы перемешаны в каждой строке.
Задание: найдите максимальное число, c учетом того, что числом считаются подряд идущие цифры не только по горизонтали, но и по вертикали.

var f1: text;
    filename, s, n: string;
    i, j, c, int, o, max, smax: integer;
    a: array [1..30] of string;
begin
  filename := 'C:\Users\user\Documents\bolshee po gorver.txt';    // путь к файлу
  assign(f1, filename); // связывание переменной дескриптора  с путём к файлу
  reset(f1); // открываем файла для чтения
  while not eof(f1) do // пока не достигнут конец файла
    begin
      readln(f1, s); // читаем из него очередную строку
      c += 1;  // плюс к счётчику
      a[c] := s; // записываем строку в массив
      n := '';
      if smax < length(s) then smax := length(s); // если переменная smax меньше длинны строки то записываем длинну строки в smax    // (в блоке от 6 до 26 ищем самую большую строку по горизонтали)
      for i := 1 to length(s) + 1 do // цикл до максимальной длинны +1(если последняя будет цифра чтобы переменная попала в val)
       begin
         val(s[i], int, o); // отправляем превый символ из строки s для проверки число или нет
         if o = 0 then n += s[i] // если o(code)=0 то это число значит n прибавляем на это число
         else  // если нет
           begin
            val(n, int, o);// в подпрог для преобразования строки n в число
            if int > max then max := int;// если n больше max значит записываем int в max
            n := '';
           end;
       end;
    end;
  for i := 1 to c do  // внешний цикл от 1 до смотря сколько количества строк
   for j := 1 to smax do // внутренний цикл от одного  до максимального количество символов в одной из строки
     if length(a[i]) < smax then a[i] += ' '; // если максимальная длинна строки в массиве меньше самой максимальной строки то + пробел  ( нужно для выравнивания всех сторк особенно нужно если большие цифры стоят по вертикали)
  for i := 1 to smax do // внешний цикл от 1 до максимального количества символов(горизонталь)
   begin
   n := ''; // обнуляем
   for j := 1 to c do // внутренний цикл от 1 до смотря сколшько количества строк (вертикаль)                                    //  (в блоке от 28 до 58 ищем самую большую строку по вертикали)
    begin
     val(a[j][i], int, o); // отправляем превый символ из строки  для проверки число или нет
     if o = 0 then // если число
      begin
       n += a[j][i];//то плюс это число к n
       if j = c then val(n, int, o); //если достигнут конец цикла то преобразуем n в число(если данной ком не будет и цифра будет  в последней строке то преобразования не случ)
      end
     else // если нет
      begin
       val(n, int, o);   //
       n := '';     // обнуляем n
      end;
      if int > max then max := int; // если n больше max значит записываем int в max
    end;
   end;
  for i := 1 to c do writeln(a[i], '|'); // вывод строчек нга экран
  writeln('MAX: ', max); // вывод максимального
  readln();
end.                                             

Вывод консоли:

          \|/          |
        -->*<--        |
          /o\          |
         /_\_\         |
        /_/_0_\        |
       /_o_\_\_\       |
      /_/_/_/_/o\      |
     /@\_\_\@\_\_\     |
    /_/_/O/_/_/_/_\    |
   /_\_\_\_\_\o\_\_\   |
  /_/0/_/_/20_/_/@/_\  |
 /_\_\_\_\_0_\_\_\_\_\ |
/_/o/_/_/@/2/_/o/_/0/_\|
         [_1_]         |
MAX: 2021