Forum: 100% Nybörjar - Feedback

Forum huvudsida -> Programmering -> 100% Nybörjar - Feedback

Sidor: 1

Till botten

svampenn 22:23 - 14:e Oktober 2009 | Post #1
Medlem
Inlägg: 17


Skicka PM
Hej!

Som topicen säger så har jag precis börjat försöka programmera (c++)

Till hjälp har jag blinkenlights nybörjarguide + internet ^^

I guiden har jag kommit till avsnitt tio - arrayer, med varierande resultat.

Det känns som att jag förstår.. en del, men med handen på hjärtat gissar jag 50% av gångerna och kör "trial and error" metoden tills det blir rätt.

Jag ville iaf testa mig själv och skapa ett "program" som räknar ut volymen av ett rätblock (utan att googla eller sno någon annans kod).

Som sagt, detta är nog så simpelt det kan bli.

(kod till programmet längst ner)
Det jag undrar är;

1. har jag använt mig av några onödiga funktioner i min kod? Och om jag har det, vad? Och vad borde jag ha gjort i stället? varför?

2. Vid stora tal så ballar "programmet" ur, löser man det genom att använda sig av floats eller doubles?(som kan arbeta med större tal om jag förstår det rätt?)



För mig är det väldigt viktigt att verkligen förstå vad jag gör, och det gör jag inte riktigt nu.

Jag vill inte bara förstå vad en funktion eller ett kommando gör, utan varför, och hur det hänger ihop.

Jag tror jag förstår de absoluta grunderna (avsnitt 3-7 och 9 i guiden) och jag förstår vad while och for loopar samt arrayer gör, dock förstår jag inte vilken del i koden som gör vad Smiley

int block[10];

vad gör [10]?
I guiden står det att man bestämmer att "den ska ha tio element genom att skriva [10]." Vad är ett element?
(Jag testade att skriva allt mellan 0 och 1000 inom []-teckena och fick samma resultat varje gång vilket inte ger mig några ledtrådar till vad detta värde bestämmer)


for (int i=0; i < 3; i++)

(Hoppas ni förstår det här)
I min hjärna:
börja på rad 1 (som är 0) fortsätt loopa så länge i:s värde är mindre än tre, öka med 1 varje gång.

Är det en riktig tolkning av vad som händer där?


cin >> block[i];

Ber användaren mata in ett nummer som sen sparas i
block[0]
block[1]
block[2]

rätt? fel? ^-^

Ja.. ni märker ju vilken nivå jag är på just nu, men jag vill verkligen lära mig grunderna 100% innan jag går vidare så om det är någon som orkar läsa igenom all denna (för er antagligen skit tråkiga) text och ge mig lite svar så är jag grymt tacksam!

I övrigt tackar jag för en grym guide.. verkligen skitbra.. och om någon har något annat tips eller trix så dela gärna med er!

Kod till mitt "program":

  1. #include <iostream>
  2.  
  3. using std::cout;
  4. using std::cin;
  5.  
  6. int main()
  7. {
  8. int block[1000];
  9. long summa;
  10.  
  11.  
  12. cout << " VOLYM-RAKNAREN! mata in ratblockets langd, bredd och hojd
  13. (tryck enter efter varje varde): ";
  14.  
  15. for (int i=0; i < 3; i++)
  16. {
  17. cin >> block[i];
  18. }
  19.  
  20. summa = block[0] * block[1] * block[2];
  21.  
  22. cout << "Ratblocket har volymen: " << summa << " ";
  23.  
  24.  
  25. return 0;
  26. }



EDIT* Jag testade att köra programmet utanför compilern och eftersom det avslutades direkt la jag till

cin.ignore();
cin.get();

(detta googlade jag)


Ha det bra / Jesper


Senast redigerad 23:32 - 14:e Oktober 2009


svampenn 23:16 - 14:e Oktober 2009 | Post #2
Medlem
Inlägg: 17


Skicka PM
Som ni ser så testade jag med olika [] värden på rad 8.

Råkade visst spara den med [1000] där ^^

verkar inte göra någon skillnad dock..



Senast redigerad 23:33 - 14:e Oktober 2009


FunkyChicken 23:56 - 14:e Oktober 2009 | Post #3
Nyhetsredaktör
Inlägg: 800


Skicka PM

(Kodrutan är lite buggig, den har en del andra problem också som radnumren tex, det ska säkert fixas vilket år som helst... men man kan alltid posta koden på pastebin.ca eller liknande och göra en länk i inlägget här om man vill vara extra tydlig.)

Hursomhelst, du har ju fattat helt rätt! Varje element i arrayen fungerar som en egen variabel. Fördelen är att du slipper deklarera en i taget, istället säger du bara hur många variabler du vill ha tillgång till så förstår C++ automatiskt att om du tex skriver

int tal[3];

så ska den skapa 3 olika variabler tal, som då får namnen tal[0], tal[1] och tal[2]. Det som är så otroligt användbart med detta är att C++ vet att det som står inom [] alltid ska vara ett tal. Så skriver du

tal[i] = 100;

så tolkas inte "i" i "[i]" som en bokstav utan som ett variabelnamn, och programmet går till den variabeln för att leta rätt på siffran som ska användas. Ligger siffran 2 sparad i variabeln i blir det alltså tal[2] som blir tilldelad värdet 100. Därför fungerar det så bra med loopar och arrayer! På samma vis tolkas tal[1+1] som tal[2] eftersom 1+1 är 2.

Tänk på arrayen som en byrå där varje element är en låda där du kan lagra ett värde. Innan du kan använda lådorna måste du skapa byrån, och då måste du tala om hur stor den ska vara, det är det du gör när du skriver

int block[3];

Då skapas alltså en array med tre element, de tre variablerna block[0], block[1] och block[2]. Skriver du

int block[1000];

skapas block[0], block[1], block[2], block[3], block[4], block[5] osv ända upp till block[999]. Det är alltså inte så konstigt att ditt program fungerar lika dant då, du använder ju bara block[0], block[1] och block[2] och de finns ju nu också. Om du däremot hade skrivit

int block[3];

och sedan försökt komma åt block[576] dvs ett alldeles för högt nummer (den variabeln finns inte / din byrå är för liten...) skulle du få alla möjliga spännande fel i programmet. Ibland drar man därför till med ett jättestort tal så man får gått om plats (många variabler) men det är en mycket dålig vana då det gör koden svårläst och försämrar presandan. Det bästa är att be om exakt så många element som man behöver.

for (int i=0; i < 3; i++) betyder "sätt variablen i till 0, gör allt som står här inne i loopen och börja om från början på loopen igen sålänge i är mindre än tre, öka i med ett efter varje varv".

Sen tycker matematikern i mig att variablen "summa" borde döpas om till "produkt" eftersom det är en produkt (resultatet av multiplikation) och inte en summa (resultatet av en addition) eller kanske ännu hellre "volym" eftersom det är det det är...Smiley

Lycka till!

NB: Att elementen i arrayen är olika variabler är inte riktigt sant... men tänk på det viset till vidare om du vill.




svampenn 09:08 - 15:e Oktober 2009 | Post #4
Medlem
Inlägg: 17


Skicka PM
Hej!

Tack för svaret FunkyChicken.


Tänk på arrayen som en byrå där varje element är en låda där du kan lagra ett värde."

Riktigt bra liknelse.. om jag förstår det rätt så betyder det att:

int tal[3];

"Skapa byrån tal med 3 lådor att lagra information i"

rätt uppfattat?



for (int i=0; i < 3; i++) betyder "sätt variablen i till 0, gör allt som står här inne i loopen och börja om från början på loopen igen sålänge i är mindre än tre, öka i med ett efter varje varv".


Så det "i" representerar i den kodraden är en möjlighet att mata in ett värde?

int i=0; //börja på första raden, rad 0
i < 3; //fortsätt loopa funktionen så länge i är mindre än 3 (alltså 3 gånger (0, 1, 2))
i++ //öka med ett varje gång loopen utförs

Är detta rätt uppfattat?


Ang. min kod; hade jag kunnat göra den på ett.. mer strukturerat sätt än vad jag valde att göra? Är den så att säga optimal för just det ändamål som jag skapade den? Alltså att räkna ut volymen av ett rätblock.

Hehe.. helt rätt att mina mattematiska uttryck är lite fel.. anledningen till att jag valde att skriva summa var för att det är det uttrycket som anv. i de exempel som finns i guiden, och det kändes enklare att jobba med något som jag var van vid.
Självklart borde jag ha använt rätt ord, om inte annat, för att förstå att det ordet inte påverkar funktionen alls.

Tack för all hjälp!





FunkyChicken 23:28 - 17:e Oktober 2009 | Post #5
Nyhetsredaktör
Inlägg: 800


Skicka PM
Rätt uppfattat med byrån.

"i" i loopen är en helt vanlig variabel. Den betyder ingenting särskilt och har inga mystiska egenskaper utöver det att man kan lagra (i det här fallet) ett tal i den. För att försökra dig om det kan du prova att flytta ut deklarationen utanför loopen så det ser lite mer bekant ut:

int i=0;
for ( ; i < 3; i++)

Nu ser det lite skumt ut i loopen, eller hur? men det är helt okej C++ kod! På samma vis kan du flytta inkrementeringen och göra den inne i själva loopen istället det blir ingen skillnad:

int i=0
for ( ; i < 3 ; )
{
cin >> block[i];
i++;
}

Testa! Nu läses loopen så här: "Gör först <ingenting> (deklarerandet av variabeln i är ju redan gjort), gör sedan allt som står inne i loopen och börja om från början, fortsätt sålänge i är mindre än tre. Mellan varje varv gör <ingenting> (ökandet av i görs ju nu inne i själva loopen)". Om det blev förvirrande nu så bortse från det här, såhär brukar man inte göra loopar ändå.

Däremot är det viktigt att inse att i inte har något med rader att göra:

int i=0; //betyder sätt variabeln i till 0, inget annat.

Vet inte om jag missförstod dig, men jag tolkar det som att du trodde att int i=0; påverkar vilken kodrad i loopen som börjar köras, men så är det alltså inte, loopen börjar alltid från början.

Vad är förresten meningen med att skriva int i=0; inne i

for (int i=0; i < 3 ; i++ )

och inte utanför som jag höll på och fulade mig med ovan? Jo, när deklareringen sker här betyder det att variabeln bara finns inuti loopen, den är inte tillgänglig för resten av programmet. Det är enda skillnaden mot vanliga variabler.




svampenn 13:18 - 18:e Oktober 2009 | Post #6
Medlem
Inlägg: 17


Skicka PM
Hej och tack igen!

Nu tror jag att jag förstår!Smiley

for (int i=0; i < 3; i++)

"Skapa variablen "i" lokalt i for loopen och sätt den på noll, kör loopen så länge i är mindre än 3, öka med ett varje gång"

nåt i den stilen?Smiley

Sen undrar jag en sak till som jag verkligen inte förstår..

Jag gjorde ett litet frågespel med hjälp av while loopar och det gick bra. Man fick 1 fråga och den loopades tills dess att man svarade rätt och då fick man gå vidare.. jättebra..

När man svarat rätt på alla 4 frågor så ville jag att man skulle få alternativet att spela igen, så jag la alla while looopar inuti en stor while loop. (hoppan ni förstår vad jag menar, vill inte klistra in koden, den är lång)

Problemet var att den hoppde över första frågan när man spelade igen, efter ungefär 3 timmar löste jag det genom att göra första frågan till en do{}while loop istället.

Är det någon som har en bra förklaring på varför det var så?

Tack igen FunkyChicken!




Kekke 15:51 - 18:e Oktober 2009 | Post #7
Medlem
Inlägg: 4


Skicka PM
Kan du inte paste in din kod på www.pastebin.se kan vi nog ta en titt på det..

-------------------------
Ingen signatur!



svampenn 19:34 - 18:e Oktober 2009 | Post #8
Medlem
Inlägg: 17


Skicka PM
Hej Kekke,

Jag visste inte om pastebin.se... smidigt.. ville inte posta koden i tråden för den är lång och fulSmiley

http://www.pastebin.se/199340

Där är den.. som sagt.. skit i frågorna haha.. det var bara för att testa att koda som jag gjorde den ^^


*edit felstavning


Senast redigerad 19:36 - 18:e Oktober 2009


ozamosi 20:07 - 18:e Oktober 2009 | Post #9
Administratör
Inlägg: 1129


Skicka PM
Felet beror på magi och otur.

Efter att man svarat rätt en gång så innehåller svar_1 rätt svar — annars hade man inte kommit ur loopen. När man spelar igen slänger datorn förvisso variabeln svar_1 och skapar en ny, men datorn tycker om att låta ett programs nya variabler ligga på samma ställen som ett programs gamla variabler, och det faller sig tydligen så att på just din dator med just din kompilator blir alla svar_1 samma minnesplats.

Det hade inte varit något problem om intar hade satts till något lämpligt standardvärde automatiskt när de skapas, men så är det inte: testa till exempel att skapa ett program som skapar ett par intar och skriver ut dem, utan att ge dem ett värde, och sedan stänger av sig så kommer skumma och högst varierande tal att skrivas ut, och beroende på när du kör programet kommer det bli olika tal.

Lösningen är alltså att sätta svar_1 till t ex 0 när du skapar den på rad 26.

Huruvida det behövs med strängar är jag osäker på — intar är C, och det är begripligt, strängar är C++ och det är obegripligt. *tycka*

-------------------------
Ljusblå



svampenn 21:40 - 18:e Oktober 2009 | Post #10
Medlem
Inlägg: 17


Skicka PM
Hej ozamosi, tack för hjälpen.

Så jag hade kunnat lösa detta genom att på 26:e raden skriva:

int svar_1 = 0;

?

Vad är det är det för skillnad att skriva = 0 i en int?
Jag trodde att "int svar_1;" == "int svar_1 = 0;"

Mitt problem är att samtidigt som jag försöker lära mig c++ språket, så försäker jag lära mig alla termer kring programmering.

Det språk som programmerare pratar med varandra om olika kompilatorer (heter det så?), biblotek, program mm. så jag fumlar lite i mörkret så att säga..

Just nu anv. jag code::blocks.

Den är gratis, och verkar ha fått bra kritik, är det någon som har erfarenhet av den som kan säga om jag borde fortsätta med den eller ev. byta?
(windows XP, SP3 om det spelar roll)

Tack för all hjälp igen!





ozamosi 22:36 - 18:e Oktober 2009 | Post #11
Administratör
Inlägg: 1129


Skicka PM
int svar_1; skapar en int-variabel.

int svar_1 = 0; skapar en int-variabel och sätter dess värde till 0.

Du ska alltså inte byta kompilator: din kod är trasig, eftersom den förutsätter att värdet svar_1 har när den skapas inte är samma som rätt svar. Du får inte förutsätta något om värdet på en variabel innan du har tilldelat ett värde till den.

-------------------------
Ljusblå



svampenn 09:08 - 19:e Oktober 2009 | Post #12
Medlem
Inlägg: 17


Skicka PM

din kod är trasig, eftersom den förutsätter att värdet svar_1 har när den skapas inte är samma som rätt svar.


Så för att lösa problemet borde jag ha skapat:

int svar_1;
svar_1 = 1985;

?

för om jag gör:

int svar_1 = 1985;

så kan jag inte göra en:

cin >> svar_1;

sen efter som svar_1 redan är satt till 1985?

Tack för hjälpen





ozamosi 18:39 - 19:e Oktober 2009 | Post #13
Administratör
Inlägg: 1129


Skicka PM
int svar_1;
svar_1 = 1985;

och

int svar_1 = 1985;

gör exakt samma sak.

Och du borde ha satt svar_1 till vad som helst utom just 1985 — är den redan rätt svar, kommer frågan inte att ställas i while-loopen.

Du kan göra hur många cin >> svar_1; du vill, oavsett vad svar_1 är satt till.

-------------------------
Ljusblå



svampenn 07:57 - 20:e Oktober 2009 | Post #14
Medlem
Inlägg: 17


Skicka PM
Just det.. precis som att

int i=0
for ( ; i < 3 ; )

är exakt samma sak som

for (int i=0; i < 3 ; i++ )

.. kom att tänka på det när jag låg och skulle sova igår ^^



Och du borde ha satt svar_1 till vad som helst utom just 1985 — är den redan rätt svar, kommer frågan inte att ställas i while-loopen.

Är det därför folk brukar skapa ints med värdet 0?

Skulle jag ha kunnat gjort en while loop istället för en do while på fråga ett om jag hade skapat

int svar_1 = 0;

?

Tack så mycket!

*Edit, la till en quote för tydlighet


Senast redigerad 12:25 - 20:e Oktober 2009


FunkyChicken 00:23 - 21:a Oktober 2009 | Post #15
Nyhetsredaktör
Inlägg: 800


Skicka PM

Ja du hade kunnat använda while()-loopen om du hade gjort

int svar_1=0;

Det är en bra vana att alltid initiera sina variabler på det sättet. Oftast är det mest naturligt att sätta dem till 0 men i det här fallet går det ju bra med vad som helst utom just 1985.

Anledningen till att det fungerar med do-loopen är (som du kanske kom på själv) att do-loopen hinner köras en gång innan kontrollen sker.

Och förresten ja, du har fattat helt rätt med for()-loopen också!




svampenn 09:58 - 21:a Oktober 2009 | Post #16
Medlem
Inlägg: 17


Skicka PM
Lång text på väg....

Hej FunkyChicken, tack för svar.

Så skillnaden mellan looparna är:

While:

Fortsätter loopen tills det att ett förbestämt kriterier uppfylls, ställer frågan innan loopen utförs.
while(x != x){}


do{}while:

Fortsätter loopen tills det att ett förbestämt kriterier uppfylls, ställer frågan efter loopen utförs.
do{}while(x != x)

for:

Loopar x antal förbestämda gånger.
for(int i = 0; i < x; i++){}


Hoppas jag fått det rätt nuSmiley Skitbra att veta varför det blev fel i mitt lilla program, borde jag ha räknat ut..



Sen har jag ett par frågor till.. (surprise)

Mitt mål med att lära mig programmera är att (hör och häpna) göra spel.

Vad rekommenderar ni att jag går vidare till efter det att jag har fått grundläggande kunskaper inom c++ ?

Jag hade tänkt mig att kanske testa börja göra grafik i SDL, eller openGL (utesluter det ena det andra?)

Om jag har förstått det rätt så fungerar det så här:

Man kodar spelets funktioner i c++, sen anv. man sig av biblotek från SDL eller (och?) openGL för att koda grafiken? Alltså, att man fortfarande skriver all kod i c++ fast med kommandon från t.ex. openGL bibloteket.
Är jag helt fel ute?

Hur länge borde jag vänta innan jag börjar ge mig in på det med grafik?


Och sen en sak till..
Jag kollade lite tutorials på en sida som heter läxa.nu. Väldigt basic och lättförstått. Liknar blinkenlights guide en hel del, och det innehåller ungefär samma moment.

I sista delen sa han nåt i stil med "Ja, det var det, nu har ni lärt er grunderna i c++ så nu kan ni göra nåt enkelt spel, t.ex. Yatzy."

Oooookej... tänkte jag. Jag har inte den blekaste aning om hur f*n jag ska programmera yatzy.. Jag har gjort en array med 6 rands i en for loop för att simulera tärningarna. Men sen måste man kunna välja att spara ett visst antal tärningar och kasta återstående, samt kunna spara sitt resultat, t.ex. liten stege, 3-tal, 4-tal osv.

Borde jag kunna programmera yatzy vid det här laget? Det jag "kan" nu är typ int, char, string, float, short, long, while-, do while-, for-loops, arrays, funktioner, if, else if, else, rand, switch... Dessa begrepp känner jag att jag försår mer eller mindre.

Så borde jag kunna göra ett fungerande yatzy spel nu?

Känns som att jag inte vet var jag ska börja.. känns rätt stort ärligt talat, men ett genomgående inslag när det pratas om programmering verkar vara "slutför det du har påbörjat" så jag skulle gärna vilja veta om dessa kommandon som jag kan idag borde räcka för att göra spelet Yatzy?

Ja.. det blev en hel del text där.. om du har tagit dig tid att läsa detta, tack!Smiley Och om du orkar svara, tack igen!

Ha en bra dag!




FunkyChicken 01:40 - 25:e Oktober 2009 | Post #17
Nyhetsredaktör
Inlägg: 800


Skicka PM
Tjena.

All programmering, alltid, handlar i grunden om samma sak. Nämligen att beskriva för datorn exakt vad det är man vill att den ska göra. Datorer "tänker" inte. De följer instruktioner blint och slaviskt. Instruktionerna, det är kommandon i ditt programmeringsspråk. Oftast är de kommandon som finns tillgängliga (de instruktioner som datorn "förstår") väldigt enkla. Din utmaning som programmerare är alltså att föreställa dig vad du vill ha gjort och beskriva detta med en detaljerad steg-för-steg-anvisning där varje steg är så enkelt att datorn kan utföra det. Detta kallas att skapa en algorithm,

Detta är något vi alla gör varje dag, människor emellan. "Koka kaffe" är en typisk instruktion som en människa förstår. Men tänk nu att du vill förklara för ett litet barn. Då måste man vara mer detaljerad "fyll på vatten, sätt i filter, häll i kaffe, tryck på knappen". Som programmerare tar vi detta till det extrema, och det gäller att ha ett strukturerat angreppssätt. Rätt väg att gå är att reducera varje problem till ett mindre delproblem.

Du kan nu några grundläggande C++kommandon. Du kan reducera ett simpelt problem ("skapa fem slumptal mellan 1-6") till olika instruktioner till datorn ("här behövs en for-loop, en array och en slumpgenerator") och sätta ihop dem till en programsnutt som gör det du vill. Kruxet är nu att om du vill göra ett lite större program så måste du först även reducera själva programmet till olika delproblem. Det är här det gäller att "tänka programmering" och det är svårt i början när man inte vet i vilken ände man ska börja i, men det kommer naturligt med mer erfarenhet. Det handlar om ren och skär problemlösningsmetodik och det är förstås nyttigt att träna på även i andra sammanhang.

Alltså. Bryt ned problemet i mindre delar. Bryt sedan ned varje delproblem i mindre delar, osv, och lös ett i taget. Du kan inte förvänta dig att bara sätta dig ned och hacka ihop ett yatzy på en gång. Men, ja, du kan allt du behöver kunna redan!

Yatzy spelas av flera spelare, men varje spelare spelar ju på samma sätt, så börja med att fundera på hur du skulle göra ett spel för en spelare.

Ett parti yatzy består av flera omgångar, men varje omgång går till på samma sätt, så börja med att fundera på hur en enda spelomgång går till.

Varje spelomgång börjar består av fyra steg.

Först kastas fem tärningar. Delproblem: Hur simulerar vi ett tärningskast? Hur utökar vi till fem kast?

Sedan väljer spelaren vilka tärningar som ska behållas och vilka som ska kastas igen. Delproblem: Hur ställer vi en fråga till spelaren? (cout) Hur läser vi svar från användaren? (cin) Hur sparar vi svaret? (i en variabel)
Hur simulerar vi ett nytt tärningskast? (återanvänd lösning från första steget!) Hur upprepar vi detta fem gånger?

Sedan väljer spelaren återigen vilka tärningar som ska behållas och vilka som ska kastas igen. Detta är en upprepning av förra steget, återanvänd lösningarna därifrån!

Sedan väljer spelaren hur resultatet ska sparas, dvs stege, triss eller vad? Delproblem: Hur ställer vi frågor och läser svar? Hur sparar vi resultatet? Hur vet vi om en kombination är giltig eller inte? Hur räknar vi ut poängen? Hur håller vi reda på vilka alternativ som finns kvar, hur många poäng man har?

Allt detta är problem som du kan lösa nu. Inte allt på en gång, men ett i taget, och det är i princip allt som krävs för ett yatzy. Detta är ett stort och svårt projekt så bli inte nedstämd om du kör fast. Men fundera på de här bitarna. Fundera på hur du skulle kombinera dem till ett färdigt spel. Gör ett förslag på programstruktur, vilka loopar du vill ha och vad varje bit av programmet ska göra.

När du sen vill gå vidare med grafik så, ja, du har fattat hur det hänger ihop med C++ och grafikprogrammeringen. SDL använder sig av OpenGL men är lättare att jobba med än att använda OpenGL direkt (dvs utan SDL som fungerar som ett mellanlager). Du behöver dock mer vana av programmering innan du ger dig i kast med det.

Det var rätt uppfattat om looparna också. Ska man vara petnoga behöver inte for-loopen alltid användas för att köras ett förutbestämt antal gånger, men det är så man brukar använda den så det är ett bra sätt att tänka.

Ha så skoj!




svampenn 02:38 - 25:e Oktober 2009 | Post #18
Medlem
Inlägg: 17


Skicka PM
Hej FC!

Kul att du svarade trots att det var en hel del frågor där.Smiley

jag börjar förstå varför programmering är så kul.

Jag har mer eller mindre gjort exakt som du beskrev.
Löste en liten del sen skrev jag // och /* */ kommentarer på vad jag måste fixa nästa gång och en uppmaning till mig självSmiley

Otroligt tillfredställande när jag nu idag (efter 6 dagar med 2 timmars jobb varje dag) har löst en liten del av problemet jag hade med att låta användaren spara en eller flera tärningar.

Dock är det absolut inte 100% än, långt ifrån, men sjukt roligt att se att man kan lösa problemen med logiskt tänkande..

För skojs skull kan ni se hur min kod ser ut just nuSmiley

http://www.pastebin.se/199406

OBS.

for(int j = 0; j < 2; j++)
{
dice[j] = rand()%10 + 1;
cout << "number " << j+1 << ": " << dice[j] << endl;
}

Jag vet att man använder 5 tärningar och att en tärning bara har 6 nummer, detta är bara tillfälligt för enkelhetens skull, kommer att ändras sen.


Okej, då vet jag vad jag har att vänta sen.

Jag inser att man inte kan göra ett rpg eller ens ett pong spel på ett rätt bra tag men skitkul att göra enklare saker också så länge det är utmanande.

Några tips på var man kan vända sig för att fortsätta sin utbildning när man känner att man förstår det som tas upp i de två c++ guiderna som finns här?

Böcker, andra sidor osv..

Åter igen, tack så mycket för all hjälp!

*EDIT för tydlighet


Senast redigerad 02:48 - 25:e Oktober 2009


ozamosi 12:16 - 25:e Oktober 2009 | Post #19
Administratör
Inlägg: 1129


Skicka PM
För vad du ska läsa vidare skulle jag föreslå objektorientering.

Det görs (eller gjordes iaf när jag började programmera) ofta en stor grej av hur Objektorientering Är Enda Sanna Vägen för att skriva kod, och det framställs ofta som ett magiskt sätt att skriva bättre kod. Så är det naturligtvis inte.

Poängen med det är att varje delproblem löses av ett eget objekt. Det blir därmed tydligare vilken funktion som löser vilket problem, genom att man kan titta på vilket objekt funktionen är en del av.

-------------------------
Ljusblå



FunkyChicken 20:30 - 25:e Oktober 2009 | Post #20
Nyhetsredaktör
Inlägg: 800


Skicka PM
Snyggt! Bra jobbat där. Men du har ställt till det lite på rad 63:

return (keep[2]);

Jag gissar att du hade tänkt att du skulle returnera arrayen keep, innan du bestämde dig för att göra den global? Men keep[2] betyder här "element nummer 2 i arrayen keep", och det elementet finns ju inte! (Den innehåller 2 element så max index är 1.) Det är BARA i deklarationen man använder siffran inom hakparenteser för att tala om hur stor arrayen är, alltid annars används hakparenteserna för att referera till ett visst element i arrayen. Man KAN returnera hela arrayer men det kräver att man pysslar lite med pekare, något som du absolut ska se till att lära dig senare i alla fall, men just nu behövs det inte alls då keep[] är global i ditt program. Du kan returna en valfri siffra istället, det spelar ingen roll för funktionen av ditt program, eller göra funktionen till en void istället för int och inte returnera någonting.

Säg till om det är någon särskild del du behöver hjälp med att lösa.




svampenn 12:37 - 26:e Oktober 2009 | Post #21
Medlem
Inlägg: 17


Skicka PM
Hej!

Ozamosi;

Tack för svaret.

Jag kollade upp det lite snabbt igår och det verkar vara rätt vettigt att lära sig.
Verkar vara en bra funktion att använda sig av då man skriver större program så att man kan ändra i olika delar av programmet utan att ställa till det i det stora hela.
Ska definitivt gå igenom det.

FunkyChicken;

Tack för hjälpen!


Men du har ställt till det lite på rad 63:

return (keep[2]);

Jo detta funderade jag lite över.. jag sitter på jobbet nu så jag har inte tillgång till min kod men jag vet att jag testade olika alternativ som t.ex. keep[] osv, men jag har för mig att det inte fungerade.

return(keep[2]) verkar faktiskt fungera.
Möjligt att jag har fel, jag ska kolla upp det när jag kommer hem.
Det du säger verkar ju logiskt eftersom att det jag vill ska returneras är de tal som finns i keep[0] och keep[1], inte själva arrayen.


Säg till om det är någon särskild del du behöver hjälp med att lösa.

De två stora problem jag har just nu är att;

1. Se till så att de tal som användaren väler att spara när han kastar tärningarna inte kastas om, utan bara de som inte sparades sen tidigare kastning.

2. Att resultaten som sparas i results() funktionen sparas genom hela spelet och att användaren inte ska kunna spara tal i en variabel som han sedan tidigare har sparat tal i.

Problem nr. 2 tror jag att jag kommer ha lättare för att lösa, har inte gått iegnom det så noga, la mer upp det för att få en övergripande bild.
Egentligen har jag bara jobbat på spelfunktionen, och än så länge vet jag inte hur jag ska lösa problem nr 1.
Så lite vägledning där vore snällt, dock inte en hel kod eftersom jag gärna försöker lösa det själv i största mån. Känns som att jag lär mig mer då!

Jag ska även kolla upp detta med pekare, tog en snabbtitt igår, förstod inte så mkt men verkar vara ett alternativ till att använda sig av arrays?

Återigen, tack så mycket för all hjälp!

/ Jesper




FunkyChicken 16:34 - 26:e Oktober 2009 | Post #22
Nyhetsredaktör
Inlägg: 800


Skicka PM

return(keep[2])

kanske fungerar i den mån att programmet inte kraschar (tror att det beror på kompilator dock, nån annan som vet?), men resultatet är inte väldefinierat beteende, dvs det gör inte vad du vill att det ska göra. Rent tekniskt betyder keep[2] "det tal som är sparat i datorns minne på adressen till keep[0] plus storleken av två int:s" (detta blir klarare när du lär dig om hur pekare och minnesallokering fungerar). Men på den adressen ligger det ingenting särskilt just nu så det som returneras är "skräpdata".

Problem 1 och 2 där är i grunden samma problem, "hur vet vi om något redan var sparat i den här variabeln?". En väg att gå är det som vi diskuterade tidigare, nämligen initieringen av variabler. Kommer du ihåg att jag sa att det är en bra vana att sätta alla variabler till 0 från början? Om du gör det med varje element i keep så kan du senare jämföra värdet som ligger sparat och se om det är 0 eller inte och då vet du om den ska kastas om eller inte. En liknande variant kan vara lösningen på problem 2.




svampenn 10:19 - 30:e Oktober 2009 | Post #23
Medlem
Inlägg: 17


Skicka PM
Hej FC!

Hehe, trots att du sa att man alltid ska ha som vana att sätta en variabel till 0 när man skapar den så gjorde jag inte det.Smiley

Jag fattar vad du menar med att man ska jämföra värdet som är sparat om det är 0 eller inte och på så vis bestämma om man ska "kasta" tärningen eller inte, men jag kan inte få det att fungera.

Antingen kastas alla tärningar eller så kastas inte tärningarna alls.

jag tror att felet ligger någonstans i att användaren sparar med "1" och kastar om med "0". Jag har haft ont om tid i veckan att testa men ibland sparas de tärningar som slumpas som en etta automatiskt och kastas då inte om.

Tror du att man kan få det att funka genom att lägga hela "kasta tärningen" koden (alltså de två for looparna) i en If sats som kollar om man har sparat en tärning? Det känns som att när det loopas om så kommer inte programmet ihåg vad som hände förra loopen. Det fungerar fortfarande att spara resultaten men tärningarna kastas fortfarande om.

Tack för hjlpen! =)




svampenn 22:47 - 8:e Februari 2010 | Post #24
Medlem
Inlägg: 17


Skicka PM
Hej..

Var längesen jag skrev härSmiley

Eftersom att ni gav mig så otroligt bra hjälp så vill dela med mig av mitt äntligen klara Yahtzee spel haha.

Det tog sin lilla tid men.. bättre sent än aldrig.. faktum är att jag la detta på is eftersom att jag höll på att bli galen hahaha..

men här har ni: http://pastebin.com/mf6f11be

och TUSEN TACK för hjälpen, sepciellt FC!




Sidor: 1

Forum huvudsida -> Programmering -> 100% Nybörjar - Feedback
Atom feed

Du får inte posta i den här tråden | Till toppen