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

в 9:36, , рубрики: Delphi, олимпиадные задачи, решение задач, метки: , ,
Вступление

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

Источник

Поделиться

* - обязательные к заполнению поля