przykłady w języku ANSI C Dariusz Chaberski UMK Toruń
1 rekurencja funkcji int silnia(int arg){ if(arg==1) return 1; return arg*silnia(arg-1); int liczba; printf("podaj liczbe: "); scanf("%d", &liczba); printf("silnia z %d, wynosi: %d\n", liczba, silnia(liczba)); 2 rekurencja funkcji int silnia(int arg){ return arg==1?1:arg*silnia(arg-1); int liczba; printf("podaj liczbe: "); scanf("%d", &liczba); printf("silnia z %d, wynosi: %d\n", liczba, silnia(liczba)); 3 dynamiczny przydział pamięci 2
int *wskaznik; int i; wskaznik=(int*)malloc(sizeof *wskaznik*3); for(i=0; i<3; i++) scanf("%d", wskaznik+i); for(i=2; i>=0; i--) printf("%d\n", *(wskaznik+i)); 4 zmienne tablicowe int dane[3]; int i; for(i=0; i<3; i++) scanf("%d", &dane[i]); for(i=2; i>=0; i--) printf("%d\n", dane[i]); 5 dynamiczny przydział pamięci #define liczba 5 int *wskaznik; int i, sum; wskaznik=(int*)calloc(liczba, sizeof *wskaznik); for(i=0; i<liczba; i++) scanf("%d", &wskaznik[i]); 3
for(i=0, sum=0; i<liczba; i++) sum+=*(wskaznik+i); printf("suma: %d, srednia: %f", sum, (double)sum/(double)liczba); 6 jaka jest końcowa wartość zmiennej i i co zawiera pamięć wskazywana przez zmienną wskaznik? int *wskaznik; int i; wskaznik=(int*)calloc(10, sizeof *wskaznik); for(i=0; i<10; i++) *(wskaznik+i)=i; 7 jaka jest końcowa wartość zmiennej i? int funkcja(int a){ return ++a; int i; i=funkcja(2); 8 jaka jest końcowa wartość zmiennej i? int funkcja(int a){ return a++; 4
int i; i=funkcja(2); 9 jaka jest końcowa wartość zmiennych i i j? int i=5; int j=i; while(1){ j++; if(i==1) i=3, i--; i++; if(i==10){ i=1; continue; if(i==3) break; 10 jaka jest końcowa wartość zmiennych i i j? int funkcja(int a){ return a; int i=0, j; 5
j=funkcja(++i); i=funkcja(i--); 11 jaka jest końcowa zawartość tablicy table? int i=0; int j=0; int table[10]; for(;++i<10;) table[j]=i, j++; 12 jaka jest końcowa wartość zmiennej i #define polowa(a) a/2 int i=polowa(10+2); 13 jakie są końcowe wartości zmiennych i, j, x, y, z, u int i=10/3; int j=10%3; double x=(double)(int)((double)10/(double)3); double y=(double)10/(double)3; double z=(int)(10*(double)10/(double)3); double u=10*(int)((double)10/(double)3); 6
14 jaka jest końcowa wartość zmiennej i int i=10; do{ while(1); i++; i=20; 15 jaka jest końcowa wartość zmiennej i int i=10; do{ i++; break; while(1); i=i++; 16 jakie są końcowe wartości zmiennych i i znak unsigned char znak=255; int i=znak; while(znak++){ i++; 7
17 jakie są końcowe wartości zmiennych i i znak unsigned char znak=255; int i=znak; while(++znak){ i++; 18 jakie są końcowe wartości zmiennych i i znak unsigned char znak=255; int i=znak; while(znak++==0?1:znak){ i++; 19 jaka jest końcowa wartość zmiennej i int i=0; for(i++;;){ if(i==10) break; 8
20 jaka jest końcowa wartość zmiennej i int i=0; for(i++;;){ if(i==10); break; 21 jaka jest końcowa wartość zmiennej i int i=1; for(;i++;){ if(i==10) break; 22 jaka jest końcowa wartość zmiennej i int i=0; 9
for(;i++;){ if(i==10) break; 23 jaka jest końcowa wartość zmiennej i int i=0; for(;;i++){ if(i==10) break; 24 jaka jest końcowa wartość zmiennej i int i=0; for(;;++i){ if(i==10) break; 25 jakie są końcowe wartości zmiennych i i j? 10
int i=0; int j; for(;;j=i++){ if(i==10) break; 26 jakie są końcowe wartości zmiennych i i j? int i=0; int j; for(;;j=++i){ if(i==10) break; 27 program wyznaczający histogram #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ FILE *wsk; int znak; int i; unsigned int *histo; if(argc<2){ printf("nie podano pliku\n"); 11
return -1; wsk=fopen(*(argv+1), "rb"); if(!wsk){ printf("brak pliku\n"); return -1; histo=(unsigned int*)calloc(10, sizeof *histo); while(eof!=(znak=getc(wsk))) if(znak>= 0 && znak<= 9 ) (*(histo+znak-48))++; for(i=0; i<10; i++) printf("%d %d\n", i, *(histo+i)); fclose(wsk); 28 program wyznaczający liczby pierwsze #include <stdio.h> #include <stdlib.h> #include <math.h> int pierwsza(unsigned int a){ unsigned int i; for(i=2; i<a; i++) if(!(a%i)) return 1; int main(int argc, char** argv){ unsigned int i, od, Do; int l; FILE *wsk; 12
if(argc<4){ printf("uzycie programu:\n%s plik od do w\n", *argv); return -1; if(!(wsk=fopen(*(argv+1), "wb"))){ printf("brak pliku\n"); return -1; od=atoi(*(argv+2)); Do=atoi(*(argv+3)); for(i=od; i<=do; i++){ l=pierwsza(i); if(argc==5 && **(argv+4)== w ) printf("\nliczba: %u%sjest liczba pierwsza\n", i, l?" ":" nie "); putc(l? * :, wsk); fclose(wsk); 29 biblioteka funkcji użytecznych przy tworzeniu bazy danych #include <stdlib.h> #include <stdio.h> #include <string.h> int liczba=0; struct nazwa{ ; char* imie; char* nazwisko; 13
struct pracownik{ ; struct nazwa *id; unsigned char wiek; unsigned short int zarobki; struct pracownik nowy(char* imie, char* nazwisko, unsigned char wiek, unsigned short int zarobki){ struct pracownik tmp; tmp.id=(struct nazwa*)malloc(sizeof *(tmp.id)); tmp.id->imie=(char*)malloc(strlen(imie)+1); strcpy(tmp.id->imie, imie); tmp.id->nazwisko=(char*)malloc(strlen(nazwisko)+1); strcpy(tmp.id->nazwisko,nazwisko); tmp.wiek=wiek; tmp.zarobki=zarobki; liczba++; return tmp; void pokaz(const struct pracownik *Pracownik){ printf("\nid:\n\timie: %s", Pracownik->id->imie); printf("\n\tnazwisko: %s", Pracownik->id->nazwisko); printf("\nwiek: %u", (unsigned int)pracownik->wiek); printf("\nzarobki: %hu\n", Pracownik->zarobki); void zapisz(char* nazwa, struct pracownik* kadra){ int i; FILE *plik=fopen(nazwa, "wb"); for(i=0; i<liczba; i++){ int tmp; tmp=strlen((kadra+i)->id->imie); fwrite(&tmp, sizeof tmp, 1, plik); fwrite((kadra+i)->id->imie, 1, tmp, plik); tmp=strlen((kadra+i)->id->nazwisko); fwrite(&tmp, sizeof tmp, 1, plik); fwrite((kadra+i)->id->nazwisko, 1, tmp, plik); fwrite((char*)&((kadra+i)->wiek), 1, 14
sizeof kadra->wiek, plik); fwrite((char*)&((kadra+i)->zarobki), 1, sizeof kadra->zarobki, plik); fclose(plik); struct pracownik* czytaj(char* nazwa){ int j; int tmp; FILE *plik=fopen(nazwa, "rb"); struct pracownik *kadra; while(fread(&tmp, sizeof tmp, 1, plik)== 1){ fseek(plik, tmp, SEEK_CUR); fread(&tmp, sizeof tmp, 1, plik); fseek(plik, tmp +sizeof (kadra->wiek) + sizeof (kadra->zarobki), SEEK_CUR); liczba++; rewind(plik); kadra=(struct pracownik *)calloc(liczba, sizeof *kadra); for(j=0; j<liczba; j++){ (kadra+j)->id=(struct nazwa*)calloc(1, sizeof *(kadra->id)); fread(&tmp, sizeof tmp, 1, plik); (kadra+j)->id->imie=(char*)calloc(tmp, sizeof (kadra->id->nazwisko)); fread((kadra+j)->id->imie, 1, tmp, plik); fread(&tmp, sizeof tmp, 1, plik); (kadra+j)->id->nazwisko=(char*)calloc(tmp, sizeof kadra->id->nazwisko); fread((kadra+j)->id->nazwisko, 1, tmp, plik); fread(&((kadra+j)->wiek), sizeof kadra->wiek, 1, plik); fread(&((kadra+j)->zarobki), sizeof kadra->zarobki, 1, plik); 15
fclose(plik); return kadra; 30 przykład w programu w języku C++ #include <stdio.h> #include <iostream.h> class dsig{ private: t *data; int num; void dalloc(int); void dfree(void); public: dsig(void); dsig(int); dsig(int, t*); dsig(dsig&); ~dsig(void); dsig& operator=(dsig&); t& operator[](int); dsig& operator+(dsig&); friend dsig& operator+(dsig&); dsig& operator-(dsig&); friend dsig& operator-(dsig&); ; friend ostream& operator<<(ostream&, dsig&); void print(void); 16
void dsig<t>::dalloc(int num_){ data=new t[num=num_]; void dsig<t>::dfree(void){ if(num){ delete[] data; num=0; dsig<t>::dsig(void){ num=0; dsig<t>::dsig(int num_){ dalloc(num_); dsig<t>::dsig(int num_, t* data_){ dalloc(num_); for(int i=0; i<num_; i++) (*this)[i]=*(data_+i); dsig<t>::dsig(dsig& dsig){ cout<<"funkcja dsig\n"; dalloc(dsig.num); for(int i=0; i<num; i++) (*this)[i]=dsig[i]; 17
dsig<t>::~dsig(void){ dfree(); dsig& dsig<t>::operator=(dsig& dsig){ cout<<"operator=\n"; if(this!=&dsig){ if(dsig.num!=this->num){ dfree(); dalloc(dsig.num); for(int i=0; i<num; i++) (*this)[i]=dsig[i]; return *this; t& dsig<t>::operator[](int index){ if(index>=0 && index<num) return *(data+index); return *data; dsig& dsig<t>::operator+(dsig& dsig){ cout<<"operator+\n"; if(this->num!=dsig.num) return *this; dsig *tmp=new dsig(*this); for(int i=0; i<num; i++) *(tmp->data+i)=*(dsig.data+i)+*(tmp->data+i); 18
tmp->num=num; return *tmp; dsig<t>& operator+(dsig<t>& dsig){ dsig *tmp=new dsig(dsig); return *tmp; dsig& dsig<t>::operator-(dsig<t>& dsig){ dsig *tmp=new dsig(dsig.num); *tmp=*this+-dsig; return *tmp; dsig<t>& operator-(dsig<t>& dsig){ dsig<t> *tmp=new dsig<t>(dsig.num); for(int i=0; i<tmp->num; i++) (*tmp)[i]=-dsig[i]; return *tmp; ostream& operator<<(ostream& cout_, dsig<t>& dsig){ cout_<<(dsig.num!=0?"[":" pustka "); for(int i=0; i<dsig.num; i++) cout_<<*(dsig.data+i)<<(i==dsig.num-1?"]":","); return cout_; void dsig<t>::print(void){ 19
cout<<(*this); dsig<int> a(10); for(int i=0; i<10; i++) a[i]=i; cout<<a<<"\n"; int *data; data =new int[10]; for(int i=0; i<10; i++) *(data+i)=i*1000; dsig<int> b(10, data); cout<<"\n"<<a<<" + "<<b<<" = "<<(a+b)<<"\n"; cout<<"\n"<<a<<" - "<<b<<" = "<<(a-b)<<"\n"; cout<<"\n"<<"- "<<a<<" = "<<(-a)<<"\n"; cout<<"\n"<<"- - "<<a<<" = "<<(- -a)<<"\n"; dsig<int> c;c=a; cout<<"c = "<<c<<"\n"; dsig<int> d(5, data); cout<<"\n d = "<<d; d=a; cout<<"\n d = "<<d; dsig<double> e(10); for(int i=0; i<10; i++) e[i]=1.0/(double)(i+1); cout<<e; dsig< dsig<int> > f(3); 20
f[0]=a; f[2]=b; f[2][2]=10001; cout<<"\n f + f = "<<(f+f); 21