Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 12:01     Улучшение алгоритма подсчета строк, букв, слов #1
Данный алгоритм, компилируется. Однако есть недочеты:
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ЛетающийЕнот
88 / 67 / 12
Регистрация: 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) Приведи пример, когда счёт неверен.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.06.2012, 12:46  [ТС]     Улучшение алгоритма подсчета строк, букв, слов #3
Как видно в строке 5 слов выводит 8
Миниатюры
Улучшение алгоритма подсчета строк, букв, слов  
ЛетающийЕнот
88 / 67 / 12
Регистрация: 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;
}
У меня теперь вроде всё корректно работает.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
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;
}
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 13:00     Улучшение алгоритма подсчета строк, букв, слов #6
Возможно, я не прав, но у меня всё работает так, как должно. Даже с пробелом перед Ctrl+D.
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
28.06.2012, 13:08     Улучшение алгоритма подсчета строк, букв, слов #7
А ну да. Работает то правильно. Но приходится использовать лишнюю строку 21
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 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
Миниатюры
Улучшение алгоритма подсчета строк, букв, слов  
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
28.06.2012, 13:11     Улучшение алгоритма подсчета строк, букв, слов #9
Кстати. Возможно есть еще недочет по "крайней ситуации". Ни чего не ввели, а сразу Ctrl+D. О символов и слов, но 1 строка.

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

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

Да я допустил ошибку. в строке 11ю Надо =1 а не 0
Спасибо большое что заметил, подскажи пожалуйста как это поправить...
ЛетающийЕнот
88 / 67 / 12
Регистрация: 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;
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
28.06.2012, 13:29     Улучшение алгоритма подсчета строк, букв, слов #12
Цитата Сообщение от ЛетающийЕнот Посмотреть сообщение
Разве это не логично? Одна строка у нас в любом случае есть, хоть и пустая.
Все зависит от ТЗ. В общем случае, на мой взгляд логичнее, когда получено 0 символов. Не может быть строк. Вот если получили хоть один символ кроме завершающего (даже \n) вот тогда речь уже может идти о строках. Т.к. данные поступили.

Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
Спасибо большое что заметил, подскажи пожалуйста как это поправить..
хм.. 11 строку
Цитата Сообщение от voral Посмотреть сообщение
int spaceFlag = 0;
Меняем на
C++
1
int spaceFlag = 1;
Добавлено через 1 минуту
Точнее этот флаг будет переименовать. Он в моем варианте означает не наличие пробела предыдущим символом, а то, что мы ждем начало слова.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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/17023c...fcfd87c129523a
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 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/17023c...fcfd87c129523a
спасибо конечно но мне к сожалению надо без всяких 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;
}
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
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')))
Да и по отношению к первому варианту программы здесь будут другие результаты. Т.к. ряд символов не учитывается включая пробел, перенос строки, табуляции, а так же цифр и знаков.

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

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

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

Чтоб этот символ не учитывался
так я добавил код выше это собственно оно и есть... только херня какая получается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 16:59     Улучшение алгоритма подсчета строк, букв, слов
Еще ссылки по теме:

Программа подсчета строк, слов и символов не выводит результат C++
Напишите программу подсчета суммарного числа букв 'а' и букв 'b' в данной строковой переменной C++
Улучшение алгоритма записи строк C++

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

Или воспользуйтесь поиском по форуму:
voral
345 / 325 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
28.06.2012, 16:59     Улучшение алгоритма подсчета строк, букв, слов #19
В коде выше у вас. Используются "if", а в первом варианте switch ... case...
Yandex
Объявления
28.06.2012, 16:59     Улучшение алгоритма подсчета строк, букв, слов
Ответ Создать тему
Опции темы

Текущее время: 04:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru