Бабалова Алгоритмизация задач и структурирование программ 2013
.pdfРис. 6. Код программы для пустой формы
Все разделы программы озаглавлены в соответствии с назначение с теле программы.. Для объявления типов данных type, для объявления переменных var, для написания собственного текста программы необходимо описать методы - процедуры или функции после заголовка imlementation.
11
Тема 1. РАБОТА С ЧИСЛАМИ РАЗНЫХ ФОРМАТОВ
1.1. Обработка целых и вещественных чисел
Задачи этой темы позволяют рассмотреть способы обработки простых типов данных: целых или вещественных чисел. Во всех условиях предлагаемых задач вводятся и обрабатываются только числа. Никаких преобразований чисел в строки не проводится. Всякое преобразование увеличивает время решения задач и уменьшает точность вычислений для вещественных чисел. Кроме того, арабская система счисления хорошо поддается алгоритмической обработке.
Пример 1.1. Дано натуральное число n. Получить запись числа без 0 и 1.
Алгоритм решения задачи приведен на рис. 7.
Рис. 7. Алгоритм удаления 1 и 0 из записи числа
12
Программа записана в консольном исполнении: program Del_0_1;
{$APPTYPE CONSOLE} uses
SysUtils,Windows; //Для работы со строками
//пришлось добавить модуль среды Windows, содержащий // методы обработки строк с кириллицей.
var n,p,t,k:integer; b:boolean; ch:char;
function ToRus(winStr:String):string; begin
setlength(Result,Length(WinStr));
CharToOEM(PChar(WinStr),PChar(Result));
end;
//Эта функция нужна только для консольного
//приложения среды Delphi. Вы ее просто копируете в каждую
//новую свою программу, если хотите видеть
//комментарии в диалоге на русском языке.
begin
Writeln(ToRus('*** Начало работы***'));
repeat
writeln(ToRus('Введите число для анализа')); b:=false; // Если число состоит только из 0 и 1 p:=0;
t:=1
{$I-} // Это проверка ввода правильности // записанного числа
readln(n); {$I+}
If IOresult<>0 then // Вы видите имя стандартной переменной, // которая хранит код ошибки ввода числа
begin
writeln(ToRus(' число записано неверно')); readln;
continue; // Этот оператор позволит продолжить //решение задачи без перезапуска программы
end;
13
while n<>0 do begin
k:=n mod 10; n:=n div 10;
if (k<>1) and (k<>0) then begin
p:=p+k*t;
t:=t*10;
b:=true;
end;
end;
if b then
writeln(ToRus('полученное число ='),p:12) else
writeln(ToRus('число содержит только нули и единицы')); writeln(ToRus(' введите букву n для окончания работ')); readln(ch);
until ( ch='n');
{ TODO -oUser -cConsole Main : Insert code here } end.
Мы упоминали, что все действия будем выполнять над числом. Следовательно, надо будет выделять разряды целого числа и проверять их на 0 или 1. Из остальных цифр будем формировать новое число. Результат решения задачи показан на рис. 8.
Рис. 8 Проверка решения задачи
В окне результата решения задачи приведено решение для числа, содержащего любые цифры, второй результат демонстрирует
14
проверку числа из 1 и 0. Третий результат обеспечивает проверку правильности ввода числа, четвертый пример – это число без 0.
Таким образом, обеспечена проверка всех возможных вариантов вводимых целых чисел.
Пример 1.2. Дано целое число. Определить сумму двух старших и двух младших цифр в записи числа
Алгоритм решения этой задачи представлен на рис. 9.
Рис. 9. Алгоритм определения сумм
В алгоритме справа определяется количество цифр в записи числа. В средней линии блоков суммируются две младшие цифры числа. Для вычисления суммы двух старших цифр количество цифр в записи числа уменьшено на 2. Обратите внимание на то, что алгоритм решает задачу только с числом, а не со строкой.
15
Программа выполнена с использованием стандартных компонент среды Delphi:
unit Summa_1_n; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit; Label2: TLabel; Label3: TLabel; Order: TButton; Summa: TButton; Button3: TButton; Label4: TLabel; Edit4: TEdit;
procedure OrderClick(Sender: TObject); procedure SummaClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1;
k, n:integer; // Это глобальные переменные, значения
// которых будут видны во всех событиях данного модуля implementation
{$R *.dfm}
16
procedure TForm1.SummaClick(Sender: TObject); var j,i,s1,s2:integer;
begin s1:=0; s2:=0; i:=1;
While n<>0 do begin
while i<=2 do begin
j:=n mod 10; n:=n div 10; s1:=s1+j; i:=i+1;
end ;
if i<=(k-2) then begin
n:=n div 10; i:=i+1;
end else begin
j:=n mod 10; s2:=s2+j; n:=n div 10; i:=i+1;
end;
end;
Edit2.Text:=Inttostr(s1);
Edit3.Text :=Inttostr(s2);
Summa.Enabled :=false;
end;
procedure TForm1.Button3Click(Sender: TObject); begin
close;
end;
17
procedure TForm1.FormCreate(Sender: TObject);
//Это событие позволяет установить свойства
//компонент, которые необходимы для решения конкретной задачи
begin
Summa.Enabled :=false;// Кнопка события для
//вычисления заданных сумм будет не активна
//(см. рисунок с результатами решения) Edit1.clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
end;
procedure TForm1.OrderClick(Sender: TObject); //Этот метод
//вычисляет количество цифр в записи числа var m:integer;
begin Edit2.Clear; Edit3.Clear;
n:=strtoint(Edit1.Text);
m:=n; // Исходное число в памяти сохраняем, чтобы можно //было его использовать без повторного преобразования, которое // выполняется всегда при чтении числа из окна компонента
k:=0;
while m<>0 do begin
m:=m div 10; k:=k+1;
end;
Edit4.Text :=inttostr(k);
Summa.Enabled :=true;
end;
end.
Форма для решения задачи показана на рис. 10. Окно работающей программы с результатами решения представлено на рис. 11.
18
Рис. 10. Форма для решения задачи
Рис. 11. Результат решения
Задачи для самостоятельной работы
1.1.Дано вещественное число. Определить порядок числа и количество цифр в изображении числа.
1.2.Дано целое число N. Разложить его на простые множители. Вывести на экран исходное число и полученные множители.
19
1.3.Дано целое число с количеством цифр в его записи <= 10. Записать число в обратном порядке.
1.4.Дано целое число X > 99. Определить число сотен в записи
числа.
1.5.Часовая стрелка образует угол ϕ с лучом, проходящим через центр и через точку, соответствующую 12 часам на циферблате:
0 < ϕ < 2π. Определить значение угла для минутной стрелки при заданной величине угла ϕ, а также количество полных часов и полных минут.
1.6. Дано целое число n . Найти знакочередующуюся сумму
k
цифр числа n S = ∑αi *(−1)i , где αi – цифры числа n, а перемен-
i=0
ная k определяет количество цифр в записи числа.
1.7.Дано 10-разрядное число. Определить, является ли введенное число палиндромом. (Число, у которого значение при чтении справа налево и слева направо одинаково, называется палиндромом.)
1.8.Дано некоторое натуральное число. Определить сколько и каких цифр присутствует в записи числа. Результат обработки: <цифра> – <количество>.
1.9.Дано целое число. Найти произведение всех его цифр.
1.10.Даны два целых числа М и N. Найти все одинаковые цифры в каждом из чисел.
1.11.Даны целые положительные числа k и N. Найти P = (K)N!. Определить диапазон допустимых значений N для целого типа данных.
1.12.Даны целые числа m, N. Определить сумму любых m цифр числа N.
1.13.Дано целое число N, определяющее возраст человека. Для этого числа определить наименование: год, года, лет. Например, 31 год, 32 года, 25 лет.
1.14.Дано целое число X. Определить сумму k младших цифр в записи числа.
1.15.Дано целое число K, имеющее значения в диапазоне 1…365. Определить номер дня недели (1...7), на который приходится веденное число для не високосного года (високосным счита-
20