background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 
Biblioteka "stdlib.h" – wybrane funkcje 

 

void exit( int status ); 

- przerywa działanie programu opró

Ŝnia wszystkie bufory i zwraca kod do 

systemu operacyjnego – status 

int atoi( const char *string ); 

- konwertuje ła

ńcuch na liczbę całkowitą typu int 

long atol( const char *string ); 

- konwertuje ła

ńcuch na liczbę całkowitą typu long int 

float atof( const char *string ); 

- konwertuje ła

ńcuch na liczbę zmiennoprzecinkową typu float 

char *itoa( int value, char *string, int radix ); 

- konwertuje liczb

ę całkowitą typu int na łańcuch znaków 

 

 

value  - liczba konwertowan 

 

 

string - wska

źnik na łańcuch (max długość 33 znaki) 

 

 

radix  - podstawa systemu przeliczania 

char *fcvt( float value, int count, int *dec, int *sign ); 

konwertuje liczb

ę zmiennoprzecinkową typu float na łańcuch znaków 

zwracaj

ąc wskaźnik na statycznie zaalokowany bufor, kolejne wywołanie funkcji 

niszczy poprzednio otrzymany rezultat 

 

 

value 

- liczba konwertowan

ą 

 

 

count 

- liczba cyfr po przecinku 

 

 

dec 

- wska

źnik gdzie zwracana jest pozycja kropki względem 

  

 

pocz

ątku łańcucha 

 

  sign 

- wska

źnik gdzie zwracana jest pozycja znaku względem 

   

pocz

ątku łańcucha 

int toupper( int c ); 

- przekształca liter

ę w jej duŜy odpowiednik 

int tolower( int c ); 

- przekształca liter

ę w jej mały odpowiednik 

int abs( int n ); 

- warto

ść bezwzględna 

long labs( long n ); 

- warto

ść bezwzględna dla liczb long int 

int rand( void ); 

- generuje warto

ść losową z przedziału (0,RAND_MAX) 

void srand( unsigned int seed ); 

- inicjalizuje generator liczb losowych warto

ścią seed 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

Biblioteka "stdlib.h" – wybrane funkcje, c.d. 

 

void *malloc( size_t size ); 

- alokuje pami

ęć o rozmiarze size bajtów i zwraca wskaźnik na początek 

zaalokowanego obszaru 

void *calloc( size_t num, size_t size ); 

alokuje pami

ęć na num elementów o rozmiarze size bajtów i zwraca wskaźnik 

na pocz

ątek zaalokowanego obszaru. Zeruje zaalokowany obszar pamięci 

void free( void *memblock ); 

- zwalnia zaalokowany obszar pami

ęci 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

Biblioteka "string.h" – wybrane funkcje 

 

int sprintf( char *buffer, const char *format [, argument] ... ); 

- działa analogicznie do printf zapisuj

ąc sformatowany łańcuch do łańcucha 

buffer. Zwraca warto

ść zawiera liczbę zapisanych znaków 

char *strcat( char *strDestination, const char *strSource ); 

- dodaje ła

ńcuch strSource do strDestination. Zwracana wartość: wskaźnik do 

ła

ńcucha do którego dołączany jest tekst 

char *strncat( char *strDest, const char *strSource, size_t count ); 

- analogicznie jak strcat lecz kopiuje nie wi

ęcej niŜ count znaków 

char *strchr( const char *string, int c ); 

- wyszukuje pierwsze wyst

ąpienie znaku c w łańcuchu string . Zwracana 

warto

ść: wskaźnik na  znaleziony znak bądź NULL jeśli nie znaleziony 

char *strrchr( const char *string, int c ); 

- analogicznie jak strstr lecz od ko

ńca 

int strcmp( const char *string1, const char *string2 ); 

 

- porównanie dwóch ła

ńcuchów. Zwracane wartośći: 

 

< 0 - string1 mniejszy ni

Ŝ string2 

 

= 0  - string1 i string2 identyczne 

 

> 0  - string1 wi

ększy niŜ string2 

int strncmp( const char *string1, const char *string2, size_t count ); 

- analogicznie jak strcmp lecz nie wi

ęcej niŜ count znaków 

char *strcpy( char *strDestination, const char *strSource ); 

- kopijuje ła

ńcuch strDestination do strSource usuwając poprzednią wrtość 

strDestination. Zwracana warto

ść: wskaźnik do łańcucha do którego kopiowany 

jest tekst 

char *strncpy( char *strDest, const char *strSource, size_t count ); 

- analogicznie jak strcpy lecznie wi

ęcej jak count znaków 

size_t strlen( const char *string ); 

 

- zwraca długo

ść łańcucha string 

char *strlwr( char *string ); 

- przekształca wszystkie du

Ŝe litery łańcucha string na małe 

char *_strupr( char *string ); 

- przekształca wszystkie małe litery ła

ńcucha string na duŜe 

char *strpbrk( const char *string, const char *strCharSet ); 

- wyszukuje pierwszego wyst

ąpienia jednego ze znaków  z łańcucha strCharSet 

w ła

ńcuchu string 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

Biblioteka "math.h" – wybrane funkcje 

 

float acos( float x ); 

oblicza arccos(x) 

float asin( float x ); 

oblicza arcsin(x) 

float atan( float x ); 

- oblicza arctg(x) 

float atan2( float x , float y ); 

- oblicza arctg(x/y) 

float ceil( float x ); 

oblicza najmniejsz

ą liczbę całkowitą większą lub równą x 

float floor( float x ); 

oblicza najwi

ększą liczbę całkowitą mniejszą lub równą x 

float cos( float x ); 

oblicza cos(x) 

float cosh( float x ); 

oblicza hiperboliczny cos(x) 

float exp( float x ); 

- oblicza e

float fabs( float x ); 

- oblicza warto

śc bezwględną 

float log( float x ); 

- oblicza logarytm naturalny ln(x) 

float log10( float x ); 

- oblicza logarytm dziesi

ętny log(x) 

float pow( float x, float y ); 

- oblicza x

float sin( float x ); 

oblicza sin(x) 

float sinh( float x ); 

oblicza hiperboliczny sin(x) 

float sqrt( float x ); 

- oblicza pierwiatek kwadratowy z x 

float tan( float x ); 

oblicza tg(x) 

float tanh( float x ); 

oblicza hiperboliczny tg(x) 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

Biblioteka "stdio.h" – wybrane funkcje 

 

char *gets( char *buffer ); 

- wczytuje linie z urz

ądzenia wejściowego 

int printf( const char *format [, argument]... ); 

- drukuje sformatowany tekst na urz

ądzeniu wyjściowym 

int putchar( int c ); 

- wysyła znak na urz

ądzenie wyjściowe 

int puts( const char *string ); 

- wysyła ła

ńcuch string  na urządzenie wyjściowe 

int scanf( const char *format [,argument]... ); 

- wczytuje sformatowany tekst z urz

ądzenia wejściowego 

FILE *fopen( const char *filename, const char *mode ); 

- otwiera plik o nazwie filename w trybie wyszczególnionym w mode. Warto

ść 

zwracana: wska

źnik na otwarty plik lub NULL gdy nie udało się otworzyc pliku. 

Domy

ślnie plik otwierany w trybie tekstowym. 

 

mode – ła

ńcuch opisujący tryb otwarcia pliku: 

"r" 

- plik otwierany do odczytu. Je

śli plik istnieje funkcja zwraca błąd 

"w" 

- pusty plik otwierany to zapisu. Je

śli plik istnieje jego zawartość 

jest kasowana 

"a" 

- plik otwierany w trybie "doł

ączania". Jeśli plik istnieje znacznik 

pliku ustawiany na ko

ńcu, w przeciwnym razie plik jest tworzony i 

znacznik ustawiany na pocz

ątku 

"r+"  - plik otwierany w trybie odczytu i zapisu. Plik musi istnie

ć 

"w+"  - pusty plik otwierany w trybie odczytu i zapisu. Je

śli plik istnieje 

jego zawarto

ść jest kasowana 

"a+"  - plik otwierany w trybie "doł

ączania" i czytania. Jeśli plik istnieje 

znacznik pliku ustawiany na ko

ńcu, w przeciwnym razie plik jest 

tworzony i znacznik ustawiany na pocz

ątku 

"t" 

- plik otwierany w trybie tekstowym 

"b" 

- plik otwierany w trybie binarnym 

int fclose( FILE *stream ); 

- zamyka plik. stream : wska

źnik na plik. Wartość zwracana: 0 – gdy zamknięcie 

si

ę powidło, EOF w przeciwnym wypadku 

int feof( FILE *stream ); 

- sprawdza czy znacznik znajduje si

ę na końcu pliku. Wart. zwr. 1 – tak, 0 – nie 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

Biblioteka "stdio.h" – wybrane funkcje, c.d. 

 

int fseek( FILE *stream, long offset, int origin ); 

- przenosi znacznik pliku w okre

ślone miejsce. Wart. zwr.: 0 – gdy się powiodło, 

<>0 – w przeciwnym razie. Znacznik przesuwany jest do pozycji origin 
wzgl

ędem pozycji offset, która moŜe przyjmować wartości: 

 

SEEK_CUR – obecna pozycja znacznika pliku 

 

SEEK_END – koniec pliku 

 

SEEK_SET – pocz

ątek pliku 

 
long
 ftell( FILE *stream ); 

- zwraca obecn

ą pozycję znacznika pliku 

char *fgets( char *string, int n, FILE *stream ); 

- czyta jedn

ą linię pliku (do napotkania znaku końca lini -\n), lub wczytania n-1 

znaków. Wart. zwr.: wska

Ŝnik na łańcuch lub NULL w przypadku błędu 

int fputs( const char *string, FILE *stream ); 

- zapisuje ła

ńcuch do pliku. Wart. zwr. EOF gdy błąd 

int fgetc( FILE *stream ); 

- czyta jeden znak z pliku. Wart. zwr.: kod znaku lub EOF gdy osi

ągnięto koniec 

pliku  

int fputc( int c, FILE *stream ); 

- zapisuje znak do pliku. Wart. zwr. EOF gdy bł

ąd 

int fprintf( FILE *stream, const char *format [, argument ]...); 

- zapisuje do pliku sformatowany tekst. Wart. zwr.: ilo

ść znaków zapisanych do 

pliku lub warto

ść<0 gsy błąd 

int fscanf( FILE *stream, const char *format [, argument ]... ); 

- wczytuje sformatowany tekst z pliku. Wart. zwr.: ilo

ść przeczytanych pól, 0 – 

gdy 

Ŝadne pole nie zostało przeczytane, EOF gdy błąd lub koniec pliku 

int fflush( FILE *stream ); 

- opró

Ŝnia bufory pliku. Wart. zwr.: 0 – operacja powidła się, EOF – błąd 

size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); 

- czyta z pliku niesformatowane dane do bufora buffer. Ilo

ść danych: count o 

rozmiarze size. Wart. zwr.: ilo

ść przeczytanych elementów 

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 

- zapisuje do pliku niesformatowane dane z bufora buffer. Ilo

ść danych: count o 

rozmiarze size. Wart. zwr.: ilo

ść zapisanych elementów 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

Przykład 1.

 Przeliczanie 

°

C na 

°

F, wersja 1 

#include <stdio.h> 

 

main() 

 

int lower, upper, step; 

 

float fahr, celsius; 

 

lower=0; 

 

upper=300; 

 

step=20; 

 

fahr=lower; 

 

while(fahr<=upper) 

 

 

 

celsius=(5.0/9.0)*(fahr-32.0); 

 

 

printf("%4.0f %6.1f\n", fahr, celsius); 

 

 

 

fahr+=step; 

 

 

 

Przykład 2.

 Przeliczanie 

°

C na 

°

F, wersja 2 

#include <stdio.h> 

 

main() 

 

int fahr; 

 

for(fahr=0;fahr<=300;fahr+=20) 

 

 

printf("%4d %6.1f\n", fahr, (5.0/9.0)*(fahr-32.0)); 

 

 

Przykład 3.

 Zliczanie liczby znaków wprowadzonych z 

klawiatury, wersja 1 

#include <stdio.h> 

 

main() 

 

long nc; 

 

 

nc=0; 

 

while(getchar()!=EOF) 

 

 

++nc; 

 

printf("%ld\n",nc); 

 

Przykład 4.

 Zliczanie liczby znaków wprowadzonych z 

klawiatury, wersja 2 

#include <stdio.h> 

 

main() 

 

double nc; 

 

 

for (nc=0;getchar()!=EOF;nc++) 

 

 

 

printf("%.0f\n",nc); 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

Przykład 5.

 Zliczanie liczby wierszy 

#include <stdio.h> 

main() 

 

int c,nl; 

 

nl=0; 

 

while((c=getchar())!=EOF) 

 

 

if (c=='\n') 

 

 

 

++nl; 

 

printf("%d\n",nl); 

 

 

 

 

Przykład 6.

 Zliczanie liczby znaków, słów i linii 

#include <stdio.h> 

 

#define YES  1 

#define NO  0 

 

main() 

 

int c,nl,nw,nc,inword; 

 

 

inword=NO; 

 

nl=nw=nc=0; 

 

while((c=getchar())!=EOF) 

 

 

 

nc++; 

 

 

if (c=='\n') 

 

 

 

nl++; 

 

 

if (c==' ' || c=='\n' || c=='\t') 

 

 

 

inword=NO; 

 

 

else 

 

 

 

if (inword==NO) 

 

 

 

 

 

 

 

inword=YES; 

 

 

 

 

nw++; 

 

 

 

 

 

printf("%d %d %d\n",nl,nw,nc); 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

 

 

Przykład 7.

 Zliczanie liczby wystąpień białych znaków, cyfr i 

pozostałych 

#include <stdio.h> 

 

main() 

 

int c,i,nwhite,nother; 

 

int ndigit[10]; 

 

 

nwhite=nother=0; 

 

 

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

 

 

ndigit[i]=0; 

 

while((c=getchar())!=EOF) 

 

 

if(c>='0' && c<='9') 

 

 

 

ndigit[c-'0']++; 

 

 

else 

 

 

 

if(c==' ' || c=='\n' || c=='\t') 

 

 

 

 

nwhite++; 

 

 

 

else 

 

 

 

 

nother++; 

 

 

printf("Cyfry="); 

 

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

 

 

printf(" %d",ndigit[i]); 

 

printf("\nBiale znaki = %d, inne = %d\n",nwhite,nother); 

 

 

 

Przykład 8.

 Zliczanie liczby znaków w pliku tekstowym 

#include <stdio.h> 

 

main() 

 

FILE *PlikWe; 

 

long nc; 

 

 

nc=0; 

 

if ((PlikWe=fopen("test.txt","rt"))!=NULL) 

 

 

 

while(fgetc(PlikWe)!=EOF) 

 

 

 

++nc; 

 

 

fclose(PlikWe); 

 

 

printf("%ld\n",nc); 

 

 

else 

 

 

printf("Nie mozna otworzyc pliku\n"); 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

10 

Przykład 9. 

#include <stdio.h> 

 

main() 

 

FILE *PlikWe; 

 

int c,nl; 

 

nl=0; 

 

if ((PlikWe=fopen("test.txt","rt"))!=NULL) 

 

 

 

while((c=fgetc(PlikWe))!=EOF) 

 

 

 

if (c=='\n') 

 

 

 

 

++nl; 

 

 

fclose(PlikWe); 

 

 

printf("%d\n",nl); 

 

 

else 

 

 

printf("Nie mozna otworzyc pliku\n"); 

 

 

Przykład 10. 

#include <stdio.h> 

 

enum InWordType 

 

YES, 

 

NO 

}; 

 

main() 

 

FILE *PlikWe; 

 

int c,nl,nw,nc; 

 

enum InWordType inword; 

 

inword=NO; 

 

nl=nw=nc=0; 

 

 

if ((PlikWe=fopen("test.txt","rt"))!=NULL) 

 

 

 

while((c=fgetc(PlikWe))!=EOF) 

 

 

 

 

 

nc++; 

 

 

 

if (c=='\n') 

 

 

 

 

nl++; 

 

 

 

if (c==' ' || c=='\n' || c=='\t') 

 

 

 

 

inword=NO; 

 

 

 

else 

 

 

 

 

if (inword==NO) 

 

 

 

 

 

 

 

 

 

inword=YES; 

 

 

 

 

 

nw++; 

 

 

 

 

 

 

 

 

printf("%d %d %d\n",nl,nw,nc); 

 

 

fclose(PlikWe); 

 

 

else 

 

 

printf("Nie mozna otworzyc pliku\n"); 

 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

11 

 

Przykład 11. 

Metoda sortowania przez wstawianie proste 

 

Algorytm 
Nale

Ŝy wykonać następujące kroki aby posortować tablicę,  

 

1. Ustaw i na 0 

 

2. Ustaw j na (i + 1) 

 

3. Je

Ŝ

eli a[i] > a[j], zami

ę

n ich warto

ś

ci 

 

4. Ustaw j na (j + 1). Je

ś

li j < n id

ź

 do kroku 3 

 

5. Ustaw i na (i + 1). Je

Ŝ

eli i < (n – 1) Id

ź

 do kroku 2 

 

6. tablica a jest posortowana w kolejno

ś

ci rosn

ą

cej.

 

 

Uwaga : jest tablic

ą zawierającą liczby do posortowania, n zawiera ilość elementów do posortowania. 

 

#include <stdio.h> 

 

void sort(int a[], int elements ) 

 

int i, j, temp; 

 

 

 

i = 0; 

 

while( i < (elements - 1) ) 

 

 

 

j = i + 1; 

 

 

while( j < elements ) 

 

 

 

 

 

if( a[i] > a[j] ) 

 

 

 

 

 

 

 

temp = a[i]; 

 

 

 

 

a[i] = a[j]; 

 

 

 

 

a[j] = temp; 

 

 

 

 

 

 

j++; 

 

 

 

 

i++; 

 

 

main() 

 

int loop; 

 

int numbers[] = { 10, 9, 8, 23, 19, 11, 2, 7, 1, 13, 12 }; 

 

 

 

printf("Before the sort the array was \n"); 

 

for( loop = 0; loop < 11; loop++ ) 

 

 

printf(" %d ", numbers[loop] ); 

 

 

 

sort( numbers, 11 ); 

 

printf("\nAfter the sort the array was \n"); 

 

for( loop = 0; loop < 11; loop++ ) 

 

 

printf(" %d ", numbers[loop] ); 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

12 

Przykład 12.

 Zliczenia liczby wystąpień bitu ‘1’ w zmiennej 

‘unsigned char’ 

#include <stdio.h> 

#include <stdlib.h> 

 

unsigned char bitcount(unsigned char); 

 

main() 

{  unsigned char i8,count; 

   int i; 

   printf("Wprowadz liczbe (0 - 255 dziesietnie)\n"); 

   scanf("%d",&i);    

   if (( i < 0 ) || (i > 255)) 

   { 

 

   printf("Blad: Liczbs poza przezialem = %d\n", i); 

       exit(1); 

   }   

   i8 = (unsigned char) i; 

   count = bitcount(i8);    

   printf("\n\nIlosc bitow ustawionych na '1' w %d = %d\n",i,count); 

   } 

 

unsigned char bitcount(unsigned char x) 

 

unsigned char count; 

 

for (count = 0; x!=0; x>>=1) 

 

 

if ( x & 01 ) 

 

 

 

++count;        

 

return count; 

 

 

 

 

Przykład 13. 

Rekurencyjne obliczanie silni 

#include <stdio.h> 

 

fact(int n) 

    if (n == 0) 

        return(1); 

    return(n * fact(n-1)); 

 

main() 

 

int n, m; 

 

printf("Wprowadz liczbe: "); 

 

scanf("%d", &n); 

 

m = fact(n); 

 

printf("Silnia z %d wynosi %d.\n", n, m); 

 

 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

13 

Przykład 14. 

Określanie czasu obliczeń 

#include <stdio.h> 

#include <math.h> 

#include <time.h> 

 

main() 

 

long i; 

 

time_t t1,t2; 

 

 

(void)time(&t1); 

   

 

for (i=1;i<=1000;++i) 

 

 

printf("%5ld %+15.13f %+15.13f %+20.18f\n",i,  

 

 

 

sin(i/100.),  

 

 

 

cos(i/100.), 

 

 

 

sqrt(sin(i/200.)*sin(i/200.)+cos(i/200.)*cos(i/200.))); 

    

 

(void)time(&t2); 

    

 

printf("\nCzas potrzebny do obliczenie = %d sekund\n", (int)t2-t1); 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

14 

Całkowanie numeryczne 

 

x

0

x

N

x

+ 1

x

1

x

2

h

 

 

 

Metoda trapezów: 

( )

( )

f

h

O

f

f

h

dx

x

f

x

x

′′

+

+

=

3

2

1

2

1

2

1

2

1

 

Metoda Simpsona: 

( )

(

)

)

4

(

5

3

2

1

3

1

3

4

3

1

3

1

f

h

O

f

f

f

h

dx

x

f

x

x

+

+

+

=

 

Metoda Simpsona 3/8: 

( )

(

)

)

4

(

5

4

3

2

1

8

3

8

9

8

9

8

3

4

1

f

h

O

f

f

f

f

h

dx

x

f

x

x

+

+

+

+

=

 

 
 
 

Przykład 15.

 

 

#define FUNC(x) ((*func)(x)) 

 

double trapzd(double (*func)(double), double a, double b, int n) 

 

double x,tnm,sum,del; 

 

static double s; 

 

int it,j; 

 

if (n == 1) 

 

 

 

return (s=0.5*(b-a)*(FUNC(a)+FUNC(b))); 

 

 

else 

 

 

 

for (it=1,j=1;j<n-1;j++) it <<= 1; 

 

 

tnm=it; 

 

 

del=(b-a)/tnm; 

 

 

x=a+0.5*del; 

 

 

for (sum=0.0,j=1;j<=it;j++,x+=del) sum += FUNC(x); 

 

 

s=0.5*(s+(b-a)*sum/tnm); 

 

 

return s; 

 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

15 

 

Przykład 16. 

Całkowanie metodą trapezów i Simpsona 

 

 

 

#define EPS 1.0e-6 

#define JMAX 20 

double qtrap(double (*func)(double), double a, double b) 

 

int j; 

 

double s,olds; 

 

olds = -1.0e30; 

 

for (j=1;j<=JMAX;j++) 

 

 

 

s=trapzd(func,a,b,j); 

 

 

if (fabs(s-olds) < EPS*fabs(olds)) return s; 

 

 

if (s == 0.0 && olds == 0.0 && j > 6)return s; 

 

 

olds=s; 

 

 

return 0.0; 

 

 

 

float qsimp(float (*func)(float), float a, float b) 

 

int j; 

 

float s,st,ost,os; 

 

ost = os = -1.0e30; 

 

for (j=1;j<=JMAX;j++) 

 

 

 

st=trapzd(func,a,b,j); 

 

 

s=(4.0*st-ost)/3.0; 

 

 

if (fabs(s-os) < EPS*fabs(os)) return s; 

 

 

if (s == 0.0 && os == 0.0 && j > 6) return s; 

 

 

os=s; 

 

 

ost=st; 

 

 

return 0.0; 

 

 

 

int main() 

 

double res1,res2; 

 

res1=qtrap(sin,0,1); 

 

res2=qsimp(sin,0,1); 

 

printf("%f, %f\n",res1,res2); 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

16 

Generatory liczb pseudoloswych o rozkładzie równomioernym 

 

I

j+1

 = a I

j

 + c 

 
Standardowe funkcje: 

 

#include <stdlib.h> 

 

void srand(unsigned seed); 

int rand(void); 

 

 

Aby otrzyma

ć

 liczb

ę

 z przedziału [0,1]: 

 

x = rand()/(RAND_MAX+1.0); 

 
 

Przykład prostego generatora liczb pseudolosowych: 

unsigned long next=1; 

 

int rand(void) 

 

next = next*1103515245 + 12345; 

 

return (unsigned int)(next/65536) % 32768; 

 

void srand(unsigned int seed) 

 

next=seed; 

 

Generator Park’a and Miller’a (okres 2

31

-2

 

 

2.1

×

10

9

):

 

#define IA 16807 

#define IM 2147483647 

#define AM (1.0/IM) 

#define IQ 127773 

#define IR 2836 

#define MASK 123459876 

 

float ran0(long *idum) 

 

long k; 

 

float ans; 

 

*idum ^= MASK; 

 

idum. k=(*idum)/IQ; 

 

*idum=IA*(*idum-k*IQ)-IR*k; 

 

if (*idum < 0) *idum += IM; 

 

ans=AM*(*idum); 

 

*idum ^= MASK; 

 

return ans; 

 

Bardzo szybki, trywialny generator: 

 

idum = 1664525L*idum + 1013904223L; 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

17 

Sortowanie 

 

Metoda sortowania przez wstawianie proste 
 
Sortowanie tablicy w miejscu: 

 

void piksrt(int n, float arr[]) 

 

int i,j; 

 

float a; 

 

for (j=2;j<=n;j++) 

 

 

 

a=arr[j]; 

 

 

i=j-1; 

 

 

while (i > 0 && arr[i] > a) 

 

 

 

 

 

arr[i+1]=arr[i]; 

 

 

 

i--; 

 

 

 

 

arr[i+1]=a; 

 

}

 

 

 

Sortowanie tablicy w miejscu wraz z tablic

ą

 z ni

ą

 sprz

ęŜ

on

ą

:

 

 

void piksr2(int n, float arr[], float brr[]) 

 

int i,j; 

 

float a,b; 

 

for (j=2;j<=n;j++) 

 

 

 

a=arr[j]; 

 

 

b=brr[j]; 

 

 

i=j-1; 

 

 

while (i > 0 && arr[i] > a) 

 

 

 

 

 

arr[i+1]=arr[i]; 

 

 

 

brr[i+1]=brr[i]; 

 

 

 

i--; 

 

 

 

 

arr[i+1]=a; 

 

 

brr[i+1]=b; 

 

 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

18 

 

 

Metoda sortowania Shell

 

 

 

void shell(unsigned long n, float a[]) 

 

unsigned long i,j,inc; 

 

float v; 

 

inc=1; 

 

do 

 

 

 

inc *= 3; 

 

 

inc++; 

 

} while (inc <= n); 

 

do 

 

 

 

inc /= 3; 

 

 

for (i=inc+1;i<=n;i++) 

 

 

 

 

 

v=a[i]; 

 

 

 

j=i; 

 

 

 

while (a[j-inc] > v) 

 

 

 

 

 

 

 

a[j]=a[j-inc]; 

 

 

 

 

j -= inc; 

 

 

 

 

if (j <= inc) break; 

 

 

 

 

 

 

a[j]=v; 

 

 

 

} while (inc > 1); 

 

 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

19 

Obliczanie miejsc zerowych 

 

Metoda bisekcji: 
 

#include <math.h> 

#define JMAX 40 //Maximum allowed number of bisections. 

 

float rtbis(float (*func)(float), float x1, float x2, float xacc) 

 

int j; 

 

float dx,f,fmid,xmid,rtb; 

 

f=(*func)(x1); 

 

fmid=(*func)(x2); 

 

if (f*fmid >= 0.0) 

 

 

 

printf("Błąd"); 

 

 

return 0.0; 

 

 

rtb = f < 0.0 ? (dx=x2-x1,x1) : (dx=x1-x2,x2); 

 

for (j=1;j<=JMAX;j++)\ 

 

 

 

fmid=(*func)(xmid=rtb+(dx *= 0.5)); 

 

 

if (fmid <= 0.0) rtb=xmid; 

 

 

if (fabs(dx) < xacc || fmid == 0.0) return rtb; 

 

 

printf("Błąd"); 

 

return 0.0; 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

20 

Metoda siecznych 

 

(x)

2

3

4

1

x

 

 

 

 

#include <math.h> 

#define MAXIT 30 

 

float rtsec(float (*func)(float), float x1, float x2, float xacc) 

 

void nrerror(char error_text[]); 

 

int j; 

 

float fl,f,dx,swap,xl,rts; 

 

fl=(*func)(x1); 

 

f=(*func)(x2); 

 

if (fabs(fl) < fabs(f)) 

 

 

 

xl=x2; 

 

 

swap=fl; 

 

 

fl=f; 

 

 

f=swap; 

 

 

 

else 

 

 

 

xl=x1; 

 

 

rts=x2; 

 

 

for (j=1;j<=MAXIT;j++) 

 

 

 

dx=(xl-rts)*f/(f-fl); 

 

 

xl=rts; 

 

 

fl=f; 

 

 

rts += dx; 

 

 

f=(*func)(rts); 

 

 

if (fabs(dx) < xacc || f == 0.0) return rts; 

 

 

printf("Błąd"); 

 

return 0.0; 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

21 

Metoda stycznych (Newtona-Raphsona) 

 

1

2

3

x

f(x)

 

 

 
 
 

#include <math.h> 

#define JMAX 20 

float rtnewt(void (*funcd)(float, float *, float *), float x1, float 

x2,float xacc) 

 

int j; 

 

float df,dx,f,rtn; 

 

rtn=0.5*(x1+x2); 

 

for (j=1;j<=JMAX;j++) 

 

 

 

(*funcd)(rtn,&f,&df); 

 

 

dx=f/df; 

 

 

rtn -= dx; 

 

 

if ((x1-rtn)*(rtn-x2) < 0.0) 

 

 

 

 

 

printf("Błąd"); 

 

 

 

return 0.0; 

 

 

 

 

if (fabs(dx) < xacc) return rtn; 

 

 

printf("Błąd"); 

 

return 0.0; 

 

background image

U

N I W E R S Y T E T  

Ł

Ó D Z K I

 

K

ATEDRA 

I

NFORMATY

KI 

 

 

22 

Obliczanie kodu Gray’a 

 

0000 

0001 

0011 

0010 

0110 

0111 

0101 

0100 

1100 

1101 

10 

1111 

11 

1110 

12 

1010 

13 

1011 

14 

1001 

15 

1000 

 

 

 

 

// For zero or positive values of 

i

s, return the Gray code of n; 

// i

f is 

is negative, return the inverse 

unsigned long igray(unsigned long n, int is) 

 

int ish; 

 

unsigned long ans,idiv; 

 

if (is >= 0) 

 

 

return n ^ (n >> 1); 

 

ish=1; 

 

ans=n; 

 

for (;;) 

 

 

 

ans ^= (idiv=ans >> ish); 

 

 

if (idiv <= 1 || ish == 16) return ans; 

 

 

ish <<= 1; 

 

 

4

3

2

1

0

MSB

LSB

i

4

3

2

1

0

G()

XOR

XOR

XOR

XOR

4

3

2

1

0

MSB

LSB

G()

4

3

2

1

0

i

XOR

XOR

XOR

XOR