#include <stdio.h> #include <string.h> void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'<=s[i]&& s[i]<='z') s[i]-='a'-'A'; } } int main() { char s[] = "Hej pa dig"; fun(s); printf(s); return 0; } • • • • • • Vad är en struct? Deklarera och använda Initiera och kopiera Struct som parameter och returvärde till funktioner Arrayer av structar En databas • En struct används för att definiera en ny sammansatt datatyp, en datastruktur. Tidigare har vi sett arrayer som samlar data. Structar skilljer sig på två punkter: • De olika medlemmarna i en struct behöver inte vara av samma datatyp • Medlemmarna får ett namn och man väljer medlem mha namnet • Precis som arrayer samlar data som hör ihop så samlar en struct data som hör ihop. • I ett bilregister representerar vi en bil med en struct som innehåller bilmärke, årsmodell, antal körda mil • I ett grafiskt program representerar vi en punkt med en struct som innehåller x och y koordinater • I samma program representerar vi en cirkel med en struct som innehåller en punkt (mitten) och en radie #include <stdio.h> #include <string.h> #define ORDLANGD 30 struct bil{ char marke[ORDLANGD]; int arsmodell; int mil; }; //OBS semikolon glömmer man alltid! Ger svårtolkade fel. int main(){ struct bil b1; //b1 är variabel av datatypen struct bil strcpy(b1.marke,"Volvo"); b1.arsmodell=1971; b1.mil=21000; printf("Bil: %s, Arsmodell: %d, Mil: %d",b1.marke,b1.arsmodell,b1.mil); return 0; } struct bil { char marke[ORDLANGD]; int arsmodell; int mil; }; typedef struct bil Bil; //Definierar Bil att betyda struct bil. Använd stor bokstav int main() { Bil b1; //Snyggare och enklare strcpy(b1.marke,"Volvo"); b1.arsmodell=1971; b1.mil=21000; printf("Bil: %s, Arsmodell: %d, Mil: %d",b1.marke,b1.arsmodell,b1.mil); return 0; } #include <stdio.h> #include <string.h> #define ORDLANGD 30 struct bil { char marke[ORDLANGD]; int arsmodell; int mil; }; typedef struct bil Bil; int main() { Bil b1={"Volvo",2013,2100},b2={"Saab",1992,23000},b3; b3=b2; //Fungerar! Även arrayen kopieras! == fungerar dock ej på structar b3.mil=b3.mil+1000; printf("Bil: %s, Arsmodell: %d, Mil: %d",b3.marke,b3.arsmodell,b3.mil); return 0; } #include <stdio.h> #include <string.h> #define ORDLANGD 30 struct bil{ char marke[ORDLANGD]; int arsmodell; int mil; }; typedef struct bil Bil; Structar kopieras vid funktionsanrop (passed by value) och eftersom de kan vara stora skickar man ofta en pekare även om man inte ska ändra i structen void skrivBil(Bil b){ printf("Bil: %s, Arsmodell: %d, Mil: %d\n",b.marke,b.arsmodell,b.mil); } int main(){ Bil b1={"Volvo",2013,2100},b2={"Saab",1992,23000},b3; b3=b2; b3.mil=b3.mil+1000; skrivBil(b1); skrivBil(b2); skrivBil(b3); return 0; } void okaMil(Bil *b,int mil){ (*b).mil=(*b).mil+mil; //Obs ()-behövs! } int main() { Bil b1={"Volvo",2013,2100},b2={"Saab",1992,23000},b3; b3=b2; okaMil(&b3,1000); skrivBil(b1); skrivBil(b2); skrivBil(b3); return 0; } void okaMil(Bil *b,int mil){ b->mil=b->mil+mil; //snabbare skrivsätt } //betyder samma sak int main() { Bil b1={"Volvo",2013,2100},b2={"Saab",1992,23000},b3; b3=b2; okaMil(&b3,1000); skrivBil(b1); skrivBil(b2); skrivBil(b3); return 0; } Bil skapaBil(char marke[],int arsmodell, int mil){//Observera att vi kan ha samma namn! Bil b; strcpy(b.marke,marke); b.arsmodell=arsmodell; b.mil=mil; return b; //Äntligen kan vi returnera flera värden! } int main(){ Bil b1,b2; b1=skapaBil("Volvo",2013,2100); b2=skapaBil("Saab",1993,17000); skrivBil(b1); skrivBil(b2); return 0; } • • • • Som vi redan sett kan en struct ha en array som en medlem. Vi kan också ha arrayer där elementen är en struct Eller en struct som har en annan struct som medlem Och vi får nästla dem i flera lager. Ex: en array av structar som har en medlem som är en struct som består av arrayer där en av arrayerna består av en annan struct osv • Vi kan till och med (och det används ofta) ha en struct där en av medlemmarna är en pekare till en struct av samma typ (rekursiv def) • Vad vi ska fokusera på är en array av structar void registreraBilar(Bil reg[],int *antal){ char fortsatt[ORDLANGD] = "ja", marke[ORDLANGD], tmp[ORDLANGD]; int arsmodell,mil; while(strcmp(fortsatt,"ja")==0){ //#include <string.h> printf("Ange marke:"); gets(marke); printf("Ange arsmodell:"); gets(tmp); //scanf lämnar return-tecken som ställer till arsmodell=atoi(tmp); //#include <stdlib.h> printf("Ange mil:"); gets(tmp); mil=atoi(tmp); reg[*antal]=skapaBil(marke,arsmodell,mil); (*antal)++; printf("Vill du fortsatta? (ja/nej)"); gets(fortsatt); } } int main(){ Bil bilRegister[MAX]; int antal=0; registreraBilar(bilRegister,&antal); skrivBil(bilRegister[0]); //tillfällig test att det verkar funka return 0; } • För att se att det funkar som det ska verkar det vara ett bra läge att skriva en funktion som skriver ut hela registret. • Den kommer senare vara bra när man jobbar vidare med mer funktionalitet • Ni får anrop och funktionshuvud men sedan är det dags att börja jobba! #include <stdio.h> #include <string.h> #include <stdlib.h> #define ORDLANGD 30 #define MAX 100 struct bil { char marke[ORDLANGD]; int arsmodell; int mil; }; typedef struct bil Bil; void skrivBil(Bil b){ printf("Bil: %s, Arsmodell: %d, Mil: %d\n",b.marke,b.arsmodell,b.mil); } Bil skapaBil(char marke[],int arsmodell, int mil) { Bil b; strcpy(b.marke,marke); b.arsmodell=arsmodell; b.mil=mil; return b; } void registreraBilar(Bil reg[],int *antal){ char fortsatt[ORDLANGD] = "ja",marke[ORDLANGD],tmp[ORDLANGD]; int arsmodell,mil; while(strcmp(fortsatt,"ja")==0){ printf("Ange marke:"); gets(marke); printf("Ange arsmodell:"); gets(tmp); arsmodell=atoi(tmp); printf("Ange mil:"); gets(tmp); mil=atoi(tmp); reg[*antal]=skapaBil(marke,arsmodell,mil); (*antal)++; printf("Vill du fortsatta? (ja/nej)"); gets(fortsatt); } } void skrivaUtRegister(Bil reg[],int antal){/*här ska koden in*/} int main(){ Bil bilRegister[MAX]; int antal=0; registreraBilar(bilRegister,&antal); skrivaUtRegister(bilRegister,antal); return 0; } • • • Läs igenom föreläsningen och programmera exemplen och experimentera Lägg till funktionen som skriver ut alla bilar i registret i vårt bilregisterprogram. Utskriften ska se ut enlig nedan: 1. Bil: Volvo, Årsmodell: 2011, Mil: 3000 2. Bil: Saab, Årsmodell: 2000, Mil: 5000 3. Bil: Fiat, Årsmodell: 1999, Mil: 40000 Ändra programmet så att det startar med en meny enligt nedan. Beroende vad man väljer anropas rätt funktion. Sedan får användaren en ny chans att välja ända tills han väljer avsluta. 1. 2. 3. • • • Registrera bilar Skriv ut alla bilar Avsluta Lägg till ett menyalternativ som är Öka mil där man ska kunna välja en bil genom att ange dess plats i registret och sedan kan öka antalet mil den har gått. Så för att öka fiatens mil ovan anger man 3. Gör K16 E10 Skumma igenom 16.1 Läs 16.2-16.3 tom halva sid389 E-excercises, P-programming projects