C-Programmering Kurs PDF
Document Details
Uploaded by OticGarnet2306
NTNU Cyberingeniørskolen
2019
Mohammad Derawi
Tags
Summary
These documents are notes on a C Programming course. It covers topics such as C-syntax, data types, and basic programming principles at the NTNU / Cyberingeniørskolen in 2019.
Full Transcript
Kurs i C-Programmering Mohammad Derawi 2019 NTNU / Cyberingeniørskolen 2 Hvorfor lære C-programmering? For å forstå hvordan man kan lage programmer, apps, spil, og mye mere i en datamaskin, tablet eller telefon, senere hen. For å kunne forstå...
Kurs i C-Programmering Mohammad Derawi 2019 NTNU / Cyberingeniørskolen 2 Hvorfor lære C-programmering? For å forstå hvordan man kan lage programmer, apps, spil, og mye mere i en datamaskin, tablet eller telefon, senere hen. For å kunne forstå grunnprinsipper i design av integrert elektronikk (mikrokontroller, datamaskinarkitektur) 3 Hovedemner Kommandovinduet Kompilatorer Datatyper, Variable og Aritmetiske operatorer Løkker Operatorer og Betingede valg (samt flervalgssetningen) Tabeller / Arrays Funksjoner Strukturer Lesing og skriving av filer Pekere Introduksjon 5 Introduksjon Dennis Ritchie utvikletspråket i 1972 Danner grunnlaget for andre programmeringsspråk (C++, Java, Matlab Perl, m.m) Selve skrivereglene for et dataspråk kalles syntaks – Kan sammenlignes med rettskrivning og grammatikkreglene i et vanlig språk. Husk at C er såkalt CASE SENSITIVE – man skelner mellem små og store bogstaver. Dataprogrammer kan skrives i C, men forstås ikke av datamaskinen – må kompileres og gjøres om til binær maskinkode. Når du har lært C kan du etterpå lærer alle andre programmeringsspråk i verden veldig enkelt. 6 Pensum og Verktøy Pensum: Lærebok : «Programming in C», Stephen G. Kochan Lærebøker (tutorials) på nett [trykk her] Lenke til online snipps forelesninger [trykk her] Programmeringsverktøy (Windows brukere): MinGW Codeblocks (følg veiledningen her) Visual Studio (Gratis fra skolen) – Benyttes også i mikrokontroller delen. Begge ovennevnte er Integrated Development Enviroment (IDE). Alternativet er notepad. Undervisning: Forelesninger Demonsrasjoner Video-øvelser Kommandovinduet 8 ‘cmd’ or ‘powershell’ Kommondovinduet (også kalt DOS-vinduet): Hele datamaskinens uten mus Kommandoer: help, dir *, ?, cd, set, cls, mkdir Programmer: ipconfig, netsat, format, ping, tracert... 9 exe-filer og batch-filer Fil med filforlengelse.exe er kjørbare filer. Gå for eksempel til mappen C:\Program Files\Microsoft Office\Office15 og skriv winword.exe i kommandovindue Fil med filforlengelse.bat kan inneholde en eller flere kommanovindu-kommandoer. For eksempel vil filen word.bat kunne inneholde kommandoen winword.exe. En bat- fil eksekveres før exe-filmed samme navn Kompilator 11 Kompilatoren Kompilatoren oversetter C-kode til binærkode som maskinen forstår. For andre språk finnes egne kompilatorer. 12 ‘gcc’-kompilatoren Vi må ha gcc-kompilatoren tilgjengelig ved å installere (plassere mapper/filer) MinGW (Minimalist GNU for Windows) gcc finner vi i bin-mappen der MinGW ble installert, gjerne i C:\MinGW\bin Etter installasjonen er ferdig må vi eventuelt sette path, slik at vi kan bruke gcc overalt i kommandolinjen. For å sjekke om gcc virker, skrives gcc i kommandolinjen. For å sjekke ut valgmulighetene skrives gcc –help Nå kan vi starte Programmeringa! 13 Første C-program #include int main() { printf(“Hello Verden\n”); return 0; } Åpen ett tilfeldigt notesblok (notepad, note, klassisk tekstdokument,..) Skriv den koden ovenfor. Lagrefilen som heiverden.c I kommandovinduet: c:\gcc herverden.c –o heiverden Selve –o er et flagg som står for output. Husk nesten alltid å avslutte enhver linje-settning med ett semikolon (;). printf(..) funksjonen brukes til å skrive tekst ut til skjermen. Datatyper, Variable og Aritmetiske operatorer 15 Datatyper I C er det fire grunnleggende datatyper: char (1B), int (≥2B), float (4B) og double (8B). Det finnes også modfikasjoner: long int (≥4B), long long int (≥8B), long double (≥8B). Og også disse når man ikke ønsker tall med fortegn: unsigned int , unsigned char.. Her er ett eksempel med datatypen char som kan brukes forskjelligt. #include int main() // Dette programmet skriver ut "Hallo" { char a, b, c, d; // Deklarasjon char e = 'o'; // Deklarasjon + initialisering a = 'H'; // Initialisering b = 'a'; c = 'l'; d = 108; // Num. verdi for 'l' printf("%c%c%c%c%c\n", a, b, c, d, e); return 0; } 16 Variable (1) Variable kan sammenlignes med celler eller beholdere i datamaskinens hukommelse der du kan lagre verdier av forskjellig slag. Selv om du selv kan bestemme variabelnavnene, er det visse faste regler som må følges: Variabelnavn - - - - | Eksempel | - kan ikke starte med et siffer | 4kant | - kan inneholde sifre på alla andre steder | kant4 | - kan ikke inneholde matematiske tegn | a*b+c-d | - kan ikke inneholde skilletegnene | #@%£&!,. | - kan begynne med og inneholde "underscore" | _hallo | - kan ikke være et C nøkkelord | while | - kan ikke inneholde blanke tegn | fir kant | - kan ikke inneholde "norske" tegn | blåbær | - kan inneholde en blanding av små og store bokstaver | FirKant | 17 Variable (2) - eksempel #include // Variable declaration: extern int a, b; extern int c; extern float f; int main () { int a, b; int c; float f; a = 10; b = 20; c = a + b; printf("value of c : %d \n", c); f = 70.0/3.0; printf("value of f : %f \n", f); return 0; } 18 Nøkkelord i C Følgende ord har definert betydning i C og kan derfor ikke benyttes til navn på variable, funksjoner eller konstanter |auto |double |int |struct |break |else |long |switch |case |enum |register |typedef |char |extern |return |union |const |float |short |unsigned |continue |for |signed |void |default |goto |sizeof |volatile |do |if |static |while Ikke alle av disse nøkkelordene er benyttet i dette faget. 19 Aritmetiske operatorer (1) Det benyttes svært mange forskjellige OPERATORER i C. For neden nevnes operatorene for de fire standard regneartene samt tilordningsoperatoren: | Operator | Eksempel |Beskrivelse | | + | a + b |Addisjon | | - | a - 7 |Subtraksjon | | * | 6 * b |Multiplikasjon | | / | a / c |Divisjon | | = | d = a + 30; |Tilordning. Variabelen på venstre side av | | | |tilordningsoperatoren gis verdien til | | | |resultatet av uttrykket på høyre side av | | | |tilordningsoperatoren. | Du kan legge kommentarer til C-programmetpå følgende måter // Dette er også en kommentar. 20 Aritmetiske operatorer (2) I C har man en kortform for å uttrykke at man modifiserer innholdet av en variabel: tilordningsoperatorer. Denne formen er svært utbredt og gir kompakte og lettleste programmer: | Fullt utskrevet | Kort form | | x = x * y; | x *= y; | | x = x / y; | x /= y; | | x = x % y; | x %= y; | | x = x + y; | x += y; | | x = x - y; | x -= y; | Inkrement og dekrementsoperator a++; // Det samme som a += 1 eller a = a + 1 ++a; // Det samme som a += 1 eller a = a + 1 a--; // Det samme som a -= 1 eller a = a - 1 --a; // Det samme som a -= 1 eller a = a - 1 Operatorer og Betingede valg 22 Litt info Til nå har vi sett på programeksempler som utfører sekvensielle settninger. I realistiske programmer trenger vi å kunne ta avgjørelser også. Muligheter for å ta en avgjørelse får vi etter å ha foretatt en test. F. eks.: Hvis det snør ute drar vi til CC, hvis ikke, drar vi på Mjøsa. Hvis man kan svare ja på en slik test, sier vi at utfallet til testen er SANN (TRUE), Hvis man kan svare nei, er utfallet FEIL (FALSE). I C tolkes heltallsverdien 1 som SANN, mens 0 tolkes som FEIL. 23 Relasjonsoperatorer Det er 6 operatorer som lar oss teste numeriske verdier mot hverandre to og to. Tabellen nedenfor beskriver de enkelterelasjonsoperatorene. Alle operatorene gir 0 (FEIL) eller 1 (SANN) til resultat. |Operatorens navn | Symbol | |Mindre enn | < | |Mindre enn eller lik | | |Større enn eller lik | >= | |Lik | == | |Ikke lik (forskjellig fra) | != | 5 > 1 1 (SANN) 4 >= 3 1 (SANN) 4 < 2 0 (FEIL) 4 = 2 1 (SANN) 7 != 1 1 (SANN) 5 == 4 0 (FEIL) Det er venstre side i relasjonsuttrykkene som må leses først - f. eks.: Er 5 større enn 1 ? 24 Logiske operatorer Testene i forrige slids er en form for logiske betingelser (uttrykk). I C bruker vi ett heltall og tolker verdien som SANN /FEIL. F.eks. |Operator NOT (logisk negasjon) |Uttrykk |Resultat |! 1 |0 |! 0 |1 |Operator AND |Uttrykk |Resultat |0 && 0 |0 |0 && 1 |0 |1 && 0 |0 |1 && 1 |1 |Operator OR |Uttrykk |Resultat |0 || 0 |0 |0 || 1 |1 |1 || 0 |1 |1 || 1 |1 25 Logiske operatorer og presedans Legg merke til at man må bruke doble && og || i logiske betingelsesuttrykk. (1 == 0) || (1 > 2) (0/FEIl) !(1 == 0) || (1 > 2) (1/SANN) 1 && (34 = | | == != | | && | | || | | Lavest presedens | 26 Betingede valg (‘if’ settning) Grunnformen er som følger: if (){ ;... } else{ ; } Reelt eksempel #include int main () { int a = 1; if (a == 1) { printf("a-variablen er 1\n"); } else{ printf("a-variablen er forskjellig fra 1\n"); } return 0; } 27 ‘if’ settning, hvis derimot I mange praktiske tilfeller kan det være flere alternative programveier. Flere «else’s.» #include int main () { int a = 1; if (a == 1){ printf("a er 1\n"); } else if (a == 2){ printf("a er 2\n); } else { printf("a er forskjellig fra 1 og 2\n"); } return 0; } 28 ‘switch/case’ – flerevalgssetningen If-else-if strukturer kan altså alltid benyttes der man ønsker flervalg. #include int main() { int mynt = 0; scanf("%i", &mynt); // les inn verdi til variabelen mynt switch (mynt) // test verdien av mynt { case 1: // hvis mynt == 1 printf("Du valgte 1!"); break; case 2: // hvis mynt == 2 printf("Du valgte 2"); break; case 3: // hvis mynt == 3 printf("Du valgte 3"); break; default: // hvis mynt ikke er 1,2 eller 3 printf("Du valgte ikke 1,2 eller 3"); break; } } Løkker 30 Litt info I C har vi 3 forskjellige løkketyper, med hver sine særegenheter: for, while og do-while Bruken av disse 3 løkketypene er noe overlappende, da alle løkkene kan benyttes for å simulere andre løkketyper også. Kun tiden og bruken av disse løkker vil vise deg hvilken du kommer til å bruke. For å bestemme hvor mange ganger eller hvor lenge en løkke skal gjentas, er det tilhver løkketype knyttet en løkkebetingelse Løkkebetingelsen vil beregnes i starten eller slutten av løkken alt etter løkketype. Løkkebetingelsen har samme for som og tilsvarende betydning som testbetingelsen i if-setninger 31 ‘for’-løkken – mest fleksible Grunnformen er som følger: for (initialisering ; løkkebetingelse ; C-utrykk som utføres) { ; ;... ; } Reelt eksempel #include int main () { int a; for( a = 0; a < 10; a = a + 1 ){ printf("verdi av a er: %d\n", a); } return 0; } 32 ‘while’-løkken – forenkelt ‘for’ Grunnformen er som følger: while () { ; ;... ; } Reelt eksempel #include int main () { int a = 10; while( a < 20 ) { printf("verdi av a er: %d\n", a); a++; } return 0; } 33 ‘do-while’-løkken Grunnformen er som følger: do { ; ;... ; } while (); Reelt eksempel #include int main () { int a = 15; do { printf("verdi av a er: %d\n", a); a = a + 1; } while( a < 20 ); return 0; } 34 Løkke i løkke (nested loops) Grunnformen er som følger: for (initialisering ; løkkebetingelse ; C-utrykk som utføres) { for (initialisering ; løkkebetingelse ; C-utrykk som utføres) { ;... } } Reelt eksempel #include int main () { int i, j; for(i = 0; i < 10; i++) { for(j = 0; j < 10 j++) printf("i:%d og j:%d ", i,j); } return 0; } Tabeller / Arrays 36 Litt info I programmeringsverdenen benytter man seg oftest med uttrykket Arrays. På norsk kan man enten si tabell,vektor eller matrise. Man kan ha fra en til fleredimensjonelle tabeller/arrays i C. Tidligere har vi sett hvordan man definere variable som kan lagre info om ulike ting: navn, alder, høyde m.m. Og med forskjellige datatyper. Med Arrays kan vi lagre infomasjon i en tabell. Det forenkler situasjoen en del, når man jobber mye med en ting. Array størrelse = 5 index 0 1 2 3 4 37 Deklasjon av arrays Tabeller må deklareres slik som alle andre variable, f.eks. Antall elementer må være en konstantverdi - ikke en variabel. int personnummer; // Tabell med 10 int-variable float vekt; // Deklarasjon av tabell med 235 float-variable Tabellindeksen kan være en variabel eller en konstantverdi. For å gi en verdi må man gjøre dette: personnummer = 13456; // Element 3 i tabellen gis verdi vekt[x] = vekt + 2.5; // Element x og element 200 benyttes Tabellen personnummer ovenfor har altså indekser fra 0 til 9. Tabellen vekt ovenfor har indekser fra 0 til 234. 38 intialisering av arrays Tabeller kan som enkle variable gis initialverdier allerede når de deklareres, f.eks. int personnummer = {5712, 2334, 35634, 453, 5656, 52, 2374, 245, 23423, 345}; 10 elementer i personnr er initialisert. Første element i lista tilsvarer indeks 0,neste indeks 1 osv. float vekt = {36.12, 45.00, 123.90, 555.555, 0,3454}; Det er lite praktisk å initialisere 235 elementer på denne måten med ‘vekt’. char tekst[] = {'a', 'b', 'c', 'd', 'e'}; La C-kompilatoren får ansvaret for å finne ut selv hvor mange tabellelementer det er behov for, fx. 39 Ett-dimensjonelt eksempel Her er ett eksempel av en ett-dimensjonel array som deklareres, intialiseres og utskrives: #include int main () { int n[ 10 ]; int i,j; for ( i = 0; i < 10; i++ ) { n[ i ] = i; } for (j = 0; j < 10; j++ ) { printf("Element[%d] = %d\n", j, n[j] ); } return 0; } 40 Multi/fler-dimensjonel eksempel Her er ett eksempel av en to-dimensjonel array som deklareres, intialiseres og utskrives: #include int main () { int a = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { printf("a[%d][%d] = %d\n", i,j, a[i][j] ); } } return 0; } Funksjoner 42 Litt info En funksjon kan betraktes som et lite miniprogram eller som en matematisk funksjon f(x). Den første lærte funksjon som vi kjenner til er main() funksjonen. Vi har allerede sett på bruk av noen andre standardfunksjoner: printf(), scanf(). Å lage sine egne funksjoner kalles å definere funksjoner En funksjon kan inneholde lokale variable og argumenter. Og man kan også benytte seg av globale variablene i en funksjon. Funksjoner som kaller seg selv - rekursive funksjoner – kan være svert effektivt noen gange. Funksjoner bryter opp store kompliserte programmer til overskuelig moduler. Lett å bruke 43 Funksjoneksempel. En funksjon har følgende oppsett: retur-datatype funksjonsnavn ( argumentliste-hvis-aktuelt ) {...lokale variabeldeklarasjoner etc.......C-setninger... return returverdi; } En funksjon kan også enkelt utføre en oppgave uten at å returnere noen verdi: void funksjonsnavn ( argumentliste-hvis-aktuelt ) {...lokale variabeldeklarasjoner etc.......C-setninger... return; } 44 Funksjoneksempel. Det er alminnelig praksis å plassere funksjonsdefinisjonene under main() i C-programmet. #include void printGjennomsnitt(int x, int y, int z); // funksjons prototype int main() { int a, b, c; // lokal i main printf("Skriv 3 integers etterfulgt av spaces: "); scanf("%d %d %d", &a, &b, &c); printGjennomsnitt(a, b, c); // funksjonskall return 0; // avslutte main function } void printGjennomsnitt(int x, int y, int z) // Definition av funksjon { float gjsnitt = (float) (x + y + z) / 3; printf("Gjennomsnittet av %d, %d og %d er %f\n", x , y, z, gjsnitt); } Strukturer 46 Litt info Språket C tilbyr muligheten for å samle datasett av forskjellige typer. Denne samling kalles en struktur (struct) Nyttig hjelpemiddel for å systematisere datasett. Anta f. eks. at visse egenskaper ved en person skal beskrives med et sett av prametre: Personens høyde , vekt, alder, fødselsdato og kjønn Vi kan konstruere en ny datatype der alle disse parametrene inngår. La oss kalle datatypen person. 47 Struktur eksempel #include #include struct Person { char navn int alder; int hoyde; }; int main( ) { struct Person p1; struct Person p2; strcpy( p1.navn, "Mohammad Derawi"); p1.alder = 31; p1.hoyde = 172; strcpy( p2.navn, "Geir Arne Bunde"); p2.alder = 43; p2.hoyde = 184; printf( "Person 1 Navn : %s\n", p1.navn); printf( "Person 1 Alder : %d\n", p1.alder); printf( "Person 1 Høyde : %d\n", p1.hoyde); printf( "Person 2 Navn : %s\n", p2.navn); printf( "Person 2 Alder : %d\n", p2.alder); printf( "Person 2 Høyde : %d\n", p2.hoyde); return 0; } Lesing og skriving av filer 49 Litt info Til nå har vi studert hvordan data kan leses fra tastaturet til skjermen. Likeledes kan man skrive data til en fil som tillegg eller alternativ tilskjermutskrift. Da kan man studere filen i en fileditor eller lignende. Fra et C-program kan man opprette filer, skrive filer, lese filer og slette filer (hmmm..). Et C-program oppfatter en fil som en såkalt STREAM. Streams går ut på bruken av en modell der en oppfatter data på en fil som en kontinuerlig strøm av tegn som kan deles opp som man ønsker i programmet ditt. 50 Fil funksjoner Her er en liste på bruken av følgende funksjoner fra standard IO-biblioteket. fopen(): åpne en fil fclose(): lukke en fil fscanf(): lese formatert fra en stream fprintf(): skrive formatert til en stream getc(): lese et tegn fra en stream putc(): skrive et tegn til en stream 51 Skrive til en fil Eksempel på hvordan man skriver til en fil #include main() { FILE *fp; fp = fopen("test.txt", "w+"); fprintf(fp, "Dette er en tekst som jeg ønsker overført til min fil...\n"); fclose(fp); } Når koden ovenfor har kjørt vil den lage en fil (text.txt) med teksten «Dette er en...» 52 Lese fra en fil Eksempel på hvordan man leser fra en fil. #include int main() { FILE *fp; char buff; fp = fopen("test.txt", "r"); fgets(buff, 255, (FILE*)fp); printf("%s\n", buff ); fclose(fp); return 0; } Koden ovenfor vil lese settningen som vi skrev tidligere Pekere / Pointers 54 Litt info Vanlige variable har sin bestemte adresse i datamaskinens hukommelse. Normaltsett er vi ikke interessert i å vite denne adressen. Kompilatoren holder styr på den. I visse tilfelle ønsker vi å hente ut adressen til en variabel. En peker er dataobjekt som angir en adresse til hukommelsen. En peker kan angi adressen til en variabel eller et annet dataobjekt. Pekere kan også lagres i spesielle pekervariable Benytt pekere når du ønsker at en funksjon skal forandre verdien til argumentene 55 Peker eksempel Vanlige variable har sin bestemte adresse i datamaskinens hukommelse. #include int main () { int var = 20; int *ip; ip = &var; printf("Addressen til var variable er: %x\n", &var ); printf("Addressen som er lagret i ip variablen er: %x\n", ip ); printf("Verdi av *ip variablen: %d\n", *ip ); return 0; }