Datatyper


Heltalstyper

Vanliga storlekar och talområden

long int 4 -231 till 231-1
short int 2 -215 till 215-1
unsigned long int 4 0 till 232-1
unsigned short int 2 0 till 216-1
signed char 1 -128 till 127
unsigned char 1 0 till 255

Typen int är normalt liktydigt med long eller short int (implementationsberoende)

Typen char är vanligen liktydigt med unsigned char


Heltalskonstanter

decimal form

3, 8, -255

oktal form

003, 010, -0377

Flyttalskonstanter

Skrivs med decimalpunkt och/eller exponent

   -1.5, .26, 100., 0.57721566

   1e10, 0.5e2, 1e-10

Teckentypen char

Typen char är en heltalstyp och teckenkonstanter är ett sätt att skriva små heltal (dvs av typen char!)

Man kan således "räkna" direkt med tecken:




char toUpper(char c) {
  /* Om c är en gemen så 
     returneras motsvarande VERSAL */
  if ( c>='a' && c <='z' )
     return c + 'A' - 'a';
  else
     return c;
}


Biblioteket ctype.h

Detta bibliotek innehåller representationsoberoende funktioner för att klassificera tecken:

#include <stdio.h>

int isalpha(int c);
int isdigit(int c);
int isalnum(int c);
int isspace(int c);
int isupper(int c);
int islower(int c);
int isprint(int c);
int iscntrl(int c);
int tolower(int c);
int toupper(int c);


Dessa funktioner kunde, med fördel, använts i flera av de ovanstående exemplen.

Ex: Skriv ut en ascii-tabell




int main() {
  char c;
  for ( c = ' '; c<127; c++ )
     printf( "%d \t %c \n", c, c );
  return 0;
}


(Blanktecknet är det första tryckbara tecknet och ~ (126) det sista)

Specialtecken

\a alert pip, pling eller motsvarande
\b backspace Markören ett steg åt vänster
\f form feed Markören till nästa sida
\n newline Radbytestecken
\r carriage return Skriver ett "vagnretur"
\t tabulator Horisontell tabulator
\v verikal tab Vertikal tabulator
\\ backslash
\' single quote apostrof
\" double quote citationstecken
\0 null ascii-värdet 0
\ddd octal number ddd är tre oktala siffror

Alla variabler måste typdeklareras

Exempel:



   int i, j, k;
   float x, y;
   char c;
   short int p, q;
   unsigned short int r;
   unsigned char ch;

   int start = 0, stop = 10;
   char c=getchar();

Aritmetiska operatorer
+, -, *, / alla aritmetiska typer
% (modulo) endast heltalstyper

Relationsoperatorer
>, >=, <, <=
==, !=

Logiska operatorer
&& and
|| or
! not


Tilldelningsoperatorer
=
+=
-=
*=
/=

Ökning och minskningsoperatorer
++ både pre- och postfix form
-- både pre- och postfix form

Bitoperatorer

&, |, << m.fl. (se bok)

Typkonverteringar


In- och utmatning

Funktionen printf för formaterad utmatning


   printf( formatsträng, värde, värde, ... )

Några formatspecifikationer:
%d Heltalsvärde
%c Teckenvärde
%f Flyttalsvärde
%s Teckensträng
%o Oktalt värde
%x Hexadecimalt värde

Specifikationerna förses med attribut för att specificera, fältbredd, antal decimaler, justering mm.


Funktionen scanf för formaterad inläsning.

Exempel:




int main() {

   float x;
   int n;

   printf("Ge x och n: ");
   scanf("%f %d", &x, &n );
   printf( "%f upphöjt till %d är %f", 
           x, n, power(x,n) );
   return 0;
}


Kontrollstrukturer

Villkorssats


      if ( uttryck )
          sats 


      if ( uttryck )
          sats 
      else
          sats 

sats kan vara en godtycklig sats, t ex en ny villkorssats eller en sammansatt sats.

Switch


 switch ( uttryck ) {
	 
    case konstantuttryck : satser       
 
    case konstantuttryck : satser       

    case konstantuttryck : satser       

    default: satser

 }

Obs: break måste användas för att lämna strukturen!

Iterationssatser




  while ( uttryck ) 
        sats 



  for ( uttr1; uttr2; uttr3 )
        sats 


  do
        sats 
  while ( uttryck )       



Funktioner




   typ namn( parameterlista ) {

      variabeldeklarationer 

      satser 
   }
 
Funktionen lämnas genom return-satsen

   return värde


Några fakta om funktioner


Exempel



  int fak(int n) {
    int i, prod=1;
    for ( i=1; i<=n; i++ )
      prod *= i;
    return prod;
  }


Arrayer

Deklareras med


  typ  arraynamn[storlek]


Exempel:



/* Läs 100 positiva flyttal och skriv ut
   dem normerade */

int main() {
  int i;
  float x[100], max=0;

  for ( i=0; i<=99; i++ ) {
      scanf( "%f", &x[i] );
      if ( x[i] > max )
         max = x[i];
  }

  for ( i=0; i<=99; i++ )
      printf( "%f", x[i]/max );
  return 0;
}

Teckensträngar


Exempel på strängfunktioner



int strlen( char s[] ) {
    int n=0;
    while ( s[n] != '\0' )  
       n++;
    return n;
}

(Den typiske C-hackaren skriver funktionen mer kompakt)

Biblioteket string.h

Ett bibliotek med funktioner för hantering av strängar. Några av dessa är:

int   strlen (char s[]);
void  strcpy (char s1[], char s2[]);
void  strncpy(char s1[], char s2[], int n);
void  strcat (char s1[], char s2[]);
void  strncat(char s1[], char s2[], int n);
int   strcmp (char s1[], char s2[]);

(Lite förenkling av parametertyper och returvärden...)