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

Тема в разделе "C/C++/C#", создана пользователем -, 28 ноя 2010.

Статус темы:
Закрыта.
  1. Гость

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


    Задание:Распечатать анкетные данные студентов группы, имеющих средний балл выше введенного с клавиатуры.
    Что то написал,но дальше вообще непонимаю,и даже не факт что это правельно...Помогите решить пожалуйста.
    Код (Text):
    #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;
    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Прокомментируйте пожалуйста свой код, желательно построчно, мне нужно удостоверится, что вы понимаете то что делаете и я обязательно Вам помогу
     
  3. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Посидел часик и вот решение)) Полностью рабочее. Команды 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. Гость

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

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Нууу. Кратко пояснить не получится, да и мне не особо хочется, там 200 с лишним строк кода. Ну если уж совсем просто, то мы считываем строку, которую вводит пользователь, распознаём в ней команду и выполняем её, для работы со структурами используем список из самих структур. Не всё же я должен за вас делать, я вам и так готовое решение задачи предоставил, которую вряд ли кто-нибудь бесплатно бы сделал, так что хоть постарайтесь сами понять как там всё работает.
     
  6. Гость

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

    исправил)
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Граг , l1pton17 :
    Что, эту тему можно закрывать??? Все обсудили уже? :)
     
  9. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Я думаю, что да)
     
Загрузка...
Похожие Темы - Задача Обработка структур
  1. Янчик
    Ответов:
    0
    Просмотров:
    490
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    783
  3. elzim
    Ответов:
    0
    Просмотров:
    932
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.128
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.108
Статус темы:
Закрыта.

Поделиться этой страницей