Задача: Обработка структур с использованием файлов

  • Автор темы -
  • Дата начала
Статус
Закрыто для дальнейших ответов.

Гость
#1
Написать программу обработки файла типа запись, содержащую следующие пункты меню: «Создание», «Просмотр», «Коррекция» (добавление новых данных или редактирование старых), «Решение задания».
Каждая запись должна содержать следующую информацию о студентах:
– фамилия и инициалы;
– год рождения;
– номер группы;
– оценки за семестр: по физике, математике, информатике, химии;
– средний балл.
Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.
Содержимое всего файла и результаты решения задания записать в текстовый файл.


Задание:Распечатать анкетные данные студентов группы, имеющих средний балл выше введенного с клавиатуры.
Что то написал,но дальше вообще непонимаю,и даже не факт что это правельно...Помогите решить пожалуйста.
Код:
#include <stdio.h>
#include <io.h>
struct TZap{
char FIO[30];
double s_b;
} Zap;
int size = sizeof(TZap);
FILE *Fz, *Ft;
char File_Zap[] = "zapisi.dat";
char File_Rez[] = "rezult.txt";
void Out(TZap);

void main()
{
int kod, D_f, i=0, j, kol;
long len;
TZap st, *mas_Z;
Ft = fopen(File_Rez, "w");
while(true) {
scanf("%d", &kod);
switch(kod) {
case 1:
if ((Fz=fopen(File_Zap,"wb"))==NULL) {
puts("\n Create ERROR!");
return;
}
fclose(Fz);
printf("\n Create New File %s !\n",File_Zap);
break;
case 2:
Fz = fopen(File_Zap,"ab");
printf("\n F.I.O. – ");
fflush(stdin);		
gets(Zap.FIO);
printf(" Ball – ");		
scanf("%lf", &Zap.s_b);
fwrite(&Zap, size, 1, Fz);
fclose(Fz);
break;
case 3:
if ((Fz=fopen(File_Zap,"rb"))==NULL) {
puts("\n Open ERROR!");
return;
}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#2
Задание:Распечатать анкетные данные студентов группы, имеющих средний балл выше введенного с клавиатуры.
Что то написал,но дальше вообще непонимаю,и даже не факт что это правельно...Помогите решить пожалуйста.
Прокомментируйте пожалуйста свой код, желательно построчно, мне нужно удостоверится, что вы понимаете то что делаете и я обязательно Вам помогу
 

BashOrgRu

Well-Known Member
15.03.2009
77
0
25
Москва
#3
Посидел часик и вот решение)) Полностью рабочее. Команды Create - создание файла из записей, на вопрос продолжить 1 - да, 0 - нет. Show - вывести файл. Edit - редактировать файл, после ввода этой команды, показывает все записи в файле вместе с ихними номерами, затем если набрать edit - редактируете запись, add - добавляете запись, exit - выйти из редактирования. Work - выполнить задание. exit - выйти из программы.
Но, в функции Edit есть какая-то маленькая ошибка, когда после каждого команды выводит что не знает этой команды, можно, конечно, закоментить этот момент, но советую вам всё-таки найти и исправить этот недочёт.

C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct _studD{
char fam[30];
double sred;
int year;
int num,phis,math,inf,him;
};

struct _stud{
char fam[30];
double sred;
int year;
int num,phis,math,inf,him;
struct _stud *next;
};

char *DobStr(char *str,int n){
char *str1=malloc(2*n*sizeof(char));
int i=0;

for (i=0;i<=n;i++) str1[i]=str[i];
return str1;
}

char *ReadStr(){
int n=32,i=0,c;
char *str=malloc(n*sizeof(char));

while ((c=getchar())!='\n'){
if (i==n){
str=DobStr(str,n);
n=2*n;
}
str[i]=c;
i++;
}
str[i]='\0';
return str;
}

void Ravn(char masIn[30],char masOut[30]){
int i;

for (i=0;i<30;i++) masIn[i]=masOut[i];
}


struct _stud *GetList(FILE *f){
struct _stud *head,*elem;
struct _studD *elemD;

head=(struct _stud *)malloc(sizeof(struct _stud));
elem=head;
while(!feof(f)){
fread(elem,sizeof(struct _stud),1,f);
if (!feof(f)) elem->next=(struct _stud *)malloc(sizeof(struct _stud));
else		elem->next=NULL;
elem=elem->next;
}
elem=head;
while((elem->next)->next!=NULL) elem=elem->next;
elem->next=NULL;
return head;
}

void printLink(struct _stud *elem){
printf("\nФИО: %s\n",elem->fam);
printf("Год рождения: %d\n",elem->year);
printf("Оценки:\n");
printf("1.Физика:%d\n2.Математика:%d\n3.Информатика:%d\n4.Химия:%d\n",elem->phis,elem->math,elem->inf,elem->him);
printf("Средний бал:%f\n",elem->sred);
}


void writeList(struct _stud *head,FILE *fw){
struct _stud *elem;
struct _studD *elemD=malloc(sizeof(struct _studD));

elem=head;
while(elem!=NULL){
fwrite(elem,sizeof(struct _stud),1,fw);
elem=elem->next;
}
}

void ReadMas(char mas[30]){
int i=0,c;
while((c=getchar())!='\n'){
mas[i]=c;
i++;
}
mas[i]='\0';
}

struct _stud *ReadLink(){
struct _stud *elem;

elem=(struct _stud *)malloc(sizeof(struct _stud));
printf("ФИО:\n");
ReadMas(elem->fam);
printf("\nГод рождения: ");
scanf("%d",&elem->year);
printf("\nОценки:\n");
printf("1.Физика: ");
scanf("%d",&elem->phis);
printf("2.Математика: ");
scanf("%d",&elem->math);
printf("3.Информатика: ");
scanf("%d",&elem->inf);
printf("4.Химия: ");
scanf("%d",&elem->him);
elem->sred=(elem->phis+elem->math+elem->inf+elem->him)/4.0;
elem->next=NULL;
return elem;
}

void DellList(struct _stud *head){
struct _stud *elem,*elem1;

elem=head;
while (elem!=NULL){
elem1=elem->next;
free(elem);
elem=elem1;
}
}

int main(){
int n,run=1,run1,i;
struct _stud *head,*elem,*elemR;
FILE *fp;
char *In,*fn,*Sn;

while(run){
In=ReadStr();
if (!strcmp(In,"Create\0")){
printf("\nВведите имя файла: ");
fn=ReadStr();
if ((fp=fopen(fn,"wb"))==NULL){
perror("file");
exit(0);
}
n=1;
head=ReadLink();
elem=head;
while(n){
printf("Продолжить?\n");
scanf("%d",&n);
if (n){
elem->next=ReadLink();
elem=elem->next;
}
}
writeList(head,fp);
fclose(fp);
printf("\nФайл создан.\n");
}else
if (!strcmp(In,"Show\0")){
printf("\nВведите имя файла: ");
fn=ReadStr();
if ((fp=fopen(fn,"r+b"))==NULL){
perror("file");
exit(0);
}
head=GetList(fp);
elem=head;
while(elem!=NULL){
printLink(elem);
elem=elem->next;
}
fclose(fp);
}else
if (!strcmp(In,"Edit\0")){
printf("\nВведите имя файла: ");
fn=ReadStr();
if ((fp=fopen(fn,"r+b"))==NULL){
perror("file");
exit(0);
}
head=GetList(fp);
elem=head;
n=1;
while(elem!=NULL){
printf("\nЭлемент номер %d:\n",n);
printLink(elem);
elem=elem->next;
n++;
}
run1=1;
while(run1){
Sn=ReadStr();
if (!strcmp(Sn,"edit\0")){
printf("Введите запись: \n");
elemR=ReadLink();
printf("Введите номер записи: \n");
scanf("%d",&n);
elem=head;
if (n==1){
elemR->next=head->next;
free(head);
head=elemR;
}
else{
for(i=1;i<(n-1);i++) elem=elem->next;
elemR=(elem->next)->next;
free(elem->next);
elem->next=elemR;
}
printf("Запись успешно изменена.\n");
}else
if (!strcmp(Sn,"add\0")){
elem=head;
while(elem->next!=NULL) elem=elem->next;
printf("Введите запись: \n");
elemR=ReadLink();
elem->next=elemR;
printf("Запись успешно добавлена.\n");
}else
if (!strcmp(Sn,"exit\0")) run1=0;
else printf("Я не знаю такой команды.\n");
}
fclose(fp);
fp=fopen(fn,"wb");
writeList(head,fp);
fclose(fp);
printf("\nФайл изменён.\n");
}else
if (!strcmp(In,"Work\0")){
printf("\nВведите имя файла: ");
fn=ReadStr();
if ((fp=fopen(fn,"r+b"))==NULL){
perror("file");
exit(0);
}
printf("\nБалл=");
scanf("%d",&n);
printf("\n");
head=GetList(fp);
elem=head;
while(elem!=NULL){
if (elem->sred>n) printLink(elem);
elem=elem->next;
}
fclose(fp);
printf("\nОперация выполнена.\n");
}else
if (!strcmp(In,"exit\0")) run=0;
else printf("Я не знаю этой команды.\n");

}
return 0;
}
 

Гость
#4
Благодарю.А можно краткое пояснение к коду?А то не всё понимаю
 

BashOrgRu

Well-Known Member
15.03.2009
77
0
25
Москва
#5
Нууу. Кратко пояснить не получится, да и мне не особо хочется, там 200 с лишним строк кода. Ну если уж совсем просто, то мы считываем строку, которую вводит пользователь, распознаём в ней команду и выполняем её, для работы со структурами используем список из самих структур. Не всё же я должен за вас делать, я вам и так готовое решение задачи предоставил, которую вряд ли кто-нибудь бесплатно бы сделал, так что хоть постарайтесь сами понять как там всё работает.
 

Гость
#6
Действительно,что то я обнаглел)Большое спасибо за код,поробую сам разобраться
 
Статус
Закрыто для дальнейших ответов.