Programmering Sommarkurs 2007 www.hh.se/staff/vero/programmering Verónica Gaspes IDE-sektionen Juni 14
Utkast 1 Recap 2 Mera om nya typer 3 Kort 4 Fält
Recap Man kan ge namn till typer. Vi undersökte enum för våra nya typer. Man kan ge namn till funktioner för att använda komplicerade kommandon så som de var enkla. Man kan sätta ihop kommandon som sall göras med hjälp av Sekvens först detta; sedan detta Alternativ switch/case Program kan ta emot argument från kommandoraden. Program kan skriva på terminalen. Program kan anropa andra program.
Exempel typedef enum {CLUB,SPADE, HEART, DIAMOND suit; void showsuit(suit s){ switch(s){ case CLUB : system("xv classic-cards/1.png");return; case SPADE : system("xv classic-cards/2.png");return; case HEART : system("xv classic-cards/3.png");return; case DIAMOND : system("xv classic-cards/4.png");return; int main(int argc, char * argv[]){ showsuit(club); showsuit(spade); showsuit(heart); showsuit(diamond);
Finns det ingen atosuit? Example Vill vi kunna visa bilden för sviten som anges i kommandoraden int main(int argc, char * argv[]){ showsuit(argv[1]); //this is not right! har vi problem... showsuit vill ha en suit som argument, men argv[1] är en sträng av tecken! Och det finns inga bibiotek för suit som det finns för int!
Finns det ingen atosuit? Example Vill vi kunna visa bilden för sviten som anges i kommandoraden int main(int argc, char * argv[]){ showsuit(argv[1]); //this is not right! har vi problem... showsuit vill ha en suit som argument, men argv[1] är en sträng av tecken! Och det finns inga bibiotek för suit som det finns för int!
Finns det ingen atosuit? Example Vill vi kunna visa bilden för sviten som anges i kommandoraden int main(int argc, char * argv[]){ showsuit(argv[1]); //this is not right! har vi problem... showsuit vill ha en suit som argument, men argv[1] är en sträng av tecken! Och det finns inga bibiotek för suit som det finns för int!
Finns det ingen atosuit? Example Vill vi kunna visa bilden för sviten som anges i kommandoraden int main(int argc, char * argv[]){ showsuit(argv[1]); //this is not right! har vi problem... showsuit vill ha en suit som argument, men argv[1] är en sträng av tecken! Och det finns inga bibiotek för suit som det finns för int!
Gör det själv! Vi vill definiera en funktion som översätter en sträng till en svit: suit string2suit(char * thesuit) Vi vill använda strängarna "club", "spade", "heart" och "diamond" för sviterna. För strängar finns inte switch! Hur skiljer vi åt dessa fyra från alla andra? Och vad gör vi med alla andra strängar?
IF... C erbjuder möjlighet att välja mellan två saker som skall göras beroende på ett boolskt värde. Och om man jämför för likhet kan man få ett boolskt värde... suit string2suit(char * thesuit){ if(streq(thesuit,"club"))return CLUB; if(streq(thesuit,"spade"))return SPADE; if(streq(thesuit,"heart"))return HEART; if(streq(thesuit,"diamond"))return DIAMOND; exit(0); // stop the program in all other cases!
Om if Den generella formen för if är if(boolsk uttryck) { att göras i fall true else{ att göras i fall false
Om streq I biblioteket för strängar finns en funktion int strcmp (char *s1, char *s2) som jämnför s1 och s2 med vanlig alfabetisk ordning och producerar 0 om de är lika, ett negativt tal om s1 kommer före s2 ett positivt tal om s1 kommer efter s2 Du kan använda detta för att definiera den funktion vi behöver: bool streq(char * s1, char * s2)
äntligen kort! Vi har infört typer för svit och valör, men vi vill ha kort! Vi behöver en typ där värden är par. Example typedef struct{ suit thesuit; value thevalue; card; Quiz Hur många värden finns av typ card?
Hur kan vi hantera kort? Nu är card en typ! Example Har man en svit och en valör kan man bygga ett kort card newcard(suit s, value v){ card aux = {s,v ; return aux;
Hur kan vi hantera kort? Nu är card en typ! Example Har man ett kort kan man komma åt dess svit och valör bool cardeq(card c1, card c2){ return c1.thesuit == c2.thesuit && c1.thevalue == c2.thevalue ; Quiz Vad är skillnaden mellan = och ==?
And now for something completely different
Hur kan datorn dela ut kort? HighLow Datorn visar ett kort och spelaren gissar om nästa kort är högre, lika eller lägre än detta. Datorn tar upp ett nytt kort och räknar ut om spelaren vann eller förlorade. Om spelaren gissade rätt får hon poäng, annars får datorn poäng. Det kort som tas upp av datorn blir grunden för nästa gissning. Datorn kan välja kort genom att dra ett slumpmässig tal mellan 0 och 51 koden för ett kort.
Bibliotek funktioner int rand() returns the next pseudo random number in this series, in the range 0 to RAND MAX. void srand(int seed) establishes the seed for a new series. To produce a different pseudo-random series each time your program is run, do srand (time (0)) Quiz Hur får vi ett slumpmässig tal mellan 0 och 51?
Vilka kort har redan visats? Vi kan inte räkna med att få olika värden alla 52 gånger! 11 19 1 43 23 23 49 20 23 Diskussion Vilken information behöver vi? Men vi kan inte visa samma kort två gånger! I programmet måste vi hålla reda på vilka koder redan har producerats! Om vi har denna information tillgänglig kan vi producera ett nytt värde tills vi får ett nytt!
Fält i C 0 1 2 3 4 5 6 7 8 9 Det finns en typ för dessa saker! elementtypen [] Som man läser array av elementtypen. På varje plats har man ett värde av typen elementtypen. Vad kan man göra med de? Man kan komma ått varje element genom att ange dess index plats. Example card adeck []; adeck[0] =newcard(heart,three)
Utdelade korten I vårt fall vill vi använda korten som index! Så, vi använder deras kod. Example f f t f t f f f t f 0 1 2 3 4 5 6 7 8... 51 Som säger oss att,, redan har förekommit.
Hur går man igenom fältet? Vet man vad man vill göra med varje element, finns i C ett sätt att göra samma sak med alla elementen! Ett nytt sätt att sätta samman enkla kommandon till mer avancerade kommandon! for- loopen int i; for(i=0;i<52; i++ ){ det som skall göras varje varv!
Initiering Example #include<stdbool.h>... bool usedcards [52]; int i; for(i=0;i<52;i++){ usedcards[i]=false;
Samma sak flera gånger Man behöver inte koppla en for-loop till ett fält! När som helst vi vill göra samma sak ett visst antal gånger kan vi använda den! Example #include<stdio.h> main(int argc, char * argv[]){ srand(time(0)); int i; for(i=0;i< atoi(argv[1]) ;i++){ printf("%d",rand()%52);