Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Ce-am gresit?  (Citit de 1755 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Patrunjel
Strain
*

Karma: -12
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« : Martie 07, 2010, 16:40:14 »

Salutari, in Ghid C++ pentru incepatori se prezinta cod pentru un program care imparte niste carti de joc.In carte codul arata cam asa:
Cod:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int rand_0toN1(int n);
void draw_a_card();
char *suits[4]={"hearts","diamonds","spades","clubs"};
char *ranks[13]={"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"};
int main(){
int n,i;
srand(time(0));
while(1){
cout<<"Enter no. of cards to draw(0 to exit): ";cin>>n;
if(n==0)
break;
for(i=1;i<=n;i++)
draw_a_card();}
return 0;}
void draw_a_card(){
int r,s;
r=rand_0toN1(13);
s=rand_0toN1(4);
cout<<ranks[r]<<" of "<<suits[s]<<endl;}
int rand_0toN1(int n){
return rand()%n;}
Acest cod face ceea ce trebuie sa faca... Insa eu m-am gandit sa simplific umpic sursa,si sa nu mai folosesc acel while,si functiile,variabilele,etc,sa le denumesc in romana (asa inteleg mai repede),si mi-a iesit urmatoarea sursa,buna ca sintaxa,insa,logic,e praf:
Cod:
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int aiurea(int n);
void trage ();

char *tip[4]={"inima", "trefla", "romb", "frunza"};
char *numar[13]={"as", "doi", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua", "zece", "valet", "dama", "popa"};

int main(){
int n,i;
srand(time(NULL));
cout<<"Introduceti numarul de carti de tras";cin>>n;
for(i=1;i<=n;i++)
trage();
return 0;}
void trage(){
int r,s;
r=aiurea(13);
s=aiurea(4);
cout<<tip[r]<<" de "<<numar[s]<<endl;}
int aiurea(int n){
return rand()%n;}
E aceeasi chestie,fara linia de cod pentru while,si cu variabilele denumite in romana,insa,spre disperarea mea,imi scrie "doi de as",si alte astfel de chestii...nici macar numarul de incercari de a trage o carte nu-l respecta,si pentru n>3 nu imi mai scrie nimic Smile) ma dispera,m-am uitat vreo 20 de minute ca baba-n balta,si nu am rezolvat nimic...ma poate ajuta cineva? Very Happy
Memorat
CezarMocan
Nu mai tace
*****

Karma: 252
Deconectat Deconectat

Mesaje: 567



Vezi Profilul
« Răspunde #1 : Martie 07, 2010, 18:03:55 »

In functia "trage" e o greseala, pentru ca sirul tip are lungime 4 si tu faci tip[r], unde r apartine intervalului [0 .. 12]. Sper ca nu mai e si altceva.
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #2 : Martie 07, 2010, 19:19:13 »

Ai pus s in loc de r si invers.
Memorat
cezar.elnazli
Strain


Karma: 2
Deconectat Deconectat

Mesaje: 9



Vezi Profilul
« Răspunde #3 : Martie 07, 2010, 19:28:07 »

Nu văd using namespace std; pe nicăieri. Trebuie specificat și asta, ideal după ce incluzi headerele. Poate în versiunea în limba română au luat-o pe scurtătură, însă eu am cartea în engleză, iar linia asta apare. while-ul acela nu este pus degeaba. Face programul să nu se termine după ce ai introdus primul număr și ți-a dat output-ul, ci atunci când scrii 0. Fără el, îi dai, să zicem, că vrei 3 cărți, el ți le arată și iese. Cu el, vei mai putea cere alte 4 cărți și ți le va da. Și tot așa până scrii 0, iar programul își termină execuția. Iar ca specificații ce nu apar în carte, folosește header-ele specifice C++ fără .h-ul de la sfârșit (ex.: <iostream.h> devine <iostream>), iar cele din C tot fără .h, dar cu un c la început (<math.h> devine <cmath>), pentru a evita warning-urile de tip "deprecated/antique header". Și vezi că poți defini și inițializa funcția "în același timp". De exemplu, în loc să faci ca în carte (sursa 1), poți face ca în sursa a doua:
Cod:
...
int o_functie(int n);
...
int main() {
    o_functie(2);
    ...
    return 0;
}
...
int o_functie(int n) {
    cout << n++;
}
Cod:
int o_functie(int n) {
    cout << n++;
}

int main() {
    o_functie(2);
    ...
    return 0;
}
...
Revenind la topic, mie codul ăsta îmi compilează și merge după cum am spus mai sus, fără bucla infinită (while(1)). Am adăugat using namespace std și am înlocuit tip[r] și numar cu tip și numar[r]. Greșeala era de lingvistică Smile
Cod:
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
int aiurea(int n);
void trage ();

char *tip[4]={"inima", "trefla", "romb", "frunza"};
char *numar[13]={"as", "doi", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua", "zece", "valet", "dama", "popa"};

int main(){
int n,i;
srand(time(NULL));
cout<<"Introduceti numarul de carti de tras";cin>>n;
for(i=1;i<=n;i++)
trage();
return 0;}
void trage(){
int r,s;
r=aiurea(13);
s=aiurea(4);
cout<<tip[s]<<" de "<<numar[r]<<endl;}
int aiurea(int n){
return rand()%n;}
« Ultima modificare: Martie 07, 2010, 19:33:53 de către creeps » Memorat
Patrunjel
Strain
*

Karma: -12
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #4 : Martie 07, 2010, 19:48:18 »

^ folosesc MinGW,deci asta e sintaxa corecta,ceea ce ziceai tu e valabil pe Microsof Visual C++ (sau asa ceva).While-ul nu e esential in program,il face doar sa se repede,si sa se inchida daca se introduce valoarea 0,deci am ales sa renunt la el,din dorinta de a simplifica programul,si,deci,de a-mi fi mai usor sa bag la cap
^^initial schimbasem s cu r Smile) dupa aia mi-am dat seama ca trebuiau schimbati intre ei vectorii care foloseau s,respectiv r,acuma merge,aia era greseala,multumesc mult
^^^ nu cred ca asta ar fi greseala,fiindca se foloseste operatorul modulo,deci chiar daca ar fi fost in multimea {1...13} tot acelasi rest ar returna.


Multumesc tuturor celor care ati postat aici.  Parca mi s-ar fi inmanat un oscar Smile)
Memorat
alexandru92
Nu mai tace
*****

Karma: -191
Deconectat Deconectat

Mesaje: 496



Vezi Profilul
« Răspunde #5 : Martie 08, 2010, 06:28:16 »

^ folosesc MinGW,deci asta e sintaxa corecta,ceea ce ziceai tu e valabil pe Microsof Visual C++ (sau asa ceva)
Defapt ce a zis @creeps  este si pentru MinGW Tongue
Memorat
chera_lary
De-al casei
***

Karma: -2
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #6 : Martie 08, 2010, 12:15:16 »

Nu este gresit while(1), deoarece urmeaza break;
LE: Da, codul cum era scris mai sus, nu avea niciun sens!
« Ultima modificare: Martie 08, 2010, 12:24:26 de către CHERA Laurentiu » Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines