Escolar Documentos
Profissional Documentos
Cultura Documentos
Sdaawa
Sdaawa
struct undoRedo
{
capete *capCopie;
cursor *capCursor;
unsigned int lenght;
};
typedef struct undoRedo stiva;
2
p = (nod*)malloc(sizeof(nod));
if((c = fgetc(f)) != EOF)
{
(*CapDeLista)->next = p;
(*CapDeLista)->prev = NULL;
p->prev = *CapDeLista;
p->c = c;
p->next = NULL;
}
while((c = fgetc(f)) != EOF)
{
q = (nod*)malloc(sizeof(nod));
q->c = c;
p->next = q;
q->next = NULL;
q->prev = p;
p = q;
}
fclose(f);
}
3
int i,n;
nod *p;
n = strlen(string);
for(i=0;i<n;i++)
{
p = (nod*)malloc(sizeof(nod));
if((*cursor)->next != NULL)
{
p->next = (*cursor)->next;
(*cursor)->next->prev = p;
(*cursor)->next = p;
p->prev = *cursor;
p->c = string[i];
(*cursor) = p;
}
else
{
p->next = NULL;
p->c = string[i];
(*cursor)->next = p;
p->prev = (*cursor);
(*cursor) = p;
}
}
}
else if(cursor->next)
{
aux = cursor->next;
cursor->next = NULL;
4
free(aux);
break;
}
}
}
}
void paste(nod **cursor,char buffer[])
{
insert_string(cursor,buffer);
}
void backspace(nod **cursor)
{
nod *aux;
if((*cursor)->c && (*cursor)->next != NULL)
{
aux = (*cursor);
(*cursor)->prev->next = (*cursor)->next;
(*cursor)->next->prev = (*cursor)->prev;
(*cursor) = (*cursor)->prev;
free(aux);
}
else if((*cursor)->c)
{
aux = (*cursor);
(*cursor)->prev->next = NULL;
(*cursor) = (*cursor)->prev;
free(aux);
}
}
5
stiva *creeaza_stiva()
{
stiva *stack;
stack = (stiva*)malloc(sizeof(stiva));
stack->lenght = 0;
stack->capCopie = (capete*)malloc(sizeof(capete));
stack->capCopie->capCurent = NULL;
stack->capCopie->capNext = NULL;
stack->capCursor = NULL;
return stack;
}
}
void push_stiva(stiva *stack,nod *cap,int pozitie_cursorr)
{
nod *capDel,*p;
6
cursor *crs;
int i;
capDel = (nod*)malloc(sizeof(nod));
crs = (cursor*)malloc(sizeof(cursor));
copiaza_lista(cap,&capDel);
if(stack->capCursor == NULL)
{
crs->pozitie_cursor = pozitie_cursorr;
crs->next = NULL;
stack->capCursor = crs;
}
else
{
crs->next = stack->capCursor;
crs->pozitie_cursor = pozitie_cursorr;
stack->capCursor = crs;
}
if (stack->capCopie->capCurent == NULL)
{
stack->capCopie->capNext = NULL;
stack->capCopie->capCurent = capDel;
}
else
{
stack->capCopie->capNext = stack->capCopie->capCurent;
stack->capCopie->capCurent = capDel;
}
stack->lenght++;
}
7
}
}
p = p->next;
}
}
8
p = cap;
while(p)
{
aux = p;
p = p->next;
free(aux);
}
}
while(pop_stiva(redo,&cap,°eaba) != 0)
{
p = cap;
while(p)
{
aux = p;
p = p->next;
free(aux);
}
}
}
citire_text(f,argv[1],&CapDeLista);
cursor = CapDeLista;
undo = creeaza_stiva();
redo = creeaza_stiva();
f = fopen(argv[2],"rt");
if(f == NULL)
{
printf("Fisierul de operatii nu a putut fi deschis!\n");
exit(1);
}
fscanf(f,"%d",&nr);
while((fscanf(f,"%s",operatie)) != EOF)
9
{
if(strcmp(operatie,"del") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
fscanf(f,"%d",&nr);
sterge_n(cursor,nr);
}
else if(strcmp(operatie,"move") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
fscanf(f,"%d",&nr);
pozitie_cursor = pozitie_cursor + nr;
move(&cursor,nr);
}
else if(strcmp(operatie,"copy") == 0)
{
fscanf(f,"%d",&nr);
copy_n(cursor,nr,&buffer);
}
else if(strcmp(operatie,"paste") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
pozitie_cursor = pozitie_cursor + strlen(buffer);
paste(&cursor,buffer);
}
else if(strcmp(operatie,"insert") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
fscanf(f,"%s",deInserat);
pozitie_cursor = pozitie_cursor + strlen(deInserat);
insert_string(&cursor,deInserat);
}
else if(strcmp(operatie,"backspace") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
pozitie_cursor = pozitie_cursor - 1;
backspace(&cursor);
}
else if(strcmp(operatie,"undo") == 0)
{
push_stiva(redo,CapDeLista,pozitie_cursor);
pop_stiva(undo,&CapDeLista,&poz2);pozitie_cursor = poz2;
cursor = CapDeLista;
move(&cursor,poz2);
10
}
else if(strcmp(operatie,"redo") == 0)
{
push_stiva(undo,CapDeLista,pozitie_cursor);
pop_stiva(redo,&CapDeLista,&poz2);
pozitie_cursor = poz2;
cursor = CapDeLista;
move(&cursor,poz2);
}
else if(strcmp(operatie,"replace") == 0)
{
fscanf(f,"%s",cuvant);
fscanf(f,"%s",cuvant_nou);
push_stiva(redo,CapDeLista,pozitie_cursor);
find_replace(CapDeLista,cuvant,cuvant_nou);
}
}
fclose(f);
f = fopen(argv[3],"wt");
if(f == NULL)
{
printf("Fisierul rezultat.out nu a putut fi creat!\n");
exit(1);
}
p = CapDeLista->next;
while(p != NULL)
{
fprintf(f,"%c",p->c);
p = p->next;
}
fclose(f);
free(cuvant);
free(cuvant_nou);
free_mem(CapDeLista,undo,redo);
return 0;
}
11
/* arbrecc.c - arbore, construit recursiv, ce contine cuvinte, si numarul
de aparitie a acestora, citite de la tastatura (cate un cuvant pe linie)
introducerea cuvintelor se termina cu un cuvant vid (Enter la inceputul
liniei), si apoi sunt afisate cuvintele in ordine alfabetica */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define LUNGMAX 20
struct st_arbore
{
char *cuvant; /* pointer la cuvantul citit */
int nrap; /* numarul de aparitii */
struct st_arbore *st, *dr;
};
int nle=0;
12
altfel se incrementeaza contorul de aparitii al
nodului corespunzator cuvantului citit anterior.
Se determina pe care ramura a arborelui se va insera
cuvantul, sau daca exista deja
*/
if (strcmp(cuv, arb->cuvant) < 0)
if (arb->st)
actualizare (arb->st, cuv);
else {
arb->st=(struct st_arbore *) malloc (sizeof(struct st_arbore)) ;
arb=arb->st;
arb->cuvant=cuv;
arb->nrap=1;
arb->st=NULL;
arb->dr=NULL;
}
else if (strcmp(cuv, arb->cuvant) >0 )
if(arb->dr)
actualizare (arb->dr, cuv);
else {
arb->dr=(struct st_arbore *) malloc (sizeof(struct st_arbore)) ;
arb=arb->dr;
arb->cuvant=cuv;
arb->nrap=1;
arb->st=NULL;
arb->dr=NULL;
}
else
arb->nrap=arb->nrap + 1;
}
13
}
tiparire_arbore (arbo->dr) ; /* tiparire arbore dreapta */
}
}
void main ()
{struct st_arbore *arb;
char cuvant[LUNGMAX] ;
clrscr();
printf("Introduceti cuvinte, care vor fi apoi tiparite in ordine"
" alfabetica:\n");
gets(cuvant) ;
arb=(struct st_arbore *) malloc (sizeof(struct st_arbore)) ;
/* am presupus ca nu se returneaza de catre malloc
valoarea NULL */
arb->cuvant=strdup(cuvant);
arb->nrap=1;
arb->st=NULL;
arb->dr=NULL;
gets(cuvant) ;
while (strcmp(cuvant, ""))
{actualizare (arb, strdup(cuvant));
gets(cuvant);
}
printf("Lista ordonata a cuvintelor (numar aparitii):\n");
tiparire_arbore (arb);
}
14
struct st_cuvant * atasare_coada (struct st_cuvant *ultim, char *sirc)
{
struct st_cuvant *vr;
vr=(struct st_cuvant *) malloc(sizeof(struct st_cuvant));
if (vr) /* daca s-a putut crea un pointer se continua atasarea */
{
vr->cuvant=strdup(sirc);
vr->urmator=NULL;
ultim->urmator=vr;
}
return (vr);
}
void main()
{
struct st_cuvant *primul, *ultimul;
char cuv[DIMCV];
clrscr();
printf("Programul construieste o lista de tip coada cu cuvinte de la"
" tastatura\n");
printf("Programul ia sfarsit cu un cuvant vid, adica RETURN,"
" la inceput de linie.\n");
printf("Cuvant de introdus in lista:");
gets(cuv);
primul=(struct st_cuvant *) malloc(sizeof(struct st_cuvant));
primul->cuvant=strdup(cuv);
primul->urmator=NULL;
ultimul=primul;
printf("Cuvant de introdus in lista:");
15
gets(cuv);
while (strcmp(cuv, SIR_VID))
{
if(!(ultimul=atasare_coada (ultimul, cuv)))
break;
printf("Cuvant de introdus in lista:");
gets(cuv);
}
extragere (primul);
}
16
daca p si u ocupa aceeasi pozitie coada are un singur element:
x x x x x p(u) x x x x , p si u au aceeasi valoare */
return (IncIndexC (pc->ultim) == pc->prim);
}
17
TCoada c=*pc;
ACoada pt=&c;
int nvl=0; /* Numar de valori afisate pe linie */
if (CoadaGoala(pt))
eroare("Coada Goala !!!\n");
else
while (!CoadaGoala (pt))
{printf ("%d -> ", CapCoada (pt));
ScotElC (pt);
if (++nvl % 10 == 0)
printf("\n");
}
printf("NULL\n");
}
18
}
fflush(stdin);
break;
case 'e':
case 'E': optiune[0]='D';
while ( !CoadaGoala (pc) &&
(optiune[0] == 'D' || optiune[0] == 'd') )
{printf ("Se extrage primul element din coada: %d\n",
CapCoada (pc));
ScotElC (pc);
if (!CoadaGoala (pc)){
printf("Continuati extragerea (Da/Nu): ");
gets(optiune);
fflush(stdin);
}
}
if (CoadaGoala (pc))
printf("Coada Goala !!! INTRODUCETI ELEMENTE \n");
break;
case 'c':
case 'C': if (!CoadaGoala (pc))
printf("Afisare element din capul cozii: %d\n",
CapCoada (pc));
else
eroare("Coada Goala !!!\n");
break;
case 'a':
case 'A':AfisareCoada (pc);
break;
case 'p':
case 'P': Afisare_Poz_Prim_Ultim (pc);
break;
}
printf("\nOptiuni Int, Ext, Afis coada, Cap coada, Poz p/u, Stop: ");
gets(optiune);
}
}
/* coadatbv.c - operatii cu o coada realizata static intr-un tablou;
operatii disponibile: inserare, extragere, afisare cap coada,
afisare coada, afisare pozitii referinte la primul si ultimul
element din coada
Varianta: pentru afisare nu se creaza o copie a cozii, ci se
utilizeaza doi indecsi locali in functia Afisare CoadaV (pc) */
#include <stdio.h>
19
#include <conio.h>
#define MaxC 10
20
}
21
pc->prim, pc->ultim);
}
22
printf("Coada Goala !!! INTRODUCETI ELEMENTE \n");
break;
case 'c':
case 'C': if (!CoadaGoala (pc))
printf("Afisare element din capul cozii: %d\n",
CapCoada (pc));
else
eroare("Coada Goala !!!\n");
break;
case 'a':
case 'A':AfisareCoadaV (pc);
break;
case 'p':
case 'P': Afisare_Poz_Prim_Ultim (pc);
break;
}
printf("\nOptiuni Int, Ext, Afis coada, Cap coada, Poz p/u, Stop: ");
gets(optiune);
}
}
23
vr->cuvant=strdup(sirc);
vr->urmator=NULL;
ultim->urmator=vr;
}
return (vr);
}
void main()
{
struct st_cuvant *primul, *ultimul;
char cuv[DIMCV];
clrscr();
printf("Programul construieste o lista de tip coada cu cuvinte de la"
" tastatura\n");
printf("Programul ia sfarsit cu un cuvant vid, adica RETURN,"
" la inceput de linie.\n");
printf("Cuvant de introdus in lista:");
gets(cuv);
primul=ultimul=NULL;
while (strcmp(cuv, SIR_VID))
{
if(!(ultimul=atasare_coada (ultimul, cuv)))
break;
if (!primul)
primul=ultimul;
printf("Cuvant de introdus in lista:");
gets(cuv);
}
extragere (primul);
24
}
}
}
25
while (p != plc)
{printf("%c -> ", p->car);
p=p->urm;
ncl++;
if (ncl%10==0) /* s-au afisat 10 caractere pe linie ? */
printf("\n");
}
if (plc->urm!=plc)
printf("%c (primul).\n", plc->urm->car);/* tiparire primul caracter sau
NULL daca lista este vida */
else
printf("NULL");
}
void main()
{
struct st_litera *primul;
char ch;
primul->urm=primul->pred=primul; /* lista vida */
printf("\nProgramul construieste si afiseaza o lista circulara de char.\n");
printf("Introduceti caractere (CTRL-Z, Enter-pentru sfarsit):\n");
atasare(primul);
printf("\nLista circulara construita este:\n");
afis_list_circ(primul);
printf("Caracterul de cautat in lista: ");
ch=getch();
primul->car=ch; /* se pune caracterul de cautat in santinela/ start */
printf("\nCaracterul \'%c\' este in lista de %d ori\n",
26
ch, numar_aparitii_car(primul, &ch));
}
void main()
{
struct st_numar *inserare (struct st_numar *, int );
struct st_numar *prim, *vr;
int nr;
clrscr();
printf("Programul construieste o lista ordonata, de numere distincte.\n");
printf("Introducerea numerelor se termina cu o valoare nenumerica.\n");
printf("Numar de inserat in lista: ");
prim=(struct st_numar *) malloc(sizeof (struct st_numar));
scanf("%d", &prim->numar); /* citire numar de introdus in lista */
prim->next=NULL;
printf("Numar de inserat in lista: ");
while (scanf("%d", &nr)==1){
prim=inserare (prim, nr);
printf("Numar de inserat in lista: ");
}
/* tiparirea listei introduse cu eliberarea memoriei alocate */
printf("\nLista de numere ordonata este:\n");
while (prim)
{vr=prim; /* variabila auxiliara pentru a apela functia free() */
printf("%d -> ", vr->numar);
nvl++;
if (nvl%8==0) /* daca s-au tiparit 8 valori pe linie */
printf("\n"); /* se trece pe o linie noua */
prim=prim->next;
free(vr); /* eliberare memorie alocata pentru vr */
}
printf("NULL\n"); /* tiparire sfarsit de lista */
}
27
struct st_numar *inserare (struct st_numar *primul, int n){
/* daca nu se mai poate aloca memorie se rutrneaza poiterul NULL,
altfel se returneaza pointerul la primul numar din lista,
care se poate modifica daca se insereaza un numar mai mic
decat primul din lista */
struct st_numar *anterior, *curent, *vr;
vr=(struct st_numar *) malloc(sizeof(struct st_numar));
if (vr == NULL){
printf("\nNu mai introduceti numere!!!\nMEMORIE PLINA!!!\n");
return (primul);
}
else
{
vr->numar=n;
anterior=NULL; /* initializare pointeri 'anterior' si 'curent' */
curent=primul; /* pentru det. pozitie element de inserat, vr */
while (curent != NULL && vr->numar > curent->numar)
{
anterior=curent;
curent=curent->next;
} /* vr trebuie inserat intre anterior si curent */
if(vr->numar == curent->numar) /* daca numarul exista in lista */
{free(vr); /* elibereaza spatiul alocat variabilei 'vr' */
return (primul); /* nu mai insereaza si termina inserarea */
}
vr->next=curent;
if (anterior == NULL) /* se insereaza in fata primului din lista */
primul=vr; /* este pus primul in lista */
else
anterior->next=vr; /* este pus dupa 'anterior' */
return (primul);
}
}
/* listrec1.cpp - programul construieste o lista de cuvinte, introduse
de la tastatura, pe care apoi le afiseaza, utilizand functii recursive:
atsare - pentru construire lista, si
afisare - pentru afisare lista;
Varianta 2: elementul din lista contine adresa cuvantului citit,
pentru care se aloca spatiu (strdup) la citire;
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
28
#define SIR_VID ""
#define DIMC 25
int nvl=0;
struct st_cuvant
{
char *cuvant; /* pointer la sirul de caractere (cuvant) */
struct st_cuvant *urmator;
};
int atasare (struct st_cuvant * vr)
{ /* citeste un cuvant, creaza o variabila dinamica vr si o ataseaza
la lista */
char cuv[DIMC], *pc;
if (vr->urmator==NULL) /* daca referinta este NULL se ceaza un pointer */
{
vr->urmator=(struct st_cuvant *)malloc(sizeof(struct st_cuvant));
if (vr->urmator==NULL)
return (0);
else
{
gets(cuv);
if (!strcmp(cuv,SIR_VID))
{vr->urmator=NULL;
return(0);
}
else
{if(!(pc=strdup(cuv)))
{vr->urmator=NULL;
return(0);
}
else
{
vr=vr->urmator;
vr->urmator = NULL;
vr->cuvant=pc;
return (1);
}
}
}
}
else /* daca s-a putut crea un pointer se continua atasarea */
return(atasare (vr->urmator));
}
29
{
if (curent)
{
printf ("%s -> ", curent -> cuvant);
nvl++;
if(nvl%5==0)
printf("\n");
afisare (curent -> urmator);
}
}
void main()
{
struct st_cuvant *primul;
char c[DIMC];
clrscr();
printf("Programul construieste o lista de tip coada cu cuvinte de la"
" tastatura\n");
printf("Programul ia sfarsit cu un cuvant vid, adica RETURN,"
" la inceput de linie.\n");
gets(c);
primul->cuvant=strdup(c);
primul->urmator=NULL;
while (atasare(primul));
afisare (primul);
printf("NULL\n");
}
30
struct st_cuvant *urmator;
};
int atasare (struct st_cuvant * vr)
{ /* citeste un cuvant, creaza o variabila dinamica vr si o
ataseaza la lista */
char cuvcit[DIMC];
if (vr->urmator==NULL) /* daca referinta este NULL se ceaza un pointer */
{
vr->urmator=(struct st_cuvant *)malloc(sizeof(struct st_cuvant));
if (vr->urmator==NULL)
return (0);
else
{gets(cuvcit);
if (!strcmp(cuvcit,SIR_VID))
{vr->urmator=NULL;
return(0);
}
else {
vr=vr->urmator;
vr->urmator=NULL;
strcpy(vr->cuvant, cuvcit);
return (1);
}
}
}
else /* daca s-a putut crea un pointer se continua atasarea */
return(atasare (vr->urmator));
}
void main()
{
struct st_cuvant *primul;
31
clrscr();
primul=(struct st_cuvant *) malloc(sizeof(struct st_cuvant));
printf("Programul construieste o lista de tip coada cu cuvinte "
"de la tastatura\n");
printf("Programul ia sfarsit cu un cuvant vid, adica RETURN,"
" la inceput de linie.\n");
gets(primul->cuvant);
primul->urmator=NULL;
while (atasare(primul));
afisare (primul);
printf("NULL\n");
}
32
primul caracter */
while (vr != NULL)
{
printf("%c -> ", vr->car);
vr=vr->urmator;
}
printf(" NULL");/* tiparire sfarsit lista caractere sau lista vida daca
primul era NULL */
}
33
/* introduce element in stiva, daca nu este plina */
if (StivaPlina (rs))
eroare ("Stiva Plina !!!");
else {rs->sp=rs->sp+1;
rs->elem[rs->sp]=el;
}
}
34
printf("\n");
}
printf("NULL\n");
}
35
{printf ("Se extrage primul element din stiva: %d\n",
CapStiva (rs));
Pop (rs);
if (!StivaGoala (rs)){
printf("Continuati extragerea (Da/Nu): ");
gets(optiune);
fflush(stdin);
}
}
if (StivaGoala (rs))
printf("Stiva Goala !!! INTRODUCETI ELEMENTE \n");
break;
case 'c':
case 'C': if (!StivaGoala (rs))
printf("Afisare element din capul stivei: %d\n",
CapStiva (rs));
else
eroare("Stiva Goala !!!\n");
break;
case 'a':
case 'A':AfisareStiva (rs);
break;
case 'p':
case 'P': Afisare_Poz_sp (rs);
break;
}
printf("\nOptiuni Int, Ext, Afis stiva, Cap stiva, Poz sp, Stop: ");
gets(optiune);
}
}
36
/* index/ referinta la varful stivei (stack pointer) */
} TStiva, *AStiva;
37
ElTip CapStiva (AStiva rs){
if (StivaGoala (rs))
{eroare ("Stiva Goala !!!");
return 0;
}
else
return rs->elem[rs->sp];
}
38
while (optiune[0] != '\0' && optiune[0] != 's' && optiune[0] != 'S'){
switch(optiune[0]){
case 'i':
case 'I':if (StivaPlina(rs)){
eroare("\n\tSTIVA PLINA !!! ELIMINATI...\n");
break;}
printf("Introd. nr. (CTRL-Z, Enter-Stop Introd): ");
while (scanf("%d", &n) == 1 && !StivaPlina(rs)){
Push (rs, n);
if (StivaPlina (rs)){
eroare("Stiva PLINA !!! ELIMINATI.....\n");
break;
}
printf("Introd. nr. (CTRL-Z, Enter-Stop Introd): ");
}
fflush(stdin);
break;
case 'e':
case 'E': optiune[0]='D';
while ( !StivaGoala (rs) &&
(optiune[0] == 'D' || optiune[0] == 'd') )
{printf ("Se extrage primul element din stiva: %d\n",
CapStiva (rs));
Pop (rs);
if (!StivaGoala (rs)){
printf("Continuati extragerea (Da/Nu): ");
gets(optiune);
fflush(stdin);
}
}
if (StivaGoala (rs))
printf("Stiva Goala !!! INTRODUCETI ELEMENTE \n");
break;
case 'c':
case 'C': if (!StivaGoala (rs))
printf("Afisare element din capul stivei: %d\n",
CapStiva (rs));
else
eroare("Stiva Goala !!!\n");
break;
case 'a':
case 'A':AfisareStivaV (rs);
break;
case 'p':
39
case 'P': Afisare_Poz_sp (rs);
break;
}
printf("\nOptiuni Int, Ext, Afis stiva, Cap stiva, Poz sp, Stop: ");
gets(optiune);
}
}
40
printf("%c -> ", vr->car);
vr=vr->urmator;
}
printf(" NULL");/* tiparire sfarsit lista caractere sau lista vida daca
primul era NULL */
}
int distinct (struct st_lista *prim, char ch)
{
struct st_lista *ptr;
int gasit;
ptr=prim; /* initializare pointer curent cu primul din lista */
gasit=0; /* presupunem ca nu l-am gasit inca */
while (ptr != NULL && !gasit) /* cat timp nu s-a terminat lista si nu
l-am gasit */
{ /* se continua parcurgerea listei */
gasit=(ptr->car == ch);
ptr=ptr->urmator;
}
return (!gasit);
}
/* HeapSMax.c - Ord. descresc., prin selectie Heapsort:
construim Heap-ul, arborele de selectie, memorat intr-un
vector, dupa care se interschmba prima valoare (maximul)
cu ultima si in vectorul ramas (n-1) se construieste
din nou Heap-ul, s.a.m.d.
*/
#include<stdio.h>
#include <conio.h>
void cerne (double a[], int l, int r)
{
int i,j;
double x;
i=l; j=2*i; x=a[i]; /* x ce se cerne prin arbore/ vector */
while (j<=r){
if (j<r) /* nu s-a ajuns la capat */
if (a[j]<a[j+1]) /* j-ind. val. mai mare din */
j++; /* perechea (2*i, 2*i + 1) */
if (x>a[j]) /* daca x > valoarea respectiva (j) */
goto gata; /* altfel, se muta */
a[i]=a[j]; /* valoarea mai mare a[j] la a[i], si se */
i=j; j=2*i; /* continua cernerea pe nivelul urmator */
} /* noul i devine j (vechi i), iar j=2i, daca j<r */
gata: a[i]=x; /* pune x in poz. i, a[i]<a[2i], a[i]<a[2i+1] */
}
41
void heapsort(double a[], int n){
int i, l, r;
double x;
l=(n/2)+1; r=n;
while (l>1){
l--;
cerne(a,l,r);
for( i = 1 ; i <= n ; ++i ){
printf (" %0.lf ", a[i]);
if (i%10==0)
printf("\n");
}
printf("\nApasa o tasta pentru continuare program!\n");
getch();
}
while(r>1)
{x=a[1];
a[1]=a[r];
a[r]=x;
r--;
cerne(a,l,r);
for( i = 1 ; i <= n ; ++i ){
printf (" %0.lf ", a[i]);
if (i%10==0)
printf("\n");
}
printf("\nApasa o tasta pentru continuare program!\n");
getch();
}
}
void main(void)
{
double sir[1000];
int ne, i;
clrscr();
printf("HeapSort pentru ordonare crescatoare vector.\n");
printf ("Numarul de elemente: ");
scanf ("%d",&ne);
for ( i = 1 ; i <= ne ; ++i)
{
printf (" sir(%d)=", i);
scanf ("%lf", &sir[i]);
42
}
heapsort(sir,ne);
for( i = 1 ; i <= ne ; ++i ){
printf (" %0.lf ", sir[i]);
if (i%10==0)
printf("\n");
}
printf("\nPROGRAM TERMINAT! Apasa o tasta-iesire!!!\n");
getch();
}
43
cerne(a,l,r);
for( i = 1 ; i <= n ; ++i ){
printf (" %0.lf ", a[i]);
if (i%10==0)
printf("\n");
}
printf("\nApasa o tasta pentru continuare program!\n");
getch();
}
while(r>1)
{x=a[1];
a[1]=a[r];
a[r]=x;
r--;
cerne(a,l,r);
for( i = 1 ; i <= n ; ++i ){
printf (" %0.lf ", a[i]);
if (i%10==0)
printf("\n");
}
printf("\nApasa o tasta pentru continuare program!\n");
getch();
}
}
void main(void)
{
double sir[1000];
int ne, i;
clrscr();
printf ("Numarul de elemente: ");
scanf ("%d",&ne);
for ( i = 1 ; i <= ne ; ++i)
{
printf (" sir(%d)=", i);
scanf ("%lf", &sir[i]);
}
heapsort(sir,ne);
for( i = 1 ; i <= ne ; ++i ){
printf (" %0.lf ", sir[i]);
if (i%10==0)
printf("\n");
}
printf("\nPROGRAM TERMINAT! Apasa o tasta-iesire!!!\n");
44
getch();
}
/*
ins_bin.c - prog. de ordonare cresc. sir, utilizand metoda de inserare binara,
adica: se considera un sir ordonat, format initial din primul element din
sirul initial, si un sir neordonat, format din restul elementelor sirului,
din care se iau pe rand celelalte elemente si li se cauta, de la dreapta
la stanga, pozitia in sirul ordonat, construit tot in sirul initial.
Cautarea se face utilizand metoda "binara".
*/
#include<stdio.h>
#include <conio.h>
int ncomp=0, nins=0; /* numar de comparatii si inserari/deplasari */
void main(void){
double sir[100]; int ne,i;
clrscr();
printf("Numar elemente:");
scanf("%d", &ne);
for(i=0; i<ne; i++) /* citire sir de ordonat */
45
{
printf("sir(%d)= ", i+1);
scanf("%lf", &sir[i]);
}
printf("Sirul ordonat este: \n");
sort_ins_binara(sir , ne);/* apelul functiei de sortare binara */
for (i=0;i<ne;i++) /* afisare sir ordonat */
{
printf(" sir (%2d) = %lf \n", i+1, sir[i]);
if ((ne+1)%4==0) /* tiparesc cate 4 valori pe linie */
printf("\n");
}
printf("\n");
printf("Ordonarea s-a realizat prin %d comparatii si %d deplasari\n",
ncomp, nins);
}
/* ins_dir.c- prog. ordonare cresc. sir, utilizand metoda de inserare directa, adica:
se considera un sir ordonat, format initial din primul element din sirul initial,
si un sir neordonat, format din restul elementelor sirului, din care se iau pe
rand celelalte elemente si li sa cauta, de la dreapta la stanga, pozitia in
sirul ordonat, construit tot in sirul initial. */
#include <stdio.h>
#include <conio.h>
int ncomp=0, nins=0; /* numar de comparatii si inserari/ deplasari */
46
void main()
{
double sir[100];
int ne, i;
clrscr();
printf("Numar elemente:");
scanf("%d", &ne);
for(i=0; i<ne; i++) /* citirea elementelor sirului de sortat */
{
printf("sir(%d)= ", i+1);
scanf("%lf", &sir[i]);
}
sort_ins_direct (sir, ne); /* ordonarea sirului prin inserare directa */
printf("\n Sirul ordonat:\n");
for(i=0; i<ne; i++) /* afisare sir ordonat */
{
printf(" sir(%d)=%5.2lf ", i+1, sir[i]);
if ( (i+1) %5 == 0 ) /* daca s-au afisat 5 valori din sir pe o linie */
printf("\n"); /* se trece pe o linie noua */
}
printf("\n");
printf("Ordonarea s-a realizat prin %d comparatii si %d deplasari\n",
ncomp, nins);
47
MergeSort(v, p, m);
MergeSort(v, m+1, q);
Interclasare(v, p, q, m);
}
}
void main()
48
{int vector[]={10, 5, 6, 12, 3, 7, 15, 12, 9, 4, 3};
int ne=11;
clrscr();
MergeSort(vector, 0, ne-1);
scrie_vector(vector, ne);
printf("\nApasati o tasta pentru a termina programul!\n");
getch();
}
49
a[i]=a[j];
a[j]=t;
i++; j--;
ninv++;
}
} while(i<=j);
if (i<d){ /* depun in stiva cererea de a sorta */
is++; /* partitia dreapta */
stiva[is].s=i;
stiva[is].d=d;
}
d=j; /* se continua sortarea partitiei stanga, (s, d) */
} while (s<d); /* pana are un singur element (s==d) */
}while (is>0); /* se reia sortarea pentru partitiile stanga */
} /* ramase nerezolvate, in stiva */
void main(void)
{int n;
VECTOR v;
clrscr();
printf("Programul ordoneaza (sorteaza) un vector cu alg. QuickSort.\n");
printf("Dimensiune vector, n=");scanf("%d", &n);
cit_vect(n, v);
QuickSortit (v, n);
printf("\nVectorul ordonat este:\n");
scrie_vect(n, v);
printf("Sortarea s-a realizat dupa %d comparatii si %d inversiuni\n",
ncomp, ninv);
getch();
}
50
void scrie_vect(int n, VECTOR v)
{int i;
for(i=0; i<n; i++)
printf("v[%d]=%d\n", i+1, v[i]);
}
void main(void)
{int n;
VECTOR v;
clrscr();
printf("Programul ordoneaza (sorteaza) un vector cu alg. QuickSort.\n");
printf("Dimensiune vector, n=");scanf("%d", &n);
cit_vect(n, v);
QuickSort(v, 0, n-1);
printf("\nVectorul ordonat este:\n");
scrie_vect(n, v);
printf("Sortarea s-a realizat dupa %d comparatii si %d inversiuni\n",
ncomp, ninv);
getch();
}
51
/* sel_dir.c - programul ordoneaza un vector prin selectie directa,
utilizand pentru aceasta determinarea minimului si a pozitiei lui,
la fiecare iteratie si realizand o singura inversiune intre acest
minim si valoarea a[i], corespunzatoare iteratiei curente;
se determina si numarul de comparatii si inversiuni realizate
*/
#include<stdio.h>
#include <conio.h>
int ncomp=0, ninv=0; /* numar de comparatii si inversiuni */
void sort_sel_direct ( double a[], int n )
/* functia sorteaza un vector prin metoda de selectie directa */
{
double x;
int i, j, k;
for ( i = 0 ; i < n-1 ; ++i )
{
k = i; /* initializare indice, k, si elementul minim, x */
x = a[i];
for ( j = i+1 ; j < n ; ++j, ncomp++ ) /* determinare minim si indicele lui din sir */
if (a[j] < x)
{
k = j;
x = a[k];
}
a[k] = a[i]; /* interschimbare minim cu primul din subsirul sursa, */
a[i] = x; /* adica cu primul din subsirul neordonat */
ninv++;
}
}
void main()
{
double sir[100];
int ne,i, nl=0;
clrscr();
printf("Numar elemente:");
scanf("%d",&ne);
for(i=0;i<ne;i++) /* citirea elementelor sirului de ordonat */
{
printf("sir(%d)=",i+1);
scanf("%lf",& sir[i]);
}
sort_sel_direct(sir,ne); /* ordonarea sirului prin selectie directa */
for(i=0;i<ne;i++) /* afisarea sirului ordonat */
{
52
printf(" sir(%2d)=%5.1lf",i+1,sir[i]);
nl++; /* actualizare contor numar de valori afisate pe o linie */
if ( nl % 5 == 0 ) /* daca s-au afisat 5 valori pe o linie se trece pe */
printf("\n"); /* o linie noua */
}
printf("\n");
printf("Ordonarea s-a realizat prin %d comparatii si %d inversiuni\n",
ncomp, ninv);
}
53
scanf ("%d",&ne);
for ( i = 0 ; i < ne ; ++i)
{
printf (" sir(%2d)=", i+1);
scanf ("%lf", &sir[i]);
}
sort_sel_dir(sir,ne);
for( i = 0 ; i < ne ; ++i ){
printf (" sir(%2d)=%5.2lf ", i+1, sir[i]);
if ((i+1)%4==0)
printf("\n");
}
printf("\n");
printf("Ordonarea s-a realizat prin %d comparatii si %d inversiuni\n",
ncomp, ninv);
}
54
v[i+1]=t;
k=i; /* se retine pozitia ultimei inversiuni */
ninv++;}
d=k-1; /* se modifica corespunzator limita din dreapta */
for (i=d; i>=s; i--, ncomp++) /* parcurg de la dreapta la stanga */
if (v[i+1] < v[i]) /* daca este cazul se invers. elem. */
{t=v[i];
v[i]=v[i+1];
v[i+1]=t;
k=i; /* se retine pozitia ultimei inversiuni */
ninv++;}
s=k+1; /* se modifica corespunzator limita din stanga */
}while(s <= d);
}
void main(void)
{int n;
VECTOR v;
clrscr();
printf("\nProgramul ordoneaza (sorteaza) un vector, metoda \"Shaker\".\n");
printf("\tDimensiune vector, n= ");scanf("%d",&n);
cit_vect(n,v);
shaker(n,v);
printf("\nSirul ordonat este:\n");
scrie_vect(n,v);
printf("Ordonarea s-a realizat prin %d comparatii si %d deplasari\n",
ncomp, ninv);
printf("\n\tApasati o tasta pentru a termina programul\n");
getch();
}
55
if (a[j-1] > a[j])
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
ninv++;
}
}
void main(){
double sir[100];
int ne,i, nl=0;
clrscr();
printf("Numar elemente:");
scanf("%d", &ne);
for(i=0; i<ne; i++) /* citirea elementelor sirului de ordonat */
{printf("sir(%d)=",i+1);
scanf("%lf", &sir[i]);
}
sort_met_bulelor (sir, ne); /* ordonarea sirului prin selectie directa */
for(i=0; i<ne; i++) /* afisarea sirului ordonat */
{
printf("sir(%2d)=%5.1lf ", i+1, sir[i]);
nl++; /* actualizare contor numar de valori afisate pe o linie */
if (nl % 5 == 0) /* daca s-au afisat 5 valori pe o linie */
printf("\n"); /* se trece pe o linie noua */
}
printf("\n");
printf("Ordonarea s-a realizat prin %d comparatii si %d deplasari\n",
ncomp, ninv);
}
struct tip_struct
{
56
char nume_prenum [DIM];/* numele si prenumele unui student*/
float medie;
};
void main(void)
{
struct tip_struct stud [100];/* consideram un tablou de studenti */
int ind[100]; /* vectorul ce contine indecsii tabloului initial, si ce
va fi ordonat in functie de valorile vectorului de ordonat "tab" */
int i, ns;
float f;
void ShakerSort (struct tip_struct tab[], int index[], int n);
clrscr();
printf("Numarul de studenti:");
scanf("%d", &ns);
f=0.0; fflush(stdin);
for (i=0; i<ns; i++) /* citire date studenti: nume, prenume si media */
{
printf("Numele si prenumele studentului %d: ", i+1);
gets(stud[i].nume_prenum);
printf("Media notelor sale: ");
scanf("%f", &f);
stud[i].medie=f;
while (getchar() != '\n');
}
for (i=0; i<ns; i++) /* initializarea tabloului de indici */
ind[i] = i;
ShakerSort (stud, ind, ns); /* sortarea vectorului */
printf("Lista ordonata cu numele / prenumele si media studentilor\n");
for (i=0; i<ns; i++)
printf("%s %.2f\n", stud[ind[i]].nume_prenum,
stud[ind[i]].medie);
}
57
index[i+1]=t;
k=i;
}
d=k-1;
for (i=d; i>=s; i--)
if (tab[index[i+1]].medie > tab[index[i]].medie)
{
t=index[i];
index[i]=index[i+1];
index[i+1]=t;
k=i;
}
s=k+1;
} while (s <= d);
}
58
}
} while (inv);
}
}
59
{
printf("Distanta (%d, %d)= ", i+1, j+1);
scanf("%d", &dist[i][j]);
dist[j][i]=dist[i][j];
}
muchie_sel[i]=0;
}
do {i=0;
while (muchie_sel[i] || i==isel)
i++;
distmin=dist[isel][i];
}while (nsel!=n);
getch();
}
#include <stdio.h>
#include <conio.h>
#define N 10
#define M 15
#define DIM (N-1)*(M-1)
60
};
int d[2][DIM];
int i, j, n=5, m=5, nr_sol=0, nse=4;
61
iesire(k, i+1, j, L, d);
break;
case 4: if (L[i][j] & 1)
iesire(k, i, j-1, L, d);
}
k--;
}
}
62
iesire(0, i, j, L, d);
printf("\nNumar total de solutii: %i\n", nr_sol);
printf("Apasati ENTER pentru a termina programul !");
getch();
}
// obiectpo.c - problema "fotografiei": determina numarul de obiecte
// dintr-o fotografie. Obiectele din fotografie sunt codificate cu 1,
// iar celelalte sunt 0. Pornind de la prima unitate determinata
// se cauta unitati adiacente pe cele 8 directii, care sunt puse pe 0
// eliminandu-se astfel obiectul identificat.
// Functia main() reapeleaza functia "obiect" pentru unitatile ramase
#include <stdio.h>
#include <conio.h>
#define N 10
#define M 15
63
void main (void) {
int il, ic, nr_ob=0; // nr_ob - numar obiecte
clrscr();
/*
printf("Dimensiuni fotografie (matrice), linii, coloane: ");
scanf("%d%d", &n, &m);
printf("Citire fotografie:\n");
for (il=1; il<=n; il++)
for (ic=1; ic<=m; ic++){
printf("F[%d, %d]=", il, ic);
scanf("%d", &F[il][ic])
}
*/
// matricea F, impreuna cu cele 2 linii si 2 coloane, care
// delimiteaza fotografia, si specifica iesirea din fotografie
// are dimensiunile (n+2)*(m+2)
for (ic=1; ic<=m; ic++){
F[0][ic]=0;
F[n+1][ic]=0;
}
for (il=1; il<=m; il++){
F[il][0]=0;
F[il][m+1]=0;
}
printf("\nFotografia are urmatoarea configuratie:\n\n");
for (il=1; il<n+1; il++){
printf("\t");
for (ic=1; ic<m+1; ic++)
printf("%2d", F[il][ic]);
printf("\n\n");
}
printf("\nCoordonate obiecte (stanga-sus):\n");
do
{il=0; // se cauta prima unitate in ordinea linii/coloane
do {
il++;
ic=0;
do
ic++;
while (ic<m+1 && F[il][ic]==0);
}while (il<n+1 && F[il][ic]==0);
if (F[il][ic] && ic<m+1 && il<n+1){ // conditie pusa pentru
printf("\n\tObiect %d: (%d,%d)\n", nr_ob+1, il, ic);
64
obiect(il, ic, F); // a evita apelul la terminarea
nr_ob++; // parcurgerii matricei
}
}while (il<n+1 || ic<m+1); // se reia parcurgerea pana matricea devine 0
printf("\n\tNumar obiecte: %i\n", nr_ob);
printf("\nApasati ENTER pentru a termina programul !");
getch();
}
65
{
aux=a[lin][0];
a[lin][0]=a[lin][c];
a[lin][c]=aux;
};
if (incearca(0)) // daca exista solutie (ord. diagonala)
ntotsol++; // se numara solutia si se tipareste
printf("\nSolutia %d:\n", ntotsol);
for (il=0; il<nl; il++)
{
for (ic=0; ic<nc; ic++)
printf("%4d", a[il][ic]);
printf("\n");
};
printf("\nApasati o tasta pentru a continua programul !\n");
getch(); // se duc la loc linia si coloana mutate anterior
for (col=0; col<nc; col++)
{aux=a[0][col];
a[0][col]=a[l][col];
a[l][col]=aux;
};
for (lin=0 ;lin<nl; lin++)
{aux=a[lin][0];
a[lin][0]=a[lin][c];
a[lin][c]=aux;
};
};
printf("\nNumarul total de solutii este %d.\n", ntotsol);
printf("\nApasati o tasta pentru a termina programul !\n");
getch();
};
66
a[i][c]=a[lin][c];
a[lin][c]=aux;
};
for (l=0; l<nl; l++)
{aux=a[l][i];
a[l][i]=a[l][col];
a[l][col]=aux;
};
if (i < nl-1)
{
q=incearca (i+1);
if (!q)
{
for (c=0; c<nc; c++)
{aux=a[i][c];
a[i][c]=a[lin][c];
a[lin][c]=aux;
};
for (l=0; l<nl; l++)
{aux=a[l][i];
a[l][i]=a[l][col];
a[l][col]=aux;
};
};
}
else
q=1;
};
if (col == nc-1)
{
col=i;
lin++;
}
else
col++;
} while (!q && lin < nl && col < nc);
return (q);
}
67
int a[9] = {0, 1, 1, 1, 1, 1, 1, 1, 1}; // indice a = linia 'k'
// initializarea pozitiilor, pe linii, de la 1 la 8 (0 nu este utilizata)
int b[17] = {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// initializarea pozitiilor pentru diagonala dr-st, de la 2 la 16,
// pozitiile 0 si 1 nu sunt utilizate
int c[15] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// initializarea pozitiilor de la 0 la 14, pentru diagonala dr-st.
int x[9]; // vectorul pozitiilor pe coloane, indice x=linia, x[]=coloana
68
sa nu o atace pe alta (prima regina este amplasata in pozitia (1,1) */
#include <stdio.h>
#include <conio.h>
int a[9] = {0, 1, 1, 1, 1, 1, 1, 1, 1}; // indice a = linia 'k'
// initializarea pozitiilor, pe linii, de la 1 la 8 (0 nu este utilizata)
int b[17] = {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// initializarea pozitiilor pentru diagonala dr-st, de la 2 la 16,
// pozitiile 0 si 1 nu sunt utilizate
int c[15] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// initializarea pozitiilor de la 0 la 14, pentru diagonala dr-st.
int x[9]; // vectorul pozitiilor pe coloane, indice x=linia, x[]=colaona
int ntotsol=0; // numarul total de solutii
void afiseaza (void)
{
int k;
printf("Sol. %2d: ", ntotsol+1);
for ( k = 1; k <= 8; k++)
printf("%4d", x[k]);
printf("\n");
ntotsol++; // contorizez numarul total de solutii
if (ntotsol%20 == 0){
printf("\nProgramul (si afisarea) continua! Apasati o tasta!\n");
getch();
}
}
69
incearca (1);
printf("\nNumarul tota de solutii gasite este %4d.\n", ntotsol);
printf("\nProgramul s-a terminat! Apasati o tasta!\n");
getch();
}
70
i=0;
printf("\nSe incarca in rucsac:\n");
while (gr > 0 && i < n)
{
if (gr >= g[ordonat[i]])
{
printf("\tObiect %d incarcat in intregime\n", ordonat[i]+1);
gr=gr - g[ordonat[i]];
castig=castig + p[ordonat[i]];
}
else
{printf("Obiect %d incarcat in proportie de"
" %.2f %\n", ordonat[i]+1, gr/g[ordonat[i]]*100);
castig=castig + p[ordonat[i]]*gr/g[ordonat[i]];
gr=0; // rucsacul este plin, greutate disponibila 0
}
i++;
}
printf("\nObiectele incarcate in rucsac sunt urmatoarele:\n");
for (j=0; j<i; j++)
printf("\tObiectul: %d, de greutate: %.2f si profit: %.2f\n",
ordonat[j]+1, g[ordonat[j]], p[ordonat[j]]);
if (gr){
printf("\nSe mai pot incarca obiecte de greutate: %.2f", gr);
printf("\n\t\t rucsacul nu este plin, dar nu mai sunt obiecte.\n");
}
printf("\nProfitul total obtinut pentru aceasta incarcare: %.2f\n", castig);
printf("\nApasati o tasta pentru a termina programul !!!\n");
getch();
}
/* sirmaxpd.c - programul determina cel mai mare subsir crescator,
dintr-un sir dat, utilizand "programarea dinamica"
*/
#include<stdio.h>
#include <conio.h>
#define DIM 100
void main(void){
int vmax, v[DIM]={1, 5, 2, 6, 7, 4, 10, 13, 9, 20, 14, 7, 15, 12, 17};
int n=15, i, k, max, imax, L[DIM], Lmax;
clrscr();
/*printf("Numar elemente:");
scanf("%d", &n);
for(i=0; i<n; i++) // citire sir unde caut cel mai mare subsir crescator
71
{
printf("v(%d)= ", i+1);
scanf("%d", &v[i]);
} */
L[n-1]=1;
/* calculez L[k]=L[i]+1, unde 'i' este indicele unde v[k]<=v[i] */
for (k=n-2; k>=0; k--){ // L[k] contine numarul max. de succesori pentru v[k]
L[k]=1; // determin pentru fiecare numar v[k]
imax=k; // care pot fi succesorii sai
Lmax=1; // selectand dintre acestia pe cei care ofera lungimea
for (i=k+1; i<n; i++) // maxima (L[k] va contine pentru pozitia k
if (v[k] <= v[i] && Lmax <= L[i]){ // numarul total
Lmax=L[i]; // de elemente din subsirul
imax=i; // crescator, maxim, ce se
L[k]=L[imax]+1; // poate forma
}
}
printf("Vectorul L este urmatorul:\n");
for (i=0; i<n; i++)
printf("%3i", L[i]);
printf("\n");
Lmax=L[0]; imax=0; // se determina inceputul subsirului crescator maxim
for (i=1; i<n; i++){ // acesta incepe de la pozitia corespunzatoare
if (Lmax < L[i]){ // pozitiei 'imax' a valorii maxime din L
Lmax=L[i];
imax=i;
}
}
printf("\nSubsirul cel mai lung este (incepe de la poz %d):\n", imax+1);
printf("%5d", v[imax]);
vmax=v[imax]; // prima valoare din subsirul cautat
Lmax=L[imax]; // dimensiunea subsirului de tiparit
for (i=imax+1; i<n; i++) // urmatoarea valoare din subsir este mai mare
if (vmax <= v[i] && L[i]==Lmax-1){ // decat cea anterioara
vmax=v[i]; // si are lungimea cu o unitate mai mica
printf("%5d ", vmax);
Lmax--; // actualizare dimensiune subsir ramas de tiparit
}
printf("\n\n\tApasati o tasta pentru a termina programul\t!!!\n");
getch();
}
/* sumvalv.c - programul citeste un vector de valori intregi
si determina daca o anumita valoarea (suma dorita) se poate furniza
prin insumarea valorilor din vector, si ofera toate solutiile posibile
72
- exemplu de backtracking */
#include <stdio.h>
#include <conio.h>
#define MAXV 16
typedef struct
{int nval, val[MAXV]; /* numar valori disponibile in vector */
long rest; /* si vectorul; rest (suma) de realizat */
int nrsol; /* numar solutii */
unsigned sel; /* marcaj valori selectate, prin setarea
bitului corespunzator pozitiei valorii selectate */
} TDate;
int nle=0; /* numar de linii afisate pe ecran */
73
a->rest += a->val[iv]; /* si reface rest de completat */
}
}
void main ()
{int i;
long Suma;
TDate x;
clrscr();
printf ("Introduceti valori, terminand cu 0 sau caracter nenumeric:\n");
for (i = 0; i < MAXV; i++)
if (scanf("%i", &(x.val[i])) < 1 || x.val[i] == 0)
break;
if (!i)
{ printf ("Lipsa date!!!\n"); exit(1); }
x.nval = i;
printf("\nAti introdus %u valori:\n", x.nval);
for (i = 0; i < x.nval; i++)
printf ("%5i", x.val[i]);
printf ("\n");
for (;;)
{printf ("\nSuma dorita de construit (calculat) cu valori "
"din vector\n\t(oprire program orice caracter nenumeric): ");
fflush(stdin);
if (!scanf ("%ld", &Suma))
break;
x.sel = 0; x.rest = Suma; x.nrsol = 0;
Cauta (&x, 0); /* Cauta solutii */
if (! x.nrsol)
printf ("Nu exista solutie !\n");
}
}
/*t_hanoi.c - Problema 'Turnurilor din Hanoi', rezolvata recursiv */
#include <stdio.h>
#include <conio.h>
enum pozitie { stanga , mijloc , dreapta};
74
break;
case 2 : printf ( "dreapta" );
}
}
void muta ( int n, enum pozitie sursa, enum pozitie inter, enum pozitie dest )
{
if ( n > 0 )
{
muta ( n - 1 , sursa , dest , inter );
deplasare ( sursa , dest );
muta ( n - 1 , inter, sursa , dest );
}
}
75
#include <stdio.h>
#include <conio.h>
#define MAXG 5
int n=4;
void dreptunghi (int x, int y, int l, int h,
int *px, int *py, int *pl, int *ph, int xg[], int yg[]){
int gasit, i;
i=0; gasit=0;
while (i<n && !gasit) // exista gaura in dreptunghiul ((x,y), l, h) ?
if (xg[i] > x && xg[i] < x+l && yg[i] > y && yg[i] < y+h)
gasit=1;
else
i++;
if (gasit) // daca da, avem 2 taieturi -> 4 dreptunghiuri
{dreptunghi(x, y, xg[i]-x, h, px, py, pl, ph, xg, yg);
dreptunghi(xg[i], y, l+x-xg[i], h, px, py, pl, ph, xg, yg);
dreptunghi(x, y, l, yg[i]-y, px, py, pl, ph, xg, yg);
dreptunghi(x, yg[i], l, h+y-yg[i], px, py, pl, ph, xg, yg);
}
else if (l*h > *pl* *ph) // se compara aria drept. cu cea a drept. taiat
{*px=x; *py=y; // daca acesta nu mai contine gauri (!gasit)
*pl=l; *ph=h;
}
}
76
3 1 3 3 1
4 1 4 6 4 1
5 1 5 10 10 5 1
6 1 6 15 20 15 6 1
7 1 7 21 35 35 21 7 1
*/
#include<stdio.h>
#include <conio.h>
#define DIM 80
void main(void){
long int c[DIM];
int n=15, i, k, d;
clrscr();
for (k=0; k<=n; k++){ // construire vector v, linia n, din triunghi Pascal
for (i=k; i>=0; i--) // construire linie k din tringhiul Pascal
if (i==k)
c[i]=1;
else if (i==0)
c[i]=1;
else
c[i] += c[i-1];
printf("\n\n%2i", k); // afisare linie k
d=3; // spatiu initial rezervat pentru afisarea unei valori
for (i=0; i<=k; i++){
printf("%*li", d, c[i]);
if (i < (n+1)/2) // pentru valori mai mari ale lui n
{if(i%2) // se incrementeaza la cresterea lui
d++; // i spatiul d (din 2 in 2, cu 1)
}
else if((i+1)%2) // iar pentru partea a doua a
d--; // triunghiului se reduce spatiul
} // cu acelasi pas; pentru n>20 trebuie
if ((k+1)%16 == 0){ // modificat 'd' cu un pas mai mare
77
printf("\n\nContinua afisarea dupa apasarea unei taste!\n");
getch();
}
}
printf("\n");
printf("\n\n\tApasati o tasta pentru a termina programul\t!!!\n");
getch();
}
*/
#include <stdio.h>
#include <conio.h>
#include <values.h>
#define DIMN 10 // numar maxim noduri
#define DIMM 100 // numar maxim muchii
78
ARB[i]=0; C[i]=0; P[i]=0;
}
ARB[prim]=1; // initializare varf de inceput
for (k=1; k<=n-1; k++){ // se dermina celalate n-1 varfuri ale arborelui
cost_min=MAXINT;
v1=0; v2=0;
for (i=0; i<=n; i++)
for (j=0; j<=n; j++)
if (ARB[i]==1 && ARB[j]==0)// i e in arbore, iar j nu
if(a[i][j]) // si i-j este muchie in graf cu
if (a[i][j]<cost_min){ // cost minim
cost_min=a[i][j];
v1=i; v2=j; // retin muchia
} // in v1-v2
ARB[v2]=1; // adaug varful de cost minim in arborele ARV
P[v2]=v1; // parintele lui 'v2' este 'v1'
C[v2]=cost_min; // retin costul minim pt v1-v2 in C
}
}
void main()
{
int a[DIMN+1][DIMN+1]; // matricea de adiacenta (costuri/ drumuri)
int ARB[DIMN+1], C[DIMN+1], P[DIMN+1]; // ARB-arb partial, P-parinti, C-cost
int n, nm, primul, dimV, k;
citire_graf (a, &n, &nm);
printf("\nProgramul parcurge in latime graful.\n");
printf("\nSpecificati varful de start pentru parcurgere: ");
scanf("%d", &primul);
construct_arb_cost_min (a, ARB, P, C, n, primul);
printf("\nArborele de cost minim este urmatorul:\n");
tip_arb_cost_min (C, P, n);
printf("\nApasati o tasta pentru a termina programul\n");
getch();
79
}
#include <stdio.h>
#include <conio.h>
#define DIMN 10 // numar maxim noduri
#define DIMM 100 // numar maxim muchii
typedef struct{
int v1, v2; // cele doua varfuri ale unei muchii
} VECT_MUCHII;
int nr_sol=0;
void citire_graf (VECT_MUCHII vm[DIMM+1], int a[DIMN+1][DIMN+1], int *pn, int *pm){
int i, j, k;
clrscr();
printf("\nDati numar noduri, graf neorientat, n: ");
scanf("%d", pn);
printf("Nr. de muchii: ");
scanf("%d", pm);
for (i=1; i<= *pn; i++)
for (j=1; j<=*pn; j++)
a[i][j]=0; // initializare matrice drumuri (costuri) pt. graf
printf("\nCitire graf prin muchiile sale.\n");
for (k=1; k<= *pm; k++)
{
printf("Muchia %d, varfuri: ", k);
scanf ("%d%d", &vm[k].v1, &vm[k].v2); // costul (i,j)=cost(j,i)
a[vm[k].v1][vm[k].v2]=a[vm[k].v2][vm[k].v1]=1;
}
}
80
printf("%d -> ", ciclu[i]);
printf("%d\n", ciclu[p]);
if ((nr_sol+1)%20==0){
printf("\nAfisarea continua dupa apasarea unei taste !!!\n");
getch();
}
}
void main()
{
VECT_MUCHII vm[DIMM+1]; // vectorul de muchii (muchie=doua varfuri)
int ciclu[DIMM+1], a[DIMN+1][DIMN+1]; // vect culori si matricea de adiacenta
int n, nm;
citire_graf (vm, a, &n, &nm);
printf("\nCiclurile din graf sunt urmatoarele:\n");
init_ciclu(ciclu, nm);
incerc_ciclu(a, ciclu, n, 1);
if(nr_sol)
printf("\nNumarul total de solutii este: %d\n", nr_sol);
81
else
printf("\nProblema nu are solutii");
printf("\n");
}
#include <stdio.h>
#include <conio.h>
#define DIMN 6 // numar maxim noduri
#define DIMM 10 // numar maxim muchii
typedef struct{
int v1, v2; // cele doua varfuri ale unei muchii
} VECT_MUCHII;
int nr_sol=0;
void citire_graf (VECT_MUCHII vm[DIMM+1], int a[DIMN+1][DIMN+1], int *pn, int *pm){
int i, j, k;
clrscr();
printf("\nDati numar noduri, graf neorientat, n: ");
scanf("%d", pn);
printf("Nr. de muchii: ");
scanf("%d", pm);
for (i=1; i<= *pn; i++)
for (j=1; j<=*pn; j++)
a[i][j]=0; // initializare matrice drumuri (costuri) pt. graf
printf("\nCitire graf prin muchiile sale.\n");
for (k=1; k<= *pm; k++)
{
printf("Muchie: varfuri sursa, dest: ");
scanf ("%d%d", &vm[k].v1, &vm[k].v2);
a[vm[k].v1][vm[k].v2]=a[vm[k].v2][vm[k].v1]=1; // costul (i,j)=cost(j,i)
}
}
82
if (vm[i].v1 < vm[i].v2) // varful sursa si cel destinatie, in ordine
printf("m(%d-%d)=c%d, ", vm[i].v1, vm[i].v2, culoare[i]);
else
printf("m(%d-%d)=c%d, ", vm[i].v2, vm[i].v1, culoare[i]);
printf("\n");
if ((nr_sol+1)%20==0){
printf("\nAfisarea continua dupa apasarea unei taste !!!\n");
getch();
}
}
void incerc_culoare(VECT_MUCHII vm[DIMM+1], int culoare[DIMM+1], int c, int nm, int p){
int i, j;
for (i=1; i<=c; i++)
{culoare[p]=i;
if (validare_culoare(vm, culoare, p))
if (p==nm) // solutie completa (toate nodurile colorate)
{tipar_culoare(culoare, vm, nm);
nr_sol++;
}
else
incerc_culoare(vm, culoare, c, nm, p+1);
// culoare[p]=0; // sterge culoarea incercata
}
}
void main()
{
VECT_MUCHII vm[DIMM+1]; // vectorul de muchii (muchie=doua varfuri)
int culoare[DIMM+1], a[DIMN+1][DIMN+1]; // vect culori si matricea de adiacenta
int n, nm, c;
citire_graf (vm, a, &n, &nm);
printf("\nNumarul de culori cu care se coloreaza: ");
scanf("%d", &c);
83
incerc_culoare(vm, culoare, c, nm, 1);
if(nr_sol)
printf("\nNumarul total de solutii este: %d\n", nr_sol);
else
printf("\nProblema nu are solutii");
printf("\n");
}
#include <stdio.h>
#include <conio.h>
#define DIMN 10 // numar maxim noduri
#define DIMM 100 // numar maxim muchii
84
printf("Muchia %d, varf sursa -> destinatie: ", k);
scanf ("%d%d", &vm[k].vi, &vm[k].vf);
printf("Cost (%d -> %d)= ", vm[k].vi, vm[k].vf);
scanf ("%d", &drum);
a[vm[k].vi][vm[k].vf]=vm[k].lung=drum;
}
printf("\nMatricea drumurilor pentru graful introdus este:\n");
for (i=1; i<=*pn; i++){
for (j=1; j<=*pn; j++)
printf("%3d", a[i][j]);
printf("\n");
}
}
85
int validare_solutie (int a[DIMN+1][DIMN+1], int solutie[DIMM+1], int p){
int k;
if ( !a[solutie[p-1]][solutie[p]] ) // daca nu e drum -> nu e valida solutia
return 0;
for (k=2; k<p; k++) // daca varful mai exista in 'solutia' pana la
if (solutie[k]==solutie[p]) // pozitia 'p-1' -> nu e solutie corecta
return 0; // varful mai poate fi doar pe prima pozitie
return 1;
}
void main()
{
VECT_MUCHII vm[DIMM+1]; // vectorul de muchii (muchie=doua varfuri)
int sol[DIMM+1], a[DIMN+1][DIMN+1]; // vect culori si matricea de adiacenta
int n, nm, dmin, dmax;
citire_graf (vm, a, &n, &nm);
printf("Limitele pentru suma drumurilor din graf (min, max): ");
scanf("%d%d", &dmin, &dmax);
init_solutie(sol, nm);
printf("\nSolutiile din graf sunt urmatoarele:\n");
incerc_solutie(a, sol, n, 1, dmin, dmax);
if(nr_sol)
printf("\nNumarul total de solutii este: %d\n", nr_sol);
else
printf("\nProblema nu are solutii");
printf("\n");
}
86
/* LantGraf.c - programul determina daca exista un lant dat intr-un graf */
#include <stdio.h>
#include <conio.h>
#define DIMN 6 // numar maxim noduri
#define DIMM 10 // numar maxim muchii
87
return 0; // nu este lant, un varf nu este in matrice
for (i=1; i<=dl-1; i++)
for (j=i+1; j<=dl; j++)
if(l[i]==l[j])
*elem=0; // este ne-elementar
return 1;
}
void main()
{
int a[DIMN+1][DIMN+1], l[DIMM+1]; // matricea de adiacenta si lantul cautat
int n, nm, dl, elementar;
citire_graf (a, &n, &nm);
citire_lant (l, &dl);
if (test_lant(a, l, dl, &elementar)){
printf("\n\nEste un lant ");
if (!elementar)
printf("ne-");
printf("elementar!\n");
}
else
printf("\n\nNu este un lant in graf !!!\n");
printf("\n");
}
88
#include<math.h>
#include<ctype.h>
struct punct
{
int x;
int y;
};
typedef struct punct pct;
int main(int argc,char **argv)
{
int x1,x2,x3,y1,y2,y3,r1,r2,r3;
int nr,i,j,k,locatie1,locatie2;
int **m,X,Y,i1,i2,D,*cost,*parinte,cost_temp;
pct *a;
char nume_locatie[16],nume_satelit[16],*c,**v;
FILE *Coordonate,*Avarii,*Coordonate_Finale,*Rezultat;
Coordonate = fopen(argv[1],"rt");
if(Coordonate == NULL)
{
printf("Fisierul coordonate.in nu a putut fi deschis!");
exit(1);
}
Coordonate_Finale = fopen(argv[4],"wt");
if(Coordonate_Finale == NULL)
{
printf("Fisierul coord_finale.out nu a putut fi deschis!");
exit(1);
}
fscanf(Coordonate,"%d",&nr);
a = (pct*)malloc(nr*sizeof(pct));
v = (char**)malloc(nr*sizeof(char*));
for(i=0;i<nr;i++)
v[i] = (char*)malloc(16*sizeof(char));
for(i=0;i<nr;i++)
{
fscanf(Coordonate,"%s",nume_locatie);
strcpy(v[i],nume_locatie);
fscanf(Coordonate,"%s",nume_satelit);
fscanf(Coordonate,"%d%d%d",&x1,&y1,&r1);
fscanf(Coordonate,"%s",nume_satelit);
fscanf(Coordonate,"%d%d%d",&x2,&y2,&r2);
89
fscanf(Coordonate,"%s",nume_satelit);
fscanf(Coordonate,"%d%d%d",&x3,&y3,&r3);
i1 = r2*r2-r1*r1+x1*x1-x2*x2+y1*y1-y2*y2;
i2 = r3*r3-r1*r1+x1*x1-x3*x3+y1*y1-y3*y3;
D = 4*(x1-x2)*(y1-y3)-4*(y1-y2)*(x1-x3);
X = (2*i1*(y1-y3) - 2*i2*(y1-y2))/D;
Y = (2*i2*(x1-x2) -2*i1*(x1-x3))/D;
a[i].x = X;
a[i].y = Y;
fprintf(Coordonate_Finale,"%d %d\n",X,Y);
}
m = (int**)malloc(nr*sizeof(int*));
for(i=0;i<nr;i++)
m[i] = (int*)malloc(nr*sizeof(int));
for(i=0;i<nr;i++)
for(j=0;j<nr;j++)
{
m[i][j] = sqrt( (a[i].x - a[j].x)*(a[i].x - a[j].x) + (a[i].y - a[j].y)*(a[i].y - a[j].y) );
}
Avarii = fopen(argv[2],"rt");
if(Avarii == NULL)
{
printf("Fisierul avarii.in nu a putut fi deschis!");
exit(1);
}
while(fscanf(Avarii,"%s",nume_locatie) != EOF)
{
for(i=0;i<nr;i++)
{
if(strcmp(v[i],nume_locatie) == 0)
locatie1 = i;
}
fscanf(Avarii,"%s",nume_locatie);
for(i=0;i<nr;i++)
{
if(strcmp(v[i],nume_locatie) == 0)
locatie2 = i;
}
m[locatie1][locatie2] = 9999;
m[locatie2][locatie1] = 9999;
}
fclose(Avarii);
90
cost = (int*)malloc(nr*sizeof(int));
parinte = (int*)malloc(nr*sizeof(int));
cost[0] = 0;
for(i=1;i<nr;i++)
{
cost[i] = 9999;
parinte[i] = 0;
}
for(j=0;j<nr;j++)
for(k=0;k<nr;k++)
{
cost_temp = cost[j] + m[j][k];
if(cost_temp < cost[k])
{
cost[k] = cost_temp;
parinte[k] = j;
}
}
Rezultat = fopen(argv[5],"wt");
if(Rezultat == NULL)
{
printf("fisierul rezultat nu a putut fii creeat!");
exit(1);
}
for(i=0;i<nr;i++)
if(strcmp(argv[3],v[i]) == 0)
fprintf(Rezultat,"%d",cost[i]);
free(cost);
free(a);
for(i=0;i<nr;i++)
free(v[i]);
free(v);
for(i=0;i<nr;i++)
free(m[i]);
free(m);
free(parinte);
fclose(Rezultat);
fclose(Coordonate_Finale);
fclose(Coordonate);
return 0;
}
//Popa Alexandru Gabriel 314AB
#include "comoara.h"
#include<stdio.h>
91
#include<stdlib.h>
#include<string.h>
unsigned int seed = 0;
/* valoarea de plecare pentru functia rand() */
92
}
/**Functia alocaMatrice
* primeste ca parametru n = dimensiunea matricei
* intoarce o matrice n x n (adresa pozitiei de inceput)
*/
long long int **alocaMatrice(int n)
{
long long int **m = NULL,i;
m = (long long int**)malloc(n*sizeof(long long int*));
for(i=0;i<n;i++)
m[i] = (long long int*)malloc(n*sizeof(long long int));
return m;
}
/**Functia alocaSirCaractere
* Primeste ca parametru n = lungimea sirului de caractere.
*
* Intoarce un vector de n caractere (adresa pozitiei de inceput).
*/
char* alocaSirCaractere(int n)
{
char *v = NULL;
v = (char*)malloc(n*sizeof(char));
return v;
}
/**Functia citesteInput
* Primeste numele fisierului de intrare.
*
* Intoarce un element de tip structura_date_intrare cu datele citite.
*/
structura_date_intrare citesteInput(char *numeFisier)
{
structura_date_intrare in;
int i,j;
FILE *f;
f = fopen(numeFisier,"rt");
if(f == NULL)
{
printf("Fisierul de input nu a putut fi deschis! :( \n");
exit(1);
}
for(i=0;i<4;i++)
fscanf(f,"%d",&in.c[i]);
fscanf(f,"%d",&in.n);
fscanf(f,"%lli",&in.sumaMax);
93
in.m = alocaMatrice(in.n);
for(i=0;i<in.n;i++)
for(j=0;j<in.n;j++)
fscanf(f,"%lli",&in.m[i][j]);
fscanf(f,"%d",&in.numarMaxIncercari);
fclose(f);
return in;
}
94
* Intoarce rezultatul pentru cerinta 1.
*/
long long int rezolvareCerintaGreedy(structura_date_intrare in)
{
int n = in.n;
long long int **m = in.m;
int i,j;
long long int suma = 0;
i = n-1;
j = n-1;
suma = suma + m[i][j];
while(i != 0 || j!= 0)
{
if(i == 0)
j--;
else if(j == 0)
i--;
else if(m[i][j-1] < m[i-1][j])
j--;
else if(m[i][j-1] >= m[i-1][j])
i--;
suma = suma + m[i][j];
}
return suma;
}
/**Functia rezolvareCerintaPD
* Primeste ca parametru un element cu toate datele de intrare.
*
* Intoarce rezultatul pentru cerinta 2.
*/
long long int rezolvareCerintaPD(structura_date_intrare in)
{
int n = in.n;
long long int **m = in.m;
long long int rezultatFinal = 0;
long long int **pd;
pd = alocaMatrice(n);
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
pd[i][j] = 0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
95
if(pd[i][j] == 0)
{
if(i == 0 && j == 0)
{
pd[i][j] = m[i][j];
}
else if(i == 0)
pd[i][j] = m[i][j] + pd[i][j-1];
else if(j == 0)
pd[i][j] = m[i][j] + pd[i-1][j];
else if(pd[i][j-1] < pd[i-1][j])
pd[i][j] = m[i][j] + pd[i][j-1];
else if(pd[i][j-1] >= pd[i-1][j])
pd[i][j] = m[i][j] + pd[i-1][j];
}
}
rezultatFinal = pd[n-1][n-1];
eliberareMatrice(pd,n);
return rezultatFinal;
}
int rand()
{
seed = (MULTIP * seed + INCREMENT) % MODULATOR;
return seed;
}
/**Functia rezolvareCerintaSimulare
* Primeste ca parametru un element cu toate datele de intrare.
*
* Intoarce rezultatul pentru cerinta 3.
*/
long long int rezolvareCerintaSimulare(structura_date_intrare in)
{
int nrMaxIncercari = in.numarMaxIncercari;
int n = in.n;
long long int **m = in.m;
long long int sumaMax = in.sumaMax;
long long int suma,rezultatFinal,nrIncercari = 0;
int i,j;
96
i = n-1;
j = n-1;
suma = suma + m[i][j];
while(i != 0 && j != 0)
{
if(rand() % 2)
i--;
else j--;
suma = suma + m[i][j];
}
if(i == 0)
while(j != 0)
{
j--;
suma = suma + m[i][j];
}
if(j == 0)
while(i != 0)
{
i--;
suma = suma + m[i][j];
}
if(suma <= sumaMax)
break;
}
rezultatFinal = nrIncercari;
if(nrIncercari >= nrMaxIncercari)
{
rezultatFinal = 0;
}
return rezultatFinal;
}
/*Functia back contorizeaza drumurile sigure gasite
*/
long long int contorC4 = 0;
void back(long long int suma,long long int sumaMax,long long int **m,int i,int j)
{
suma = suma + m[i][j];
if(j > 0)
back(suma,sumaMax,m,i,j-1);
if(i > 0)
back(suma,sumaMax,m,i-1,j);
if(i == 0 && j == 0)
97
if(suma <= sumaMax)
contorC4++;
}
/**Functia rezolvareCerintaBacktracking
* Primeste ca parametru un element cu toate datele de intrare.
* Intoarce rezultatul pentru cerinta 4.
*/
long long int rezolvareCerintaBacktracking(structura_date_intrare in)
{
long long int **m = in.m;
int n = in.n;
long long int sumaMax = in.sumaMax;
int startLinie = n-1;
int startColoana = n-1;
long long int suma = 0;
back(suma,sumaMax,m,startLinie,startColoana);
return contorC4;
}
98