Как исправить ошибку в pascal abc

Добавил:

Upload

Опубликованный материал нарушает ваши авторские права? Сообщите нам.

Вуз:

Предмет:

Файл:

Pascal.doc

Скачиваний:

26

Добавлен:

12.03.2016

Размер:

3.29 Mб

Скачать

Сообщения
об ошибках.
Ошибки в
программах делятся на те, которые
Паскаль замечает, и на те, что не замечает
и в принципе заметить не может. К первым
относятся все синтаксические погрешности,
например,BIGINвместоBEGIN.
Их Паскаль замечает еще на стадии
компиляции. На стадии выполнения он
замечает такие ошибки, какSqrt(-25),
то есть квадратный корень из ‑25. Но
вот, если вы, желая возвести числоa
в куб, вместоa*a*aпишетеa*a,
то этого не заметит ни один язык в мире.

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

Обнаружив ошибку
на стадии выполнения, Паскаль выдает
белыми буквами на черном фоне окна
пользователя сообщение Runtime
error
и иногда золотыми буквами
на красном фоне краткое описание ошибки
и ставит курсор в то место программы,
где, по его мнению, она находится.

Вот наиболее
типичные для начинающих сообщения об
ошибках того и другого рода:

Сообщение

Перевод

Вероятная
причина ошибки

Unexpected end of file

Неожиданный
конец файла

Вы забыли
поставить точку после последнего
END.
Или не совпадает количествоbeginи количествоend

“;” expected

Ждал точку с
запятой

Вы забыли
поставить точку с запятой после
предыдущего оператора

“,” expected

Ждал запятую

Вы указали
слишком мало параметров в обращении
к подпрограмме

“)” expected

Ждал скобку “)”

Вы указали
слишком много параметров в обращении
к подпрограмме

Unknown identifier

Неизвестное
имя

Вы забыли описать
это имя в разделе описаний

Неправильно
записали стандартное имя, например,
ReedLnвместоReadLn

Type mismatch

Несовпадение
типов

В вашей программе
встречаются примерно такие «сладкие
парочки»: VAR c:String; … c:=1+2илиVAR
h:Integer; … h:=9/7

Duplicate identifier

Дубль имени

Одно и то же имя
описано два раза. Например,
VAR a, c, a :String;

Syntax error

Синтаксическая
ошибка

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

BEGIN
expected

Ждал BEGIN

Возможно, не
совпадает количество beginи количествоend

END
expected

Ждал
END

Возможно, не
совпадает количество beginи количествоend

String
constant exeeds line

Строковая
константа превышает допустимую длину

Вы забыли закрыть
кавычки в строковой константе

Line too long

Строчка слишком
длинна

Слишком длинная
строчка в программе (не путать со
строковой константой, которую нужно
брать в кавычки). Не рекомендую
залезать программным текстом за
правый край экрана

Disk full

Диск заполнен

На вашем диске
не осталось места. Надо что-то стереть

Lower bound greater than
upper bound

Нижняя граница
диапазона больше верхней

Например, вы
вместо array[2..5]написалиarray[5..2].

Invalid floating point
operation

Неправильная
операция с вещественным результатом

Sqrt(-25)илиa/0или что-нибудь в этом роде

Ordinal expression
expected

Ждал выражение
порядкового типа

Например, вы
вместо for
i:=1
to
8
написали
for
i:=1
to
8.5

Error in expression

Ошибка в выражении

Например, вы
вместо k:=а*8написалиk:=а**8

Range check error

Ошибка проверки
диапазона

Переменная
в процессе выполнения программы
вышла за пределы допустимого диапазона,
как например, в 1.9

Constant out of range

Константа не в
диапазоне

Величина
константы в программе превосходит
допустимый диапазон

Invalid numeric format

Неправильный
числовой формат

Если, например,
вы по оператору ReadLn(k)в программеVAR
k:Integer; …. ReadLn(k) …
пытаетесь
ввести число 25.3

Более подробное
описание некоторых ошибок вы найдете
в 0.3.

Понять смысл
многих других сообщений об ошибках вам
поможет перевод некоторых часто
встречающихся в сообщениях слов:

expected
ждал

identifier
имя

invalid
неправильный

operation операция

error
ошибка

variable переменная

Невозможно создать
компилятор, который бы всегда точно
находил место и причину ошибки. Поэтому
приготовьтесь к тому, что некоторые
сообщения вы будете долго разглядывать
в недоумении. Считайте их не реальными
ошибками, а намеками на реальные ошибки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

FunduxYura

1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

1

14.09.2012, 09:10. Показов 10635. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Помогите! Не могу завершить прогу на Pascal ABC (да-да, тот самый). Делаю что-то вроде клавиатурного тренажёра…

Код Паскаля АВС

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
uses Timers,Events;
var tickers: real;
 
function GiveErrorBad(lolikon:Boolean):boolean;
begin
writeLn('-----------------');
writeLn('Íåñîâïàäåíèå ñ òåêñòîì! Âîçìîæíûå ïðè÷èíû:');
writeLn(' - Åñòü ãðàììàòè÷åñêèå, ïóíêòóàöèîííûå îøèáêè (òîãäà âàø IQ íå âûøå êàìíÿ, èáî òåêñò áûë ïîä ãëàçàìè...)');
writeLn(' - Åñòü ëèøíèå ïðîáåëû (ñ êåì íå áûâàåò...)');
writeLn(' - Áûëà ïîïûòêà ïîñòàâèòü àáçàö. Ýòî íå àâòîð íåãðàìîòíûé, ýòî îñîáåííîñòü Pascal ABC...');
writeLn(' - Âû íå ââîäèëè íè÷åãî, èëè ââîäèëè, íî ñîâñåì íå òî');
writeLn('Çàêðîéòå ïðîãðàììó è íà÷èíàéòå ñíà÷àëà... :(');
readLn();
end;
 
procedure f;
begin
tickers:=tickers+0.5
end;
 
var t: Timer;
 
const
  tekst='не волнует';
var
 whaticrar:Text;
 
begin
  writeLn('Ââåäè òåêñò áåç îøèáîê!');
  writeLn('Òåêñò íàõîäèòñÿ â ðàñïå÷àòàííîì âèäå ïîä âàøèì íîñîì...');
  writeLn('Ïîåõàëè? Íàæìè Enter');
  readLn();
  writeLn('Âðåìÿ ïîøëî!');
  writeLn('--------------');
  t:=Timer.Create(500,f);
  readLn(whaticrar);
  t.Stop();
  
if whaticrar=tekst then
  writeLn('-----------------');
  writeLn('Âû ïðîøëè òåñò!');
  writeLn('------------------');
  writeLn('Âðåìÿ ïðîõîæäåíèÿ:');
  writeLn(tickers + ' ñåêóíä');
else GiveErrorBad();
end.

Те символы-кракозябры — результат копирования Win1251 в UTF-8 форму, которые пропали на предварительном просмотре
Компилятор PABC.NET(решил прогнать код через него) ругается:

Код

Program1.pas(46,1): Ожидался оператор

Помогите, пожалуйста!



0



4 / 4 / 2

Регистрация: 27.07.2012

Сообщений: 59

14.09.2012, 09:20

2

Поставь ; после закрытой скобки.



0



1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

14.09.2012, 10:09

 [ТС]

3

Цитата
Сообщение от vi fail
Посмотреть сообщение

Поставь ; после закрытой скобки.

Строчку в исправленном виде покажи, а то я тебя не понял



0



vi fail

4 / 4 / 2

Регистрация: 27.07.2012

Сообщений: 59

14.09.2012, 10:44

4

Pascal
1
Program1.pas(46,1);



0



Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,546

Записей в блоге: 1

14.09.2012, 13:03

5

FunduxYura, до else убери ;



0



FunduxYura

1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

14.09.2012, 15:19

 [ТС]

6

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, до else убери ;

Убрал, теперь этот кусок выглядит так:

Pascal
1
2
3
4
5
6
7
8
if whaticrar=tekst then
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд')
else GiveErrorBad()
end.

Ошибка та же — 1 символ, строка 45, ожидается ;

Добавлено через 5 минут

Цитата
Сообщение от vi fail
Посмотреть сообщение

Pascal
1
Program1.pas(46,1);

Это сама ошибка, так что — nice joke



0



CodeR

Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,546

Записей в блоге: 1

14.09.2012, 15:19

7

FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End

Pascal
1
2
3
4
5
6
7
8
9
10
if whaticrar=tekst then
 Begin
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд');
 End
else GiveErrorBad()
end.



0



FunduxYura

1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

14.09.2012, 15:27

 [ТС]

8

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End

Ой, совсем забыл про них, я просто раньше кодил на AS, JS, VB .NET, а с паскалем впервые встретился, вот и тупанул…

Но теперь ругается на

Pascal
1
2
3
4
5
6
7
8
9
10
if whaticrar=tekst then
begin
  writeLn('-----------------');
  writeLn('Вы прошли тест!');
  writeLn('------------------');
  writeLn('Время прохождения:');
  writeLn(tickers + ' секунд');
end;
else GiveErrorBad();
end.

Говорит, что ожидался оператор, но ругань идёт в самое начало строчки с else…

Код функции, которая не должна ничего возвращать, и нужна для удобства

Pascal
1
2
3
4
5
6
7
8
9
10
11
function GiveErrorBad(lolikon:Boolean):boolean;
begin
writeLn('-----------------');
writeLn('Несовпадение с текстом! Возможные причины:');
writeLn(' - Есть грамматические, пунктуационные ошибки (тогда ваш IQ не выше камня, ибо текст был под глазами...)');
writeLn(' - Есть лишние пробелы (с кем не бывает...)');
writeLn(' - Была попытка поставить абзац. Это не автор неграмотный, это особенность Pascal ABC...');
writeLn(' - Вы не вводили ничего, или вводили, но совсем не то');
writeLn('Закройте программу и начинайте сначала... :(');
readLn();
end;



0



Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,546

Записей в блоге: 1

14.09.2012, 15:29

9

FunduxYura, ты посмотри на мой код а теперь на свой…



0



FunduxYura

1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

14.09.2012, 15:42

 [ТС]

10

Цитата
Сообщение от Artem7
Посмотреть сообщение

FunduxYura, ты посмотри на мой код а теперь на свой…

Спасибо, просто я уже жестоко туплю, теперь у меня ещё одна проблема…

Не по теме:

Я безнадёжен, да?

Pascal
1
2
3
if whaticrar=tekst then
 Begin
  writeLn('-----------------');

говорит, что = нельзя юзать с Text и string, но как мне ещё сравнивать?



0



Фрилансер

3417 / 2814 / 3000

Регистрация: 08.02.2012

Сообщений: 8,546

Записей в блоге: 1

14.09.2012, 16:03

11

FunduxYura, так потому что ты пытаешься переменную типа текстовый файл сравнить с типом string а чтобы понять как сравнивать надо понимать что ты хочешь сделать в проге…



0



1 / 1 / 0

Регистрация: 31.07.2012

Сообщений: 32

21.09.2012, 17:47

 [ТС]

12

Хм… Я решил проблему, но почему-то код работает ПОЛНОСТЬЮ только на PascalABC не .NET… В NET версии таймер не считает ничего…



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.09.2012, 17:47

Помогаю со студенческими работами здесь

Ошибка в строке 97: «incompatible types», а в 99 ошибка: «identifier expected but ‘^’ found», как исправить?
var
tmp,tmp1,tmp2:point;
begin
tmp:=head;
while tmp <> nil do
begin
tmp1:=…

Вывести нечётные числа. Ошибка: оператор «%» невозможно применить к операнду типа «string» и «int»
Я новичок в программировании, поэтому не судите строго если тут всё говно. Нужно сделать, чтобы код…

Поиск в массиве. Ошибка «Оператор «&&» не может применяться к операндам типа «bool» и «double»»
Найти номер последнего минимального элемента среди положительных четных элементов, лежащих правее…

Ошибка в коде «Ожидался оператор»
Program gKKMMf;
var b,s,x,h:real;
begin
repeat
Write(‘Vvedite konez otrezka b’);
Read(b);…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

12

PascalABC.NET как исправить ошибку?

    uses Arrays;
var 
  a: array of integer;
  N: integer;
  i1,i2:integer;
begin
  N := 50;
  a := CreateRandomIntegerArray(50);
  for var i:=1 to N do begin
    if a[i]>0 then
    i1+=1;
    if a[i]<0 then
    i2+=1;
   end;
write(i1);
write(i2);
end.

задан 6 дек 2017 в 6:19

Ярослав's user avatar

Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin должен выглядеть хотя бы так for var i:=0 to N-1 do begin

А вообще стоит оперировать такими функциями работы с массивами, как length, High и т.п.

ответ дан 6 дек 2017 в 6:27

Viktor Tomilov's user avatar

Viktor TomilovViktor Tomilov

8,0174 золотых знака24 серебряных знака61 бронзовый знак

Автор материалов — Лада Борисовна Есакова.
Самая распространенная ошибка, которую нужно найти и исправить – это неправильное использование вложенных условных операторов. Для усложнения поиска возможно неправильное форматирование текста (неправильно поставленные отступы).

Для того, чтобы найти ошибку, нужно поставить в соответствие друг другу все части условного оператора if и else.

Помним, что часть else относится к ближайшему if. При этом наличие части else не обязательно.

Кроме того, часто присутствует ошибка при вводе или выводе. Обязательно нужно проверить, та ли информация выводится на экран.

Особого внимания требует инициализация переменных.

Формат книги не позволяет рассмотреть все основные типы задач 2 части, рассмотрим лишь те, которые встречались на проверочных и экзаменационных работах последних двух лет.

Пример 1.

На об­ра­бот­ку по­сту­па­ет по­ло­жи­тель­ное целое число, не пре­вы­ша­ю­щее 109. Нужно на­пи­сать про­грам­му, ко­то­рая вы­во­дит на экран сумму цифр этого числа, мень­ших 7. Если в числе нет цифр, мень­ших 7, тре­бу­ет­ся на экран вы­ве­сти 0. Про­грам­мист на­пи­сал про­грам­му не­пра­виль­но. Ниже эта про­грам­ма для Ва­ше­го удоб­ства при­ве­де­на на пяти язы­ках про­грам­ми­ро­ва­ния.

 Бей­сик

Python

DIM N, DIGIT, SUM AS LONG

INPUT N

SUM = 0

WHILE N > 0

DIGIT = N MOD 10

IF DIGIT < 7 THEN

SUM = SUM + 1

END IF

N = N 10

WEND

PRINT DIGIT

N = int(input())

sum = 0

while N > 0:

digit = N % 10

if digit < 7:

sum = sum + 1

N = N // 10

print(digit)

Пас­каль

Ал­го­рит­ми­че­ский язык

var N, digit, sum: longint;

begin

readln(N);

sum := 0;

while N > 0 do

begin

digit := N mod 10;

if digit < 7 then

sum := sum + 1;

N := N div 10;

end;

writeln(digit)

end.

алг

нач

цел N, digit, sum

ввод N

sum := 0

нц пока N > 0

digit := mod(N,10)

если digit < 7 то

sum := sum + 1

все

N := div(N,10)

кц

вывод digit

кон

Си

#include

int main()

{

int N, digit, sum;

scanf(«%d», &N);

sum = 0;

while (N > 0)

{

digit = N % 10;

if (digit < 7)

sum = sum + 1;

N = N / 10;

}

printf(«%d»,digit);

return0;

}

По­сле­до­ва­тель­но вы­пол­ни­те сле­ду­ю­щее.

1. На­пи­ши­те, что вы­ве­дет эта про­грам­ма при вводе числа 456.

2. При­ве­ди­те при­мер та­ко­го трёхзнач­но­го числа, при вводе ко­то­ро­го про­грам­ма выдаёт вер­ный ответ.

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

1) вы­пи­ши­те стро­ку, в ко­то­рой сде­ла­на ошиб­ка;

2) ука­жи­те, как ис­пра­вить ошиб­ку, т.е. при­ве­ди­те пра­виль­ный ва­ри­ант стро­ки.

До­ста­точ­но ука­зать ошиб­ки и спо­соб их ис­прав­ле­ния для од­но­го языка про­грам­ми­ро­ва­ния. Об­ра­ти­те вни­ма­ние, что тре­бу­ет­ся найти ошиб­ки в име­ю­щей­ся про­грам­ме, а не на­пи­сать свою, воз­мож­но, ис­поль­зу­ю­щую дру­гой ал­го­ритм ре­ше­ния. Ис­прав­ле­ние ошиб­ки долж­но за­тра­ги­вать толь­ко стро­ку, в ко­то­рой на­хо­дит­ся ошиб­ка.

Решение:

Ре­ше­ние ис­поль­зу­ет за­пись про­грам­мы на Пас­ка­ле. До­пус­ка­ет­ся ис­поль­зо­ва­ние про­грам­мы на любом из четырёх дру­гих язы­ков.

1. Про­грам­ма вы­ве­дет число 4.

2. При­мер числа, при вводе ко­то­ро­го про­грам­ма выдаёт вер­ный ответ: 835.

Про­грам­ма ра­бо­та­ет не­пра­виль­но из-за не­вер­ной вы­во­ди­мой на экран пе­ре­мен­ной и не­вер­но­го уве­ли­че­ния суммы. Со­от­вет­ствен­но, про­грам­ма будет ра­бо­тать верно, если в числе стар­шая цифра (край­няя левая) равна сумме цифр, мень­ших 7.

3. В про­грам­ме есть две ошиб­ки.

Пер­вая ошиб­ка. Не­вер­ное уве­ли­че­ние суммы.

Стро­ка с ошиб­кой:

sum := sum + 1;

Вер­ное ис­прав­ле­ние:

sum := sum + digit;

Вто­рая ошиб­ка. Не­вер­ный вывод от­ве­та на экран.

Стро­ка с ошиб­кой:

writeln(digit)

Вер­ное ис­прав­ле­ние:

writeln(sum)

Пример 2.

Для за­дан­но­го по­ло­жи­тель­но­го ве­ще­ствен­но­го числа A не­об­хо­ди­мо найти мак­си­маль­ное целое число K, при ко­то­ром вы­пол­ня­ет­ся не­ра­вен­ство

(при K = 0 сумма счи­та­ет­ся рав­ной 0).

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

 Бей­сик

Python

DIM A, S AS DOUBLE

DIM K AS INTEGER

INPUT A

K = 1

S = 1

WHILE S < A

S = S + 1.0/K

K = K + 1

WEND

PRINT K

END

a = float(input())

k = 1

s = 1

while s < a:

s = s + 1.0/k

k = k + 1

print(k)

Ал­го­рит­ми­че­ский язык

Пас­каль

алг

нач

вещ a, s

цел k

ввод a

k := 1

s := 1

нц пока s<a

s := s + 1.0/k

k := k + 1

кц

вывод k

кон

var a, s: real;

k: integer;

begin

read(a);

k := 1;

s := 1;

while s<a do begin

s := s + 1.0/k;

k := k + 1;

end;

write(k);

end.

Си

#include <stdio.h>

int main(){

double a, s;

int k;

scanf(«%lf»,&a);

k = 1;

s = 1;

while (s<a) {

s = s + 1.0/k;

k = k + 1;

}

printf(«%d», k);

return 0;

}

По­сле­до­ва­тель­но вы­пол­ни­те сле­ду­ю­щее.

1. На­пи­ши­те, что вы­ве­дет эта про­грам­ма при вводе числа 1.2.

2. При­ве­ди­те при­мер числа, при вводе ко­то­ро­го про­грам­ма даст вер­ный ответ.

3. Най­ди­те в про­грам­ме все ошиб­ки (их может быть одна или не­сколь­ко).

Для каж­дой ошиб­ки вы­пи­ши­те стро­ку, в ко­то­рой она до­пу­ще­на, и при­ве­ди­те эту же стро­ку в ис­прав­лен­ном виде.

Об­ра­ти­те вни­ма­ние: вам нужно ис­пра­вить при­ведённую про­грам­му, а не на­пи­сать свою. Вы мо­же­те толь­ко ис­прав­лять оши­боч­ные стро­ки; уда­лять стро­ки или до­бав­лять новые стро­ки нель­зя. По­ста­рай­тесь также не вне­сти новые ошиб­ки – за это оцен­ка сни­жа­ет­ся.

Решение:

Ре­ше­ние ис­поль­зу­ет за­пись про­грам­мы на Пас­ка­ле. До­пус­ка­ет­ся ис­поль­зо­ва­ние про­грам­мы на дру­гих язы­ках.

1. При вводе числа 1.2 про­грам­ма вы­ве­дет число 2.

2. При­ме­ры чисел, при вводе ко­то­рых про­грам­ма вы­во­дит вер­ный ответ: 1.6, 2.05.

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

В не­ко­то­рых слу­ча­ях эти ошиб­ки ком­пен­си­ру­ют друг друга, и ответ ока­зы­ва­ет­ся пра­виль­ным. Это про­ис­хо­дит, если зна­че­ние A по­па­да­ет в один из сле­ду­ю­щих диа­па­зо­нов: 1.5 < A < 1.83, 2 < A < 2.08.

3. Про­грам­ма со­дер­жит две ошиб­ки.

1) Не­вер­ная ини­ци­а­ли­за­ция. На­чаль­ное зна­че­ние S долж­но быть равно нулю.

В при­ведённом ва­ри­ан­те вы­чис­лен­ная сумма ока­зы­ва­ет­ся на 1 боль­ше пра­виль­но­го зна­че­ния.

Стро­ка с ошиб­кой:

s := 1;

Пра­виль­ная стро­ка:

s := 0;

2) Не­вер­ное опре­де­ле­ние от­ве­та. При­ведённая про­грам­ма на­хо­дит не мак­си­маль­ное K, при ко­то­ром вы­пол­ня­ет­ся не­ра­вен­ство, а ми­ни­маль­ное, при ко­то­ром оно не вы­пол­ня­ет­ся, то есть уве­ли­чи­ва­ет вер­ное зна­че­ние на 1.

Кроме того, ис­поль­зо­ван­ный по­ря­док дей­ствий в цикле (уве­ли­че­ние K после уве­ли­че­ния S) при­во­дит к уве­ли­че­нию ещё на 1. Это можно было бы ис­пра­вить, из­ме­нив по­ря­док дей­ствий в цикле и умень­шив K после за­вер­ше­ния цикла, но эти дей­ствия не раз­ре­ше­ны по усло­вию за­да­чи.

По­это­му для ис­прав­ле­ния ошиб­ки можно про­сто скор­рек­ти­ро­вать зна­че­ние при вы­во­де.

Стро­ка с ошиб­кой:

write(k);

Пра­виль­ная стро­ка:

write(k-2);

Благодарим за то, что пользуйтесь нашими статьями.
Информация на странице «Задача №24. Исправление ошибок в программе.» подготовлена нашими авторами специально, чтобы помочь вам в освоении предмета и подготовке к ЕГЭ и ОГЭ.
Чтобы успешно сдать нужные и поступить в высшее учебное заведение или техникум нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
Также вы можете воспользоваться другими материалами из данного раздела.

Публикация обновлена:
08.05.2023

Глава III. Дополнительные сведения к пройденному.

Мы немало изучили, написали достаточно серьёзные программы, однако «предела совершенству не существует». Материал в предыдущих параграфах давался порциями, которые может воспринять неподготовленный человек. Для того что бы двигаться дальше, нам необходимо узнать дополнительные нюансы к уже пройденному материалу.

§14. Сведения по различным темам.

Цикл For downto do.

Мы уже знакомы с циклом For to do. В этом цикле переменная счётчик, при каждом прохождении цикла, увеличивается на единицу, пока не достигнет определённого значения. Так же в языке Pascal есть цикл For down to, в котором переменная-счётчик уменьшается на единицу, при каждом проходе цикла. Принципы использования данного цикла такие же, разница лишь в том, что переменная-счётчик уменьшается, а не увеличивается. Пример:

var i:integer;

begin

  For i:=10 downto 0 do

   write(i:3);

end.

_________________________________

10  9  8  7  6  5  4  3  2  1  0

Процедуры Halt и Sleep.

procedure Halt; завершает работу программы. Пример:

var c:char;

begin

  while true do

    begin

     writeln(‘Для завершения работы программы введите 1’);

     readln(c);

     if c=‘1’ then halt;

     writeln(‘Программа продолжила работу.’);

    end;

end.

___________________________________________________________

Для завершения работы программы введите 1

4

Программа продолжила работу.

Для завершения работы программы введите 1

w

Программа продолжила работу.

Для завершения работы программы введите 1

e

Программа продолжила работу.

Для завершения работы программы введите 1

1

В параграфе, где мы изучали циклы, непрерывная работа программы была реализована с помощью цикла While to do, в условии мы проверяли значение переменной c. После выхода из цикла программа завершалась автоматически, т.к. далее не было больше ни строчки кода. Непрерывную работу программы можно организовать и с помощью константы True. В таком случае мы никогда не сможем выйти из цикла While to do, т.к. эта константа никогда не изменится. Для завершения работы программы как раз можно использовать процедуру Halt. Вызвать её можно в любом месте программы, где вам удобно.

procedure Sleep(ms: integer); делает паузу на ms миллисекунд. Одна миллисекунда это 0.001 секунда. Поэтому, что бы сделать паузу на одну секунду, необходима пауза в 1000 миллисекунд. Пример:

var i:integer;

begin

  For i:=10 downto 0 do

   begin

    if i=0 then write(‘  Пуск!’) else write(i:3);

    sleep(1000);

   end;

end.

___________________________________________________

10  9  8  7  6  5  4  3  2  1  Пуск!

В данном примере каждая новая цифра появляется через одну секунду, после появления предыдущей.

Математические функции.

function Abs(x: Real):Real; возвращает модуль числа x. x число любого типа, целого или вещественного. Тип возвращаемого значения такой же как и у переменной x.

function Round(x: real): integer; возвращает x, округленное до ближайшего целого.

function Int(x: real): real; возвращает целую часть числа x.

function Frac(x: real): real; возвращает дробную часть числа x.

Pi возвращает значение Пи с точностью числа типа real. Примечание: в TurboPascal Pi функция, которая вызывается без передаваемых параметров. В PascalABC.NET Pi именованная константа. Однако синтаксис от этого не меняется. Там и там достаточно написать просто слово Pi.

function Sqr(x: real): real; возвращает квадрат числа x. Другими словами возводит в квадрат или как принято записывать в математике .

function Sqrt(x: real): real; возвращает квадратный корень числа x ().

function Power(x,y: real): real; возвращает x в степени y.

function Exp(x: real): real; возвращает экспоненту числа x ().

function Ln(x: real): real; возвращает натуральный логарифм числа x ().

Пример использования математических функций:

var x:real;

begin

  x:=-3.56;

  writeln(‘x = ‘,x);

  writeln(‘abs(x) = ‘,abs(x));

  writeln(’round(x) = ‘,round(x));

  writeln(‘int(x) = ‘,int(x));

  writeln(‘frac(x) = ‘,frac(x));

  writeln(‘Pi = ‘,Pi);

  writeln(‘sqr(6) = ‘,sqr(6));

  writeln(‘sqrt(36) = ‘,sqrt(36));

  writeln(‘Power(27,1/3) = ‘,Power(27,1/3));

  writeln(‘exp(1) = ‘,exp(1));

  writeln(‘ln(2.718) = ‘,ln(2.718));

end.

__________________________________

x = -3.56

abs(x) = 3.56

round(x) = -4

int(x) = -3

frac(x) = -0.56

Pi = 3.14159265358979

sqr(6) = 36

sqrt(36) = 6

Power(27,1/3) = 3

exp(1) = 2.71828182845905

ln(2.718) = 0.999896315728952

Тригонометрические функции.

function Cos(x: real): real; возвращает косинус числа x ().

function Sin(x: real): real; возвращает синус числа x ().

function ArcTan(x: real): real; возвращает арктангенс числа x ().

Во всех тригонометрических функциях угол x должен быть выражен в радианах.

Пример:

begin

  writeln(‘cos(Pi/2) = ‘,cos(pi/2):4:3);

  writeln(‘sin(Pi/2) = ‘,sin(pi/2):4:3);

  writeln(‘arctan(1) = ‘,arctan(1):4:3);

end.

________________________________________

cos(Pi/2) = 0.000

sin(Pi/2) = 1.000

arctan(1) = 0.785

Все вышеприведенные дополнительные процедуры и функции можно использовать как в TurboPascal, так и в PascalABC.NET. Плюс к этим математическим и тригонометрическим функциям в PascalABC.NET есть и другие, с которыми вы можете ознакомиться в разделе справки: «Справочник по языку->Системные процедуры, процедуры, функции, типы и константы->Математические процедуры и функции».

Для тех, кто обучается в TurboPascal, следует написать следующее: в TurboPascal нет функции возведения в степень, можно возвести только в квадрат. Так же нельзя извлечь ни квадратный корень, ни какой-либо другой. Так же нет функции арксинуса, арккосинуса, тангенса и котангенса. Однако все это можно сделать, используя эти функции, немного поразмыслив мозгами.

Далее будет приведена методика разработки своих, вышеперечисленных недостающих в TurboPascal функций. В конце параграфа в задачах для самостоятельного решения будет предложено написать код этих подпрограмм.

Возведение в степень. Допустим необходимо возвести число с в степень х, после чего должно получиться число b (). Это же число можно получить, если возвести число в степень y (). x и y можно представить через логарифм: ; . Из свойства логарифмов можно получить следующее равенство: . Из всего вышесказанного получаем, что . Код программы будет выглядеть следующим образом:

var x,b,c:real;

begin

  x:=2;c:=4;

  b:=exp(x*ln(c));

  writeln(c,‘ в степени ‘,x,‘ равно ‘,b);

end.

_________________________________________

4 в степени 2 равно 16

Извлечение корня. Известно, что квадратный корень это не что иное, как степень . Соответственно, что бы извлечь кубический корень, необходимо возвести в степень равную . И так далее. Пример:

var x,b,c:real;

begin

  x:=1/3;c:=27;

  b:=exp(x*ln(c));

  writeln(c,‘ в степени ‘,x,‘ равно ‘,b);

end

_________________________________________

27 в степени 0.333333333333333 равно 3

Тригонометрические функции. Тангенс и котангенс находятся из следующих выражений: ; .

Арксинус, арккосинус, арктангенс и арккотангенс это сам угол, т.е. его можно найти с помощью функции arctan. Для этого достаточно перевести синус и косинус в тангенс. Если известен только синус или только косинус, то используется следующая тригонометрическая формула: Отсюда

Получаем: ; ; .

Думаю, что вам не составит труда перевести данные формулы в код.

Создание переменных в теле программы.

До сих пор мы объявляли переменные в разделе описания переменных. При таком подходе переменная создаётся в начале работы программы и существует, пока программа не завершит свою работу. Если переменная создана в разделе описания переменных в подпрограмме, то переменная будет существовать, пока работает подпрограмма. Такой принцип действует в старом TurboPascal.

В других языках, например в C++, переменная создаётся прямо в теле программы, а затем, когда она уже будет не нужна, её можно уничтожить. При таком подходе переменная не будет занимать место в памяти компьютера на протяжении работы всей программы. Соответственно, ресурсы компьютера будут использоваться более рационально.

Так как язык PascalABC.NET был создан для обучения, и ориентирован на программирования на платформе .NET, то эту возможность ввели и в него.

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

begin

  var s:string;

  s:=‘Привет всем!’;

  Writeln(s);

end.

_____________________

Привет всем!

Такая переменная, созданная в теле программы, существует в том блоке кода, который заключён словами begin и end. После выхода из блока переменная уничтожается. В следующем примере переменную iTemp, созданную внутри цикла, нельзя использовать вне цикла:

Var i:integer;

begin

  For i:=1 to 5 do

    begin

      var iTemp:integer;

      iTemp:=i+5;

      write(iTemp,‘  ‘);

    end;

//Следующая строка приведёт к ошибке «Неизвестное имя ‘iTemp’»

//writeln(iTemp); 

end.

_______________________________________________________________

6  7  8  9  10 

Так же в цикле for to do переменную счётчик можно объявить после слова for. При этом после завершении цикла данная переменная будет уничтожена.

begin

  For var i:=1 to 5 do

    begin

      write(i,‘  ‘);

    end;

//Следующая строка приведёт к ошибке «Неизвестное имя ‘i’»

//writeln(i); 

end.

Ещё одно замечание: если вы создали переменную в разделе описания переменных, то вы не можете создать переменную в  теле программы с таким же именем. То же самое относится и к телу подпрограммы. Говоря другими словами, у каждого блока может быть раздел описания переменных, при этом если там уже есть переменная с определённым именем, то вы не можете создать внутри этого блока переменную с таким же именем. Пример:

Var s:string;

begin

  s:=‘Я — глобальная переменная’;

//var s:string; — ошибка.

end.

Ещё раз повторюсь, создавать переменную в теле программы или подпрограммы можно в PascalABC.NET. В TurboPascal создавать переменные внутри блока нельзя, только в разделе описания переменных.

Идентификаторы.

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

В любом языке программирования есть зарезервированные слова, которые имеют определённое назначение и которые нельзя использовать в качестве идентификаторов. Эти слова ещё называют ключевыми. Далее приведён список зарезервированных слов в PascalABC.NET:

and array as begin case class const constructor destructor div do downto else end event except file final finalization finally for foreach function goto if implementation in inherited initialization interface is label lock mod nil not of operator or procedure program property raise record repeat set shl shr sizeof template then to try type typeof until uses using var where while with xor

Любое другое сочетание латинских букв или цифр, начинающееся с буквы, считается идентификатором и может использоваться для имён переменных, констант или подпрограмм.

Символ «_» тоже можно использовать при составлении идентификатора, причём в данной ситуации он считается буквой. Т.е. с этого символа можно начать идентификатор, например: «_Number». Так же этим символом удобно пользоваться вместо пробела, если идентификатор состоит как бы из двух слов. Т.к. в идентификаторах нельзя использовать пробел, то можно эти слова разделить этим символом, например: imya_fayla.

Со многими зарезервированными словами вы уже знакомы, некоторые ещё предстоит узнать. Однако специально запоминать их нет необходимости. Если вы назовёте какую-либо переменную зарезервированным словом, то вероятнее всего при компиляции появится сообщение об ошибке, и вы измените название переменной (идентификатор). К тому же все зарезервированные слова автоматически выделяются жирным шрифтом.

Ещё два нюанса. Количество символов в идентификаторе может быть любым. И как было уже сказано, в языка Pascal регистр букв не имеет значение, т.е. если вы напишите в одной строчке Name, в другой name, то вы напишите один и тот же идентификатор.

Далее речь пойдёт о том, как нужно формировать идентификаторы.

Во время работы над программой, вы хорошо представляете себе назначение той или иной переменной, поэтому имя переменной особо не имеет значения. Однако, когда проходит время и вы смотрите на свою же собственную программу, то в ней ничего понятно не будет. Поэтому идентификаторы в программе должны быть осмысленными. Например, если вам необходимо в переменной хранить имя человека, то идентификатор должен быть, например, следующим: name_of_man. Если вы не знаете английский язык, то можно написать по-русски, но латинскими символами, например: Imya_cheloveka.

Написание русских слов буквами латинского алфавита называется транслитерацией. Существует множество их разновидностей. Существуют даже госты транслитерации для написания русских имён. Однако «в быту» они не очень удобны. Единственного всеобще-принятого правила транслитерации не существует. Тем не менее, думаю что любой, кто знает английский алфавит, может интуитивно написать любое русское слово латинскими буквами. В этом нет ничего сложного. Тем более, что в нашем случае нам необходимо, что бы нас понял наш товарищ по команде или мы сами, спустя какое-то время.

Плюс ко всему можно добавить, что если имя переменной состоит из двух слов, то их можно не только разделить знаком подчёркивания, но и написать их слитно, но с большой буквы каждое. Например: NameOfMan. Изначально способ с символом подчёркивания использовался в языке C, а второй способ с заглавными буквами в языке Pascal. Лично мне больше симпатичен первый способ с символом подчёркивания, т.к. слова в таком случае читаются отчётливей.

Ещё одно правило, неофициально принятое среди программистов. В цикле For to do для имени переменной счётчика используется буква i. Во всех предыдущих примерах так и было сделано. Если внутри этого цикла встретиться ещё цикл For to do, то для него используется буква j. Если внутри второго цикла будет снова находиться цикл For to do, то буква k. И так далее по алфавиту (i,j,k,l,m,n,o…). Например, имеем двумерный массив целых чисел, тогда программа формирования этого массива будет выглядеть следующим образом:

var m:array [1..10,1..5] of integer;

begin

  for var i:=1 to 10 do

    for var j:=1 to 5 do m[i,j]:=random(1,100);

end.

Венгерская нотация.

В этом подразделе поговорим о том, как формируются идентификаторы. В принципе, идентификатор может быть любым, компилятор не выдаст ошибки, какой бы идентификатор вы бы не придумали. Однако существуют определённые правила формирования идентификаторов, принятые среди программистов. Эти правила описаны в «Венгерской нотации».

Конечно, вы можете не придерживаться данным правилам. Однако если вы будете работать в команде, то понимать чужой код легче, если идентификаторы сформированы по определённым правилам. Т.е. в любом случае, в любой команде рано или поздно появятся определённые правила. Не легче ли сразу воспользоваться уже готовыми?

Венгерская нотация соглашение, принятое среди программистов, о правилах именования идентификаторов в коде программ. Эти правила предложил сотрудник компании Microsoft Чарльз Симони, в те далёкие времена, когда писались первые версии MS-DOS. В дальнейшем эти правила стали внутренним стандартом Microsoft. Родом Чарльз Симони был из Венгрии, отсюда и название нотации.

Суть нотации заключается в том, что при формировании идентификатора перед именем переменной ставится префикс. Префикс один или несколько символов, указывающие на тип переменной, или несущие определённый смысл. Далее в таблице приведу самые распространённые префиксы, которыми вы уже можете пользоваться. Более полный список вы можете найти в Википедии, или на каком-либо другом сайте, набрав в поисковике «Венгерская нотация».

Префиксы, обозначающие тип переменной:

Префикс

Сокращение от

Смысл

Пример

s, str

string

строка

sName

i

int

целочисленная переменная

iLevayaStorona

r

real

переменная вещественного типа

rOtnosheniye

l

long

длинное целое

lFactorial

b

boolean

булева переменная

bKnopka

a

array

массив

aSpisok

g_

global

глобальная переменная

g_aSpisok

Префиксы, обозначающие назначение переменных.

Префикс

Сокращение от

Смысл

Пример

i

index

Индекс

iIndex

d

delta

Разница между значениями

dAB

n

number

Число, количество чего либо

nFructi

c

counter

Счётчик

сNajatie

cur

current

Текущее значение

curKol

Инициализация переменных.

В одном из первых параграфов было сказано, что необходимо переменным присваивать начальные значения, инициализировать. Дело в том, что когда вы объявляете переменную, под неё выделяется определённая память в компьютере, если в этой памяти уже содержалась какая-то информация, то ваша переменная её «унаследует». В PascalABC.NET вновь созданным переменным автоматически присваивается начальное нулевое значение. Однако, если вы работаете в какой-либо другой среде разработки, и вы не уверенны, что начальные нулевые значения присваиваются автоматически, то присваивайте их вручную, иначе можете получить неверный результат.

В PascalABC.NET начальное значение переменной можно присвоить в разделе описания переменных. При этом тип переменной не указывается. Тип переменной определяется автоматически. Пример:

Var s:=‘Привет всем!’;

    i:=5;

begin

  writeln(s);

  writeln(5);

end.

_____________________

Привет всем!

5

Однако надо быть внимательным, т.к. присвоенный тип может не соответствовать тому, что нужно вам. Например, в данном примере переменной i был присвоен тип integer, а вам возможно нужен был тип LongInt.

Для того, что бы не произошло недорозумения инициализировать переменную в PascalABC.NET можно следующим образом:

  var i:LongInt:=5;

Если для обучения вы используете PascalABC.NET, то рекомендую указывать тип и начальное значение переменным именно таким образом.

В данном параграфе мы изучили цикл For downto do, процедуры Halt и Sleep, ряд готовых математических функций, а так же рассмотрели методику создания некоторых функций, которых нет в TurboPascal. Рассмотрели вопросы о возможности создания переменной в теле блока программы и об инициализации переменных при объявлении. Так же изучили вопрос об идентификаторах и Венгерской нотации.

Задачи.

1. Используя функции Fruc и Int, округлить вещественное число до сотых.

2. Имеем следующую функцию . Вывести на экран значения округлённые до целого значения, при равном 10,9,8.. 0. Для получения значений использовать цикл For downto do.

3. На основе функций ln и exp cоздать функцию, которая возвращает число, возведённое в степень. Первым параметром должно быть число, которое надо возвести, вторым параметром степень, в которую нужно возвести. Создать программу, демонстрирующую работу этой функции. Методика создания данной функции была приведена в данном параграфе.

4. Создать следующие тригонометрические функции на основе пройденных: tan, ctan, arcctan, arcsin, arccos. Привести пример их использования. Методика их создания была приведена в данном параграфе.

5. Придумать идентификаторы следующим переменным:

  • переменная для хранения временного значения целого числа;
  • переменная для хранения текущего значения температуры;
  • переменная для счёта количества нажатий.

Решение.

1.

var r:real;

begin

  r:=pi;

  writeln(‘До округления r=’,r);

  r:=int(r)+round(frac(r)*1000)/1000;

  writeln(‘После округления r=’,r);

end.

_____________________________________

До округления r=3.14159265358979

После округления r=3.142

2.

var i:integer;

    y:real;

begin

  writeln(‘  x     y’);

  for i:=10 downto 0 do

      writeln(i:3,round(2.34*i*i*i+4.1*i*i-3.2*i-3.6):6);

end.

_________________________________________________________

  x     y

10  2714

  9  2006

  8  1431

  7   978

  6   630

  5   375

  4   199

  3    87

  2    25

  1     0

  0    -4

3.

function stepen(r,x:real):real;

begin

  stepen:=exp(x*ln(r));

end;

begin

  writeln(’27 в степени 1/3 равно ‘,stepen(27,1/3));

end.

____________________________________________________

27 в степени 1/3 равно 3

4.

Program Trigonometriya;

function tan(r:real):real;

begin

  tan:=sin(r)/cos(r);

end;

function ctan(r:real):real;

begin

  ctan:=cos(r)/sin(r);

end;

function arcctan(r:real):real;

begin

  arcctan:=arctan(1/r);

end;

function arcsin(r:real):real;

begin

  arcsin:=arctan(r/sqrt(1-r*r));

end;

function arccos(r:real):real;

begin

  arccos:=arctan(sqrt(1-r*r)/r);

end;

begin

  writeln(‘tan(pi/4) = ‘,tan(pi/4));

  writeln(‘ctan(pi*3/4) = ‘,ctan(pi*3/4));

  writeln(‘arcctan(pi) = ‘,arcctan(pi));

  writeln(‘arcsin(0) = ‘,arcsin(0));

  writeln(‘arccos(1) = ‘,arccos(1));

end.

__________________________________________

tan(pi/4) = 1

ctan(pi*3/4) = -1

arcctan(pi) = 0.308169071115985

arcsin(0) = 0

arccos(1) = 0

5.

  • iTemp;
  • curTemperature;
  • cKnopka.

Понравилась статья? Поделить с друзьями:
  • Как найти пройденный путь или высоту
  • Как найти производную сложной функции обратной функции
  • Жди меня как найти свою заявку
  • Как так быстро найти девушку для секса
  • Как найти силу лоренца для электрона