U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
1
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
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
2
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
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
3
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
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
4
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
x
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
y
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)
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
5
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 c 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
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
6
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
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
7
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);
}
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
8
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);
}
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
9
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");
}
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");
}
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 : a 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] );
}
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);
}
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);
}
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
N + 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;
}
}
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);
}
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;
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;
}
}
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);
}
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;
}
U
N I W E R S Y T E T
Ł
Ó D Z K I
K
ATEDRA
I
NFORMATY
KI
20
Metoda siecznych
f (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;
}
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;
}
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
0
0000
1
0001
2
0011
3
0010
4
0110
5
0111
6
0101
7
0100
8
1100
9
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(i )
XOR
XOR
XOR
XOR
4
3
2
1
0
MSB
LSB
G(i )
4
3
2
1
0
i
XOR
XOR
XOR
XOR