В программировании часто возникают ситуации, когда одну и ту же группу операторов, реализующих определенную цель, требуется повторить без изменений в нескольких местах программы. Для решения данной проблемы используют подпрограммы.
Подпрограмма — именованная группа операторов, которую можно вызвать для выполнения несколько раз из различных мест программы.
В языке Паскаль существую два вида подпрограмм: процедуры и функции.
Главное отличие процедур от функций заключается в том, что результатом функций является единственное число.
Конструирование алгоритма «сверху вниз»
При конструировании достаточно сложного алгоритма логично разбивать его на ряд более простых задач. Сначала записывается основной алгоритм. В нем записываются обращения к вспомогательным алгоритмам (подпрограммам), которые позволят решить отдельные, более простые задачи.
Вспомогательный алгоритм (подпрограмма) должен:
— иметь имя, по которому его можно вызвать из других алгоритмов;
[01] Программа «Hello, World!». Язык программирования Паскаль
— возвращать управление тому алгоритму, из которого он был вызван. После того как завершится выполнение вспомогательного алгоритма, вызвавший его алгоритм должен продолжить работу с той точки, в которой он был прерван;
— иметь возможность вызывать другие алгоритмы;
— иметь достаточно малые размеры.
В языке Паскаль существует два вида подпрограмм: Процедуры и функции в Паскале объявляются в разделе описания за разделом переменных: процедура (PROCEDURE ) и функция ( FUNCTION ).
Параметры, записываемые в обращении к подпрограммам, называются фактическими ; параметры, указанные в описании подпрограмм — формальными . Фактические параметры должны соответствовать формальным по количеству, порядку следования и типу. Параметры, объявленные в основной (главной) программе, действуют в любой подпрограмме и называются глобальными . Параметры, объявленные в подпрограмме, действуют только в этой подпрограмме и называются локальными .
Процедуры
Процедуры используются в случаях, когда в подпрограмме необходимо получить несколько результатов. В языке Паскаль существует два вида процедур: процедуры с параметрами и без параметров.
Формат описания процедуры имеет вид:
procedure имя процедуры (формальные параметры);
раздел описаний процедуры
begin
исполняемая часть процедуры
end;
Например:
procedure korni (f: real; b,c:integer; var x1, x2:real; var k:integer);
Формальные параметры отделяются точкой запятой (однотипные параметры пишутся через запятую).
Вызов процедуры:
Обращение к процедуре осуществляется по имени процедуры, за которым могут быть указаны фактические параметры.
имя процедуры (фактические параметры);
Фактические параметры отделяются друг от друга запятой.
При вызове процедуры устанавливается взаимно однозначное соответствие между фактическими и формальными параметрами. После выполнения процедуры управление передается следующему, после вызова процедуры, оператору вызывающей программы.
Программа -тест на языке паскаль
Например:
korni (i,c,d,x,y,n);
Задача 1. Написать процедуру, которая печатает строку из N звездочек и переводит курсор на новую строку.
procedure pr (n:integer);
var i : integer ;
begin
for i :=1 to n do write (‘*’); writeln;
end;
Задача 2. Составьте программу, получения изображения в котором в первой строке 1 звездочка, во второй — 2, в третьей -3, . в строке с номером m — m звездочек.
Источник: pinskolimp.blogspot.com
Программа опроса и анкеты на pascal
Пример на ввод и вывод данных и условия в Pascal Программа для анкетирования на паскаль
В этой статье мы напишем программу на паскале, в которой будет организован ввод данных и вывод информации на экран, в программе будут использованы условия. Мы напишем программу на паскале для анкетирования, она будет опрашивать пользователя об его интересах и анализировать полученные ответы на предмет совпадения с ответами, заложенными в программе.
Рассмотрим структуру программы опроса на паскале.
Введём переменную k для подсчета количества совпавших предопределённых ответов и ответов пользователя
var k: integer;
var a1,a2,a3,a4: integer; // номера правильных ответов
Придаём переменным значения с номерами ответов
k:=0;
a1:=3;
a2:=1;
a3:=3;
a4:=2;
Спрашиваем имя пользователя при помощи операции readln() ввода информации с клавиатуры в паскале
writeln(‘Как вас зовут?’);
readln(n);
Задаём вопрос и получаем на него ответ пользователя
print(«Здравствуйте»,n)
writeln(‘Ваш любимый жанр литературы? 1- классика, 2 — фантастика, 3 — детективы,’);
readln(a);
Анализируем совпадения ответов, используя условный оператор if в паскале. Если ответ совпал с предопределенным, то увеличиваем число совпавших ответов на 1.
if (a = a1) then begin
k:=k+1;
end;
В конце программы проводим анализ числа совпадений и делаем вывод о схожести интересов.
if (k>=2) then begin
writeln(‘Мы с вами подружимся’);
end;
if (k <2) then begin
writeln(‘Мы с вами очень разные’);
end;
Полный текст программы опроса, анкеты на паскале
var k: integer; // количество совпавших ответов
var a1,a2,a3,a4: integer; // номера правильных ответов
var n: string;
var a: integer;
begin
k:=0;
a1:=3;
a2:=1;
a3:=3;
a4:=2;
writeln(‘Как вас зовут?’);
readln(n);
writeln(‘Ваш любимый жанр литературы? 1- классика, 2 — фантастика, 3 — детективы,’);
readln(a);
if (a = a1) then begin
k:=k+1;
end;
writeln(‘Ваш любимый жанр кино? 1- научная фантастика, 2 — документальные фильмы, 3 — сериалы,’);
readln(a);
if (a = a2) then begin
k:=k+1
end;
writeln(‘Ваш любимый цвет? 1- красный, 2 — синий, 3 — зелёный,’);
readln(a);
if (a = a3) then begin
k:=k+1
end;
writeln(‘Ваш любимый жанр музыки? 1- рок, 2 — рэп, 3 — классика,’);
readln(a);
if (a = a4) then begin
k:=k+1
end;
if (k>=2) then begin
writeln(‘Мы с вами подружимся’);
end;
if (k <2) then begin
writeln(‘Мы с вами очень разные’);
end;
end.
Перейти к содержанию курса по Pascal
Комментарии ( 0 )
Нет комментариев. Ваш будет первым!
Источник: itrobo.ru
Pascal: Примеры задач с решением
Анализируя данную формулу, видим, что аргумент функции sin очередного слагаемого отличается от предыдущего на 0.1. Поэтому для решения данной задачи можно составить следующий алгоритм:
с – очередное слагаемое;
i – аргумент функции;
- Обнуляем начальное значение переменной y (строка 5), в которой будем накапливать сумму.
- Начальное значение аргумента функции i равно 1 (строка 6).
- Проверяем, значение i меньше или равно 2, т.к. по заданию аргумент функции изменяется от 1 до 2 (строка 7)?
- Если «да», то определяем очередное значение функции (строка 9). Сохраняем его в переменной с. Если «нет», то расчет суммы закончен – переходим на шаг 78.
- Добавляем это слагаемое в сумму (строка 10).
- Увеличиваем значение аргумента i на 0.1 (строка 11).
- Переходим на шаг 3.
- Выводим результат на экран (строка 13).
var y , c , i : real ;
writeln ( ‘Полученное значение расчета формулы ‘ ,
‘y=sin1+sin1.1+sin1.2+ . +sin2 = ‘ ) ;
while i = 2 do
c : = sin ( i ) ;
writeln ( y ) ;
Второй вариант решения данной задачи.
Анализируя данную формулу, видим, что каждое слагаемое данной суммы можно рассчитать по формуле sin(1 + 0.1 * i), где i изменяется от 0 до 10. Поэтому для решения данной задачи можно составить следующий алгоритм.
i – параметр цикла;
y – сумма.
- Обнуляем начальное значение переменной y (строка 6), в которой будем накапливать сумму.
- Организуем цикл для определения суммы (параметр дан-ного цикла должен измениться от 0 до 10) .
- В данном цикле определяем очередное слагаемое по фор-муле и добавляем это слагаемое в сумму (строка 7).
- Выводим результат на экран (строка 8).
var y : real ;
i : integer ;
writeln ( ‘Полученное значение расчета формулы ‘ ,
‘y=sin1+sin1.1+sin1.2+ . +sin2 = ‘ ) ;
for i : = 0 to 10 do y : = y + sin ( 1 + 0.1 * i ) ;
writeln ( y ) ;
Задача 2.
Вычислить: y = 1*3*5* … *(2n–1), n>0;
var y : real ;
i , n : integer ;
writeln ( ‘Введите количество чисел’ ) ;
for i : = 1 to n do y : = y* ( 2 * i – 1 ) ;
writeln ( ‘Полученное значение y= ‘ , y )
Задача 3.
Дано натуральное число N. Разложить его на простые множители.
n – исследуемое число;
i, j – переменные циклов;
f – вспомогательный флаг.
Алгоритм решения задачи:
- Вводим значение переменной n. Т.к. пользователь может случайно ввести отрицательное число, то необходимо дать ему возможность для повторного ввода значения переменной n. По-этому организуем цикл (строки 3–6 текста программы). Лучше использовать цикл с пост проверкой условия (Repeat…Until). Тело цикла составляют два оператора: вывода на экран приглашения для ввода значения переменной n (строка 4) и оператор чтения с клавиатуры – для непосредственного ввода значения переменной n (строка 5). Данный цикл будет выполняться до тех пор, пока пользователь не введет любое положительное число (срока 6).
- Выводим на экран значение переменной n и начинаем формировать ответ. Ответ будет представлен в следующем виде (например, в качестве значения переменной n ввели 8): 8 = 1*2*2*2. Т.к. единица является простым множителем для любого числа, то выводим ее на экран (строка 7). В результате выполнения данной строки на экране появится: 8=1.
- Вспомогательной переменной f присваиваем значение false. Данная переменная нам будет необходима для определения, а были ли вообще найдены простые множители у заданного числа n. Запоминаем исходное значение переменной n в переменной j (строка 8).
- В цикле по переменной i начинаем порождение натуральных чисел, не превосходящих середины заданного числа n, для определения делителей данного числа n (строка 9). Данный цикл начали с 2, т.к. единицу мы уже учли (шаг 2 данного алгоритма). Т.к. в цикле For можно использовать только целые переменные, то воспользовались оператором целочисленного деления на 2 (n div 2). В данном цикле выполняем следующее. Определяем, является ли очередное i делителем числа n (в качестве n в данном цикле используем j). Для этого определяем остаток от деления j на i. Если остаток равен 0 (строка 10), т.е. число i является делителем j, то определяем, сколько таких делителей, уменьшая число n (строки 11–18). Переменной f присваиваем значение true (строка 12) – это означает, что у заданного числа n есть делители. Организуем цикл, пока остаток от деления j на i равен 0 (строка 13). В данном цикле выводим делитель на экран (строка 15) и уменьшаем заданное число, деля его целочисленно на делитель (строка 16). Повторяем цикл. После завершения этого цикла возвращаемся на цикл For (строка 9), изменяем i и повторяем те же действия для нового делителя.
- Если у числа нет делителей (оно является простым), то данное число можно разложить только на 1 и само себя. Вспомогательная переменная f и определяет, были ли делители у числа n. Если значение переменной f осталось false, то делителей не было, поэтому выводим само это число (строка 19).
var i , n , j : integer ; f : boolean ;
write ( ‘Введите натуральное число N= ‘ ) ;
until n 0 ;
write ( N : 6 , ‘=1’ ) ;
f : = false ; j : = n ;
for i : = 2 to n div 2 do
if j mod i = 0 then
while j mod i = 0 do
write ( ‘*’ , i ) ;
j : = j div i ;
if not f then writeln ( ‘*’ , n ) ;
Задача 4.
Даны натуральное число n и последовательность a1, a2,…,an вещественных чисел. Найдите знакочередующую сумму S = a1 –a2 + a3 –…+ (–1)n+1 an.
n – количество чисел;
a – очередное число;
p – булевский признак знака слагаемого;
i – переменная цикла;
S – знакочередующая сумма чисел.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем начальное значение S;
- булевская переменная p первоначально истинна, она будет указывать на знак слагаемого в сумме;
- последовательно считываем числа, и если p = true, то прибавляем очередное число к сумме S, иначе – отнимаем;
- на каждом шаге цикла значение p меняем на противоположное;
- выводим результат.
var n , i : integer ;
a , S : real ;
p : boolean ;
write ( ‘Введите длину последовательности n=’ ) ;
until n 0 ;
for i : = 1 to n do
write ( ‘Введите a=’ ) ;
if p then S : = S + a else S : = S – a ;
writeln ( ‘Знакочередующая сумма чисел S= ‘ , S ) ;
Задача 5.
Найти сумму первых n членов ряда y = 1 + x/2 + x2/3 + +x3/4+…, при |x|
n – количество членов ряда;
x – переменная ряда;
z – вспомогательная переменная;
i – переменная цикла;
Алгоритм решения задачи:
- вводим количество членов ряда n и переменную X;
- в цикле порождаем очередной член ряда и прибавляем его к сумме y;
- выводим результат.
var x , y , z : real ;
n , i : integer ;
writeln ( ‘Введите переменную ряда x, |x|<1, x=’ ) ;
write ( ‘Введите число членов ряда n=’ ) ;
until ( abs ( x ) 1 ) and ( n 0 ) ;
y : = 1 ; z : = 1 ;
for i : = 2 to n do
y : = y + z / i ;
writeln ( ‘Сумма первых n членов ряда y =’ , y ) ;
Задача 6.
Вводится последовательность из N целых чисел. Найти сумму всех отрицательных чисел.
n – количество чисел;
x – очередное число;
i – переменная цикла;
sum – сумма отрицательных чисел.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем на-чальное значение sum;
- последовательно считываем числа и, если число отрица-тельное, то прибавляем его к сумме sum;
- в зависимости от значения sum выводим результат.
var n , x , sum , i : integer ;
write ( ‘Введите длину последовательности n=’ ) ;
until n 0 ;
for i : = 1 to n do
write ( ‘Введите x=’ ) ; readln ( x ) ;
if x 0 then sum : = sum + x ;
if sum = 0 then writeln ( ‘Отрицательных чисел нет’ )
else writeln ( ‘Сумма отрицательных чисел sum= ‘ , sum ) ;
Задача 7.
Вводится последовательность из N целых чисел. Найти наибольшее число.
n – количество чисел;
x – очередное число;
i – переменная цикла;
max – наибольшее число.
Алгоритм решения задачи:
- вводим длину последовательности n и устанавливаем на-чальное значение max по первому числу;
- последовательно считываем числа и, если очередное чис-ло x больше max, то переприсваиваем значение max := x;
- выводим результат.
var n , x , max , i : integer ;
write ( ‘Введите длину последовательности n=’ ) ;
until n 0 ;
write ( ‘Введите x=’ ) ;
for i : = 2 to n do
write ( ‘Введите x=’ ) ;
if ( x max ) then max : = x ;
writeln ( ‘Наибольшее из чисел max=’ , max ) ;
Задача 8.
Вводится последовательность целых чисел, 0 – конец по-следовательности. Найти два наименьших числа.
x – очередное число;
min1 – первое наименьшее число;
min2 – второе наименьшее число (min2>=min1).
Алгоритм решения задачи:
- устанавливаем начальные значения min1 и min2 по двум первым числам;
- последовательно считываем числа и, если очередное чис-ло x меньше или равно min1 (min1
- если x попадает в интервал от min1 до min2, то перепри-сваиваем только min2;
- выводим результат.
var x , min1 , min2 : integer ;
write ( ‘Введите x=’ ) ;
write ( ‘Введите x=’ ) ;
if x = min1 then
min2 : = min1 ;
if ( min1 x ) and ( x min2 ) then min2 : = x ;
write ( ‘Введите x=’ ) ;
until ( x = 0 ) ;
writeln ( ‘Два наименьших числа равны’ , min1 , ‘и’ , min2 ) ;
Задача 9.
Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить, является ли последователь-ность возрастающей.
old – предыдущее число;
new – рассматриваемое число;
Решение данной задачи строится от противного. Математи-чески для того, чтобы последовательность была возрастающей, для каждого очередного элемента new и предыдущего old должно выполняться условие new > old. Любое нарушение данного усло-вия приводит к тому, что последовательность не может быть возрастающей.
Алгоритм решения задачи:
- вводим два первых числа как old и new, задаем начальное значение флага f;
- в цикле ищем нарушение свойства членов возрастающей последовательности;
- пере присваиваем значение old:=new и вводим новое – new;
- в зависимости от флага выводим результат.
var old , new : real ;
f : boolean ;
write ( ‘Введите x=’ ) ;
readln ( old ) ;
write ( ‘Введите x=’ ) ;
readln ( new ) ;
if new = old then f : = false ;
write ( ‘Введите x=’ ) ;
readln ( new ) ;
until new = 0 ;
if f then writeln ( ‘Последовательность возрастающая’ )
else writeln ( ‘Последовательность не является возрастающей’ ) ;
Задача 10.
Даны натуральное n и последовательность веществен-ных чисел a1, a2,…, an. Сколько отрицательных чисел в начале по-следовательности (до первого неотрицательного)?
i – переменная цикла;
n – количество членов последовательности;
a – очередной член последовательности;
p – признак отрицательного числа в начале последователь-ности.
Алгоритм решения задачи:
- вводим длину последовательности, задаем начальное значение счетчика k;
- устанавливаем признак отрицательного цисла p=true;
- в цикле вводим очередной член последовательности;
- если это отрицательное число и до этого неотрицательных чисел не было, то увеличиваем значение счетчика на единицу;
- в противном случае, если член последовательности неот-рицателен, то полагаем p=false;
- в зависимости от k выводим результат.
var a : real ; p : boolean ;
k , n : integer ;
write ( ‘Введите длину последовательности n=’ ) ;
until n 0 ;
k : = 0 ; p : = true ;
for i : = 1 to n do
writeln ( ‘Введите число’ ) ;
if ( a 0 ) and p then k : = k + 1else
if a = 0 then p : = false
if k = 0 then writeln ( ‘отрицательных чисел в начале нет’ )
else writeln ( ‘последовательность начинается с ‘ , k , ‘ чисел’ )
Задача 11.
Дан прямоугольный бильярдный стол со сторонами А и В, где А, В – натуральные числа (бильярд Льюиса Кэролла). Из угловой лузы вылетает шар под углом 45 градусов к боковым стенкам, ударяется о борт, отскакивает, ударяется еще раз и т.д., пока не вылетит через одну из угловых луз. Рассчитать ко-личество отрезков в ломаной траектории шара. Считать угол падения равным углу отражения.
Данная задача решается с помощью стандартных функций выделения целой части от деления y на x (y div x) и выделения остатка y mod x. При прохождении шаром прямоугольного стола и отражении его от боковых сторон происходит увеличение числа отрезков траектории на два, а обратный путь вычисляется как y:=a–x+y mod x, где y – обратный путь для шара, a – длинная сторона стола, x – короткая сторона стола.
x, y – два натуральных числа (формальные параметры);
k – вспомогательная переменная (локальная переменная);
a – длинная сторона стола (глобальная переменная);
в основной программе:
a, b – два натуральных числа (глобальные переменные).
Алгоритм решения задачи:
- создаем описание функции bill;
- вводим два натуральных числа a и b (не кратные друг другу);
- вызываем функцию bill для определения количества от-резков;
- завершаем работу программы.
Источник: msbro.ru