Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Образец отчета по программированию*.docx
Скачиваний:
43
Добавлен:
10.06.2015
Размер:
70.4 Кб
Скачать

КГЭУ

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ ЭНЕРГЕТИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра «Инженерная кибернетика»

ПРОГРАММИРОВАНИЕ

Отчет о лабораторной работе № 2.

Разработка программ для работы со структурами данных

Исполнитель: Садриев Ильмас

Группа: ПОВТ-1-11

Вариант № 7

Дата выполнения 13 марта 2012 г.

Дата сдачи _____________ Оценка __________

Подпись преподавателя _______________________

КАЗАНЬ - 2012

Задача № 1

  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;

}