Возведении целого числа в неотрицательную степень
При возведении целого числа в неотрицательную степень обычно используют определение степени, т. е. в цикле многократно умножают число на себя. Однако для длинных чисел этот алгоритм не является эффективным. Поэтому целесообразно использовать алгоритмы меньшей сложности, например, описаный ниже.
(Из книги А. Шеня "Программирование: теоремы и задачи".) Дано целое число а и целое неотрицательное число n. Вычислить а в степени n. Другими словами, необходимо составить программу, при исполнении которой значения переменных а и n не меняются, а значение некоторой другой переменной (например, b) становится равным а в степени n. (При этом разрешается использовать и другие переменные.) Требуется, чтобы число действий (выполняемых операторов присваивания) было порядка log2 n (то есть не превосходило бы C * log2 n для некоторой константы C; log2 n — это степень, в которую нужно возвести 2, чтобы получить n).
Решение.
k := n; b := 1; c := a;
{a в степени n = b * (c в степени k)}
while k <> 0 do
begin
if k mod 2 = 0
then begin
k := k div 2;
c := c * c
end
else begin
k := k - 1;
b := b * c
end
end;
Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.
Задача на нахождение наибольшего числа из трех
Задача. Написать программу нахождения наибольшего целого числа из трех введенных с клавиатуры
Решение. Задача и по своей сути и по способу реализации простейшая, но даже при решении такой простой задачи есть свои нюансы. Дело в том, что получить желаемый результат можно несколькими способами. При выполнении такой простейшей задачи подойдет любой вариант. Но как показала практика, при усложнении задачи, когда требуется найти наибольшее из четырех чисел, у неподготовленных учеников возникают ошибки. Предлагаю вариант решения, используя который ученики допускают наименьшее количество ошибок. Он сводится к следующему: после операции сравнения наибольшее значение присваивается какой - либо одной переменной (например "х"), которая и будет выведена в качестве результата решения задачи.
var
x, y,z :integer;
begin
writeln('Введите три целых числа');
readln(x, y,z);
if x < y then
x:=y;
if x < z then
x := z;
writeln('Наибольшее целое число = ',x);
readln;
end.
Задания связанные с обработкой строки
Задача №1. Написать программу, которая будет подсчитывать количество символов в введенной строке.
Решение.
var
str: string;
begin
writeln('Введите строку');
readln(str);
writeln('Количество символов = ', length(str));
readln;
end.
Задача №2. Модернизировать предыдущую программу таким образом, чтобы дополнительно узнать сколько пробелов было в введенной строке.
Решение.
var
str: string;
i, x integer;
begin
writeln('Введите строку');
readln(str);
for i:= 1 to length(str) do
if str[i] = ' ' then
x:=x+1;
writeln('Количество символов = ', length(str));
writeln('Количество пробелов = ', x);
readln;
end.
Задача №3. Измените предыдущую программу таким образом, чтобы кроме подсчета символов она заменяла все пробелы буквой "s" и выводила на экран итоговый результат.
Решение.
var
str: string;
i, x integer;
begin
writeln('Введите строку');
readln(str);
for i:= 1 to length(str) do
if str[i] = ' ' then
str[i] := 's';
writeln('Количество символов = ', length(str));
writeln(str);
readln;
end.
Задача №4. Напишите программу, которая будет удалять пробелы из строки, а результат выводить на экран.
Решение.
var
str:string;
i:integer;
begin
writeln('Введите строку');
readln(str);
for i:=1 to length(str) do
if str[i]=' ' then
begin
delete(str, i,1);
i:=i-1;
end;
writeln('Итоговая строка - ', str);
readln;
end.
Задача №5. Напишите программу, которая читает с клавиатуры строку текста и выводит ее на экране "задом на перед".
Решение.
var
str: string;
i: integer;
begin
write('Введите строку символов');
readln(str);
for i:= length(str) downto 1 do
write(str[i]);
readln;
end.
Нахождение наибольшего числа
Задача №1.Найти наибольшее целое число из четырех введенных с клавиатуры (5 баллов).
var
x, y,z, w:integer;
begin
writeln('Введите четыре целых числа');
readln(x, y,z, w);
if x < y then
x := y;
if x < z then
x := z;
if x < w then
x := w;
writeln('Максимальное число = ', x);
readln;
end.
Разные задачи
Задача №1. Написать программу, которая будет менять местами два введенных с клавиатуры слова. Слова разделены пробелом (10 баллов).
Тест. Введено «Иван Петров», результат «Петров Иван».
var
str, str2:string;
i:integer;
begin
writeln('Введите строку символов');
readln(str);
for i := 1 to length(str) do
if str[i] = ' ' then
begin
str2 := copy(str,1,i-1);
delete(str,1,i);
end;
writeln('Итоговая строка - ',str + ' '+ str2); readln;
end.
Задача №2. Подсчитайте, сколько слов во введенном предложении начинается с буквы «w» (15 баллов).
var
str:string;
x, i:integer;
begin
writeln('Введите предложение');
readln(str);
for i:=1 to length(str) do
if str[i]=' ' then
if str[i+1]= 'w' then
x:=x+1;
end;
if str[1]='w' then
x:=x+1;
writeln(‘Количество слов в предложении начинающихся буквой «w» = ‘ , x);
readln;
end.
Задача №3. Построить семейство концентрических окружностей, удовлетворяющих следующим условиям:
1. Центр окружностей расположен в точке с координатами (315, 125);
2. Радиус исходной окружности равен 50 единицам;
3. Радиус каждой следующей окружности меньше предыдущей на 5 единиц;
4. Радиус последней построенной окружности не должен быть меньше 5 единиц;
Решение.
uses
graph;
var
x, gd, gm:integer;
begin
gd:=detect;
initgraph(gd, gm,'');
x:=50;
while x>4 to
begin
circle(315,125,x);
x:=x-5;
end;
readln;
end.


