Rozpoznawanie samoglosek spolglosek i innych

Rozpoznawanie samoglosek spolglosek i innych
au7h
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 215
0

Witam,
Były już tematy o rozpoznawaniu pojedynczych samogłosek z tekstu, ja jednak mam takie zadanie (przerabiam podręcznik).

Cytuję..
Napisz program wczytujący dane wejściowe aż do wpisania pojedynczej litery q. Program ma pokazać liczbę słów zaczynajacych się od samogłosek, od spółgłosek i niezaliczonych do żadnej z tych kategorii.

Tak na szybko się za to porwałem bo chcę już przejść do następnego rozdziału, ale ..

Kopiuj
#include <iostream>
#include <cctype>
int main(){
  using std::cin;
  using std::cout;
  using std::endl;
  
  char znak;
  int samoG=0, spoL=0, inne=0;
  cin.get(znak);	//pobieram pierwszy znak
  while(znak != 'q'){
    if(isalpha(znak)){
      switch(znak){
	case 'a':
	case 'e':
	case 'i':
	case 'o':
	case 'u':
	case 'y':
	  samoG++;
	  break;
	default: spoL++;
      }
    }
    if(!isspace(znak) && znak != '\n')
      inne++;
    while(!isspace(znak))
      cin.get(znak);
    cin.get(znak);
  }
  cout<<samoG<<" "<<spoL<<" "<<inne<<endl;
  return 0;
} 

Samogłoski i spółgłoski działają zgodnie z założeniem, lecz "wyraz" (ciąg znaków aż do białego znaku zaczynajacy się od znaku innego niż litera) działa nieprawidłowo. W zdaniach zbyt dużo ich nalicza. Błąd jest tu:

Kopiuj
 if(!isspace(znak) && znak != '\n')
      inne++;

Przykładowo po wpisaniu:

andrzej ma psa o imieniu yetti. ma juz 5 lat. q

wynikiem jest 4 5 10
Może ma ktoś pomysł jak to naprawić? :)

MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
1

No do inne dolicza jeśli nie jest znakiem konca linii ani spacją, a literą może być wg tego warunku, jeszcze dorzuć do if-a warunek że nie jest literą.

au7h
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 215
0

Dzięki wielkie!
A jak tak kombinowałem, do switcha dopisywałem spółgłoski nawet :P

MN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
1

A najlepiej dopisz przed tego if-a else i problem z głowy, a i nieco wydajniej będzie, bo nie dublujesz warunku.

au7h
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 215
0
Kopiuj
#include <iostream>
#include <cctype>
int main(){
  using std::cin;
  using std::cout;
  using std::endl;
  
  char znak;
  int samoG=0, spoL=0, inne=0;
  cin.get(znak);	//pobieram pierwszy znak
  while(znak != 'q'){
    if(isalpha(znak)){
      switch(znak){
	case 'a':
	case 'e':
	case 'i':
	case 'o':
	case 'u':
	case 'y':
	  samoG++;
	  break;
	default: spoL++;
      }
    }
    else if(!isspace(znak) && znak != '\n' && !isalpha(znak))
      inne++;
    while(!isspace(znak))
      cin.get(znak);
    cin.get(znak);
  }
  cout<<samoG<<" "<<spoL<<" "<<inne<<endl;
  return 0;
}

i git :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.