Читал другие темы с этим вопросом, но у меня не получается перевести. Программа работает, но вот выводит неправильно. Может подскажете что? Код кидаю снизу, в нем помечу комментариями, что не работает. Текст задания:
Описать класс «Работник». Каждая запись содержит фамилия и инициалы, должность, год поступления на работу, зарплата. Предусмотреть возможность формирования: списка с клавиатуры и из файла, печати всего списка сотрудников; списка работников, стаж работы которых на данном предприятии превышает заданное число лет; списка работников, зарплата которых больше заданной;списка работников, занимающих заданную должность.
#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*****************************/
В своих методах вы не проводите инициализацию переменных. Например для правильной работы функции 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;
}
Что позволит пользователю выводить интересующие его значения несколько раз, т.е. разные значения, например.
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Написал граф через классы на списку смежностиПомогите написать корректный алгоритм поиска мостов
Как можно сделать бесконечный скролл фона при этом не теряя гибкости процентных величин?