Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Бабалова Алгоритмизация задач и структурирование программ 2013

.pdf
Скачиваний:
2
Добавлен:
12.11.2022
Размер:
1.29 Mб
Скачать

Рис. 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