Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 05:16   #1
lioshenka
 
Регистрация: 13.08.2009
Сообщений: 4
По умолчанию Не могу найти ошибку в программе

В общем, вот листинг.

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>

typedef struct{
            char dummy[256];
            char surname[225];
            char name[256];
            int ID;
            char house[256];
            char street[256];
            char town[256];
            char county[256];
            char area[256];
            char country[256];
            char postcode[256];
            int phone;
            char email[256];
            char boattype[256];
            char boatname[256];
            }user;
            
FILE *file;
int i=0;
char number_of_people[256];
int nop, level, height;
char yetdummy[256]; 
char yetdummy2[256]; 
char g[80];
     
struct node
{
user data;
struct node *left,*right;
};

void insert(struct node *r,struct node *p)
{

if((r->right==NULL)&&(strcmp(p->data.surname,r->data.surname)>0))
r->right=p;
else if((r->right!=NULL)&&(strcmp(p->data.surname,r->data.surname)>0))
insert(r->right,p);
if((r->left==NULL)&&(strcmp(p->data.surname,r->data.surname)< 0))
r->left=p;
else if((r->left!=NULL)&&(strcmp(p->data.surname,r->data.surname)< 0))
insert(r->left,p);
}

void tree(struct node * r, int level, int height) {
printf("AAA");
  int i;
  if (r) {
  printf("aaa");
    tree (r->left, level+1, height);
    printf("BBB");
    for (i = 0; i < (height-level); i++){ 
    printf("bbb");
    printf ("   ");
    }
    printf ("%s\n", r->data);
    tree (r->right, level+1, height);
  }
}

int main()
{ 
int choice,c,i,flag;
char temp='N',temp1[15];
struct node *s,*root,*r,*q;
root = NULL;
do
{ 
system("cls");
printf("\n 1. Read the data file into the program");
printf("\n 2. Search the tree ");
printf("\n 3. Quit program");
printf("\n 4. Print tree");
printf("\nEnter your choice: ");
scanf("%d",&choice);

switch(choice)
{ 
case 1:printf("Start reading data");
do
{file = fopen("members.data","r");
 if(file==NULL) {
    printf("Error: can't open file.\n");
    return 1;
  } 
  else {
    printf("File opened successfully.\n");
         }
 fscanf(file,"%s \n", number_of_people);
 nop = atoi(number_of_people);
 user usera[nop]; 
 
  for (i=0; i<nop; i++){
system("cls");
  printf("Reading a structure...\n");
      fgets(usera[i].dummy, 256, file);        
      fgets(usera[i].surname, 256, file); 
      fgets(usera[i].name, 256, file);  
      fgets(yetdummy, 256, file);  
      usera[i].ID = atoi(yetdummy);      
      fgets(usera[i].house, 256, file);  
      fgets(usera[i].street, 256, file);  
      fgets(usera[i].town, 256, file); 
      fgets(usera[i].county, 256, file);  
      fgets(usera[i].area, 256, file);  
      fgets(usera[i].country, 256, file);  
      fgets(usera[i].postcode, 256, file);  
      fgets(yetdummy2, 256, file); 
      usera[i].phone = atoi(yetdummy2);
      fgets(usera[i].email, 256, file);  
      fgets(usera[i].boattype, 256, file);  
      fgets(usera[i].boatname, 256, file);        
     
      printf("Read the user with surname %s and ID %d\n", usera[i].surname, usera[i].ID);      
      printf("Finished reading to structure, now adding pointer to tree\n");      
      s=malloc(sizeof(struct node));
      s->left=NULL;
      s->right=NULL;
      s->data = usera[i];
      if(root==NULL)
      root=s;
      else
      insert(root,s);
      printf("Added to tree successfully"); 
     // sleep(00);
}
fclose(file);
}

while(temp=='y');
break;

case 2:printf("Search\n");
do
{
printf("\n Please enter the surname to search for: ");
scanf("%s",temp1);
i=0;
s=root;

while(s!=NULL&&i==0)
{
if(strcmp(s->data.surname,temp1)< 0)
s=s->right;
if(strcmp(s->data.surname,temp1)>0)
s=s->left;
if(strcmp(s->data.surname,temp1)==0)
i=1;
}
if(i==0){
printf("\nElement not found\n");
printf("\n Found user %s with ID %d\n", s->data.surname, s->data.ID);   }
else
printf("\nElement found\n");
printf("\nPress any key to continue...");
getch();
}
while(temp=='y');
break;

case 4:printf("Printing tree\n");
do
{
c=1;
if(root==NULL)
printf("Tree is not started yet");
else
tree(r, level, height);

printf("\nPress any key to continue...");
getch();
break;

}

while(c!=5);}}while(choice!=3);}
Кратко о программе: читает данные о людях их файла и сохраняет их в двоичном дереве (один человек - одна структура). Потом в меню можно искать по фамилии или вывести список всех фамилий.

Проблема в том, что при поиске по фамилии выдаёт ошибку. Вроде всё нормально, не могу понять, почему.

Файл members.data.txt надо переименовать просто в мемберс.дата. Компилятор Dev-C++, он почему-то не ругается на строчку, где написано nop - если ваш компидятор ругается, можно заменить nop на константу 10.

Спасибо!
Вложения
Тип файла: txt members.data.txt (1.7 Кб, 120 просмотров)
lioshenka вне форума Ответить с цитированием
Старый 24.08.2009, 01:23   #2
lioshenka
 
Регистрация: 13.08.2009
Сообщений: 4
По умолчанию

Кто-нибудь может помочь, пожалуйста?
lioshenka вне форума Ответить с цитированием
Старый 24.08.2009, 01:32   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Честно говоря в проге не разбирался, но что сразу в глаза бросилось:
Код:
typedef struct{
            char dummy[256];
            char surname[225];
            char name[256];
и
Код:
  
      fgets(usera[i].surname, 256, file);
Не находите ничего странного?) Например, что surname по объявлению имеет 225 символов, а читаете в него 256
netrino вне форума Ответить с цитированием
Старый 24.08.2009, 08:33   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

Ошибка вероятно здесь:
Код:
if(strcmp(s->data.surname,temp1)< 0) // Допустим, условие выполнилось
s=s->right; // Изменили s
if(strcmp(s->data.surname,temp1)>0) // Выполняется проверка уже для нового s, а она может равняться NULL
s=s->left; // Если повезет, то тут опять s меняем
if(strcmp(s->data.surname,temp1)==0) // И тут уже для третьей s проверку выполняем.
i=1;
Изучайте конструкцию if ... else ...
pu4koff вне форума Ответить с цитированием
Старый 24.08.2009, 11:17   #5
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

nop = atoi(number_of_people);
user usera[nop];

nop это не константа, компилятор разве мог скомпилировать такое?

перменная s объявлена как указатель и не инициализирована, будет вылетать
lennon вне форума Ответить с цитированием
Старый 24.08.2009, 11:38   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2lennon
Цитата:
nop это не константа, компилятор разве мог скомпилировать такое?
если си стандарта 99, то мог. называется массив переменной длины.

пс. код не смотрел, много букв)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в программе Nemles Помощь студентам 0 14.06.2009 14:21
Не могу найти ошибку в программе Dawystrik Общие вопросы Delphi 9 19.03.2009 21:19
Помогите найти ошибку в программе Wast Паскаль, Turbo Pascal, PascalABC.NET 2 29.12.2008 20:40
Паскаль, не могу найти ошибку в программе Julinja Помощь студентам 2 17.11.2008 20:42