[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania - kurs w sem. zimowym 2010/2011

Wykład II: 12 października 2010

Program w C to zapis algorytmu. Upraszczanie problemu polega na dekompozycji programu na wiele funkcji. Funkcje operują na danych. Dane są reprezentowane w programie przez zmienne. Zmienna opisuje pewien fragment pamięci i określa sposób interpretacji zawartości tej pamięci. Zmienne nalezy jawnie deklarować - C to język statycznej kontroli typów, co oznaca, że kompilator musi wiedzieć, jakigo typu jest każda używana zmienna.

Pierwszy przykład - program wypisujący na standardowe wyjście argumenty, z którymi został wywołany:

   1 #include <stdio.h> /* dzieki temu kompilator sprawdzi,
   2                       czy poprawnie wywołujemy funkcję printf */
   3 
   4 int
   5 main( int argc, char * argv[] )  /* f. main musi zwracać int
   6                                     argc to liczba argumentów
   7                                     tablica argv zawiera argumenty jako napisy 
   8                                     Uwaga: pierwszy argument (argv[0])
   9                                     to nazwa programu, który został wyołany */
  10 {
  11     int i;
  12 
  13     printf( "dostałem %d argumentow\n", argc );
  14     for( i=0; i < argc; i++ ) {
  15         printf( "argument nr %d to \"%s\"\n", i, argv[i] );
  16     }
  17 
  18     return 0;
  19 }

Kompilujemy i uruchamiamy:

jstar@jstar-lap:~/jimp$ vi a1.c
jstar@jstar-lap:~/jimp$ cc -Wall a1.c
jstar@jstar-lap:~/jimp$ ./a.out 1 2 ala ma kota 1234
dostałem 7 argumentow
argument nr 0 to "./a.out"
argument nr 1 to "1"
argument nr 2 to "2"
argument nr 3 to "ala"
argument nr 4 to "ma"
argument nr 5 to "kota"
argument nr 6 to "1234"
jstar@jstar-lap:~/jimp$ 

Znaki to małe liczby całkowite. Napisy, to tblice znaków - powinny być zakończone specjalnym znakiem '\0', oznaczającym koniec napisu.

Drugi przykład - program demonstrujący niektóre operacje na napisach i znakach.

   1 #include <stdio.h>
   2 
   3 void
   4 znakpoznaku( char t[] ) /* wypisuje napis z tablicy t 
   5                            jako oddzielne znaki */
   6 {
   7     int i= 0;
   8     while( t[i] != 0 ) {
   9         printf( "'%c' ", t[i] ); /* proszę zmienić %c na %d oraz na %x */
  10         i++;
  11     }
  12 }
  13 
  14 int
  15 dlug( char n[] ) /* oblicza długość napisu n (liczbę znaków) */
  16 {
  17    int i= 0;
  18    for( ; n[i] != '\0'; i++ )
  19         ;                     /* samotny ; podkreśla, że ciało
  20                                  pętli for jest puste - wszystko
  21                                  zrobiliśmy w części sterującej */
  22 
  23    return i;
  24 }
  25 
  26 int
  27 main( int argc, char * argv[] )
  28 {
  29         char t[10];
  30     t[0]= 'A';
  31     t[1]= 'l';
  32     t[2]= 'a';
  33     t[3]= '\0';
  34 
  35         printf( "Mój napis to \"%s\", on ma %d znaki.\n", t, dlug(t) );
  36         znakpoznaku( t );
  37     printf( "\n" );
  38 
  39     t[0]++;
  40 
  41     printf( "Mój napis to \"%s\", on ma %d znaki.\n", t, dlug(t) );
  42     znakpoznaku( t );
  43     printf( "\n" );
  44 
  45     return 0;
  46 }

Kompilujemy i uruchamiamy:

jstar@jstar-lap:~/jimp$ vi a2.c 
jstar@jstar-lap:~/jimp$ cc -Wall a2.c
jstar@jstar-lap:~/jimp$ ./a.out 
Mój napis to "Ala", on ma 3 znaki.
'A' 'l' 'a' 
Mój napis to "Bla", on ma 3 znaki.
'B' 'l' 'a' 
jstar@jstar-lap:~/jimp$

Zmieniamy %c na %d (por. komentarz w f. znakpoznaku):

jstar@jstar-lap:~/jimp$ vi a2.c 
jstar@jstar-lap:~/jimp$ cc -Wall a2.c
jstar@jstar-lap:~/jimp$ ./a.out 
Mój napis to "Ala", on ma 3 znaki.
'65' '108' '97' 
Mój napis to "Bla", on ma 3 znaki.
'66' '108' '97' 
jstar@jstar-lap:~/jimp$ 

Trzeci przykład to program oczekujący argumentów będących liczbami. Zamienia napisy na liczby, pakuje je kolejno do wektora, a następni oblicza sumę elementów wektor przy pomocy funkcji znanej z pierwszego wykładu, ale nieco inaczej zapisanej.

   1 #include <stdio.h>  /* dla printf */
   2 #include <stdlib.h> /* dla atof */
   3 
   4 double sum( double v[], int n )
   5 {
   6         double s= v[0];
   7 
   8         /* wydruk pozwalający pokazać,
   9            że funkcja modyfikuje lokalną kopię agumentu 
  10         printf( "\nn= %d\n", n );
  11         */
  12         while( --n )
  13                 s+= v[n];
  14 
  15         /* wydruk pozwalający pokazać,
  16            że funkcja modyfikuje lokalną kopię agumentu 
  17         printf( "\nn= %d\n", n );
  18         */
  19 
  20         return s;
  21 }
  22 
  23 void pwekt( double v[], int n ) /* Ładne wypisywanie wektora */
  24 {
  25         int i;
  26         printf( "[" );
  27         for( i= 0; i < n; i++ )
  28                 printf( " %g", v[i] );
  29         printf( " ]" );
  30 }
  31 
  32 int main( int argc, char * argv[] )
  33 {
  34     double r[100];
  35     int i;
  36 
  37     int l= argc-1; /* liczba el. wektora */
  38 
  39     for( i= 1; i < argc; i++ )   /* zaczynamy od drugiego el. argv */
  40         r[i-1]= atof( argv[i] ); /* atof: ASCII to Float */ 
  41 
  42     pwekt( r, argc-1 );  /* można tak, ale lepiej l zmiast argc-1 */
  43 
  44     printf( ", suma elementów = %g\n", sum( r, l ) ); 
  45 
  46     printf( "wektor ma %d elementów\n", l ); /* zwróćmy uwagę, że funkcja sum
  47                                                 nie "popsuła" zmiennej j */
  48 
  49     return 0;
  50 }

Sprawdzamy, jak działa:

jstar@jstar-lap:~/jimp$ cc -Wall sa.c
jstar@jstar-lap:~/jimp$ ./a.out 1 2 3 4.4 5.5 6.6
[ 1 2 3 4.4 5.5 6.6 ], suma elementów = 22.5
wektor ma 6 elementów
jstar@jstar-lap:~/jimp$


Strona przedmiotu Języki i metodyka programowania I


2015-09-23 06:44