Задать вопрос
@lexinti

Как заставить работать код C++ правильно?

Добрый вечер, уже часа 3 бьюсь над кодом С++(код ниже), при введении в строку "фамилия и инициалы" через консоль к примеру "Данилов А.В." или "Данилов Антон Игоревич", код начинает работать не правильно, он начинает пропускать ввод в следующие переменные(либо начиная вводить нового(цикл с начала) сотрудника пропускает ввод фамилии и инициалов), как я понял связано это с пробелами(точками), использовал cin.getline и _flushall(); но не помогает. Прошу помогите поправить код.

#include <windows.h>
#include <iostream>

using namespace std;

struct Worker { // начало объявления структурного типа Worker

    char surname[30]; //объявление поля «фамилия работника»

    char position[15]; //объявление поля «название занимаемой должности»

    unsigned short int year; //объявление поля «год поступления на работу»

}; //конец объявление структуры Worker
int main()
{
    system("chcp 1251");
    int n = 3; // объявление константы n — числа элементов типа «Worker»

    bool people = false;

    unsigned short int now_year = 2020, seniority; // объявление переменных now_year — текущий год и seniority — стаж

    Worker* K = new Worker[n];

    Worker temp;

    for (int i = 0; i < n; i++)

    {
        cout << "Фамилия и инициалы: ";

        cin >> K[i].surname;

        cout << "\nНазвание занимаемой должности: ";

        cin >> K[i].position;

        cout << "\nГод поступления на работу: ";

        cin >> K[i].year;

        cout << "\n";
    }

    cout << "Введите стаж работы(лет): ";

    cin >> seniority;

    for (int i = 0; i < n; i++)

    {
        if ((now_year - K[i].year) > seniority)

        {
            cout << '\n' << K[i].surname;

            people = true;
        }
    }

    if (people == false) cout << "Нет таких работников!" << endl;

    cout << "\nСписок работников в алфавитном порядке" << endl;

    for (int i = 0; i < n - 1; i++)

    {
        for (int j = 0; j < n; j++)

            if (strcmp(K[i].surname, K[j].surname) > 0)

            {
                temp = K[i];

                K[i] = K[j];

                K[j] = temp;
            }
    }

    for (int i = 0; i < n; i++)

        cout << '\n' << K[i].surname << endl;

    system("pause");

    return 0;
}
  • Вопрос задан
  • 133 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@none7
Могу предположить, что cin >> K[i].year; не читает завершение строки(ведь они не число) и оно прилетает на ввод следующего имени. Вообще в нынешнем с++ использование указателей и неуправляемых массивов — ересь.
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <ctime>

using namespace std;

const int UserCount = 3;
struct Worker { // начало объявления структурного типа Worker
    string surname; //объявление поля «фамилия работника»
    string position; //объявление поля «название занимаемой должности»
    unsigned short int year; //объявление поля «год поступления на работу»

    static bool insensitive_compare(const Worker& a, const Worker& b)
    {
        string ta(a.surname), tb(b.surname);
        transform(ta.begin(), ta.end(), ta.begin(), [](unsigned char c) { return std::toupper(c); });
        transform(tb.begin(), tb.end(), tb.begin(), [](unsigned char c) { return std::toupper(c); });
        return ta < tb;
    }
}; //конец объявление структуры Worker

template<class T> void getline_i(istream& is, T& o)
{
    string s;
    while (true)
    {
        getline(is, s);
        stringstream(s) >> o;

        if (s.length() < 1 || !isdigit(s[0]))
        {
            cout << "Ошибка. Значение должно быть числом: ";
            continue;
        }
        else
        {
            break;
        }
    }
}

int main()
{
    system("chcp 1251");
    int n = 3; // объявление константы n — числа элементов типа «Worker»

    bool people = false;

    time_t rawtime;
    struct tm _tm;

    time(&rawtime);
    gmtime_s(&_tm, &rawtime);
    unsigned short int now_year = _tm.tm_year + 1900, seniority; // объявление переменных now_year — текущий год и seniority — стаж
    vector<Worker> K;
    Worker temp;

    for (int i = 0; i < UserCount; i++)
    {
        cout << "Фамилия и инициалы: ";
        getline(cin, temp.surname);

        cout << "Название занимаемой должности: ";
        getline(cin, temp.position);

        cout << "Год поступления на работу: ";
        getline_i(cin, temp.year);

        cout << "\n";
        K.push_back(temp);
    }

    cout << "Введите стаж работы(лет): ";
    getline_i(cin, seniority);

    cout << endl;

    for (auto current : K)
    {
        if ((now_year - current.year) > seniority)
        {
            cout << current.surname << endl;
            people = true;
        }
    }

    if (people == false) 
        cout << "Нет таких работников!" << endl;

    cout << endl;
    cout << "Список работников в алфавитном порядке" << endl;

    sort(K.begin(), K.end(), Worker::insensitive_compare);

    for (auto current : K)
        cout << current.surname << endl;

    system("pause");
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы