Z_Wykład_09.12.2007.doc

(74 KB) Pobierz

Na dzisiejszych zajęciach zajmiemy się omówieniem pozostałych bibliotek i funkcji dla nich przypisanych. Na pocztek - obsługa błędów. Wiele funkcji bibliotecznych ustawia znaczniki stanu dla strumieni po napotkaniu końca pliku lub gdy wystąpi błąd. Te znaczniki mogą być ustawiane i sprawdzane jawnie. Dodatkowo, wartością wyrażenia całkowitego errno (zadeklarowanego w bibliotece <errno.h>) może być numer błędu, który bliżej określa ostatnio napotkany błąd.Do obsługi błędów wykorzystać można funkcje:


- int ferror()
- void clearerr()
- void perror()
- int feof()

 

Zacznijmy od funkcji ferror(). Funkcja zwraca wartość różną od zera w przypadku, gdy jest ustawiony znacznik błędu dla strumienia stream. Deklarujemy ją w nastepujący sposób:

 

int ferror(FILE *stream)

 

Funkcja clearerr() z kolei kasuje znaczniki końca pliku i błędu dla strumienia stream. Zobaczmy w poniższym fragmencie kodu, jak się uzywa tych dwóch funkcji:

 

 

int main(void) {

FILE *stream;

stream = fopen("tes.txt", "w");

getc(stream); //wymuszenie bledu poprzez probe odczytu

if (ferror(stream)) {

printf("Blad\n");

clearerr(stream); } // kasowanie bledu strumienia

fclose(stream);

return 0;}

 

 

Kolejna ważna funkcja to funkcja perror(). Funkcja ta funkcja  wypisuje tekst z tablicy s i (zależny od implementacji) komunikat o błędzie odpowiadający wartości errno. Działanie funkcji można przedstawić jako:


fprintf(stderr, "%s: %s\n", s, "komunikat o bledzie");

 

Oto, jak się ją deklaruje:

 

void perror(const char *s)

 

I spójrzmy teraz na fragment programu z użyciem tej funkcji:

 

int main(void) {

FILE *fp;

fp = fopen(”dane.dan", "r");

if (!fp) perror(”dane.dan");

//dane.dan: No such file or directory

return 0;}

No i czwarta z tych funkcji to funkcja feof().Zwraca ona wartość różną od zera w przypadku, gdy jest ustawiony znacznik końca pliku dla strumienia stream. Deklaruje się ja nastepująco:

 

int feof(FILE *stream)

 

I przykład z użyciem tej funkcji:

 

 

#include <stdio.h>

int main(void) {

FILE *stream;

stream = fopen("dane.txt", "r");

fgetc(stream);

if (feof(stream)) printf("Koniec pliku\n");

fclose(stream);

return 0;}

 

 

Przejdźmy teraz do biblioteki <ctype.h>. Nagłówek <ctype.h> zawiera deklaracje funkcji służących do klasyfikowania znaków. We wszystkich funkcjach argument c jest typu int o wartości albo równej EOF, albo wyrażalnej jako unsigned char, a wynik jest typu int. Funkcje zwracają wartość różną od zera (TRUE), jeśli argument c spełnia podany warunek albo należy do wskazanej klasy znaków; w przeciwnym przypadku zwracają zero. W skład tej biblioteki wchodzą nastepujące funkcje operujące na znakach:

 

       isalnum(c)              Prawdą jest albo isalpha(c), albo isdigit(c).

       isalpha(c)              Prawdą jest albo isupper(c), albo islower(c).

       iscntrl(c)              Znak kontrolny.

       isdigit(c)              Cyfra dziesiętna.

       isgraph(c)              Znak drukowalny za wyjątkiem odstępu.

       islower(c)              Mała litera.

       isprint(c)              Znak drukowalny łącznie z odstępem.

       ispunct(c)              Znak drukowalny za wyjątkiem odstępu, liter                                                                      i cyfr.

       isspace(c)              Odstęp, nowa strona, nowy wiersz, powrót                                                          

                              karetki, tabulator, pionowy tabulator.

       isupper(c)              Wielka litera.

       isxdigit(c)              Cyfra szesnastkowa.

 

Zobaczmy na przykład uzycia jednej z tych funkcji:

 

 

#include <stdio.h>

#include <ctype.h>

int main(void) {

  char c = 'C';

  if (isdigit(c))

              printf("%c jest cyfra\n",c);

  else printf("%c nie jest cyfra \n",c);

  return 0;}

Prócz tych funkcji wyżej wymienionych istnnieją jeszcze dwie ciekawe funckje służące do zamiany wielkości liter. Te funckje to:

 

- int tolower(int c) - Zamienia c na małą literę.

- int toupper(int c) - Zamienia c na wielką literę.

 

I przykład użycia jednej z tych funkcji:

 

 

#include <string.h>

#include <stdio.h>

#include <ctype.h>

int main(void){  

int length, i;

char *string = ”oto tekst";

length = strlen(string);

for (i=0; i<length; i++)

{string[i] = toupper(string[i]);};

printf("%s\n",string);

return 0; }

 

 

Funkcje służące do operacji na tekstach znajdują się w bibliotece <string.h>. W nagłówku <string.h> są zdefiniowane dwie grupy funkcji operujących na tekstach. Do pierwszej grupy należą funkcje, których nazwy rozpoczynają się od str, do drugiej grupy - od mem. Z wyjątkiem funkcji memmove(), skutek kopiowania instancji, które częściowo się pokrywają, nie jest zdefiniowany. Argumenty funkcji porównujących są traktowane jak tablice zmiennych typu unsigned char. Oto ważniejsze z tych funkcji i ich deklaracje. Pierwszą jest funkcja strcpy. Kopiuje ona tekst z ct do s łącznie ze znakiem '\0'. Zwraca s.

 

char *strcpy(char *s, const char *ct)

 

Kolejna, czyli strncpy kopiuje co najwyżej n znaków tekstu z ct do s. Jeżeli ct ma mniej niż n znaków, dopełnia s znakami '\0'. Zwraca s.

 

char *strncpy(char *s, char *ct, int n)

 

Nastepna o nazwie strcat dopisuje znaki tekstu z ct na koniec tekstu w s. Zwraca s.

 

char *strcat(char *s, char *ct)

 

I kolejna o nazwie strncat. Ta funkcja dopisuje co najwyżej n znaków tekstu ct na koniec tekstu w s. Tekst w s kończy znakiem '\0'. Zwraca s.

 

char *strncat(char *s, char *ct, int n)

 

Poniżej znajduje się przykład, który pokazuje, jak została użyta jedna z tych funkcji, o której powiedzieliśmy powyżej:

 

 

#include <stdio.h>

#include <string.h>

int main(void) {

char string[10];

char *str1 = "abcdefghi";

strcpy(string, str1);

printf("%s\n", string);

return 0;}

 

 

Następną z tych funkcji jest funkcja strcmp. Porównuje ona teksty zawarte w cs i ct. Zwraca wartość < 0 dla cs < ct, wartość 0 dla cs == ct lub wartość > 0 dla cs > ct. Oto deklaracja:

 

funkcja int strcmp(char *cs, char *ct)

 

Kolejna – strncmp porównuje co najwyżej n znaków tekstów zawartych w cs i ct. Zwraca wartość < 0 dla cs < ct, wartość 0 dla cs == ct lub wartość > 0 dla cs > ct. Oto deklaracja:

 

int strncmp(char *cs, char *ct, int n)

 

I następna z tych funkcji to strchr. Zwraca ona wskaźnik do pierwszego wystąpienia znaku c w tekście cs lub NULL, jeśli ten znak nie występuje. Deklarujemy ją w następujący sposób:

 

char *strchr(char *cs, char *c)

 

No i nastepna o nazwie strrchr. Zwraca ona wskaźnik do ostatniego wystąpienia znaku c w tekście cs lub NULL, jeśli ten znak nie występuje. Dklarjemy ją w nastepujacy sposób:

 

char *strrchr(char *cs,int c)

 

Zobaczmy na przykład uzycia jednej z tych powyższych czterech funkcji:

 

 

#include <string.h>

#include <stdio.h>

int main(void) {

char *buf1 = "aaa", *buf2 = "bbb";

int ptr;

ptr = strcmp(buf2, buf1);

if (ptr > 0) printf("bufor 2 jest  wiekszy niz bufor 1\n");

else printf("bufor 2 jest  mniejszy niz bufor 1\n");

return 0;}

 

 

No i ostatnie dwie funkcje, to strstr i strtok. Ta pierwsza zwraca wskaźnik do pierwszego wystąpienia tekstu ct w tekście cs lub NULL, jeśli ct nie występuje w cs. Oto, jak się ja deklaruje:

 

char *strstr(char *cs, char *ct)

 

Ta druga wyszukuje w tekście s ciągi znaków przedzielone znakami z ct. Deklarujemy ja tak:

 

char *strtok(char *s, char *ct)

 

No i przykład uzycia jednej z tych dwóch funkcji:

 

 

#include <stdio.h>

#include <conio>

#include <string.h>

int main(void) {

char *str1 = "Hello World", *str2 = "orld", *ptr;

ptr = strstr(str1, str2);

printf("Podciag: %s\n", ptr); //”orld”

getch();

return 0;}

 

 

Kolejne ważne funkcje to funckje matematyczne. One zapisane są w bibliotece math.h. Nagłówek <math.h> zawiera deklaracje funkcji i makr matematycznych. Przy korzystaniu z tych funkcji należy zwracać uwage na mozliwość popełnienia dwóch rodzajów błędów. Pierwszy to błąd dziedziny. Występuje, gdy argument funkcji nie należy do dziedziny, dla której funkcja została zdefiniowana. I drugi to błąd zakresu, który występuje wówczas, gdy wartość funkcji nie może być wyrażona jako double. Jeśli wynik jest nadmiarowy, to funkcja zwraca HUGE_VAL z właściwym znakiem. Jeśli wynik jest nie domiarowy, to funkcja zwraca zero. Argumentami tych funkcji zmienne x i y typu double, a argument n jest typu int. Wszystkie funkcje zwracają wartość typu double. Wartości kątów dla funkcji trygonometrycznych wyraża się w radianach. Oto przykładowe funckje:

 

 

sin(x)                                            Sinus x.

cos(x)                                            Cosinus x.

tan(x)                                            Tangens x.

sinh(x)                                          Sinus hiperboliczny x.

cosh(x)                              Cosinus hiperboliczny x.

tanh(x)                                          Tangens hiperboliczny x.

exp(x)                                            Funkcja wykładnicza e^x.

log(x)                                             Logarytm naturalny z x > 0.

log10(x)                              Logarytm o podstawie 10 z x > 0.

pow(x,y)                              Różnica symetryczna x^y.

sqrt(x)                                            Pierwiastek z x.

ceil(x)                                            Wyciąga najmniejszą liczbę całkowitą, nie mniejszą niż                                                           x. Wynik jest typu double.

floor(x)                              Wyciąga największą liczbę całkowitą, nie większą niż x.       ...

Zgłoś jeśli naruszono regulamin