Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Перечисляемые и интервальные типы ⇐ ПредыдущаяСтр 8 из 8
Пример 20. Напишите программу, которая переменной t присваивает значение true, если первая дата предшествует (в рамках года) второй дате, и значение false в противном случае. Решение. Так как в условии задачи оговаривается, что обе даты должны находиться в рамках года, то дата должна задаваться днем и месяцем. Число дней любого месяца года не может быть более 31, число месяцев в году равно 12. Значение переменной t равно true, если номер первого месяца меньше второго, значение первого дня меньше второго при условии, что номера месяцев совпали. Program Example_20; Var dl,d2:l..31; ml,m2:l..12; t:Boolean; 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 с.) |