0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 16
1

Поиск предложения в тексте. Преобразование в массив символов. Не работает

29.11.2014, 13:27. Показов 735. Ответов 5
Метки нет (Все метки)

Задача: Программа должна считывать текст из файла и выводит на экран предложение, содержащее максимальное количество знаков пунктуации.

План моих действий:
1) Перетаскиваем текст в массив символов.
2) Идем по тексту и в каждом предложении считаем знаки пунктуации. Запоминаем, где конец предложения, если максимум побил рекорд.
3) После прогонки всего текста берем координаты конца и выводим символы до тех пор, пока не встретим начало предложения.

Проблема: В массив символов пишутся какие-то левые символы.
Например, текст: "First, second. Gromm kenny."
Массив: "п»їFirst, second. Gromm kenny.Нээээ««««««««юоюою"

Проблема №2: не то предложение выводится.
Например, вот текст: This is me. I think it's apparent that I need to rethink my life a little bit. What's my problem? First of all, I'm a rat.
Программа выводит: What's my problem?

Код.
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
#include <iostream>
#include <clocale>
#include <fstream>
using namespace std;
 
void find_most_punced(char*, int);
bool is_punc(char);
 
int main(){
     setlocale(LC_ALL, "English");
     ifstream inp("input.txt"); if (!inp) cout<<"No such file!";
 
     inp.seekg(0, ios::end);
     long lenth = inp.tellg();
     char *ch = new char[lenth+1];
     inp.seekg(0, ios::beg);
     inp.read(ch, lenth);
          
     find_most_punced(ch, lenth);
 
    cout<<endl;
    system("pause");
    return 0;
}
 
void find_most_punced( char *ch, int lenth){
    int end_point = 0; // координата конца искомого предложения
    int start_point = 0;
    int p = 0; // счетчик. проход по массиву
    int q = 0;
    bool is_end = 0;
    int punc_counter = 0;
    int max = 0;
 
    do{
        if (is_punc(ch[p]) == 1) punc_counter++;
        if (( (ch[p] == *".") || (ch[p] == *"!") || (ch[p] == *"?") ) && ( (ch[p+1] == *" ")) ) {
            if (punc_counter>max) end_point = p+1;
            punc_counter = 0;
        }
        p++;
 
    } while (p < lenth-1);
 
    q = end_point;
 
    do {
        if ( (ch[q-1] == *" ") && ( (ch[q-2] == *".") || (ch[q-2] == *"!") || (ch[q-2] == *"?") ) ) is_end = 1;
        if (q == 1) is_end = 1; // на случай, если искомое предложение - первое в файле
        start_point = q;
        q--;
    } while (is_end == 0);
     
    for (int y = start_point; y<end_point; y++) cout<<ch[y];
     
}
 
bool is_punc(char a){
    const char puncs[19] = {";:\\/|'\"{}[](),-<>'"}; // знак \ указывает на неконец
    for (int i = 0; i<19; i++){
        if (a == puncs[i]) return 1;
    }
    return 0;
}
What's my проблем, господа?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2014, 13:27
Ответы с готовыми решениями:

Поиск в тексте DOC-файлов последовательностей символов по шаблону и поиск найденных в TXT-файле (с логом)
Уважаемые программисты! Очень нужен bat-файл или скрипт, который решает такую задачу: ...

Поиск в тексте числа и преобразование его
В заданом тексте встречаются цены товаров в гривнах. Например, встречается: 1253749; нужно...

Поиск в тексте числа и преобразование его
В заданом тексте встречаются цены товаров в гривнах. Например, встречается: 1253749; нужно...

Поиск символов в тексте
Определить наличие слов в заданном тексте, содержащих сочетание символов, задаваемое с экрана

5
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
29.11.2014, 21:03 2
Как минимум, ты конец строки не устанавливаешь после считывания.
C++
1
ch[length] = '\0';
А для определения знаков пунктуации есть стандартная функция ispunct().
0
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 16
30.11.2014, 13:12  [ТС] 3
мне не нужно, чтобы пробелы считались знаком пунктуации
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
30.11.2014, 13:49 4
Пробелы ими и не считаются. isblanc() для пробела и подобных символов.
0
0 / 0 / 0
Регистрация: 16.11.2013
Сообщений: 16
30.11.2014, 18:43  [ТС] 5
Цитата Сообщение от nmcf Посмотреть сообщение
Пробелы ими и не считаются
Описание:

Макрос ispunct() возвращает ненулевое значение, если аргумент ch является знаком пунктуации или пробелом; в противном случае возвращается 0.

Считаются. Да суть не в пробелах.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
30.11.2014, 18:48 6
Откуда ты это взял? Смотри таблицу внизу.
http://ru.cppreference.com/w/c/string/byte/ispunct

Конец строки сделал, как я тебе писал?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2014, 18:48
Помогаю со студенческими работами здесь

Поиск символов в тексте
Здравствуйте, мне необходима ваша помощь. Мне необходимо создать программу: а. Создать форму с:...

Поиск символов в Тексте
Доброго всем веремени суток у меня вопрос по C# чтоб искать конкретное значение лучьше этого...

Поиск букв и символов в тексте
Привет знатокам! вот такая задача: &quot;Дан текст, каждый символ которого может быть малой буквой,...

Поиск немецких символов в тексте
Здравствуйте. У меня непростая задача, занимает очень много времени, хочется скоротать время на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru