#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