Преобразование String в Integer C++

348
26 июня 2018, 22:30

Читал другие темы с этим вопросом, но у меня не получается перевести. Программа работает, но вот выводит неправильно. Может подскажете что? Код кидаю снизу, в нем помечу комментариями, что не работает. Текст задания:

Описать класс «Работник». Каждая запись содержит фамилия и инициалы, должность, год поступления на работу, зарплата. Предусмотреть возможность формирования: списка с клавиатуры и из файла, печати всего списка сотрудников; списка работников, стаж работы которых на данном предприятии превышает заданное число лет; списка работников, зарплата которых больше заданной;списка работников, занимающих заданную должность.

#include <iostream>
#include <fstream>
#include <locale.h>
#include <io.h>
#include <cstdlib>
#include <windows.h>
using namespace std;
/***************************НАЧАЛО КЛАССА*****************************/
class plan
{
public:
struct object{
string pfam, pinic, pdolzh;
int pgod;
double pzp;
};
const static int max = 25;
int total;
object array [max];
void setdata_k()
{
for (int i = 0; i <= total; i++)
{
cout << "Фамилия работника: "; cin >> array[i].pfam;
cout << "Инициалы работника: "; cin >> array[i].pinic;
cout << "Должность работника: ";cin >> array[i].pdolzh;
cout << "Год поступления на работу: ";cin >> array[i].pgod;
cout << "Зарплата работника: ";cin >> array[i].pzp;
}
};

void setdata_f()
{
char path [150];
cout << "Введите полный путь к файлу: ";
cin >> path;
if (access(path, 0) != 0)
{
cout << "Не удается открыть файл" << endl;
exit(1);
}
ifstream f(path);
int i = -1;
string s;
while (getline(f, s))
{
i++;
array[i].pfam = s;
getline(f, array[i].pinic);
getline(f, array[i].pdolzh);
getline(f, s); array[i].pgod = atoi(s.c_str());
getline(f, s); array[i].pzp = atoi(s.c_str());
}
total = i;
f.close();
};
void write_all()
{
for (int i = 0; i <= total; i++)
{
cout << "Запись №" << i << endl;
cout <<"Фамилия работника: "<< array[i].pfam << endl;
cout <<"Инициалы работника: "<< array[i].pinic << endl;
cout <<"Должность работника: "<< array[i].pdolzh << endl;
cout <<"Год поступления на работу: "<< array[i].pgod << endl;
cout <<"Заработная плата в рублях: "<< array[i].pzp << endl;
}}
void write_st() // эта функция должна выводить список сотрудников, стаж которых превышает заданное число лет. Но вот проблема, код работает, никаких ошибок, но выводит все сразу, либо ничего;
{
for (int i = 0; i <= total; i++)
{
int staj,st = 0;
st = 2018 - array[i].pgod;
if (st>staj)
{cout << "Запись №" << i << endl;
cout <<"Фамилия работника: "<< array[i].pfam << endl;
cout <<"Инициалы работника: "<< array[i].pinic << endl;
cout <<"Должность работника: "<< array[i].pdolzh << endl;
cout <<"Год поступления на работу: "<< array[i].pgod << endl;
cout <<"Заработная плата в рублях: "<< array[i].pzp << endl;
cout << "_________________________________________________________"<< endl;}}
}
void write_zp()//функция выводит список работников, зп которых больше заданной, опять же та же проблема, либо выводит все записи, либо ничего.
{
for (int i = 0; i <= total; i++)
{
int zp, vspom=0;
vspom=array[i].pzp;
if (vspom > zp)
{cout << "Запись №" << i << endl;
cout <<"Фамилия работника: "<< array[i].pfam << endl;
cout <<"Инициалы работника: "<< array[i].pinic << endl;
cout <<"Должность работника: "<< array[i].pdolzh << endl;
cout <<"Год поступления на работу: "<< array[i].pgod << endl;
cout <<"Заработная плата в рублях: "<< array[i].pzp << endl;
cout << "_________________________________________________________"<< endl;}}
}
void write_dol()//функция выводит список работников, занимающих заданную должность, т.е выборка по должностям; тут вообще ничего не выводит;
{
for (int i = 0; i <= total; i++)
{
string dol;
if (array[i].pdolzh == dol)
{cout << "Запись №" << i << endl;
cout <<"Фамилия работника: "<< array[i].pfam << endl;
cout <<"Инициалы работника: "<< array[i].pinic << endl;
cout <<"Должность работника: "<< array[i].pdolzh << endl;
cout <<"Год поступления на работу: "<< array[i].pgod << endl;
cout <<"Заработная плата в рублях: "<< array[i].pzp << endl;
cout << "_________________________________________________________"<< endl;}}
}

};
/***************************КОНЕЦ КЛАССА*****************************/

/****************************НАЧАЛО MAIN*****************************/
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
plan a;
int c, m, zp=0, staj=0;
string dol;

cout << "Откуда брать исходные данные? " << endl;
cout << "1. С клавиатуры " << endl;
cout << "2. Из файла " << endl;
do { cin >> m; } while (m < 1 || m > 2);
switch (m)
{
case 1:
{
do
{
cout << "Введите кол-во записей (не более " << a.max << "): ";
cin >> c;
}
while (c < 1 || c > a.max);
a.total = --c;
a.setdata_k();
} break;
case 2:
{
a.setdata_f();
cout << "Содержимое файла:" << endl;
a.write_all();
} break;
};
cout << "Что делать дальше? " << endl;
cout << "1. Вывести весь список" << endl;
cout << "2. Список сотрудников, стаж работы которых на данном предприятии превышает заданное число лет " << endl;
cout << "3. Список работников, зарплата которых больше заданной" << endl;
cout << "4. Список работников, занимающих заданную должность." << endl;
cout << "_________________________________________________________"<< endl;
do { cin >> m; } while (m < 1 || m > 4);
switch (m)
{

case 1: a.write_all(); break;
case 2: 
{
cout<<"Введите стаж работника в годах "<< endl; cin>>staj;
a.write_st();
} break;
case 3:
{
cout<<"Введите зарплату "<<endl; cin>>zp;
a.write_zp();
} break;
case 4:
{
cout<<"Введите должность для поиска "<< endl; cin>>dol;
a.write_dol();
} break;
}
cout << "Программа завершена..." << endl;
return 0;
}
/****************************КОНЕЦ MAIN*****************************/
Answer 1

В своих методах вы не проводите инициализацию переменных. Например для правильной работы функции void write_st(), нужно поменять её объявление:

void write_st(int staj)

А из объявлений переменных убрать staj внутри метода. Тогда ваши методы будут выглядеть так:

void write_st(int staj) 
{
    for (int i = 0; i <= total; i++) {
        int st = 2018 - array[i].pgod;
        if (st > staj) {
            cout << "Запись №" << i << endl;
            cout << "Фамилия работника: " << array[i].pfam << endl;
            cout << "Инициалы работника: " << array[i].pinic << endl;
            cout << "Должность работника: " << array[i].pdolzh << endl;
            cout << "Год поступления на работу: " << array[i].pgod << endl;
            cout << "Заработная плата в рублях: " << array[i].pzp << endl;
            cout << "______________________________________________________"
                    "___"
                 << endl;
        }
    }
}
void write_zp(int zp)
{
    for (int i = 0; i <= total; i++) {
        int vspom = array[i].pzp;
        if (vspom > zp) {
            cout << "Запись №" << i << endl;
            cout << "Фамилия работника: " << array[i].pfam << endl;
            cout << "Инициалы работника: " << array[i].pinic << endl;
            cout << "Должность работника: " << array[i].pdolzh << endl;
            cout << "Год поступления на работу: " << array[i].pgod << endl;
            cout << "Заработная плата в рублях: " << array[i].pzp << endl;
            cout << "______________________________________________________"
                    "___"
                 << endl;
        }
    }
}
void write_dol(const std::string& dol)
{
    for (int i = 0; i <= total; i++) {
        if (array[i].pdolzh == dol) {
            cout << "Запись №" << i << endl;
            cout << "Фамилия работника: " << array[i].pfam << endl;
            cout << "Инициалы работника: " << array[i].pinic << endl;
            cout << "Должность работника: " << array[i].pdolzh << endl;
            cout << "Год поступления на работу: " << array[i].pgod << endl;
            cout << "Заработная плата в рублях: " << array[i].pzp << endl;
            cout << "______________________________________________________"
                    "___"
                 << endl;
        }
    }
}

А их использование так:

do {
    cin >> m;
} while (m < 1 || m > 4);
switch (m) {
case 1:
    a.write_all();
    break;
case 2: {
    cout << "Введите стаж работника в годах " << endl;
    cin >> staj;
    a.write_st(staj);
} break;
case 3: {
    cout << "Введите зарплату " << endl;
    cin >> zp;
    a.write_zp(zp);
} break;
case 4: {
    cout << "Введите должность для поиска " << endl;
    cin >> dol;
    a.write_dol(dol);
} break;
}

Т.е. вы не передавали считанные значения в методы, из-за этого возникала такая ошибка. К тому же можно переделать ваш цикл вот таким образом

cin >> m;
while (m >= 1 || m <= 4){   
switch (m) {
case 1:
    a.write_all();
    break;
case 2: {
    cout << "Введите стаж работника в годах " << endl;
    cin >> staj;
    a.write_st(staj);
} break;
case 3: {
    cout << "Введите зарплату " << endl;
    cin >> zp;
    a.write_zp(zp);
} break;
case 4: {
    cout << "Введите должность для поиска " << endl;
    cin >> dol;
    a.write_dol(dol);
} break;
}
cin >> m;
}

Что позволит пользователю выводить интересующие его значения несколько раз, т.е. разные значения, например.

READ ALSO
Перебор всех возможных сумм массива с++

Перебор всех возможных сумм массива с++

Помогите с алгоритмом для программы

207
Некорректное чтение данных из файла

Некорректное чтение данных из файла

Ввожу и считываю данные этим кодом

221
Правка кода поиска мостов в графе

Правка кода поиска мостов в графе

Написал граф через классы на списку смежностиПомогите написать корректный алгоритм поиска мостов

194
Бесконечный скролл фона

Бесконечный скролл фона

Как можно сделать бесконечный скролл фона при этом не теряя гибкости процентных величин?

177