[C++] Wczytywanie liczb i agregowanie ich

mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

Hej,
mam do napisania program, który najpierw wczytuje pierwszą liczbę o specjalnym znaczeniu. Druga liczba to ilość wprowadzanych później danych. Potem są wprowadzane te dane. Na wyjście mają być wyświetlone słowa "TAK" lub "NIE"- w zależności czy liczba o specjalnym znaczeniu jest podzielna przez liczbę z danych. Napisałem program, który po wprowadzeniu pojedynczej danej zwraca od razu słowo "TAK" lub "NIE', jednak chodzi mi o to, żeby program wyświetlił na wyjście te słowa dla wszystkich wprowadzonych danych. Kod:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main ()
{
int special;
int input;
int data;

cout << "Wczytaj liczbe specjalna: " << endl;
cin >> special;

cout << "Wczytaj liczba oznaczajaca ilosc danych wejsciowych: " << endl;
cin >> input;

cout << "Wczytuj dane wejsciowe: " << endl;
for (input; input > 0; input--){
	cin >> data;
	
	if (special % data == 0)
	cout << "TAK" << endl;
	else
	cout << "NIE" << endl;
}

return 0;
}
Drugi program ma sumować dwie wartości procentowe i dla nich przyporządkować odpowiednią ocenę i wypisać ją w postaci cyfry i słownie. Nie wiem jak wczytać dla danej wartości ocenę słownie, jakiś pomysł?


Z góry dzięki!
Ostatnio zmieniony 28 paź 2016, o 06:50 przez Afish, łącznie zmieniany 3 razy.
Powód: Cały kod programu umieszczaj w tagach [code] [/code].
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main ()
{
int special;
int input;
int data;

cout << "Wczytaj liczbe specjalna: " << endl;
cin >> special;

cout << "Wczytaj liczba oznaczajaca ilosc danych wejsciowych: " << endl;
cin >> input;

cout << "Wczytuj dane wejsciowe: " << endl;
for (input; input > 0; input--){
	cin >> data;
	
	if (special % data == 0)
	cout << "TAK" << endl;
	else
	cout << "NIE" << endl;
}

return 0;
}
Po pierwsze - poczytaj sobie o tablicach
Po drugie - musisz przypisać jakąś wartość zmiennej input
Drugi program ma sumować dwie wartości procentowe i dla nich przyporządkować odpowiednią ocenę i wypisać ją w postaci cyfry i słownie. Nie wiem jak wczytać dla danej wartości ocenę słownie, jakiś pomysł
Zrób sobie tablicę stringów
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

Muszę przypisać wartość zmiennej input po to, żeby określić rozmiar tablicy? Tylko że ja nie znam tej wartości, bo będzie wczytywana, więc jak mogę określić liczbę elementów w tablicy?
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

Aj, przepraszam. Nie zauważyłem tego cina z inputem. Ale tak czy siak jest tu parę błędów.

Kod: Zaznacz cały

int main ()
 {
     int special;
     int input;

     cout << "Wczytaj liczbe specjalna: " << endl;
     cin >> special;

     cout << "Wczytaj liczba oznaczajaca ilosc danych wejsciowych: " << endl;
     cin >> input;

     int data[input];
     cout << "Wczytuj dane wejsciowe: " << endl;
     for(int i = 0; i < input; ++i)
          cin >> data[i];
     for(int i = 0; i < input; ++i)
     {
         if((data[i] % special) == 0)
            cout << "TAK" << endl;
         else
             cout << "NIE" << endl;
     }
     return 0;
 }
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: Ponury123 »

Drugi program ma sumować dwie wartości procentowe i dla nich przyporządkować odpowiednią ocenę i wypisać ją w postaci cyfry i słownie. Nie wiem jak wczytać dla danej wartości ocenę słownie, jakiś pomysł?
Może źle rozumiem, ale z tego co napisałeś program ma pobierać dwie liczby od użytkownika, sumować je i na podstawie sumy wypisać ocenę cyfrą i słownie.
Więc według mnie nie potrzebujesz wczytywać słów.

Pseudokod(o ile można to tak nazwać ;p)

Kod: Zaznacz cały

1. Wczytujesz dwie liczby od użytkownika 
1.1 Jeśli ich suma jest większa od 100 - błąd bo maksymalnie może być 100%, podaj ponownie
2. Wypisanie oceny - sam sobie ustal od ilu do ilu procent jest jaka ocena.
2.1 Jeżeli suma >50 i suma <75 cout<<"Ocena to 3, słownie: Trzy"<<endl; 
2.2... kolejne if-y 
Moim zdaniem to tak ma to wyglądać, ale jeśli nie mam racji to daj znać
Ostatnio zmieniony 28 paź 2016, o 06:51 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

@kalwi, dzięki, jeszcze pytanie Jak mogę zastrzec że zmienna input i data[i] są większe od \(\displaystyle{ 0}\)?

@Ponury123, problem jest w tym, że nie wiem gdzie umieścić te ify z ocenami słownymi, teraz są w złym miejscu. :/

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main ()
{
	
int setnumber;
int identity;
int subject;
int baca;
float mark;

cout << "Podaj liczbe zestawow: " << endl;
cin >> setnumber;

for (setnumber; setnumber > 0; setnumber--){ 
	cout << "Podaj zestaw danych " << endl;
	cin >> identity >> subject >> baca;
	
	if ((subject + baca) <  50) mark = 2.0;
	if ((subject + baca) >= 50) mark = 3.0;
	if ((subject + baca) >= 60) mark = 3.5;
	if ((subject + baca) >= 70) mark = 4.0;
	if ((subject + baca) >= 80) mark = 4.5;
	if ((subject + baca) >= 90) mark = 5.0;
	
	cout << identity << " " << subject << " " << baca << endl;
	cout << identity << " " << subject + baca << "% " << "(" << mark << ")";
	if ( mark = 2.0 ) cout << "niedostateczny";
	if ( mark = 3.0 ) cout << "dostateczny";
	if ( mark = 3.5 ) cout << "dostateczny plus";
	if ( mark = 4.0 ) cout << "dobry";
	if ( mark = 4.5 ) cout << "dobry plus";
	if ( mark = 5.0 ) cout << "bardzo dobry";
}
}
Ostatnio zmieniony 28 paź 2016, o 06:51 przez Afish, łącznie zmieniany 3 razy.
Powód: Poprawa wiadomości.
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

mich12 pisze:@kalwi, dzięki, jeszcze pytanie Jak mogę zastrzec że zmienna input i data[i] są większe od \(\displaystyle{ 0}\)?
Na przykład

Kod: Zaznacz cały

cout << "Wczytaj liczba oznaczajaca ilosc danych wejsciowych: " << endl;
input = -1;
while(input < 0)
      cin >> input;

Co do kodu, który teraz podałeś - poczytaj of else if.
Oraz ify są w dobrym miejscu, ale nie robisz porównania zmiennej mark z oceną. Tam musi być użyty operator ==
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int main ()
 {
 int special;
 int input;

special = 0;
while (special == 0)
cin >> special;

input = -1;
while(input < 0)
     cin >> input;

int data[input];
for(int i = 0; i < input; ++i)
cin >> data[i];
for(int i = 0; i < input; ++i)
{
if((data[i] % special) == 0)
            cout << "TAK" << endl;
         else
             cout << "NIE" << endl;
}
return 0;
}
To jest końcowy kod dla pierwszego zadania. Niestety coś musi być źle, bo automatyczna sprawdzarka mi je odrzuca. Jednak ja już serio nie widzę tu błędów :/ Wrzucam niżej polecenie:
Wejście
• Dane wczytywane są ze standardowego wejścia.
• Pierwszą daną wejściową jest liczba całkowita o specjal-
nym znaczeniu opisanym dalej.
• Drugą daną wejściową jest nieujemna liczba całkowita
oznaczająca ile zasadniczych danych wejściowych będzie
następnie podanych na wejście.
• Zasadniczymi danymi wejściowymi są niezerowe liczby
całkowite w ilości równej drugiej wczytanej danej.
Wyjście
• Efekty działania programu wypisywane są na standar-
dowe wyjście.
• Dla każdej zasadniczej danej zadaniem programu jest
wypisanie w osobnej linii słowa TAK w przypadku dziele-
nia bez reszty pierwszej wczytanej danej o specjalnym
znaczeniu lub słowa NIE w przeciwnym przypadku.
Dodatkowe uwarunkowania
Pierwsza linia kodu źródłowego MUSI w komentarzu w stan-
dardzie języka C++ (dwa znaki ukośnika) zawierać imię i na-
zwisko autora rozwiązania.

Co do zadania drugiego, to tutaj również muszą być wypisane dane zbiorczo, nie po każdym wczytaniu zmiennych (w każdym wierszu 4 wartości, np.: 1111 98% bardzo dobry (5.0). Czy tutaj też muszę zastosować tablicę? Tylko jak ją stworzyć?
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

Nie można było tak od razu? Z treści wynika, że podane dane są typu unsigned, więc ten kod można przerobić do postaci tak jak niżej. Po drugie - zwracaj większą uwagę na formatowanie kodu, bo obecnie niechlujnie to robisz.

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int main ()
 {
 	unsigned int special = 0;
 	unsigned int input;

	while (!special)
		cin >> special;

	cin >> input;
	unsigned int data[input];

	for(int i = 0; i < input; ++i)
		cin >> data[i];
	for(int i = 0; i < input; ++i)
	{
		if((data[i] % special) == 0)
       		cout << "TAK" << endl;
    	else
       		cout << "NIE" << endl;
	}
	return 0;
}
I to co napisałeś może się wywalać przy podaniu dużych liczb, tj. większych od zakresu inta (zakładając, że autor założył, że dane będą typu unsigned ).
mich12 pisze:Co do zadania drugiego, to tutaj również muszą być wypisane dane zbiorczo, nie po każdym wczytaniu zmiennych (w każdym wierszu 4 wartości, np.: 1111 98% bardzo dobry (5.0). Czy tutaj też muszę zastosować tablicę? Tylko jak ją stworzyć?
Albo stwórz 3 tablice, odpowiednio dla

Kod: Zaznacz cały

int identity;
int subject;
int baca;
I potem tak jak w poprzednim kodzie. Albo stwórz tablicę struktur.
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: Ponury123 »

Tu masz drugi, użyłem tablicy dwuwymiarowej poczytaj sobie o tym byś wiedział co się dzieje.
Program robi co ma, ale że nie jestem fanem dawania gotowców to nie-obsłużyłem kilku przypadków dla złych danych(chociażby ujemnych). To już zostawiam Tobie

Btw, w pierwszym wydaje mi się że to nie liczba specjalna ma być rożna od zera tylko dane wejściowe (wprowadzane do tablicy)
Zasadniczymi danymi wejściowymi są niezerowe liczby
całkowite w ilości równej drugiej wczytanej danej.
W każdym razie kod drugiego:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int zet;

int main ()
{
cout<<"Podaj ilosc zestawow"<<endl;
cin>>zet;

int data[zet][2];
for(int i =0; i<zet; i++){
cout<<"Podaj dane do zestawu nr "<<i+1<<endl;
cin>>data[i][0]; 
cin>>data[i][1]; 
while(data[i][0]+data[i][1] > 100){
	
	cout<<"ZLE DANE, jest maksymalnie 100%, podaj ponownie"<<endl;
	cin>>data[i][0]; 
	cin>>data[i][1]; 
}
}

cout<<"wystawienie oceny"<<endl;
for(int i =0; i < zet; i++){
	
	cout<<"
ocena zestaw nr "<<i+1<<endl;
	if((data[i][0]+data[i][1]) < 50){
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena niedostateczna"<<endl;
	}else if((data[i][0]+data[i][1]) >= 50  && (data[i][0]+data[i][1]) <70){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena dostateczna"<<endl;
		
	}else if((data[i][0]+data[i][1]) >= 70  && (data[i][0]+data[i][1]) <85){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena dobra"<<endl;
	}else if((data[i][0]+data[i][1]) >= 85  && (data[i][0]+data[i][1]) <95){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena b.dobra"<<endl;
	}else if((data[i][0]+data[i][1]) >= 95){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena celujaca"<<endl;
	}
}

}
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

Btw, w pierwszym wydaje mi się że to nie liczba specjalna ma być rożna od zera tylko dane wejściowe (wprowadzane do tablicy)
Mhm, czyli niedoczytałem i zamieniłem kolejność. W tym moim kodzie zmień

Kod: Zaznacz cały

if((data[i] % special) == 0)
na

Kod: Zaznacz cały

if((special % data[i]) == 0)
Ponury123 pisze:W każdym razie kod drugiego:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int zet;

int main ()
{
cout<<"Podaj ilosc zestawow"<<endl;
cin>>zet;

int data[zet][2];
for(int i =0; i<zet; i++){
cout<<"Podaj dane do zestawu nr "<<i+1<<endl;
cin>>data[i][0]; 
cin>>data[i][1]; 
while(data[i][0]+data[i][1] > 100){
	
	cout<<"ZLE DANE, jest maksymalnie 100%, podaj ponownie"<<endl;
	cin>>data[i][0]; 
	cin>>data[i][1]; 
}
}

cout<<"wystawienie oceny"<<endl;
for(int i =0; i < zet; i++){
	
	cout<<"
ocena zestaw nr "<<i+1<<endl;
	if((data[i][0]+data[i][1]) < 50){
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena niedostateczna"<<endl;
	}else if((data[i][0]+data[i][1]) >= 50  && (data[i][0]+data[i][1]) <70){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena dostateczna"<<endl;
		
	}else if((data[i][0]+data[i][1]) >= 70  && (data[i][0]+data[i][1]) <85){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena dobra"<<endl;
	}else if((data[i][0]+data[i][1]) >= 85  && (data[i][0]+data[i][1]) <95){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena b.dobra"<<endl;
	}else if((data[i][0]+data[i][1]) >= 95){
		
		cout<<"suma procent wynosi "<<data[i][0]+data[i][1]<<"%"<<endl;
		cout<<"ocena celujaca"<<endl;
	}
}

}
Uh, oczy bolą . Można zrobić to bardziej elegancko:

Kod: Zaznacz cały

#include <iostream>
#include <array>
#include <ciso646>
#include <string>
#include <vector>

using namespace std;

typedef struct Struktura
{
    int a, b, ocena;
    int suma;
}Struktura;

int main()
{
    size_t ilosc_zest;
    cout << "Podaj ilosc zestawow: ";
    cin >> ilosc_zest;

    const array<string, 10> oceny {"", "niedostateczny", "", "","dostateczny", "dostateczny plus",
                                  "dobry", "dobry plus", "bardzo dobry", "bardzo dobry"};

    vector<Struktura> zestawy(ilosc_zest);
    for(int i = 0; i < ilosc_zest; ++i)
    {
        do
        {
            cout << "Podaj pierwsza i druga liczbe:" << endl;
            cin >> zestawy[i].a >> zestawy[i].b;
        }
        while((zestawy[i].a < 0 or zestawy[i].b < 0) or (zestawy[i].a + zestawy[i].b >100));
        zestawy[i].suma = zestawy[i].a + zestawy[i].b;
        zestawy[i].ocena = (zestawy[i].suma < 50) ? 2 : (zestawy[i].suma / 10);
    }

    for(size_t i = 0; i < ilosc_zest; ++i)
        cout << "W sumie " << zestawy[i].suma << "\%, ocena " << oceny[zestawy[i].ocena - 1] << endl;
    return 0;
}
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: Ponury123 »

kalwi, jasne można, ale wątpie by miał już struktury jak tablice sprawiają mu trudność, w każdym razie oczywiście rozwiązanie zgrabniejsze
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

Dzięki Wam ogromne, ale co do zadania pierwszego, to teraz mam zaliczone już 67% zadania, więc coś musi być jeszcze do poprawy :/ Mógłbym prosić o sprawdzenie?
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++] Wczytywanie liczb i agregowanie ich

Post autor: kalwi »

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int main()
{
    unsigned int special;
    unsigned int input = 0;

   cin >> special;
   while(!input)
       cin >> input;
   unsigned int data[input];

   for(unsigned int i = 0; i < input; ++i)
   		data[i] = 0;

   for(int i = 0; i < input; ++i)
   {
   		while(!data[i])
   			cin >> data[i];
   }   

   for(int i = 0; i < input; ++i)
   {
      if((special % data[i]) == 0)
             cout << "TAK" << endl;
       else
             cout << "NIE" << endl;
   }
   return 0;
}
mich12
Użytkownik
Użytkownik
Posty: 180
Rejestracja: 13 paź 2013, o 13:41
Płeć: Mężczyzna
Podziękował: 29 razy

[C++] Wczytywanie liczb i agregowanie ich

Post autor: mich12 »

Dzięki wielkie. Muszę Cię niestety zmartwić, bo teraz wychodzi że mam za to znowu 33 %. A czy da się to zadanie zrobić bez tablic?
ODPOWIEDZ