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

Ilosc wyrazow w zdaniu,spacje-programowanie

VPS Starter Arubacloud
0 głosów
329 wizyt
pytanie zadane 8 czerwca 2018 w C i C++ przez adamus Użytkownik (860 p.)
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int x=1,dlugosc,i;
    string tekst;
    cout<<"Wprowadz tekst:"<<endl;
    getline(cin,tekst);
    dlugosc=tekst.length();
    if (dlugosc>0)
	{
    for(i=0;i<dlugosc-2;i++)
    {
        if(tekst[i]==' '&&tekst[i+1]!=' ')
        {
        	x++;
		}
		
    }
    }
    else
		 x=0;
    cout<<"Ilosc wyrazow wynosi: "<<x;
    return 0;
}

Wszytsko dziala ok oprocz tego gdy napisz np: "    Ala ma kota" to spacja widoczna przed wyrazem liczona jest jako wyraz. Jak tego uniknac warunkiem w if ? 

1 odpowiedź

0 głosów
odpowiedź 8 czerwca 2018 przez mokrowski Mędrzec (156,260 p.)
1. Zdefiniuj zmienne poprzedni_znak oraz biezacy_znak typu char

2. Zmienną poprzedni_znak ustaw przed pętlą na spację

3. Rozpocznij iterowanie w pętli

4. Rozpatrz wszystkie cztery kombinacje tych zmiennych przy zliczaniu znaków z pomocą if. Wcześniej pomocne może być zapisanie ich sobie na kartce.

 a) poprzedni_znak == spacja i biezacy_znak == spacja

 b) poprzedni_znak == spacja i biezacy_znak != spacja

 c) poprzedni_znak != spacja i biezacy_znak == spacja

 d) poprzedni_znak != spacja i biezacy_znak != spacja

5. Zapewne zorientujesz się że nie wszystkie z tych warunków są potrzebne

6. Przepisz biezacy_znak do poprzedni_znak

7. Domknij pętlę

Powodzenia.
komentarz 8 czerwca 2018 przez adamus Użytkownik (860 p.)
edycja 8 czerwca 2018 przez adamus
Troche nie bardzo rozumiem.... Usunac cały poprzedni program i zaczac od poczatku go definiowac? I tak ejszcze pomyslalem ze gdyby dopisac warunek ze if(tekst[0]==' ') to cos sie wtedy stanie ? Mozna by bylo to jakos zrobic ?
komentarz 8 czerwca 2018 przez mokrowski Mędrzec (156,260 p.)
#include <iostream>
#include <cstddef>

int main()
{
    std::string tekst;
    std::cout << "Wprowadz tekst: ";
    std::getline(std::cin,tekst);
    char poprzedni_znak = ' ';
    char biezacy_znak;
    for(std::size_t i = 0; i < tekst.length(); ++i)
    {
        biezacy_znak = tekst[i];
        std::cout << biezacy_znak << ": ";
        if(poprzedni_znak == ' ' && biezacy_znak == ' ')
        {
            std::cout << "obie spacje\n";
        }
        else if(poprzedni_znak == ' ' && biezacy_znak != ' ')
        {
            std::cout << "bieżacy różny od spacji\n";
        }
        else if(poprzedni_znak != ' ' && biezacy_znak == ' ')
        {
            std::cout << "poprzedni różny od spacji\n";
        }
        else if(poprzedni_znak != ' ' && biezacy_znak != ' ')
        {
            std::cout << "oba różne od spacji\n";
        }
        poprzedni_znak = biezacy_znak;
    }
}

Teraz już ... rozumiesz ?

A teraz pytanie za 100 pkt. W którym warunku umieścić inkerementację licznika? Jak znajdziesz to resztę warunków możesz usunąć.

komentarz 8 czerwca 2018 przez adamus Użytkownik (860 p.)
Niestety nie jestem jeszcze na tym poziomie i nie rozumiem tego co napisales... :/ nie miałem jeszcze tego..

Dlatego proboje to zrobic bardziej na logike korzystajac z bardziej skomplikowanych warunkow...
komentarz 8 czerwca 2018 przez mokrowski Mędrzec (156,260 p.)
Przecież tam jest zwykły if i else if? No to pytaj. Bo to naprawdę prosty kod a moim celem nie jest zrobienie za Ciebie zadania a naprowadzenie na rozwiązanie.
komentarz 8 czerwca 2018 przez adamus Użytkownik (860 p.)

Juz poradziłem sobie z tym sam :) Ale dzieki :D

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int x=1,dlugosc,i,b;
    string tekst;
    cout<<"Wprowadz tekst:"<<endl;
    getline(cin,tekst);
    dlugosc=tekst.length();
    if (dlugosc>0)
		{
  	  	for(i=0;i<dlugosc-2;i++)
  	  	{
  	      if(tekst[i]==' '&&tekst[i+1]!=' ')
  	     	 {
   	     		x++;
			}
   		 }
  	 	 }
  	else
  		x=0;
    	if(tekst[0]==' ')
    		cout << "Ilosc wyrazow wynosi "<<x-1;
		else
    		cout << "Ilosc wyrazow wynosi " <<x;
		 
    
    return 0;
}

 

komentarz 8 czerwca 2018 przez mokrowski Mędrzec (156,260 p.)

Ok.. to teraz popatrz. Co bardziej czytelne "po 3 msc." jak usiądziesz ponownie do kodu?

#include <iostream>
#include <string>
#include <cstddef>

int main()
{
    std::string tekst;
    std::cout << "Wprowadz tekst: ";
    std::getline(std::cin,tekst);
    char poprzedni_znak = ' ';
    char biezacy_znak;
    std::size_t licznik_wyrazow = 0;
    for(std::size_t i = 0; i < tekst.length(); ++i)
    {
        biezacy_znak = tekst[i];
        if(poprzedni_znak == ' ' && biezacy_znak != ' ')
        {
            ++licznik_wyrazow;
        }
        poprzedni_znak = biezacy_znak;
    }
    std::cout << "Ilość wyrazów wynosi " << licznik_wyrazow << ".\n";
}

No i porównaj sobie z inną propozycją którą podałem w innym wątku. Z użyciem std::stringstream. Co jest bardziej czytelne?

komentarz 9 czerwca 2018 przez adamus Użytkownik (860 p.)
No na pewno twoja wersja lecz ja nie miałem jeszcze std::stringstream wiec nie mogłem z tego skorzystac, ale dzieki :D

Podobne pytania

0 głosów
2 odpowiedzi 1,259 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez adamus Użytkownik (860 p.)
0 głosów
1 odpowiedź 324 wizyt
+1 głos
1 odpowiedź 239 wizyt
pytanie zadane 9 maja 2019 w JavaScript przez aniaska4 Obywatel (1,010 p.)

92,973 zapytań

141,938 odpowiedzi

321,177 komentarzy

62,301 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...