• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szukanie pierwszych liter w linii [char]

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
2,609 wizyt
pytanie zadane 16 czerwca 2016 w C i C++ przez niezalogowany
Moim zadaniem jest wyróżnienie pierwszych liter w zdaniu i sprawdzenie czy są one spółgłoskami lub samogłoskami. Jak mogę to wykonać korzystając z tablicy znaków char?

2 odpowiedzi

0 głosów
odpowiedź 16 czerwca 2016 przez winiardesign Gaduła (3,930 p.)
Szukaj kropki, a następnie dużej litery. Zrób tablicę z kodami ASCII samogłosek i np: porównuj pobraną literę.
komentarz 16 czerwca 2016 przez niezalogowany
Pierwszych liter słów w zdaniu*
0 głosów
odpowiedź 16 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Będziesz potrzebował funkcji zwracającej bool/sprawdzającej czy dana litera (char) jest samo- czy spółgłoską (zwykły switch da radę). Następnie robisz skan całego zdania. Litery, które należy sprawdzić to te które:
> Są pierwsze w tablicy (pierwsza litera zdania) LUB
> Mają po lewej stronie spację
komentarz 16 czerwca 2016 przez niezalogowany

Treść zadania jest następująca:

Napisz program wczytujący dane wejściowe aż do wpisania pojedynczej litery q. Dalej program ma pokazać liczbę słów zaczynających się od samogłosek, zaczynających się od spółgłosek i niezaliczonych do żadnej kategorii. Jeden sposób realizacji tego zadania to użycie funkcji isalpha() do wyróżnienia słów zaczynających się od liter i innych słów, a następnie użycie if lub switch do oddzielenia samogłosek od spółgłosek.

Podaj słowa (pojedyncze q kończy):
12 wołów piżmowych panoszyło się
na 15-metrowym trawniku. q
6 słów zaczyna się od spółgłosek.
0 słów zaczyna się od samogłosek.
2 słów nie zalicza się do żadnej kategorii

Jak odróżnić samogłoski od spółgłosek już wiem (za pomocą switchy). tylko nie wiem jak wyciągnąć pierwsze litery wyrazów w zdaniu i użyć na nich tych switchy.

komentarz 16 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Jeżeli te kolejne linijki tekstu to część zdania to tworzysz tyle stringów ile linijek (wczytujesz każdą linijkę np. getline(...)). Następnie skanujesz każdy znak w tych stringach.. jeśli jakiś znak będzie poprzedzony spacją (poprzedni znak był spacją) lub jest pierwszym elementem tego stringa to uznajemy ten znak za początek wyrazu. Następnie musisz za pomocą funkcji sprawdzającej poprawność (np. CzyLitera(char znak)) sprawdzić, czy ten znak, który spełnia warunek bycia na początku wyrazu jest literą.. Sama funkcja CzyLitera może wyglądać tak:
bool CzyLitera(char znak)
{
   return (znak>='a'&&znak<='z')||(znak>='A'&&znak<='Z')||znak=='ą'||znak=='Ą'... itd.
}
komentarz 16 czerwca 2016 przez niezalogowany
#include <iostream>
#include <cctype>
#include <string>

using namespace std;

char tab[12] = { 'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y' };
string slowo;
int spolgloski = 0, samogloski = 0, inne = 0;

int main()
{
	cout << "Podawaj slowa (pojedyncze q konczy):\n";
	

	while (slowo != "q" && cin >> slowo)
	{
		if (isalpha(slowo[0]))
		{
			for (int i = 0; i < 12; i++)
			{
				if (slowo[0] == tab[i])
				{
					samogloski++;
				} else if (slowo[0] != tab[i])
				{
					spolgloski++;
				}
			}
		}
		else { inne++; }
	}
	cout << spolgloski << " slow zaczyna sie od spolglosek.\n";
	cout << samogloski << " slow zaczyna sie od samoglosek.\n";
	cout << inne << " slow nie zalicza sie do zadnej z tych kategorii.";
	getchar(); getchar();
	return 0;
}

Rozwiązałem to w ten sposób, lecz niestety program źle zlicza spółgłoski. Może z tego kodu uda się wykonać zadanie.

komentarz 16 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

Naprawione ^^ Wystarczyło zastosować tzw. flagę, która "podnosi się" gdy zostanie spełniony warunek w pętli.. jeżeli program skończy pętlę, a flaga nie jest "podniesiona" to znaczy, że warunek ustawiony w pętli nie został spełniony.. dodałem jeszcze break; (gdy tylko warunek zostanie spełniony to program po prostu wyjdzie z pętli (zakończy ją)).
Fragment kodu:

    while (cin >> slowo && slowo != "q" )
    {
        if (isalpha(slowo[0]))
        {
            bool Flaga=false;
            for (int i = 0; i < 12; i++)
            if (slowo[0] == tab[i])
            {
                samogloski++; Flaga=true; break;
            }
            if(Flaga==false) spolgloski++;
        }
        else inne++;
    }

 

1
komentarz 16 czerwca 2016 przez niezalogowany
Dziękuję po raz kolejny za pomoc :)
komentarz 16 czerwca 2016 przez niezalogowany

Po usunięciu break; z pętli program działa idealnie.

komentarz 16 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

break; jest tylko i wyłącznie dla optymalizacji.. bez break; pętla będzie wykonywać się aż do końca.. co jest zbędne gdy już znajdziemy odpowiadającą samogłoskę.

komentarz 16 czerwca 2016 przez niezalogowany

Tak tylko, że z break; program podaje błędne dane (przynajmniej u mnie).

komentarz 16 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Dziwna sprawa.. O.o
W każdym razie działa.. to się liczy.

Podobne pytania

0 głosów
3 odpowiedzi 251 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez qwerty Początkujący (380 p.)
0 głosów
2 odpowiedzi 1,182 wizyt
pytanie zadane 31 marca 2016 w C i C++ przez Corazzo Obywatel (1,040 p.)
0 głosów
1 odpowiedź 2,751 wizyt

93,433 zapytań

142,429 odpowiedzi

322,661 komentarzy

62,796 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...