Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск в тексте символов (C++)

11K
27 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Возникла задача : Задан текст, состоящий из слов, записанных через запятые, и заканчивающийся точкой.
Длина текста не больше 150 символов, могут быть использованы любые символы. Словом
считается после-довательность символов, не содержащая пробел. Сформировать строку из
5-символьных слов, несо-держащих букву s. Получить массив кубов цифровых слов.


Вот код, который мне удалось реализовать:
Код:
//#include "stdafx.h"
#include <stdlib.h>
    // для функции exit()

#include <string.h>
#include <iostream.h>
#include <cstdio>
    // для функций работы с файлами

void main(void) {
    char
        text[149],  // загруженный из файла текст

        *_word, // рабочая переменная для корректного
                // разделения строки на слова

        **words,    // здесь будут храниться все слова из строки

        fourSW[150], // в этом массиве будут храниться слова длиной в 4
                // символа, содержащие буквы и цифры

        **repeatWord;
                // этот массив будет содержать повторяющиеся слова

    words = new char*[150];
    repeatWord = new char*[150];

    int
        i,  //
        j,  // счётчики циклов
        k,  //

        word=0,     // количество слов в загруженной строке

        lengths[150],       // длины каждого слова

        digitPos=0,     // рабочая переменная, которая будет содержать
                    // информацию о словах содержащих цифры

        repeat[150],        // количество повторений для каждого слова

        squares[150][3],    // кубы цифровых слов

        sq=0,           // количество цифровых слов

        repeats=0;      // общее количество различных слов в тексте

    FILE *fp;   // указатель на дескриптор файла

    /* Нижеследующие переменные созданы для показа умения работы со строковыми функциями */
    char text1[9]="Proverka";
    char text2[10]="Propil'on";
    char *p;

    if ((fp = fopen("data.txt", "r")) == NULL) goto fileNotExists;
        // открываем файл, если не удаётся - уходим в ошибку

    fread(&text, sizeof(char), 150, fp);
    cout << "Loaded text: " << text << endl << endl;
    fclose(fp);
        // читаем из файла 150 символов, выводим текст, закрываем файл

    /* следующий блок делит считанную строку на массив слов, с которым
       гораздо удобнее работать */
    do {
        if (word==0) {
            _word = strtok(text, ",");
        } else {
            _word = strtok(NULL, ",");
        }   // для определения каждого последующего слова используется
            // функция strtok()

        if (_word == NULL) break;

        word++;
        words[word] = new char[strlen(_word)];
        words[word] = _word;
        lengths[word] = strlen(_word);
        // заносим слово в массив words[], а его длину - в lengths[]
    } while (1);

    cout << endl << "Words (length = 5) with digits and characters:" << endl;

    strcpy(fourSW, "");
    /* следующий блок кода найдёт все слова, содержащие и буквы и цифры,
       и не имеющие при себе буквы s */
    for (i=1; i<=word; i++) {
        digitPos=strcspn(words, "s");
            // ищем, на какой позиции встречается буква в слове
        if (atoi(words)==0 && digitPos>0 && digitPos!=lengths && lengths==4) {
            strcat(fourSW, words);
            strcat(fourSW, ", ");
        }
    }
    cout << fourSW << endl << endl;
        // выводим найденное

    /* следующие блок кода ищет все повторяющиеся слова в тексте */
    for(i=1; i<=word; i++) {
        for(j=i; j<=word; j++) {
            if (words==words[j]) {
                for(k=1; k<=repeats; k++) {
                    if (0==strcmp(words, repeatWord[k])) {
                        repeat[k]++;
                        goto n1;
                    }
                }
                repeats++;
                repeatWord[repeats] = new char[lengths];
                repeatWord[repeats]=strdup(words);
                repeat[repeats]=1;
            }
        }
    }

n1:
    cout << "Repeat words: " << endl;
    for (i=1; i<=repeats; i++)
        if (repeat>1)
            cout << repeatWord << " [" << repeat << "], ";
        // выводим слова, у которых количество повторений больше единицы

    /* следующий блок кода находит цифровые слова и выводит их кубы */
    cout << endl << endl << "Numeric words, and its squares: " << endl;

    for (i=1; i<=word; i++) {
        for(int j=0; j<lengths; j++)
            if (atoi(&words[j])==0 && words[j]!='0') goto n2;

        sq++;
        squares[sq][1]=atoi(words);
        squares[sq][2]=(atoi(words)*atoi(words)*atoi(words));
n2:
        cout << "";
    }

    for (i=1; i<=sq; i++)
        cout << "Number: " << squares[1] << "; square: " << squares[2] << endl;

    cout << endl << "------------------------------------------" << endl << endl;

    // весь остальной код показывает умение работать со строковыми функциями

    cout << "text1='" << text1 << "';" << endl;
    cout << "text2='" << text2 << "';" << endl;

    p=strstr(text1, "ov");

    cout << "strcmp(text1, text2) = '" << strcmp(text1, text2) << "'" << endl;
    cout << "strncmp(text1, text2, 3) = '" << strncmp(text1, text2, 3) << "'" << endl;
    cout << "strlwr(text1) = '" << strlwr(text1) << "'" << endl;
    cout << "strupr(text2) = '" << strupr(text2) << "'" << endl;
    strrev(text1);  // функция заменяет строку
    cout << "strrev(text1) = '" << text1 << "'" << endl;
    strrev(text1);// возвращаем строку после вывода в исходное состояние
    cout << "strspn(text2, 'ORP') = '" << strspn(text2, "ORP") << "'" << endl;
    cout << "strstr(text1, 'rk') = '" << p << "'" << endl;
    cout << "strchr(text1, 'r') = '" << strchr(text1, 'r') << "'" << endl;
    cout << "strrchr(text1, 'r') = '" << strrchr(text1, 'r') << "'" << endl;

    fp=fopen("output.txt", "w");
    for(i=1; i<word; i++) {
        fwrite(words, sizeof(char), lengths, fp);
        fputs(", ", fp);
    }
    fclose(fp);

    // удаляем все переменные, что мы использовали в процессе
    delete repeatWord, repeats, text1, text2, text, _word, fourSW, words, lengths, digitPos, squares, sq, repeat, fp;

    exit(0);

fileNotExists:
    cout << "File with input data not found" << endl;
}



Не получается найти слова, не содержащие "S". Подскажите пожалуйста, будьте любезы, как доделать код для нормальной реализации данной задачи.
Буду очень признателен.
10K
27 сентября 2007 года
FAngel
77 / / 13.09.2006
Я сделал так:
 
Код:
/* следующий блок кода найдёт все слова, содержащие и буквы     и       цифры,
       и не имеющие при себе буквы s */
    for (i=1; i<=word; i++) {
        digitPos=strcspn(words, "s");
            // ищем, на какой позиции встречается буква в слове
        if (atoi(words)==0 && digitPos>0 && digitPos!=lengths && lengths==4) {
            strcat(fourSW, words);
            strcat(fourSW, ", ");
        }
    }

заменил на:
 
Код:
/* следующий блок кода найдёт все слова, содержащие и буквы     и       цифры,
       и не имеющие при себе буквы s */
    for (i=1; i<=word; i++) {
        if(strstr(words, "s")==NULL)
                      {
                           cout<<word<<","
        }
    }

в результате получил все слова без "s".
И еще: неужели тебе не говорили что в С++ не используются goto
По моему код
 
Код:
if ((fp = fopen("data.txt", "r")) == NULL) goto fileNotExists;
...
fileNotExists:
    cout << "File with input data not found" << endl;

более понятен в таком виде (его и читать легче):
 
Код:
if ((fp = fopen("data.txt", "r")) == NULL)
{
   cout << "File with input data not found" << endl;
   getch();
   exit(0);
}
11K
28 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
Извините, мне необходимо что бы они еще все были длиной ровно по 5 символов.
Как можно данное условие реализовать, подскажите пожалуйста.




 
Код:
if ((fp = fopen("data.txt", "r")) == NULL)
{
   cout << "File with input data not found" << endl;
   getch();
   exit(0);
}

на строке с "getch();" выдает ошибку error C2065: 'getch' : undeclared identifier. Попробовал описать, ничего не изменилось :(
379
29 сентября 2007 года
Fima
109 / / 07.11.2002
по-моему ф-ция getch() прописано в header-файле conio (может конечно stdio, но по-моему все-таки conio). подключи его. ;)
11K
29 сентября 2007 года
mitrof4nov
68 / / 10.09.2007
А подскажите пожалуйста как реализовать правильный отбор только 5-символьных слов. Буду очень признателен.

Тоже нге вариант
 
Код:
if(strstr(words, "s")==NULL)
 if(strstr(words, "s")==NULL && strlen(words, "s")==5)
11K
01 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Подскажите пожалуйста относительно нижеприведенного кода, как правильно исправить ошибку по подсчету повторяющихся слов в тексте. Буду очень признателен.
Код:
/* следующие блок кода ищет все повторяющиеся слова в тексте */
    for(i=1; i<=word; i++) {
        for(j=i; j<=word; j++) {
            if (words==words[j]) {
                for(k=1; k<=repeats; k++) {
                    if (0==strcmp(words, repeatWord[k])) {
                        repeat[k]++;
                        goto n1;
                    }
                }
                repeats++;
                repeatWord[repeats] = new char[lengths];
                repeatWord[repeats]=strdup(words);
                repeat[repeats]=1;
            }
        }
    }

n1:
    cout << "Repeat words: " << endl;
    for (i=1; i<=repeats; i++)
        if (repeat>1)
            cout << repeatWord << " [" << repeat << "], ";
        // выводим слова, у которых количество повторений больше единицы
489
01 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: mitrof4nov
Подскажите пожалуйста относительно нижеприведенного кода, как правильно исправить ошибку по подсчету повторяющихся слов в тексте. Буду очень признателен.
Код:
/* следующие блок кода ищет все повторяющиеся слова в тексте */
    for(i=1; i<=word; i++) {
        for(j=i; j<=word; j++) {
            if (words==words[j]) {
                for(k=1; k<=repeats; k++) {
                    if (0==strcmp(words, repeatWord[k])) {
                        repeat[k]++;
                        goto n1;
                    }
                }
                repeats++;
                repeatWord[repeats] = new char[lengths];
                repeatWord[repeats]=strdup(words);
                repeat[repeats]=1;
            }
        }
    }

n1:
    cout << "Repeat words: " << endl;
    for (i=1; i<=repeats; i++)
        if (repeat>1)
            cout << repeatWord << " [" << repeat << "], ";
        // выводим слова, у которых количество повторений больше единицы




Вообще поиск рулит, http://forum.codenet.ru/showthread.php?t=41766, здесь похожая тема.

32K
04 октября 2007 года
NOEX
6 / / 21.09.2007
С++ у меня на работе нет, за то на паскале вот, что получилось


uses crt;
var TextIn,TextOut:text;
Count:word;
ch:char;
s:string;
SI:boolean;
begin;
Count:=0;
SI:=false;
assign(TextIn,'In.txt');
reset(TextIn);
assign(TextOut,'Out.txt');
rewrite(TextOut);
while (not eof(TextIn)) do
begin;
repeat
read(TextIn,ch);
s:=s+ch;
if ch<>'s' then SI:=true;
until ch in [' ',',','.'];

if SI then
begin
writeln(Count);
if count<5 then writeln(TextOut,S);
Count:=Count+1;
SI:=False;
end;
s:='';
end;
readkey;
close(TextIn);
close(TextOut);
end.
11K
04 октября 2007 года
mitrof4nov
68 / / 10.09.2007
Спасибо огромное всем тем, кто помог мне с решением данной задачи. Всем по +1 :)
Если для кого-нибудь потребуется, вот исходник:
2.0K
08 октября 2007 года
BroKeR
163 / / 04.05.2006
Вот накидал здесь с использованием STL(не судите строго,не долго работаю с ней)-ищет все слова содержащие 5 символов и не содержащие 's',и записывает их в вектор vec_str.Если нужно огромный файл прочитать то везде где int поменять на size_t.Не понял что такое массив кубов цифровых слов...
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector <string> vec_sort_str;
    vector <string> vec_str;
    string str;
   
    ifstream inFile("text.txt");

    if (inFile.fail())
    {
        cerr<<"Error!!! Don't read file!!!"<<endl;
        exit(1);
    }

    while (inFile >> str)
    {
        vec_str.push_back(str);
    }
    inFile.close();

    for (int i=0;i<vec_str.size();i++)
    {
        str = vec_str;
        string::const_iterator iter = find(str.begin(),str.end(),'s');
        if (iter == str.end())
            vec_sort_str.push_back(str);
    }


    vec_str.erase(vec_str.begin(),vec_str.end());

    for (int i=0;i<vec_sort_str.size();i++)
    {
        str = vec_sort_str;
        for (int j=0;j<str.size();j++) { if (str==',') break;}
        if (j == 5) vec_str.push_back(str);    
    }

    for (int i=0;i<vec_str.size();i++)
        cout<<vec_str<<endl;      //в vec_str находятся все слова в которых не содержится
                        //символа 's' и которые содержат 5 символов.

    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог