InjsscMedlem sedan apr. 200326 inlägg Det fungerar inte som det ska kan ni se några fel på den här koden?
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int kast(int res[]);
void utskrift(int t[], int a);
int main()
{
randomize();
srand((unsigned)time(NULL));
const int max=3;
int tarning\[max\], resultat\[6\];
int ganger,enter,antal;
int lika = 0, stege = 0;
for (int i=0; i\<6; i++)
resultat*\=0;
for (int i=0; i\<max; i++)
tarning*\=kast(resultat);
for(int j = 1; j \< 5; j++)
for(int k = 0; k != j && k \< 5; k++)
if(tarning\[j\] == tarning\[k\])
lika++;
for(int i = 0; i \< 5; i++)
if(tarning *\== 1 \|\| tarning *\== 6)
stege++;
if(lika == 0 && stege == 1)
cout \<\< "Stege";
if(lika == 1)
cout \<\< "Par";
if(lika == 2)
cout \<\< "Två par";
if(lika == 3)
cout \<\< "Triss";
if(lika == 4)
cout \<\< "Kåk";
if(lika == 6)
cout \<\< "Fyrtal";
if(lika == 10)
cout \<\< "Yatzy (fem lika)";
utskrift(tarning,max);
cout \<\< endl \<\< endl;
cout \<\< enter;
getch();
return 0;
}
int kast(int res[])
{
int varde=random(6)+1;
res\[varde-1\]++;
return varde;
}
void utskrift(int t[], int a)
{
for (int i=0; i\<a; i++) cout \<\< t*;
{
cout << t[a];
}
}*****
PeWMedlem sedan juni 200010 432 inlägg http://www.webforum.nu/misc.php?action=bbcode#buttons :)
Sen:
void utskrift(int t[], int a)
{
for (int i=0; i<a; i++) cout << t[i];
{
cout << t[a]; //skriver ut ???
}
}
Borde nog vara:
void utskrift(int t[], int a)
{
for (int i=0; i<a; i++)
{
cout << t[i]; //skriver ut varje pos till a-1
}
}
Orkade inte kolla ditt programflöde då det ser rörigt ut, så jag tittade bara på syntax och såg att du initierar lite hur som happ i koden. Ger inget fel i exempelvis borland c++ kompilator, men i andra mer nogräknade kommer det generera error. Deklarationer ska ske i ett block direkt i början. Dels ger det för kompilatorn korrekt kod och dels ger det kod som är betydligt lättare att överblicka.
PeWMedlem sedan juni 200010 432 inlägg Så. "Orkade" ( :p) ta mig till förstånd igen ;)
Tog mig friheten att peta lite i din kod och inkludera en sorterings funktion. Vet inte hur du tänkt att programmet ska fungera, men nu går den igenom kompilatorn iaf:
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int kast(int res[]);
void utskrift(int t[], int a);
void sort(int *t1,const int &len);
int main()
{
srand((unsigned)time(NULL));
const int max=3;
int tarning[max], resultat[6];
int lika = 0;
int stege = 0;
int i,j,k;
for (i=0; i<6; i++)
resultat[i]=0;
for (i=0; i<max; i++)
tarning[i]=kast(resultat);
for(j = 1; j < 5; j++)
for(k = 0; k != j && k < 5; k++)
if(tarning[j] == tarning[k])
lika++;
for(i = 0; i < 5; i++)
if(tarning[i] == 1 || tarning[i] == 6)
stege++;
if(lika == 0 && stege == 1)
cout << "Stege";
if(lika == 1)
cout << "Par";
if(lika == 2)
cout << "Två par";
if(lika == 3)
cout << "Triss";
if(lika == 4)
cout << "Kåk";
if(lika == 6)
cout << "Fyrtal";
if(lika == 10)
cout << "Yatzy (fem lika)";
utskrift(tarning,max);
cout << endl << endl;
getch();
return 0;
}
int kast(int res[])
{
int varde;
varde=rand()%6+1;
cout << varde << endl;
res[varde-1]++;
return varde;
}
void utskrift(int t[], int a)
{
int i;
//sortera så det blir stigande ordning
sort(t,a+1);
for (i=0; i<a; i++)
cout << t[i];
cout << t[a];
}
void sort(int *t1,const int &len){
bool changed;
do{
changed = false;
for(int i=0;i<len-1;i++){
if(t1[i] > t1[i+1]){
int temp = t1[i];
t1[i]=t1[i+1];
t1[i+1]=temp;
changed = true;
}
}
}while(changed);
}
PeW skrev:
Deklarationer ska ske i ett block direkt i början. Dels ger det för kompilatorn korrekt kod och dels ger det kod som är betydligt lättare att överblicka.
Vad menar du?
Jag är inte riktigt säker på att jag förstod det.
PeWMedlem sedan juni 200010 432 inlägg Vet inte vilken del av meningen du menar så jag besvarar båda:
1: Att variabler, pekare m.m deklareras initialt i funktioner och inte lokalt "on the fly". Även om de större kompilatorerna i språket C++ (till skillnad från ANSI C) medger detta är det inte säkert att stacken allokeras rätt för det. Stort ansvar vilar på kompilatorn.
2: Att kasta in nya variabler lite hipp som happ ger ett svårläst program i undantaget om de är temporära och om de inte ges självklara och unika namn. Gränsen är hårfin och jag tycker ivf inte att första kodsnutten var särskilt strukturerad.
Har du en annan tanke kring detta så varsågod, jag bara delger mina synpunkter utifrån vad jag vet och resonerar :)
Japp, det är mycket bättre att deklarera variabler "on the fly".
Det är fullt tillåtet i C++ och det är tillåtet av en anledning (eller egentligen flera).
Att deklarera varaibler på stacken tar tid, visserligen inte mycket tid, men ändå tid. Betänk följande kod:
void funk()
{
...
if (någotHarHänt)
{
//Vi behöver 1024 bytes
char data[1024];
....
}
}
Varför ska vi då deklarera det vi kanske behöver i början av functionen och inte när vi väl behöver det? Det ger en onödig hanstighets- och minnesförlust som mycket väl kan och borde undvikas.
Jag menar också att koden blir mer lättläst om variabler deklareras i anslutning till användandet och inte i ett block i början av funktionen. Förvirring kan lätt uppstå om man tittar igenom kod och plötsligt ser en variabel som man inte sett deklarerad. För att få veta vilken typ det är måste man scrolla uppåt och leta rätt på stället den deklarerades på.
Samma resonemang används för att argumentera globala variabler. De flesta menar att om en variabel kan göras lokal, så ska den också vara lokal.
Att kompliatorerna inte skulle klara av denna (grundläggande) egenskap i C++ tycks mig vara märkligt. Om en kompilator inte klarar av detta har den en mycket svår bugg och bör under inga omständigheter användas.
Slutligen ett citat från boken Effective C++, kapitel 32:
Item 32: Postpone variable definitions as long as possible.
So you subscribe to the C philosophy that variables should be defined at the beginning of a block. Cancel that subscription! In C++, it's unnecessary, unnatural, and expensive.
[...]
By postponing variable definitions, you improve program efficiency, increase program clarity, and reduce the need to document variable meanings. It looks like it's time to kiss those block-opening variable definitions good-bye.
PeWMedlem sedan juni 200010 432 inlägg
Att deklarera varaibler på stacken tar tid, visserligen inte mycket tid, men ändå tid
Nej. Det där köper jag inte riktigt ... ;)
Eftersom koden översätts till maskinkod blir det samma sak i slutändan och allokeringen på stacken i den nivån görs inte mitt i en subrutin, utan i början. C++ kan ses som ett skikt ovanför C och ger till slut en ren översättning till samma instruktioner som alla andra språk gör. Det som tar tid i sammanhanget är isf att allokera på heapen.
Varför ska vi då deklarera det vi kanske behöver i början av functionen och inte när vi väl behöver det? Det ger en onödig hanstighets- och minnesförlust som mycket väl kan och borde undvikas
Minnesutnyttjandet blir detsamma som när allokeringen sker i början av funktionen, eftersom "skrivsättet" översätts till samma sak - det finns inga extravaganta instruktioner som en C++ kompilator använder och maskinspråket är lika straightforward som i ren assembler. Som jag ovan skrev så allokeras stacken när maskinkoden går in i funktionen, inte under körning nånstans mitt i. Det blir ingen hastighetskillnad eftersom "labeln" ligger på samma plats i bägge fallen. Det som skulle kunna ta tid är ett hopp till en annan funktion med nytt allokerade på stacken, men nu handlar det om att hämta in data från en adress och inte ett hopp. Mao så ger "mitt" skrivsätt vs "ditt" samma maskinkod och därmed samma resultat - så länge kompilatorn är effektiv och översätter koden på rätt sätt.
Däremot kan det du beskriver stämma på ett språk i en runtime-miljö som ex. Java, men det var inte det som diskuterades.
Jag menar också att koden blir mer lättläst om variabler deklareras i anslutning till användandet och inte i ett block i början av funktionen
Ställer större krav på den som kodar för att det inte ska bli tillrört. Jag tycker att en kod på säg 1000 rader och uppåt blir tämligen svårläst om den är varvad med lokala variabler huxflux om personen som byggt lappverket samtidigt inte varit konsekvent i sin namngivning.
Men smaken är väl som baken även i detta fall ;)
InjsscMedlem sedan apr. 200326 inlägg Tack för alla svaren jag fått.
PeWMedlem sedan juni 200010 432 inlägg Okej :)
Såg i någon av dina trådar att du använde C++ Direkt boken. Du vet väl att det finns lösningsförslag till uppgifterna?