Добавил:
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 |
Неожиданный |
Вы забыли |
“;” expected |
Ждал точку с |
Вы забыли |
“,” expected |
Ждал запятую |
Вы указали |
“)” expected |
Ждал скобку “)” |
Вы указали |
Unknown identifier |
Неизвестное |
Вы забыли описать
Неправильно |
Type mismatch |
Несовпадение |
В вашей программе |
Duplicate identifier |
Дубль имени |
Одно и то же имя |
Syntax error |
Синтаксическая |
Паскаль |
BEGIN |
Ждал BEGIN |
Возможно, не |
END |
Ждал |
Возможно, не |
String |
Строковая |
Вы забыли закрыть |
Line too long |
Строчка слишком |
Слишком длинная |
Disk full |
Диск заполнен |
На вашем диске |
Lower bound greater than |
Нижняя граница |
Например, вы |
Invalid floating point |
Неправильная |
Sqrt(-25)илиa/0или что-нибудь в этом роде |
Ordinal expression |
Ждал выражение |
Например, вы |
Error in expression |
Ошибка в выражении |
Например, вы |
Range check error |
Ошибка проверки |
Переменная |
Constant out of range |
Константа не в |
Величина |
Invalid numeric format |
Неправильный |
Если, например, |
Более подробное
описание некоторых ошибок вы найдете
в 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 (да-да, тот самый). Делаю что-то вроде клавиатурного тренажёра… Код Паскаля АВС
Те символы-кракозябры — результат копирования Win1251 в UTF-8 форму, которые пропали на предварительном просмотре Код 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 |
Поставь ; после закрытой скобки. Строчку в исправленном виде покажи, а то я тебя не понял
0 |
vi fail 4 / 4 / 2 Регистрация: 27.07.2012 Сообщений: 59 |
||||
14.09.2012, 10:44 |
4 |
|||
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 |
|||||||
FunduxYura, до else убери ; Убрал, теперь этот кусок выглядит так:
Ошибка та же — 1 символ, строка 45, ожидается ; Добавлено через 5 минут
Это сама ошибка, так что — nice joke
0 |
CodeR Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,546 Записей в блоге: 1 |
||||
14.09.2012, 15:19 |
7 |
|||
FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End
0 |
FunduxYura 1 / 1 / 0 Регистрация: 31.07.2012 Сообщений: 32 |
||||||||
14.09.2012, 15:27 [ТС] |
8 |
|||||||
FunduxYura, Да потому что если вы хотите использовать в условие больше одного оператора то надо использовать операторные скобки Begin End Ой, совсем забыл про них, я просто раньше кодил на AS, JS, VB .NET, а с паскалем впервые встретился, вот и тупанул… Но теперь ругается на
Говорит, что ожидался оператор, но ругань идёт в самое начало строчки с else… Код функции, которая не должна ничего возвращать, и нужна для удобства
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 |
|||
FunduxYura, ты посмотри на мой код а теперь на свой… Спасибо, просто я уже жестоко туплю, теперь у меня ещё одна проблема… Не по теме: Я безнадёжен, да?
говорит, что = нельзя юзать с 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», как исправить? Вывести нечётные числа. Ошибка: оператор «%» невозможно применить к операнду типа «string» и «int» Поиск в массиве. Ошибка «Оператор «&&» не может применяться к операндам типа «bool» и «double»» Ошибка в коде «Ожидался оператор» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 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
Динамические массивы нумеруются с нуля. Цикл for var i:=1 to N do begin
должен выглядеть хотя бы так for var i:=0 to N-1 do begin
А вообще стоит оперировать такими функциями работы с массивами, как length
, High
и т.п.
ответ дан 6 дек 2017 в 6:27
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.