Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль: обсуждение вариантов решения задач (http://www.tehnari.ru/f41/t46331/)

Vladimir_S 13.02.2011 08:03

Цитата:

Сообщение от Mr.Програмист (Сообщение 465697)
Вот моя задача чтобы раскачать тему. Разбирайте.

Ага, спасибо. А то нам как раз заняться нечем.
Хотя, с другой стороны, всё-таки занялся, и считаю, что это очень полезное сообщение. И всем начинающим программистам советую внимательно предложенный код изучить. Потому что перед нами - ярчайший пример того, как НЕ СЛЕДУЕТ писать программы.
Что касается самого автора, то объяснять и доказывать что-либо ему я уже не берусь - реакция последует привычная: соплячье самоутверждение и деланье нарочито поперёк, дескать, вот я какой! Ну да не о нем речь.
Прежде всего, сформулируем задачу (чего MrПрограМист, естественно, сделать не сподобился):
Код:

Написать программу, имитирующую работу банкомата:
проверку пинкода, блокировку карточки при трехкратном неверном
вводе, запрос требуемой суммы и раскладку выдачи по количеству и
номиналам купюр.

В принципе, предложенная автором программа работает, и даже правильно, но:
1. Как неоднократно указывалось тому же Mr.ПрограМисту, один из признаков хорошего стиля программирования - неиспользование оператора goto, т.е. переходов по меткам. В предложенном же варианте этих меток понатыкано немерено, отсюда программа - лапша лапшой.
2. Наличие "мертвых" условных переходов с заведомо невыполнимым условием, ведущим к ветви, содержащей какую-то неудопонятную ахинею. Ну в самом деле, если мы присваиваем переменной k5000 значение 10000, то как результат целочисленного деления некоей величины на 5000 может оказаться большим k5000, т.е. 10000? Об этом знает только один MrПрограМист, равно как и вообще о смысле всех тих переменных k5000, k1000 и т.д. Я как-то смысла в них, равно как и в последовательности действий типа k1000:=k1000+(c-k5000); не уловил абсолютно. По-моему, галиматья полная.
Приведу с моей точки зрения нормальный код, решающий эту задачу:
Код:

Program bankomat;
Const
 Pincod=1973;
 Nom:Array[1..5] of Word=(5000,1000,500,100,50);

Var
 pc,c,d,ex,i,j:Word;

BEGIN
 i:=1;
 Repeat
  Writeln('Введите пинкод');
  Readln(pc);
  If pc=Pincod then
  Writeln('Пинкод введен верно')
  else Writeln('Вы ошиблись');
  Inc(i);
 Until (pc=Pincod) or (i=4);
 If i=4 then
  begin
  Writeln('Карточка заблокирована!');
  Readln;
  end
 else
  Repeat
  Writeln('Введите сумму (не более 65500 руб.), которую вы хотите получить:');
  Readln(d);
  For j:=1 to 5 do
    begin
    c:=d div Nom[j];
    d:=d mod Nom[j];
    for i:=1 to c do
      Writeln(Nom[j]:4,' руб;');
    end;
  Writeln('Удержано ',d,' руб;');
  Write('Введите 1 чтобы повторить, 2 чтобы выйти: ');
  Readln(ex);
  Until ex=2;
END.

Как говорится - "Почувствуйте разницу!".


Часовой пояс GMT +4, время: 19:50.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.