Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Kurs C++, Lekcja 16] Prośba o sprawdzenie zadania domowego

Ostatnio zmodyfikowano 2011-08-14 21:14
Autor Wiadomość
makarone
Temat założony przez niniejszego użytkownika
[Kurs C++, Lekcja 16] Prośba o sprawdzenie zadania domowego
» 2011-08-12 20:02:28
witam,
prosze o informacje czy nie przekombinowalem?
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    srand( time( NULL ) );
    int liczba =( rand() % 10 ) + 1;
    int x;
    int y = 0;
    bool skax;
   
    if(( !skax ) ||( x != liczba ) )
    {
        do
        {
            std::cout << "Podaj liczbe od 1 do 10 : ";
            std::cin >> x;
            skax = std::cin.good();
            std::cin.clear();
            std::cin.sync();
            y++;
           
            if( !skax )
            {
                std::cout << "czy napewno podales liczbe?? liczbe!..." << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
            if(( x > liczba ) && skax )
            {
                std::cout << "wylosowana liczba jest mniejsza od podanej" << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
            if(( x < liczba ) && skax )
            {
                std::cout << "wylosowana liczba jest wieksza od podanej" << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
        } while(( !skax ) ||( x != liczba ) );
       
        std::cout << "farciarz... wylosowana liczba to " << liczba << ". Trafiles strzelajac " << y << " razy!" << std::endl;
    }
   
    return 0;
}

tak moze dodam, ze mam szczegole watpliwosci zwiazane (poza caloscia) z fragmentem:
if(( x > liczba ) && skax )

z drugiej strony wydaje sie, ze wszystko ladnie "smiga" :).
P-38995
malan
» 2011-08-12 20:46:05
if(( !skax ) ||( x != liczba ) )
Ten warunek zawsze będzie prawdziwy.

C/C++
if( !skax )
{
    std::cout << "czy napewno podales liczbe?? liczbe!..." << std::endl;
    std::cout << "sprobuj ponownie..." << std::endl;
    std::cin.clear();
    std::cin.sync();
}
Sprawdzasz wejście, ok, ale nic z tym dalej nie robisz poza wyświetleniem komunikatu.

C/C++
if(( x > liczba ) && skax )
{
    //...
}

if(( x < liczba ) && skax )
{
    //...
}
Sprawdzenie, czy udało się poprawnie wczytać liczbę można zastosować tylko raz. Nie ma potrzeby sprawdzać tego w tych warunkach.

while(( !skax ) ||( x != liczba ) );
Patrz wyżej.
P-38996
makarone
Temat założony przez niniejszego użytkownika
» 2011-08-12 21:17:54
no dobra to ja nie wiem czy dobrze to rozumem.
tylko prosze sie nie smiac, wielu rzeczy jeszcze nie lapie, wiec prosze skorygowac moje myslenie jesli jest bledne.

w sekwencji "if" chcialem podlaczyc rozne warunki.
1- kiedy mamy "!skax"
2- kiedy losowana liczba jest rozna od wpisanej.

zatem warunek z "if" bedzie spelniony w kazdym pzypadku, ale poza jednym - kiedy "x == liczba losowana".
ja chcialem zeby ta instrukcja uruchamiala sie w dwoch przypadkach - kiedy bedzie prawdziwe albo "p" albo "q".
tj, albo  "!skax" albo gdy x!= od liczby losowanej.
nie jest prawda, że te dwa warunki sa tozsame [w mojej opinii].

bowiem "!skax" wylacza wszystkie nieprawdziwe wyniki ale w samej "instrukcji -if-" chcialem wcisnac jeszcze kwestie ">, <".
wchodzi zatem polecenie "panie program, jesli beda przypadki "!skax" lub skax ale musza byc albo "<" albo ">" od losowanej to uruchom te petle co jest ponizej".
wszystkie pozostale tj, skax && x==liczba to osobny "wynik" wyskakujacy gdy petla albo sie zamknie albo nigdy sie nie zalaczy - pierwszy strzal i od razu poprawny.

co do powtarzania "skax" w dalszej czesci kodu zwiazane to jest z tym ze jak wykasowalem taki zapis to konsola mi wariowala.
lapalo komunikat o tym czy "napewno wpisales liczbe" z komunikatem "liczba jst mniejsza/wieksza".
to rozwiazalo ten problem.
a wykorzystnie polecenia "skax" i od spelnienia tego warunku wyswietlenie samego komunikatu - tak milo byc :)


poeksperementuje z Panskimi wskazowkami, czekam na kolejne.

pzdr.
m

 
 
P-39000
malan
» 2011-08-13 00:34:07
Wszystko zmierza ku temu, że nie inicjalizujesz zmiennych.

C/C++
int x;
Do zmiennej
x
 kompilator wstawi tzw. "śmieć", wartość losową. O co mi chodzi?
C/C++
#include <iostream>

int main()
{
    int var;
    std::cout << var << std::endl;
}
Po skompilowaniu tego kodu na ekranie konsoli zobaczyłem liczbę
-858993460
 - to jest ten tzw. "śmieć", wartość losowa.

Na marginesie:
Kompilator Microsoft Visual C++ 2010 Express poinformował mnie nawet, że ta zmienna jest niezainicjalizowana:
1>...\visual studio 2010 projects\4931\4931\main.cpp(6): warning C4700: uninitialized local variable 'var' used
Troskliwy nie?


C/C++
bool skax;
W C++ wszystko co jest różne od 0 (zera) jest prawdą.
C/C++
#include <iostream>

int main()
{
    bool var;
    std::cout << std::boolalpha << var << std::endl;
    std::cout << static_cast < int >( var ) << std::endl;
}
Po skompilowaniu tego przykładu na ekranie konsoli ujrzałem:
true
204
204
 - jest to liczba jaką wstawił kompilator, losowa. Jest różna od zera, prawda? Więc zmienna
var
 przyjmuje wartość
true
.


Wróćmy do warunku.
C/C++
if(( !skax ) ||( x != liczba ) )
{
    //...
}
Nie podam Ci dokładniej liczby, ale prawdopodobieństwo, że kompilator wstawi do zmiennej
skax
 wartość (zero) jest małe. Ten warunek (
!skax
) zatem, w większości przypadków będzie przybierał wartość
false
.
x != liczba
 - jakie jest prawdopodobieństwo, że kompilator wstawi do zmiennej
x
 akurat wylosowaną liczbę z przedziału <1 ; 10>? Ten warunek będzie przybierał (w większości przypadków) wartość
true
.

Program wejdzie do bloku tego warunku jeżeli przynajmniej jeden (z dwóch) warunków (
!skax
,
x != liczba
) będzie prawdziwy, czyli wszystko się zgadza.

Pytanie tylko, po co Ci ten warunek? Jakie on ma tutaj zastosowanie? W ciągu całego programu jest on sprawdzany tylko i wyłącznie jeden, jedyny raz. Potem następuje wejście do pętli. Jaki miałeś cel stosując go w tym miejscu?


bowiem "!skax" wylacza wszystkie nieprawdziwe wyniki
Zgadza się. Wybacz, przeoczyłem to. Aczkolwiek można to zrobić inaczej - sprawdzając tylko raz.


Jeżeli chodzi o warunek w pętli
do {...} while
. Dlaczego chcesz zakończyć działanie programu, gdy zostanie podane złe wejście?


poeksperementuje z Panskimi wskazowkami, czekam na kolejne.
Jaki ze mnie Pan ;) Bez przesady ;)
P-39023
makarone
Temat założony przez niniejszego użytkownika
» 2011-08-13 11:26:28

i dobra moge sie pochylic i powiedziec
"masz racje!"
tak popatrzylem na kod--> wniosek = malo bedzie liczb, ktore po spelnieniu warunku x!=liczba, nie bedzie spelnialo warunku !skax.

celem umieszczenia tego warunku w tym miejscu bylo zapewnienie ze sie uruchomi w tym miejscu takze w tym konkretnym przypadku.
ale jak powiedziano wczesniej mozna uznac ze jest to warunek zbyteczny.
odnosnie do dalszego uzycia "!skax" w przypadku blednego podawania wartosci przez uzytkownika na [znakcyfra] bedzie wyswietlal sie komunikat o bledzie.
co do "while.." i konczenia petli podobnie jak w przypadku z "if" inicjujacego petle mozna poprzestac ze petla kreci sie tak dlugo, jak dlugo "x!=liczba".
to tez poprawilem.

podsumowujac
1. warunek "x!=liczba" jest szerszy od !skax i obejmuje swoim zasiegiem takze przypadki "!skax".
2. warunek "!skax" bedzie szczegolnym przypadkiem w zbiorze "x!=liczba", od ktorego wystapienia w kodzie uzalezniono wyswietlenie odpowiedniego komunikatu.
3. podawanie przez uzytkownika jako "x" liczb odpowiednio "!skax", "x>liczba", "x<liczba" powodowac bedzie zatrzymanie procesu wewnatrz petli i poruszanie sie przez uzytkownika wewnatrz jej "bloku".
4. petla powinna krecic sie do momentu podania przez uzytkownika odpowiedniej liczby, wylosowanej przez program na samym poczatku (warunke
while( x != liczba )
.
5. podanie przez uzytkownika poprawnej liczby spowoduje opuszczenie petli i wyswietlenie odpowiedniego komunikatu.
 
obecny kod wyglada tak:
(czy jest zoptymalizowany? - tego nie wiem ale tez dziala :) )

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    srand( time( NULL ) );
    int liczba =( rand() % 10 ) + 1;
    int x;
    int y = 0;
    bool skax;
   
    if( x != liczba )
    {
        do
        {
            std::cout << "Podaj liczbe od 1 do 10 : ";
            std::cin >> x;
            skax = std::cin.good();
            std::cin.clear();
            std::cin.sync();
            y++;
           
            if( !skax )
            {
                std::cout << "czy napewno podales liczbe?? liczbe!..." << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
            if(( x > liczba ) && skax )
            {
                std::cout << "wylosowana liczba jest mniejsza od podanej" << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
            if(( x < liczba ) && skax )
            {
                std::cout << "wylosowana liczba jest wieksza od podanej" << std::endl;
                std::cout << "sprobuj ponownie..." << std::endl;
                std::cin.clear();
                std::cin.sync();
            }
        } while( x != liczba );
       
        std::cout << "farciarz... wylosowana liczba to " << liczba << ". Trafiles strzelajac " << y << " razy!" << std::endl;
    }
   
    return 0;
}
P-39041
SeaMonster131
» 2011-08-13 11:51:53
Tego if'a
if( x != liczba )
 też możesz usunąć. Nawet jeżeli na początku x będzie miał taką samą wartość co wylosowana liczba, to i tak pętla się wykona (a całkiem na początku pętli wpisujesz nową wartość dla x).
P-39045
makarone
Temat założony przez niniejszego użytkownika
» 2011-08-13 12:06:39
a myslalem ze napisalem taki ladny program :P
dobra czas na przerwe :P
P-39049
malan
» 2011-08-14 21:03:32
@SeaMonster131:
Nawet jeżeli na początku x będzie miał taką samą wartość co wylosowana liczba, to i tak pętla się wykona(...)
Are you sure? ;p
P-39155
« 1 » 2
  Strona 1 z 2 Następna strona