Тренировочные задания

1. Дан интервал натуральных чисел от N до М. Определить все простые числа в этом интервале.
2. Дано натуральное число N. Определить все простые числа не превосходящие N.
3. Дано натуральное число N. Разложить его на простые множители.
4. Дано натуральное число N. Определить, является ли оно совершенным. Совершенное число N равно сумме всех своих делителей, не превосходящих само N.
5. Дано натуральное число N. Определить, является ли оно автоаморфным. Автоаморфное число N равно последним разрядам квадрата этого числа: 5<->25, 6<->36, 25<->625.

Урок 15

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

Задача 1.
Вводится последовательность из N целых чисел. Найти сумму всех отрицательных чисел.
Код программы.

Var I,n,x,sum:integer;
Begin
Write('Введите длину последовательности N=');
Readln(n);
Sum:=0;
For I:=1 to n do
Begin
Write('Введите число');
Readln(x);
if x<0 then sum:=sum+x
end;
If sum=0 then writeln('отрицательных чисел нет')
Else writeln('сумма отрицательных чисел =', sum);
Readln
End.

Задача 2.
Вводится последовательность ненулевых чисел, 0 - конец последовательности. Определить, сколько раз последовательность меняет знак.

Var old, new: real;
K: integer;
Begin
Write('введите число');
Readln(old);
Write('введите число');
Readln(new);
K:=0;
Repeat
If new*old<0 then k:=k+1;
Old:=new;
Write('введите число');
Readln(new);
Until new=0;
If k>0 then writeln ('Последовательность меняет знак ',k,' раз')
else writeln ('Последовательность не меняет знак ');
readln;
end.

Тренировочные задания.
1. Вводится последовательность из n произвольных чисел. Определить, сколько раз последовательность меняет знак.
2. Вводится последовательность чисел, 0-конец последовательности. Определить, содержит ли последовательность хотя бы два равных соседних числа.
3. Вводится последовательность чисел, 0-конец последовательности. Найти два наименьших числа.
4. Вводится последовательность из N целых чисел. Найти наибольшее из всех отрицательных чисел.
5. Вводится последовательность из N целых чисел. Найти, сколько в ней нулей.

Урок 16

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

Составить программу, которая в зависимости от порядкового номера дня недели (1, 2,..., 7) выводит на экран его название (понедельник, вторник,..., воскресенье).
Для этого воспользуемся условным оператором.

Var x: byte;
Begin
Write(' введите число от 1 до 7');
Readln(x);
If x=1 then writeln('понедельник');
If x=2 then writeln('вторник');
If x=3 then writeln('среда');
If x=4 then writeln('четверг');
If x=5 then writeln('пятница');
If x=6 then writeln('суббота');
If x=7 then writeln('воскресенье');
Readln
End.

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

В таком случае лучше подойдет оператор ВАРИАНТА (или ВЫБОРА).

Если условный оператор напоминает дорожную развилку, то оператор выбора - это разделение пути на множество дорог, по одной из которых пойдет выполнение программы.

Формат оператора:

CASE выражение OF
P1:< оператор 1 >;
P2:< оператор 2 >;
...
PN:< оператор N >;
ELSE < оператор N+1 >
END;

Выражение порядкового типа вычисляется, и его значение отыскивается в одном из списков констант. После этого выполняется соответствующий оператор. Если значение выражения не совпало ни с одной из меток, то выполняется оператор из строки ELSE. Cокращенная форма оператора не содержит ELSE. Метки оператора варианта могут быть константами любого типа, но их тип должен совпадать с типом выражения.

Тогда код нашей программы будет выглядеть иначе:

Var x: byte;
Begin
Write(' введите число от 1 до 7'); Readln(x);
Case x of
1: writeln('понедельник');
2: writeln('вторник');
3: writeln('среда');
4: writeln('четверг');
5: writeln('пятница');
6: writeln('суббота');
7: writeln('воскресенье');
end;
Readln
End.

Если при выборе альтернативы необходимо выполнение нескольких операторов, то нужно заключить их в операторные скобки BEGIN... END;, т.е. использовать составной оператор.
При использовании оператора CASE можно использовать диапазон допустимых значений параметра. Например, чтобы определить, введена ли как символьная переменная цифра, можно написать:

CASE I OF
'0'..'9':writeln('цифра');
ELSE writeln ('не цифра')
END;

Задача. Для целого числа K от 1 до 99 напечатать фразу "Мне k лет", учитывая при этом, что при некоторых значениях K слово "лет" надо заменить на слово "год" или "года". Например, 11 лет, 22 года, 51 год. (Данное решение можно улучшить используя дополнительно условный оператор. Попробуйте.)

var k:byte;
begin
write('Введите число лет'); readln(k);
case k of
1,21,31,41,51,61,71,81,91:writeln('Мне ',k,' год');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,82..84,92..94:writeln('Мне ',k,' года');
else writeln('Мне ',k,' лет');
end;
readln;
end.

Тренировочные задания:
1. Составить программу, которая в зависимости от порядкового номера месяца (1, 2,..., 12) выводит на экран его название (январь, февраль,..., декабрь).
2. Написать программу, которая бы по введенному номеру месяца выдавала соответствующее этому месяцу время года.
3. Составить программу, которая читает натуральное число N в десятичном представлении (N<=10000), а на выходе выдает это же число в десятичном представлении и на естественном языке. Например: 7 - семь, 204 - двести четыре, 52 - пятьдесят два.

Задачи на повторение:
4. Дано натуральное число. Определить, является ли разность его максимальной и минимальной цифр четным числом.
5. Дано натуральное число. Определить, сколько раз в нем встречается цифра, равная старшей.

Урок 17

Сегодняшний урок мы посвятим проблеме правильного ввода данных, точнее, контроля за вводом данных. Обычно в условии задачи указывается диапазон допустимых входных значений. И если данные введены некорректно, то даже верная программа может выдать неправильный ответ.

Например:
Составить программу, по которой компьютер печатает последовательность вида:

10, 100, 1000,..., 10^n (n<10)

Код программы:
var i,n,s:longint;
begin
write('Введите значение n<10');
readln(n);
s:=1;
for i:=1 to n do
begin
s:=s*10;{находим степень}
write(s,' ');
end;
readln;
end.

Если не сделать защиту, то при вводе числа больше 9 программа выполнится, но ответ будет абсурдным (так как пойдет переполнение допустимого значения переменной S). Попробуйте! А если сделать проверку входного данного, то программа не будет выполняться, пока не будет введено допустимое значение.

var i,n,s:longint;
begin
repeat {Цикл закончится если n<10}
write('Введите значение n<10');
readln(n);
until n<10;
s:=1;
for i:=1 to n do
begin
s:=s*10;{находим степень}
write(s,' ');
end;
readln;
end.

Существуют и другие методы контроля, но мы пока остановимся на контроле диапазона входных данных. Контроль за типом входных данных выполняет компилятор. Например, в случае, если в переменную целого типа вы попытаетесь ввести вещественное число, он просто прервет выполнение программы.

Тренировочные задания.
Постарайтесь в программах сделать контроль на допустимость вводимых данных.

1. Дано натуральное число N. Определить, является ли оно палиндромом. Число палиндром можно читать справа налево и слева направо: 4, 88, 121, 767767 и т.д.
2. Вводится последовательность из N целых чисел. Найти наибольшее число.
3. Дано натуральное число. Найти:
a. Число, получаемое при прочтении его цифр справа налево;
b. Число, получаемое в результате приписывания по двойке в начало и конец записи исходного числа;
c. Число, получаемое удалением из исходного всех цифр А;
d. Число, получаемое из исходного перестановкой его первой и последней цифр;
e. Число, образованное из исходного приписыванием к нему такого же числа.

Урок 18

В уроке 12 вы уже познакомились с символьным типом данных CHAR, который позволяет работать с отдельными символами текста. Для обработки более крупных текстовых единиц - строк введен тип данных, который называется STRING (строка).

Значениями этого типа являются строки любых символов длиной до 255.
Переменные строки должны быть описаны предложением:

VAR имя: STRING

Строки можно присваивать, сравнивать, вводить, выводить и соединять. Соединение обозначается знаком "+". Вот примеры некоторых операций сравнения над строками:

'стол'<= 'столик ' true
'ABC' <'ADBA' true
'12' <'2' true
'пар'+ 'о' +'воз' 'паровоз'

На основе этих примеров сформулируйте правила сравнения строк.

Среди всевозможных значений строк есть пустая строка. Она изображается двумя апострофами (одинарными кавычками), между которыми ничего нет. Чтобы ввести этот символ в состав строки, надо повторить его дважды. Например, оператор

write('об''явление')

выведет на экран: об'явление.

Программисту доступны отдельные символы строковой переменной, для этого кроме имени переменной надо указать порядковый номер символа в строке. Например, если описана переменная X:STRING, то X[1] - это первый символ строки, X[2] - второй и т.д.

У X[0] особая роль - хранить длину строки. Значением X[0] является символ, код которого равен количеству символов в строке. Но для определения длины строковой переменной обычно используется функция

LENGTH(строковая переменная).

Например, если N:=LENGTH(x); - N присвоится значение равное числу символов в строке.

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

Var
a,b:string[4];
begin
write('введите слово');
readln(a);
write(a);
readln
end.

Если при выполнении этой программы ввести слово КУКУРУЗА, то программа выведет КУКУ.

ЗАПОМНИТЕ. Если при выполнении программы необходимо ввести значение для нескольких строковых переменных, для каждой из них должен быть указан свой оператор ввода READLN. Например,

Var
a,b,c:string;
begin
readln(a);
readln(b);
readln(c);
write(a+b+c);
readln
end.

Проверьте, что произойдет, если записать READLN(a,b,c); или READ(a,b,c).

Пример 1.
Составить программу определяющую, какая из двух фамилий длиннее. Фамилии имеют разную длину.

Var
a,b:string;
begin
readln(a);
readln(b);
if length(a)>length(b) then write(a) else write(b);
readln
end.

Пример 2.
Даны два слова. Составить программу определяющую верно ли, что первое слово начинается на ту же букву, которой оканчивается второе слово.

Var x,y:byte;
a,b:string;
begin
readln(a);
readln(b);
x:=length(b); {определяем длину слова b, чтобы узнать номер последнего символа}
if a[1]=b[x] then write('верно') else write('неверно');
readln
end.

Тренировочные задания.
1. Дано название города. Определить, четно или не четно количество символов в нем.
2. Дано слово. Вывести на экран его третий символ и дважды его последний символ.
3. Дано слово. Верно ли, что оно начинается и оканчивается на одну и ту же букву?
4. Дано слово. Получить и вывести на экран буквосочетание, состоящее из его третьего и последнего символа.
5. Составить программу которая запрашивает название футбольной команды и повторяет его на экране со словами: "Это чемпион!".

Урок 19

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

Пример 1.
Дано слово, состоящее из четного числа букв. Вывести на экран его первую половину.

Var i,x:byte;
a:string;
begin
repeat
write('Введите слово из четного числа букв');
readln(a);
x:=length(a); {определяем длину слова}
until (x mod 2 = 0);
x:= x div 2; {применяем целочисленное деление}
for i:=1 to x do write(a[i]);
readln
end.

Пример 2.
Составить программу, которая печатает заданное слово в обратном порядке.

Var i,x:byte;
a:string;
begin
write('Введите слово ');
readln(a);
x:=length(a);{определяем длину слова}
for i:=x downto 1 do write(a[i]);
readln
end.

Пример 3.
Дано предложение. Определить число пробелов в нем.

Var i,x,k:byte;
a:string;
begin
write('Введите предложение');
readln(a);
x:=length(a); {определяем длину слова}
k:=0;
for i:=1 to x do if a[i]=' ' then k:=k+1;
writeln(k);
readln
end.

Пример 4.
Дано предложение. Определить порядковый номер первой встреченной буквы 'к'. Если такой буквы нет, сообщить об этом.

Var i,x,k,f:byte;
a:string;
begin
write('Введите предложение');
readln(a);
x:=length(a);{определяем длину слова}
k:=0; I:=0; f:=0;
repeat
I:=I+1;
if a[i]<>'к' then k:=k+1 else f:=1;
until (I=x)or(a[i]='к');
if f=1 then writeln(k) else writeln(' Нет такой буквы');
readln
end.

Тренировочные задания.
1. Дано слово. Получить его часть, образованную идущими подряд буквами, начиная с m-й и кончая n-й (m<n).
2. Дано слово из четного числа букв. Поменять местами его половины.
3. Дано слово. Перенести первые k его букв в конец.
4. Получить строку, состоящую из пяти эвездочек, т.е. символов "*".
5. Дано предложение. Напечатать все его буквы "и".

Урок 20

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: