С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

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

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

Данный алгоритм, компилируется. Однако есть недочеты:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 12:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Улучшение алгоритма подсчета строк, букв, слов (C++):

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

Программа подсчета строк, слов и символов не выводит результат - C++
Читаю книгу по с++ и там есть пример такой задачи. Когда запускаю ее то она ничего не выводит. В чем проблема? #include &lt;stdio.h&gt; ...

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

Напишите программу подсчета суммарного числа букв 'а' и букв 'b' в данной строковой переменной - C++
Напишите программу подсчета суммарного числа букв 'а' и букв 'b' в данной строковой переменной. Вывести на экран каких букв больше. ...

Составить блок-схему алгоритма для подсчета количества работников - C++
Составить блок-схему алгоритма для подсчета количества работников, которые имеют с 1 по 5 разряд, если известны разряды каждого работника...

функция подсчета слов - C++
Здравствуйте! Помгите исправить ошибку в функции подсчета слов оканчивающихся на символ Пркатически все варианты пробывал но ничего...

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Leeto Посмотреть сообщение
Спасибо большое что заметил, подскажи пожалуйста как это поправить..
хм.. 11 строку
Цитата Сообщение от voral Посмотреть сообщение
int spaceFlag = 0;
Меняем на
C++
1
int spaceFlag = 1;
Добавлено через 1 минуту
Точнее этот флаг будет переименовать. Он в моем варианте означает не наличие пробела предыдущим символом, а то, что мы ждем начало слова.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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/17023ca0b33106554dfcfd87c129523a
1
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/17023ca0b33106554dfcfd87c129523a
спасибо конечно но мне к сожалению надо без всяких 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
voral
501 / 481 / 83
Регистрация: 16.03.2008
Сообщений: 2,251
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
28.06.2012, 16:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 16:38
Привет! Вот еще темы с ответами:

Функция подсчета пар букв в строке - C++
Доброго времени суток, в данный момент я читаю книгу Страуструпа &quot;Язык программирования С++&quot; и пытаюсь прорешивать задачи, которые он дает,...

В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются. - C++
В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются.

Введите с клавиатуры некоторый текст и подсчитать в нем количество слов, букв, цифр,строчных букв, заглавных б - C++
Напишите пожалуйста программу в С++: Введите с клавиатуры некоторый текст и подсчитать в нем количество слов, букв, цифр,строчных букв,...

Дана строка из 20 слов. Сформировать строку, составленную из последних букв всех слов исходной строки - C++
Задача: дана строка из 20 слов (или любого другого числа). Сформировать строку, составленную из последних букв всех слов исходной строки.


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.