
КГЭУ
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ ЭНЕРГЕТИЧЕСКИЙ УНИВЕРСИТЕТ» |
Кафедра «Инженерная кибернетика»
|
|
|
|
|
|
|
|
|
|
ПРОГРАММИРОВАНИЕ
Отчет о лабораторной работе № 2.
Разработка программ для работы со структурами данных
Исполнитель: Садриев Ильмас
Группа: ПОВТ-1-11
Вариант № 7
Дата выполнения 13 марта 2012 г.
Дата сдачи _____________ Оценка __________
Подпись преподавателя _______________________
КАЗАНЬ - 2012
Задача № 1
Постановка задачи.
В текстовом файле хранится база данных отдела кадров предприятия.
На предприятии 100 сотрудников.
Каждая строка файла содержит запись об одном сотруднике.
Формат записи:
фамилия – 10 позиций (начинается с первой позиции);
год рождения – 6 позиций;
оклад – 6 позиций.
Составить программу, которая по заданной фамилии выводит на экран и записывает в выходной файл сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников.
2. Алгоритм решения задачи.
Сведения о сотрудниках считать из файла и записать в символьный массив.
Организовать цикл запроса сведений о сотруднике:
ввод фамилии (с клавиатуры);
поиск фамилии сотрудника в массиве;
увеличить счетчик кол-ва сотрудников и суммарный оклад;
вывести сведения о сотруднике или сообщение об их отсутствии.
Вывести средний оклад.
3. Листинг программы 1.
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
// преобразование DOS to Win
void DosToWin(char *s1 , char *s2, int Lname)
{
int kod;
for(int i=0; s1[i] != 0 ; i++)
{
kod = (int) s1[i];
if (( kod>=-128) && ( kod<=-81) )
s2[i] = (kod+64);
if (( kod>=-32) && ( kod<=-17))
s2[i] = (kod+16);
if (kod==-16) s2[i]= -88;
if ( kod==-15) s2[i] = -72;
}
}
int main( )
{
setlocale(0, "");
const int Lname = 10, //фамилия
Lyear = 6, // год рождения
Lpay = 6, // оклад
Lbuf = Lname + Lyear + Lpay; // длина буфера
struct Man // структура
{ // поля структуры
int birth_year; // год рождения
char name[Lname + 1]; // фамилия
float pay; // оклад
};
const int Ldbase = 10; // кол-во сотрудников
Man dbase[Ldbase]; //определение массива структур
char buf[Lbuf + 1]; // буфер для ввода строки из файла
char *name = new char [Lname + 1]; // для ввода фамилии запрашиваемого сотрудника
ifstream fin("TextFile2.txt"); // открытие файла для чтения
ofstream fout("Out.txt"); // создание файла для записи результатов
if(!fin)
{
cout << "Ошибка открытия файла" << endl;
return 1;
}
int i=0; // номер текущей строки
while(fin.getline(buf, Lbuf)) // цикл для построчного считывания из файла
{
if(i>=Ldbase) // проверка на превышение считанного кол-ва строк размерности массива
{
cout << "Слишком длинный файл ";
return 2;
}
strncpy(dbase[i].name, buf, Lbuf); // копирование считанной строки
dbase[i].name[Lname]='\0'; // запись нуль-символа после фамилии
dbase[i].birth_year = atoi(&buf[Lname]); // преобразование строки в целое число
// &buf[Lname] - это адрес начала начала подстроки, в которой находится год рождения (после фамилии)
dbase[i].pay = atof(&buf[Lname + Lyear]); // преобразование строки в вещественное число
// &buf[Lname + Lyear]- это адрес начала начала подстроки,
// в которой находится зарплата (после года рождения)
i++;
}
int Nrecord = i, // кол-во записей
Nman = 0; // кол-во просмотренных сотрудников
float mean_pay = 0; // сумма окладов сотрудников, для которых выводились сведения
while(true) // бесконечный цикл поиска сотрудника по фамилии
{ // с принудительным выходом (при вводе end вместо фамилии)
cout << "Введите фамилию или слово end" << endl;
cin >> name;
DosToWin(name, name, Lname); // преобразование кодировки
if(strcmp(name, "end") == 0 ) break; // проверка ввода "end"
bool not_found = true; // переменная-флаг "фамилия не найдена"
for(i=0; i< Nrecord; i++) // цикл просмотра массива структур
{
if((strstr(dbase[i].name, name))) // проверка совпадения фамилии
if(dbase[i].name[strlen(name)] ==' ') // есть-ли после фамилии пробел?
{
cout << setw(10) << name << ": год рожд." << dbase[i].birth_year << " оклад " << dbase[i].pay << endl;
fout << setw(10) << name << ": год рожд." << dbase[i].birth_year << " оклад " << dbase[i].pay << endl;
Nman++; // кол-во просмотренных сотрудников
mean_pay += dbase[i].pay; // // сумма окладов сотрудников, для которых выводились сведения
not_found = false; // фамилия найдена
}
}
if(not_found) cout << " Такого сотрудника нет " << endl;
}
// при завершении работы программы выводится средний оклад
if(Nman > 0)
{
cout << "Средний оклад " << mean_pay / Nman << endl; // для которых выводились сведения
fout << "Средний оклад " << mean_pay / Nman << endl; // для которых выводились сведения
}
fout.close();
return 0;
}