Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/16: Рейтинг темы: голосов - 16, средняя оценка - 5.00
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
1

Улучшение алгоритма подсчета строк, букв, слов

28.06.2012, 12:01. Показов 3258. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Данный алгоритм, компилируется. Однако есть недочеты:
1. Не всегда верно считает буквы. Почему не очень понимаю.
2. Два спейса считает как слово. Надо как то включить с логически и (&&) чтобы слово он считал как спейс + хотя бы одна бука из алфовита, так вот я не знаю как это прописать типа 'a-z' && 'A-Z' как то так что ли ?

Заранее огромное спасибо.
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
#include <iostream>
using namespace std;
 
int main ()
{  
char ch;
  cout <<"enter your text: " ;
  cin >> ch; 
    int numChars = 0; 
    int numLines = 0;
    int numWords = 0;
    while ((ch=getchar())!= 4) // Keyboard input will continue until "ASCII value 4 + <enter>" (CTRL+D+<enter>) will be entered
        switch (ch)
             {      
    case  ' ' : numWords++; break; // The condition of the definition of words
    case '\t' : numWords++; break; // The condition of the definition of words
    case '\n' : numWords++; numLines++; break; // The condition of the definition of words and newlines 
    default   : numChars++; break;       
            }
    numLines += 1; // for some reason it needs to add one and the results are correct
 cout << "CharCounter results: " << numChars << endl;
 cout << "WordsCounter results: " << numWords << endl;
 cout << "LinesCounter results: " << numLines << endl;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2012, 12:01
Ответы с готовыми решениями:

Улучшение алгоритма записи строк
В общем код полностью рабочий. В функции fill_start_file происходит запись в файл с условием, что...

Программа подсчета строк, слов и символов не выводит результат
Читаю книгу по с++ и там есть пример такой задачи. Когда запускаю ее то она ничего не выводит. В...

Улучшение алгоритма вычисления определителя матрицы, порядка n>3
Всем доброго времени суток, я достаточно долго искал шаблон кода для вычисления определителя...

Как в один STRING засунуть несколько слов, строк, букв?
нужно чтобы в одном стринге было несколько слов или строк

18
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 12:24 2
2) Возможно, стоит флаг разделителя добавить?

C
1
2
3
4
5
    int spaceFlag = 1;
    /* ... */
    case '\n': numLines++;
    case '\t': case ' ': if (!spaceFlag) numWords++; spaceFlag = 1; break;
    default: numChars++; spaceFlag=0; break;
1) Приведи пример, когда счёт неверен.
0
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 12:46  [ТС] 3
Как видно в строке 5 слов выводит 8
Миниатюры
Улучшение алгоритма подсчета строк, букв, слов  
0
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 12:53 4
Цитата Сообщение от Leeto Посмотреть сообщение
1. Не всегда верно считает буквы.
Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
1) Приведи пример, когда счёт неверен.
Цитата Сообщение от Leeto Посмотреть сообщение
Как видно в строке 5 слов выводит 8
Вопрос не понят.

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
#include <iostream>
using namespace std;
 
int main ()
{  
char ch;
  cout <<"Enter your text: " ;
    int numChars = 0; 
    int numLines = 0;
    int numWords = 0;
    int spaceFlag = 1;
    while ((ch=getchar())!= 4)
    switch (ch)
    {      
    case '\n': numLines++;
    case '\t': case ' ': if (!spaceFlag) numWords++; spaceFlag = 1; break;
    default: numChars++; spaceFlag = 0; break;      
    }
    numLines += 1;
    if (!spaceFlag) numWords++;
 cout << "CharCounter results: " << numChars << endl;
 cout << "WordsCounter results: " << numWords << endl;
 cout << "LinesCounter results: " << numLines << endl;
 system("pause");
    return 0;
}
У меня теперь вроде всё корректно работает.
1
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 12:58 5
У вас последний пробел перед Ctrl+D тоже увеличивает счет слов. А это не правильно. Счетчик слов надо увеличивать при появлении первой буквы после табуляции или пробела.

Добавлено через 4 минуты
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
#include <iostream>
using namespace std;
 
int main ()
{  
    char ch;
    cout <<"Enter your text: " ;
    int numChars = 0; 
    int numLines = 0;
    int numWords = 0;
    int spaceFlag = 0;
    while ((ch=getchar())!= 4)
        switch (ch)
        {      
        case '\n': numLines++;
        case '\t':
                case ' ': spaceFlag=1; break;
        default: 
            numChars++; 
            if (spaceFlag==1)
            {
                ++numWords;
                spaceFlag=0;
            }
        }
    numLines += 1;
    cout << "CharCounter results: " << numChars << endl;
    cout << "WordsCounter results: " << numWords << endl;
    cout << "LinesCounter results: " << numLines << endl;
    system("pause");
    return 0;
}
1
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 13:00 6
Возможно, я не прав, но у меня всё работает так, как должно. Даже с пробелом перед Ctrl+D.
1
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 13:08 7
А ну да. Работает то правильно. Но приходится использовать лишнюю строку 21
2
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 13:09  [ТС] 8
Цитата Сообщение от voral Посмотреть сообщение
У вас последний пробел перед Ctrl+D тоже увеличивает счет слов. А это не правильно. Счетчик слов надо увеличивать при появлении первой буквы после табуляции или пробела.

Добавлено через 4 минуты
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
#include <iostream>
using namespace std;
 
int main ()
{  
    char ch;
    cout <<"Enter your text: " ;
    int numChars = 0; 
    int numLines = 0;
    int numWords = 0;
    int spaceFlag = 0;
    while ((ch=getchar())!= 4)
        switch (ch)
        {      
        case '\n': numLines++;
        case '\t':
                case ' ': spaceFlag=1; break;
        default: 
            numChars++; 
            if (spaceFlag==1)
            {
                ++numWords;
                spaceFlag=0;
            }
        }
    numLines += 1;
    cout << "CharCounter results: " << numChars << endl;
    cout << "WordsCounter results: " << numWords << endl;
    cout << "LinesCounter results: " << numLines << endl;
    system("pause");
    return 0;
}
должно быть 5 слов выдает 4
Миниатюры
Улучшение алгоритма подсчета строк, букв, слов  
0
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 13:11 9
Кстати. Возможно есть еще недочет по "крайней ситуации". Ни чего не ввели, а сразу Ctrl+D. О символов и слов, но 1 строка.

Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
должно быть 5 слов выдает 4
Да я допустил ошибку. в строке 11ю Надо =1 а не 0
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 13:18  [ТС] 10
Цитата Сообщение от voral Посмотреть сообщение
Кстати. Возможно есть еще недочет по "крайней ситуации". Ни чего не ввели, а сразу Ctrl+D. О символов и слов, но 1 строка.

Добавлено через 1 минуту

Да я допустил ошибку. в строке 11ю Надо =1 а не 0
Спасибо большое что заметил, подскажи пожалуйста как это поправить...
0
88 / 67 / 37
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 13:22 11
Цитата Сообщение от voral Посмотреть сообщение
Кстати. Возможно есть еще недочет по "крайней ситуации". Ни чего не ввели, а сразу Ctrl+D. О символов и слов, но 1 строка.
Разве это не логично? Одна строка у нас в любом случае есть, хоть и пустая.

Leeto,

C++
1
2
3
4
    int numChars = 0; 
    int numLines = 0;
    int numWords = 0;
    int spaceFlag = 0;
Исправь в четвёртой строке: int spaceFlag = 1;
1
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 13:29 12
Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
Разве это не логично? Одна строка у нас в любом случае есть, хоть и пустая.
Все зависит от ТЗ. В общем случае, на мой взгляд логичнее, когда получено 0 символов. Не может быть строк. Вот если получили хоть один символ кроме завершающего (даже \n) вот тогда речь уже может идти о строках. Т.к. данные поступили.

Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
Спасибо большое что заметил, подскажи пожалуйста как это поправить..
хм.. 11 строку
Цитата Сообщение от voral Посмотреть сообщение
int spaceFlag = 0;
Меняем на
C++
1
int spaceFlag = 1;
Добавлено через 1 минуту
Точнее этот флаг будет переименовать. Он в моем варианте означает не наличие пробела предыдущим символом, а то, что мы ждем начало слова.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.06.2012, 15:05 13
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
#include <string>
#include <vector>
#include <iostream>
 
#include <boost/algorithm/string.hpp>
 
int main()
{
   std::string some_string = "Hello\n and what do you\t now\n";
   std::vector<std::string> lines;
   boost::split(lines, some_string, boost::is_any_of("\n"), boost::token_compress_on);
   std::transform(lines.begin(), lines.end(), lines.begin(), [](const std::string& line)
   {
      return boost::trim_copy(line);
   });
   lines.erase(std::remove_if(lines.begin(), lines.end(), [](const std::string& line) 
   { 
      return line.empty(); 
   }), lines.end());
   std::vector<std::string> words;
   std::for_each(lines.begin(), lines.end(), [&words] (const std::string& line)
   {
      std::vector<std::string> temp;
      boost::split(temp, line, boost::is_any_of("\t "), boost::token_compress_on);
      words.insert(words.end(), temp.begin(), temp.end());
   });
   std::cout << "Lines: " << lines.size() << " words: " << words.size() <<
      " letters: " << std::accumulate(words.begin(), words.end(), 0, [](const int total, const std::string& value)
      {
         return total + value.length();
      }) << std::endl;
}
http://liveworkspace.org/code/... 87c129523a
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 16:16  [ТС] 14
Цитата Сообщение от ForEveR Посмотреть сообщение
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
#include <string>
#include <vector>
#include <iostream>
 
#include <boost/algorithm/string.hpp>
 
int main()
{
   std::string some_string = "Hello\n and what do you\t now\n";
   std::vector<std::string> lines;
   boost::split(lines, some_string, boost::is_any_of("\n"), boost::token_compress_on);
   std::transform(lines.begin(), lines.end(), lines.begin(), [](const std::string& line)
   {
      return boost::trim_copy(line);
   });
   lines.erase(std::remove_if(lines.begin(), lines.end(), [](const std::string& line) 
   { 
      return line.empty(); 
   }), lines.end());
   std::vector<std::string> words;
   std::for_each(lines.begin(), lines.end(), [&words] (const std::string& line)
   {
      std::vector<std::string> temp;
      boost::split(temp, line, boost::is_any_of("\t "), boost::token_compress_on);
      words.insert(words.end(), temp.begin(), temp.end());
   });
   std::cout << "Lines: " << lines.size() << " words: " << words.size() <<
      " letters: " << std::accumulate(words.begin(), words.end(), 0, [](const int total, const std::string& value)
      {
         return total + value.length();
      }) << std::endl;
}
http://liveworkspace.org/code/... 87c129523a
спасибо конечно но мне к сожалению надо без всяких stl и прочих с++ заваротов (((

Добавлено через 2 минуты
Цитата Сообщение от voral Посмотреть сообщение
Все зависит от ТЗ. В общем случае, на мой взгляд логичнее, когда получено 0 символов. Не может быть строк. Вот если получили хоть один символ кроме завершающего (даже \n) вот тогда речь уже может идти о строках. Т.к. данные поступили.

Добавлено через 1 минуту

хм.. 11 строку

Меняем на
C++
1
int spaceFlag = 1;
Добавлено через 1 минуту
Точнее этот флаг будет переименовать. Он в моем варианте означает не наличие пробела предыдущим символом, а то, что мы ждем начало слова.

блин мне надо еще реализовать для цикла while do что то как то не получается
подскажи что не так я делаю ?


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
//
//
#include <iostream>
using namespace std;
char ch;
 
int main ()
{
  
  cout <<"enter your text: " ;
  cin >> ch; 
 
 
    int numChars = 0; 
    int numLines = 0;
    int numWords=0;
    int spaceFlag = 1;
 
    do
    {
        
 
     if(ch == '\n')
             {
       numLines++; // increase the count of lines by one if ch IS '\n'
             }
 
     if (ch == ' ') // The condition of the definition of words           
         spaceFlag = 1 ;
 
     if (ch =='a-z'||'A-Z')
            {       
       numChars++;
                  if (spaceFlag==1) 
                   {
                 ++numWords;
                 spaceFlag=0;
                   }
             }
 
    
 
    }
    
 
    while ((ch=getchar())!= 4);  // Keyboard input will continue until "ASCII value 4 + <enter>" (CTRL+D+<enter>) will be entered
 
numLines += 1; // for some reason it needs to add one and the results are correct 
 
 cout << "CharCounter results: " << numChars;
 cout << endl;
 
 cout <<"WordsCounter results: " << numWords;
 cout << endl;
 
 cout <<"LinesCounter results: " << numLines;
 cout << endl;
 
  
  return 0;
}
0
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 16:38 15
Цитата Сообщение от Leeto Посмотреть сообщение
if (ch =='a-z'||'A-Z')
я не великий гуру, но вроде это не должно работать.

Добавлено через 3 минуты
Вы наверное хотели написать:
C
1
  if (((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))
Да и по отношению к первому варианту программы здесь будут другие результаты. Т.к. ряд символов не учитывается включая пробел, перенос строки, табуляции, а так же цифр и знаков.

Кроме того если между словами поставить табуляцию без пробела, то будет учтено только одно слово
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 16:42  [ТС] 16
Цитата Сообщение от voral Посмотреть сообщение
я не великий гуру, но вроде это не должно работать.

Добавлено через 3 минуты
Вы наверное хотели написать:
C
1
  if (((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))
Да и по отношению к первому варианту программы здесь будут другие результаты. Т.к. ряд символов не учитывается включая пробел, перенос строки, табуляции, а так же цифр и знаков.

Кроме того если между словами поставить табуляцию без пробела, то будет учтено только одно слово
как же тогда мне код переписать чтоб все ок было ? подскажи пожалуйста
0
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 16:46 17
Так просто в тело do while добавь из первого варианта switch и его содержимое.
И будет почти так же. Для полного счастья останется только в этот switch добавить
C
1
case 4: break;
Чтоб этот символ не учитывался
1
7 / 7 / 3
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 16:54  [ТС] 18
Цитата Сообщение от voral Посмотреть сообщение
Так просто в тело do while добавь из первого варианта switch и его содержимое.
И будет почти так же. Для полного счастья останется только в этот switch добавить

Чтоб этот символ не учитывался
так я добавил код выше это собственно оно и есть... только херня какая получается
0
2304 / 1225 / 246
Регистрация: 16.03.2008
Сообщений: 5,840
Записей в блоге: 2
28.06.2012, 16:59 19
В коде выше у вас. Используются "if", а в первом варианте switch ... case...
0
28.06.2012, 16:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2012, 16:59
Помогаю со студенческими работами здесь

Напишите программу подсчета суммарного числа букв 'а' и букв 'b' в данной строковой переменной
Напишите программу подсчета суммарного числа букв 'а' и букв 'b' в данной строковой переменной....

Составить программу подсчета в тексте слов, состоящих из одинаковых букв
Помогите пожалуйста!!! Есть код, который просто выводит количество слов в тексте: public static...

Ввести несколько строк текста, и использовать функцию strtok, для подсчета общего количества слов
Вот мое задание: Напишите программу, которая вводит несколько строк текста и использует функцию...

Определить количество букв, слов и строк
Здравствуйте Существует задача: есть файл с произвольным текстом (заранее неизвестным)....


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

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