Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчет гласных, согласных 
V
    Опции темы
aleknek
Дата 5.4.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



Стоит перед до мной такая задача. Необходимо написать программу, которая читает слова по одному за раз, пока не будет введена буква 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;
}



PM MAIL   Вверх
JackYF
Дата 5.4.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Код

    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 засунь.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
aleknek
Дата 5.4.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



эффект тот же, программа подсчитывает только первое слово
PM MAIL   Вверх
JackYF
Дата 5.4.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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');
}


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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
aleknek
  Дата 5.4.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



ув. 
JackYF
только в этом случае программа считает все согласные, гласные и другие символы, что никак не удовлетворяет условию, поставленной задачи.
PM MAIL   Вверх
JackYF
Дата 5.4.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
marcusmae
Дата 6.4.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Код

#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





--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
aleknek
Дата 6.4.2008, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



Спасибо marcusmae, сейчас буду разбираться в коде.
PM MAIL   Вверх
marcusmae
Дата 6.4.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Цитата

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


VOWELSCOUNT - 1

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



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0809 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.