Решения задач написаны на Delphi - консольные приложения. При написании кода решений в среде Turbo Pascal или ABC Pascal следует строки:
{$APPTYPE CONSOLE}
uses
SysUtils;
заменить на: uses CRT;
Так как консольные приложения "не дружат" с русским языком, все сообщения в программах транслитерированы.
Линейные алгоритмы
Задача 1.
Напишите программу ввода трёх произвольных чисел X, Y и Z с клавиатуры. Если X больше Z, то вывести на экран сумму X и Y, иначе вывести на экран значение Z.
Решение:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x, y, z, rez: real;
begin
{Вод значений с клавиатуры}
write('Wwedi X:'); readln(x);
write('Wwedi Y:'); readln(y);
write('Wwedi Z:'); readln(z);
{Сравниваем значения по условию задачи}
if x > z then rez:= x + y else rez:= z;
{Выводим результат на экран}
writeln(rez:0:2);
readln; {Задержка закрытия программы}
end.
Задача 2.
Напишите программу ввода с клавиатуры трёх произвольных чисел X,Y,Z. Программа должна найти наименьшее число из введённых, и вывести его на экран.
Решение:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x, y, z, min: real;
begin
{Вод значений с клавиатуры}
write('Wwedi X:'); readln(x);
write('Wwedi Y:'); readln(y);
write('Wwedi Z:'); readln(z);
{Присваиваем начальное значение минимуму}
min:= x;
{Делаем проверку}
if min > y then min:= y;
if min > z then min:= z;
{Выводим результат на экран}
writeln('Minimum = ', min);
readln; {Задержка закрытия программы}
end.
Задача 3.
Длина прямоугольного участка земли равна X метров, а ширина равна Y метров. Напишите программу вычисления количества досок для забора на заданном участке, если ширина доски равна 10 сантиметров.
Решение:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x, y, rez: real;
begin
{Вод значений с клавиатуры}
write('Wwedi dlinu X:'); readln(x);
write('Wwedi shirinu Y:'); readln(y);
{Вычисляем периметр участка}
rez:= 2*x + 2*y;
{Вычисляем нужное количество досок}
rez:= rez/0.1;
{Выводим результат на экран}
writeln('Chislo dosok = ', rez:0:2);
readln; {Задержка закрытия программы}
end.
Задачи с циклами
Задача 1. Чиновник, ежемесячно берёт взятки в размере Х рублей. Величина Х непостоянная и колеблется от 0 до 150000 рублей. Автомобиль BMW 3, который хочет купить на взятки чиновник, стоит 1700000 рублей. Напишите программу, которая вычислит, сколько месяцев потребуется чиновнику на сбор нужной суммы.
Решение:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x: longint; {Размер взятки}
mes: integer; {Число месяцев}
begin
mes:= 0;
x:= 0;
{Организуем цикл, который завершится при сумме взяток
равной или больше 1700000}
Repeat
{Организуем случайные числа для величины Х}
randomize;
x:= x + random(150000);
writeln(x);
{Организуем счётчик месяцев}
mes:= mes + 1; {inc(mes)}
until x >= 1700000;
{Выводим результат на экран}
writeln('Mesjac = ', mes);
readln; {Задержка закрытия программы}
end.
Задача 2. (Пример ГИА для 9 класса).
Напишите программу, которая вычисляет произведение членов последовательности, кратных 5. Программа получает на вход целые числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 - признак окончания ввода, не входит в последовательность).
Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30000.
Программа должна вывести одно число: произведение членов последовательности, кратных 5.
Решение: program Ls1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x, z: integer; { Переменные для ввода значений x и вычисления произведения z}
n : integer; {Счётчик цикла}
label L1; {Метка безусловного перехода}
begin
{clrscr} {Очистить экран - убрать кавычки в Turbo Pascal}
z:= 1; {Начальное значение результата}
{Создаём цикл с максимальным числом вводимых значений}
for n := 1 to 1000 do
begin {начало тела цикла}
{Получаем данные с клавиатуры}
L1: write('Vvedi X: '); readln(x);
{Проверяем условие на вводимый диапазон значений}
if (x < -30000) or (x > 30000) then {Если за пределами диапазона, то перейти к вводу другого зачения - к метке L1}
begin
writeln('Input error!');
goto L1;
end;
{Если признак окончания ввода, то прервать цикл}
if x = 0 then break else
{Если введённое число кратно 5, то наращиваем произведение членов z Функция frac возвращает остаток от деления x / 5}
if frac(x/5) = 0 then z:= z * x;
end; {конец тела цикла}
{Проверяем, были ли во вводимых значениях числа кратные 5, если нет выводим 0 иначе выводим произведение}
if z = 1 then z:= 0;
writeln('Result = ', z);
readln;
end.
Пример выполнения программы.
Задача 3. (Пример ГИА для 9 класса).
Напишите программу, которая в последовательности целых чисел определяет разность максимального и минимального чисел. Программа получает на входе целее числа, количество введённых чисел неизвестно, последовательность чисел заканчивается число 0 (0 - признак окончания ввода, не входит в последовательность).
Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30000.
Программа должна вывести одно число: разность максимального и минимального чисел.
Решение.
Так же, как и в предыдущей задаче вычисления будем производить в цикле, но для разнообразия используем цикл Repeat :Until. Цикл будет прерываться при вводе числа 0 (признаке окончания ввода последовательности).
program Lesson2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x_min, x_max: integer; {Переменные для хранения максимума и минимума}
x, rez : integer; {Переменные - вводимое значение и результат}
label L1; {Метка для перехода при ошибке ввода}
begin
{clrscr - для Turbo Pascal}
{Задаём начальное значение для минимума и максимума при вводе первого значения из потока данных}
write('Vvedi X: '); readln(x);
x_min:= x;
x_max:= x;
repeat {Запускаем цикл который прервётся при вводе 0}
begin {Тело цикла}
L1: write('Vvedi X: '); readln(x);
{Проверяем введённое число на допустимость значения по условию. В этом примере ипользуем функцию abs - модуль числа}
if abs(x) > 30000 then
begin
writeln('Osibka vvoda');
goto L1; {Если ошибка переход назад (метка L1) к вводу данных}
end;
if x <> 0 then
begin
if x < x_min then x_min:= x; {Роверяем на минимум}
if x > x_max then x_max:= x; {Проверяем на максимум}
end;
end; {Конец тела цикла}
until x = 0;
rez:= x_max - x_min; {Вычисляем разность между минимумом и максимумом}
writeln('Rezultat = ', rez); {Выводим результат на экран}
readln;
end.
Пример выполнения программы.
А вот так эта программа будет выглядеть при использовании цикла FOR:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
x, xmin, xmax: integer;
n, rez: integer;
label L1;
begin
Write('Wedi X: '); ReadLN(x);
xmin:= x; xmax:= x;
for n := 1 to 1000 do
begin
L1: Write('Wedi X: '); ReadLN(x);
if abs(x) > 3000 then
begin
Writeln('Input ERROR!');
goto L1;
end;
if x = 0 then break;
if x < xmin then xmin:= x;
if x > xmax then xmax:= x;
end;
rez:= xmax - xmin;
Writeln('Rezultat = ',rez);
readln;
end.
Задача 4.
Напишите программу перевода чисел из двоичной системы счисления в десятичную.
Решение. В этой программе мы будем вводить двоичное число как строку символов, затем разворачивать строку с зада наперёд (чтобы обрабатывать запись с младших разрядов) и далее при наличии "1" в строке произведём соответствующие вычисления.
uses crt;
var
s, se: string; {s - строка ввода se - перевёрнутая строка}
n: integer; {счётчик цикла}
c: char;
d: real;
begin
writeln('Input Bin:');
readln(s); {Считываем бинарную строку с клавиатуры}
se:= '';
for n:= length(s) downto 1 do {Переворачиваем введённую строку}
begin
c:= s[n];
se:= se + c;
end;
{ writeln('New string: ', se); отладочная информация}
d:= 0;
for n:= 1 to length(se) do
begin
c:= se[n];
if c = '1' then d:= d + exp((n-1) * ln(2)); {Если в строке появляется 1, то возводим 2 в степень n-1 и наращиваем результат d}
end;
writeln(' Decimal = ',d);
end.
Линейные (одномерные) массивы.
Задача 1.
Задан массив случайных целых чисел, величина которых, по модулю, не превышает 300 (-300 ... 300). Число элементов массива равно 10. Найти максимальное и минимальное числа в массиве и вывести на экран.
Решение.
program lesson3;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
ar: array [1..10] of integer; {Объявляем массив из 10 элементов}
min, max: integer; {переменные для хранения минимума и максимума}
z: integer; {счётчик цикла}
x: integer; {для промежуточного хранения чисел элементов массива}
begin
randomize; {включаем генератор случайных чисел}
for z := 1 to 10 do {создаём цикл из 10 итераций}
begin
{Получаем случайные числа.}
x:= random(600);
{Создаём отрицательные значения элементов массива, если значения превышают 300}
if x > 300 then x:= (x * -1) + 300;
ar[z]:= x; {Перегружаем значения в массив}
writeln(z, '= ', ar[z]); {Выводим значения массива на экран (отладочная информация)}
end;
{Присваиваем начальные значения минимуму и максимуму}
min:= ar[1]; max:= ar[1];
{Находим в цикле минимум и максимум}
for z:= 2 to 10 do
begin
if min > ar[z] then min:= ar[z];
if max < ar[z] then max:= ar[z];
end;
{Выводим результат на экран}
Writeln('Minimum = ', min);
Writeln('Maximum = ', max);
readln;
end.
Пример выполнения программы.
|