infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: FMIAnita Liviu din Martie 07, 2010, 16:40:14



Titlul: Ce-am gresit?
Scris de: FMIAnita Liviu din 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 :)) ma dispera,m-am uitat vreo 20 de minute ca baba-n balta,si nu am rezolvat nimic...ma poate ajuta cineva? :D


Titlul: Răspuns: Ce-am gresit?
Scris de: Cezar Mocan din 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.


Titlul: Răspuns: Ce-am gresit?
Scris de: Pripoae Teodor Anton din Martie 07, 2010, 19:19:13
Ai pus s in loc de r si invers.


Titlul: Răspuns: Ce-am gresit?
Scris de: creeps din 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ă :)
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;}


Titlul: Răspuns: Ce-am gresit?
Scris de: FMIAnita Liviu din 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 :)) 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 :))


Titlul: Răspuns: Ce-am gresit?
Scris de: alexandru din 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 :P


Titlul: Răspuns: Ce-am gresit?
Scris de: CHERA Laurentiu din 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!