Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
1

Посимвольная обработка текстового файла: распределение всех слов по длине

03.03.2013, 02:56. Показов 5625. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вывести в файле распределение всех слов по длине (т.е. сколько в файле слов из одной буквы, из двух и т.д.). За слово считать цепочку символов, которая отделена пробелами, точкой, запятой, круглыми скобками, воскл.знаком, вопр.знаком.

(Данные из файла считывать посимвольно, нельзя сразу считывать весь файл или целую строчку, нельзя копировать все содержимое файла в оперативную память.)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2013, 02:56
Ответы с готовыми решениями:

Напечатать последовательно первые буквы всех слов текста (из одного текстового файла в другой)
Йоу,ребят. Программа должна считывать текст из файла и выводить в другой текстовой файл. А...

Посимвольная обработка содержимого текстового файла
Есть текстовый файл с следующим содержимым: 000000000000 011111111110 001111111100...

Посчитать распределение слов по длине во введённой строке текста
Посчитайте распределение слов по длине во введённой строке текста. Выведите на экран строки...

Из текстового файла считать и подсчитать суммированием всех 16-ти разрядных слов
Помогите пожалуйста, вообщем задача такая: из текстового файла нужно считать и подсчитать...

21
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
03.03.2013, 03:32 2
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
#include <fstream.h>
#include <iostream.h>
bool check(char c){
if (c==' ') return true;
if (c=='.') return true;
if (c==',') return true;
if (c=='!') return true;
if (c=='(') return true;
if (c==')') return true;
return false;
}
 
int main(){
int count[25]; //максимальная длина слова 25 символов. можно и увеличить...
int n=25;
char c;
int t=0;
for (int i=0; i<n; i++) count[i]=0;
ifstream input ("D:\\1.txt");
while (!input.eof()){
        input.get(c);
        if (!check(c)){
                t++;
        }
        else
        {
                count[t-1]++;
                t=0;
        }
}
count[t-2]++;
for (int i=0; i<n-1; i++)
cout<<"words with "<<i+1<<" letters: "<<count[i]<<endl;
system ("pause");
return 0;
}
простенький тестовый пример код прошел, но советую все-таки внимательно протестировать
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
03.03.2013, 03:49  [ТС] 3
Спасибо!
Только компилятор вот на что ругается:

[IMG]http://s018.***********/i515/1303/ce/ef27a7cac6e8.png[/IMG]
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.03.2013, 05:13 4
C++
1
2
3
#include <fstream.h>
#include <iostream.h>
using namespace std;
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
09.03.2013, 23:29  [ТС] 5
А что делает переменная t?
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
09.03.2013, 23:45 6
w0nder, переменная t считает сколько символов в текущем просматриваемом слове
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
09.03.2013, 23:58  [ТС] 7
Спасибо, и еще один вопрос. Я так поняла, что с 22 по 30 строчку задействована переменная t, которая считает кол-во символов в каждом слове, и, если в файле встретится разделяющий символ, то он не будет подсчитан.

А для чего дальше строчка
C++
1
count[t-2]++;
?
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
10.03.2013, 00:05 8
w0nder, не совсем так. если в файле встречается разделяющий символ он будет не посчитан, кроме того количество слов с t буквами будет увеличено на единицу.
эта строчка нужна для верной обработки последнего слова в файле (специфика возникает из-за возможного отсутствия разделителя перед концом файла).
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
10.03.2013, 17:24  [ТС] 9
Черный ворон, ивиняюсь, еще - все не могу понять, какую функцию выполняет 18 строчка?
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
10.03.2013, 17:46 10
w0nder, строка 18
C++
1
for (int i=0; i<n; i++) count[i]=0;
инициализирует нулями количество подсчитываемых слов различной длинны.
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
10.03.2013, 18:45  [ТС] 11
И получается, что каждый раз новое значение переменной t отправляется в массив, а затем эти числа в массиве сортируются?
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
10.03.2013, 19:03 12
w0nder, нет. изначально я выделяю массив на 25 элементов предполагая, что в тексте не встретится слово больше чем из 25букв. можно увеличить хоть до ста. это не так принципиально. потом перед чтением файла инициализирую нулями количество слов с различным количеством букв. потом читаю по символам файл, когда встречаю разделить инкрементирую значение ячейки масиива отвечающие за слова только что подсчитанной длины последнего прочтенного слова. не слишком запутано? могу попробовать иначе пояснить...
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
10.03.2013, 19:09  [ТС] 13
Черный ворон, ну вот было бы неплохо. Просто не могу никак понять алгоритм до конца
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
10.03.2013, 19:22 14
w0nder, ну попробую на примере. представим, что у нас файл выглядит так:
C++
1
1 12 12 12 123 1234
теперь запуская программу:
предполагаем, что в файле нет слов длиннее 25 букв
C++
1
int count[25];
считаем, что пока мы не начали читать количество слов с любым количеством букв в нем равно нулю
C++
1
for (int i=0; i<n; i++) count[i]=0;
открываем файл:
C++
1
ifstream input ("D:\\1.txt");
C++
1
2
3
4
5
6
7
8
9
10
11
while (!input.eof()){ //пока не добрались до конца файла
        input.get(c); //считываем из него один символ
        if (!check(c)){ //если это не разделитель
                t++; //то в текущем слове количество букв увеличиваем на единицу и переходим к следующему символу
        }
        else //если символ - разделитель
        {
                count[t-1]++; //то в ячейке массива с индексом t-1(потому что индексация у массива с нуля) увеличиваем значение на 1 
                t=0; //обнуляем количество букв в текущем слове и переходим к следующему символу
        }
}
таким образом в нулевой ячейке массива хранится количество однобуквенных слов
в первой - двухбуквенных
во второй - трех
итд.

для случая тестового файла результат будет
1
3
1
1

так понятнее?
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
10.03.2013, 19:29  [ТС] 15
Черный ворон, вот теперь все понятно, спасибо большое
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
12.03.2013, 01:14  [ТС] 16
Кстати, протестировала получше, заметила вот что. Ведь числа же по идее не должны считаться за символ? Если речь идет именно о количестве букв в словах.
Как можно в коде сделать так, чтобы цифры не считались?
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
12.03.2013, 01:23 17
w0nder, в смысле вообще не учитывать цифры? или считать их разделителем?
если первый вариант, то цикл while изменить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
while (!input.eof()){
        input.get(c);
        if (!isdigit(c)) //если текущий символ цифра - просто переходим к следующему символу сразу
        if (!check(c)){
                t++;
        }
        else
        {
                count[t-1]++;
                t=0;
        }
}
если считать разделителем, то цикл не менять, а функцию check изменить так:
C++
1
2
3
4
5
6
7
8
9
10
bool check(char c){
if (c==' ') return true;
if (c=='.') return true;
if (c==',') return true;
if (c=='!') return true;
if (c=='(') return true;
if (c==')') return true;
if (isdigit(c)) return true;
return false;
}
кстати сейчас протестировал. похоже разницы нет. в данном случае оба варианта изменения кода дают одинаковый результат
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
12.03.2013, 01:33  [ТС] 18
Черный ворон, да, первый вариант, спасибо

Добавлено через 3 минуты
Вот только если вводится комбинация из букв и цифр (ww1) , то в результате выходит, что в этом слове на один символ меньше, чем есть на самом деле

Добавлено через 4 минуты
Хотя если в такой цепочке символов будут сначала цифры, а потом буквы - то считает правильно
0
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
12.03.2013, 01:34 19
w0nder, странно. у меня все адекватно работает.еще раз прикладываю полный код и результат:
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
#include <fstream.h>
#include <iostream.h>
bool check(char c){
if (c==' ') return true;
if (c=='.') return true;
if (c==',') return true;
if (c=='!') return true;
if (c=='(') return true;
if (c==')') return true;
//if (isdigit(c)) return true;
return false;
}
 
int main(){
int count[25]; //ìàêñèìàëüíàÿ äëèíà ñëîâà 25 ñèìâîëîâ. ìîæíî è óâåëè÷èòü...
int n=25;
char c;
int t=0;
for (int i=0; i<n; i++) count[i]=0;
ifstream input ("D:\\1.txt");
while (!input.eof()){
        input.get(c);
        cout<<c;
        if (!isdigit(c))
        if (!check(c)){
                t++;
        }
        else
        {
                count[t-1]++;
                t=0;
        }
}
cout<<endl;
count[t-2]++;
for (int i=0; i<n-1; i++)
cout<<"words with "<<i+1<<" letters: "<<count[i]<<endl;
system ("pause");
return 0;
}
Миниатюры
Посимвольная обработка текстового файла: распределение всех слов по длине  
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 131
12.03.2013, 01:37  [ТС] 20
Я просто еще немного переделала (вчитаталась в задание - нужно было, чтобы результат выводился не в консоли, а во втором файле) и добавила строчку if (count[i]>0) , может в этом дело

Код:

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
#include <fstream>
#include <iostream>
using namespace std;
 
bool check(char c){
    if (c==' ') return true;
    if (c==',') return true;
    if (c=='!') return true;
    if (c=='?') return true;
    if (c=='(') return true;
    if (c==')') return true;
    if (c=='\n') return true;
return false; }
 
int main(){
int ok;
do {
int count[40]; 
int n=40;
char c; 
int t=0; 
 
for (int i=0; i<n; i++) count[i]=0; 
fstream fin ("1.txt", ios::in);
fstream fout ("2.txt", ios::out);
 
    while (!fin.eof()) {
        fin.get(c);
        if (!isdigit(c)) 
        if (!check(c)){ 
            t++;  
        }
 
        else {  
            count[t-1]++; 
                                                 
            t=0; 
        }
    }
        count[t-2]++; 
 
for (int i=0; i < n-1; i++) 
    if (count[i]>0) 
    fout << "words with "<< i+1 << " letter(s): " << count[i]<<endl;
 
fin.close ();
fout.close ();
 
cout << " Vai turpināt (1) vai beigt (0)?" << endl;
cin >> ok;
}
while (ok == 1);
return 0; }
0
12.03.2013, 01:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2013, 01:37
Помогаю со студенческими работами здесь

Осуществить сортировку текстового файла по длине строк циклическим слиянием/разделением
Осуществить сортировку текстового файла циклическим слиянием/разделением (по длине строк). Файл...

Посимвольная обработка
Как посимвольно обработать строку, чтобы заменить необходимые символы?

Чтение текста из текстового фала, обработка слов и вывод в консоль
Задача программы: считать текст из текстового файла; выделить слова с повторяющимися буквами другим...

Посимвольная обработка строк
Доброго времени суток всем))) Дано задание.:Дана строка. Сформировать строку, содержащую все...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru