Programe demonstrative
1) Programul prezentat in continuare genereaza un sir de n valori intregi aleatoare in intervalul [0,M 1] pe care le depune in tabloul X (alocat dinamic), si apoi le sorteaza crescator. 757c26h In continuare se genereaza k valori intregi aleatoare pe care le cauta in tabloul X. Pentru fiecare cautare cu succes se afiseaza pe terminal valoarea cautata si pozitia in tablou.
Valorile n k si M se iau in aceasta ordine din linia de comanda.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int cmp(const void *A, const void *B)
int main(int ac, int **av)
n=atoi(av[1]); k=atoi(av[2]);
M=atoi(av[3]);
X=(int *)malloc(n*sizeof(int));
if (!X) return 1;
srand(time(NULL));
for (i=0; i<n; i++)
X[i]=rand()%M;
qsort(X,n,sizeof(int),cmp);
for (i=0; i<k; i++)
free(X);
return 0;
}
2) Sa reluam al treilea exemplu din capitolul precedent. Se citeste un fisier text care contine pe fiecare linie un nume (sir de caractere fara spatiu) si trei valori reale (note). Pentru fiecare linie se calculeaza media aritmetica a celor trei valori si se determina daca elementul este admis (fiecare nota este minimum 5) sau respins (cel putin o nota este sub 5). In final se afiseaza liniile in ordinea urmatoare: mai intii elementele admise in ordinea descrescatoare a mediei, si apoi elementele respinse in ordine alfabetica dupa nume. Se afiseaza doar numele, situatia (A/R) si media.
In acest exemplu punem in evidenta o modalitate comoda de selectare a membrilor unei structuri cu ajutorul macrourilor. Macroul Fld selecteaza din zona referita de pointerul P membrul f. Deoarece pointerul P (care poate fi argumentul A sau B al functiei comp) refera o zona de tip void, este necesar mai intii un cast pentru a preciza tipul concret al acesteia. Membrul f poate fi: nm ar md, definiti in cadrul structurii de tip StEl
Deoarece nu stim de la inceput cite linii are fisierul de intrare, sintem nevoiti sa folosim urmatoarea strategie. La inceput alocam pentru tabloul El o zona care sa memoreze NA elemente. Pe masura ce aceasta zona se completeaza, la un moment dat numarul de linii citite coincide cu NA. In acest moment se aloca o zona noua care sa poata memora un numar mai mare de elemente. Desigur, de fiecare data se va actualiza marimea spatiului alocat.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define NA 32
typedef struct StEl;
#define Fld(P,f) ((StEl *)P)->f
int comp(const void *A, const void *B)
return strcmp(Fld(A,nm),Fld(B,nm));
}
int main(int ac, char **av)
fi=fopen(av[1],'rt');
if (!fi)
na=NA; ne=0;
El=(StEl *)malloc(na*sizeof(StEl));
while (fscanf(fi,'%s %d %d %d',
El[ne].nm,&El[ne].na,&El[ne].nb,
&El[ne].nc)!=EOF)
}
fclose(fi);
qsort(El,ne,sizeof(StEl),comp);
for (i=0; i<ne; i++)
printf('%-12s %c%6.2lfn',
El[i].nm,El[i].ar,El[i].md);
free(El);
return 0;
}
3) Se citeste dintr-un fisier text o valoare naturala n. Urmatoarele linii contin n cuvinte, fiecare cuvint avind acelasi numar de litere (cel mult 10). Sa se afiseze cuvintele din fisier ordonate alfabetic.
Pentru a memora lista de cuvinte folosim urmatoarea strategie. In loc sa alocam pentru fiecare cuvint (sir de caractere) citit o zona noua de memorie, alocam de la inceput o zona in care sa putem memora toate cuvintele din lista. Aceasta zona va avea marimea de (l+1)*n octeti, unde l este lungimea fiecarui cuvint (numarul de litere). De ce (l+1) pentru ca trebuie sa memoram si caracterul terminator null.
Avantaje: memoria este utilizata mai eficient daca se aloca de la inceput o zona contigua de dimensiune mai mare, si se reduce foarte mult fragmentarea memoriei.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int comp(const void *A, const void *B)
int main(int ac, char **av)
fi=fopen(av[1],'rt');
if (!fi)
fscanf(fi,'%d %s',n,s);
l=strlen(s);
C=(char *)malloc((l+1)*n);
Strcpy(C,s);
for (i=1; i<n; i++)
fscanf(fi,'%s',C+(l+1)*i);
fclose(fi);
qsort(C,n,l+1,comp);
for (i=0; i<n; i++)
printf('%sn',C+(l+1)*i);
free(C);
return 0;
}
Brian W Kernigham, Dennis M Ritchie - The C Programming Language
Prentice-Hall Software Series, 1978
- Limbajul C; manual de programare
Institutul de tehnica de calcul, Cluj-Napoca 1984
Herbert Schildt - Manual C complet
Editura Teora, 1998
Manuale electronice
https://www.programmingtutorials.com/c.html
|