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

Урок 19

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

Примеры:

fsd334rgd
rfg46gdfg
ter5tge56
123gergf
Ответ: 345


fsd334rgd
r      fg
ter5tge56
123gergf
Ответ: 334


fsd334rgd
r16hyj3f7
23tge6f57
123gergf7
Ответ: 777


          \|/
        -->*<--
          /o\
         /_\_\
        /_/_0_\
       /_o_\_\_\
      /_/_/_/_/o\
     /@\_\_\@\_\_\
    /_/_/O/_/_/_/_\
   /_\_\_\_\_\o\_\_\
  /_/0/_/_/20_/_/@/_\
 /_\_\_\_\_0_\_\_\_\_\
/_/o/_/_/@/2/_/o/_/0/_\
         [_2_]
Ответ: 2022
type cArr = array[1..30, 1..30] of char;

function getWinHorizont(charArr: cArr): integer;
//ищем наибольшее из чисел в горизонтали в массиве
  var newInt1, winInt, errorCode, loopCount1, loopCount2: integer;
      stringToInt: string;
      flag: boolean;

begin
  newInt1 := 0;
  winInt := 0;
  errorCode := 0;
  stringToInt := '';
  flag := false;
  for loopCount1 := 1 to 30 do //следующая строка
  begin
    for loopCount2 := 1 to 30 do //след ячейка массива
    begin
      //ищу число
        if (charArr[loopCount1, loopCount2] >= '0') and (charArr[loopCount1, loopCount2] <= '9') then //если символ - цифра
        begin
          flag := true;
          stringToInt := stringToInt + charArr[loopCount1, loopCount2]; // то добавляю цифру в числовую строку
        end
        else  //если символ не цифра
        begin
          if flag then //и флаг поднят
          begin
            val(stringToInt, newInt1, errorCode); //то получаем число
            stringToInt := '';//обнуляем строку для получения следующего числа
            //WriteLn('Число: ', newInt1);
            flag := false;
            if newInt1 > winInt then //если новое число больше прошлого большего
              winInt := newInt1;
          end;
        end;
    end;
    val(stringToInt, newInt1, errorCode); //получаем число из последнего набора цифр
    if newInt1 > winInt then //если новое число больше прошлого большего
      winInt := newInt1;
  //writeln('Проверки захода в горизонталь');
  end;
  //WriteLn('Число в конце горизонтали: ', winInt);
  getWinHorizont := winInt;
end;

function getWinVertical(charArr: cArr): integer;
 var
    newInt1, winInt, errorCode, loopCount1, loopCount2: integer;
    stringToInt: string;
    flag: boolean;

begin
  newInt1 := 0;
  winInt := 0;
  errorCode := 0;
  stringToInt := '';
  flag := false;
     for loopCount2 := 1 to 30 do //след ячейка массива
     begin
      for loopCount1 := 1 to 30 do //след строка массива
      begin
        if (charArr[loopCount1, loopCount2] >= '0') and (charArr[loopCount1, loopCount2] <= '9') then //если символ - цифра
        begin
          flag := true;
          stringToInt := stringToInt + charArr[loopCount1, loopCount2]; // то добавляю цифру в числовую строку
        end
        else  //если символ не цифра
        begin
          if flag then //и флаг поднят
          begin
            val(stringToInt, newInt1, errorCode); //то получаем число
            stringToInt := '';//обнуляем строку для получения следующего числа
            flag := false;
            if newInt1 > winInt then //если новое число больше прошлого большего
              winInt := newInt1;
            //WriteLn('Число: ', winInt);
          end;
        end;
      end;
      val(stringToInt, newInt1, errorCode); //получаем число из последнего набора цифр
      if newInt1 > winInt then //если новое число больше прошлого большего
        winInt := newInt1;
      //writeln('Проверки захода в вертикаль');
    end;
    //WriteLn('Число в конце вертикали: ', winInt);
    getWinVertical := winInt;
  end;

procedure sendToArr(s: string; sCount: integer; var charArr: cArr);

  var loopCount: integer;

begin
  for loopCount := 1 to length(s) do
  begin
    charArr[sCount, loopCount] := s[loopCount];
  end;
  if length(s) < 30 then
  begin
    for loopCount := length(s) + 1 to 30 do
    begin
      charArr[sCount, loopCount] := ' ';
    end;
  end;
end;

procedure fillArr(sCount: integer; var charArr: cArr);

var loopCount1, loopCount2: integer;

begin
  if sCount < 30 then
  begin
    for loopCount1 := sCount + 1 to 30 do //след ячейка массива
    begin
      for loopCount2 := 1 to 30 do //след строка массива
      begin
        charArr[loopCount1, loopCount2] := ' ';
      end;
    end;
  end;
end;

procedure fileContent(var f1: text; filename: string; charArr: cArr);
//выводим контент файла и получаем большее число

  var
    s: string;
    sCount, winInt, intOfFunction: integer;

begin
  sCount := 0;//счетчик строк - чисто для себя
  winInt := 0;//для записи максимального числа
  assign(f1, filename); // ассоциируем переменную f1 с именем файла
  {$I-} reset(f1); {$I+} //проверка на ошибку при открытии файла
  if IOResult <> 0 then
    WriteLn('Файл ', filename, ' не найден!')
  else
  begin
    WriteLn('Файл существует, вот его содержимое:');
    WriteLn();
    WriteLn('===Начало файла===');
    while not eof(f1) do //пока не конец файла
    begin
      readln(f1, s);
      WriteLn(s);
      inc(sCount); // считаю строки чисто для себя
      sendToArr(s, sCount, charArr); //отправляем строку для записи в массив
    end;
  end;
  if sCount < 30 then
    fillArr(sCount, charArr);
  intOfFunction := getWinHorizont(charArr);
  if intOfFunction > winInt then
    winInt := intOfFunction;
  intOfFunction := getWinVertical(charArr);
  if intOfFunction > winInt then
    winInt := intOfFunction;
  WriteLn('===Конец файла===');
  WriteLn();
  //WriteLn('Число строк в файле ', sCount);
  WriteLn('Наибольшее число ', winInt);
end;

var f1: text;
    filename: string;
    charArr: cArr;

begin
  filename := 'C:\Pascal\19\input3.txt';
  fileContent(f1, filename, charArr);
  readln();
end.

КОНСОЛЬ

Файл существует, вот его содержимое:

===Начало файла===
          \|/
        -->*<--
          /o\
         /_\_\
        /_/_0_\
       /_o_\_\_\
      /_/_/_/_/o\
     /@\_\_\@\_\_\
    /_/_/O/_/_/_/_\
   /_\_\_\_\_\o\_\_\
  /_/0/_/_/20_/_/@/_\
 /_\_\_\_\_0_\_\_\_\_\
/_/o/_/_/@/2/_/o/_/0/_\
         [_2_]
===Конец файла===

Наибольшее число 2022