Назад к списку статей

Примеры программ на Паскале.     На главную         Программирование на Pascal

(Из рубрики: Начинающим о компьютерных технологиях. Автор - NK)    draginf.ru

     Здесь представлены примеры простых программ на языке программирования Pascal. В процессе их разбора, те, кто начинает учиться программировать, смогут усвоить некоторое количество простых приемов, которые можно использовать в дальнейшем.

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

1. Из простой в заглавную.
2. Число в степени.
3. Число пробелов в строке.
4. Цикл с предусловием.
5. Нахождение минимального числа.
6. Заполнение и вывод двумерного массиваю
7. Лохотрон - найди шарик.
8. Корни квадратного уравнения - 1.
9. Корни квадратного уравнения - 2.
10. Количество цифр в числе.
11. ASCII - код нажатой клавиши.
12. Контроль ввода нуля.
13. Запись в файл.
14. Поиск файла на диске.
15. Контроль ввода.
16. Размер диска.
17. Десятки и единицы.
18. Количество положительных чисел.
19. Оператор Case.
20. Подача сигнала.
21. Догнал ли Ахил черепаху.


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.


И, на последок, реализация греческого философского опуса о том догонит ли Ахил черепаху, если находится она от него в 100 шагах, а скорость Ахила в 10 раз больше. Кстати, решив эту задачу, вы получите одно из замечательных чисел. Ну, наверно помните Пи, e (основание натурального логорифма) и наконец это. А чем же оно замечательно? Решите - узнаете.