To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
Forum Oficjalnego Klubu Mitsubishi - MitsuManiaki

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. :roll: 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ę. :wink:


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? :oops:

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ś". :wink: 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
Kod:
while (wynik == 0)
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. :wink:
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? :wink:

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ć. :oops: 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



Powered by phpBB modified by Przemo © 2003 phpBB Group