Pascal ABC задачи с решением
Задача 1:
Сгенерировать случайное число, вывести на экран это число, а также сумму и произведение его цифр.
Алгоритм решения задачи:
random(900) генерирует случайное число от 0 до 899. Если прибавить к нему 100, то получится диапазон от 100 до 999 включительно, т. е. охватывает все трехзначные числа.
Чтобы извлечь из числа цифру сотен надо его разделить нацело на 100.
Для получения цифры десяток можно сначала разделить нацело на 10, а затем найти остаток от деления на 10.
Единицы извлекаются путем нахождения остатка от деления числа на 10.
Программа на языке Паскаль:
var n: integer ; a,b,c: byte ; begin randomize; n := random(900) + 100; writeln(n); a := n div 100; b := n div 10 mod 10; c := n mod 10; writeln(‘Сумма: ‘,a+b+c); writeln(‘Произведение: ‘,a*b*c); end .
Пример выполнения программы:
536 Сумма: 14 Произведение: 90
Задача 2:
Сгенерировать случайные целое число, вещественное число, букву в диапазонах, которые вводит пользователь.
Описание переменных:
min_i, max_i — минимальная и максимальная границы диапазона для целого числа;
n_i — случайное целое число;
min_f, max_f — минимальная и максимальная границы диапазона для вещественного числа;
n_f — случайное вещественное число;
first_c, last_c — первый и последний символ диапазона, в котором должен быть сгенерирован случайный символ;
min_c, max_c — коды-числа, соответствующие указанным символам;
n_c — случайное число, которое будет переведено в символ по таблице ASCII.
Программа на языке Паскаль:
var min_i, max_i, n_i: integer ; min_f, max_f, n_f: real ; first_c, last_c: char ; min_c, max_c, n_c: byte ; begin randomize; write(‘Minimum integer: ‘); readln(min_i); write(‘Maximum integer: ‘); readln(max_i); n_i := random(max_i-min_i+1) + min_i; writeln(n_i); write(‘Minimum float: ‘); readln(min_f); write(‘Maximum float: ‘); readln(max_f); n_f := random() * (max_f-min_f) + min_f; writeln(n_f:5:2); write(‘First char: ‘); readln(first_c); write(‘Last char: ‘); readln(last_c); min_c := ord(first_c); max_c := ord(last_c); n_c := random(max_c-min_c+1) + min_c; writeln(chr(n_c)); end .
Пример выполнения программы:
Minimum integer : -100 Maximum integer : 100 -46 Minimum float: 0.23 Maximum float: 0.85 0.53 First char : k Last char : q p
Задача 3:
Найти позицию в алфавите двух английских букв и количество символов между ними.
Определить букву по ее позиции в алфавите.
Алгоритм решения задачи:
Позиция буквы в алфавите определяется ее «смещением» относительно первой буквы алфавита. Если знать коды первой буквы и искомой, то разность их кодов покажет, на сколько позиций они отстоят друг от друга. В языке программирования Pascal код-номер буквы по таблице кодов символов ASCII определяется с помощью функции ord(), которой в качестве значения передается символ.
Для обратного действия — определения буквы по ее известной позиции в алфавите — надо к позиции буквы прибавить код первой буквы алфавита. После этого получить искомую букву по ее коду. Это делается с помощью функции chr(), которой передается число-код символа по таблице ASCII.
Программа на языке Паскаль:
var a,b: char ; an, bn, n: byte ; begin write(‘Буква 1: ‘); readln(a); write(‘Буква 2: ‘); readln(b); an := ord(a); bn := ord(b); writeln(‘Позиция 1: ‘, an-ord(‘a’)+1); writeln(‘Позиция 2: ‘, bn-ord(‘a’)+1); n := abs(bn-an)-1; writeln(‘Количество букв между ними: ‘, n); writeln; write(‘Позиция буквы в алфвите: ‘); readln(n); n := n+ord(‘a’)-1; writeln(‘Это буква — ‘, chr(n)); end .
Пример выполнения программы:
Буква 1: w Буква 2: z Позиция 1: 23 Позиция 2: 26 Количество букв между ними: 2 Позиция буквы в алфвите: 10 Это буква — j
Задача 4:
По координатам двух точек, которые вводит пользователь, определить уравнение прямой, проходящей через эти точки.
Алгоритм решения задачи:
Общий вид уравнения прямой имеет вид y = kx + b. Чтобы найти уравнение для конкретной прямой, необходимо вычислить коэффициенты k и b. Сделать это можно, если известны координаты двух точек, лежащих на этой прямой. В этом случае решается система уравнений:
Программа на языке Паскаль:
var x1,y1,x2,y2: real ; k, b: real ; begin write(‘A(x1;y1): ‘); readln(x1, y1); write(‘B(x2;y2): ‘); readln(x2, y2); k := (y1 — y2) / (x1 — x2); b := y2 — k * x2; writeln(‘y = ‘,k:0:2,’x + ‘,b:0:2); end .
Примеры выполнения программы:
A(x1;y1): 6 9 B(x2;y2): -1 3 y = 0.86x + 3.86
A(x1;y1): 1.2 5.6 B(x2;y2): -3.45 8.2 y = -0.56x + 6.27
Источник
Pascal: Занятие № 7. Подпрограммы: процедуры в Pascal
Процедуры в Паскале
Подпрограмма — это фрагмент кода, который имеет свое имя и создается в случае необходимости выполнять этот код несколько (много) раз. Подпрограмма описывается единожды перед началом основной программы (до begin ). Компилятор пропускает данный фрагмент кода, пока в основной программе не встретит «вызов» подпрограммы, который выглядит как обращение к ней по имени (возможно, имени с аргументами, указанными в скобках).
Во многих языках программирования подпрограммы существуют только в виде функций. Однако в Паскале подпрограмма — и функция и процедура. Разница между ними станет очевидна в данном уроке.
Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале
procedure pr; var i:integer; begin for i:=1 to 60 do begin <тело подпрограммы>write(‘*’); writeln; end; end; <конец подпрограммы>begin pr; <вызов процедуры>end.
В данном примере работы с процедурой в Паскале очевидно, что компилятор пропустит блок описания процедуры и дойдет до основной программы (9 строка кода). И только после того, как встретится вызов процедуры (10 строка), компилятор перейдет к ее выполнению, вернувшись к строке 1.
Процедуры с параметрами. Фактические и формальные параметры
Рассмотрим пример необходимости использования процедуры.
Особенность: Три похожие фигуры.
Алгоритм решения:
- выделить одинаковые или похожие действия (три фигуры);
- найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет);
- отличия записать в виде неизвестных переменных, они будут параметрами процедуры.
Решение на паскале:
Процедура:
Программа:
uses GraphABC; procedure Tr( x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.
Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.
Параметры процедуры (в некоторых языках они называются аргументами) указываются в скобках после ее имени (в объявлении).
В данном примере в качестве введенного символа будем использовать параметр процедуры. Формальный параметр процедуры указывается в скобках при ее описании. Обязательно необходимо указать тип формального параметра через двоеточие.
Фактический параметр — это то значение, которое указывается в скобках при вызове процедуры. Фактическим параметром может быть конкретное значение (литерал: число, символ, строка…) либо переменная, которые компилятор подставит вместо формального параметра. Поэтому тип данных у формального и фактического параметра процедуры должен быть одинаковым.
Pascal | PascalABC.NET | |||
если b>a → swap(a,b) a=24, b=18 | 24/18 = 1(6) | a=6, b=18 | ||
2 | a=6, b=18 18>6 | если b>a → swap(a,b) a=18, b=6 | 18/6 =3(0) | a=0, b=6 6 |
128 и 56 | ||||
1 | a=128,b=56 a>b | нет a=128,b=56 | 128/56=2(16) | a=16,b=56 |
2 | a=16,b=56 b>a | если b>a → swap(a,b) a=56, b=16 | 56/16=3(8) | a=8,b=16 |
3 | a=8,b=16 b>a | если b>a → swap(a,b) a=16,b=8 | 16/8=2(0) | a=0, b=8 8 |
0 do begin if a
В задачах на Паскале часто встречается необходимость заполнить массив данными и затем вывести значения на экран. Почему бы не автоматизировать данную задачу заполнения и вывода массива — т.е. оформить при помощи процедур, а в дальнейшем использовать данные процедуры при надобности.
const n = 10; var i:integer; a, b: array[1..n] of integer; procedure arr_out (k:integer; arr: array[1..n] of integer); var i: byte; begin write (‘вывод массива: ‘); for i := 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end.
Пояснение:
Тело основной программы:
— формирование элементов массива (с функцией random ).
— вызов процедуры с двумя параметрами: количество элементов, массив.
Тело процедуры:
— вывод элементов массива с использованием параметров
Продолжим нашу задачу:
const n = 10; var a, b: array[1..n] of integer; procedure arr_rand (k:integer; var arr: array[1..n] of integer); var i: byte; begin write (‘Заполнение массива случайными числами ‘); randomize; for i := 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.
Передача аргументов по значению и по ссылке
- Рассмотрим более подробно два этих понятия:
Передача по значению: Значение фактического параметра копируется в соответствующий формальный параметр. Изменение формального параметра не ведет к изменению фактического параметра
procedure p(a: integer); begin a := 666; // изменяется только формальный параметр! end; begin var x := 555; p(x); Print(x); // 555 end.
procedure p(var a: integer); begin a := 666; end; begin var x := 555; p(x); Print(x); // 666 – фактический параметр изменился тоже! end.
Самостоятельная работа
Общее задание 2: Описать процедуру Mean(X, Y, AMean, GMean) , вычисляющую:
- среднее арифметическое AMean = (X+Y)/2
- и среднее геометрическое GMean = √X*Y двух положительных вещественных чисел X и Y .
X и Y — входные параметры, AMean и GMean — выходные параметры вещественного типа.
В основной программе: Для заданных A, B, C, D найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), используя созданную процедуру.
1 вариант: для 5 одномерных массивов определять произведение элементов каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода произведения.
2 вариант: для 5 одномерных массивов определять минимальный элемент каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода минимального элемента.
* сложное С помощью процедуры формировать случайным образом одномерные массивы из 10 элементов (значения от -20 до +20). Вызывать процедуру до тех пор, пока среди значений не появится ноль.
Источник