Считывание целых чисел из консоли в переменные и работа с ними -- разбор. Read() и Readln(). Примеры Pascal

Получение значения, обработка и вывод на экран

Для начала рассмотрим пример программы (из урока №1 учебника Цветкова А. С.), позволяет вывести на экран квадрат целого числа, введённого пользователем:

Program Prog1;
var a, b : integer;
begin
	write('Введите число ');
	readln(a);
	b:=a*a;
	writeln('Квадрат этого числа = ', b);
end.

В данном примере использовалось две переменные в $a$ мы записывали значение, используй стандартную процедуру $readln()$:

readln(a);

Переменную же $b$ мы использовали, чтобы сохранить в её результат арифметического произведения:

b:=a*a;  

В последней инструкции мы просто вывели значение переменной $b$ на экран:

writeln('Квадрат этого числа = ', b);

Это можно было бы сделать и короче, без пояснений, например так:

writeln(b);

Но с пояснениям пользователю будет понятно что это за значение.

Получение нескольких переменных и работа с ними

Предположим, что у нас есть задача:

Город будущего. С помощью солнечных батарей, установленных на крышах домов люди могут питать общую электрическую сеть, а не только получать из неё энергию. У одного человека есть $2$ солнечные батареи, одна производит энергии на $100$ рублей в день, а другая, более мощная -- на $150$ рублей (обе батареи вырабатывают энергию даже когда человек в отъезде, не живёт дома). При этом полное обслуживание дома, когда человек живет в нём требует $300$ рублей день. Помогите пользователю рассчитать, сколько он должен заплатить городу (это число может быть отрицательным в зависимости от параметров), с учетом введённых им трёх параметров:

  1. Числа дней, которые работала 1-ая батарея
  2. Числа дней, когда работала 2-ая батарея
  3. Числа дней, когда он жил в своём доме.

Сначала просто решим такую задачу так, как её решают на математике.

Заметим, что в итоге нам необходимо рассчитать сумму, которую человек должен отдать городу за энергию. Если окажется, что батареи жителя выработали энергии больше, чем он потратил, то эта сумма будет отрицательной (явления отрицательной стоимости электроэнергии в некоторые дни наблюдались уже, как минимум, в Голландии в 2016-ом году).

Составим уравнение расчёта суммы выплаты -- путь $S$, это деньги в рублях, которые человек должен выплатить городу, предположим, что человек указал, что:

  1. $N$ дней работала 1-ая батарея
  2. $M$ дней работала 2-ая батарея
  3. $K$ дней он жил в доме (то есть потреблял энергию на 300 рублей в день)

Тогда получаем формулу для выплачиваемой человеком суммы:
$$
S = 300 * K - (100 * M + 150 * N) \;\;\;\;\; (1)
$$
-- эта формула представляет собой математическую запись алгоритма расчёта суммы.

Далее фактически нам нужно просто реализовать данный алгоритм на Pascal.

Немного об операторных скобках и теле программы

Посмотрим ещё раз на формулу $(1)$, в ней три неизвестных, а потому нам понадобятся три переменные целочисленного типа, начнём составлять программу (переменные объявим в конце) сначала просто откроем и закроем операторные скобки:

begin // начало программы ("открывающая операторная скобка")

// здесь тело программы

end. // конец программы (или "закрывающая операторная скобка")

Комментарии, приведённые выше после двойных дробных чёрт (//) никак не влияют на выполнение программы, и служат, чтобы программист (или другие люди из его команды) могли напомнить себе и другим что именно делает этот код. Итак, по сути мы сейчас просто открыли и закрыли операторные скобки, код выше с точки зрения работы программы ничем не отличается от такого:

begin 

// здесь тело программы

end.

Или даже такого:

begin 

end. 

Далее перейдём непосредственно к решению задачи про электроэнергию.

Получение значений переменных от пользователя

Далее нам нужно получить значение переменных от пользователя, в нашей формуле (1) мы видим три неизвестных, а в примере выше (вычисление) квадрата мы получали только одно значение от пользователя, теперь же получим одно за одним три значения, записать каждое в разные переменные.

"Без лишнего" это делается так:

begin
    readln(a);
    readln(b);
    readln(c);  
end.

-- тут три инсткрукции чтения данных от пользователя (из консоли), сначала $a$, потом в $b$ и третья инструкция -- в $c$.

Но чтобы пользователя понимал какое именно значение, он вводит, следует напечатать в консоли комментарий перед каждой инструкцией ввода, например так:

begin

    writeln('Укажите время работы 1-ой солнечной батареи: ');
    readln(a);
    
    writeln('Укажите время работы 2-ой солнечной батареи: ');
    readln(b);
    
    writeln('Укажите время, которое человек жил в доме: ');
    readln(c);
    
end.

Ну и чтобы было совсем понятно (для пользователя), начнём выполнение программы с упоминания того, что время мы будем измерять в месяцах

Program Prog1;
begin
    writeln('В качестве единицы измерения времени будем использовать месяц');
    
    writeln('Укажите время работы 1-ой солнечной батареи: ');
    readln(a);
    
    writeln('Укажите время работы 2-ой солнечной батареи: ');
    readln(b);
    
    writeln('Укажите время, которое человек жил в доме: ');
    readln(c);
    
end.

Всё, теперь пользователю понятно в какой момент какие данные он вводит, а после выполнения строк в последнем примере мы знаем значения всех переменных из нашей форме $(1)$, остаётся просто выполнить расчёт, записав полученное значение в какую-нибудь новую переменную, скажем, $d$:

d := 300*c - (100*a + 150*b);

И вывести полученное значение на экран с помощью writeln, но само значение мы передадим вторым аргументом (аргументы функций - т.е. то, что записывает после имени функции скобках разделяются запятыми), а первым аргументом передадим комментарий -- строковый литерал, который будет сообщать, что выводимое значение есть ответ задачи, например так:

writeln('ОТВЕТ-- человек должен заплатить: ', d);

-- комментарий может быть любым (или его может вообще не быть, что не очень хорошо), лишь бы он был понятным и к месту.

Объявление переменных

К этому моменту наша программа выглядит так:

begin
    writeln('В качестве единицы измерения времени будем использовать месяц');
    
    writeln('Укажите время работы 1-ой солнечной батареи: ');
    readln(a);
    
    writeln('Укажите время работы 2-ой солнечной батареи: ');
    readln(b);
    
    writeln('Укажите время, которое человек жил в доме: ');
    readln(c);
    
    d := 300*c - (100*a + 150*b); // вычисление
    
    writeln('ОТВЕТ-- человек должен заплатить: ', d);
    
end.

Мы закончили разработку тела программы (часть между begin и end) и теперь нам осталось только объявить переменные. Объявлять необходимо все переменные, которые мы использовали, так мы использовали три переменные для считывания данных из консоли (пользовательского ввода) и одну, чтобы записать в неё результат арифметического выражения (это была переменная $d$).

Чтобы объявить их будем использовать секцию, начинающуюся с ключевого слова $var$. Все наши переменные -- это целое числа, а потому нам вполне подойдёт тип integer (который как раз и отвечает за хранение целых численных значений).
Итак, объявим все четыре переменные как целочисленные:

var a, b, c, d : integer;
begin
 // тело программы
    
end.

Можно подробно расписать что в какой переменной хранится, добавив комментарии:

var a,  // время работы 1-ой батареи
b,   // время работы 2-ой батареи
c,  // время, которое человек прожил в доме
d   // тут будет ответ
 : integer;
begin
    
end.

Итоговый код

Таким образом, в итоге мы получили следующий программный код:

Program Prog1;
var a, b, c, d : integer;
begin
    writeln('В качестве единицы измерения времени будем использовать месяц');
    
    writeln('Укажите время работы 1-ой солнечной батареи: ');
    readln(a);
    
    writeln('Укажите время работы 2-ой солнечной батареи: ');
    readln(b);
    
    writeln('Укажите время, которое человек жил в доме: ');
    readln(c);
    
    d := 300*c - (100*a + 150*b);
    
    writeln('ОТВЕТ-- человек должен заплатить: ', d);
    
end.

Задачи

  1. Решите рассмотренную выше задачу с теми же условиями, но дополнительно предоставив пользователю возможность указать суммы, на которые вырабатывает энергии в день 1-ая солнечная батарея, и сумму, на которую вырабатывает 2-я.
  2. Решите задачу:

    Город будущего. С помощью солнечных батарей, установленных на крышах домов люди могут питать общую электрическую сеть, а не только получать из неё энергию. У одного человека есть $2$ солнечные батареи, одна производит энергии на $100$ рублей в день, а другая, более мощная -- на $150$ рублей (обе батареи вырабатывают энергию даже когда человек в отъезде, не живёт дома). При этом полное обслуживание дома, когда человек живет в нём требует $300$ рублей день. Помогите пользователю рассчитать, сколько он должен заплатить городу (это число может быть отрицательным в зависимости от параметров), с учетом введённых им $4$-x параметров:

    1. Период (число месяцев) за который делается платёж (в это время по-идее должны работать все батареи и человек мог бы жить весь этот период дома, но следующие ниже параметры уточнят ситуцаию)
    2. Числа дней, которые НЕ работала 1-ая батарея (например, из-за поломки)
    3. Числа дней, которые НЕ работала 2-ая батарея
    4. Числа дней, которые человек НЕ жил дома (эти дни, он не потреблял энергию)

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

    Решайте задачу аналогично размышлениям, приведённым в этом уроке выше -- для начала составьте формулу, которая вычислит нужную сумму из по 4-ём параметрам, а после уже реализуйте решение на Паскале.