Была бы очень признательна, если кто-то поможет разобраться.
Недавно начала изучать Паскаль по книжке Доналда Алкока "Язык Паскаль в иллюстрациях" и споткнулась на задании 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.
Попытка протестировать последовательно все типы фигур
![Изображение](https://sun9-33.userapi.com/impg/SDm5_Ia6watKPEJ9kvCfhlW5IMlyLbn9OqjVRA/o_M7KLY747Y.jpg?size=540x849&quality=95&sign=bbbaf294e184805cba61469d3be8a8d4&type=album)
При первом заходе расчет площади треугольника работает
![Изображение](https://sun9-66.userapi.com/impg/jwXPWC5PO-auimk4jZIEsyI7obnBlFb5vNbmJA/qMv3nx_mGO0.jpg?size=522x420&quality=95&sign=0b8363d41e011cdb77a41ef482c31e2c&type=album)
При первом заходе расчет площади круга работает
![Изображение](https://sun9-48.userapi.com/impg/sj1MikTpwC_FnhQdUaEIOWp-RVjUTK2gQP_Gog/cegxRWUeW88.jpg?size=532x424&quality=95&sign=865c75d4aad5598459073e36280dcdfd&type=album)
Как можно видеть программа успешно выполняет первый расчет, после чего без каких-либо запросов прогоняет дважды тело составного оператора последнего ELSE. Потом что-то запрашивает, но тип фигуры не опознает и понимает только "Z".
Использую компилятор Free Pascal и в качестве среды разработки - Geany.
Наверное, стоит отметить, что ни о вызове подпрограмм, ни об использовании модулей при модификации исходной программы, речи не идет - о таких возможностях автор еще не говорил. С особенностью видимости переменных еще тоже не разбиралась. В общем-то и синтаксис языка - предмет лишь следующей главы. Пока в книге разбирались только элементы языка (или синтаксиса, не знаю как правильно сказать). То есть для решения задачи пока имеются только разные виды циклов и проверка условий.
Прошу прощения, если спрашиваю какие-то примитивные вещи. Я ни разу не программист. Когда-то очень давно в школе Бейсик изучали, да и то в памяти - только общие впечатления. Причем, если, глядя на содержание книжки Алкока по Паскалю я понимаю, что там рассматриваются и какие-то базовые понятия программирования, то в школе изучали только, пожалуй сам язык - на самом примитивном уровне. Говорить о том, что это было изучением программирования - не приходится... Может, только самых азов...
Помогите, пожалуйста, новичку разобраться, что происходит в модифицированной программе. - Может, какие-то соображения, предположения, в чём может быть проблема...