Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Подсчет гласных, согласных


Автор: aleknek 5.4.2008, 19:53
Стоит перед до мной такая задача. Необходимо написать программу, которая читает слова по одному за раз, пока не будет введена буква q. После этого программа должна сообщить, количество слов, начинающихся с гласных, количество слов, начинающихся с согласных и количество слов, которые начинаются с других символов (например с цифр). Так вот, при запуске данной программы, программа считает только первое слово, а остальные слова просто напросто игнорируются, насколько я понимаю. Хотелось разобраться в чем ошибка, как правильно организовать цикл, чтобы все правильно работало. Заранее благодарен.
Код

// S_305_7.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <locale> 
#include <conio.h>
#include <cctype>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,".1251");
    setlocale(LC_MONETARY,".1251");

    char word[50];
    int glas = 0;
    int soglas = 0;
    int drugie = 0;
    
    cout << "Вводите слова (q для выхода.)";
    cin.getline(word, 50);
    for (int i = 0; i < strlen(word); i++)
    {
       while (word[i] != 'q')
       {
           if (isalpha (word[i]))
           {
              if (word[i] =='a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'j' || word[i] == 'o' || word[i] == 'u')
              {
              glas++;    
              break;
              }
              else 
              {
              soglas++;
              break;
              }
           } 
           else drugie++; 
       }     
                  cin.getline(word, 20);
    }
    
    cout << glas << " слов начинается с гласных.\n";
    cout << soglas << " слов начинается с согласных.\n";
    cout << drugie << " остальных." ;

    getch();
    return 0;
}



Автор: JackYF 5.4.2008, 20:07
Код

    cin.getline(word, 50);
    for (int i = 0; i < strlen(word); i++)
    {
       while (word[i] != 'q')
       {
           if (isalpha (word[i]))
           {
              if (word[i] =='a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'j' || word[i] == 'o' || word[i] == 'u')
              {
              glas++;    
              break;
              }
              else 
              {
              soglas++;
              break;
              }
           } 
           else drugie++; 
       }     
                  cin.getline(word, 20);
    }

Код

  do
  {  
    cin.getline(word, 50);
      for (int i = 0; i < strlen(word); i++)
      {
           if (isalpha (word[i]))
           {
              if (word[i] =='a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'j' || word[i] == 'o' || word[i] == 'u')
              {
              glas++;    
              break;
              }
              else 
              {
              soglas++;
              break;
              }
           } 
           else drugie++; 
       }     
    }
  while (word[0] != 'q')

Попробуй так.

Добавлено через 55 секунд
А, забыл, вывод подсчитанного тоже в цикл do { ... } while засунь.

Автор: aleknek 5.4.2008, 21:29
эффект тот же, программа подсчитывает только первое слово

Автор: JackYF 5.4.2008, 21:51
aleknek, тебе не угодишь...

Вот проверенный вариант, который работает у меня:
Код

#include <iostream>
#include <locale>

using std::cin;
using std::cout;
using std::endl;

int main(int argc, char* argv[])
{
    char word[255];

    do
    {
        cin.getline(word, sizeof(word));
        size_t glas = 0;
        size_t soglas = 0;
        size_t other = 0;
        for (int i = 0; i < strlen(word); i++)
        {
            if (isalpha (word[i]))
            {
                if (word[i] =='a' || word[i] == 'e' || word[i] == 'i' || word[i] == 'j' || word[i] == 'o' || word[i] == 'u')
                {
                    ++glas;
                }
                else
                {
                    ++soglas;
                }
            }
            else
            {
                ++other;
            }
        }
        cout << "glas=" << glas << ",soglas=" << soglas << ",other" << other << std::endl;
    } while (word[0] != 'q');
}


Под свой исходник приспособи сам.

Автор: aleknek 5.4.2008, 22:20
ув. 
JackYF, 
только в этом случае программа считает все согласные, гласные и другие символы, что никак не удовлетворяет условию, поставленной задачи.

Автор: JackYF 5.4.2008, 23:03
aleknek, блин. Твоя первоначальная программа ввела меня в заблуждение.
Тогда убери цикл for и вместо word[i] бери word[0].

Автор: marcusmae 6.4.2008, 13:24
Код

#include "stdafx.h"

#include <iostream>
#include <locale> 

using namespace std;

#define MAXWORDLENGTH 50
#define VOWELSCOUNT 7

const char vowels[VOWELSCOUNT] = "aeijou";

// Функция проверяет, является ли символ-аргумент гласной буквой.
bool isvowel(char symbol)
{
    for (unsigned int index = 0; index < VOWELSCOUNT; index++)
        if (symbol == vowels[index]) return true;
    return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
    // Устанавливаем локализацию.
    setlocale(LC_CTYPE,".1251");
    setlocale(LC_MONETARY,".1251");

    cout << "Введите слова (q для выхода)." << endl << endl;

    // Общий счётчик слов и счётчики слов, начинающихся с гласных и согласных.
    unsigned int wordsCount = 0, vowelWordsCount = 0, nonVowelWordsCount = 0;

    // Считываем первое слово.
    cout << "1. ";
    char word[MAXWORDLENGTH];
    cin.getline(word, MAXWORDLENGTH);

    // Первый символ в слове.
    char first = word[0];

    while(first != 'q')
    {
        // Увеличиваем счётчик слов.
        wordsCount++;

        // Проверяем, является ли первый символ word буквой.
        if (isalpha(first))
        {
            // Один из счётчиков должен быть увеличен в зависимости от того,
            // гласная ли это или согласная.
            if (isvowel(first))
                vowelWordsCount++;
            else
                nonVowelWordsCount++;
        }

        // Считываем очередное слово.
        cout << wordsCount + 1 << ". ";
        cin.getline(word, MAXWORDLENGTH);
        first = word[0];
    }

    // Выводим результаты.
    cout << endl;
    cout << "Количество гласных =   " << vowelWordsCount << endl;
    cout << "Количество согласных = " << nonVowelWordsCount << endl;
    cout << "Другие = " << wordsCount - vowelWordsCount - nonVowelWordsCount << endl;
    cout << "Всего  = " << wordsCount << endl;

    cin.get();

    return 0;
}


Код

Введите слова (q для выхода).

1. dfkla
2. asd
3. etrretg
4. odkfs
5. 1213;
6. ++_+_+
7. 324132
8. usad
9. iopas
10. gjk
11. opsad
12. q

Количество гласных =   6
Количество согласных = 2
Другие = 3
Всего  = 11



Автор: aleknek 6.4.2008, 13:33
Спасибо marcusmae, сейчас буду разбираться в коде.

Автор: marcusmae 6.4.2008, 13:40
Цитата

16 :     for (unsigned int index = 0; index < VOWELSCOUNT; index++)


VOWELSCOUNT - 1

Не ошибка, но лучше smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)