1. Lektion

I denne lektion fås en introduktion til C og noget om input/output.

Emnerne behandles i lærebogen på siderne 1 til 46

Jeg gennemgår ikke slavisk, det der står i jeres bog, den forventer jeg, at I selv læser. Jeg kommer med supplerende oplysninger og "rettelser" til bogen.

I mange C-bøger sammenligner man ofte C med Pascal og somme tider med Basic. Dette skyldes at Pascal og Basic er kendt af mange programmører, da det er to populære højniveausprog

C er i sin grundudgave et mindre sprog end f.eks. Pascal. Når jeg siger Pascal og ikke Delphi, er det fordi Pascal, er det "nøgne" programmeringssprog, hvor Delphi er Pascal overlejret med en grafiske programmeringsflade. Når jeg siger C, er det også det "nøgne" sprog, grafisk programmering hedder enten C++ Builder (Borland) eller Visual C++ (MicroSoft).

Fordelen ved Pascal er, at koden indbyder til en kraftig strukturering. Ulempen er, at koden ofte bliver meget omfangsrig.

Fordelen ved C er, at koden kan skrives meget kompakt. Ulempen er, at koden, når den komprimeres, bliver næsten ulæselig for andre end den, der har konstrueret den.

Uanset hvilket sprog man konstruerer i, så er det maskinen ender med at få grundlæggende det samme, nemlig noget maskinkode. Maskinkode er det eneste maskinen forstår.

Bemærk, at jeg skriver at programmer konstrueres, man skriver ikke programmer, de konstrueres. Når de er konstrueret, skriver man koden ind i maskinens hukommelse med en editor, koden oversættes derpå til maskinkode.

Forskellen fra det ene C-program til det andet er effektiviteten af koden. Effektiviteten afhænger af, hvor god programmøren er til at konstruere sit program. Det gælder om, at maskinen flytter mindst muligt rundt på variablerne i hukommelsen, altså hvor god programmøren er til at udnytte maskinens processor.

En anden fordel ved C er, at det direkte er skrevet i et forsøg på at gøre koden uafhængig af operativsystemet og derfor er koden tættere på maskinkodeinstruktionerne end nogen af de andre højniveausprog.

I samme øjeblik, vi bevæger os over i C++, bliver programkoden mere afhængig af operativsystemet.

Når man konstruerer et program, begynder man ikke ved Adam og Eva hver gang. Man benytter sig af, at der er andre, der har arbejdet med C før. Disse programmører har konstrueret nogle instruktioner, andre kan benytte sig af. Disse instruktioner ligger i funktionsbiblioteker. Disse biblioteker hedder enten .h eller .lib. Når man skal konstruere et stykke kildekode, skal man #include'r nogle biblioteksfiler. Biblioteksfilerne bliver ikke fuldstændig includeret i et program. Der includeres kun de funktioner og procedurer man har anvendt.

Compilering og Linking


#include <stdio.h>
// findes i TC\INCLUDE - mappen

#include "filnavn.h" // eller .c" findes i projektmappen

C.LIB // findes i TC\LIB - mappen

Hvis der skal anvendes andre LIB - filer, skal der bygges et projekt op, hvor man selv tilføjer LIB - filerne.

Når man kører et program og skærmen blot blinker, er det fordi programmet ikke stopper med afviklingskonsollen fremme. For at se afviklingen skal man selv stoppe programmet, enten med en scanf() eller en getch() kommando.

Taster man [F9] bliver programmet Compileret og Linket, dvs. man får programmet kørt igennem og exe-filen bliver oprettet.

Hvis man også vil have programmet startet, efter det er compileret og linket, skal man anvende [CTRL]-[F9]. Disse genvejstaster gælder for Borland-C, det kan være anderledes for andre compilere.

C-compilere er CASE-sensitive. Dvs. de kan se forskel på store og små bogstaver. Husk derfor, at alle reserverede ord skal skrives med småt. Når man selv definerer sine variabler mv., skal man altid fortsætte med den CASE, man er begyndt med.

{ . . . . } - parenteser svarer til BEGIN og END i Pascal.

Semikolon (;) afslutter (Terminerer) et statement (sætning).

Det første compileren læser er altid funktionen/proceduren med navnet main(). Sådan en skal der derfor altid være i et C-program.

void main(void) // er en Procedure

int main (void) // er en Funktion

I en af de følgende lektioner vendes der tilbage til Procedure- og Funktions-begreberne.

Nyttige funktioner er:

clrscr(); renser skærmen #include <conio.h>

a = getch; a = getche; fanger et tegn fra tastaturet #include <conio.h>

a = getchar; fanger et tegn fra tastaturet (UNIX) #include <conio.h>, hvis kommandoen anvendes i Borland-C, skal der tastes [Return].

printf( . . . ); Udskriver en formateret tekst #include <stdio.h>

scanf( . . . ); Opfanger en formateret streng #include <stdio.h>

printf("%8.1f %8.1f %8.1f", 3.0, 12.5, 523.3);

Formateringer til printf() og scanf()
%       giver signal til at formatere
8        antallet af tegn i feltet
.2       antallet af cifre til højre for decimalpunktet
f         indikation af formatets type, i dette tilfælde floating point
Formateringstyper
%c    Single character
%s    Streng
%d    Signed decimal integer
%f     Decimaltal
%e    Decimaltal med exponential notation
%u    Unsigned decimal integer
%x    Unsigned hexadecimaltal
%o    Unsigned octal integer
%l     Prefix til LongInt, f.eks. %ld osv.

Lad os se på et lille eksempel:

Eksempel 1
#include <stdio.h>

#include <conio.h>


void main(void)
{
    int speed = 75;
    char a;
    printf("\nEr hastigheden lig med 55 %d", speed == 55);
    speed = 55;
    printf("\nEr hastigheden lig med 55 %d", speed == 55);
    a = getch();
}
Allerede her har jeg indført en måde at komprimere kode på, som ikke ses i andre sprog. Jeg anvender en logisk operator i en udskrift.

Logiske operatorer
      <       >         <=            >=       ==     !=
Mindre end, større end, mindre end og lig med, større end og lig med, lig med og forskellig fra.

Alle de logiske udtryk afleverer værdien 0 eller 1, svarende til falsk eller sandt.

Indtast ovenstående program og kør det for at se, hvad der sker.

Når man konstruerer programmer, er det nyttigt at kunne skrive bemærkninger (Comments) ind i koden, således at det bliver lettere at finde ud af, hvad koden handler om næste gang, man vender tilbage til programmet.

Comments

// Dette er en bemærkning

/* Dette er en
bemærkning som går
over flere linier */

Eksempel 2
#include <stdio.h>

void main(void)
{
    int loeb;   // Erklæring af variabler
    char heat;
    float tid;

    loeb = 5;   // Variablerne giver start-værdier
    heat = 'C';
    tid = 54.32;

    printf("\nVindertiden i heat %c", heat);
    printf(" i løb nr %d var %f.", loeb,tid);
    a = getch();  // Sætningen stopper programgennemløbet og venter
                 // på, at der trykkes på en vilkårlig tast.
}

På figuren her ses, hvorledes formateringen til printf() er opbygget. 

Man kan ved hjælp af Comments oprette særlige afsnit i sit program, hvor man forklarer, hvad programmet udfører og hvor man kan lave en versionshistorie.

Eksempel 3
/* ======================================= *\
 * File : TalUd.c                          *
 * Påbegyndt : 30.12.01 Henning Karlby     *
 * Færdig :                                *
 * Ændret :                                *
 * Indhold: Eksempel på formatering af tal *
\* ======================================= */

/* ---- INCLUDES ------- */
#include <stdio.h>
#include <conio.h>

void main(void)
{
    char a;
    printf("\n");
    printf("%.1f %.1f %.1f\n", 3.0, 12.5, 523.3);
    printf("%.2f %.3f %.4f\n", 300.0, 1200.5, 5230.3);
    a=getch();
}
Ovenstående er et eksempel på anvendelse af Comments til oprettelse af et hoved i programmerne, således at man kan se hvad programmet handler om og hvilken udgave man har med at gøre.

I eksemplerne er der anvendt '\n', dette giver en ny linie. '\n' kaldes for en "escape - sequens". Der er mange nyttige escape-funktioner i C. Her følger en liste med nogle:
\n        giver en ny linie
\t         giver en tabulering
\b        flytter et tegn baglæns
\r         giver et [Return] uden linieskifte
\f         giver en ny side (formfeed)
\'         giver et anførselstegn
\"         giver "gåseøjne"
\\         giver en \ (backslash)
\xdd    giver det tegn, som er repræsenteret ved det hexadecimaletal dd.
\ddd    giver samme som ovenfor, men nu skal dd være den oktale værdi

Øvelse 1
Konstruer et program, hvor det skal indtastes, hvor gammel man er i år, hvorefter programmet omregner alderen til dage og udskriver dette på skærmen.

Øvelse 2
Tilføj linier til eksempel 2, således at I kan indtaste resultatet fra et løb og et heat, dvs. I skal både indtaste løbsnr., heatnr. og vindertid. Hvorefter resultatet skal udskrives på en linie for sig selv.

Eksempler og løsningerne kan hentes her
Eksempel 1
Eksempel 2
Eksempel 3
Øvelse 1
Øvelse 2