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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 17:59   #1
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию Приглашенные на вечеринку

В файле дана информация о приглашенных на вечеринку:
<приглашенные>::==<гость>|<гость><п риглашенные>
<гость>::==<имя> пригласил: <имя> [, <имя>] .
Каждый пригласил не более двух друзей. В файл выписать имена людей не пригласивших никого.
Пример: Файл:
Вася пригласил: Света , Оля .
Света пригласила: Костя , Ваня .
Оля пригласила: Таня .
Таня пригласила: Петя .
Ответ: Файл:
Костя
Ваня
Петя

Код:
#include <string.h>
#include <locale.h> 
#include <stdio.h>

struct btree{char name[50];btree*left,*right;};

btree*add(btree*e,char string[])
{strcpy(e->name,string);
e->left=NULL;
e->right=NULL;
return e;}

void printtree(btree*e)
{FILE*output=fopen("output.txt","w");
if(e!=NULL){if(e->left==NULL && e->right==NULL)fprintf(output,"%s\n",e->name);
else{printtree(e->left);printtree(e->right);}}
fclose(output);}

void main()
{setlocale(LC_CTYPE, "Russian");
FILE*input=fopen("input.txt","r");
char string[1000];
char temp1[]="пригласил:";
char temp2[]=",";
char temp3[]=".";
char temp4[]="пригласила:";
btree*d;
d=NULL;
fscanf(input,"%s",&string);
d=new btree;
strcpy(d->name,string);d->left=NULL;d->right=NULL;
while(!feof(input))
{fscanf(input,"%s",&string);
if(!strcmp(string,temp1) || !strcmp(string,temp4))d=d->left;
 else if(!strcmp(string,temp2))d=d->right;
       else if(!strcmp(string,temp3)){
		 if(!strcmp(d->left->name,string))d->left=d;
		  else if(!strcmp(d->right->name,string))d->right=d;}
	   else d=add(d,string);}
printtree(d);
fclose(input);}
Выдает 0xC0000005: Нарушение прав доступа при чтении "0x00000034".
Что неодходимо исправить?
И можно ли сделать как нибудь по-другому через такое же дерево?
Inokentiy вне форума Ответить с цитированием
Старый 22.04.2010, 19:11   #2
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

я не стал особо вчитываться, но в начале надо писать input.txt, а уж потом сохранять результат в output.txt. Попробуй местами поменять.
sllh_111 вне форума Ответить с цитированием
Старый 22.04.2010, 19:16   #3
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Нет, программа прерывается при первом сравнении:
Код:
if(!strcmp(string,temp1) || !strcmp(string,temp4))
Inokentiy вне форума Ответить с цитированием
Старый 23.04.2010, 11:10   #4
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

я так понял это Паскаль, ну зачем же переменные обозначать словами, да еще какими-то непонятными знаками.
Тут у тебя только фрагмент программы, можешь её полностью выложить?
Ну а насчет ошибки- либо не успевает записать, либо сравнить
sllh_111 вне форума Ответить с цитированием
Старый 23.04.2010, 14:35   #5
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Ну вообще-то это C++,
и название переменных по смыслу соответствует их назначению
и программа выложена полностью.
Inokentiy вне форума Ответить с цитированием
Старый 23.04.2010, 17:17   #6
sllh_111
Форумчанин
 
Регистрация: 10.02.2010
Сообщений: 137
По умолчанию

ну тогда извени не силен в СИ, ну а по поводу ошибки читай выши
sllh_111 вне форума Ответить с цитированием
Старый 23.04.2010, 17:26   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
я так понял это Паскаль, ну зачем же переменные обозначать словами, да еще какими-то непонятными знаками.
это вообще ни капли не паскаль.
Цитата:
Тут у тебя только фрагмент программы, можешь её полностью выложить?
хм...вроде итак видно что она вся
Цитата:
Ну а насчет ошибки- либо не успевает записать, либо сравнить
интерестно мне знать, что значит не успевает?

fscanf(input,"%s",&string);
string[999]=0;//попробуйте добавить это, если поможет то значит я прав в диагнозе(правда все равно еще по всплывают ошибки)
if(!strcmp(string,temp1) || !strcmp(string,temp4))d=d->left;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.04.2010, 18:58   #8
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Да нет не очень помогло, все также прерывается.
Это либо ошибка в использовании строкового типа, либо логическая.
Inokentiy вне форума Ответить с цитированием
Ответ


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