- •Курс лекций Язык программирования Turbo Pascal
- •Тема 1 «Языки программирования»
- •Тема 2 «Основные понятия языка»
- •2.1 Алфавит языка
- •2.2 Основные определения языка
- •2.3 Служебные слова
- •2.4 Стандартные имена
- •2.5 Идентификатор
- •2.5 Элементы данных
- •Тема 3 «Общая структура программы на языке Turbo Pascal»
- •3.1 Общая структура программы на Паскале.
- •3.2 Некоторые правила оформления программ
- •Тема 4 «Типы данных, выражения»
- •4.1. Типы данных
- •4.2 Целочисленные типы данных
- •4.3 Вещественные типы данных
- •4.4 Символьный тип данных
- •4.5 Булевский тип (Логический) данных
- •4.6 Перечисляемый тип.
- •4.7 Интервальный тип.
- •4.8 Выражения.
- •1. Умножение, деление;
- •3. Сложение, вычитание.
- •1) Арифметические операции;
- •2) Операции отношений;
- •3) Логические операции.
- •4.9 Объявление констант
- •4.10 Объявление переменных
- •Тема 5 «Операторы для записи линейных процессов»
- •5.1 Оператор присваивания
- •5.2 Оператор ввода числовых данных
- •5.3 Оператор вывода числовых данных
- •5.4 Вывод числовых данных с форматом и без формата
- •1. Вывод данных без формата.
- •2. Вывод данных с форматом.
- •Контрольные вопросы и задания
- •Тема 6 «Разветвляющиеся вычислительные процессы»
- •6.1 Типы разветвляющихся алгоритмов
- •6.2 Оператор выбора case
- •Тема 7 «Операторы цикла»
- •7.1. Типы циклических процессов
- •7.2 Цикл с известным числом повторений for
- •Оператор повтора for.
- •Домашнее задание:
- •7.3 Итерационные циклы
- •7.4 Оператор цикла с предварительным условием
- •7.5 Оператор цикла с последующим условием Repeat
- •Домашнее задание:
- •8.1 Модуль crt. (Процедуры и функции управления экраном)
- •8.2 Константы цветов.
- •Процедуры управления цветом.
- •Тема № 9: «Структурированные типы данных»
- •9.1. Массивы
- •9.2. Записи
- •9.2.1. Оператор присоединения
- •9.2.2. Записи с вариантами.
- •9.3. Множества
- •9.4. Строки
- •9.4.1. Основные операции
- •9.4.2. Доступ к элементам строковых данных
- •9.4.3. Пустой стринг
- •9.4.4. Функции преобразования
- •9.4.5. Стандартные процедуры и функции
- •Тема № 10: Работа с файлами
- •10.1. Доступ к файлам
- •10.1.1. Имена файлов
- •Инициация файла
- •10.2.Процедуры и функции для работы с файлами
- •10. 3. Текстовые файлы
- •Типизированные файлы
- •Нетипизированные файлы
- •Тема № 11: «Процедуры и функции»
- •11.1. Процедуры
- •11.2. Функции
- •Тема №12: Указатели и динамическая память.
- •12.1. Выделение и освобождение динамической памяти.
- •Тема № 13: Модули.
- •13.1.Компиляция модулей.
- •13.2. Стандартные модули.
- •13.2.1.Модуль crt.
- •13.2.2. Модуль Graph
- •13.2.3. Модуль Overlay
- •Задания для самостоятельной работы по теме «линейные алгоритмы»
- •Задания для самостоятельной работы по теме «разветвляющиеся алгоритмы»
- •Задания для самостоятельной работы по теме «циклические алгоритмы»
- •Задания для самостоятельной работы «векторы»
- •Задания для самостоятельной работы «строки»
- •Задания для самостоятельной работы «процедуры и функции»
- •Задания для самостоятельной работы «записи»
- •Задания для самостоятельной работы по теме «множества»
- •Задания для самостоятельной работы по теме «файлы»
- •Задания для самостоятельной работы по теме «модуль graph»
- •Задания для самостоятельной работы по теме «модули, определяемые пользователем»
7.5 Оператор цикла с последующим условием Repeat
Формат оператора цикла с "постусловием" :
Repeat
< предложения тела цикла >
Until < логическое выражение> ;.
Здесь Repeat (повторить) и Until (до тех пор) - служебные слова.
Оператор с "постусловием" работает следующим образом. Предложения циклической части выполняются повторно (по крайней мере один раз) до тех пор, пока значение логического выражения ложно. Условием прекращения циклических вычислений является истинное значение логического выражения. Итак, сначала выполняется циклическая часть, а затем проверяется условие. Обратите внимание, что эти действия прямо противоположны действиям оператора цикла с "предусловием", где сначала проверяется условие, а затем выполняются предложения циклической части.
Заметим, что нижняя граница предложений циклической части четко обозначена словом Until , поэтому нет необходимости заключать предложения циклической части в скобки вида Begin - End. В то же время наличие операторных скобок не является ошибкой.
Если в циклической части встречается оператор перехода, указывающий на метку за пределами цикла, то цикл может завершиться до его естественного окончания.
Число повторений цикла Repeat определяется в ходе работы программы и заранее неизвестно.
Тело цикла будет повторяться до тех пор, пока условие, стоящее после until, будет оставаться ложным.
После слова until записывается условие завершения цикла.
Условие- это выражение логического типа.
Тело цикла Repeat выполняется хотя бы один раз.
Пример 1: Найдем сумму первых ста членов числовой последовательности 1, 2, 3, …
Program Summa;
Var I, Sum : Integer;
Begin
I:=0; S:=0;
Repeat
I:=I+1; S:=S+I;
Until I=100;
Writeln(S);
End.
Пример 2: Игра «Угадай число». Игрок должен угадать число comp, «задуманное» компьютером- случайное число в диапазоне от 1 до 1000. процесс продолжается до тех пор , пока значение переменной igrok, которая вводится с клавиатуры, не совпадает со значением переменной comp.
Program igra;
Var comp: integer;{число, задуманное компьютером}
Igrok: integer;{вариант игрока}
Begin
Randomize; {инициализация датчика случайных чисел}
Comp:=random(1000);{rкомпьютер загадал число}
Repeat
Write(‘введите число’);
Readln(igrok);
If igrok>comp then writeln(‘слишком много…’)
else If igrok<comp then writeln(‘слишком мало…’)
else writeln(‘Вы угадали!’);
until igrok=comp;
end.
Пример 3. Оператор repeat можно использовать для проверки правильности ввода исходных данных. Предположим, что по условию задачи исходное данное должно быть двузначным числом. Программа будет повторять запрос на его ввод до тех пора, пока не получит то, что ей требуется.
Program vvod;
Var x: integer[
Begin
…
Repeat
Write(‘введите двухзначное число’);
Readln(x);
until (x>9)and(x<100);
…
end.
Пример 4. Оператор REPEAT можно использовать для повтора фрагмента или всей программы, для того, чтобы произвести необходимые действия, но уже с другими данными. Чтобы каждый раз не перезапускать программу, необходимо оформить {повторяемый фрагмент} при помощи REPEAT.
Uses crt;
Var flag:char;
Begin
Repeat
{повторяемый фрагмент}
writeln(‘Повторить(y/Y)?’);
readln(flag);
until upcase (flag)<>’Y’;
end.
Функция upcase преобразует строчную букву в прописную, во всех остальных случаях ее результат совпадает с аргументом.(кириллица не обрабатывается). Т.о. вне зависимости от регистра нажатой клавиши у или У, будет выполняться повтор группы операторов {повторяемый фрагмент}. В противном случае программа завершит работу.
Пример 5 . Тест по таблице умножения(вариант №2)
Uses crt;
Var s1,s2,otvet,kol,prav:integer; yn:char;
Begin
Randomize;{инициализация датчика случайных чисел}
Clrscr;{очистка экрана}
Repeat
Kol:=kol+1;
S1:=random(18)+2; s2:=random(18)+2;{чтобы не умножать на 0 и 1}
Write(‘сколько будет’,s1,’*’,s2,
Readln(otvet);
If otvet=s1*s2 then begin
Writeln(‘правильно!’); prav:=prav+1;
End
Else write(‘неверно…’);
Write(‘Продолжим тест?(N\У’); Readln(yn);
Until (yn=’n’)or(yn=’N’);
Clrscr;{очистка экрана}
Writeln(‘Результаты теста:’);
Writeln(‘Задано вопросов:’ kol,’.Правильных ответов:’, prav,’.’);
Readln;
End.
Пример 6. На интервале [2; n] найти натуральное число с максимальной суммой делителей.
Предлагаемая задача может быть отнесена к классу «задачи целочисленной арифметики», где аргументы, результаты и промежуточные величины относятся к целому типу. Следует заметить, что в такого рода задачах довольно часто используются операции DIV и MOD; наиболее типичной подзадачей является определение количества цифр в записи числа.
Алгоритм решения задачи:
1) ввести число n;
2) переменной для хранения максимальной суммы делителей присвоить
значение 1 (это сумма делителей числа 1);
3) запомнить число с максимальной суммой делителей;
4) параметру цикла I присвоить значение 2;
5) если I больше n, перейти к п. 13, иначе - к следующему пункту;
6) переменной для хранения очередной суммы делителей присвоить значение 0;
7) параметру цикла K присвоить значение 1;
8) если K больше I/2, перейти к п. 11, иначе - к следующему пункту;
9) если I делится на K без остатка, добавить K к текущей сумме делителей;
10) увеличить K на 1 и перейти к п. 8;
11) сравнить текущую сумму делителей с максимальной, если максимальная меньше,
запомнить новое значение и число, соответствующее этой сумме;
12) увеличить I на 1 и перейти к п. 5;
13) вывести число с максимальной суммой делителей и эту сумму;
14) конец.
Program Sum_Del;
Var N, I, Sum_Max, Sum, K, Ch : Integer;
Begin
Write('Введите число N: '); ReadLn(N);
Sum_Max := 1; {Максимальная сумма делителей}
Ch := 1; {Число с максимальной суммой делителей}
For I := 2 To N Do {Это цикл по количеству чисел}
Begin
Sum := 0;
For K := 1 To I Div 2 + 1 Do {В этом цикле находим сумму делителей}
If I Mod K = 0 Then {Если I нацело делится на K, то K - делитель I}
Sum := Sum + K;
Sum := Sum + I;
If Sum > Sum_Max Then Begin Sum_Max := Sum; Ch := I End;
End;
WriteLn('Максимальную сумму делителей ', Sum_Max, ' имеет число ',Ch)
End.
Пример 7. Дано натуральное число n. Получить все простые делители этого числа.
{Программа отыскания простых делителей данного числа}
Program Pr_Del;
Var N, I, Vsp : Integer;
Log_Per, Priznak : Boolean;
Begin
Write('Введите натуральное число: ');
ReadLn(N);
Priznak := True; {Признак того, не является ли введенное число простым}
{Пока параметр цикла не превысил квадратного корня из данного числа,
продолжаем поиск простых делителей}
For I := 2 To Round(Sqrt(N)) Do
If N Mod I = 0 Then
Begin
Priznak := False; {Введенное число не является простым}
Log_Per := False; {Логическая переменная, принимающая значение True,
если нашлись делители I, отличные от 1 и I}
Vsp := 2;
Repeat
If (I Mod Vsp = 0) And (I <> Vsp) Then Log_Per := True;
Vsp := Vsp + 1
Until (Vsp > I Div 2 + 1) Or Log_Per;
If Not(Log_Per) Then WriteLn(I) {Если число I простое, печатаем его}
End;
If Priznak Then WriteLn(N)
End.
Предлагаем читателю самостоятельно разобраться с представленным решением.
Контрольные вопросы и задания
Назовите отличия итерационных циклов и цикла с параметром.
Какова структура оператора цикла с параметром? Как выполняется цикл с парметром?
Какого типа должны быть пареметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal?
Могут ли параметр цикла, его начальное и конечное значения в цикле с параметром в языке Pascal быть разных типов? Обоснуйте ответ.
Может ли один цикл быть вложен внутрь другого? Если да, то какова глубина этой вложенности?
Какова структура циклов с пред- и постусловием? как выполняются эти циклы?
Каково минимальное и максимальное количество исполнений циклов с пред- и постусловием? С чем это связано?
Сколько раз исполнится фрагмент программы?
For i := 1 to -1 Do k:=k*i;
Сколько раз исполнится фрагмент программы?
For i := -1 to 1 Do k:=k*i;
Сколько раз исполнится фрагмент программы?
For i := 1 downto -1 Do k:=k*i;
Сколько раз исполнится фрагмент программы?
M := 123; While M <> 0 Do M := M Mod 10;
Для цикла с параметром запишите его полный эквивалент с помощью циклов с пред- и постусловием.
Для цикла с предусловием запишите его полный эквивалент с помощью цикла с постусловием.
Для цикла с постусловием запишите его полный эквивалент с помощью цикла с предусловием.
