Консультация № 167104
12.05.2009, 19:12
0.00 руб.
0 0 0
Уважаемые эксперты
есть программа написанная на языке Си, нужно добавить в меню пункты ДОБАВЛЕНИЕ и УДАЛЕНИЕ элементов списка

Входные данные программы находятся в файле “patient.txt”. Число строк в файле - произвольное. Каждая строка содержит фамилию с инициалами (25 символов), год рождения (5 символов), дату поступления (9 символов) и диагноз (до 40 символов). Пример строки файла:

Анисимов Д.Г. 1961 12.05.04 инфаркт миокарда
| 25 | 5 | 9 | <= 40 |

Спасибо за внимание

Приложение:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define DL_FIO 25 /* длина поля фамилии в файле */
#define DL_GR 5 /* длина поля года рождения */
#define DL_DATA 9 /* длина поля даты поступления */
#define DL_DIAG 40 /* макс. длина диагноза */

struct pacient /* структура записи входного файла */
{ char fio[DL_FIO]; /* фамилия и инициалы пациента */
char gr [DL_GR]; /* год рождения */
char data[DL_DATA]; /* дата поступления */
char diag[DL_DIAG+2]; /* диагноз + '\n' + '\0' */
};

/* прототипы функций */
void Date(FILE *f);
void MiddleAge(FILE *f);
void Diagnos(FILE *fin);
int Age (char gr[DL_GR]);

/*----------------------*/
/* главная функция */
/*----------------------*/

int main()
{
FILE *f; /* ссылка на входной файл */
char n; /* номер пункта меню */

clrscr();
f= fopen("patient.txt", "r");
if (f==NULL)
{ puts ("Файл patient.txt не найден");
getch();
return 1;
}
do
{ puts ("\n========================================================");
puts ("Выберите номер пункта меню:");
puts ("1 - вывод списка пациентов, поступивших в заданный день");
puts ("2 - определение среднего возраста пациентов");
puts ("3 - запись в новый файл списка пациентов с заданным диагнозом");
puts ("4 - выход");
puts("------------------------------------------------------");
n = getche();
switch(n)
{
case '1': Date(f); break;
case '2': MiddleAge(f); break;
case '3': Diagnos(f); break;
case '4': break;
default: puts("\nНужно вводить номер пункта от 1 до 4");
}
if (n!='4')
{ puts("\nДля продолжения нажмите любую клавишу");
getch();
}
}
while (n != '4');
fclose(f);
return 0;
}
/*--------------------------------------*/
/* Функция вывода списка пациентов, */
/* поступивших в заданный день */
/*--------------------------------------*/

void Date (FILE *f)
{
char zdata[DL_DATA]; /* заданная дата поступления */
int n=0; /* порядковый номер пациента в выводимом списке */
struct pacient tz; /* текущая запись файла */

puts ("\nВведите дату поступления в виде: дд.мм.гг");
gets (zdata);
rewind(f);
while (fgets(&tz,sizeof(struct pacient),f) != NULL)
if (strncmp(tz.data,zdata,DL_DATA-1) == 0 )
{ if (n==0)
{ puts("№ Фамилия И.О. Год рожд. Диагноз");
puts("--------------------------------------------------");
}
tz.gr[DL_GR - 1] = '\0';
printf ("%d. %s %s", ++n, tz.fio, tz.diag);
}
if (n==0) puts ("\nНет пациентов, поступивших в заданный день");
}

/*-------------------------------------------------*/
/* функция определения среднего возраста пациентов */
/*-------------------------------------------------*/

void MiddleAge(FILE *f)
{
struct pacient tz; /* текущая запись файла */
float s = 0; /* сумма возрастов всех пациентов */
int k = 0; /* количество пациентов в файле */

rewind (f);
while (fgets(&tz,sizeof(struct pacient),f) != NULL)
{ s += Age(tz.gr);
k++;
}
if (k) printf ("\nСредний возраст пациентов:%.1f\n",s/k);
else puts ("\nФайл patient.txt пустой");
}

/*-----------------------------------------------*/
/* функция определения возраста по году рождения */
/*-----------------------------------------------*/

int Age (char gr[DL_GR])
{
int igr = atoi(gr); /* год рождения типа int */
long timer; /* число секунд, прошедших с начала 1970 года
до текущего момента */
int year; /* текущий год */
struct tm *t; /* указатель на структуру, содержащую текущую
дату и время */

timer = time (NULL); /* получение числа секунд, прошедших с начала 1970 года */
t = localtime(&timer);/* преобразование в структуру типа tm */
year = 1900+ t->tm_year; /* определение тек. года */
return year - igr;
}

/*------------------------------------------------*/
/* функция записи в новый файл списка пациентов */
/* с заданным диагнозом */
/*------------------------------------------------*/

void Diagnos(FILE *fin)
{
char fname[13]; /* имя выходного файла */
FILE *fout; /* ссылка на выходной файл */
char zdiag[DL_DIAG+1]; /* заданный диагноз */
int net=1; /* признак того, что нет пациентов с заданным диагнозом */
struct pacient tz; /* текущая запись файла */

puts ("\nВведите имя выходного файла");
gets (fname);
fout = fopen(fname,"w");
puts ("Укажите диагноз");
gets (zdiag);
rewind(fin);
while (fgets(&tz,sizeof(struct pacient),fin))
if (strstr(tz.diag,zdiag))
{ net=0;
tz.data[DL_DATA-1] = '\n';
fwrite (&tz,sizeof(struct pacient) - DL_DIAG - 2,1,fout);
}
fclose (fout);
if (net) { puts ("Нет пациентов с заданным диагнозом");
unlink(fname); /* удаление созданного файла */
}
else puts("Запись в файл завершена");

}

Обсуждение

Форма ответа