Была бы очень признательна, если кто-то поможет разобраться.
Недавно начала изучать Паскаль по книжке Доналда Алкока "Язык Паскаль в иллюстрациях" и споткнулась на задании 2-й главы (усовершенствовать программу расчета площади для трех типов фигур - прямоугольников, треугольников и кругов, сделав, чтобы после вывода результата программа не заканчивалась, а возвращалась к решению задачи, кроме случаев, когда пользователь ввел букву "Z", которая должна стать признаком остановки).
Исходная программа из книги запрашивает первую букву соответствующего типа фигур, а потом размеры сторон для прямоугольников и треугольников, а для круга - диаметр). После чего выводится рассчитанная площадь фигуры. Ниже привожу схему программы и ее текст, который успешно компилируется, после чего программа выполняется ровно так как я и ожидала.
Схема и текст исходной программы (скан)
https://sun9-4.userapi.com/impg/CVKNOalmnj1jHTCZG4CBzn4eEj03Yld48FeXaw/AFOeL5BvGb8.jpg?size=1412x2160&quality=95&sign=60858b77419c50c84687489fe5d53431&type=album
Сам текст исходной программы
- Код: Выделить всё
PROGRAM shapes(INPUT,OUTPUT);
CONST
pi = 3.1415926;
VAR
letter: CHAR; s,area,a,b,c,d: REAL; ok: BOOLEAN;
BEGIN
ok := TRUE;
READ(letter);
IF (letter='П') OR (letter='п')
THEN
BEGIN
READ(b,d);
area:= b*d
END
ELSE IF (letter='Т') OR (letter='т')
THEN
BEGIN
READ(a,b,c);
s:= 0.5*(a+b+c);
area:= SQRT(s*(s-a)*(s-b)*(s-c))
END
ELSE IF (letter='К') OR (letter='к')
THEN
BEGIN
READ(d);
area:= pi*sqr(d)/4
END
ELSE ok:= FALSE;
IF ok THEN WRITE('Площадь равна',area:8:2)
ELSE WRITE('Должно быть П, Т или К')
END.
Дальше путём продолжительных переговоров с компилятором я пришла к коду, текст которого привожу ниже. В нем слегка измененная в конце исходная программа заключена в цикл WHILE, тело которого повторяется при выполнении условия, что введенная пользователем литера не является ни 'Z', ни 'z'. Изменения кода внутри цикла коснулись части после строки "ELSE ok:= FALSE;". Полученный текст компилируется, запускается, позволяет выполнить вычисление площади для одной из фигур один раз и даже позволяет завершить программу, введя 'Z'. Но вот запрашивать повторно у пользователя значение переменной, определяющей тип фигуры программа не хочет, впрочем после двух странных итераций она что-то запрашивает, но ввод первой буквы фигуры не приводит к запросу размеров. Ниже привожу мой текст модифицированной программы и скриншоты окошка выполнения.
Текст модифицированной программы
- Код: Выделить всё
PROGRAM shapes(INPUT,OUTPUT);
CONST
pi = 3.1415926;
VAR
letter: CHAR; s,area,a,b,c,d: REAL; ok: BOOLEAN;
BEGIN
ok := TRUE;
WRITELN('Выберите фигуру (Прямоугольник/Треугольник/Круг)');
READ(letter);
WHILE (letter<>'Z') AND (letter<>'z')
DO
BEGIN
IF (letter='П') OR (letter='п')
THEN
BEGIN
READ(b,d);
area:= b*d
END
ELSE IF (letter='Т') OR (letter='т')
THEN
BEGIN
READ(a,b,c);
s:= 0.5*(a+b+c);
area:= SQRT(s*(s-a)*(s-b)*(s-c))
END
ELSE IF (letter='К') OR (letter='к')
THEN
BEGIN
READ(d);
area:= pi*sqr(d)/4
END
ELSE ok:= FALSE;
IF ok THEN
BEGIN
WRITELN('Площадь равна',area:8:2);
WRITELN('Выберите еще фигуру (или введите "Z", чтобы выйти)');
READ(letter);
WRITELN
END
ELSE
BEGIN
WRITELN('Должно быть П, Т или К. Попробуйте выбрать еще раз.');
WRITELN('Или введите "Z", чтобы выйти');
READ(letter);
WRITELN
END
END
END.
Попытка протестировать последовательно все типы фигур
При первом заходе расчет площади треугольника работает
При первом заходе расчет площади круга работает
Как можно видеть программа успешно выполняет первый расчет, после чего без каких-либо запросов прогоняет дважды тело составного оператора последнего ELSE. Потом что-то запрашивает, но тип фигуры не опознает и понимает только "Z".
Использую компилятор Free Pascal и в качестве среды разработки - Geany.
Наверное, стоит отметить, что ни о вызове подпрограмм, ни об использовании модулей при модификации исходной программы, речи не идет - о таких возможностях автор еще не говорил. С особенностью видимости переменных еще тоже не разбиралась. В общем-то и синтаксис языка - предмет лишь следующей главы. Пока в книге разбирались только элементы языка (или синтаксиса, не знаю как правильно сказать). То есть для решения задачи пока имеются только разные виды циклов и проверка условий.
Прошу прощения, если спрашиваю какие-то примитивные вещи. Я ни разу не программист. Когда-то очень давно в школе Бейсик изучали, да и то в памяти - только общие впечатления. Причем, если, глядя на содержание книжки Алкока по Паскалю я понимаю, что там рассматриваются и какие-то базовые понятия программирования, то в школе изучали только, пожалуй сам язык - на самом примитивном уровне. Говорить о том, что это было изучением программирования - не приходится... Может, только самых азов...
Помогите, пожалуйста, новичку разобраться, что происходит в модифицированной программе. - Может, какие-то соображения, предположения, в чём может быть проблема...