Documente Academic
Documente Profesional
Documente Cultură
....
/* fisierul timer.h */
void starton(void);
float startoff(void);
/* fisierul timer.c */
#include <time.h>
#include "timer.h"
clock_t aux;
void starton(void)
{ aux=clock();
}
float startoff(void)
{ return(clock()-(float)aux)/CLK_TCK;
}
// fisier main.c
#include "timer.h"
#include <stdio.h>
#include <stdlib.h>
int *a = NULL,n;
void deplasare(int s, int d) { //globale:tipElement a[],int n
int i = s, j = 2 * s, x = a[i - 1], ret = 0;
while (j <= d && !ret) {
if (j<d && a[j - 1]<a[j])j++;
(x<a[j - 1]) ? (a[i - 1] = a[j - 1], i = j, j = 2 * i) : (ret = 1);
}
a[i - 1] = x;
}
void heapsort() { //globale: tipElement a[],int N
//constructie ansamblu
int s = n / 2 + 1, d = n; //ATENTIE: N trebuie sa fie mai mare strict decat 0
while (s - 1)deplasare(--s, n);
//sortare ansamblu
while (d - 1) {
int x = a[0]; a[0] = a[d - 1]; a[d - 1] = x;
deplasare(1, --d);
}
}
void quicksort(int s, int d) { //tipElement a[],int n
int i = s, j = d, x = a[(s + d) / 2];
do {
while (a[i]<x)i++;
while (a[j]>x)j--;
if (i <= j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++; j--;
}
} while (i <= j);
if (s<j)quicksort(s, j);
if (d>i)quicksort(i, d);
}
void generate_a()
{
a = realloc(a, n*sizeof(int));
if (!a)
{
printf("Alocare dinamica esuata\n");
exit(1);
}
int i;
for (i = 0; i < n; i++)
a[i] = n - i - 1;
}
void main(void)
{
FILE *f;
f = fopen("Fisier.txt", "w");
if (!f)
{
perror("Fisierul nu a putut fi accesat\n");
exit(1);
}
int i;
double time;
for (i = 1; i <=10 ; i++)
{
n = 10000*i;
generate_a();
starton();
heapsort();
time = startoff();
fprintf(f, "Heapsort,%d,%lf\n", n, time);
generate_a();
starton();
quicksort(0,n-1);
time = startoff();
fprintf(f, "Quicksort,%d,%lf\n", n, time);
}
free(a);
fclose(f);
}
//Se da un fisier continand date despre optiunile unor studenti cu privire la un set de materii
optionale. Fisierul este disponibil in sectiunea resurse laborator 2. Fisierul contine 10.000 de
linii, fiecarui elev revenindu-i 2 linii consecutive din fisier. Pe prima linie din cele doua se afla
numele studentului iar pe cea de a doua se afla o serie de 4 coduri reprezentand tot atatea
optiuni. Cunoscand ca sunt in total 5.000 de studenti si ca numele nici unui student nu ocupa
mai mult de 35 de caractere, se cere:
· Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma < nume ,
optional1, optional2, opptional3, optional4 >
· Stiind ca studentii sunt ordonati alfabetic dupa nume, sa se aplice un algoritm de cautare
optim, din cele studiate in cadrul acestui laborator si sa se contorizeze numarul de comparatii
pentru gasirea studentului MATEI STEFAN.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char nume[35],optional[4][3];
}student;
s = 0;
d = 5000;
while (s<d)
m = (s + d) / 2;
s = m + 1;
count++;
else
d = m;
count++;
if (d >= 5000)
return -1;
else
else
return -1;
puts(list[i].nume);
int main()
student *list;
FILE *f;
char op[3];
fopen_s(&f, "FisierTestStudentiAlfabetic.txt","r");
if (!f)
exit(1);
if (!list)
{
exit(1);
int i;
list[i].nume[strlen(list[i].nume)-1] = '\0';
scanf("%s", op);
cautare_liniara(list, op);
free(list);
fclose(f);
return 0;
//Se da un fisier continand date despre ocupatiile din Romania. Fisierul este disponibil in
sectiunea resurse laborator 2. Fiecarei ocupatii ii corespunde o linie din fisier: nr_crt
cod_ocupatie nume_ocupatie. Presupunand ca numele nici unei ocupatii nu ocupa mai mult de
255 de caractere, se cere:
· Sa se citeasca datele din fisier intr-un tablou de forma <ocupatie, cod >
· Stiind ca aceste ocupatii sunt ordonate alfabetic dupa nume, sa se aplice un algoritm de
cautare optim, din cele studiate in cadrul acestui laborator si sa se contorizeze numarul de
comparatii pentru determinarea codului ocupatiei "programator".
· Sa se aplice algoritmul de cautare liniara pentru localizarea ocupatiilor a caror cod este
cuprins intre 20000 si 30000.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ocupatie[255];
long cod;
}meserie;
s = 0;
d = n-1;
while (s<d)
m = (s + d) / 2;
s = m + 1;
count++;
else
d = m;
count++;
if (d >= n)
return -1;
else
if (strcmp(list[d].ocupatie, "programator") == 0)
return count;
else
return -1;
puts("");
int main()
{
meserie *list=NULL;
FILE *f;
fopen_s(&f, "FisierCORalfabetic.txt","r");
if (!f)
exit(1);
int n;
while((fscanf_s(f,"%d",&n)!=EOF))
cautare_liniara(list, n);
free(list);
fclose(f);
return 0;
//Se da un fisier continand date despre optiunile unor studenti cu privire la un set de materii
optionale. Acest fisier poate fi gasit in sectiunea resurse laborator 3. Fisierul contine 10.000 de
linii, fiecarui elev revenindu-i 2 linii consecutive din fisier. Pe prima linie din cele doua se afla
numele studentuluiiar pe cea de a doua se afla o serie de 4 coduri reprezentand tot atatea
optiuni. Cunoscand ca sunt in total 5.000 de studenti si ca numele nici unui student nu ocupa
mai mult de 35 de caractere, se cere:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
}student;
student temp;
do {
if (strcmp(a[j - 1].nume,a[j].nume)>0)
{
ultim = j;
atrb = atrb + 3;
comp++;
} /*FOR*/
sus = ultim + 1;
ultim = j;
comp++;
atrb = atrb + 3;
} /*FOR*/
jos = ultim - 1;
} while (!(sus>jos));
void insertie(student a)
int i, j;
j = i + 1;
printf_s("%s\n", a.optionale[i]);
int main()
student a[5000];
FILE *f;
int n = 0;
if (!f)
exit(1);
}
a[n].nume[strlen(a[n].nume) - 1] = '\0';
n++;
shakersort(a);
scanf_s("%d", &n);
if (n<0 || n>4999)
exit(1);
insertie(a[n]);
fclose(f);
return 0;
//Se da un fisier continand date despre rezultatele unor elevi la admiterea in liceu. Acest fisier
poate fi gasit in sectiunea resurse laborator 3. Fisierul contine 10.000 de linii, fiecarui elev
revenindu-i 2 linii consecutive din fisier. Pe prima linie din cele doua se afla numele elevului iar
pe cea de a doua se afla media de intrare sub forma unui numar real intre 1.0 si 10.0.
Cunoscand ca sunt in total 5.000 de elevi si ca numele nici unui elev nu ocupa mai mult de 35
de caractere, se cere:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[36];
double medie;
}student;
atrb=atrb+1;
comp++;
atrb = atrb + 1;
atrb = atrb + 2;
printf_s("%s\n", a[i].nume);
printf_s("%s\n", a[i].nume);
comp++;
atrb = atrb + 3;
printf_s("%s\n", a[i].nume);
printf_s("%s\n", a[i].nume);
int main()
student a[5000];
FILE *f;
int n = 0;
if (!f)
exit(1);
}
a[n].nume[strlen(a[n].nume) - 1] = '\0';
fscanf_s(f, "%lf\n",&a[n].medie);
n++;
sortare_prin_selectie(a);
getchar();
bubblesort(a);
fclose(f);
return 0;
//Se dă un fișier, numit filme.txt, conținând date despre o colecție de filme. Acest fișier are
următoarea structură, pe prima linie se află următorul antet:
Începând cu a doua linie se află informațiile despre filme, fiecărui film revenindu-i câte o linie cu
următoarele informații, separate prin tab (‘\t’):
Anul apariției(de tip întreg) Durata(de tip întreg) Titlul(de tip sir de caractere,
poate conține și spatii) Categoria(șir de caractere) Premii(Da/Nu)
Se cere:
● Știind ca fișierul conține datele ordonate după durata filmului și că doar un singur film
mai multe elemente cu aceeași valoare a cheii după care se face sortarea, să se
intervale (unul pentru elemente cu valori ale cheii mai mici decât valoarea fanionului,
unul pentru elemente cu valori egale si unul pentru elemente cu valori mai mari) și să
mod: pe primele poziții se vor afla filmele premiate (cele care au valoarea Da la
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char titlu[90],categoria[90],premii[90];
}film;
int s = 0, d = n - 1, gasit = 0, m;
m = (s + d) / 2;
if (a[m].durata == 159)
gasit = 1;
else
s = m + 1;
else
d = m - 1;
if (gasit)
else
{
printf_s("Nu exista filmul cu durata respectiva\n");
int i = s;
i++;
int p = (s + d) / 2;
p--;
if (p != i)
film temp;
temp = a[i];
a[i] = a[p];
a[p] = temp;
int j = d;
j--;
int p = (s + d) / 2;
p++;
if (p != j)
film temp;
temp = a[j];
a[j] = a[p];
a[p] = temp;
int i = s, j = d;
do {
if (i <= j) {
a[i] = a[j];
a[j] = temp;
i++; j--;
int i = s, j = d;
la_centrus(a, s, d, x);
la_centrud(a, s, d, x);
do {
if (strcmp(a[i].categoria, a[j].categoria) == 0)
i++;
j--;
else
if (i <= j) {
a[j] = temp;
i++; j--;
int j = 0;
j++;
if (strcmp(a[i].premii, "Da") == 0)
a[j] = temp;
j++;
int main()
FILE *f;
film *a = NULL;
int n = 0;
char linie[40];
if (!f)
exit(1);
if (!a)
exit(1);
n++;
a = (film*)realloc(a,(n + 1)*sizeof(film));
if (!a)
exit(1);
}
}
fclose(f);
cautare_binara(a, n);
quicksort(a, 0, n - 1);
if (!f)
exit(1);
a[i].categoria, a[i].premii);
fclose(f);
if (!f)
{
exit(1);
quicksort_modificat(a, 0, n - 1);
a[i].categoria, a[i].premii);
fclose(f);
if (!f)
exit(1);
sortare_singura_parcurgere(a, n);
a[i].categoria, a[i].premii);
fclose(f);
return 0;
de date (ex. N1=5, N2= 10, ... N10=100). Sa se scrie timpii de executie intr-un fisier txt in
....
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "timer.h"
{
if (n == 1)
return 0;
if (n == 2)
return 1;
int i;
tab = (long*)malloc(n*sizeof(long));
if (!tab)
exit(1);
tab[0] = 0;
tab[1] = 1;
int main()
int n = 5;
FILE *f;
starton();
fibor(n*i);
float t;
t = startoff();
starton();
fibonr(n*i);
t = startoff();
fprintf_s(f, "Fibonacci nerecursiv,%d,%f\n", n*i, t);
fclose(f);
return 0;
//Se da un fisier continand date despre mineralele cunoscute. Fisierul este disponibil in
sectiunea resurse laborator 2. Fiecarui mineral ii corespunde o linie din fisier: nume_mineral
· Stiind ca aceste minerale sunt ordonate alfabetic dupa nume, sa se aplice un algoritm de
cautare optim, din cele studiate in cadrul acestui laborator si sa se contorizeze numarul de
incepe cu litera K.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[51],descriere[256];
}mineral;
int contor=0;
m = (s + d) / 2;
if (strcmp(a[m].nume,"ONYX")==0)
gasit = 1;
if (contor == 0)
contor = 1;
else
s = m + 1;
contor++;
else
d = m - 1;
contor++;
if (contor == 0)
else
printf_s("%s\n", a[i].nume);
int main()
FILE *f;
mineral *t;
int n = 0;
if (!f)
exit(1);
t = (mineral*)malloc((n + 1)*sizeof(mineral));
if (!t)
exit(1);
}
n++;
t = (mineral*)realloc(t, (n + 1)*sizeof(mineral));
if (!t)
exit(1);
cautare_binara(t, n);
cautare_liniara(t, n);
fclose(f);
return 0;
//Se da un fisier continand date despre rezultatele unor elevi la admiterea in liceu. Acest fisier
poate fi descarcat din sectiunea resurse laborator 2. Fisierul contine 10.000 de linii, fiecarui elev
revenindu-i 2 linii consecutive din fisier. Peprima linie din cele doua se afla numele elevului iar
pe cea de a doua se afla media de intrare sub forma unui numar real intre 1.0 si 10.0.
Cunoscand ca sunt in total 5.000 de elevi si ca numele nici unui elev nu ocupa mai mult de 35
de caractere, se cere:
● Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma <
cautare binara pentru a localiza elevul care a obtinut media 9.7 si sa se contorizeze
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char nume[36];
float medie;
}elev;
int m, contor = 0;
float x = 9.700000;
m = (s + d) / 2;
if (a[m].medie==x )
gasit = 1;
contor++;
else
if (a[m].medie>x)
s = m + 1;
contor++;
}
else
d = m - 1;
contor++;
if (gasit) {
else {
int m, s, d;
s = 0;
d = 4999;
int contor = 0;
float x = 9.700000;
do{
if (x>a[m].medie) s = m + 1;
else d = m - 1;
contor++;
} while ((s<d) && (a[m].medie != x) && (a[d].medie != a[s].medie) && (x >= a[s].medie)
int main()
FILE *f;
elev t[5000];
int n = 0;
fopen_s(&f, "FisierTestStudentiMedie.txt", "r");
if (!f)
exit(1);
t[n].nume[strlen(t[n].nume) - 1] = '\0';
fscanf_s(f,"%f\n", &t[n].medie);
n++;
printf_s("Cautare binara\n");
cautare_binara(t);
cautare_prin_interpolare(t);
fclose(f);
return 0;
}
// Se da un fisier binar continand 100.000 numere intregi. Acest fisier poate fi descarcat aici. Sunt
prezente toate numerele intregi intre 0 si 99.999, intr-o ordine aleatoare. Se cere:
● Sa se afiseze intr-un fisier text continutul fisierului binar de intrare. Fiecare din cei 100.000 de
intregi va ocupa propria sa linie
● Sa se foloseasca algoritmul de sortare prin interclasare naturala pentru a sorta descrescator
fisierul de intrare
● Sa se contorizeze cate operatii de citire din fisier si scriere in fisier executa algoritmul, precum
si numarul de comparatii executate
● Sa se afiseze intr-un alt fisier text continutul fisierului sortat, intr-un format similar celui de
mai sus
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
void copy(FILE* source, FILE* destination, long *last_item, int* eof_source, int* flag)
long int x; // aici trebuie folosit un element de tipul elementelor din fisier
s++;
if (feof(source))
{
*flag = 1;
*eof_source = 1;
comp++;
else
comp++;
x = *last_item;
*flag = 1;
*eof_source = 1;
comp++;
c++;
return;
comp++;
}
}
int flag;
do
comp++;
} while (!flag);
FILE* source;
FILE* destination1;
FILE* destination2;
int eof_source;
if (!source)
{
comp++;
return;
eof_source = feof(source);
if (!eof_source)
comp++;
comp++;
c++;
return;
do
{
comp++;
if (!eof_source)
comp++;
} while (!eof_source);
fclose(source);
fclose(destination1);
fclose(destination2);
void merge_monotony(FILE* source1, FILE* source2, FILE* destination, long *x, long *y, int*
int flag;
do
{
comp++;
comp++;
if (flag)
comp++;
else
comp++;
if (flag)
comp++;
} while (!flag);
FILE* source1;
FILE* source2;
FILE* destination;
if (!source1)
comp++;
return;
}
source2 = fopen(auxiliary2, "rb");
if (!source2)
comp++;
return;
eof1 = feof(source1);
eof2 = feof(source2);
if (!eof1)
comp++;
c++;
comp++;
eof1 = 1;
}
}
if (!eof2)
comp++;
comp++;
c++;
eof2 = 1;
while (!eof2)
comp++;
*repeat = *repeat + 1;
if (!eof1)
{
comp++;
*repeat = *repeat + 1;
fclose(source1);
fclose(source2);
fclose(destination);
int repeat;
do
comp++;
repeat = 0;
comp);
//getchar();
int main()
FILE *f,*g;
if (!f)
{
perror("Fisierul nu a putut fi accesat\n");
exit(1);
if (!g)
exit(1);
afisare_in_fisier(f, g);
fclose(g);
fclose(f);
if (!f)
exit(1);
}
fopen_s(&g, "out2.txt", "w");
if (!g)
exit(1);
afisare_in_fisier(f, g);
fclose(f);
fclose(g);
return 0;
//. Se da un fisier binar continand 100.000 numere intregi. Acest fisier poate fi descarcat aici. Sunt
prezente toate numerele intregi intre 0 si 99.999, intr-o ordine aleatoare. Se cere:
● Sa se afiseze intr-un fisier text continutul fisierului binar de intrare. Fiecare din cei 100.000 de
intregi va fi delimitat de vecinii sai printr-un caracter '|'
● Sa se foloseasca algoritmul de sortare prin interclasare cu 3 benzi pentru a sorta descrescator
fisierul de intrare
● Sa se contorizeze cate operatii de citire din fisier si scriere in fisier executa algoritmul, precum
si numarul de comparatii executate
● Sa se afiseze intr-un alt fisier text continutul fisierului sortat, intr-un format similar celui de
mai sus
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
long int c = 0, s = 0, comp = 0;
int i;
i = 0;
comp++;
//c++;
comp++;
break;
c++;
s++;
i++;
FILE* source;
FILE* destination1;
FILE* destination2;
if (!source)
comp++;
return;
}
while (!feof(source))
comp++;
fclose(source);
fclose(destination1);
fclose(destination2);
void merge(char* file_name, char* auxiliary1, char* auxiliary2, int size, int* repeat)
int i, j;
FILE* source1;
FILE* source2;
FILE* destination;
if (!source1)
comp++;
return;
if (!source2)
{
comp++;
return;
eof1 = feof(source1);
eof2 = feof(source2);
if (!eof1)
comp++;
comp++;
//c++;
eof1 = 1;
c++;
if (!eof2)
comp++;
comp++;
eof2 = 1;
c++;
do
comp++;
i = 0;
j = 0;
while (i < size && j < size && !eof1 && !eof2)
comp++;
if (x > y)
comp++;
s++;
i++;
if (feof(source1))
comp++;
eof1 = 1;
comp++;
eof1 = 1;
c++;
else
comp++;
s++;
j++;
if (feof(source2))
comp++;
eof2 = 1;
comp++;
eof2 = 1;
c++;
comp++;
s++;
i++;
if (feof(source1))
comp++;
eof1 = 1;
comp++;
eof1 = 1;
c++;
comp++;
j++;
if (feof(source2))
comp++;
eof2 = 1;
comp++;
eof2 = 1;
c++;
if (!eof1 || !eof2)
comp++;
*repeat = 1;
fclose(source1);
fclose(source2);
fclose(destination);
int size;
int repeat;
size = 1;
do
comp++;
distribute(file_name, auxiliary1, auxiliary2, size);
repeat = 0;
size = size * 2;
//getchar();
int main()
if (!f)
exit(1);
if (!g)
exit(1);
}
afisare_in_fisier(f, g);
fclose(f);
fclose(g);
if (!f)
exit(1);
fclose(f);
if (!f)
exit(1);
if (!g)
exit(1);
afisare_in_fisier(f, g);
fclose(f);
fclose(g);
return 0;
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[35];
int cod;
}pacient;
{ int s = 0, d = n - 1, gasit = 0;
int m;
m = (s + d) / 2;
if (strcmp(a[m].nume,nume)==0)
gasit = 1;
else
if (strcmp(a[m].nume,nume)<0)
s = m + 1;
else
d = m - 1;
if (gasit) {
return a[m].cod;
else {
return -1;
int main()
int n;
pacient *t;
scanf_s("%d\n", &n);
t = (pacient*)malloc(n*sizeof(pacient));
if (!t)
exit(1);
char nume[35];
scanf_s("%s",nume, (unsigned)_countof(nume));
if (x == -1)
else
cod_mai_mic(t, n, x);
return 0;
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
{
char nume[35];
char gen;
float marime_pantof;
}elev;
if (a[i].marime_pantof == a[j].marime_pantof)
if (strcmp(a[i].nume, a[j].nume)<0)
elev temp=a[i];
a[i]=a[j];
a[j] = temp;
else
a[j]=a[i];
a[i] = temp;
else
a[i] = a[j];
a[j] = temp;
}
int main()
elev *a;
int n;
scanf_s("%d", &n);
a = (elev*)malloc(n*sizeof(elev));
if (!a)
exit(1);
a[i].nume[strlen(a[i].nume) - 1] = '\0';
scanf_s("%c", &a[i].gen);
scanf_s("%f", &a[i].marime_pantof);
sortare(a, n);
return 0;
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[35];
float suprafata;
int soldati;
}tara;
a[i] = a[j];
a[j] = temp;
}
int main()
FILE* f;
if (!f)
exit(1);
int n;
tara *a;
a = (tara*)malloc(n*sizeof(tara));
if (!a)
exit(1);
a[i].nume[strlen(a[i].nume) - 1] = '\0';
sortare(a, n);
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[35];
int cod;
}produs;
if (strcmp(a[i].nume, nume) == 0)
return a[i].cod;
return -1;
}
void afisare(produs *a, int n, unsigned cod)
int main()
int n;
produs *a;
scanf_s("%d", &n);
a = (produs*)malloc(n*sizeof(produs));
if (!a)
exit(1);
a[i].nume[strlen(a[i].nume) - 1] = '\0';
a[i].cod = i;
char nume[35];
nume[strlen(nume) - 1] = '\0';
if (x == -1)
else
{
afisare(a, n, x);
return 0;
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char limbaj[35];
int cod_eroare;
boolean rezolvare;
}eroare;
if (strcmp(a[i].limbaj, a[j].limbaj) == 0)
if (a[i].cod_eroare>a[j].cod_eroare)
eroare temp=a[i];
a[i] = a[j];
a[j] = temp;
else
a[i] = a[j];
a[j] = temp;
int main()
FILE *f;
eroare *a;
int n;
exit(1);
fscanf_s(f,"%d\n", &n);
a = (eroare*)malloc(n*sizeof(eroare));
if (!a)
exit(1);
a[i].limbaj[strlen(a[i].limbaj)-1] = '\0';
sortare(a, n);
fclose(f);
return 0;
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char nume[35];
int cod;
}produs;
int i, j;
a[i] = a[j];
a[j] = temp;
int main()
int n;
scanf_s("%d\n", &n);
produs *a;
a = (produs*)malloc(n*sizeof(produs));
if (!a)
exit(1);
a[i].nume[strlen(a[i].nume) - 1] = '\0';
a[i].cod = n - i;
sortare(a, n);
return 0;
//
1. Un program bibliotecar tine evidenta cartilor imprumutate de diferiti cititori. Informatiile pentru
fiecare imprumut includ (primele patru campuri sunt alfanumerice): titlu carte, autor carte, nume
cititor, adresa cititor, termen (numar de zile pana la returnare). Sa se implementeze operatorii:
#include <stdlib.h>
#include <string.h>
int termen;
}nod;
nod *root,*last;
void vidare()
root = NULL;
last = NULL;
nod *creeare(char titlu[100], char autor[100], char cititor[100], char adresa[100], int termen)
{
nod *p;
p =(nod*)malloc(sizeof(nod));
if (!p)
exit(1);
strcpy(p->titlu,titlu);
strcpy(p->autor, autor);
strcpy(p->cititor,cititor);
strcpy(p->adresa,adresa );
p->termen = termen;
p->urm = NULL;
return p;
p->urm = root;
root = p;
else
nod *q;
q = root;
q = q->urm;
if (q->urm != NULL)
p->urm = q->urm;
q->urm = p;
else
last->urm = p;
last = p;
boolean imprumut_nou(char *titlu, char *autor, char *cititor, char *adresa, int termen)
nod *p;
if (root == NULL)
root = p;
last = p;
return true;
else
p = root;
while (p != NULL)
if (strcmp(p->cititor, cititor) == 0)
return false;
p = p->urm;
adauga(p);
return true;
void actualizare()
nod *p;
p = root;
while (p != NULL)
p->termen--;
p = p->urm;
p = root;
while (p != NULL)
if (p->termen < 0)
else
break;
p = p->urm;
printf("\n");
nod *p;
p = root;
if (strcmp(root->cititor, cititor) == 0)
root = root->urm;
printf("Numele cartii este:%s\n", p->titlu);
free(p);
return;
else
nod *q;
q=p;
p = p->urm;
if (p->urm != NULL)
q->urm=p->urm;
free(p);
return;
else
if(strcmp(p->cititor,cititor)==0)
last=q;
last->urm=NULL;
free(p);
return;
void afisare()
{
nod *p;
int main()
vidare();
afisare();
printf("-.-\n");
actualizare();
printf("-.-\n");
actualizare();
printf("-.-\n");
actualizare();
printf("-.-\n");
actualizare();
printf("-.-\n");
actualizare();
returnare("Stefan Mihai");
afisare();
return 0;
//Se considera o cutie postala care poate contine mesaje. Fiecare mesaj este caracterizat prin
prioritate (urgent sau ordinar), destinatar (sir de caractere) si continut (sir de caractere). Un mesaj
prioritar va fi plasat intotdeauna pe prima pozitie în cutia postala, unul ordinar va fi plasat astfel incat
mesajele ordinare din cutie sa fie in permanenta ordonate alfabetic dupa destinatarul lor. Astfel, pe
primele pozitii vor fi mesaje urgente neordonate dupa destinatar, iar cand se termina mesajele
urgente in lista vor urma mesaje ordinare ordonate alfabetic dupa destinatar (se va folosi o singura
lista pentru toate mesajele). Sa se implementeze urmatorii operatori:
• primire_mesaj(destinatar) - persoana cu numele precizat isi ridica din cutia postala mesajul cel mai
prioritar care-i este adresat; se va afisa continutul mesajului si prioritatea sa;
• afisare() – se listeaza mesajele de prioritate mica (mesajele ordinare) in ordine alfabetica inversa,
dupa destinatarul lor.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
tip prioritate;
char destinatar[50];
char continut[100];
}nod;
nod *root,*last;
void initializare()
root=NULL;
last=NULL;
{
nod *p;
p=(nod*)malloc(sizeof(nod));
if(!p)
exit(1);
p->prioritate=prioritate;
strcpy(p->destinatar,destinatar);
strcpy(p->continut,continut);
p->urm=NULL;
p->ant=NULL;
return p;
nod *p;
p=creeare(prioritate,destinatar,continut);
if(root==NULL)
root=p;
last=p;
return;
if(prioritate==urgent)
p->urm=root;
root->ant=p;
root=p;
else
{
nod *q,*r;
r=root;
for(q=root->urm;q!=NULL;q=q->urm)
r->urm=p;
p->ant=r;
p->urm=q;
q->ant=p;
return;
r=q;
last->urm=p;
p->ant=last;
last=p;
nod *p;
p=root;
while(p!=NULL)
if(strcmp(p->destinatar,destinatar)==0)
{
printf("Continut:%s|Prioritate:%u\n",p->continut,p->prioritate);
return;
p=p->urm;
void afisare()
nod *p=last;
printf("%u %s:%s\n",p->prioritate,p->destinatar,p->continut);
p=p->ant;
int main()
initializare();
trimitere_mesaj(ordinar,"Nume1","Hsafjsidfiwrfji3fsa");
trimitere_mesaj(urgent,"Nume1","Hsafjsigadfsdxzcadfiwrfji3fsa");
trimitere_mesaj(urgent,"Nume3","gdfweasxsafjsidfiwrfji3fsa");
trimitere_mesaj(ordinar,"Nume0","rthrthrtjsidfiwrfji3fsa");
trimitere_mesaj(ordinar,"Nume","xvzxvzxvzHsafjsidfiwrfji3fsa");
primire_mesaj("Nume3");
primire_mesaj("Nume1");
afisare();
return 0;
}
//Se considera o tabla de sah de dimensiune 8 x 8. Sa se determine cel mai scurt traseu pe care il
poate parcurge un cal de la pozitia [A,1] pana la pozitia [H,8] (observatie: liniile au valori intre 1 si 8,
iar coloanele intre A si H).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[8][8];
int sol[8][8];
Int nu=0;
return i == 7 && j == 7;
printf("\n");
if ((i >= 0 && i < 8) && (j >= 0 && j < 8) && a[i][j]==0)
return 1;
return 0;
int nr = 0;
if (mat[i][j] == 1)
nr++;
return nr;
void copiere()
sol[i][j] = a[i][j];
int X,Y;
X = i + x[p];
Y = j + y[p];
if (valid(X, Y))
a[X][ Y] = 1;
if (solutie(X, Y))
nu++;
{
copiere();
min = det(a);
Else
if(nu<1000)
back(X, Y);
a[X][Y]=0;
int main()
a[0][0]=0;
back(0, 0);
afisare(sol);
return 0;
//Se considera o suprafata caroiata de dimensiune N x N, in care fiecare patrat are una din culorile
galben, rosu, albastru sau verde. Configuratia suprafetei se citeste de la tastatura (sau dintr-un fisier).
Sa se determine si sa se tipareasca daca exista drumuri (minime) intre colturile opuse. Un drum
trebuie sa cuprinda doar patrate de aceeasi culoare, deplasarea dintr-un patrat putandu-se face in
oricare dintre cei maxim opt vecini.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[5][5];
int sol[5][5];
int min;
int nr=0;
if(nr==0)
if(nr==1)
if(nr==2)
printf("\n");
printf("|-|\n");
return i>=0 && i<5 && j>=0 && j<5 && a[i][j]==c;
int nr = 0;
for (int i = 0; i < 5;i++)
if (mat[i][j] == 0)
nr++;
return nr;
void copiere()
sol[i][j] = a[i][j];
int X,Y;
for(int p=0;p<8;p=p+1)
X=i+x[p];
Y=j+y[p];
if(valid(X,Y,c))
a[X][Y]=0;
if(solutie(X,Y))
if(det(a)<min)
copiere();
min=det(a);
else
back(X,Y,c);
a[X][Y]=c;
int main()
FILE *f;
f=fopen("fis.txt","r");
if(!f)
exit(1);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
fscanf(f,"%d",&a[i][j]);
//afisare(a);
int c;
c=a[0][0];
a[0][0]=0;
min=64;
back(0,0,c);
a[0][0]=c;
if(min!=64)
afisare(sol);
nr++;
c=a[0][4];
a[0][4]=0;
min=64;
back(0,4,c);
a[0][4]=c;
if(min!=64)
afisare(sol);
nr++;
c=a[4][0];
a[4][0]=0;
min=64;
back(4,0,c);
a[4][0]=c;
if(min!=64)
afisare(sol);
nr++;
c=a[4][4];
a[4][4]=0;
min=64;
back(4,4,c);
a[4][4]=c;
if(min!=64)
afisare(sol);
fclose(f);
return 0;
//Un participant la un joc de noroc porneste avand la start o suma de bani A. La fiecare tura a jocului,
jucatorul poate pierde sau castiga o suma in valoare fixa B. Sa se gaseasca toate posibilele variante
de desfasurare a jocului (secvente pierdere - castig), astfel incat dupa N runde, jucatorul sa aiba
aceeasi suma de bani (A) ca la start. A, B si N se citesc de la tastatura.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int A,B,n,C;
int *sol;
int solutie(int k)
void afisare()
for(int i=0;i<n;i++)
printf("%d ",sol[i]);
printf("\n");
void back(int k)
for(int i=0;i<2;i++)
if(i==0)
C=C+B;
else
C=C-B;
sol[k]=C;
if(k==n-1)
if(C==A)
afisare();
else
back(k+1);
if(i==0)
C=C-B;
else
C=C+B;
int main()
{
scanf("%d",&A);
scanf("%d",&B);
scanf("%d",&n);
sol=(int*)malloc(n*sizeof(int));
C=A;
sol[0]=A;
if(n>1)
back(1);
else
printf("%d\n",A);
free(sol);
return 0;
//Intre N orase exista o retea de drumuri care permite ca dintr-un oras sa se ajunga in oricare din
celelalte. Intre 2 orase exista cel mult un drum direct, de lungime cunoscuta, iar timpul necesar
pentru parcurgerea unui drum este proportional cu lungimea sa. Se cere sa se realizeze programul
pentru determinarea traseului pe care se poate merge intre doua orase date, intr-un timp minim.
Datele se citesc de la tastatura sau dintr-un fisier.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
int a[100][100];
int min=0,nr;
int fin;
int nod;
int muchie;
}graf;
graf *sol,*s;
int det()
int s=0;
for(int i=0;i<n;i++)
s=s+sol[i].muchie;
return s;
void copiere()
for(int i=0;i<n;i++)
s[i].nod=sol[i].nod;
s[i].muchie=sol[i].muchie;
for(int j=0;j<k;j++)
if(sol[j].nod==i)
return 1;
return 0;
for(int i=0;i<n;i++)
sol[k].nod=i;
sol[k].muchie=a[c][i];
// printf("da");
if(i==fin)
if(nr==0)
min=det();
copiere();
nr=1;
else
if(det()<min)
min=det();
copiere();
nr=k;
else
back(k+1,i);
int main()
FILE *f;
f=fopen("fis.txt","r");
if(!f)
exit(1);
fscanf(f,"%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
fscanf(f,"%d",&a[i][j]);
sol=(graf*)malloc(n*sizeof(graf));
s=(graf*)malloc(n*sizeof(graf));
sol[0].nod=0;
sol[0].muchie=0;
fin=6;
back(1,0);
for(int i=0;i<=nr;i++)
printf("(%d,%d) ",s[i].nod,s[i].muchie);
printf("\n");
return 0;
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int sol[10];
int v=0;
void inter()
int aux;
aux=sol[3];
sol[3]=sol[4];
sol[4]=aux;
void afisare()
inter();
for(int i=0;i<10;i++)
printf("%d",sol[i]);
printf("\n");
inter();
int solutie(int k)
int nr=0;
int ok=0;
inter();
for(int i=3;i<10;i++)
if(sol[i]==0)
nr++;
inter();
void back(int k)
if(k==10)
if(solutie(k))
afisare();
else
{for(int i=0;i<10;i++)
sol[k]=i;
back(k+1);
int main()
sol[0]=0;
sol[1]=7;
sol[2]=2;
sol[3]=4;
back(4);
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int x,y,t;
}back;
back s;
back d;
}sol;
back *a;
sol *s;
int n;
void afisare()
for(int i=0;i<n;i++)
printf("(%d,%d)->(%d,%d)\n",s[i].s.x,s[i].s.y,s[i].d.x,s[i].d.y);
}
int solutie(int k)
return k==n;
int valid(int k)
int i,j;
for(i=0;i<=k;i++)
if(s[i].s.t==s[i].d.t)
return 0;
for(i=0;i<=k-1;i++)
for(j=i+1;j<=k;j++)
return 0;
return 1;
void backa(int k)
if(solutie(k))
afisare();
exit(1);
else
for(int i=0;i<n;i++)
for(int j=n;j<2*n;j++)
{
s[k].s=a[i];
s[k].d=a[j];
if(valid(k))
backa(k+1);
int main()
scanf("%d",&n);
a=(back*)malloc(2*n*sizeof(back));
if(!a)
exit(1);
s=(sol*)malloc(2*n*sizeof(sol));
if(!s)
exit(1);
for(int i=0;i<2*n;i++)
scanf("%d %d",&a[i].x,&a[i].y);
if(i<n)
a[i].t=0;
else
a[i].t=1;
backa(0);
return 0;
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a[100][100];
int sol[100];
int s[100];
int m, n;
int dim = 0;
int mar=0;
//int suma=0;
int maxim=0;
void copiere()
s[i] = sol[i];
int det()
int suma = 0;
return suma;
void afisare()
printf("\n");
printf("\n");
}
int valid(int i, int j)
return i>=0 && i<=m && j>=0 && j<=n && a[i][j] != -1 && a[i][j] >= sol[dim-1];
if (solutie(i, j))
maxim = det();
copiere();
mar = dim;
else
int X, Y,l;
X = i + dx[l];
Y = j + dy[l];
if (valid(X, Y))
sol[dim] = a[X][Y];
a[X][Y] = -1;
dim++;
back(X, Y);
dim--;
a[X][Y] = sol[dim];
}
int main()
scanf("%d", &a[i][j]);
//printf("%d", a[0][1]);
scanf("%d %d",&pi,&pj);
scanf("%d %d",&fi,&fj);
sol[dim] = a[pi][pj];
a[pi][pj] = -1;
dim++;
back(pi, pj);
dim--;
a[pi][pj] = sol[dim];
afisare();
return 0;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i, j;
i = 0;
j = -1;
kmpNext[0] = -1;
j = kmpNext[j];
i++;
j++;
if (pattern[i] == pattern[j])
kmpNext[i] = kmpNext[j];
else
kmpNext[i] = j;
int i, j;
int kmpNext[1024]; // tabloul kmpNext trebuie sa aiba cate o intrare pentru fiecare caracter al
modelului
i = 0;
j = 0;
{
while (i > -1 && pattern[i] != source[j])
i = kmpNext[i];
i++;
j++;
if (i >= pattern_length)
i = kmpNext[i];
int i;
bmNext[i] = pattern_length;
bmNext[pattern[i]] = pattern_length - i - 1;
int i, j;
int bmNext[256];
j = 0;
if (i < 0)
{
printf("Gasit la pozitia %d\n", j);
if (j == 0)
j = 1;
else
j += bmNext[source[i + j]];
else
j += bmNext[source[i + j]];
int main()
printf("Knuth-Morris-Pratt\n");
printf("Boyer-Moore\n");
printf("%s\n%s\n", n, m);
return 0;
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char categorie;
int id;
char destinatie[100];
}colet;
typedef struct categorie{
colet *root;
colet *last;
char nume;
}categorie;
categorie t[4];
int n = 0;
if (n < 4)
t[n].nume = categorie;
t[n].root = NULL;
t[n].last = NULL;
n++;
else
colet *p;
p = (colet *)malloc(sizeof(colet));
if (!p)
exit(1);
p->categorie = categorie;
p->id = id;
strcpy(p->destinatie, destinatie);
p->urm = NULL;
return p;
void adaugare_colet(colet* c)
if (c->categorie == t[i].nume)
if (t[i].root == NULL)
t[i].root = c;
t[i].last = c;
else
t[i].last->urm = c;
t[i].last = c;
break;
if (categorie == t[i].nume)
if (t[i].root != NULL)
colet *p;
p = t[i].root;
printf("Coletul %d a fost livrat la destinatie %s\n", p->id,
p->destinatie);
t[i].root = t[i].root->urm;
free(p);
break;
else
int main()
adaugare_categorie('a');
adaugare_categorie('b');
adaugare_categorie('c');
adaugare_categorie('d');
adaugare_categorie('e');
colet *v[4];
adaugare_colet(v[0]);
adaugare_colet(v[1]);
adaugare_colet(v[2]);
adaugare_colet(v[3]);
livrare_colet('a');
livrare_colet('a');
livrare_colet('b');
return 0;
}
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define N 100
char cod[100];
}muncitor;
int dim;
muncitor t[N];
int n;
}echipa;
echipa *root=NULL;
echipa *p;
p = (echipa*)malloc(sizeof(echipa));
if (!p)
exit(1);
p->id = id;
p->dim = dim;
p->n = -1;
p->urm = NULL;
return p;
muncitor p;
strcpy(p.cod, cod);
return p;
if (root == NULL)
{
root = e;
else
e->urm = root;
root = e;
echipa *p;
p = root;
while (p != NULL)
if (p->id == id)
p->n++;
p->t[p->n] = m;
else
break;
p = p->urm;
}
void detasare(int id)
echipa *p;
p = root;
while (p != NULL)
if (p->id == id)
p->n--;
else
break;
p = p->urm;
int main()
echipa *v[4];
adaugare_echipa(v[0]);
adaugare_echipa(v[1]);
adaugare_echipa(v[2]);
adaugare_echipa(v[3]);
muncitor m1, m2;
m1 = creeare_muncitor("Boss de boss");
m2 = creeare_muncitor("Sef de sef");
adaugare_membru(1, m1);
adaugare_membru(1, m2);
detasare(1);
detasare(1);
detasare(2);
return 0;
● Adaugare categorie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
{
char categorie;
int id;
char nume[35];
}rezervare;
char nume;
rezervare coada[N];
int index;
}categorie;
categorie *root=NULL;
categorie *p;
p = (categorie*)malloc(sizeof(categorie));
if (!p)
exit(1);
p->nume = nume;
p->index = 0;
p->urm = NULL;
rezervare p;
p.categorie = categorie;
p.id = id;
strcpy(p.nume, nume);
return p;
if (root == NULL)
root = c;
else
c->urm = root;
root = c;
void adaugare_rezervare(rezervare r)
categorie *p;
p = root;
while (p != NULL)
if (p->nume == r.categorie)
if (p->index < N)
p->coada[p->index] = r;
p->index++;
else
break;
}
p = p->urm;
void deservire(char c)
categorie *p;
p = root;
while (p != NULL)
if (p->nume == c)
if (p->index > 0)
p->index--;
else
break;
p = p->urm;
void afisare()
{
categorie *p;
p = root;
while (p != NULL)
if (p->index != 0)
else
p = p->urm;
int main()
c1 = creeare_categorie('a');
c2 = creeare_categorie('b');
adaugare_categorie(c1);
adaugare_categorie(c2);
rezervare v[4];
adaugare_rezervare(v[0]);
adaugare_rezervare(v[1]);
adaugare_rezervare(v[2]);
adaugare_rezervare(v[3]);
afisare();
deservire('a');
deservire('b');
afisare();
return 0;
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char nume[100];
int nr_locuri;
}client;
char nume[100];
}pensiune;
pensiune t[10];
int n=3;
client *p;
p = (client*)malloc(sizeof(client));
if (!p)
exit(1);
strcpy(p->nume, nume);
p->nr_locuri = nr_locuri;
p->urm = NULL;
return p;
{
if (categorie == t[i].categorie &&t[i].nr_locuri>=nr_locuri)
if (t[i].root == NULL)
t[i].root = p;
else
p->urm = t[i].root;
t[i].root = p;
return t[i].nume;
return NULL;
client *p,*q;
p = t[i].root;
if (strcmp(p->nume, nume_client) == 0)
t[i].root =t[i].root->urm;
free(p);
return;
q = p;
while (p != NULL)
if (strcmp(p->nume, nume_client) == 0)
q->urm = p->urm;
free(p);
return;
}
q = p;
p = p->urm;
if (categorie == t[i].categorie)
client *p;
p = t[i].root;
while (p != NULL)
p = p->urm;
printf("\n");
}
int main()
t[0].categorie = 1;
t[0].nr_locuri = 10;
t[1].categorie = 2;
t[1].nr_locuri = 10;
t[2].categorie = 3;
t[2].nr_locuri = 10;
rezervare("Nume1", 3, 1);
rezervare("Nume2", 1, 1);
rezervare("Nume3", 2, 1);
afisare(1);
renuntare("Nume2");
afisare(1);
return 0;
}
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 2
char nume[100];
int cod;
int cod_propus;
}angajat;
char nume[100];
int cod;
angajat *root;
}firma;
firma t[N];
int j;
angajat *p;
p = (angajat*)malloc(sizeof(angajat));
if (!p)
exit(1);
strcpy(p->nume, nume);
p->cod = j;
j++;
p->cod_propus = cod;
p->urm = NULL;
return p;
if (t[i].cod == cod_firma)
angajat *p;
p = creeare_angajat(nume, cod);
if (t[i].root == NULL)
t[i].root = p;
else
p->urm=t[i].root;
t[i].root = p;
break;
{
if (t[i].cod == cod_firma)
angajat *p = t[i].root;
while (p != NULL)
if (p->cod == cod_angajat)
return;
p = p->urm;
angajat *p;
angajat *q;
p = t[l].root;
if (p->cod == cod_angajat)
q = p;
t[l].root = t[l].root->urm;
free(p);
return;
p = p->urm;
angajat *y;
y = t[l].root;
while (p != NULL)
if (p->cod == cod_angajat)
q = p;
y->urm = p->urm;
free(p);
return;
y = p;
p = p->urm;
}
}
angajat *p;
p = t[i].root;
while (p != NULL)
if (p->cod == cod)
return p->nume;
p = p->urm;
return ce;
void listare()
p = t[i].root;
while (p != NULL)
char nume[100];
strcpy(nume, cauta(p->cod_propus));
p = p->urm;
printf("|");
printf("\n");
int main()
strcpy(t[0].nume, "NumeFirma1");
t[0].cod = 11;
strcpy(t[1].nume, "NumeFirma2");
t[1].cod = 12;
listare();
mutaangajat(1, 12);
printf("\n");
listare();
return 0;
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct jucator
char nume[100];
int salar;
}jucator;
char nume[100];
jucator *root;
}echipa;
echipa *root;
void initializare()
root = NULL;
echipa *p;
p = (echipa*)malloc(sizeof(echipa));
strcpy(p->nume, nume);
p->root = NULL;
p->urm = NULL;
if (root == NULL)
{
root = p;
else
p->urm = root;
root = p;
echipa *p;
p = root;
root = root->urm;
free(p);
return;
p = p->urm;
echipa *q;
q = root;
while (p != NULL)
q->urm = p->urm;
free(p);
return;
q = p;
p = p->urm;
int cauta_jucator(nume)
echipa *p;
p = root;
while (p != NULL)
jucator *q;
q = p->root;
while (q != NULL)
if (strcmp(q->nume, nume) == 0)
return 1;
q = q->urm;
p = p->urm;
}
return 0;
if (cauta_jucator(nume) == 0)
echipa *p;
p = root;
while (p != NULL)
if (strcmp(p->nume, nume_e) == 0)
jucator *q;
q = (jucator*)malloc(sizeof(jucator));
strcpy(q->nume, nume);
q->salar = salar;
q->urm = NULL;
if (p->root == NULL)
p->root = q;
return;
else
q->urm =p->root;
p->root = q;
return;
jucator *r,*s;
r = p->root->urm;
s = p->root;
while (r != NULL)
s->urm = q;
q->urm = r;
return;
s = r;
r = r->urm;
s->urm = q;
return;
p = p->urm;
echipa *p;
p = root;
while (p != NULL)
jucator *q;
if (p->root != NULL)
q = p->root;
if (strcmp(p->root->nume, nume) == 0)
p->root = p->root->urm;
free(q);
return;
//printf("**");
q = p->root->urm;
jucator *r;
r = p->root;
while (q != NULL)
if (strcmp(q->nume, nume) == 0)
r->urm = q->urm;
free(q);
return;
r = q;
q = q->urm;
p = p->urm;
echipa *p;
p = root;
while (p != NULL)
jucator *q;
q = p->root;
while (q != NULL)
if (strcmp(q->nume, nume) == 0)
return q->salar;
q = q->urm;
}
p = p->urm;
return 0;
if (cauta_jucator(nume) == 1)
eliminare_jucator(nume);
return;
echipa *p;
p = root;
while (p != NULL)
if (strcmp(p->nume, nume) == 0)
jucator *q;
q = p->root;
while (q != NULL)
{
printf("%s %d|", q->nume, q->salar);
q = q->urm;
printf("\n");
return;
p = p->urm;
int main()
initializare();
adaugare_echipa("Fc Vant");
adaugare_echipa("CS Ploaie");
adaugare_echipa("Fc Tunet");
eliminare_echipa("CS Ploaie");
listare("CS Ploaie");
listare("Fc Vant");
listare("Fc Vant");
listare("Fc Tunet");
return 0;
}
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
int m;
int si, sj;
int a[100][100];
int max;
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int det()
{
int sum = 0;
for (int i = 0; i < m;i++)
for (int j = 0; j < n;j++)
if (a[i][j] == -1)
sum++;
return sum;
}
void afisare()
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
if (a[i][j] == -1)
printf("X ");
else
printf("%d ", a[i][j]);
printf("\n");
}
printf("\n");
}
int solutie()
{
//int sum = 0;
for (int i = 0; i < m;i++)
for (int j = 0; j < n;j++)
if (a[i][j] == 0 || a[i][j] == 2)
return 0;
return 1;
}
int valid(int i,int j)
{
return a[i][j] != 1 && a[i][j] != 2 && i >= 0 && i < m && j >= 0 && j <= n && a[i][j]!=-1;
}
void back(int i, int j)
{
if (det() < max)
return;
if (solutie())
{
return;
}
int X, Y,val;
for (int l = 0; l < 4; l++)
{
X = i + dx[l];
Y = j + dy[l];
if (valid(X, Y))
{
val = a[X][Y];
a[X][Y] = -1;
back(X, Y);
//a[X][Y] = val;
}
}
}
int main()
{
scanf("%d", &m);
scanf("%d", &n);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
scanf("%d", &a[i][j]);
printf("Introduceti pozitia robotelului:");
scanf("%d %d", &si, &sj);
//printf("%d %d", si, sj);
a[si][sj] = -1;
back(si, sj);
afisare();
return 0;
}
//Sa se scrie o functie care primeste ca parametru un cuvant si afiseaza toate prefixele acelui
cuvant.
pentru "STUDENT"-> prefixele sunt: S, ST, STU, STUD, STUDE, STUDEN, STUDENT
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
pos[1].x = -1;
pos[1].y = 1;
pos[2].x = 1;
pos[2].y = -1;
pos[3].x = 1;
pos[3].y = 1;
}
void afiseaza_solutia(int n)
{
int i;
for (i = 0; i < n; i++)
printf("X=%d Y=%d\n", a[i].x, a[i].y);
printf("\n");
}
int acceptabil(coordonate pos)
{
return matrice[pos.x][pos.y] != 1 && matrice[pos.x][pos.y] != 2 && pos.x>=0 &&
pos.x<nmax && pos.y>=0 && pos.y<nmax;
}
int solutie(int k, coordonate c, coordonate c_final)
{
return c.x == c_final.x && c.y == c_final.y;
}
void labirint(int k, coordonate c_final) //k pasul, c coordonata curenta
{
int i;
coordonate aux;
if (solutie(k, a[k - 1], c_final)) //solutie completa (avem n elemente)
afiseaza_solutia(k);
else
{
for (i = 0; i < 4; i++) // parcurgem pe rand posibilitatile
{
aux.x = a[k - 1].x + pos[i].x;
aux.y = a[k - 1].y + pos[i].y;
if (acceptabil(aux)) {//daca posibilitatea e acceptabila
a[k] = aux;
matrice[a[k].y][a[k].x] = 2; //marcheaza ca vizitat
labirint(k + 1, c_final); // back1(posibilitate_k+1)
matrice[a[k].y][a[k].x] = 0; //sterge marcajul ca vizitat
}
}
}
} /*labirint*/
int main(void)
{
coordonate c, c2;
initializare(nmax);
printf("Dati valoarea initiala pt x intre (0 si %d): ", nmax);
scanf("%d", &c.x);
printf("Dati valoarea initiala pt y intre (0 si %d): ", nmax);
scanf("%d", &c.y);
printf("Dati valoarea finala pt x intre (0 si %d): ", nmax);
scanf("%d", &c2.x);
printf("Dati valoarea finala pt y intre (0 si %d): ", nmax);
scanf("%d", &c2.y);
if (acceptabil(c) && (acceptabil(c2))) //daca pozitia initala se incadreaza in limitele
hartii si este libera
matrice[c.y][c.x] = 2;
else
printf("Coordonate invalide\n");
a[0] = c; //pasul 0 reprezinta originea
labirint(1, c2);
return 0;
}
//
Să se modeleze un sistem medical în care pacienţii apar la momente aleatoare şi sunt
caracterizaţi printr-o clasă de asigurare (întreg,1,2,...),
un nume şi o prioritate (număr întreg), prioritatea fiind valabilă în cadrul clasei respective. La
anumite momente, medicul-ul tratează câte un
pacient şi anume pe cel de prioritate maximă din clasa ce conţine numărul maxim de pacienţi.
Să se definească o listă înlănţuită principală
pentru clase şi tablouri secundare pentru pacienţi şi să se implementeze operatorii:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct pacient
{
int clasa;
char nume[100];
int prio;
}pacient;
typedef struct clasa
{
int nr;
pacient t[100];
int n;
struct clasa *urm;
}clasa;
clasa *root = NULL;
int sterge(char *nume,clasa *p)
{
for (int i = 0; i < p->n; i++)
{
if (strcmp(p->t[i].nume, nume) == 0)
{
for (int j = i; j < p->n - 1; j++)
p->t[j] = p->t[j + 1];
p->n--;
return 1;
}
}
return 0;
}
void inserare(pacient t[100], pacient p, int poz,int *n)
{
(*n)++;
for (int i = (*n)-1; i > poz; i--)
t[i] = t[i - 1];
t[poz] = p;
}
void actualizare_pacient(char *nume, int clasa_noua, int prio)
{
clasa *p;
p = root;
while (p != NULL)
{
if (sterge(nume, p) == 1)
break;
p = p->urm;
}
p = root;
while (p != NULL)
{
if (p->nr == clasa_noua)
{
pacient q;
q.clasa = clasa_noua;
strcpy(q.nume, nume);
q.prio = prio;
for (int i = 0; i < p->n;i++)
if (q.prio>p->t[i].prio)
{
inserare(p->t, q, i,&(p->n));
return;
}
}
p = p->urm;
}
}
void listare()
{
clasa *p;
p = root;
while (p!=NULL)
{
for (int i = 0; i < p->n; i++)
printf("Clasa:%d Nume:%s Prioritate:%d |", p->nr, p->t[i].nume,
p->t[i].prio);
printf("\n");
p = p->urm;
}
}
clasa* creeare(int nr)
{
clasa *p;
p = (clasa*)malloc(sizeof(clasa));
p->n = 0;
p->nr = nr;
p->urm = NULL;
return p;
}
void adauga_clasa(clasa *p)
{
if (root == NULL)
root = p;
else
{
p->urm = root;
root = p;
}
}
void adaugare_pacient(clasa *p, pacient a)
{
p->t[p->n++] = a;
}
pacient creeare_pacient(char *nume, int clasa, int prio)
{
pacient p;
strcpy(p.nume, nume);
p.clasa = clasa;
p.prio = prio;
return p;
}
int main()
{
adauga_clasa(creeare(3));
adauga_clasa(creeare(2));
adauga_clasa(creeare(1));
adaugare_pacient(root->urm, creeare_pacient("Nume1", 2, 3));
adaugare_pacient(root->urm, creeare_pacient("Nume2", 2, 3));
adaugare_pacient(root->urm, creeare_pacient("Nume3", 2, 3));
adaugare_pacient(root->urm->urm, creeare_pacient("Nume4", 3, 3));
adaugare_pacient(root, creeare_pacient("Nume5", 1, 4));
listare();
actualizare_pacient("Nume2", 1, 5);
listare();
return 0;
}
//
Să se scrie un program folosind liste simplu înlănţuite combinate cu tablouri pentru modelarea
cât mai eficientă din punct de vedere al timpului
de rulare a situaţiei dintr-o firma software în care proiectele pot fi adăugate sau retrase în orice
moment iar angajatii pot fi asignati sau
retrasi de la un anumit proiect în orice moment. Programul va putea efectua operaţii asupra unui
număr arbitrar de proiecte şi va trebui să
implementeze următorii operatori:
* transferă_angajat(nume_angajat, nume_proiect_nou) – transferă angajatul dat prin numele
său la un nou proiect;
* listare_proiecte() – pentru fiecare proiect listează angajatii din echipa de proiect în ordine
invers alfabetica.
Se va descrie în cuvinte rolul fiecărei structuri de date folosite si a fiecărei funcţii implementate.