Komputery, RTV, AGD, Komorki - C++; ktoś się orientuje?
jawlo - 22-09-2011, 19:26
KowaliK napisał/a: | .. program losujący liczby z przedziału od 1 do 20, sumujący je ale suma musi być równa tej zadeklarowanej przez użytkownika. |
suma - zadeklarowanea przez użytkownika
maja_suma - zlicza sumę losowanych liczb
KowaliK - 22-09-2011, 19:38
Jeszcze wcześniej, powołując się na zadanie robione w Turbo Pascalu, próbowałem napisać podobną pętlę z tym, że je na początku niepotrzebnie deklarowałem zmienną moja_suma=0 strzelając sobie w kolano. W TP to działało, w C++ już niekoniecznie. Dzięki!
krzychu - 23-09-2011, 07:55
Problem rozwiązany? Miałem teraz na to popatrzeć bo wcześniej nie miałem czasu.
jawlo - 27-09-2011, 08:42
Kod: | #include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int a;
int wynik=100;
do
{
cout<<"Podaj liczbe"<<endl;
cin>>a;
if (a<0)
{
cout<<"Za mala liczba!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
else
if ( (wynik-a) != 0)
wynik=wynik-a;
}while (wynik > 0);
cout<<"Odejmowanie zakonczone!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
|
pozostaje jeszcze problem gdy użytkownik wpisze liczbę większą niż aktualna wartość "wynik"
KowaliK - 27-09-2011, 10:19
krzychu napisał/a: | Problem rozwiązany? Miałem teraz na to popatrzeć bo wcześniej nie miałem czasu. |
Udało się.
Wracam ponownie - napisałem program, który od 100 odejmuje liczby podane przez użytkownika aż do otrzymania 0.
Kod: | #include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int a;
int wynik;
do
{
cout<<"Podaj liczbe"<<endl;
cin>>a;
if (a<0)
{
cout<<"Za mala liczba!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
else
wynik=100-a;
if (wynik != 0)
wynik=wynik-a;
}
while (wynik == 0);
cout<<"Odejmowanie zakonczone!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
|
Problem polega na tym, że jak podam np. 10, 20, 30 program kończy swoją pracę, a jak podam 100 to robi pętle.
Zmieniając wyrażenia Kod: | suma != 0 <-> suma ==9 | program kończy po wpisaniu 50. Dodatkowo w obu przypadkach nie zapamiętuje wyniku... Gdzie się kopnąłem?
jawlo napisał/a: | Kod: | #include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int a;
int wynik=100;
do
{
cout<<"Podaj liczbe"<<endl;
cin>>a;
if (a<0)
{
cout<<"Za mala liczba!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
else
if ( (wynik-a) != 0)
wynik=wynik-a;
}while (wynik > 0);
cout<<"Odejmowanie zakonczone!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
|
pozostaje jeszcze problem gdy użytkownik wpisze liczbę większą niż aktualna wartość "wynik" |
To o czym piszesz to "pikuś". Sprawdziłem teraz program podany przez Ciebie, ale dzieje się podobnie jak w tym moim (wkleję później poprzedni post, żeby był porządek w temacie). Po cztero/pięciokrotnym podaniu 25 program nie stopuje tylko dalej robi pętlę... To samo po podaniu np. dziesięciu 10 kończy dopiero, gdy wartość podanych przez użytkownika dyszek osiągnie 170. Z kolei przy zmianie program kończy już po podaniu pierwszej liczby.
KubaM - 27-09-2011, 11:15
Kod: | #include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
int sum = 1410;
int counter = 0;
int currentSum = 0;
int tempSum = 0;
while(currentSum != sum)
{
int myRand = rand() % 20;
tempSum = currentSum + myRand;
if(tempSum<sum)
{
currentSum += myRand;
counter++;
}
else
{
if(tempSum == sum)
{
currentSum += myRand;
counter++;
printf("%d ... %d",currentSum, counter);
break;
}
}
printf ("%d \n", currentSum);
}
return 0;
}
|
jawlo - 27-09-2011, 12:01
Ups..
Winny temu jest warunek. Powinien wyglądać tak:
Kod: |
if ( (wynik-a) >= 0)
|
KowaliK - 27-09-2011, 16:43
KubaM, dzięki ale to jest zwykły C, więc póki co nic mi po tym.
jawlo, teraz działa jak należy. Mógłbyś rozjaśnić to:
Kod: |
else
if ( (wynik-a) != 0)
wynik=wynik-a; |
dlaczego rozpisanie tego na coś takiego:
Kod: |
else
wynik=wynik-a;
if ( wynik !=0)
wynik=wynik-a
|
nie przyniesie zamierzonego działania? W czym tkwi różnica między tymi dwoma rzeczami?
KubaM - 27-09-2011, 17:58
To, że printfy zastąpisz coutami nie sprawią, że C zamieni sie w C++ I tak obiektowości C++ tu nie wykorzystujesz.
A co do pytania choć nie do mnie to odpowiem:
Cytat: | else
{
wynik=wynik-a;
if ( wynik !=0)
wynik=wynik-a
}
|
Bo tak to ci wykonywał tyko pierwszą linię na else, czyli podstawienie.
Nie zgłębiałem programu, ale dwa razy wykonujesz to samo działanie, a to raczej nie jest poprawnie.
jawlo - 27-09-2011, 19:51
taki zapis sprawdza, czy liczba a którą ktoś wprowadził nie powoduje zerowanie wyniku.
Kod: |
else
if ( (wynik-a) != 0)
wynik=wynik-a; |
Natomiast taki zapis powoduje, że liczba a jest dwa razy odejmowana od wynik
Kod: |
else
wynik=wynik-a;
if ( wynik !=0)
wynik=wynik-a
|
dobrze jest stosować "wcięcia" w zapisie kodu, wtedy łatwiej się go czyta.
KowaliK - 27-09-2011, 21:30
A istnieje możliwość prostszego zapisu tej operacji?
jawlo - 28-09-2011, 21:29
Zwykle jest wiele możliwości.
Np. taki zapis:
Kod: |
do
{
cout<<"Podaj liczbe"<<endl;
cin>>a;
if (a<0)
{
cout<<"Za mala liczba!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
}while( wynik=wynik-a );
|
prościej ?
Wg. mnie poprzedni jest najbardziej czytelny.
KowaliK - 07-11-2011, 21:37
OK, kumam, dziękować!
Teraz mam taki problem. Do napisania program wyświetlający tabelę 20 elementową, wypełnioną losowymi liczbami od 0 do 20, na końcu zliczający sumę wylosowanych... Napisałem coś takiego:
Kod: |
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int wylosowana;
int tablica [20];
srand (time(NULL));
for (int i=0; i<21; i++)
{
wylosowana = rand ()%20+1;
int tablica [20] = wylosowana;
cout<<int tablica [20]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
|
Liczby się losują, ale nie wypełniają tablicy... szczerze mówiąc, nie mam pojęcia jak to zrobić. Próbowałem w miejscu wylosowana wstawić int tablica [20] ale to na nic.
Krzyzak - 08-11-2011, 06:47
int tablica [20] = wylosowana;
cout<<int tablica [20]<<endl;
w środku [i] zamiast [20]
jawlo - 08-11-2011, 09:12
KowaliK napisał/a: |
Kod: |
int suma=0;
for (int i=0; i<20; i++)
{
wylosowana = rand()%21;
tablica[ i ] = wylosowana;
cout << tablica[ i ] << endl;
suma = suma + tablica[i];
}
cout << "suma wynosi" << suma;
|
|
Pętla powinna zawierać warunek i<20 gdyż elementy liczone są od 0.
Dodatkowo do losowania liczb z zakresu 0-20 używamy zapisu: rand()%21
|
|
|