Лекция 3: Основные типы программы
1. Из простой в заглавную. В начало
Program Str1;
VAR Words: STRING;
BEGIN
Words := 'microsoft';
Words[1] := UpCase (Words[1]);
WriteLn(Words); {Выводится Microsoft'}
END.
Программа демонстрирует перевод символа строки из обычного представления в заглавное. Часто такой прием требуется для анализа введенного символа, если важно проверить именно символ, а не его регистр.
2. Число в степени. В начало
Program Stepen_chisla;
Var
Z, А : Real; M : integer;
Function Step (N: integer; X:real): real;
Var
I: integer; Y: Real;
Begin
I:=1; Y:=1;
While I<=N do
Begin
Y:=Y*X; I:=I+1;
End;
Step:=Y;
End; {Конец функции}
Begin
Write(‘Введи степень и возводимое число’); Readln(Z,M);
F:=Step(M,Z);
Writeln(Z, ‘ в степени’, M, ‘=’,F);
End.
В Паскале нет встроенной функции возведения в степень. Программа показывает, как это можно исправить. Попробуйте реализовать такую функцию для случая, когда показатель степени не является целым числом.
3. Число пробелов в строке. В начало
program CountSpacesInString;
var
str: string;
function CountSpaces (s: string): integer;
var
i, count: integer;
begin
count := 0;
for i:=1 to length(s) do
if s[i]=' ' then
count := count+1;
CountSpaces := count;
end;
{основная программа}
begin
writeln('Программа подсчитывает количество пробелов '+'во введенной строке');
repeat
writeln('Введите исходную непустую строку:');
readln(str);
if (length(str)<1) then
writeln('Исходная строка должна быть непустой');
until length(str)>0;
writeln('В строке "',str,'" ',CountSpaces(str),' пробелов.');
readln;
end.
Программа демонстрирует приемы работы со строками. Поиск символа в строке, контроль длины введенной строки. Здесь же реализована структура цикла с постусловием и применение функции созданной пользователем.
4. Цикл с предусловием. В начало
program cycle_while;
Var
x,y,sum:real; otv:char;
begin
sum:=0;
otv:='Д';
while (otv='Д') or (otv='д') do
begin
write('Введите числа x,y > 0 ');
readln(x,y);
writeln('Их произведение = ',x*y:8:3);
sum:=sum+x+y;
write('Завершить программу (Д/Н)? ');
readln(otv);
end;
writeln('Общая сумма = ',sum:8:3);
readln
end.
В приведенной программе циклически будет вычисляться произведение двух введенных чисел. Для продолжения работы программы необходимо периодически на ее вопрос отвечать утвердительным символом Д или д. Паскаль выводит вещественные числа в так называемой экспоненцмальной форме. Для их обычного представления необходимо после выводимой переменной указать параметры вывода в виде двух чисел после двоеточий.
5. Нахождение минимального числа из введенных. В начало
Program MIN;
Var
A, I : Integer;
Min : Integer;
Begin
Min:=32767;
For I:=1 to 10 do
Begin
Write('Vvedi chislo ');
Readln(A);
If A < Min then Min:=A;
end;
Writeln('MIN=',Min);
Readln;
end.
Простая программа демонстрирует цикл со счетчиком, и работу условных операторов. В начале анализа в качестве минимального задано максимально возможное из целых положительных целочисленного типа. (Попробуйте реализовать этот алгоритм по другому.)
6. Заполнение и вывод двумерного массива. В начало
Program MASS-DV;
var
mas:array[1..5,1..5] of integer; {объявление двухмерного массива}
i ,j:integer;
begin
{Ввод значений элементов массива}
for i:=1 to 5 do
for j:=1 to 5 do readln(mas[i,j]);
{Вывод значений элементов массива}
for i:=1 to 5 do
begin
for j:=1 to 5 do
write(' ',mas[i,j]);
writeln;
end;
end.
Демонстрация ручного заполнения двумерного массива с последующим выводом его на экран.
7. Лохотрон - найди шарик. В начало
Uses Crt;
Var
A, C, B : Integer;
Begin
clrscr;
Randomize;
gotoXY(20,10); Writeln('Где шарик? Введи номер стакана…');
A:=Random(99);
If A<=33 then B:=1 Else If A>66 then B:=3 else B:=2;
GotoXY(20,11); Writeln(' _ _ _');
GotoXY(20,12); Writeln('/ \ / \ / \');
GotoXY(20,13); Writeln(' 1 2 3');
Readln(C);
If C=B then Write('Вы угадали!!!') else Write('Вы ошиблись!');
GotoXY(20,11); Writeln(' ');
GotoXY(20,12); Writeln('\_/ \_/ \_/');
GotoXY(17+4*B,12); Write('O');
Readln; end.
Кто ж не видел лохотронщиков, ловко катающих шарик под колпачками. Здесь это делает программа. Но, только она не будет вас обманывать, а в конце честно, покажет, в каком стаканчике шарик. Программа демонстрирует вывод в определенную точку экрана, перемещая в нее курсор процедурой GoToXY из модуля CRT.
8. Корни квадратного уравнения - 1. В начало
Program Sq1;
Var A, B, C, D, X1, X2 : Real;
Begin
Writeln ('Введите коэффициенты квадратного уравнения');
Readln (A,B,C);
D:=B*B-4*A*C;
If D<0 Then Writeln ('Корней нет! ')
Else
Begin
X1:=(-B+SQRT(D))/2/A;
X2:=(-B-SQRT(D))/2/A;
Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)
End;
End.
Классическая программа вычисления корней квадратного уравнения с контролем дискриминанта. Обратите внимание, как в Паскале формируются вычислительные выражения.
9. Корни квадратного уравнения - 2. В начало
Program Sq2;
Var A, B, C, D, X, X1, X2 : Real;
Begin
Writeln ('Введите коэффициенты уравнения (A, B, C) ');
If A=0 Then
If B=0 Then
If C=0 Then Writeln('X - любое число')
Else Writeln('Корней нет! ')
Else Begin X:=-C/B; Writeln('X=',X:8:3) End
Else
Begin End;
End.
В программе проанализированы ситуации, когда какой либо из коэффищиентов равен 0. Обратите внимание на использование пустого оператора Begin End; Оказывается иногда без него никак не обойтись.
10. Количество цифр в числе. В начало
Program KolCifr;
Var
I, S, N : Longint;
Begin
Writeln('Введите целое'); Readln(I);
N:=1;
While I > 10 DO
BEGIN
I:=I DIV 10;
Inc(N);
end;
Write('Количество цифр = ',N);
Readln; end.
Простая программа определяет количество цифр в числе. Используется алгоритмическая структура цикл с предусловием.
11. ASCII - код нажатой клавиши. В начало
Uses crt;
Var ch : char;
Begin
clrscr; {очистка экрана}
repeat
ch:=readkey; {ожидание нажатия клавиши}
WriteLn('Клавиша и ее ASCII-код: ', ch, ‘-’, ord(ch)); {Вывод ASCII - кода}
until ch=#27; {27 - ASCII - код клавиши Esc}
End.
Мы говорим: кодирование. А какому числу в реальности соответствует каждый из символов клавиатуры. В программах довольно часто приходится анализировать нажатие определенных клавиш. Данная программа позволит вам выяснить, что чему соответствует.
12. Контроль ввода нуля. В начало
Program KONTROL;
Label A;
Var I : Integer;
Begin
A:
Write(‘Введите число. 0 - выход из программы’); Readln(I);
Writeln(‘Вы ввели число = ’, I);
IF I <> 0 then Goto A;
End.
Программа закончит свою работу, если вы специально или по ошибре ввели нуль в качестве требуемого числа. Здесь продемонстрировано назначение меток (Label) и так страстно ругаемое применение оператора GoTo (Идти на).
13. Запись в файл. В начало
Program File;
var
f: file;{файловая переменная f}
begin
assign(f,'test.txt'); {назначение файловой переменной f имени файла test.txt}
rewrite(f); {создание файла и открытие его для записи}
writeln(f,'Запись'); {запись информации в файл}
close(f); {закрытие файла}
end.
В реальных программах сохранение результатов в файл происходит очень часто.
В этой программе продемонстрирован этот механизм. Поэкспериментируйте с записью чисел, а затем попробуйте их прочитать и использовать в программе. Практически все школьные олимпиады по программированию используют именно такой способ ввода и вывода данных.
14. Поиск файла на диске. В начало
Uses Dos;
Var
S:SearchRec;
Begin
FindFirst('*.exe',AnyFile,S);
While DosError=0 do
Begin
WriteLn(S.Name);
FindNext(S);
End;
End.
А есть ли вообще такой файл на этом диске? Увы но это отнюдь не праздный вопрос. Им задаются многие пользователи. Программа демонстрирует поиск группы файлов с расширением exe (программ). Обратите внимание, как происходит обращение к полю переменной имеющей тип - запись (через точку). Научитесь при работе с файлами использовать обобщающие символы - ? и *.
15. Контроль ввода. В начало
Program Err;
uses crt;
var i:integer; flag:boolean;
begin
{$I-}{отключаем контроль ошибок ввода вывода}
repeat
readln(i);{ввод значения}
if IoResult=0 then flag:=true {если нет ошибки, то выходим из цикла}
else
begin
gotoxy(wherex,wherey-1);{перевод курсора на строку вверх}
delline; {удаляем строку}
end;
until flag;
{$I+}{включаем контроль ошибок ввода вывода}
end.
В простых программах ошибки при вводе данных могут приводить к неожиданному результату в ее работе. Все зависит от того, как на эту ошибку прореагирует операционная система. Но мы можем проконтролировать появление ошибок сами, предупредив об этом операционную систему.
16. Размер диска. В начало
Program DiskSize;
Uses Dos;
Begin
WriteLn('DiskSize = ',DiskSize(0) div 1024 div 1024,' Mb'); { объем диска }
WriteLn('DiskFree = ',DiskFree(0) div 1024 div 1024,' Mb'); { объем свободного пространства на диске }
End.
Раньше именно такими простыми функциями можно было все узнать о диске. Сейчас это может получиться некорректно. Вспомните о количестве байт пространства диска и диапазоне чисел среды Паскаль.
17. Десятки и единицы. В начало
Program DES-ED;
Var
K, Des, Ed : Integer;
Begin
Write('Введи десятичное число '); Readln(K);
Des:= K DIV 10;
Ed:= K MOD 10;
Writeln('Количество десятков в числе =', Des);
Writeln('Количество единиц в числе =', Ed);
Readln; End.
Показано использование операций целочисленного деления и взятия остатка от деления. В практике программистов понимание сути этих действий требуется довольно часто
18. Количество положительных чисел. В начало
program cycle_for;
var i,kn : byte; x:real;
begin
kn:=0;
for i:=1 to 10 do
begin
writeln('Введите ',i,' число: ');
readln(x);
if x>0 then kn:=kn+1 {увеличиваем кол-во на 1}
end;
writeln('Вы ввели ',kn,' положительных чисел.');
readln
end.
Подсчет количества элементов с определенным признаком довольно частая программистская задача.
19. Оператор Case. В начало
Program Vibor;
var i:integer;
begin
write('Введите целое число: ');
readln(i);
case i of
0,2,4,6,8 : writeln('Четная цифра');
1,3,5,7,9 : writeln('Нечетная цифра');
10...100 : writeln('Число от 10 до 100);
else writeln('Число либо отрицательное, либо > 100');
end;
readln;
end.
Если выбор способа реакции программы на определенное условие очень разнообразен, применяем оператор Case (выбор). Реализовать такое ветвление оператором IF было бы затруднительно. Обратите внимание, что условия выбора можно задавать через запятую или диапазоном. А заканчиваться Case должен End-ом.
20. Подача сигнала. В начало
program BipProc;
Var N : Integer;
Procedure Bip;
Begin
Sound(600); {включение звука, частота 600Гц}
Delay(100); {Задержка 100мс}
NoSound; {выключение звука}
End.
Begin
Write(‘Введи ненулевое число’); Readln(N);
If N=0 then
Begin Writeln(‘Вы ошиблись’); Bip; end;
End.
Хоть пищание динамиком уже не в моде, такая возможность у программистов осталась. Например, в данном случае напоминание звуком об ошибке вполне актуально.
21. Догнал ли Ахил черепаху. В начало
Program AHIL;
CONST
Vch=100/3600; {Скорость черепахи}
Va=1000/3600; {Скорость Ахила}
VAR
Sa, Sch : Real;
Begin
Sa:=0; Sch:=100;
repeat
Sch:=Sch+Vch*1;
Sa:=Sa+Va*1;
Until Sa > Sch; {Проверка пути пройденного Ахилом}
Writeln('Ахил догнал чрепаху на расстоянии =', Sch:8:7, ' - шагов.');
Readln;
end.