Перечисляемые и интервальные типы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Перечисляемые и интервальные типы



Пример 20. Напишите программу, которая переменной t присваивает значение true, если первая дата предшествует (в рамках года) второй дате, и значение false в противном случае.

Решение. Так как в условии задачи оговаривается, что обе даты должны находиться в рамках года, то дата должна задаваться днем и месяцем. Число дней любого месяца года не может быть более 31, число месяцев в году равно 12. Значение переменной t равно true, если номер первого месяца меньше второго, значение первого дня меньше второго при условии, что номера месяцев совпали.

Program Example_20;

Var dl,d2:l..31;

ml,m2:l..12;

t:Boolean;
Begin '

Write('Введите первую дату (день, месяц)');

Readln(dl,ml);

Write('Введите вторую дату (день, месяц)');

Readln(d2,m2);

t:=(ml<m2) Or ((ml=m2)And(dl<d2));

Writeln(t);

End.

Пример 21. Составьте программу, которая определяет, является ли введенный символ гласной или согласной буквой английского алфавита.

Решение. По условию задачи все символы делятся на следующие группы:

• гласные буквы английского алфавита;

• согласные буквы английского алфавита;

• символы, не являющиеся буквами английского алфавита.

Program Example_21;

Var ch: Char;

Begin

Write('Введите символ1);

Readln(ch);

Case Upcase(ch) Of

'A', 'E, 'I', 'O', 'U': Writeln('Это гласная буква английского

алфавита');

'A'..'Z': Writeln('Это буква английского алфавита');

Else Writeln ('Этот символ не является буквой английского

алфавита');

End.

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

Пример 22. Найти к-е простое число в арифметической прогрессии 11, 21, 31, 41, 51, 61,....

Решение. Для решения поставленной задачи необходимо просматривать числа последовательности и проверять каждое из них на свойство простоты. Поскольку нам не известно, сколько членов последовательности необходимо просмотреть, мы должны просматривать этот ряд до тех пор, пока не найдем к-е простое число; для этого воспользуемся циклом с условием.

Program Example_22;

Var k: Integer;

n, p,d: Longint;

Begin

Writeln('Введите номер числа’);

Readln(k);

n:=0; p:=l;

While n<k Do

Begin

Inc(p,10); d:=2;

While (p Mod d<>0) And (d<sqrt(p)) Do Inc(d);

If d>=sqrt(p) Then Inc(n); End;

Writeln(p);

Readln;

End.

В этом решении мы смогли записать условие d<sqrt (p), так как типы integer и Real совместимы.

Примеры рекурсивного программирования

Пример 23. Вычисление факториала натурального числа.

Решение. Для того чтобы вычислить М, надо знать значение (N—\)l и умножить его на N, при этом 1!=1. В общем виде это можно записать так:

Function factorial(n:Integer): Longint;

Begin

If n=l Then factorial:=1 Else factorial:=n*factorial(n-1);

End;

Найдем 5!. Как же будет вычисляться факториал этого числа? Первый вызов этой функции будет из основной программы (Например, а:= factorial(5), где переменной а присваиваем значение 5!).

Так как N<>1, то пойдем по ветке Else и функции Factorial присваиваем значение n*Factorial(n-l), то есть надо умножить 5 на значение функции Factorial(4). Поэтому обращаемся второй раз к этой же функции, но передаем ее новое значение параметра - 4. Так делаем до тех пор, пока не передадим значение, равное 1. Тогда N= 1, а поэтому значение функции Factorial:=1. Таким образом, N = 1 - это условие, по которому процесс входа в следующую рекурсию заканчивается. Идет возвращение в точку вызова и подстановка в оператор присвоения значения вычисленной функции. То есть возвращаемся в предыдущую функцию для n=2: Factorial: =n*Factorial (п-1), значит, Factorial: =2*1, следовательно, Factorial(2) =2. И возвращаемся дальше. Таким образом, получаем значение Factorial (5) =120, это значение и присвоим переменной а.

Пример 24. Перевод натурального числа из десятичной системы счисления в двоичную,

Решение. Для решения этой задачи рассмотрим сначала, как перевести число из десятичной системы счисления в двоичную. Пусть есть число 39, которое и надо представить в двоичной системе. Для этого разделим его на 2, получим целую часть и остаток от деления. Целую часть снова делим на 2 и получаем целую часть и остаток. Так делаем до тех пор, пока целую часть можно делить на 2 (то есть пока она не станет равной 1).

Теперь, начиная с этой единицы, выписываем в обратном порядке все остатки от деления, это и будет запись числа 39 в двоичной системе счисления:

3910 =1001112

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

Опишем процедуру:

Procedure Rec(n: Integer);

Begin

If n>l Then Rec(n Div 2);

Write(n Mod 2);

End;

Первая цифра (1) выводится на экран из последнего вызова, следующая цифра (0) из предпоследнего и так далее, последняя (1) - из первого. Таким образом, вывод очередной цифры происходит перед тем, как выйти из данной функции.

Файлы. Файловый тип данных. Открытие файла.

Чтение и запись

Пример 25. Прочитаем файл целых чисел и выведем их на экран(Решения везде приводятся для версии Turbo Pascal)

Assign(Fl,'a:int.dat'); {связываем с внешним файлом}

Reset(Fl); {открываем его для чтения}

While Not EOF (Fl) Do {пока не достигнут конец файла F1}

Begin

Read(Fl,n); {считываем очередное число}

Write(n, ' '); {выводим его на экран} End;

Close(Fl); {закрываем файл}

Пример 26. Создадим файл целых чисел с именем Dan1.dat, причем ни одно из чисел не равно 0.

Решение. Первоначально «свяжем» файловую переменную с конкретным внешним файлом при помощи процедуры Assign. Откроем файл для записи - процедура Rewrite. Конец ввода чисел - ввод числа ноль.

Program Example_26;

Var F: File Of Integer/

n: Integer;

Begin

Assign(F, 'a:danl.dat'); {связываем с внешним файлом}

Rewrite(F); {открываем его для записи}

Writeln('конец ввода чисел - О1);

Repeat {пока не будет введен 0}

Writeln('введите число'); Readln(n); {ввод числа с клавиатуры}

{если введено число, отличное от 0,

то дописываем его в данную строку файла F1}

If n<>0 Then Write (F, n);

Until n=0/ {если ввели 0, то заканчиваем запись данного файла} Close(F); {закрываем файл}

End.

Пример 27. В файле Da1l.dat записаны целые числа (см. предыдущую задачу). Вычислить сумму элементов и результат вместе с исходными данными записать в файл Dan2.dat.

Program Example_27;

Var Fl, F2: File Of Integer; {файловые переменные }

S, N: Integer;

Begin

{с именем файла Fl связывается внешний файл на дискете} Assign(Fl,'Danl.dat'); Reset(Fl)/

{открытие файла Fl для чтения }

{с именем файла F2 связывается внешний файл на дискете} Assign(F2,'Dan2. dat1’);

Rewrite(F2);{открытие файла F2 для записи} S:=0;

While Not EOf(Fl) Do {проверка на конец файла Fl}

Begin

Read(Fl,N); {чтение элемента из файла Fl}

Write(F2,N); {запись элемента в файл F2}

S:=S+N/ {вычисление суммы} End;{запись суммы элементов в конец файла F2}

Write(F2,S);

Write('Результат находится в файле Dan2.dat1)

Close(F1); {закрытие файла F1 для чтения}

Close(F2); {закрытие файла F2 для записи}

Readln;

End.

Текстовые файлы

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

Решение. Пусть в файле содержится следующая информация:

132 456 87 656 5765

45 12 34 76

524 6253 3 233 323 38764

Этот файл можно создать в среде Turbo Pascal таким образом:

• создать новый файл (команда New меню File);

• записать все числа в строках через пробелы;

• сохранить его, например «а: int1.dat».

Теперь этот файл будем использовать в программе.

Program Exarnple_29;

Var F: Text;

x, k: Integer;

Begin

Assign(F, 'a:intl.dan1); {связываем с внешним файлом}

Reset(F); {открываем для чтения}

While Not Eof(F) Do {пока не конец файла}

Begin

k:=0; {начальное число элементов строки}

While Not Eoln(F) Do {пока не конец строки} Begin

Read(F, x); {считываем очередное число}

Write(х,’’); {вывод его на экран} Inc(к); {увеличиваем счетчик} End;

Writeln(' в строке', к,'элементов');

Readln(F); {переходим к следующей строке файла}

End;

Close(F); {закрываем файл}

Readln;

End.

Массивы

Пример 29. Найти сумму пяти целых чисел.

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

Program Example_29;

Var al,a2,a3,a4,a5,s: Integer;

Function Sum(xl,x2,x3,x4,x5: Integer): Integer;

Begin

Sum:=xl+x2+x3+x4+x5;

End;

Begin

Writeln (' введите пять целых чисел');

Readln(al,a2,аЗ,а4,а5); {вводим пять целых чисел}

s:=Sum(al,а2,аЗ,а4,а5); {находим их сумму}

Writeln('их сумма равна!,s); {вывод результата на экран}

Readln;

End.

А как найти сумму, например, 100 целых чисел? Здесь необходимо использовать массив.

Пример 30. Составить программу нахождения суммы элементов массива.

Решение. Опишем две процедуры (формирования и вывода массива) и функцию нахождения суммы элементов, которые будем использовать в основной части. Заметим, что заполнение и вывод массива можно осуществить только поэлементно, то есть можно сначала присвоить значение первому элементу, затем второму и так далее, то же самое и с выводом на экран — выводим первый, второй, третий... и так до последнего. Будем вводить значения элементов массива с клавиатуры.

Program Exaraple_30;

Const n=30; {n - это число элементов массива}

Type myarray=Array[1..n] Of Integer;

Var A: myarray; s: Integer;{s - значение этой переменной будет равно сумме всех элементов массива}

Procedure Initl(Var m: myarray);

Var i: Integer;

{i - это переменная для работы с элементами массива}

Begin

Writeln('введите ',п, ' чисел’);

For i:=l To n Do {ввод массива с клавиатуры}

Readln(m[i]); {чтение i-ro элемента}

End;

Procedure Print(m: myarray);

Var i: Integer;

Begin

For i:=l To n Do {вывод массива}

Write(m[i]: 3); {вывод i-го элемента}

Writeln;

End;

Function Sum(m: myarray): Integer;

Var i, sum: Integer;

Begin

sum:=0; {начальное значение суммы}

For i:=l To n Do

sum:=sum+m[i]; {к уже найденной сумме

первых (i-1) элементов прибавляем i-й элемент}

End;

Begin

Initl(A); {обращение к процедуре формирования}

Print(А); {вывод массива}

s:=Sum(A); {нахождение суммы элементов}

Writeln('их сумма равна ',s); {вывод результата на экран}

Readln;

End.

Первый способ задания одномерного массива - это задание с клавиатуры (он был рассмотрен в примере выше - процедура Initl).

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

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

Program Example_31;

Const n=30; dd=51;

{n - это число элементов массива, dd - для генератора случайных чисел}

Type myarray = Array [l..n] Of Integer;

Var A: myarray;

Procedure Init2(Var m:myarray);

{процедура заполнения (инициализации) массива случайными числами}

Var i:Integer;

Begin

For i:=l To n Do m[i]:=-25+Random(dd);

{Random выбирает случайное число из отрезка от 0 до dd-1, тогда i-му элементу массива будет присвоена сумма выбранного случайного числа и -25, таким образом, массив будет заполняться случайными числами от -25 до -25+(dd-1), то есть до -26+dd}

End;

Procedure Print(m:myarray); {процедура вывода (распечатки) массива}

Begin

Randomize; {включение генератора случайных чисел}

Init2(А); {обращение к процедуре заполнения массива}

Print(А); {обращение к процедуре вывода заполненного массива} Readln;

End.

 

Третий способ задания — это чтение чисел из файла.

Пример 32. Пусть в файле записано несколько строк, а в каждой из них по 30 целых чисел. Составить программу с использованием процедуры заполнения массива из файла.

Program Example_32;

Const n=30; {n - это число элементов массива,}

Type myarray = Array [l..n] Of Integer;

Var A: myarray;

F: text;

Procedure Init3(Var m:myarray); {процедура заполнения (инициализации) массива}

Var i:Integer;

Begin

For i:=l To n Do Read(f, m[i])

{чтение из файла очередного числа}

End;

Procedure Print(m:myarray); {процедура вывода (распечатки) массива}

Begin {связываем файловую переменную с конкретным внешним файлом}

Assign(F, '...');

Reset(F); {открываем его для чтения}

While Not Eof(F) Do Begin

{считываем очередную строку}

Init3(A); {обращение к процедуре заполнения массива}

Print(А); {обращение к процедуре вывода}

Readln(F);

End;

Readln;

End.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 157; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.168.16 (0.085 с.)