Web Design Club

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Web Design Club » C/C++ » Для каждого слова текста найти кол-во его повторов


Для каждого слова текста найти кол-во его повторов

Сообщений 1 страница 6 из 6

1

ЗАДАНИЕ:
    Для каждого из слов заданного предложения указать,
    сколько раз оно встречается в предложении

Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include "File1.h"

//---------------------------------------------------------------------------

#pragma argsused
void sort (words *text, int number)
{
        words temp[10];
        for (int i = 0; i < number; i++)
        {
                for (int j = number-1; j > i; j--)
                {
                        if (strcmp(text[j-1].word, text[j].word) > 0)
                        {
                                temp[1] = text[j-1];
                                text[j-1] = text[j];
                                text[j] = temp[1];
                        }
                }
        }
}

int main(int argc, char* argv[])
{
        words text[100];
        int i = 0, p = 1;

        FILE * f;
        f = fopen("TEXT.txt", "rt");
        if (f == NULL)
        {
                cout << "File not open - ERROR" << endl;
                return 1;
        }

        while (!feof(f))
        {
                fscanf(f, "%s", text[i].word);
                printf("%s ", text[i].word);
                i++;
        }
        cout << endl;

        sort (text, i);

        for (int u = 0; u < i; u++)
        {
                for (int j = 0; j < i; j++)
                {
                        if ((strcmp(text[u].word, text[j+1].word)) == 0) p++;
                }
                if ((strcmp(text[u].word, text[u-1].word)) != 0)
                        cout << text[u].word << " - " << p << endl;
                p = 0;
        }
        cout << endl;
        cout << "End programm..." << endl;
        getch();
        return 0;
}
//---------------------------------------------------------------------------

Отредактировано Инь&Ян (2008-12-11 00:41:54)

0

2

File1.h

Код:
struct words
{
        char word[25];
};

0

3

В общем смысл такой... Из текстового файла считываются слова. После они сортируются для удобного сравнения. Ну и после сравниваются. У кого возникнут вопросы спрашивайте http://rg.foto.radikal.ru/0707/36/0cf5eca92093.gif . У кого есть более простое решение, пишите. Очень будет интересно посмотреть. Ниже есть решение той же задачи парня из моей группы.

0

4

Код:
/*
    ЗАДАНИЕ:
    Для каждого из слов заданного предложения указать,
    сколько раз оно встречается в предложении
*/

#include <stdio.h>
#include <string.h>

using namespace std;

typedef unsigned char mybyte;
#define begin_test 0
#define char_test 1
#define space_test 2
#define end_test 3

void input_string(char *str)
{
     /* ввести строку с клавиатуры */
     int i = 0;
     char ch = getchar();
     *str = char(0x00);
     while(ch != char(0x0A)) {
              str[i++] = ch;
              str[i] = char(0x00);
              ch = getchar();
     }
}

bool get_word(char *lp_str)
{
     /* получить слово. lp_str - указатель на начало цепочки,
     при этом нужно изменить указатель, чтоб указывал на след. слово :) */
     
}

int get_word_count(char *str)
{
    /* определить количество слов в строке */
    int count = 0;
    mybyte flag = begin_test;
    --str;
    do {
        ++str;
        if((flag == char_test) && (*str == char(0x00))) {
                 ++count;
                 continue;
        }
        if((flag == begin_test) && (*str == ' ')) {
                 flag = space_test;
        }
        else {
                 flag = char_test;
        }
        if((flag == char_test) && (*str == ' ')) {
                 ++count;
        }
        if((flag == space_test) && (*str != ' ')) {
                 flag = char_test;
        }
    }while(*str != char(0x00));
    return count;
}

bool cmp_string(char *str1, char *str2) {
     /* проверить на равенство строки. разделители - char(0x00), space */
     bool result = true;
     while((*str1 != char(0x00)) && (*str1 != ' ') && (*str2 != char(0x00)) && (*str2 != ' ')) {
                   if(*str1 != *str2) {
                            result = false;
                            break;
                   }
                   ++str1; ++str2; // next char
     }
     if(((*str1 != char(0x00)) && (*str1 != ' ')) || ((*str2 != char(0x00)) && (*str2 != ' ')))
                result = false;
     return result;
}

void print_word(char *str) {
     /* вывести слово. разделители - char(0x00), space */
     while((*str != char(0x00)) && (*str != ' ')) {
         printf("%c", *str);
         str++;
     }
}

int main(int argc, char *argv[])
{
    char *str = 0;
    str = new char[255];
    if(str == char(0x00)) {
           printf("Error. No memory.");
           getchar();
           return 0;
    }
    printf("Input string (254 chars): ");
    input_string(str);
    
    /* создать указатели на начало каждого слова.
       проверить на одинаковые слова, подсчитать количество повторений.
    */
    
    // создать массив для указателей на каждое слово
    int word_count = get_word_count(str);
    
    char **lp_words = 0;  // массив указателей на начала всех слов
    lp_words = new char*[word_count];
    if(lp_words == 0) {
               delete[] str;
               printf("Error. No memory.");
               getchar();
               return 0;
    }
    int *words_count = 0;  // массив - количество повторений для каждого слова.
    words_count = new int[word_count];
    if(words_count == 0) {
               delete[] lp_words;
               delete[] str;
               printf("Error. No memory.");
               getchar();
               return 0;
    }
    // заполнить массив количества посторений слов
    for(int i=0; i < word_count; i++) words_count[i] = 1;
    // заполнить массив указателей на слова
    int flag = begin_test;
    int i = 0;
    for(char *lp = str; lp < str + strlen(str); lp++) {
            if((flag == begin_test) && (*lp != ' ')) {
                     flag = char_test;
                     lp_words[i++] = lp;
                     continue;
            }
            if((flag == space_test) && (*lp != ' ')) {
                     flag = char_test;
                     lp_words[i++] = lp;
                     continue;
            }
            if(*lp == ' ') {
                   flag = space_test;
            }
    }
    
    // проверить на одинаковые слова.
    for(int i=0; i < word_count-1; i++)
            if(lp_words[i] != 0)
                for(int k=i+1; k < word_count; k++)
                        if(lp_words[k] != 0)
                            if(cmp_string(lp_words[i], lp_words[k])) {
                                  ++words_count[i];
                                  lp_words[k] = 0;
                            }

    // вывести результаты работы.
    for(int i=0; i < word_count; i++)
            if(lp_words[i] != 0) {
                   print_word(lp_words[i]);
                   printf(" - %i\n", words_count[i]);
            }
    
    getchar();
    
    // освободить выделенную память.
    delete[] str;
    delete[] lp_words;
    delete[] words_count;
    
    return 0;
}

0

5

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

0

6

В Паскале это ещё элементарнее делается не спорю.

0


Вы здесь » Web Design Club » C/C++ » Для каждого слова текста найти кол-во его повторов