Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
Anders Sjögren Det första programmet källkoden 1A_PGM.C (en textfil) #include int main ( void ) { printf("Hello world!\n"); return 0; } Windowsprogram 1A_PGM_W.EXE DOS-promptDOS direkt 1A_PGM.EXE Om man kompilerar denna textfil ( hur man gör kommer senare ) så får man en maskinkodsfil, EXE-fil, som kan exekveras. källkod - editera! kompilera! ”EXE”-fil! plattform!
Anders Sjögren Ett program växer fram... int main ( void ) { return 0; } stommen till alla C-program!
Anders Sjögren Ett program växer fram... /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } stommen till alla C-program!
Anders Sjögren Ett program växer fram... /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } i stommen anger man med hjälp av satser vad som ska utföras i tur och ordning - sekvens satsav- slutare
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } här skapas, definieras, 2 st variabler (minnen) av typen float (float är ett reserverat ord ) flyttal
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } funktionen printf() används för att skriva textsträngen,mellan parenteserna, på bild- skärmen
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } funktionen printf() används för att skriva textsträngen,mellaan parenteserna, på bild- skärmen för att kunna an- vända funktionen printf() så måste filen stdio.h inklu- deras (en textfil).
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } funktionen scanf() används för att läsa ASCII- tecken från tangentbordet och konvertera dessa till ett flyttal som lagras i variabel startKapita l.
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } funktionen scanf() används för att läsa ASCII- tecken från tangentbordet och konvertera dessa till ett flyttal som lagras i variabel startKapita l. även för scanf() måste stdio.h inkluderas
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } satsen är ett tilldelnings- uttryck. Variabeln saldo tilldelas värdet av högerledet där innehållet i variabel startKapital multipliceras med 1,085.
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } satsen är ett tilldelnings- uttryck. Variabeln saldo tilldelas värdet av högerledet där innehållet i variabel startKapital multipliceras med 1,085. OBS! Tilldelning ej som i matematiken VL=HL, i C går x=x+1 bra!
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } satsen är ett tilldelnings- uttryck. Variabeln saldo tilldelas värdet av högerledet där innehållet i variabel startKapital multipliceras med 1,085. RANTESATS är en symbolisk konstant, textsub- stitut för 8.5. Texten RANTESATS byts mot texten 8.5 vid kompilering av preprocessorn..
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } printf() som tidigare, \n är ett styrtecken som betyder ny rad.
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } printf()konverterar variabelinnehåll och värden till relevanta ASCII- tecken som skrivs på skärmen.
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } konvertera innehållet i variabeln saldo från flyttalsrepresentation till relevanta ASCII- tecken i ett fält med 11 positioner och avrundat till 2 decimaler
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } när programmet avslutas returneras heltalsvärdet ( int ) 0 till operativsystemet. Detta värde kan användas för att kontrollera på vilket sätt programmet av- slutats.
Anders Sjögren Ett program växer fram... vad satserna gör /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } raden är en kommentar och påverkar inte programmets funktion.
Anders Sjögren Ett program växer fram... förbättringar /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("\n År Saldo\n == =====\n"); printf("%3d%11.2f\n", 1, saldo); return 0; } byt plats på raderna!
Anders Sjögren Ett program växer fram... förbättringar /* Beräknar kapitaltillväxt */ #include #define RANTESATS 8.5 int main ( void ) { floatstartKapital, saldo ; printf("Insatt kapital? "); scanf("%f", &startKapital); printf("\n År Saldo\n == =====\n"); saldo = startKapital * ( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", 1, saldo); return 0; } OK!
Anders Sjögren Ett program växer fram... förbättringar - program med repetition /* Beräknar kapitaltillväxt på 10 år */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatstartKapital, saldo, kapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { kapital = kapital * ( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar, kapital); } return 0; } lite förändringar och några nya rader ger - iteration !
Anders Sjögren Ett program växer fram... förbättringar - program med repetition /* Beräknar kapitaltillväxt på 10 år */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { kapital = kapital * ( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar, kapital); } return 0; } startvärde terminering uppräkning
Anders Sjögren Ett program växer fram... förbättringar - program med alternativa vägar /* Beräknar kapitaltillväxt på 10 år */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { kapital = kapital * ( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar, kapital); } return 0; } observera hur man med indragningar, indenteringar, försöker göra koden lättare att läsa
Anders Sjögren Mata in ett negativt kapital så räknas det baklänges! Ett program växer fram... förbättringar - program med alternativa vägar /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } lite förändringar och några nya rader ger - selektion ! sant falskt
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } många satser efter varandra gör programmet oöverskådligt - dela upp koden i funktioner
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler Funktionskonstruktionen som följer vill visa principer inte detaljer, det kommer senare.
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return 0; } Klipp ut!
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); return 0; } OK!
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= ANTAL_AR ; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } Definiera den nya funktionen! klistra in
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } Definiera den nya funktionen! lägg till! ändra!
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar ; printf("Insatt kapital? "); scanf("%f", &kapital); TabellPaSkarmen( ANTAL_AR, kapital ); return 0; } lägg till funktions- deklaration och funktions- anrop här skall funktions- definitionen in i stommen, main() - funktionen
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler här skall funktions- definitionen in /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 #define ANTAL_AR 10 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intar, antalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } ändra
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler en översikts- bild av hela programmet /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }
Anders Sjögren Ett program växer fram... förbättringar - program med funktions-moduler en översiktsbild av hela programmet /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; } stommen funktionen
Anders Sjögren Ett C-program byggs upp av satser i sekvens styrande satser –iteration –selektion funktioner /* Beräknar kapitaltillväxt på 10 år framåt eller bakåt */ #include #define RANTESATS 8.5 void TabellPaSkarmen( int, float ); int main ( void ) { floatkapital ; intantalAr; printf("Insatt kapital och antal år ?(--> )--> "); scanf("%f%d", &kapital, &antalAr); TabellPaSkarmen( antalAr, kapital ); return 0; } void TabellPaSkarmen( int antalAr, float kapital ) { int ar ; printf("\n År Saldo\n == =====\n"); for ( ar = 1; ar <= antalAr; ar++ ) { if ( kapital > 0 ) kapital = kapital * ( 1 + RANTESATS/100 ); else kapital = kapital * 1/( 1 + RANTESATS/100 ); printf("%3d%11.2f\n", ar,kapital>0 ? kapital:-kapital); } return; }
Anders Sjögren Slut Övningsuppgift, se anteckningar