Основы программирования в Паскале (PascalABC)

Download Report

Transcript Основы программирования в Паскале (PascalABC)

Основы
программирования в
Pascal
Основы программирования в
Pascal
• Структура программы
• Линейные алгоритмы
• Ветвления
• Циклы
• Одномерные массивы
• Двумерные массивы
• Символьные и строковые
переменные
Пример линейного алгоритма
и программы в Паскале
Задача 1.
Составить алгоритм сложения двух чисел А и В, вводимых с
клавиатуры. Результат сложения записать в виде переменной С. По
данному алгоритму написать программу в Паскале
Алгоритмический язык
алг сложение
цел А, В, С
Блок-схема
начало
Программа в Паскале
Program summa;
Var
a,b,sum : integer;
Ввод А, В
нач
ввод А
Begin
readln(a);
readln(b);
sum := a + b;
writeln(sum)
С:=A+B
ввод В
С := А + В
вывод С
кон
Вывод C
конец
end.
Структура программы в Паскале
(минимальные требования)
Program имя программы;
Var
имя переменной : тип;
- Имя программы
- Раздел описания переменных
Begin
операторы
end.
- Раздел операторов
Раздел описания переменных
Var
<список переменных (через запятую)> : <тип переменных>;
Типы переменных:
integer – целый тип (в интервале [-32.768, 32.767]
–
2 байта
Longint – длинный целый [-2.147.483.648, 2.147.483.647] – 4 байта
real – вещественный тип  (2,9 1039 1,7 1038 )
и др.
-
6 байт
Ввод исходных данных с клавиатуры
read(<список переменных>);
readln(<список переменных>);
read(a,b);
read(a);
read(b);
Вывод данных на экран монитора
write(<список переменных>);
writeln(<список переменных>);
Для целого типа:
writeln(a);
writeln(b);
write(a,b);
write(a,’ ‘,b);
write(a:5,b:5);
Для вещественного типа:
write(a:7:2,b:9:3);
writeln(b);
writeln(a:5:2);
writeln(b:7:3);
(При b=1,234 на экран выведется: 1234e-3)
Вывод данных на экран монитора
Для целого типа:
writeln(‘a=‘,a);
writeln(‘b=‘,b);
Для вещественного типа:
writeln(‘a=‘,a:5:2);
writeln(‘b=‘,b:7:3);
При b=1,234 на экран выведется: b= 1,234
Арифметические выражения в Паскале
Сложение
+
Вычитание
-
Умножение
*
Деление
/
Целочисленное деление div
Остаток от деления
mod
например:
например:
11 div 5 = 2
2 div 3 = 0
17 div -5 = -3
-17 div 5 = -3
-17 div -5 = 3
10 mod 5 = 0
10 mod 3 = 1
3 mod 5 = 3
17 mod -5 = 2
-17 mod 5 = -2
-17 mod -5 = -2
Приоритет операций
1. Минус, not
2. *, /, div, mod, and
3. +, -, or
4. =, <>, <, >, <=, >=
Стандартные функции в Паскале
Этапы программирования
1. Постановка задачи
2. Математическая формализация
3. Построение алгоритма
• Алгоритмический язык
• Язык блок-схем
4. Составление программы на языке программирования (Паскаль)
5. Отладка и тестирование программы
Линейные алгоритмы
Задача 2. Написать программу нахождения периметра
прямоугольного треугольника по известным катетам a и b (a и b –
целые числа, вводимые с клавиатуры).
алг периметр
нач Периметр
цел a, b
вещ c, p
нач
ввод a
ввод b
c := a 2  b2
Ввод a
Ввод b
c := a  b
p := a + b +c
2
Вывод p
p := a + b +c
вывод p
кон
2
кон
Линейные алгоритмы
Задача 2. Написать программу нахождения периметра
прямоугольного треугольника по известным катетам a и b (a и b –
целые числа, вводимые с клавиатуры).
Program perimetr;
Var
a,b : integer; c,p : real;
Begin
write(‘a=‘); readln(a);
write(‘b=‘); readln(b);
c := sqrt(sqr(a)+sqr(b));
p := a + b + c;
writeln(‘p=‘,p:5:1);
readln
end.
Линейные алгоритмы
Задача 2. Написать программу нахождения периметра
прямоугольного треугольника по известным катетам a и b (a и b –
целые числа, вводимые с клавиатуры).
Program perimetr;
Var
a,b : integer; p : real;
Begin
write(‘a=‘); readln(a);
write(‘b=‘); readln(b);
p := a + b + sqrt(sqr(a)+sqr(b));
writeln(‘p=‘,p:5:1);
readln
end.
Линейные вычислительные
алгоритмы
Задача 2 Даны переменные X и Y Требуется произвести между
ними обмен значениями (№9 стр. 190) 
алг обмен
вещ X, Y, Z
нач
ввод X
ввод Y
Z := X
X := Y
Y := Z
вывод X, Y
кон
Таблица трассировки:
X
Y
Z
Решение задач
Записать математические выражения в Паскале и
вычислить их значения при a=2, b=3:
ab
 b
2
a
ab
|a|
a b
Задача. Вычислить длину окружности и площадь круга
одного и того же заданного радиуса R.
Домашнее задание
Задачник 1
§ 4.4.1
стр. 218-222;
№ 1, 13, 28
Линейные алгоритмы
Домашнее задание Задачник 1
№ 28
стр. 225
Program treygol;
VAR x1, x2, x3, y1, y2, y3 :integer;
a, b, c:real;
Begin
Write (‘Введите: A(x1, y1), B(x2, y2), C(x3, y3)');
Readln (x1, y1, x2, y2, x3, y3);
a:= sqrt(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
b:= sqrt(((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)));
c:= sqrt(((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)));
Writeln ('P=',a+b+c :5 :1);
Writeln ('S=',sqrt((a+b+c)/2*((a+b+c)/2-a)*((a+b+c)/2- b)*((a+b+c)/2-c)):5 :1);
Readln
END.
Решение задач
Задача 1. Дано трёхзначное число. Найти сумму его цифр.
Решение задач
Задача 2. Дано трёхзначное число. Записать это число в
обратном порядке.
Задача 3. Дано трёхзначное число. Создать всевозможные числа,
образованные перестановкой цифр исходного числа.
Задача 4. С начала суток прошло n секунд. Определить, сколько
часов, минут и секунд прошло с начала суток.
Разбор задач домашнего задания
Задача 2. Дано трёхзначное число. Записать это число в
обратном порядке.
Var g :integer;
Begin
Readln (g);
g:= ((g mod 10) * (100)) + ((g mod 100 div 10) * 10) + (g div 100);
Writeln (g);
End.
Разбор задач домашнего задания
Задача 4. С начала суток прошло n секунд. Определить, сколько
часов, минут и секунд прошло с начала суток.
Uses crt;
Var C, h, m :integer;
Begin
clrscr;
write('Введите секунды: ');
Readln(C);
h:= C div 3600;
m:= C mod 3600 div 60;
C:= C mod 3600 mod 60;
Writeln (h,' час. ',m,' мин. ',C, ' сек.');
End.
Ветвление
Если <условие>
то <серия команд 1>
иначе <серия команд 2>
кон
If <условие>
then begin<операторы 1>end
else begin<операторы 2>end;
Программирование ветвлений
Задача 1. Найти наибольшее значение среди двух величин, вводимых с клавиатуры.
начало
ввод а,в,с
Да
Нет
a>b
max := a
max := b
вывод max
конец
Program Bid1;
Var
a,b,max : real;
Begin
write(‘a=‘); readln(a);
write(‘b=‘); readln(b);
If a > b
then max := a
else max := b;
writeln(‘max=‘,max:7:2);
readln
end.
Программирование ветвлений
Задача 2. Упорядочить значения двух переменных по возрастанию.
начало
ввод X, Y
Да
X>Y
C := X
X := Y
Y := C
вывод X, Y
конец
Program Sort2;
Var
X,Y,C : integer;
Begin
readln(X,Y);
If X > Y
then begin
C := X;
X := Y;
Y := C
end;
writeln(X,Y);
readln
end.
Программирование ветвлений
Задача 3. Найти наибольшее значение среди трех величин, вводимых с клавиатуры.
Вариант 1
Да
начало
начало
ввод а,в,с
ввод а,в,с
Да
a>b
max := a
Да
Вариант 2
max := b
c>max
Да
max := a
a>b
Да
a>с
max := c
max := b
max := c
вывод max
конец
вывод max
конец
b>c
max := c
Программирование ветвлений
Задача 3. Найти наибольшее значение среди трех величин, вводимых с клавиатуры.
Вариант 1
Program BIT1;
Var
a,b,c,max : real;
Begin
readln(a,b,c);
If a > b
then max := a
else max := b;
If c > max
then max := c;
writeln(‘max=‘,max:7:2);
readln
end.
Вариант 2
Program BIT2;
Var
a,b,c,max : real;
Begin
readln(a,b,c);
If a > b
then If a > c
then max := a
else max := c
else If b > c
then max := b
else max := c
writeln(‘max=‘,max:7:2);
readln
end.
Логические выражения в Паскале
Задача 3. Найти наибольшее значение среди трех величин, вводимых с клавиатуры.
Вариант 3
Program BIT3;
Var
a,b,c,max : real;
Begin
readln(a,b,c);
If (a >= b) and (a >= c)
then max := a;
If (b >= a) and (b >= c)
then max := b;
If (c >= a) and (c >= b)
then max := c;
writeln(‘max=‘,max:7:2);
readln
end.
Домашнее задание
Задачник 1
§ 4.4.2
Задача 1. Дано трёхзначное число. Определить, является ли оно
палиндромом.
Задача 2. Даны две точки А(X1,Y1) и B(X2,Y2). Определить, какая
из точек лежит ближе к началу координат.
Задача 3. Упорядочить значения трех целых чисел, вводимых с
клавиатуры, по возрастанию (a<b<c).
Задача 4. Решить уравнение вида: ax+b=0
Задача 5. Решить уравнение вида:
ax²+bx+c=0
Решение задач
Задача 4. Упорядочить значения трех целых чисел, вводимых с клавиатуры, по
возрастанию (a<b<c).
Program sort;
Var
a,b,c,x : integer;
Begin
readln(a,b,c); writeln(a:4,b:4,c:4);
If a > b
then begin x := a; a := b; b := x end;
If b > c
then begin x := b; b := c; c := x end;
If a > b
then begin x := a; a := b; b := x end;
writeln(a:4,b:4,c:4);
readln
end.
Решение задач
Задача 5. Определить, принадлежит ли точка Х отрезку [a;b].
Анализ решения задачи:
Х должна удовлетворять неравенству: (X>=a) и (X<=b)
Program z5;
Var
a,b,x : real;
Begin
readln(a,b);
write(‘x=’); readln(x);
If (x >= a) and (x <= b)
then writeln(‘yes’)
else writeln(‘no’);
readln
end.
Решение задач
Задача 6. Написать программу вычисления значения выражения: y=5/(a(a-9))
Анализ решения задачи:
Если знаменатель равен 0, то выражение не имеет действительного значения.
Program z6;
Var
a,y : real;
Begin
write(‘a=’); readln(a);
If (a = 0) or (a = 9)
then writeln(‘выражение не имеет действительного значения’)
else begin y:=5/(a(a-9)); writeln(‘y=’,y:5:2) end;
readln
end.
Решение задач
Задача 7. Решить уравнение вида: ax+b=0
Анализ решения задачи:
a, b – вводятся с клавиатуры, х – корень уравнения, выводится на монитор.
Математическая формализация:
Если а=0, то вывод «уравнение смысла не имеет», иначе x=-b/a
Program z7;
Var
a,b,x : real;
Begin
write(‘a=’); readln(a);
write(‘b=’); readln(b);
If (a = 0)
then writeln(‘уравнение смысла не имеет’)
else begin x=-b/a; writeln(‘x=’,x:7:2) end;
readln
end.
Худой или полный
Считается нормой если масса человека (в кг) равна его росту (в см) минус 100.
Будем считать человека стройным, если отклонение его массы от этого
критерия не превышает 5%, иначе полным или худым соответственно
отклонению от нормы.
Составить программу.
Входные данные: масса и рост – действительные числа.
Выходные данные: Текст – thin (худой), или optimum (нормальный), или fat
(полный)
Лягушка
Лягушка прыгает вдоль числовой оси от точки 0 до точки М, поворачивает и
прыгает обратно до точки 0, поворачивает и т.д. Длина прыжков 1. Какова её
координата K после N-го прыжка?
Входная информация: M, N.
Выходная информация: K
Оператор выбора
Решение задачи
Решение задачи
Самостоятельная работа
Порядковый номер дня в году
Вводятся число, месяц, год. Найти номер
этого дня с начала года. При решении
задачи учитывать разное количество дней в
месяце, в том числе в високосные годы.
Циклические алгоритмы
Цикл – многократное повторение последовательности
действий по некоторому условию.
a) Цикл с предусловием (цикл типа пока)
нет
Пока <условие> повторять
условие
нц
<тело цикла>
кц
While <условие> do
begin
<тело цикла>
да
Тело цикла
end;
Циклические алгоритмы
b) Цикл c параметром (цикл типа для)
Для <параметр цикла> повторять
For i:=1 to n do
нц
<тело цикла>
кц
Параметр
цикла
да
Тело цикла
нет
begin
<тело цикла>
end;
Циклические алгоритмы
c) Цикл с постусловием
Повторять
Repeat
Тело цикла
<тело цикла>
Выполнено условие?
кц
<тело цикла>
Until <условие>;
нет
условие
да
Решение задач (цикл типа пока)
Задача 1. Вычислить сумму натурального ряда чисел от
1 до N.
Program summa_1;
начало
Var i,N,S:integer;
Ввод N
begin
Write(‘N=‘);
i:=1
S:=0
Readln(N);
i:=1; S:=0;
While i<=N do
begin
нет
i<=N
да
S:=S+i
i:=i+1
S:=S+i;
i:=i+1
end;
Вывод S
Writeln(‘Summa=‘,S)
end.
конец
Решение задач (цикл типа пока)
Задача 1. Вычислить сумму натурального ряда чисел от
1 до N.
Program summa_1;
Var i,N,S:integer;
begin
N
i
S
4
1
0
i:=1; S:=0;
2
1
While i<=N do
3
3
4
6
5
10
Write(‘N=‘);
Readln(N);
begin
S:=S+I;
i:=i+1
end;
Writeln(‘Summa=‘,S)
end.
10
Решение задач (цикл типа для)
Задача 1. Вычислить сумму натурального ряда чисел от
1 до N.
начало
Program summa_2;
Ввод N
Var i,N,S:integer;
S:=0
begin
Write(‘N=‘);
Readln(N);
i:=1;N
да
S:=0;
for i:=1 to N do
S:=S+i
S:=S+i;
Writeln(‘Summa=‘,S)
end.
Вывод S
конец
нет
Решение задач
Задача 2. Дано N карточек, на которых написаны разные буквы.
Сколько различных N-буквенных слов можно составить из этих
карточек?
1. Анализ задачи
N – число целого типа, вводится с клавиатуры
F – искомое число целочисленного типа, которое выводится на экран монитора
2. Математическая формализация
Решение задач
Задача 2. Дано N карточек, на которых написаны разные буквы.
Сколько различных N-буквенных слов можно составить из этих
карточек?
начало
3. Построение
алгоритма:
Ввод N
F:=1
i:=1;N
да
F:=F*i
Вывод F
конец
Решение задач
Задача 2. Дано N карточек, на которых написаны разные буквы.
Сколько различных N-буквенных слов можно составить из этих
карточек?
4. Составление
программы:
Program Words;
Var i,N,F:integer;
begin
Write(‘N=‘); Readln(N);
F:=1;
for i:=1 to N do
F:=F*i;
Writeln(F)
end.
Алгоритм Евклида
Задача 3. Составить программу определения наибольшего
общего делителя (НОД) двух натуральных чисел.
1. Анализ задачи
M, N – число целого типа, вводится с клавиатуры
NOD – искомое число целочисленного типа, которое выводится на экран
монитора
2. Математическая формализация
Если M>N, то НОД(M, N) = НОД(M-N, N)
НОД(N, N) = N
M
32
8
8
8
N
24
24
16
8
Алгоритм Евклида
Задача 2. Составить программу определения наибольшего
общего делителя (НОД) двух натуральных чисел.
Алгоритм Евклида
Задача 2. Составить программу определения наибольшего
общего делителя (НОД) двух натуральных чисел.
Домашнее задание
Задачник 1
§ 4.4.3
Задача 1. Для различных вводимых с клавиатуры целых чисел найдите
сумму положительных четных
Задача 2. Написать программу вычисления среднего арифметического n
слагаемых вида: x + i
где x – данное число а i меняется от 1 до n
Задача 3. Написать программу вычисления произведения n слагаемых вида
n - k
где n – данное число а k меняется от 0 до n - 1
Задача 4. Одноклеточная амеба каждые 3 часа делится на 2 клетки
Определить сколько амеб будет через N часов при условии что N – кратна 3
Повторение пройденного материала
«Плоскость»
Даны действительные числа x, y (x*y<>0.). Необходимо
определить расположение точки с координатами (x, y) на
координатной плоскости и вывести на печать номер четверти
координатной плоскости, в которой находится эта точка.
В решении задачи необходимо предусмотреть фильтр,
отсекающий нулевые значения: (x<>0) and (y<>0).
Логические условия для определения расположения точки на
координатной плоскости:
if (x>0) and (y>0) then p:=1;
if (x<0) and (y>0) then p:=2;
if (x<0) and (y<0) then p:=3;
if (x>0) and (y<0) then p:=4;
Разбор олимпиадных задач
«Простые» числа
Дан набор различных натуральных чисел. Будем называть число
«простым для заданного набора», если число не делится ни на одно
из чисел набора, кроме самого себя.
Вводится целое число N (1<=N<=100)– количество чисел в наборе
и N различных целых чисел от 1 до 1000000, разделенных пробелами.
Вывести «простые для заданного набора» числа, разделяя числа
одним пробелом. Числа выводятся в том порядке, в котором они
вводились с клавиатуры.
«Простые» числа (решение)
var
N,i,j:integer;
A:array [1..100] of longint;
flg:boolean;
begin
read(N);
for i:=1 to N do
read(A[i]);
for i:=1 to N do
begin
flg:=true;
for j:=1 to N do
if (i<>j) and (A[i] mod A[j]=0)
then flg:=false;
if flg
then write(A[i]);
end;
end.
Разбор олимпиадных задач
«Иван - царевич»
Было у царя три сына. Двоих царь удачно женил на боярской да
купеческой дочерях, а с младшим Иваном всё никак не ладилось. То в болоте
стрела увязнет, а то и вовсе у лягушки окажется. Пока царевич эту стрелу
отыщет, время-то бежит. Царь-то пока сын стрелы ищет, успел и науки всякие
изучить и решил применить научный подход к поиску невесты сыну. Сказал он
ему теперь пускать за один-то раз не одну стрелу, а сразу несколько. При этом
царь задавал сыну следующие условия: Первую-то стрелу можно
пускать куда глаза глядят, а вот последующие стрелы должны
отклоняться от первоначального направления строго на заданный
царем угол отклонения стрелы (0<α<180). При этом для экономии
стрел царь категорически запретил Ивану-царевичу пускать стрелы
повторно в одном и том же направлении.
Написать программу, которая по заданному царем углу отклонения
стрелы определит максимальное количество стрел, которые может пустить
Иван-царевич за один раз, соблюдая требования царя.
«Иван - царевич» (решение)
var
i,k,ugol,b: integer;
strela: array[0..359] of integer;
begin
readln (ugol);
strela[0]:= 1;
b:=ugol;
while strela[ugol] = 0 do
begin
strela[ugol]:= 1;
ugol:= (ugol+ b) mod 360;
end;
k:= 0;
for i:=0 to 359 do
begin
if strela[i]=1 then k:=k+1;
end;
writeln(k);
end.
Решение задач
В интервале [2,n] найти натуральное число с максимальной
суммой делителей.
Домашнее задание
Задачник 1
§ 4.4.3
Задача 1. Определить, является ли число, введенное с клавиатуры
простым.
Задача 2. Найти все простые числа в интервале от M до N.
Задача 3. Подсчитать количество нечетных цифр в записи натурального
числа N.
Решение задач
Задача 1. Определить, является ли число, введенное с
клавиатуры простым.
program prost;
var
i,n,s:integer;
begin
read(n);
s:=0;
for i:=1 to n do
if n mod i=0
then s:=s+i;
if s=(n+1)
then writeln('n-простое число')
else writeln('n не является простым числом');
end.
Решение задач
Задача 1. Определить, является ли число, введенное с
клавиатуры простым.
program prostch;
var a, i, s: integer;
begin
write ('введите число и программа определит является ли оно простым: ');
readln (a);
s:= 0;
for i:= 1 to a div 2 do
if a mod i=0
then s:=s+i;
if s=1
then writeln ('является')
else writeln ('не является');
end.
Решение задач
Задача 2. Найти все простые числа в интервале от M до N.
program interval;
var M, N, s,i,k: integer;
begin
write ('введите начальную и конечную координату интервала
(через пробел) и программа найдет все числа на этом интервале: ');
readln (M,N);
For i:=M to N do
begin
s:=0;
for k:= 1 to i div 2 do
if i mod k =0
then s:=s+k;
if s=1
then write (i,', ');
end;
end.
Решение задач
Задача 3. Подсчитать количество нечетных цифр в записи натурального
числа N.
program nechet;
var a,s:integer;
begin
writeln('введите число и программа определит сколько в нем
нечетных цифр');
readln(a);
while a>0 do
begin
if (a mod 10) mod 2 > 0
then s:=s+1;
a:=a div 10;
end;
write ('количество нечетных цифр: ',s);
end.
Решение задач
Задача 1. Вычислить сумму первых n элементов знакочередующегося
степенного ряда:
2
3
n
x x
x
n x
S  1     ...  (1)
1! 2! 3!
n!
Решение задач
Задача 2. Определить, существует ли натуральное четырехзначное
число, равное четвертой степени суммы своих цифр.
Задача 3. Вывести все числа Фибоначчи, не превосходящие заданного
числа N.
(числа Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, 34 . . .)
Задача 4. «Быстрое возведение в степень»
При возведении числа в степень только с помощью операции
умножения, ее можно использовать минимальное количество раз.
Например, чтобы вычислить число a в десятой степени, можно найти
a*a*a*a*a*a*a*a*a*a (9 умножений) или найти b=a*a*a (a3), c=b*b*b (a9),
d=c*a (a10) (5 умножений).
Для заданного показателя степени найти минимальное количество
необходимых умножений.
Решение задач
Задача 1. Определить, существует ли натуральное четырехзначное
число, равное четвертой степени суммы своих цифр.
program chlo;
var s,a1,a2,a3,a4,i: integer;
begin
s:=0;
write ('четырехзначное число, равное 4 степени суммы своих цифр - ');
for i:=1000 to 9999 do
begin
a1:= i div 1000;
a2:= i mod 1000 div 100;
a3:= i mod 100 div 10;
a4:= i mod 10;
if (sqr(a1+a2+a3+a4)*sqr(a1+a2+a3+a4))=i
then begin s:=s+1; writeln (i) end;
end;
if s=0
then write ('не существует');
end.
Решение задач
Задача 2. Вывести все числа Фибоначчи, не превосходящие заданного
числа N.
(числа Фибоначчи: 1, 1, 2, 3, 5, 8, 13, 21, 34 . . .)
program fibonachi;
var
F0,F1,n,x: integer;
begin
readln(n);
F0:=1; write(F0, ' ');
F1:=1;
while F1 <= n do
begin
x := F0;
F0 := F1; write(F0, ' ');
F1 := x + F0;
end;
end.
Решение задач
Задача 3. «Быстрое возведение в степень»
При возведении числа в степень только с помощью операции
умножения, ее можно использовать минимальное количество раз.
Например, чтобы вычислить число a в десятой степени, можно найти
a*a*a*a*a*a*a*a*a*a (9 умножений) или найти b=a*a*a (a3), c=b*b*b (a9),
d=c*a (a10) (5 умножений).
Для заданного показателя степени найти минимальное количество
необходимых умножений.
Решение задач
program umnozh;
var n,k,s:integer;
begin
Write('n='); readln(n);
k := n; s := 0;
While k >= 1 do begin
If k mod 2 = 1
then k := k - 1
else k := k div 2;
s := s + 1 end;
Writeln(s)
end.
Домашнее задание
ЭОР
http://whiteschool.ru/
http://school-collection.edu.ru/
Информатика и ИКТ
- Цифровые (электронные) образовательные ресурсы
ЦОР к курсу И.Г.Семакина «Информатика и ИКТ», 9 класс
Глава 6
§ 39, 40
Практические работы № 23, 24, 25
http://school-collection.edu.ru/
Практическое задание №23
1 уровень сложности
1.
Разработать схему алгоритма, который запрашивает N
произвольных целых чисел и ищет их сумму. Число N вводится с
клавиатуры.
2.
Разработать схему алгоритма для вычисления суммы ряда:
S  1
1 1 1
1
   ... 
2 3 4
N
Число N вводится с клавиатуры.
3. Одноклеточная амёба каждые три часа делится на 2 клетки. Разработать
схему алгоритма для определения, сколько амёб будет через N час.
4. Дано натуральное число N и действительное число x. Разработать схему
алгоритма для вычисления суммы ряда:
sin x + sin 2x+sin 3x+…sin N*X
Протестировать алгоритм для x=1.5 и N=3. Проверить правильность
ответа на калькуляторе.
5. Разработать схему алгоритма для вычисления N-ой степени числа a (aN).
Протестировать алгоритм для а) a=3 и N=4, б) a=2 и N=5.
Практическое задание №23
2 уровень сложности
1. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый
день он увеличивал дневную норму на 10% нормы предыдущего дня. Какой
суммарный путь пробежит спортсмен за N дней? Разработать схему
алгоритма для решения этой задачи. Протестировать алгоритм для N=3 и
N=7.
2. Ежемесячная стипендия студента составляет A рублей в месяц, а
расходы на проживание превышают стипендию и составляют B рублей в
месяц. Рост цен ежемесячно увеличивает расходы на 3%. Разработать схему
алгоритма для расчёта необходимой суммы денег, которую надо
единовременно попросить у родителей, чтобы можно было прожить учебный
год (10 месяцев), используя только эти деньги и стипендию. Протестировать
алгоритм для следующих исходных данных:
а) A=1000, B=1100
б) A=900, B=1000
в) A=600, B=1200
3. Разработать схему алгоритма для нахождения всех делителей
натурального числа N. Протестировать алгоритм для N=10, N=75, N=99,
N=13.
Практическое задание №23
3 уровень сложности
1. Дано натуральное число N. Разработать схему алгоритма для
вычисления суммы ряда: S=1!+2!+3!+…+N! (N>1)
2. Покупатель должен заплатить в кассу S рублей. У него имеются монеты в
1, 2 и 5 рублей, а также купюры достоинством в 10, 50, 100 и 500 рублей
(достаточное количество). Сколько монет и купюр разного достоинства отдаст
покупатель, если он начинает платить с самых крупных? Операции
целочисленного деления (div и mod) использовать нельзя. Разработать схему
алгоритма для решения этой задачи.
3. Даны натуральное a и действительное x. Разработать схему алгоритма
для вычисления суммы ряда:
sin x+sin x²+sin x³+…+sin xª
Массивы
1. Одномерные массивы
2. Двумерные массивы
Одномерные массивы
Одномерный массив – пронумерованная конечная
последовательность однотипных величин a[i]
(a[1], a[2], … , a[i], … , a[n])
Ввод элементов одномерного массива с клавиатуры:
Program massiv;
Алг ввод массива
Const n=10;
Вещ таб a[1:10]
Цел i
нет
i:=1, 10
Нач
да
для i от 1 до 10 повторять
нц
вывод (“a[“,i,”]=“)
Ввод a[i]
Var a:array[1..n] of real;
i:integer;
Begin
For i:=1 to n do
begin
write(‘a[‘,i,’]=‘);
ввод (a[i])
readln(a[i])
кц
end
кон
End.
Вычисление суммы элементов
одномерного массива
Program sum;
Uses
s:=0;
For i:=1 to n do
s:=s+a[i];
writeln;
write(‘sum=‘,s);
readln
crt;
Const n=7;
Var
a:array[1..n] of real;
i:integer; s: real;
end.
Begin
clrscr;
For i:=1 to n do
begin
write(‘a[‘,i,’]=‘);
readln(a[i])
end;
Вычисление суммы элементов
одномерного массива (вариант 2)
Program sum;
Uses
crt;
Const n=7;
Var
a:array[1..n] of real;
i:integer;
s: real;
Begin
clrscr;
s:=0;
For i:=1 to n do
begin
write(‘a[‘,i,’]=‘);
s:=s+a[i];
end;
writeln;
write(‘sum=‘,s); readln
end.
readln(a[i]);
Нахождение наибольшего элемента
одномерного массива
(массив сформирован случайным образом из чисел в диапазоне от 0 до 9)
Program maximum;
Uses
max:=a[1];
For i:=2 to n do
if max < a[i]
then max := a[i];
write(‘max=‘,max);
readln
crt;
Const n=10;
Var
a:array[1..n] of integer;
max, i : integer;
end.
Begin
clrscr; randomize;
For i:=1 to n do begin
a[i] := random(10);
write(a[i]:3) end;
writeln;
Нахождение порядкового номера наибольшего
элемента одномерного массива
(массив сформирован случайным образом из чисел в диапазоне от 0 до 9)
Program maximum;
Uses
max:=a[1];
For i:=2 to n do
if max < a[i]
then kmax := i;
write(‘kmax=‘,kmax);
readln
crt;
Const n=10;
Var
a:array[1..n] of integer;
max, kmax, i : integer;
end.
Begin
clrscr; randomize;
For i:=1 to n do begin
a[i] := random(10);
write(a[i]:3) end;
writeln;
Решение задач
Задача 1. В массиве, сформированном из вещественных чисел, вводимых с
клавиатуры, найти некоторое число (его порядковый номер). Если чисел
несколько, то вывести порядковый номер последнего найденного числа.
Задача 2. Массив сформирован случайным образом из целых чисел в диапазоне
от 0 до 10. Определить, входит ли число X в массив и какое количество раз.
Задача 3. Массив сформирован случайным образом из целых чисел в диапазоне
от -10 до 10. Определить, входит ли число X в массив и какое количество раз.
Поиск элемента в массиве
Задача 1. В массиве, сформированном из вещественных чисел, вводимых с
клавиатуры, найти некоторое число (его порядковый номер). Если чисел
несколько, то вывести порядковый номер последнего найденного числа.
write(‘X=‘); readln(x);
m:=0;
For i:=1 to n do
if x = a[i]
then m := i;
if m = 0
then writeln(‘No‘)
else writeln(m)
readln
Program poisk;
Uses
crt;
Const n=10;
Var
a:array[1..n] of real;
x:real; m,i:integer;
Begin
clrscr;
end.
For i:=1 to n do
begin
write(‘a[‘,i,’]=‘);
readln(a[i])
end;
Поиск элемента в массиве
Задача 2. Массив сформирован случайным образом из целых чисел в диапазоне
от -10 до 10. Определить, входит ли число X в массив и какое количество раз.
write(‘X=‘); readln(x);
m:=0;
For i:=1 to n do
if x = a[i]
then m := m+1;
if m = 0
then writeln(‘No‘)
else writeln(‘m=‘,m);
readln
Program poisk;
Uses
crt;
Const n=10;
Var
a:array[1..n] of integer;
x,m,i:integer;
Begin
clrscr; randomize;
For i:=1 to n do
begin
a[i] := random(21)-10;
write(a[i]:3)
end;
writeln;
end.
Сортировка массива
A[1]
A[2]
A[3]
…
…
A[i]
A[n-1]
1 цикл
A[1] сравнивается с A[2], A[3] … A[i], … A[n]
2 цикл
A[2] сравнивается с A[3], A[4] … A[i], … A[n]
……………………………………………………………………………
i цикл
A[i] сравнивается с A[i+1], A[i+2] … A[n]
j
J+1
For i:=1 to n-1 do
For j:=i+1 to n do
if A[i] > A[j]
then begin C := A[i];
A[i] := A[j];
A[j] := C end;
A[n]
Сортировка массива
Задача 3. Массив сформирован случайным образом из целых чисел в диапазоне
от 0 до 10. Отсортировать его элементы в порядке возрастания значений.
Program sort;
Uses
crt;
Const n=10
Var
a:array[1..n] of integer;
c,i:integer;
Begin
clrscr; randomize;
For i:=1 to n do
begin
a[i] := random(10);
write(a[i]:3)
end;
writeln;
For i:=1 to n-1 do
For j:=i+1 to n do
if a[i] > a[j]
then begin c := a[i];
a[i] := a[j];
a[j] := c end;
For i:=1 to n do
write(a[i]:3);
readln
end.
Задания для практической работы
Задача 1. Вычислить среднегодовую температуру по
известным среднемесячным значениям.
Задача 2. Для каждого месяца определить и вывести на
экран отклонение его средней температуры от
среднегодовой величины.
Задача 3. Написать программу получения из заданного
целочисленного массива размером 10 элементов,
сформированном случайным образом из элементов в
диапазоне от -10 до +10, другого массива, который
будет содержать модули значений элементов первого
массива (не используя специальной функции,
вычисляющей модуль числа) и отсортировать его в
порядке убывания.
Задание для практической работы
Задача 4. Дан целочисленный массив из 30 элементов.
Элементы массива могут принимать целые значения от 0 до 100 – баллы
учащихся выпускного класса за итоговый тест по информатике. Для
получения положительной оценки за тест требовалось набрать не менее
20 баллов. Напишите программу, которая позволяет найти и вывести
минимальный балл среди учащихся, получивших за тест положительную
оценку. Известно, что в классе хотя бы один учащийся получил за тест
положительную оценку.
Исходные данные объявлены так, как показано ниже. Запрещается
использовать переменные, не описанные ниже, но разрешается не
использовать часть из них.
Решение задачи 1
Задача 4. Вычислить среднегодовую температуру по известным
среднемесячным значениям.
T [1], T [2], … , T [i], … , T [12]
– среднемесячные значения температур, которые вводятся с клавиатуры (массив
переменных величин вещественного типа, вводимый с клавиатуры посредством цикла)
Tsred – среднегодовое значение температуры
(переменная величина вещественного типа)
Для того, чтобы получить среднегодовое значение температуры, необходимо найти
сумму среднемесячных значений температуры, полученный результат разделить на 12.
Чтобы сэкономить ячейки памяти компьютера, в ячейке Tsred первоначально будем
хранить значение суммы ежемесячных температур.
Построим алгоритм решения данной задачи в виде блок-схемы:
Решение задачи
начало
Program temperature;
i:=1; 12
Ввод T[i]
Var T: array[1..12] of real;
i: integer; Tsred: real;
Begin
For i:=1 to 12 do
Tsred:=0
begin
write(‘T[‘,i,’]=‘); readln(T[i])
i:=1; 12
end;
Tsred:=Tsred+T[i];
Tsred:=0;
For i:=1 to 12 do
Tsred:=Tsred+T[i];
Tsred:=Tsred/12
Tsred:=Tsred/12;
writeln(‘Tsred = ‘,Tsred:6:2)
Вывод Tsred
конец
End.
Задание для практической работы
Задача 5. Дан целочисленный массив из 10 элементов. Элементы
массива могут принимать значения от 0 до 1000. Напишите программу,
которая позволяет подсчитать и вывести среднее арифметическое
элементов массива, имеющих нечетное значение. Гарантируется, что в
исходном массиве хотя бы один элемент имеет нечетное значение.
Исходные данные объявлены так, как показано ниже.
Запрещается использовать переменные, не описанные ниже, но
разрешается не использовать часть из них.
const
N=10;
var
a: array [1..N] of integer;
i, x, y: integer;
s: real;
Задание для практической работы
Задача 6. Дан целочисленный массив из 10 элементов. Элементы
массива могут принимать значения от 0 до 1000.
Напишите программу, которая позволяет подсчитать и вывести
минимальное значение среди элементов массива, которые имеют
чётное значение и не делятся на три. Гарантируется, что в исходном
массиве есть хотя бы один элемент, значение которого чётно и не кратно
трем. Исходные данные объявлены так, как показано ниже.
Запрещается использовать переменные, не описанные ниже, но
разрешается не использовать часть из них.
const
N=10;
var
a: array [1..N] of integer;
i, j, min: integer;
Задание для практической работы
Задача 7. Дан целочисленный массив из 10 элементов. Элементы
массива могут принимать значения от 0 до 1000.
Напишите программу, которая позволяет подсчитать и вывести
произведение элементов массива, которые имеют нечётное значение и
делятся на 3. Гарантируется, что в исходном массиве есть хотя бы один
элемент, значение которого нечётно и кратно 3.
Исходные данные объявлены так, как показано ниже.
Запрещается использовать переменные, не описанные ниже, но
разрешается не использовать часть из них.
const
N=10;
var
a: array [1..N] of integer;
i, j, p: integer;
Задания для практической работы
Задача 8. В заданном одномерном массиве поменять местами
соседние элементы, стоящие на чётных местах, с элементами стоящими
на нечетных.
Задача 9. Определить, является ли одномерный массив монотонно
убывающим или монотонно возрастающим.
Задача 10. Число является простым для данного диапазона, если
оно не делится ни на одно из чисел этого диапазона. Найти все простые
для данного диапазона [a, b] числа, входящие в массив. Массив
формируется случайным образом.
Решения задач
Задача 8. В заданном одномерном массиве поменять
местами соседние элементы, стоящие на чётных местах,
с элементами стоящими на нечетных.
uses crt;
const n=10;
var
a:array[1..n] of integer;
i,c:integer;
begin
clrscr; begin
for i:=1 to n do
read(a[i]);
end;
writeln;
for i:=1 to n do
begin
if i mod 2=0 then begin
c:=a[i];
a[i]:=a[i-1];
a[i-1]:=c end;
end;
for I:=1 to n do
write(a[i]:3);
end.
Решения задач
Задача 8. В заданном одномерном массиве поменять
местами соседние элементы, стоящие на чётных местах,
с элементами стоящими на нечетных.
uses crt;
const n=10;
var
a:array[1..n] of integer;
i,c:integer;
begin
clrscr; begin
for i:=1 to n do
read(a[i]);
end;
writeln;
for i:=1 to n div 2 do
begin
write(a[i*2]:2);
write(a[i*2-1]:2)
end;
end.
Решения задач
Задача 9. Определить, является ли одномерный массив
монотонно убывающим или монотонно возрастающим.
c:=0; k:=0;
for i:=1 to n-1 do begin
if a[i]>a[i+1] then c:=c+1;
if a[i]<a[i+1] then k:=k+1; end;
if k=n-1 then write('массив монотонно возрастающий');
if c=n-1 then write('массив монотонно убывающий');
if (k<>n-1) or (c<>n-1)
then write('массив не является монотонно убывающим или возрастающим');
end.
Решения задач
Задача 9. Определить, является ли одномерный массив
монотонно убывающим или монотонно возрастающим.
f:=0;
for i:=2 to n do
if a[i]>a[i-1] then f:=f+1;
if f=0 then write ('массив монотонно убывающий');
if f=n-1 then write ('массив монотонно возрастающий');
end.
Решения задач
Задача 10. Число является простым для данного диапазона, если
оно не делится ни на одно из чисел этого диапазона. Найти все простые
для данного диапазона [a, b] числа, входящие в массив. Массив
формируется случайным образом. (a>0; b>0; a<b)
var m:array[1..n] of integer;
i,f,a,b:integer; g,l:boolean;
begin
randomize;
g:=false;
writeln('задайте диапазон');
readln(a,b);
for i:= 1 to n do begin
m[i]:=random(b-a+1)+a;
write(m[i]:3)
end;
writeln;
for i :=1 to n do
begin
l:=true;
for f:=1 to n do
if (f<>i) and (m[f]<>0) then
if m[i] mod m[f]=0 then l:=false;
if l then begin
write(m[i]:3);
g:=true end;
end;
if g=false then write('таких чисел нет');
end.
Двумерные массивы (таблицы)
Таблица B, состоящая из n строк и m столбцов, называется
двумерным массивом размерностью [n,m]:
b[1,1]
b[1,2]
…
b[1,j] …
b[1,m]
b[2,1]
b[2,2]
…
b[2,j] …
b[2,m]
…
…
…
…
…
…
b[i,1]
b[i,2]
…
b[i,j]
…
b[i,m]
…
…
…
…
…
…
b[n,1]
b[n,2]
…
b[n,j] …
b[n,m]
Двумерные массивы (таблицы)
Формирование
элементов двумерного
массива, размером 3Х4
из целых чисел в
диапазоне от 0 до 9:
Program mas2;
Uses
Const n=3; m=4;
Var
нач
crt;
b:array[1..n,1..m] of integer;
i,j:integer;
Begin
clrscr; randomize;
i:=1,n
For i:=1 to n do
begin
j:=1,m
For j:=1 to m do begin
b[i,j] := random(10);
b[i,j] := random(10);
write(b[i,j]:3) end;
вывод b[i,j]
writeln
end;
end.
Двумерные массивы (таблицы)
Задача 1. Найти наибольшие элементы каждой строки таблицы.
Массив результатов:
Пусть дана таблица:
b[1,1]
b[1,2]
…
b[1,j]
a[1]
b[2,1]
b[2,2]
…
b[2,j]
a[2]
…
…
…
…
…
b[i,1]
b[i,2]
…
b[i,j]
a[i]
Задача 1. Найти наибольшие элементы каждой строки таблицы.
Program max2;
For i:=1 to n do
Uses
begin
crt;
Const n=3; m=4;
a[i]:=b[i,1];
Var
For j:=2 to m do
b:array[1..n,1..m] of integer;
a:array[1..n] of integer; i,j:integer;
if a[i]<b[i,j]
Begin
then a[i]:=b[i,j]
clrscr; randomize;
end;
For i:=1 to n do
For i:=1 to n do
begin
writeln(a[i,j])
For j:=1 to m do begin
b[i,j] := random(10);
write(b[i,j]:3) end;
writeln
end;
end.
Двумерные массивы (таблицы)
Задача 2. Найти сумму элементов столбцов таблицы.
Пусть дана таблица:
Массив результатов:
b[1,1]
b[1,2]
…
b[1,j]
b[2,1]
b[2,2]
…
b[2,j]
…
…
…
…
b[i,1]
b[i,2]
…
b[i,j]
s[1]
s[2]
…
s[j]
Задача 2. Найти сумму элементов столбцов таблицы
(массив вещественных чисел вводится с клавиатуры)
Program max2;
For j:=1 to m do
Uses
begin
crt;
Const n=3; m=4;
s[j]:=0;
Var
For i:=1 to n do
b:array[1..n,1..m] of real;
s:array[1..m] of real; i,j:integer;
Begin
s[j]:=s[j]+b[i,j]
end;
clrscr;
For j:=1 to m do
For i:=1 to n do
write(s[j]:6:2)
begin
end.
For j:=1 to m do
read(b[i,j]);
writeln
end;
Задания для практической работы
Задача 3. Найти минимальные значения столбцов
таблицы.
Задача 4. Найти средние арифметические значения
элементов строк двумерного массива.
Задача 5. Вычислить сумму элементов главной
диагонали квадратной матрицы.
Задача 6. Определить, является ли данная квадратная
матрица магическим квадратом (элементы квадратной
матрицы, целые числа, вводятся с клавиатуры)
Решения задач
Задача 3. Найти минимальные значения столбцов
таблицы.
for j:=1 to m do
begin
a[j]:=b[1,j];
for i:=2 to n do
if a[j] > b[i,j] then a[j]:=b[i,j];
writeln ('мин. ',j,' столбца: ',a[j]:3)
end;
Решения задач
Задача 4. Найти средние арифметические значения
элементов строк двумерного массива.
for i:=1 to n do
begin
a[i]:=0;
for j:=1 to m do
a[i]:=a[i]+b[i,j];
a[i]:=a[i]/m;
writeln ('ср.ариф. ',i,' строки: ',a[i]:3:2)
end;
Решения задач
Задача 5. Вычислить сумму элементов главной
диагонали квадратной матрицы.
S:=0;
for i:=1 to n do
S:=S+b[i,i];
writeln ('сумма элементов главной диагонали = ',S);
Решения задач
Задача 6. Определить, является ли данная квадратная
матрица магическим квадратом (элементы квадратной
матрицы, целые числа, вводятся с клавиатуры)
f:=true;
for i:=1 to n do
begin
a[i]:=0;
for j:=1 to m do
a[i]:=a[i]+b[i,j];
end;
for i:=2 to n do
if a[i-1]<>a[i] then f:=false;
for j:=1 to m do
begin
a[j]:=0;
for i:=1 to n do
a[j]:=a[j]+b[i,j];
end;
for j:=2 to m do
if a[j-1] <> a[j] then f:=false;
d1:=0;d2:=0;
for i:=1 to n do
begin
d1:=d1+b[i,i];
d2:=d2+b[n+1-i,i]
end;
if d1<>d2 then f:=false;
if f then writeln('массив ЯВЛЯЕТСЯ магич.кв.')
else writeln('массив НЕ ЯВЛЯЕТСЯ магич.кв.');
Двумерные массивы (таблицы)
Задача 3. Переставить местами две строки в таблице.
Пусть дана таблица:
K–
L–
b[1,1]
b[1,2]
b[1,3]
b[1,4]
b[2,1]
b[2,2]
b[2,3]
b[2,4]
b[3,1]
b[3,2]
b[3,3]
b[3,4]
b[4,1]
b[4,2]
b[4,3]
b[4,4]
Перестановка строк двумерного массива
Program Obmen2;
write(‘k=‘); readln(k);
Uses
write(‘L=‘); readln(L);
crt;
Const n=4; m=4;
For j:=1 to m do
Var
begin
b:array[1..n,1..m] of real;
c:real;
i,j,k,L:integer;
Begin
c:=b[k,j];
b[k,j]:=b[L,j];
clrscr; randomize;
For i:=1 to n do
begin
For j:=1 to m do begin
b[i,j] := random(10);
write(b[i,j]:3) end;
writeln
end;
b[L,j]:=c;
end;
For i:=1 to n do
begin
For j:=1 to m do
write(b[i,j]:3);
writeln
end;
end.
Задания для практической работы
Задача 7. В таблице найти строку с наибольшей и
наименьшей суммой элементов. Вывести на экран
найденные строки.
Задача 8. Сформировать одномерный массив,
элементами которого являются строчные суммы
всех четных положительных элементов заданной
таблицы, состоящей из целых положительных и
отрицательных чисел.
Задача 9. Дана таблица, состоящая из натуральных
чисел. Определить количество «особых» элементов
массива, считая его элемент особым, если он
больше суммы остальных элементов его столбца.
Разбор задач
Задача 7. В таблице найти строку с наибольшей и наименьшей
суммой элементов. Вывести на экран найденные строки.
const n=6;m=4;
var b:array [1..n,1..m] of
integer;
a:array [1..n] of integer;
i,j,min,max,mini,maxi:integer;
begin
randomize;
for i:=1 to n do
begin
a[i]:=0;
for j:=1 to m do
begin
b[i,j]:=random(101);
write(b[i,j]:3);
a[i]:=a[i] + b[i,j];
end;
writeln
end;
min:=a[i];max:=0;
mini:=1;maxi:=1;
for i:= 1 to n do
begin
if a[i]>max then begin maxi:=i;max:=a[i] end;
if a[i]<min then begin mini:=i;min:=a[i] end;
end;
write('наиб. сумма элементов в ',maxi,' строке: ');
for j:=1 to m do
write(b[maxi,j]:3);
writeln;
write('наим. сумма элементов в ',mini,' строке: ');
for j:=1 to m do
write(b[mini,j]:3);
writeln;
end.
Разбор задач
Задача 8. Сформировать одномерный массив, элементами которого
являются строчные суммы всех четных положительных
элементов заданной таблицы, состоящей из целых
положительных и отрицательных чисел.
for i:=1 to n do
begin
a[i]:=0;
for j:=1 to m do
begin
b[i,j]:=random(201)-100;
write(b[i,j]:4);
if (b[i,j] >=0) and (b[i,j] mod 2 = 0)
Then a[i]:=a[i] + b[i,j];
end;
writeln
end;
for i:=1 to n do
writeln(a[i]);
end.
Разбор задач
Задача 9. Дана таблица, состоящая из натуральных чисел.
Определить количество «особых» элементов массива, считая его
элемент особым, если он больше суммы остальных элементов его
столбца.
var b:array [1..n,1..m] of
integer;
a:array [1..m] of integer;
s:array [1..m] of integer;
i,j,b:integer;
begin
clrscr;randomize;
for i:=1 to n do
begin
for j:=1 to m do
begin
b[i,j]:=random(101);
write(b[i,j]:3);
end;
writeln
end;
for j:=1 to m do
begin
a[j]:=0;
for i:=1 to n do
a[j]:=a[j]+b[i,j];
end; b:=0;
for i:=1 to n do
for j:=1 to m do
if b[i,j] > (a[j]-b[i,j])
then begin inc(b); s[b]:=b[i,j] end;
writeln('кол-во особых элементов: ',b);
if b>0 then begin
write('особые эл-ты: ');
for j:=1 to o do
write(s[j]:3 end;
end.
Разбор задач районного конкурса
ПиИТ (27.02.2013)
Задача Перевод чисел из десятичной системы в
систему счисления с основанием N (2<=N<=9).
i:=0; v:=X;
While v>0 do
begin
inc(i);
a[i]:=v mod N;
v:=v div N
end;
for j:=i downto 1 do
write (a[j]);
program perevod;
uses crt;
var
a:array [1..100] of integer;
i,j,v,N,X:integer;
begin
clrscr;
ReadLn(X);
ReadLn(N);
end.
Разбор задач районного конкурса
ПиИТ
Задача №1 «Система счисления с максимальной
суммой цифр»
Дано натуральное число N. Найти систему счисления
с основанием k=2..16 с наибольшей суммой цифр
(суммы цифр рассматривается в десятеричной арифметике) в
представлении числа N.
Если систем счисления с таким максимальным
свойством несколько, то вывести все значения
оснований с таким максимальным свойством.
Задача №1 «Система счисления с максимальной
суммой цифр»
program olimp1;
uses crt;
var i:array [2..16] of integer;
o:array [1..16] of integer;
n,k,v,s,j:integer;
begin
clrscr;
readln(n);
for k:=2 to 16 do
begin
i[k]:=0;v:=n;
while v>0 do
begin
i[k]:=i[k] + v mod k;
v:=v div k
end;
end;
s:=0;j:=0;
for k:=2 to 16 do
if i[k]>s
then s:=i[k];
for k:=2 to 16 do
if i[k] = s then
begin
inc(j);
o[j]:=k
end;
write('основания ');
for k:=1 to j do
write(o[k]:3);
writeln(' сумма ',s);
end.
Разбор задач районного конкурса ПиИТ
Задача №2 «Фибоначчиева система счисления»
Теорема Цекендорфа утверждает, что любое натуральное число n
можно представить единственным образом в виде суммы чисел
Фибоначчи:
где k1 >= k2+2, k2 >= k3+2, ... , kr >= 2
Отсюда следует, что любое число можно однозначно записать в
фибоначчиевой системе счисления, например:
Перевод числа в фибоначчиеву систему счисления осуществляется
простым "жадным" алгоритмом: просто перебираем числа Фибоначчи
от больших к меньшим и, если некоторое
, то
входит в
запись числа , и мы отнимаем от и продолжаем поиск.
Надо написать программу для перевода натурального числа N в
фибоначчиеву систему счисления.
Разбор задач районного конкурса ПиИТ
Число
Запись
в ФСС
0
0……0
F2=1
1
F3=2
10
F4=3
100
4
101
F5=5
1000
6
1001
7
1010
F6=8
10000
Задача №1 «Фибоначчиева система счисления»
program bif;
uses crt;
var a,b,c,j,n,i:longint;
f:array [1..100] of longint;
ind:array [1..100] of integer;
begin
clrscr;
write ('chislo'); readln(n);
f[1]:=1; f[2]:=2;
for j:=1 to i do ind[j]:=0 ;
b:=i; a:=n;
while a>0 do
begin
while a< f[b] do
b:=b-1;
ind[b]:=1;
a:=a-f[b];
end;
write ('cod Fibonacchi=');
for j:=i-1 downto 1 do
write (ind[j]);
i:=2;
while f[i]<=n do
begin
i:=i+1;
f[i]:=f[i-1]+f[i-2];
end;
end.
Разбор задач районного конкурса ПиИТ
Задача №3 «Криптографические ключи»
Недавно одна компания “X” разработала принципиально новый
алгоритм шифрования данных, который практически невозможно взломать,
но и одновременно абсолютно не ресурсоемкий. Все шифрование строится
на симметричном K-ключе, то есть на числе, в двоичной записи которого
ровно K единиц. Все принципиальное отличие от предыдущих алгоритмов
заключалось в том, что ключ не был одним и тем же на все время
соединения, а менялся после некоторых определенных интервалов
времени на другой K-ключ. Также одной из особенностей разработанного
алгоритма была необходимость того, чтобы каждый следующее число,
соответствующее K-ключу, было больше предыдущего. Более того,
специалисты компании установили, что для увеличения
помехоустойчивости разница между следующим K-ключом и предыдущим
K-ключом должна быть минимальна. Под разницей K-ключей понимается
абсолютная разница соответствующих им чисел.
Вы работаете в этой компании, и Вам предстоит разработать алгоритм
получения из исходного K-ключа следующего K-ключа в соответствии со
всеми описанными выше требованиями.
Задача №3 «Криптографические ключи»
Uses crt;
var
x,v,sum,summa : integer;
begin
clrscr;
writeln('Vvodim chislo');
ReadLn(x);
v:=x; sum:=0 ;
While v>0 do
begin
sum:=sum+v mod 2;
v:=v div 2
end;
summa:=sum;
repeat
x:=x+1;
sum:=0;
v:=x;
While v>0 do
begin
sum:=sum+v mod 2;
v:=v div 2;
end;
until summa=sum;
writeln(x);
end.
Символьные переменные
Один символ занимает один байт памяти
Var
X:char;
Var
a:array[1..50] of char;
Ввод символьного массива:
For i:=1 to n do
read(a[i])
Символьные переменные
Задача 1: Слово, заданное как массив символов, записать в
обратном порядке.
Program z1;
a[1]
а[2]
…
а[i]
…
a[n-1]
a[n]
Const n=15
b[1]
b[2]
…
b[i]
…
b[n-1]
b[n]
Var
Для изменения индексов
массива используется формула:
a,b:array[1..n] of char;
i:integer;
Begin
For i:=1 to n do
n–i+1
begin
read(a[i]);
b[n-i+1]:=a[i]
end;
For i:=1 to n do
write(b[i])
End.
Строки в Паскале
Строка – ограниченная апострофами последовательность символов
Длина строки – 255 символов
Var
X:string[20];
Операции над строками
1. Объединение строк
Var
X,Y,Z:string[10];
Begin
X := ’тепло’;
Y := ’ход’;
Z := X + Y;
write(Z)
end.
Операции над строками
2. Сравнение строк
a + b <> b + a
1. Цифры
‘not’ > ‘no’
2. Латинские буквы (заглавные)
‘nod’ > ‘don’
3. Латинские буквы (строчные)
‘Nod’ < ‘nod’
4. Русские буквы (заглавные)
‘Дон’ > ‘Don’
5. Русские буквы (строчные)
‘Дон’ < ‘дон’
Операции над строками
2. Присваивание
Var
Z:string[5];
Begin
Z := ’гор’ + ’ода’;
write(Z)
end.
город
Строковые функции
1. Длина строки
Length (строковое выражение) – количество символов в строке
Var
Z:string[10];
Begin
Z := ’гор’ + ’ода’;
k := length(z);
write(k)
end.
Строковые функции
2. Копирование строки или ее части (вырезка)
copy (строковое выражение, начальный номер символа, количество символов)
Copy(‘информатика’,3,5)
‘форма‘
Строковые функции
2. Копирование строки или ее части (вырезка)
Задача 2. Записать исходное слово наоборот.
Program z2;
Var
x,y:string[10];
i:integer;
Begin
readln(x);
y:=‘ ‘;
For i:=1 to length(x) do
y := Copy(x,i,1)+y;
write(y)
End.
Строковые функции
3. Поиск подстроки в строке
pos (подстрока, исходная строка) – номер символа в исходной строке
pos(x,T)
Строковые функции
4. Вставка в строку
insert (вставляемая строка, исходная строка, целочисленное выражение)
Порядковый номер первой буквы
вставляемой строки в новой
строке
insert(x,a,3)
Строковые функции
5. Удаление части строки
delete (строка, начальный номер, количество символов
delete(T,3,2)
Строковые функции
Ord(C) - функция определяет порядковый номер символа С в
наборе символов
Chr(K) - функция определяет по порядковому номеру К
символ, стоящий на К-ом месте в наборе символов.
Строковые функции
Задача 3. Заменить букву ‘о’ на букву ‘и’ в слове форма.
Program z3;
Var
x:string[10];
Begin
x:= ‘форма’;
insert(‘и’,x,2);
delete(x,3,1)
write(x)
End.
Домашнее задание
Задача 1. Написать программу подсчета количества
появлений конкретного символа в заданном
фрагменте текста.
Задача 2. Написать программу подсчета количества
слов в тексте.
Задача 3. Определить, является ли текст, вводимый с
клавиатуры палиндромом. При этом пробелы не
учитывались бы (например: «а роза упала на лапу азора» палиндром).
Задача 4. Разработать программу тестирования знаний
учащихся.
Разбор задач
Задача 1. Написать программу подсчета количества появлений конкретного
символа в заданном фрагменте текста.
var
begin
a,b:string;
i,k:integer;
writeln('введите текст: '); readln(a);
writeln('введите искомую букву - '); readln(b);
k:=0;
for i:=1 to length(a) do
if a[i]= b then inc(k);
write('в этом тексте ',k,' букв ', b);
end.
Разбор задач
Задача 2. Написать программу подсчета количества слов в тексте.
var a:string;
i,b:integer;
begin
readln(a); writeln(a);
b:=1;
for i:=1 to length(a) do
begin
if a[i]=‘ ' then inc(b);
if (a[i]='-') and (a[i-1]=' ') and (a[i+1]=' ') then b:=b-1
end;
write('в этом тексте ',b,' слов');
end.
а := ‘раз два три четыре - пять. Шесть семь, восемь!!’
Разбор задач
Задача 3. Определить, является ли текст, вводимый с клавиатуры
палиндромом.
program palind;
var b,a,a1:string; i:integer;
begin
readln(a);
a1:=a;
b:='';
for i:=1 to length(a) do
begin
if (a[i]<>' ') then b:=a[i]+b;
if (a1[i] = ' ') then delete(a1,i,1)
end;
if a1 = b then write('является палиндромом')
else write('не является палиндромом');
end.
Домашнее задание
Задача 5. Подсчитать количество цифр среди вводимых
с клавиатуры символов.
Задача 6. Преобразовать во вводимой с клавиатуры
строке строчные латинские буквы в прописные.
Задача 7. Подсчитать сумму цифр, встречающихся в
строке.
Задача 4*. Разработать программу тестирования знаний
учащихся.