0

メニュー付きのプログラムを作ることができました。最初は、プログラムはスムーズに実行されています。プログラムの特定の時点で、ユーザーが何かを入力し始めてからメニューを再度ナビゲートすると、問題が発生し始めます。

ENTERメニューでキーを押したときに、ユーザーが以前に入力した整数/文字を出力することがあります。

で入力をブロックすることができましたcin.ignore()LEFTしかし、ユーザーが矢印キーと矢印キーを押すたびに、入力バッファー内の (余分なのかゴミなのかわかりません) の表示を削除するにはどうすればよいRIGHTですか? UPまたは、DOWN矢印キー用のものさえあると思いますか?

int main()
{
    color(FG_WHITE);
    bool progFinished = false;
    while (!progFinished) {
        cout << "[ACTIVITY FOR 26 FEBRUARY 2018]\n";
        vector<string> menu = { "Currency Converter","Student Information System" };
        int choice = menu_std(menu, FG_YELLOW, false);
        bool currencyFinished = false;
        bool studentFinished = false;
        switch (choice) {
        case 0:
            while (!currencyFinished) {
                cout << "\n\n[CURRENCY CONVERT]\n";
                vector<string> curr_menu = { "PHP TO OTHERS","USD TO PHP","YEN TO PHP","EUR TO PHP","BHD TO PHP" };
                int currency = menu_std(curr_menu, FG_YELLOW, false);
                double value = validation("\nEnter the value", 0, false);
                CurrencyConverter convert(currency, value);
                cout << "\n\nConvert again? ";
                currencyFinished = !menu_yn(FG_YELLOW);
            }
            system("cls");
            break;
        case 1:
            Studentv2 stud;
            stud.LoadFile();
            while (!studentFinished) {
                cout << "\n\n[STUDENT INFO SYSTEM]\n";
                vector<string> stud_menu = { "Add Student","View All Students" };
                int stud_choice = menu_std(stud_menu, FG_YELLOW, false);
                switch (stud_choice) {
                case 0:
                    stud.AddStudent();
                    cout << "\n\nDo you want to continue with the Student Info System? ";
                    stud.SaveFile();
                    studentFinished = !menu_yn(FG_YELLOW);
                    break;
                case 1:
                    stud.DisplayStudentInformation();
                    cout << "\n\nDo you want to continue with the Student Info System? ";
                    studentFinished = !menu_yn(FG_YELLOW);
                    break;
                }
            }
            system("cls");
            break;
        }
        cout << "\nContinue using the program? ";
        progFinished = !menu_yn(FG_YELLOW);
        system("cls");
    }
    cout << "Press any key to exit.\n";
    cin.get();
    return 0;

}

プログラム内で使用したいくつかの関数のコード スニペット。関数 menu_std():

int menu_std(std::vector<std::string> &menu, WORD atrribute, bool argument)
{
    sleep_for(milliseconds(150));
    int elements = menu.size();
    int elements_max_size = menu.size() - 1;
    int menu_position = 0;
    COORD position = getcoordinates();
    while (true) {
        for (int i = 0; i < elements; i++) {
            move(position.X, position.Y + i);
            if (i == menu_position) {
                color(atrribute);
                std::cout << menu[i];
                color(FG_WHITE);
            }
            else {
                std::cout << menu[i];
            }
        }
        while (true) {
            if (GetAsyncKeyState(VK_UP) < 0 && menu_position != 0) {
                menu_position--;
                break;
            }
            if (GetAsyncKeyState(VK_DOWN) < 0 && menu_position != elements_max_size) {
                menu_position++;
                break;
            }
            if (GetAsyncKeyState(VK_RETURN) < 0) {
                std::cin.ignore(10000, '\n');
                if (argument == true) {
                    sleep_for(milliseconds(100));
                    COORD previous = getcoordinates();
                    std::cout << "\n\nAre you sure? ";
                    bool sure = menu_yn(atrribute);
                    if (sure) {
                        clear_output(previous);
                        return menu_position;
                    }
                    else {
                        clear_output(previous);
                        break;
                    }
                }
                else {
                    return menu_position;
                }
            }
            sleep_for(milliseconds(50));
        }
        sleep_for(milliseconds(175));
    }
}

関数 menu_yn():

bool menu_yn(WORD attribute)
{
    sleep_for(milliseconds(150));
    COORD currentpos = getcoordinates();
    int pos = 0;
    while (true) {
        move(currentpos);
        switch (pos) {
        case 0:
            color(attribute);
            std::cout << "YES";
            color(FG_WHITE);
            std::cout << " NO";
            break;
        case 1:
            std::cout << "YES";
            color(attribute);
            std::cout << " NO";
            color(FG_WHITE);
            break;
        }
        while (true) {
            if (GetAsyncKeyState(VK_RIGHT) < 0 && pos != 1) {
                pos++;
                break;
            }
            if (GetAsyncKeyState(VK_LEFT) < 0 && pos != 0) {
                pos--;
                break;
            }
            if (GetAsyncKeyState(VK_RETURN) < 0) {
                std::cin.ignore(10000, '\n');
                if (pos == 0) {
                    return true;
                }
                else if (pos == 1) {
                    return false;
                }
            }
        }
        sleep_for(milliseconds(175));
    }
}

関数の検証()

double validation(std::string question, double limit, bool argument)
{
    double userInput;
    while (true) {
        std::cout << question << " >> ";
        while (!(std::cin >> userInput)) {
            std::cout << "Error: Non-integer input. " << question << " >> ";;
            std::cin.clear();
            std::cin.ignore(256, '\n');
        }
        std::cin.ignore(10000, '\n');
        while (userInput > limit && limit != 0) {
            std::cout << "Error: Input out-of-bounds. " << question << " >> ";
            std::cin >> userInput;
            std::cin.ignore(10000, '\n');
        }
        if (argument) {
            return (userInput <= 0) ? 1 : userInput;
        }
        else {
            return userInput;
        }
    }
}

問題のスクリーンショット:

問題のスクリーンショット

メニューでEnterキーを押すたびに数字が表示されます。ユーザーがEnterキーを押す前に矢印キーを押すたびに発生すると思われます。

4

0 に答える 0