Записки студента-программиста: Олимпиада

от автора

Вступление

Привет, Хабровчане.
Весной обычно проводится целая куча олимпиад. Программирование не исключение. Защищать честь моего учебного заведения (я учусь в техникуме, опыта мало, поэтому простите мой нубокод) доверили мне и моему одногруппнику.
У нас правила проведения такие: за месяц до олимпиады выдаются 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

ссылка на оригинал статьи http://habrahabr.ru/post/178229/


Комментарии

2 комментария на ««Записки студента-программиста: Олимпиада»»

  1. Аватар пользователя Дмитрий
    Дмитрий

    Доброго суток времени) интересует 6 задача про кубик, можешь кодом на с++ поделиться?

    1. Аватар пользователя Дмитрий
      Дмитрий

      7я, прошу прощения)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *