Консультация № 177765
09.04.2010, 03:46
0.00 руб.
0 4 1
Уважаемые эксперты, помогите в написании следующей программы на языке С++:

Написать, используя технику указателей, программу работы с базой отдела кадров. База размещается в текстовом файле произвольного размера. Каждая строка – запись об одном сотруднике.

Формат записи о сотруднике:
Фамилия и инициалы (через точку) - 30 символов, фамилия начинается в 1-й позиции,
Год рождения – 5 символов.
Заработная плата (оклад) – 10 позиций.

Функции программы:
Поиск по заданному критерию,
Дополнение записи,
Исключение записи,
Корректировка записи.

Обсуждение

Неизвестный
09.04.2010, 09:46
общий
Во всех С счет элементов в массивах начинается с нуля, видимо, Вашу фразу "начинается в 1-й позиции" надо понимать правильно: с нулевой?
Неизвестный
09.04.2010, 13:07
общий
ну да=) простите за некорректность...
Неизвестный
13.04.2010, 20:42
общий
Sanches:
Каким образом надо использовать указатели? Вернее, для чего? Вряд ли имеется в виду FILE*...
Неизвестный
14.04.2010, 01:26
общий
это ответ
Здравствуйте, Sanches.
Вот простейшая реализация, без контроля ввода и прочих красивостей, в этом смысле хорошо бы добавить проверки. Поиск сделала по имени или части имени. Условие про точку учла чисто условно, потому что не вижу в нём особого смысла. Если что-то не так, Вы всегда можете дополнить или расширить программу по аналогии.
Указатели как факт используются - для работы со строками и файлами, хотя я и не уверена, что Вы это имели в виду. Речь могла идти о считывании файла в память, но это нерационально и так обычно не делают.
Если что-то не ясно, спрашивайте. Проверено на Visual Studio 2005.
Удачи!

Приложение:
#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdio.h>
using namespace std;

/*Написать, используя технику указателей, программу работы с базой отдела кадров.
База размещается в текстовом файле произвольного размера. Каждая строка – запись об одном сотруднике.

Формат записи о сотруднике:
Фамилия и инициалы (через точку) - 30 символов, фамилия начинается в 1-й позиции,
Год рождения – 5 символов.
Заработная плата (оклад) – 10 позиций.

Функции программы:
Поиск по заданному критерию,
Дополнение записи,
Исключение записи,
Корректировка записи.*/

const char bd [] = "c:\\bd.txt"; //база
const int record_len = 45; //длина записи

struct Worker { //запись
char name[31]; //имя
int year; //год
int salary; //зарплата
};

bool ProcessLine (const char* line, Worker& rec) //преобразование строки в структуру
{
if (strlen (line)<record_len) return false;
char y[6], sr[11];
memset (rec.name, 0, sizeof(rec.name));
strncpy (rec.name, line, 30);
char* t = strchr (rec.name, '.');
if (t) *t = ' ';
strncpy (y, line+30, 5);
strncpy (sr, line+35, 10);
rec.year = atoi (y);
if (rec.year == 0) return false;
rec.salary = atoi (sr);
if (rec.salary == 0) return false;
return true;
}

bool CheckWorker (const char* name, Worker rec) //проверка на вхождение имени
{
if (strstr (rec.name, name)!=NULL) return true;
else return false;
}

void PrintWorker (Worker rec, int id) //печать структуры
{
printf ("\n%3i: %30s %5i %10i", id, rec.name, rec.year, rec.salary);
}

void Search () //поиск по имени или части имени
{
char nm [31];
cin >> nm;
FILE* fl;
fopen_s (&fl, bd, "rt");
char buf [record_len+2];
Worker tmp;
int id = 0;
while (fgets (buf, record_len+2, fl)) {
if (!ProcessLine (buf, tmp)) continue;
if (CheckWorker (nm, tmp)) PrintWorker (tmp, id);
id++;
}
fclose (fl);
}

void AddNew () //добавление новой записи
{
Worker rec;
cin >> rec.name;
cin >> rec.year;
cin >> rec.salary;
FILE* fl;
fopen_s (&fl, bd, "a+t");
char line [record_len+2];
memset (line, 0, sizeof(line));
sprintf (line, "%30s%5i%10i\n", rec.name, rec.year, rec.salary);
fputs (line, fl);
fclose (fl);
}

void DelRec () //удаление записи
{
int ndid;
cin >> ndid;
FILE* fl;
fopen_s (&fl, bd, "rt");
FILE* temp; //временный файл
fopen_s (&temp, "c:\\bdtemp.txt", "wt");
char line [record_len+2];
int id = 0;
while (fgets (line, record_len+2, fl)) {
if (id!=ndid) fputs (line, temp);
id++;
}
fclose (temp);
fclose (fl);
remove (bd); //удаляем старый и переименовываем временный в старый
rename ("c:\\bdtemp.txt", bd);
}

void EditRec () //редактирование записи
{
int ndid;
cin >> ndid;
FILE* fl;
fopen_s (&fl, bd, "r+t");
fseek (fl, (record_len+1)*ndid, SEEK_SET);
Worker rec;
char line [record_len+2];
fgets (line, record_len+1, fl);
if (ProcessLine (line, rec)) PrintWorker (rec, ndid);
fseek (fl, (record_len+1)*ndid, SEEK_SET);
cin >> rec.name;
cin >> rec.year;
cin >> rec.salary;
memset (line, 0, sizeof(line));
sprintf (line, "%30s%5i%10i\n", rec.name, rec.year, rec.salary);
fputs (line, fl);
fclose (fl);
}

int main()
{
int ch = 0;
while (ch!=5) {
system ("cls");
cout << "1. Add\n2. Search\n3. Delete\n4. Edit\n5. Exit\n";
cin >> ch;
switch (ch) {
case 1:
AddNew ();
break;
case 2:
Search ();
_getch();
break;
case 3:
DelRec ();
break;
case 4:
EditRec ();
break;
}
}
}

5
Форма ответа