Работа с разными типами данных

Задача 3 Урок 15:

У вас есть массив:

type
  myArr = array[1..8] of integer; 
var
  a: myArr;
-- целочисленный из 8 элементов.

Пользователь вводит любые целые числа (после каждого нажимает Enter),
до тех пор пока не введет символ решетки #.

Задача: сохранить в массив целые числа, которые ввел пользователь
(до символа # или до окончания места в массиве) и вывести их на экран,
значения неиспользованных ячеек массива выводить ненужно.

Решение:
Преобразование из string в integer процедурой Val не рассматриваем, потому что
это урок 18.

Целые числа это тип integer. Символы тип char. Не понимаю как считывать ввод из
консоли разных типов данных. Глобальные переменные с одним именем, но разных типов
создать нельзя. Локальные переменные в разных процедурах или функциях будет
не видно. Если создать переменную типа string, то как её потом преобразовать в число
для записи в массив, который типа integer? Помогите пожалуйста разобраться.

vedro-compota's picture

Для считывания очередного значения тут достаточно процедуры readln() - она приводится в примерах урока

Подробнее см. видео-комментарий: https://youtu.be/NRD_ueud1ag

_____________
матфак вгу и остальная классика =)

type
  myArr = array[1..8] of integer;
var
  a: myArr;
  i: integer;

begin
  for i:= low(a) to high(a) do
  begin
    writeln('Vvedite ',i,' chislo :');
    readln(a[i]);
    //if a[i] = '#' then
      //break;
  end;
//Выводим массив на экран
  writeln('Vash massiv :');
  for i:= low(a) to high(a) do 
    writeln('[',i,'] = ',a[i]);
  readln();
end. 

Решение с выводом массива, которое работает до ввода '#'. Если ввести '#',
то Lazarus выдает ошибку о несоответствии числовому типу. Консоль останавливается.
Закоментировал проверку условия (для примера), которое не запустит программу
из-за несоответствия типов. Не понимаю, как остановить цикл после ввода '#'.

vedro-compota's picture

да, все логично, тут:

readln(a[i]); // попытка записать символ в число, поэтому ошибка
    //if a[i] = '#'

-- идет попытка сначала считать как число, а потом проверить, чтобы решить проблему придется читать два раза получается, первый раз как char- там любой символ получится считать и сравнить

_____________
матфак вгу и остальная классика =)

type
  myArr = array[1..8] of integer;
var
  a: myArr;
  i,int: integer;
  cha_r:char;
begin
  for i:= low(a) to high(a) do
  begin
    writeln('Vvedite ',i,' chislo :');
    readln(cha_r);
    if (cha_r = '#') then
      break
    else
    begin
      writeln('Povtorite vvod ',i,' chisla :');
      readln(int);//эти две строки для наглядности вместо
      a[i] := int; //одной readln(a[i]);
    end;
  end;
//Выводим массив на экран
  writeln('Vash massiv :');
  for i:= low(a) to high(a) do
    writeln('[',i,'] = ',a[i]);
  readln();
end.  

Получается приходится 2 раза просить ввести число для записи одной ячейки массива.
Или есть другое решение?

vedro-compota's picture

в этом варианте действительно, судя по всему, без двух readln() не обойтись, переформулируем условие задачи на с массива чисел на массив символов, а оригинальную задачку перенесем в урок с процедурой val()

_____________
матфак вгу и остальная классика =)