Элегантный код C ++: как написать более эффективный код, используя циклы while и условные операторы - PullRequest
0 голосов
/ 15 июня 2019

У меня точно нет проблем, но есть желание написать код, который сложен, но с как можно меньшим количеством строк.Не могли бы вы дать мне несколько советов о том, как я могу упростить свой код?

Моя программа работает, но она слишком короткая, на мой вкус.Я все еще новичок в этом, и у меня есть способы пойти.

#include <iostream> 
#include<fstream>
#include<string>

using namespace std; 



int main() {

    string current_users[5];
    string new_users[5], new_user;
    ifstream read;


    read.open("current.txt");

    for (int index = 0; index < 5; index++) {
        read >> current_users[index];

    }

    read.close();


    cout << "Enter a username: ";
    cin >> new_user;


    char user_choice;
    int index = 0, new_index = 0;
    while (index <= 5) {


        if (new_user == current_users[index]) {
            cout << "That username already exists."
                << " Enter a different username: ";

            cin >> new_user;
            index = 0;
            continue;
        }


        if (index < 5)
            index++;


        else {
            new_users[new_index] = new_user;
            cout << "\nWelcome " << new_user << endl;
            new_index++;


             if (new_index < 5) {
               cout << "Would you like to register another user?:" 
                            <<"'Y' for yes or 'N' for no";
                cin >> user_choice;
            }


            if (user_choice == 'Y' || user_choice == 'y') {
                cout << "\nEnter a new username: ";
                cin >> new_user;
                index = 0;
            }

            else
              break;

        }

    }//end of while 

    system("pause");
    return 0;

}

Эта программа просит пользователя ввести имя пользователя и проверяет, существует ли это имя пользователя уже.Если он существует, он предлагает пользователю использовать другое имя пользователя, а также проверяет, существует ли это имя пользователя уже.Если имя пользователя уникально, программа приветствует нового пользователя и спрашивает, хочет ли пользователь зарегистрировать другого нового пользователя (странно, но я хотел попробовать).Если пользователь хочет добавить другого пользователя на «сайт», скажем, тогда программа запускается снова, проверяя на избыточность.Я ограничил эту программу 5-ю возможными именами пользователей для проверки и добавления для удобства тестирования.Там нет ошибок.

Код просто короткий.Я придумал эту проблему.Я не в школе.Не мог себе этого позволить и не был допущен ни в одну школу, где я подал заявление.Любые предложения для онлайн-школ, которые предлагают степени в области компьютерных наук?

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Вот несколько предложений:

Массив структур, не параллельные массивы

Используйте std::vector структур, а не параллельные массивы:

struct Record
{
    std::string  new_user;
    std::string  current_user;
};
std::vector<Record> database;

Процессоры, которые используют кэш данных, любят, чтобы их элементы были близко друг к другу. Здесь new_user[0] будет рядом с current_user[0] в кэше.

С вашими параллельными массивами new_users[0] находится рядом с current_user[4]; поэтому процессор должен пройти 4 элемента, чтобы добраться до первого элемента new_users.

Развертывание петли

Вы можете исключить цикл for для чтения ваших значений:

read >> current_users[0];
read >> current_users[1];
read >> current_users[2];
read >> current_users[3];
read >> current_users[4];

Это устраняет накладные расходы, связанные с циклом for.

Преобразовать во все нижний или весь верхний регистр перед сравнением

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

if (std::toupper(user_choice) == 'Y')
0 голосов
/ 15 июня 2019

Большая часть того, что у вас есть, хорошо. Я бы обернул все в функцию и использовал бы std::find из стандартной библиотеки, чтобы найти дубликаты.

template<std::size_t N, std::size_t M>
void GetUsers( std::string (&new_users)[N], std::string const (&current_users)[M] ) {
  int idx = 0;
  while (idx < 5) {
    std::cout << "Enter a username: ";
    std::string user; std::cin >> user;
    if (std::find(current_users.begin(), current_users.end(), user) != current_users.end()) {
      std::cout << "That username already exists.\n";
      continue;
    } else {
      new_users[idx++] = user;
      if (idx < 5) {
        std::cout << "Would you like to register another user? [Y/n]: ";
        if (std::tolower(std::cin.get()) == 'y') {
          continue;
        }
      }
      break;
    }
  }
}
...