Форум программистов, компьютерный форум CyberForum.ru

Бинарное дерево для анализа текста - C++

Восстановить пароль Регистрация
 
Zur52
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 7
25.04.2013, 13:37     Бинарное дерево для анализа текста #1
Здравствуйте! Помогите решить проблему. нет перехода между char и int.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
struct tnode {
    char*word;
    int count;
    struct tnode*left;
    struct tnode*right;
};
#define RUS_LAT_LETT(c)(isalpha(c) || ('А' <=(c)&&(c) <= 'Я') || \ ('а' <= (c) &&(c)<="я")
#define RUS_LAT_LETT_NUM(c)(isdigit(c) || RUS_LAT_LETT(c))
struct tnode*addtree(struct tnode*, char*);
void treeprint (struct tnode*);
int fgetword(FILE*,char*,int);
 
void main ()
{
    struct tnode*root=NULL;
    char nwrd[MAXWORD];
    FILE*iof;
    char filename[12];
    printf ("\n Введите имя исходного файла \n");
    gets (filename);
    if ((iof=fopen(filename,"r"))==NULL) {
        printf("Файл не найден \n");
        exit(1);
    }
    while (fgetword (iof,nwrd,MAXWORD)!=EOF)
    if (RUS_LAT_LETT((int)nwrd[0])))
        root=addtree(root,nwrd);
    treeprint(root);
}
struct tnode*addtree(struct tnode*p,char*w)
{
    int cond;
    if (p==NULL) {
        p=(struct tnode*)malloc(sizeof(struct tnode));
        p->word=strdup(w);
        p->count=1;
        p->left=p->right=NULL;
        }
    else if ((cond=strcmp(w,p->word))==0)
        p->count++;
    else if (cond<0)
        p->left=addtree(p->left,w);
    else
        p->right=addtree(p->right,w);
    return p;
}
void treeprint(struct tnode*p)
{
    if (p!=NULL) {
        treeprint(p->left);
        printf( "%d %s \n", p->count,p->word);
        treeprint(p->right);
        }
}
int fgetword(FILE*f,char*word,int lim)
{
    int c;
    char*w=word;
    c=getc(f);
    while(isspace(c))
        c=getc(f);
    if(c!=EOF)
        *w++=c;
    if(!RUS_LAT_LETT(c))) {
        *w='\0';
        return c;
    }
    for (;--lim>0;w++) {
        *w=getc(f);
    if(!RUS_LAT_LETT_NUM((int) *w))) {
        break;
        }
    }
    *w='\0';
        return word[0];
}
Добавлено через 1 час 47 минут
Подскажите где посмотреть=)

Добавлено через 3 часа 38 минут
Сползаем на дно

Добавлено через 23 часа 26 минут
кто-нибудь?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 13:37     Бинарное дерево для анализа текста
Посмотрите здесь:

C++ бинарное дерево
Бинарное дерево C++
Бинарное дерево C++
Бинарное дерево C++
Бинарное дерево C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
25.04.2013, 14:00     Бинарное дерево для анализа текста #2
Начните с макроса
#define RUS_LAT_LETT(c)(isalpha(c) || ('А' <=(c)&&(c) <= 'Я') || \ ('а' <= (c) &&(c)<= " я " )
Похоже что так
C++
1
#define RUS_LAT_LETT(c)(isalpha(c) || ('А' <=(c)&&(c) <= 'Я') ||  ('а' <= (c) &&(c)<='я')
Zur52
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 7
26.04.2013, 08:28  [ТС]     Бинарное дерево для анализа текста #3
file isctype.c
line 56/68

Добавлено через 16 часов 27 минут
http://s018.***********/i518/1304/7c/22b9fb36cc0e.png

скриншот ошибки. может кто подсказать с чем это связано?
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
26.04.2013, 09:38     Бинарное дерево для анализа текста #4
Цитата Сообщение от Zur52 Посмотреть сообщение
с чем это связано?
Visual Studio для isspace или isalpha не хочет пропускать кириллицу

Code::Blocks + MinGW без вопросов, компилится и даже что-то
выводится
Под студию попробуйте исправить :
приводите к unsigned char
C++
1
 if (RUS_LAT_LETT((unsigned char)nwrd[0])))
C++
1
 if(!RUS_LAT_LETT_NUM((unsigned char) *w)))
Из файла считывайте тоже unsigned char
C++
1
2
3
char fgetword(FILE*f,char*word,int lim)
{
   unsigned char c;
Это совет- пальцем в небо
Если серьезно, то нужно задание знать, чтоб подсказывать.
Zur52
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 7
26.04.2013, 10:58  [ТС]     Бинарное дерево для анализа текста #5
Действительно, если текст на английском то выводит на экран:
http://s018.***********/i515/1304/f1/76ce7d03a996.jpg

Задание было проанализировать текст. т.е. сколько раз каждое слово встречается в тексте и сделать это c помощью бинарного древа)

В принципе всё работает, кроме кириллицы=/
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
26.04.2013, 11:13     Бинарное дерево для анализа текста #6
Тогда функцию main упростить .
Макросы и функцию fgetword выбросить )))
Так и кириллица выводится, нужно только студию настроить
Русские шрифты в консоли
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main ()
{
            struct    tnode*root = NULL;
            FILE     *infile     = NULL;
            char    buf[BUFSIZ];
            char    * word      = NULL;     
            char    filename[BUFSIZ];
 
            printf ("\n Введите имя исходного файла \n");
            fgets (filename, BUFSIZ, stdin);
           if ((infile = fopen(filename,"r"))==NULL)
            {
              printf("Файл не найден \n");
              exit(1);
             }
            while (fgets( buf, BUFSIZ, infile)!= NULL)
            {
                word = strtok(buf," ,.?!()-");
                while (word )
                {
                  root = addtree(root,word);
                  word = strtok(NULL," ,.?!()-");
                }
            }
         treeprint(root);
 
    fclose(infile);
    return 0;
}
Zur52
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 7
26.04.2013, 11:45  [ТС]     Бинарное дерево для анализа текста #7
Почему-то всё время пишет, что нет такого файла, может надо как-то по особому вводить? я привык к zz1.txt =)
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
26.04.2013, 12:00     Бинарное дерево для анализа текста #8
Zur52, проверил, и правда не фурычит fgets (filename, BUFSIZ, stdin); почему-то
верните
C++
1
gets (filename);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2013, 13:47     Бинарное дерево для анализа текста
Еще ссылки по теме:

C++ бинарное дерево
Бинарное дерево C++
Из сыновей, для каждого из которых известен отец, составить бинарное дерево C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Zur52
0 / 0 / 0
Регистрация: 24.04.2013
Сообщений: 7
26.04.2013, 13:47  [ТС]     Бинарное дерево для анализа текста #9
Спасибо за помощь. Спрошу у преподавателя что с кириллицей делать(чтобы её тоже анализировал)

Если у вас будут какие-либо идеи буду очень благодарен, если вы их выскажите тут =)
Yandex
Объявления
26.04.2013, 13:47     Бинарное дерево для анализа текста
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru