[C++] Ilosc wystąpień danej liczby

skixd10
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 28 sty 2017, o 22:31
Płeć: Mężczyzna
Lokalizacja: Wroclaw

[C++] Ilosc wystąpień danej liczby

Post autor: skixd10 »

Cześć,
Potrzebuje waszej pomocy. Nie potrafię sobie poradzić z tym programem. Czy ktoś byłby tak skłonny pomóc ?
Potrzebuje program na jutro na zaliczenie na studia: Program, który zlicza w podanym przez użytkownika szeregu cyfr ilość wystąpień każdej liczby (od 0 do 9). Zliczanie się kończy, kiedy użytkownik wprowadza symbol inny niż liczba.

Bardzo proszę o pomoc.
Z góry dziękuję.
Ostatnio zmieniony 29 sty 2017, o 19:21 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
nowy25
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 29 sty 2017, o 02:50
Płeć: Mężczyzna

[C++] Ilosc wystąpień danej liczby

Post autor: nowy25 »

Kod: Zaznacz cały

#include<iostream>
#include<string>
#include<cctype>//  isdigit(), czyli sprawdzamy czy cyfra

using namespace std;

int main()
{
     string tab;
     bool only_digit=true;

    int num_0=0,
        num_1=0,
        num_2=0,
        num_3=0,
        num_4=0,
        num_5=0,
        num_6=0,
        num_7=0,
        num_8=0,
        num_9=0;


while(only_digit)
{

    getline(cin,tab);

    for(int i=0; i<tab.size() && only_digit; i++)
    {

       if(!isdigit(tab[i]))
          only_digit=false;


       else if(tab[i]=='0')
          num_0++;
       else if(tab[i]=='1')
          num_1++;
       else if(tab[i]=='2')
          num_2++;
       else if(tab[i]=='3')
          num_3++;
       else if(tab[i]=='4')
          num_4++;
       else if(tab[i]=='5')
          num_5++;
       else if(tab[i]=='6')
          num_6++;
       else if(tab[i]=='7')
          num_7++;
       else if(tab[i]=='8')
          num_8++;
       else if(tab[i]=='9')
          num_9++;
    }

}

cout<<"zer: "<<num_0<<endl;
cout<<"jedynek: "<<num_1<<endl;
cout<<"dwojek: "<<num_2<<endl;
cout<<"trojek: "<<num_3<<endl;
cout<<"czworek: "<<num_4<<endl;
cout<<"piatek: "<<num_5<<endl;
cout<<"szostek: "<<num_6<<endl;
cout<<"siodemek: "<<num_7<<endl;
cout<<"osemek: "<<num_8<<endl;
cout<<"dziewiatek: "<<num_9<<endl;


return 0;
}
pisane na szybko, ale powinno dzialac :wink:
skixd10
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 28 sty 2017, o 22:31
Płeć: Mężczyzna
Lokalizacja: Wroclaw

[C++] Ilosc wystąpień danej liczby

Post autor: skixd10 »

Dziękuję bardzo!!!!
Gouranga
Użytkownik
Użytkownik
Posty: 1563
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 243 razy

[C++] Ilosc wystąpień danej liczby

Post autor: Gouranga »

za tak napisany kod dostałbyś u mnie 1/10 punktów, 1 za to, że daje dobry wynik, o pozostałych 9 za styl możesz zapomnieć oddając taki ochłap zamiast porządnego kodu.
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Ilosc wystąpień danej liczby

Post autor: mortan517 »

Dobrze, że nie kazali zliczać liter alfabetu
Straznik Teksasu
Użytkownik
Użytkownik
Posty: 426
Rejestracja: 29 paź 2015, o 16:26
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 21 razy
Pomógł: 90 razy

[C++] Ilosc wystąpień danej liczby

Post autor: Straznik Teksasu »

Krótszy kod

Kod: Zaznacz cały

#include <iostream>
#include <string>
using namespace std;

int main()
{
string linia;
//pole tablicy o danym numerze przechowuje ilość wystąpień tego numeru
unsigned tablica_cyfr[10];
bool wystapienie_samych_cyfr=true;
for(int i=0;i<10;i++)
    tablica_cyfr[i]=0;
cout<<"Podaj cyfry: ";

while(wystapienie_samych_cyfr)
{
    getline(cin,linia);
    for(unsigned i=0;i<linia.length();i++)
    {
        if(linia[i]>=48 && linia[i]<=57)
            tablica_cyfr[linia[i]-48]++;
        else if (linia[i]==32) {}
        else
            {
                wystapienie_samych_cyfr=false;
                break;
            }
    }
}

for(int i=0;i<10;i++)
    cout<<"Cyfra "<< i <<" wystapila "<<tablica_cyfr[i]<<" razy."<<endl;

    return 0;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Ilosc wystąpień danej liczby

Post autor: kalwi »

Za to dałbym 7/10
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Ilosc wystąpień danej liczby

Post autor: mortan517 »

Skoro już napisałem w tym temacie, a nic od siebie nie dodałem, to postanowiłem sam spróbować swoich sił w naprawieniu tego kodu. Używam całej przestrzeni nazw bo to bardzo krótki kod. Moja wersja w C++14:

Kod: Zaznacz cały

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
	//pobranie danych do stringa
	string inputData{};
	getline(cin, inputData);
	
	//inicjalizacja stałej i wektora
	auto numOfDigits{10};
	vector<decltype(numOfDigits)> vecCounter(numOfDigits, 0);
	
	//pętla z konwertującą typy lambdą
	for(auto i=0; i<inputData.length(); i++)
	{
		auto myCharToIntFunc = [](auto ch) {return stoi(string{ch});};
 
		if(!isdigit(inputData[i])) break;
		else vecCounter[myCharToIntFunc(inputData[i])]++;
	}
	
	//pętla do wyswietlania
	for(auto i=0; i<numOfDigits; i++)
		cout << "Cyfra " << i << " wystepuje " << vecCounter[i] << " razy" << endl;
 
	return 0;
}
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Ilosc wystąpień danej liczby

Post autor: kalwi »

Tu już 8.5/10.

Kod: Zaznacz cały

 #include <iostream>
#include <vector>
// brak #include <string>
using namespace std;

Kod: Zaznacz cały

 string inputData{}; // niepotrzebnie klamry, wywołałby się domyślny konstruktor który stworzy pusty string

Kod: Zaznacz cały

vecCounter(numOfDigits, 0) // analogicznie, domyślnie wektor ma ustawione wszelkie wartości na zero
Ogólnie przekombinowałeś, aby użyć niuansów standardu :D

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
   string inputData;
   getline(cin, inputData);
   
   size_t numOfDigits{10};
   vector<size_t> vecCounter(numOfDigits);
   
  	for(const auto &it : inputData)
  		if(isdigit(it))
  			++vecCounter[it - '0'];
   
    size_t i = 0;
    for(const auto &it : vecCounter)
  		cout << "Cyfra " << i++ << " wystepuje " << it << " razy" << endl;
 
   return 0;
}
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Ilosc wystąpień danej liczby

Post autor: mortan517 »

kalwi, spodziewałem się, że tak będzie, mam takie tendencje Chciałem po prostu jawnie zaznaczyć czym inicjalizuję. Od siebie dodam, że można jeszcze użyć metody at na wektorze zamiast operatora indeksowania.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Ilosc wystąpień danej liczby

Post autor: kalwi »

No można, fakt, zawsze to jakieś sprawdzenie czy zakresu się nie przekroczyło. A nawet można by tutaj słownik (std::map) wykorzystać, ale to też przesada.
Pamiętaj, że najważniejszą zasadą w programowaniu jest KISS - Keep It Simple Software
Straznik Teksasu
Użytkownik
Użytkownik
Posty: 426
Rejestracja: 29 paź 2015, o 16:26
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 21 razy
Pomógł: 90 razy

[C++] Ilosc wystąpień danej liczby

Post autor: Straznik Teksasu »

Moja druga wersja programu:
(dla ludzi o mocnych nerwach )
Ukryta treść:    
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Ilosc wystąpień danej liczby

Post autor: kalwi »

Kod: Zaznacz cały

            printf("Numeral %d appeared %d times.
", i, *indicator_digit_table);
UB.
ODPOWIEDZ