Föreläsning 12 struct
Dagens kluring #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);
struct Vad är en struct? Deklarera och använda Initiera och kopiera Struct som parameter och returvärde till funktioner Arrayer av structar En databas
Vad är en struct? En struct används för att definiera en ny sammansatt datatyp, en datastruktur. Tidigare har vi sett arrayer som samlar data. Structar skiljer 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
Deklarera och använda en struct 1 #include <stdio.h> #include <string.h> #define WORDLENGTH 30 struct car char model[wordlength]; int year; int milage; ; //OBS semikolon glömmer man alltid! Ger svårtolkade fel. int main() struct car c1; //c1 är variabel av datatypen struct car strcpy(c1.model,"volvo"); c1.year=1971; c1.milage=21000; printf("bil: %s, Arsmodell: %d, Mil: %d",c1.model,c1.year,c1.milage);
Deklarera och använda en struct 2 struct car char model[wordlength]; int year; int milage; ; typedef struct car Car; //Definierar Car att betyda struct car. OBS stor bokstav int main() Car c1; //Snyggare och enklare strcpy(c1.model,"volvo"); c1.year=1971; c1.milage=21000; printf("bil: %s, Arsmodell: %d, Mil: %d",c1.model,c1.year,c1.milage);
Initialisering och kopiering #include <stdio.h> #include <string.h> #define WORDLENGTH 30 struct car char model[wordlength]; int year; int milage; ; typedef struct car Car; int main() Car c1="volvo",2013,2100,c2="saab",1992,23000,c3; c3=c2; //Fungerar! Även arrayen kopieras! == fungerar dock ej på structar c3.milage=c3.milage+1000; printf("bil: %s, Arsmodell: %d, Mil: %d",c3.model,c3.year,c3.milage);
Structar som parameter #include <stdio.h> #include <string.h> #define WORDLENGTH 30 struct car char model[wordlength]; int year; int milage; ; typedef struct car Car; 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 printcar(car c) printf("bil: %s, Arsmodell: %d, Mil: %d\n",c.model,c.year,c.milage); int main() Car c1="volvo",2013,2100,c2="saab",1992,23000,c3; c3=c2; c3.milage=c3.milage+1000; printcar (c1); printcar (c2); printcar (c3);
Pekare till struct som parameter 1 void increasemilage(car *pcar,int mile) (*pcar).milage=(*pcar).milage+mile; //Obs ()-behövs! int main() Car c1="volvo",2013,2100,c2="saab",1992,23000,c3; c3=c2; increasemilage(&c3,1000); printcar (c1); printcar (c2); printcar (c3);
Pekare till struct som parameter 2 void increasemilage(car *pcar,int mile) pcar->milage=pcar->milage+mile; //betyder exakt samma sak int main() Car c1="volvo",2013,2100,c2="saab",1992,23000,c3; c3=c2; increasemilage(&c3,1000); printcar (c1); printcar (c2); printcar (c3);
Struct som returvärde Car createcar(char model[],int year, int milage)//observera att vi kan ha samma namn! Car c; strcpy(c.model,model); c.year=year; c.milage=milage; return c; //Äntligen kan vi returnera flera värden! int main() Car c1, c2; c1=createcar("volvo",2013,2100); c2=createcar("saab",1992,23000); printcar (c1); printcar (c2);
Arrays och structar 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
En databas för bilar börjar ta form void regcars(car reg[],int *pnrofcars) char again[wordlength] = "ja", model[wordlength], tmp[wordlength]; int year,milage; while(strcmp(again,"ja")==0) //#include <string.h> printf("ange model:"); gets(model); printf("ange year:"); gets(tmp); //scanf lämnar return-tecken som ställer till year=atoi(tmp); //#include <stdlib.h> printf("ange milage:"); gets(tmp); milage=atoi(tmp); reg[*pnrofcars]=createcar(model,year,milage); (*pnrofcars)++; printf("vill du fortsatta? (ja/nej)"); gets(again); int main() Car carregister[max]; int nrofcars=0; regcars(carregister,&nrofcars); printcar(carregister[0]); //tillfällig test att det verkar funka
Skriva ut alla bilar i registret 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 WORDLENGTH 30 #define MAX 100 struct car char model[wordlength]; int year; int milage; ; typedef struct car Car; void printcar(car c) printf("bil: %s, Arsmodell: %d, mil: %d\n",c.model,c.year,c.milage); Car createcar(char model[],int year, int milage) Car c; strcpy(c.model,model); c.year=year; c.milage=milage; return c; void regcars(car reg[],int *pnrofcars) char again[wordlength] = "ja", model[wordlength], tmp[wordlength]; int year,milage; while(strcmp(again,"ja")==0) printf("ange model:"); gets(model); printf("ange year:"); gets(tmp); year=atoi(tmp); printf("ange milage:"); gets(tmp); milage=atoi(tmp); reg[*pnrofcars]=createcar(model,year,milage); (*pnrofcars)++; printf("vill du fortsatta? (ja/nej)"); gets(again); void printregister(car reg[], int nrofcars) int main() Car carregister[max]; int nrofcars=0; regcars(carregister,&nrofcars); printregister(carregister, nrofcars);