Вступление
Привет, Хабровчане.
Весной обычно проводится целая куча олимпиад. Программирование не исключение. Защищать честь моего учебного заведения (я учусь в техникуме, опыта мало, поэтому простите мой нубокод) доверили мне и моему одногруппнику.
У нас правила проведения такие: за месяц до олимпиады выдаются 10 заданий, а перед олимпиадой будет рандомно выбрано одно задание и роздано участникам. Я живу на Юге Украины, а Украина – страна специфическая, даже в программировании. При выполнении задания нужно написать программу на языке Delphi/C++/C# (один из них), сделать приятный и удобный интерфейс (красиво, информативно, обязательно должна присутствовать автоочистка, переход к следующему текстовому полю при нажатии на Enter и т.д.), переписать код программы на листик и нарисовать блок-схему (!) к программе. Да-да, блок схему к ООП программе.
Ладно, суть данного поста не в описании системы образовании в Украине. Я хочу привести код своих программ, являющихся решением заданий. Для чего я это делаю? Мне с одногруппником пришлось очень много перерыть в нете, поспрашивать на форумах и мучать знакомых ПРОграммистов, чтобы решить некоторые задания, так как ответа на поверхности интернета нет.
Не относитесь ко мне строго. Я очень люблю язык Java, а Delphi, который мы «изучали» более года назад, я забыл совсем и чуть ли не изучал с нуля.
Я буду приводить задания на украинском, переводить на русский (будут неточности – пишите, исправлю), приводить код и немного его объяснять. Также будет скриншот программы, правда, сделанной в RAD Studio XE3. Данный пост не более чем небольшой help.
Задание 1
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Ступені», яка обчислює залишок від цілочисельного ділення числа mn на d. Програма має отримувати від користувача числа m, n, d з полів вводу та виводити залишок в поле виводу. Обмеження: m<30000, n<30000, d<120.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Ступени», которая вычисляет остаток от целочисленного деления числа mn на d. Программа должна получать от пользователя числа m, n, d с полей ввода и выводить остаток в поле вывода. Ограничения: m <30000, n <30000, d <120.
procedure TForm2.Button1Click(Sender: TObject);
var
m,n,d: integer;
mCode,nCode,dCode: integer;
i,buffer:integer;
begin
// Проверяем правильность вводимых переменных
val(mEdit.Text,m,mCode);
val(nEdit.Text,n,nCode);
val(dEdit.Text,d,dCode);
if (mCode<>0) OR (nCode<>0) OR (dCode<>0) then
begin
ResLabel.Caption := 'В одном из полей вы ввели неправильное значение! Пожалуйста, проверте правильность вводимых значений!';
exit;
end;
// Возводим в степень
buffer := m;
for i := 2 to n do
buffer := buffer * m;
// Результат
ResLAbel.Caption := 'Результат равен ' + IntToStr(buffer div d);
end;
Хочу отметить, что Dephi нам предоставляли 5-ой версии, а C++Builder 6-ой. Также стоит обратить внимание на некорректность ограничений. Подсчитать число 30000 в 30000 степени – это бред. Организаторы уже не первый год выставляют эту задачу, очень многие делали им замечание, что задание некорректно, но они проигнорировали.
Согласитесь, задание плевое. Единственное, при вводе максимальных значений она будет выдавать результат ноль. Можно разработать алгоритм возведения степеней таких чисел, но это и долго, и бессмысленно для данных целей.
Задание 2
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Корабель», яка має демонструвати принципи мультиплікації (пересування об’єкту на фоні картинки). Зображення фону та об’єкту мають завантажуватися з файлу.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Корабль», которая должна демонстрировать принципы мультипликации (передвижение объекта на фоне картинки). Изображение фона и объекта должны загружаться из файла.
//Загрузка фона
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
Background.Picture.LoadFromFile(OpenPictureDialog1.FileName);
Background2.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end
else
begin
ShowMessage('Error!!! You dont choose picture!');
end;
end;
//Загрузка изображения кораблика
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
begin
Ship.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end
else
begin
ShowMessage('Error!!! You dont choose picture!');
end;
end;
// Стартуем
procedure TForm1.Button3Click(Sender: TObject);
begin
Panel1.Hide;
end;
//Проверка, загружены ли картинки
procedure TForm1.Button4Click(Sender: TObject);
begin
Label13.Caption := '';
if Background.Picture.Graphic=nil then Label13.Caption := 'Не загружен фон! ';
if Ship.Picture.Graphic=nil then Label13.Caption := Label13.Caption + 'Не загружен кораблик!';
if NOT ((Background.Picture.Graphic=nil) OR (Ship.Picture.Graphic=nil)) then Button3.Enabled := true;
end;
//Выход
procedure TForm1.Button5Click(Sender: TObject);
begin
Application.Terminate;
end;
//Инициализация при запуске
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer.Enabled := false;
distance := 0;
Self.DoubleBuffered := true;
Background2.Left := Background.Left + Background.Width;
end;
// Управление
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
begin
speed:=0;
Button3.Caption :='Продолжить';
Panel1.Show;
end;
if Key = 'e' then if (speed + 5) < 30 then speed := speed + 5;
if Key = 'q' then if (speed - 5) >= 0 then speed := speed - 5;
if Key = 'w' then if (Ship.Top - 30) > 15 then Ship.Top := Ship.Top - 30;
if Key = 's' then if (Ship.Top + 30) < ((Background.Height - Ship.Height) - 15 ) then Ship.Top := Ship.Top + 30;
if Key = 'a' then if (Ship.Left - 5) > 5 then Ship.Left := Ship.Left - 5;
if Key = 'd' then if (Ship.Left + 5) < Form1.Background.Width then Ship.Left := Ship.Left + 5;
end;
//Таймер, который двигает фоновую картинку
procedure TForm1.TimerTimer(Sender: TObject);
begin
Background.Left := Background.Left - speed;
Background2.Left := Background2.Left - speed;
distance := distance + abs(speed);
SpeedLabel.Caption := FloatToStr(speed/5);
DistanceLabel.Caption := IntToStr(distance/5);
if Background.Left < -1201 then Background.Left := Background2.Left + 1200;
if Background2.Left < -1201 then Background2.Left := BAckground.Left + 1200;
end;
Задание очень интересное, развивать его можно множествами способов. Учитывая, что время ограничено, а надо переписывать код и рисовать блок схему, я сделал ее достаточно простой.
Задание 3
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Вгадай число». Програма випадковим чином обирає ціле число в деякому діапазоні, а користувач намагається вгадати його та вводить своє число з клавіатури. Якщо число вгадане, програма виводить повідомлення про це і завершує свою роботу. Інакше спроба вгадати число повторюється ще 2 рази. При цьому користувачу видається повідомлення: “задане число більше чи менше введеного”.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Угадай число». Программа случайным образом выбирает целое число в некотором диапазоне, а пользователь пытается угадать его и вводит свое число с клавиатуры. Если число угадано, программа выводит сообщение об этом и завершает свою работу. Иначе попытка угадать число повторяется еще 2 раза. При этом пользователю выдается сообщение: «заданное число больше или меньше введенного».
procedure TForm2.Button1Click(Sender: TObject);
var
m,mCode: integer;
begin
// Проверяем правильность значения
val(Edit1.Text, m, mCode);
if mCode <>0 then
ResLabel.Caption := 'Неправильно введено значение! Проверьте правильность введенного значения!'
else
// проверяем ответ
if m = answer then
begin
ResLabel.Caption := 'Ура! Вы угадали!!! Приложение закроеться через 5 сек.';
timer.Enabled := true
end
else
if attempt<>1 then // если попытки еще есть
if m > answer then
begin
dec(attempt);
ResLabel.Caption := 'Увы! Введенное значение больше моего числа. У тебя еще:'+ IntToStr(attempt) +' попыток'
end
else
begin
dec(attempt);
ResLabel.Caption := 'Увы! Введенное тобой значение меньше моего числа. У тебя еще:'+ IntToStr(attempt) +' попыток';
end
else
begin //попытки закончились
ResLabel.Caption := 'Увы! Попытки закончились! Пока! (приложение закроеться через 5 сек.)';
Timer.Enabled := true;
end;
end;
Также довольно простая программа, комментарии все объясняют. Не будем на ней останавливаться.
Задание 4
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Аутентифікація», яка має створювати вікно перевірки паролю та логіну користувачів та виводити відповідне повідомлення підтвердження або помилки. Перелік існуючих користувачів та їх паролів має зберігатись у файлі. Реалізувати можливість додавання нового користувача.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Аутентификация», которая должна создавать окно проверки пароля и логина пользователей выводить соответствующее сообщение подтверждения или ошибки. Перечень существующих пользователей и их паролей должна храниться в файле. Реализовать возможность добавления нового пользователя.
//Проверка, если ли такой логин/пароль в файле
function isCorrect(res: String): boolean;
var
tempStr: String;
mfile: TextFile;
begin
AssignFile(mfile,'catalog.txt');
Reset(mfile);
while not eof(mfile) do
begin
ReadLn(mfile, tempStr);
if tempStr = res then
begin
isCorrect := true;
closeFile(mfile);
exit;
end;
end;
isCorrect := false;
closeFile(mfile);
end;
//Регистрация пользователя
procedure TForm1.Button1Click(Sender: TObject);
var
res: String;
mfile: TextFile;
begin
// Алгоритм такой: формируется строка логин - разделитель - пароль и сверяется со всеми строками в файле
res := trim(LoginEdit.Text) + '|' + trim(PasswordEdit.Text);
if isCorrect(res) then
begin
MessageLabel.Font.Color := clRed;
MessageLabel.Caption := 'User already exists';
exit;
end;
AssignFile(mfile,'catalog.txt');
append(mfile);
WriteLn(mfile, res);
closeFile(mfile);
MessageLabel.Font.Color := clLime;
MessageLabel.Caption := 'User created!';
end;
//Проверка логина/пароля
procedure TForm1.Button2Click(Sender: TObject);
var
mfile: TextFile;
res: String;
tempStr: String;
begin
res := trim(LoginEdit.Text) + '|' + trim(PasswordEdit.Text);
if isCorrect(res) then
begin
MessageLabel.Font.Color := clLime;
MessageLabel.Caption := 'Enter is successfull!';
end
else
begin
MessageLabel.Font.Color := clRed;
MessageLabel.Caption := 'User or password is invalid!';
end;
LoginEdit.SetFocus;
end;
Задание простое, но реализовать «красиво» я его не смог (лень * лень + «любовь» в Delphi). Реализовал наобум.
Примечание: на скриншотах зарегистрированный юзер с пустым именем и пустым паролем (:))
Задание 5
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Шифр Хасегава», яка виконує шифрування та дешифрування за алгоритмом Хасегава. При шифруванні кожному символу початкового відкритого повідомлення привласнюється його порядковий номер в алфавіті, після чого обирається ключ і його символи підписуються під символами початкового відкритого повідомлення з послідовним повторюванням ключу. Символам ключу також привласнюються порядкові номери за алфавітом, після чого вони складаються з відповідними символами повідомлення і отримані номери переводяться в символи початкового алфавіту. Відповідно, при перевищенні порядковим номером символу довжини алфавіту треба відняти довжину алфавіту. При дешифруванні виконати зворотні операції.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Шифр Хасегава», которая выполняет шифрование и дешифрование по алгоритму Хасегава. При шифровании каждому символу начального открытого сообщения присваивается его порядковый номер в алфавите, после чего избирается ключ и его символы подписываются под символами исходного открытого сообщения с последовательным повторением ключу. Символам ключу также присваиваются порядковые номера по алфавиту, после чего они состоят с соответствующими символами сообщения и полученные номера переводятся в символы исходного алфавита. Соответственно, при превышении порядковым номером символа длины алфавита надо вычесть длину алфавита. При дешифрировании выполнить обратные операции.
// Шифрация
function encrypt(const text, key: string): string;
var
i, p1, p2, len: integer;
s: string;
begin
s := text;
len := length(key);
for i := 1 to length(text) do
begin
p1 := pos(text[i], alp);
if p1 = 0 then
continue;
p2 := pos(key[(i - 1) mod len + 1], alp);
s[i] := alp[(p1 + p2 - 1) mod alplen + 1];
end;
result := s;
end;
//Дешифрация
function decrypt(const text, key: string): string;
var
i, p1, p2, len: integer;
s: string;
begin
s := text;
len := length(key);
for i := 1 to length(text) do
begin
p1 := pos(text[i], alp);
if p1 = 0 then
continue;
p2 := pos(key[(i - 1) mod len + 1], alp);
s[i] := alp[(p1 - p2 - 1 + alplen) mod alplen + 1];
end;
result := s;
end;
Очень интересное задание. Его решение нашел мой одногруппник: ему помог программист на форуме. Без него мы не смогли б найти решения. Загвоздка в том, что на самом деле это разновидность шифра Вижинера, хотя позже мы нашли источник, где описывается именно шифр Хосегавы.
Задание 6
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Гра». Група з n учнів одягала футболки з позначеними на спині послідовними номерами від 1 до n. Учні становилися в коло по порядку номерів та читали лічилку, що закінчувалась словами “…пішов геть” (починаючи з №1 в порядку збільшення номерів). Той, на кого падало останнє слово “геть”, покидав коло. Лічилка продовжувалась далі з наступного учня, поки не залишався один учасник. Знаючи, що в лічилці m слів, Вовочка завжди встигав обирати футболку з таким номером, щоб виграти. Програма має отримувати від користувача числа m та n і виводити номер, який має бути в переможця. Обмеження: m<30000, n<30000.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Игра». Группа из n учеников надевала футболки с обозначенными на спине последовательными номерами от 1 до n. Ученики становились в круг по порядку номеров и читали считалку, что заканчивалась словами "… ушел" (начиная с № 1 в порядке возрастания номеров). Тот, на кого падало последнее слово «прочь», покидал круг. Считалка продолжалась дальше со следующего ученика, пока не оставался один участник. Зная, что в считалке m слов, Вовочка всегда успевал выбирать футболку с таким номером, чтобы выиграть. Программа должна получать от пользователя числа m и n и выводить номер, который должен быть у победителя. Ограничения: m <30000, n <30000.
function TForm1.find(W,P:integer): integer;
var
pointer: integer;
arrP: array of integer;
tempArr: array of integer;
I,j: Integer;
m: integer;
Str:string;
begin
SetLength(arrP,P);
for I := 0 to P-1 do // инициализируем массив числами от 1 до P
arrP[i] := i+1;
pointer := 0;
while Length(arrP) <> 1 do
begin
pointer := (pointer + W - 1) mod length(arrP);
arrP[pointer] := 0; // полученное число ставим нулем
m := 0;
SetLength(tempArr, Length(arrP)-1); // создаем новый временный массив, который будет на 1 меньше (без выбывшего игрока)
for i := 0 to length(tempArr)-1 do
begin
if arrP[i] = 0 then m :=1;
tempArr[i] := arrP[i+m];
end;
SetLength(arrP,Length(tempArr));
for I := 0 to Length(tempArr) do arrP[i] := tempArr[i];
end;
find:= arrP[0];
end;
Интересное задание. На форумах можно найти решения, но я изобрел велосипед заново. Криво, «не красиво», но работает:).
Задание 7
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Кидання кубика». Передбачається, що кубик, грані якого помічені цифрами від 1 до 6, кидають N разів. Програма повинна обчислити вірогідність того, що сума чисел, що випали, буде дорівнювати Q. Розрахована вірогідність у вигляді дійсного числа має відрізнятись від істинного значення не більше ніж на 0,01 істинного значення. Числа N та Q мають вводитись користувачем з полів вводу.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Бросание кубика». Предполагается, что кубик, грани которого помечены цифрами от 1 до 6, бросают N раз. Программа должна вычислить вероятность того, что сумма чисел, выпавших будет равна Q. Рассчитаная вероятность в виде действительного числа должна отличаться от истинного значения не более чем на 0,01 истинного значения. Числа N и Q имеют вводиться пользователем с полей ввода.
const
maxSumm = 500 + 2;
maxN = 200 + 2;
function TForm1.getRes(n:integer;sum:integer):double;
var
arr: array [0..MaxSumm, 0..maxN] of double;
currN: Integer;
currSumm: Integer;
prev: integer;
begin
for CurrN := 0 to MaxN do
for CurrSumm := 0 to MaxSumm do
arr[sum,n] := 0;
arr[0,0] :=1;
for currN := 1 to n do
for currSumm := 1 to sum do
for prev := 1 to 6 do
if currSumm - prev >= 0 then
arr[CurrSumm,currN] := arr[CurrSumm,currN] + (arr[CurrSumm - prev,currN-1] / 6.0);
getRes := arr[sum,n];
end;
А это глупое задание. Первоначально я хотел изобрести целую систему, для подсчета количества «подходящих» событий, а потом делить полученное число на число всех событий. Хотел реализовать это по принципу счетчика ( ставим все кубики на положение 1 и крайний кубик начинаем «крутить», увеличивая его число; когда число переходит 6-ку, то значение кубика сбрасывается на 1, а значение соседнего кубика увеличивается на 1 и так далее; если сумма чисел подходит – увеличиваем переменную-счетчик; на выходе получили бы количество всех подходящих событий), но потом передумал (лень-матушка надоумила не заниматься глупостями) и пошел лазать по Интернету. На одном сайте, посвященному олимпиадным задачам, нашел человека, который решил данную задачу и попросил его поделиться кодом. Код был на С++, он без проблем работал. На Delphi появились проблемы: двумерный массив имел очень ограниченный размер. Поэтому я делал его размер 500*200 (более большие значения приводили к тихому закрытию программы без каких либо ошибок и сообщений).
Задание 8
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Депозит», яка повинна обчислювати дохід по вкладу коштів на депозит в банку. Програма повинна забезпечувати розрахунок простих та складних відсотків. Прості відсотки нараховуються в кінці терміну вкладу, складні – щомісячно та додаються до первинної суми вкладу і в наступному місяці відсотки нараховуються на нову суму.
Составить на языке С++ в среде разработки C++Builder, или на языке C# в бреде разработки Visual C# Express, или на языке Object Pascal в среде разработки Delphi программу «Депозит», которая должна рассчитывать доход по вкладу денежных средств на депозит в банк. Программа должна обеспечивать расчет простых и сложных процентов. Простые проценты расчитываются в конце срока вклада, сложные – помесячно и добавляются к первичной сумме, а в следующем месяце проценты начисляются на новую сумму
procedure TForm1.Button1Click(Sender: TObject);
var
summ: real;
summCode, period, periodCode, percent, percentCode: integer;
flag: boolean;
temp: real;
begin
val(PeriodEdit.Text, period, periodCode);
val(SummEdit.Text, summ, summCode);
val(PerCentEdit.Text, percent, percentCode);
Memo.Lines.Clear;
flag := false;
if periodCode<>0 then
begin
Memo.Lines.Add('Вы некорректно ввели период вклада! Период вклада нужно вводить целым числом');
flag:= true;
end;
if summCode<>0 then
begin
Memo.Lines.Add('Вы некорректно ввели сумму вклада! Сумма вклада нужно вводить целым числом');
flag:= true;
end;
if percentCode<>0 then
begin
Memo.Lines.Add('Вы некорректно ввели процентную ставку! Процентную ставку нужно вводить целым числом');
flag:= true;
end;
if flag then exit;
if RBsimp.Checked then
temp := summ + (summ*(percent/100) * period) // простые проценты
else
temp := summ * exp(period * ln( 1 + percent/100)); // сложные проценты
Memo.Lines.Add('Начальня сумма вклада: ' + FloatToStr(summ));
Memo.Lines.Add('Итоговая сумма вклада: ' + FloatToStr(temp));
Memo.Lines.Add('Прибыль: ' + FloatToStr(temp - summ));
PeriodEdit.SetFocus;
end;
Программа простая, особых комментариев не требует.
Задание 9
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Кількість символів», яка повинна визначати розподіл кількості символів у введеному користувачем в поле Edit рядку та виводити результат у вигляді таблиці виду “символ” – “його кількість”. Прийняти до уваги, що відповідні великі та маленькі літери в рядку мають сприйматись як однакові. Програму необхідно спроектувати таким чином, щоб кнопка Підрахунок була доступною лише в тому випадку, якщо користувач увів аналізуємий рядок.
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Количество символов», которая должна определять распределение количества символов во введенном пользователем в поле Edit строке и выводить результат в виде таблицы вида «символ» — «его количество». Принять во внимание, что соответствующие большие и маленькие буквы в строке должны восприниматься как одинаковые. Программу необходимо спроектировать таким образом, чтобы кнопка Подсчет была доступна только в том случае, если пользователь ввел анализируемую строку.
// Проверка, есть ли в таблице данный символ
function TForm1.isPresent(ch: char): boolean;
var
i: integer;
begin
isPresent := false;
for i := 0 to StringGrid1.RowCount do
if ch = StringGrid1.Cells[0, i] then
isPresent := true;
end;
// Подсчет символов
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
tempRes: integer;
i, j, strLength, pointer: integer;
tempChar: char;
begin
str := AnsiUpperCase(Edit1.Text);
strLength := Length(str);
pointer := 1;
for i := 1 to strLength do
begin
tempRes := 1;
tempChar := str[i];
if not isPresent(tempChar) then
begin
for j := i + 1 to strLength do
begin
if tempChar = str[j] then
inc(tempRes);
end;
StringGrid1.Cells[0, pointer] := tempChar;
StringGrid1.Cells[1, pointer] := IntToStr(tempRes);
StringGrid1.RowCount := StringGrid1.RowCount + 1;
inc(pointer);
end;
end;
end;
Программу можно реализовать кучей способов, я выбрал простой способ без излишеств.
Задание 10
Скласти на мові C++ в системі програмування C++Builder, або на мові C# в системі програмування Visual C# Express або на мові Object Pascal в системі програмування Delphi програму «Година», яка має визначати, скільки повних годин (h) та повних хвилин (m) пройшло від початку доби до того моменту (в першій половині дня), коли часова стрілка повернулась на f градусів (0≤f≤360, f – дійсне число).
Составить на языке C + + в системе программирования C + + Builder, или на языке C # в системе программирования Visual C # Express или на языке Object Pascal в системе программирования Delphi программу «Час», которая должна определять, сколько полных часов (h) и полных минут (m) прошло от начала суток до того момента (в первой половине дня), когда временная стрелка вернулась на f градусов (0 ≤ f ≤ 360, f — действительное число).
procedure TForm2.Button1Click(Sender: TObject);
var
fCode:integer;
f:real;
time,h,m,s: integer;
begin
//Проверка данных
val(Edit.Text, f, fCode);
if (fCode<>0) OR (f > 360) OR (f < 0) then
ResLabel.Caption := 'Вы ввели некорректное значение! Проверьте правильность введеных данных!'
else
//Подсчет
begin
time := trunc(f*120);
h := time div 3600;
time := time - 3600*h;
m := time div 60;
time := time - m*60;
ResLabel.Caption := 'Итого: ' + IntToStr(h) + ' часов, ' + IntToStr(m) + ' минут, ' + IntToStr(time) + ' секунд.';
end;
end;
Простая программа, комментариев не требует.
...
Надеюсь, когда люди столкнуться с проблемой решения кого-то из этих заданий – они найдут этот пост и он им поможет. Извините за такое большое количество букв, но этот пост предназначался чисто для того, чтобы помочь людям.
Если есть орфографические ошибки, ошибки в коде, у вас есть предложение по исправлению или оптимизации кода – пишите, исправлю.
Спасибо за внимание.
by Morris Decker
Автор: MorrisDecker