2014 dxdy logo

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

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




 
 Помогите найти ошибку в программе
Сообщение18.05.2008, 12:43 
Аватара пользователя
Программа должна читать список из файла, но выводит полный бред, а потом вобще вылетает :( :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 
Когда больной приходит к врачу, скажем, с признаками отравления,
то его лечение зависит от того, что он вкушал накануне:
самогон без меры, грибы, похожие на мухомор, или здесь
замешана змея со своим укусом. В одном случае достаточно
огуречного рассолу, а в другом случае без вакцины не обойтись.

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

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

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

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

 
 
 
 
Сообщение18.05.2008, 13:54 
Что -то это мне напоминает...
http://dxdy.ru/viewtopic.php?t=13988

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

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

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

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group