Programmering i ANSI-C/Villkorssatser

Från Wikibooks
Hoppa till navigering Hoppa till sök
Programmering i ANSI-C

Källkoden|Villkorssatser|Preprocessorn|Kompilatorn|Nyckelord|Standardströmmarna
Filhantering|Felhantering|Programexempel|Standardbibliotek|Tabeller


Villkorssatser[redigera]

Att Ställa villkor[redigera]

Det vanligaste sättet att ställa ett villkor i ANSI-C är med nyckelordet if, (om). Funktionen testar om ett uttryck är sant eller falskt med olika jämförelseoperatorer. Se teckenuppsättning för en lista på dessa operatorer. Men villkoret kan även vara värdet på en variabel eller ett returvärde från ett funktionsanrop. Ett uttryck är falskt om resultatet av jämförelsen, värdet på variabeln eller returbeloppet är lika med noll (0). Alla övriga värden betraktas som sanna uttryck.

En god regel är att alltid använda '{' och '}' tecken i alla villkorssatser. Det är visserligen inte nödvändigt, men om man lägger till en rad i t.ex if-satsen vid ett senare tillfälle så är allt på plats och man behöver inte lägga till dem senare. Det är också en risk, att man lägger till en rad och att den kommer att evalueras varje gång. T.ex:

y = 0; 
if (x) 
{
   y = 1;
   y += 7;
}

och

y = 0; 
if (x) 
   y = 1;
   y +=7;   /* Evalueras alltid oavsett om x är större än noll eller inte */

kommer i första fallet allt leda till att 'y' är 8 om 'x' är större än noll, annars noll. Men, i andra fallet kommer 'y' alltid att vara minst 7, och kanske även 8, om 'x' är större än noll.

Följande lilla programexempel kan användas för att testa om ett inmatat värde anses vara sant eller falskt:

/* Testa om ett värde är sant eller falskt */

#include <stdio.h>

int main( void )
{
    int x;

    printf ( "\nAnge ett värde ? " );
    scanf( "%i", &x );

    if ( x )
    {
        printf ( "Det är sant \n" );
    }
    else
    {
        printf ( "Det är falskt \n" );
    }

    return ( 0 );
}

Exempel[redigera]

/* "Gissa ett tal", ett exempel på användandet av villkorssatser */

01 #include <stdio.h>
01 #include <stdlib.h>
01 #include <time.h>

02 #define RND ( ( float ) rand ( ) / RAND_MAX )

03 int main( void )
04 {
05     int tal;
05     int gissning;
05     int antal = 0;

06     puts ( "Gissa ett tal mellan 0 och 100, (tryck [Retur] för att starta)" );
07     getchar ( );
08     srand( clock ( ) );
09     tal = RND * 100;

10     do
04     {
11         printf ( "\nVilket tal tror du att det är ? " );
           
12         scanf ( "%d", &gissning );
13         if ( gissning < 0 || gissning > 100 )
13         {         
06   	     puts ( "Ogiltigt värde! Försök igen." );
13         }
14         else
04         {
13             if ( gissning < tal ) 
13             {
06                 puts ( "Talet är för litet!" );
13             }
15             else if ( gissning > tal )
15             {
06                puts ( "Talet är för stort!" );
15             }
16             antal++;
04         }
17     } while ( gissning != tal );

11     printf ( "\nRätt gissat! Du klarade det på %i försök\n", antal );

16     return ( 0 );
04 }

O.B.S. radnumreringen tillhör inte den egentliga källkoden.

  • 01; Preprocessordirektiv som inkluderar ett av standardbiblioteken.
  • 02; Preprocessordirektiv som skapar ett makro. I det här fallet skapar makrot ett slumtal på flyttalsformat med ett värde mellan 0,0 och 1,0.
  • 03; Funktionshuvud för huvudfunktionen "main", (vilket också är den enda funktionen som deklareras i det här exemplet).
  • 04; Klammrarna "{...}" anger en programdel. En programdel innehåller flera kommandon och klamrarnas funktion är att avgränsa dessa.
  • 05; Skapar variabel. Först ett nyckelord som anger variabelns typ sedan variabelns namn och till sist, om det behövs, anges ett startvärde.
  • 06; Skriver ut en textsträng till bildskärmen, ("stdout").
  • 07; Matar in ett tecken från tangentbordet ("stdin") = invänta användarens respons.
  • 08; Initierar slumptalsgeneratorn. "clock" anger antalet ticks sedan programmet startades. Programmet inväntar användaren i den tidigare raden för att det skall bli olika serier varje gång.
  • 09; Skapar talet som skall gissas med hjälp av slumptalsgeneratorn och lagrar det i variabeln "tal".
  • 10; do anger starten på gissningsslingan som kommer att upprepas tills användaren gissat rätt tal, se även 17 nedan som är slutet på slingan där villkoret ställs.
  • 11; Skrivet ut en ledtext till bildskärmen, ("stdout").
  • 12; Matar in en textsträng från tangentbordet ("stdin") och omvandlar den till ett heltal som lagras i variabeln "gissning".
  • 13; Villkoret if kommer att utföra raden, (eller raderna), efter satsen, endast om villkoret inom parenteserna "(...)" är SANT annars inte. Här testas om "gissning" är ett otillåtet värde. Det dubbla stående strecket "||" anger 'eller' och tillåter på så sätt att två, eller flera, olika villkor anges. Uttrycket är alltså SANT om "gissning" < 0 eller om "gissning" > 100.
  • 14; Instruktionenra inom klamrarna "{...}" efter else-satsen kommer endast att utföras om uttrycket i den tidigare if-satsen inte är SANT.
  • 15; else if ställer ett nytt villkor om det i den tidigare if-satsen inte är SANT.
  • 16; Ökar variabeln som räknar antalet gissningar. ++ anger att den skall ökas med ett (1).
  • 17; while kommer att upprepa slingan som inleds med do på rad 10 så länge uttycket inom parentesen "(...)" är SANT. != betyder inte lika med och slingan kommer alltså upprepas så länge "gissning" inte är lika med "tal".