2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите найти ошибку в программе
Сообщение18.05.2008, 12:43 
Аватара пользователя


01/12/07
172
Программа должна читать список из файла, но выводит полный бред, а потом вобще вылетает :( :cry:
Код:
#include<stdio.h>
#include<stdlib.h>
#define N 3

struct student {
   char name[50];
   char surname[50];
   int year;
   struct student* next;
   struct student* prev;
  } ;
struct student*root=NULL;
struct student* AddToList(struct student* root,struct student* p){
   if(NULL==p){
      return root;
     };
   p->next=root;
   p->prev=p->next;
   return p;
   };


struct student* INPUT_STUDENTS(student*root){
   student*p=(student*)malloc(sizeof(student));
   if (p==NULL) {
      printf("error");
      return 0;
     };

   FILE*f=fopen("student.txt","a+");
   printf("vvedit name\n");
   scanf("%s",p->name);
   fprintf(f,"%s\n",p->name);
   printf("vvedit surname\n");
   scanf("%s",p->surname);
   fprintf(f,"%s\n",p->surname);
   printf("year\n");
   scanf("%d",&(p->year));
   fprintf(f,"%d\n",p->year);
   fclose(f);
   return p;
};
struct student*read(){
   
   FILE*f=fopen("student.txt","a+");
   while(!feof(f)){
      struct student*p=(struct student*)malloc(sizeof(struct student));
      fscanf(f,"%s",p->name);
      fscanf(f,"%s",p->surname);
      fscanf(f,"%d",&(p->year));
      root=p;
            
   };
   fclose(f);
   return root;
};


void PRINT_LIST(struct student*root){
   while(root!=NULL) {
      printf(" %s %s %d \n",root->name,root->surname,root->year);
   
      root=root->next;
   };
};

void main(){
   int a;
   printf("if you want add student to file press 1\nif you want read file press2\n");
   scanf("%d",&a);
   if(a==1){
      for(int i=0;i<N;i++){
         root=AddToList(root,INPUT_STUDENTS(root));
      }
   }
   if(a==2)
      root=read();
   PRINT_LIST(root);
}

 Профиль  
                  
 
 
Сообщение18.05.2008, 13:45 


27/11/05
183
Северодонецк
Когда больной приходит к врачу, скажем, с признаками отравления,
то его лечение зависит от того, что он вкушал накануне:
самогон без меры, грибы, похожие на мухомор, или здесь
замешана змея со своим укусом. В одном случае достаточно
огуречного рассолу, а в другом случае без вакцины не обойтись.

Поэтому исследование поведения программы сильно зависит от входных
данных, которые всегда (если это возможно, как в данном случае)
должны сопровождать исходный код.

Не разбирая даже код, можно сказать, что при вводе фамилии длиной
более 49 символов поведение программы будет точно непредсказуемым.
Что же касается существа дела, то программа вообще не выполняет
поставленной задачи (надо, полагать, это работа с двусвязным списком).
Как могут поля связи с предыдущим и следующим элементом списка в
функции AddToList получать одно и то же значение?

Рекомендую оставить свой код в покое и обратиться к источникам
решения подобных задач в Интернете - потому что править такой
код пустая трата времени. Я уж не говорю о таких трюках,
как открытие файла по каждому добавлению элемента списка.

Еще замечание по поводу внешнего написания программы. Как мне кажется,
автор программы прежде изучал Паскаль, потому что это заметно
по злоупотреблению использования символа точки с запятой после
закрывающей фигурной скобки. В языке Си такая комбинация необходима
в очень редких случаях - например, при описании класса или структуры.

 Профиль  
                  
 
 
Сообщение18.05.2008, 13:54 


21/03/06
1545
Москва
Что -то это мне напоминает...
http://dxdy.ru/viewtopic.php?t=13988

Добавлено спустя 3 минуты 37 секунд:

bekas писал(а):
автор программы прежде изучал Паскаль, потому что это заметно
по злоупотреблению использования символа точки с запятой после
закрывающей фигурной скобки. В языке Си такая комбинация необходима
в очень редких случаях - например, при описании класса или структуры.

По ссылке выше тоже злоупотребляют точкой с запятой, и тоже (хотя в гораздо большей степени) хромает форматирование. Их всех так учат? Пригласите на этот форум Вашего преподавателя, чтоли...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group