1. C++ / Говнокод #22531

    −44

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    bank :: bank()
        {
    	ifstream fin;
    	fin.open("account.txt");
    	for (unsigned short i = 0; i < accounts; ++i)
    	{
    
    	    fin >> acc[i];
    	    fin >> counts[i];
    	    fin >> password[i];
    	    fin >> name[i];
    	    fin >> free[i];
    	}
    	fin.close();
    	id = 0;
    	temp = 0;
    	cash = 0;
    	id_temp = 0;
    	x = 0;
        }
     void bank::accountCreate()
        {
    	while (free[x] = 1)
    	{
    	    x++;
    	}
    	    cout << "Enter your name:\n";
    	    cin >> name[x];
    	    cout << "Enter your new password:\n";
    	    cin >> password[x];
    	    acc[x] = x;
    	    counts[x] = 0;
    	    ofstream fout("account.txt", ios_base::app);
    	    if (fout.is_open())
    	    {
    		fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
    	    }
    	    else
    	    {
    		fout.open("account.txt");
    		fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
    	    }
    	    fout.close();
    	id = x;
    	startManagement();
        }
      void bank::accountEnter()
        {
    	cout << "Enter your account ID:\n";
    	arrow;
    	cin>>x;
    	cout << "Enter your password:\n";
    	arrow;
    	cin >> temp_password;
    	if (temp_password == password[x])
    	{
    	    id = x;
    	    startManagement();
    	}
    	else
    	    accountEnter();
        }
    void bank::prepareCicle()
        {
    	ofstream fout;
    	fout.open("accounts.txt", ios::out | ios::in);
    	if (fout.is_open())
    	{
    	    for (x = 0; x < accounts; ++x)
    		fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
    	}
    	else
    	{
    	    fout.open("accounts.txt", ios::out | ios::in);
    	    fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
    
    	}
    	fout.close();
    	cash = 0;
    	id = 0;
    	id_temp = 0;
    	x = 0;
    	temp = 0;
        }

    Отказывается вообще хоть что-то делать, ну что, лечить, или пусть живёт?
    Это проблемные куски кода, которые я не очень понимаю почему не работают.
    На базе примитивного БД из текстового файла.

    Запостил: Shantykoff, 10 Марта 2017

    Комментарии (39) RSS

    • Где здесь шаблоны, Shantykoff? С таким кодом в банк не возьмут.
      Ответить
    • cout << "Enter your account ID:\n";
      cin>>x;
      if (temp_password == password[x])

      Самый безопасный банковский код на свете
      Ответить
      • Разве в кодах он не так чекается?
        Ответить
        • сразу и переполнение буфера и хранение пароля в открытом виде и даже атака по таймингу . Самое то для банка.
          Ответить
          • Зашифровать пароли? Блииин ты прав, попробую создать ещё и примитивную шифровку
            Ответить
            • более серьезная прболема в том что если пользователь введет "-1" или "100500" то произойдет неизвестно что, вплоть до того что он сможет исполнить на сервере произвольный код который введет в temp_password.
              Ответить
              • Не страшно, у меня пароль не цифровой, а если ты про id, то тут да, но я собирался шлифовать такие недочёты уже после нормального запуска бд, но спасибо тебе благородный человек
                Ответить
                • Благородно отшлифовал твой анус, проверь.
                  Ответить
                  • И вправду гладкий! Спасибо! Не знал что язык на такие чудеса способен.
                    Ответить
                    • А теперь надо его развальцевать, не разгибайся.
                      Ответить
                      • А теперь серьёзно, полностью починил программу, однако есть недочёт, при переводе в файл большие числа переводятся в формат типа 2,14 +e25 и тому подобному, а когда считывается назад из файла то уже другое число получается, когда как, иногда такой же формы, иногда вообще в минус. Как решать?
                        Ответить
    • А что такое prepareCicle? Как прочесть как "подготовка Сисле" ?
      Ответить
      • Грамматическая ошибка, пойду исправлять, спасибо что тыкнули, не меня так влияет изучение итальянского и немецкого:)
        Ответить
        • названия методов accountEnter и prepareCicle не соответсвуют тому что делают методы.

          и первом и во втором случае методы должны быть разбиты на другие методы с правильными названиями.

          перменные не должны быть i, x, и т.д. а должны меть имя которое обьясняет что эта перменная хранит
          Ответить
          • Ну, первый входит в аккаунт, второй готовит бд к новой итерации программы, почему не подходит? А насчёт разбития методов, это уже будет перебор, программа то из 400 строчек, хотя в общем плане то да, лучше разбивать на мельчайшие методы
            Ответить
            • почему тогда название метода - "создай аккаунт" если ее назначение "войти в аккаунт"
              Ответить
    • fout.open("accounts.txt", ios::out | ios::in);
      	if (fout.is_open())
      	{
      	    for (x = 0; x < accounts; ++x)
      		fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
      	}
      	else
      	{
      	    fout.open("accounts.txt", ios::out | ios::in);
      	    fout << acc[x] << counts[x] << password[x] << name[x] << 1 << endl;
      
      	}


      что за магия? если первый "open" не сработал по чему он должен сработать в "else"?

      почему в первом случае "for (x = 0; x < accounts; ++x)" а в "else" такого нет.

      -------------------------------------
      Аффтор пользуется тезисом что в программах нет багов - есть только скрытые фичи :)?
      Ответить
      • Ну я ещё учусь, при том взялся вот так за fstream. Баги эти я починил. Запустилось. Теперь проблема с считыванием денег в double. Работает только с целыми числами. В чём проблема?
        Ответить
        • перменная "x" не должна быть использованна как член класса. Т.к. она используется как индекс для итерации то она должна быть локальной и не иметь эффект на весь класс
          Ответить
          • Я выложил лишь проблемный кусочек, там дальше х используется, но тут ты прав, наверное, не хотел выделять память под новую переменную если можно было использовать эту, не знаю как правильно с точки зрения оптимизации.
            Ответить
            • Простите за вопрос. Оптимизацию чего?

              у Вас сколько ОЗУ сейчас 32кб или 64кб? Если первое то лучше всетаки использовать местную переменную в стеке а вот если второе тут уже много выбелять больше ненужных переменных :)
              Ответить
              • Не надо на вы, мне всего 19, обидно как-то... У меня 768мб ОЗУ, я пытался сохранить переменную в чисто теоретически проверочных целях, а вот про местную переменную в стеке я ничего не понял... :(
                Так как всё таки эффективнее? Что лучше, выделить новую переменную или обнулить переменную? На чисто техническом уровне имею ввиду
                Ответить
                • >> У меня 768мб ОЗУ,

                  Как там, в 2005-м?
                  Ответить
                  • Хреново, мой NetBeans иногда лагает, а игры идут только старые, вот такой вот студент из бедной семьи :D
                    Ответить
                • если вы спрашиваете что эффективнее (т.е. быстрее работает? или меньше места жрет?)

                  и в том и в том случает использование местной локальной переменной будет лучше.
                  Ответить
    • одни и теже строки программы должны быть переиспользованны,

      например

      id = 0;
      	temp = 0;
      	cash = 0;
      	id_temp = 0;
      	x = 0;


      должна быть одним методом и должна быть переиспользованна несколько раз.

      в if else не должно быть одно и того же кода. Надо использовать do { } while или while {}
      Ответить
      • А зачем цикл? Я не понял слегка
        Ответить
        • что бы не писать такой код до бесконечности

          fout.open("accounts.txt", ios::out | ios::in);
          if (fout.is_open())
          {
          ...
          }
          else
          {
          	    fout.open("accounts.txt", ios::out | ios::in);
                      if (fout.is_open())
                      {
                        ...
                      }
                      else
                      {
          	          fout.open("accounts.txt", ios::out | ios::in);
                            if (fout.is_open())
                           {
                               ....
                           }
                           else
                           {
                              // до бесконечности
                           }
                      }
          }
          Ответить
          • > что бы не писать такой код до бесконечности

            То есть сама логика "файл один раз не открылся, наверняка второй раз получится" не смущает?
            Ответить
            • Когда я это делал сначала решил "ну коль файла нету пусть создастся" а потом вышло это, я даже внимания не обратил. Спасибо кстати то подсказали.
              Ответить
            • >>То есть сама логика "файл один раз не открылся, наверняка второй раз получится" не смущает?

              Я об этому уже писал до этого :)
              Ответить
            • > То есть сама логика "файл один раз не открылся, наверняка второй раз получится" не смущает?
              EAGAIN, EINTR
              Ответить
    • # ну что, лечить, или пусть живёт?

      Эх, Warcraft III мой Warcraft III. Кстати, какие там новости по Warcraft'у, как поживает Dota 2 и World of Warcraft?

      Ответить
      • Всё чаще и чаще обсуждается возможность появления Варкрафт 4, дота неизменна, Вовка скатилась в Игру Престолов, время идёт...
        Ответить
    • # while (free[x] = 1)

      Ясно. Понятно.
      Ответить
      • Программа уже исправлена кроме 1 бага с деньгами на счёте , а так там такой фигни больше нету)))
        Ответить

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