Sunteți pe pagina 1din 16

Elemente de baz ale programrii n C - Aplicaii de Laborator

Laborator nr. 11
Sortarea i cutarea datelor Motoare de date
Algoritmul reprezint o mulime finit de operaii elementare (instruciuni) executate ntro ordine bine stabilit (determinat), pornind de la un set de date de intrare dintr-un domeniu de
valori posibile (valide), produce n timp finit un set de date de ieire (rezultate).

11.1.

Sortarea

Operaiile de cutare sunt precedate de o sortare; o clasificare a metodelor de sortare


poate fi:

permutare

selecie

inserare
Cel mai cunoscut algoritm bazat pe permutare se numete metoda bulelor. Aceasta const
n comparaii repetate i, unde este cazul, permutarea elementelor adiacente.

11.2.

Exemple

Problema 11.1.

//Program 1 pentru algoritm bazat pe permutare


#include <stdio.h>
#include <stdlib.h>
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void bublesort(int list[], int n)
{
int i,j;
for(i=0;i<(n-1);i++)
for(j=0;j<(n-(i+1));j++)
if(list[j] > list[j+1])
swap(&list[j],&list[j+1]);
}
void printlist(int list[],int n)
{
int i;
72
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

for(i=0;i<n;i++)
printf("%d\t",list[i]);
}
void main(void)
{
const int MAX_ELEMENTS = 10;
int list[MAX_ELEMENTS];
int i = 0;
/* generate random numbers and fill them to the list */
for(i = 0; i < MAX_ELEMENTS; i++ )
{
list[i] = rand();
}
printf("The list before sorting is:\n");
printlist(list,MAX_ELEMENTS);
/* sort the list */
bublesort(list,MAX_ELEMENTS);
/* print the result */
printf("The list after sorting using bubble sorting algorithm:\n");
printlist(list,MAX_ELEMENTS);
}
Problema 11.2.
//program 2 pentru algoritm bazat pe permutare
#include <stdio.h>
void main(void)
{
int i,j,key;
int a[5]={5,2,3,4,1};
for(i=1;i<5;i++)
{
key=a[i];
while(i>0 && a[i-1]>key) {
j=a[i];
a[i]=a[i-1];
a[i-1]=j;
--i;
}
}
int k;
for(k=0;k<5;k++)
{
printf("%d
", a[k]);}
printf("\n");
}
73
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

Problema 11.3.
//Program 1 care realizeaz sortarea prin selecie
#include<stdio.h>
void main(void)
{
int s,i,j,temp,a[20];
printf("Enter total elements: ");
scanf("%d",&s);
printf("Enter %d elements: ",s);
for(i=0;i<s;i++)
scanf("%d",&a[i]);
for(i=0;i<s;i++)
{
for(j=i+1;j<s;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
printf("After sorting is: ");
for(i=0;i<s;i++)
printf(" %d",a[i]);
}
Problema 11.4.
//Program 2 care realizeaz sortarea prin selecie
#include <stdio.h>
void main(void)
{
int i,j,x;
int a[5]={5,2,3,4,1};
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
if(a[i]>a[j])
{
x=a[i];
a[i]=a[j];
a[j]=x;
74
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

}
}
}
int k;
for(k=0;k<5;k++)
{
printf("%d
}
printf("\n");

",a[k]);

}
Problema 11.5.
//Program care realizeaz sortarea prin inserrii
#include <stdio.h>
void main(void)
{
int i,j,x,min,k;
int a[5]={5,3,2,4,1
};
for(i=0;i<5;i++)
{
min=i;
for(j=i+1;j<5;j++)
{
if(a[min]>a[j])
{
min=j;
}
x=a[min];
a[min]=a[j];
a[j]=x;
}
for(k=0;k<5;k++)
{
printf("%d ",a[k]);
}
printf("\n");
}

11.3.

Cutarea

Algoritmii de cutare permit utilizatorului s localizeze informaia dorit ntr-un set de


date. n general, metodele de cutare sunt clasificate n:

secveniale

binare
75
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

Cercetarea secveniala e destinat listelor nesortate i ncepe cercetarea cu primul element


i ncheie fie la gsirea obiectului cutat fie la epuizarea listei. Cutarea binar este un algoritm
superior, pentru seturi de date ordonate.

11.4.

Exemple

Problema 10.6.
// program de cutare secvenial
#include <stdio.h>
#include <conio.h>
void main(void)
{
int v[20],n,i,k;
clrscr();
printf("n="); scanf("%d",&n);
printf("introduceti elementele vectorului\n");
for (i=1;i<=n;i++)
{
printf("v[%d]=",i);
scanf("%d",&v[i]);
}
printf("nr cautat in sir =");
scanf("%d",&k);
i=1;
while (i<=n && v[i]!=k)
i++;
if (i<=n)
printf("Numarul cautat se afla in sir");
else printf("Numarul cautat nu se afla in sir");
getch();
}
Problema 11.7.
// program de cutare binar
#include <stdio.h>
#include <conio.h>
int v[20];
int n,k,c;
void citire()
{
int i;
printf("elementele sirului in ordine crescatoare\n");
printf("v[1]=");scanf("%d",&v[1]);
for(i=2;i<=n;i++)
76
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

do
{
printf("v[%d]=",i);scanf("%d",&v[i]);
}
while (v[i]<=v[i-1]);
}
void afisare()
{
int i;
for(i=1;i<=n;i++)
printf("v[%d]=%d ",i,v[i]);
printf("\n");
}
int cautare(int k,int inf, int sup)
{
int mij;
if (inf<=sup)
{
mij=(inf+sup)/2;
if (v[mij]==k) return mij;
else if (v[mij]>k) cautare(k,inf,mij-1);
else cautare(k,mij+1,sup);
}
else return 0;
}
void main(void)
{
clrscr();
do
{
printf("n="); scanf("%d",&n);
}
while(n<1||n>20);
citire();
printf("vectorul introdus \n");
afisare();
printf("nr cautat in sir =");
scanf("%d",&k);
c=cautare(k,1,n);
if (c==0)
printf("elementul nu este in sir\n");
else printf("elementul cautat este pe pozitia %d\n",c);
getch();
}

77
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

Problema 11.8.
// program de cutare binar iterativ
#include <stdio.h>
#include <conio.h>
int v[20];
int n,k;
void citire()
{
int i;
printf("elementele sirului in ordine crescatoare\n");
printf("v[1]=");scanf("%d",&v[1]);
for(i=2;i<=n;i++)
do
{
printf("v[%d]=",i);scanf("%d",&v[i]);
}
while (v[i]<=v[i-1]);
}
void afisare()
{
int i;
for(i=1;i<=n;i++)
printf("v[%d]=%d ",i,v[i]);
printf("\n");
}
void cautare()
{
int mij,inf,sup,ind;
inf=1;sup=n;
ind=0;
do
{
mij=(inf+sup)/2;
if (v[mij]==k) ind=1;
else if (v[mij]<k) inf=mij+1;
else sup=mij-1;
}
while(inf<=sup && ind==0);
if (ind==1) printf("elementul este pe pozitia %d\n",mij);
else printf("elementul nu este in sir");
}
void main(void)
{
clrscr();
do
78
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

{
printf("n="); scanf("%d",&n);
}
while(n<1||n>20);
citire();
printf("vectorul introdus \n");
afisare();
printf("nr cautat in sir =");
scanf("%d",&k);
cautare();
getch();
}

11.5.

Motoare de date

Orice program este alctuit din algoritmi i structuri de date. n cazul structurilor
complexe, mecanismul de cutarea a datelor se numete motor de date. Exista patru mari
categorii de motoare de date:

cozi

stive

liste nlnuite

arbori binari
O coad (queue) este o list liniar de informaii, accesat n ordinea first in, first out
(FIFO).

Stiva (stack) folosete metoda last in, first out (LIFO).


Listele nlnuite (linked lists) pot fi accesate ntr-o manier aleatoare, deoarece fiecare
element are o legtur cu succesorul lui.
Arborii binari (binary trees) sunt potrivii pentru cutri, inserii i tergeri rapide. Fiecare
element conine legturi cu elementul din stnga, respectiv, din dreapta.

11.6.

Exemple

Problema 11.9.
// program cu motoare de date tip cozi
#include <stdio.h>
#include<ctype.h>
# define MAXSIZE 200
void add(int);
del(void);
int q[MAXSIZE];
int front, rear;
void main(void)
{
int will=1,i,num;
front =0;
79
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

rear = 0;
clrscr();
printf(" Program for queue demonstration through array");
while(will ==1)
{
printf(" MAIN MENU:
1.Add element to queue
2.Delete element from the queue");
scanf("%d",&will);
switch(will)
{
case 1:
printf("Enter the data... ");
scanf("%d",&num);
add(num);
break;
case 2:
i=del();
printf("Value returned from delete function
is %d ",i);
break;
default: printf("Invalid Choice ... ");
}
printf(" Do you want to do more operations on Queue ( 1
for yes, any other key to exit) ");
scanf("%d" , &will);
}
//end of outer while
}
//end of main
void add(int a)
{
if(rear>MAXSIZE)
{
printf(" QUEUE FULL");
return;
}
else
{
q[rear]=a;
rear++;
printf("Value of rear = %d and the value of front is
%d",rear,front);
}
}
del(void)
80
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

{
int a;
if(front == rear)
{
printf(" QUEUE EMPTY");
return(0);
}
else
{
a=q[front];
front++;
}
return(a);
}
Problema 11.10.
// program cu motoare de date tip stive
#include <stdio.h>
#include<process.h>
#include <dos.h>
#include<conio.h>
#include<stdio.h>
#define SIZE 5
static struct stack
{
int top;
int items[SIZE];
}
s1;
void push(struct stack *,int);
int pop(struct stack*);
int stacktop(struct stack*);
int empty(struct stack*);
int search(struct stack *,int);
void insert(struct stack *,int,int);
void replace(struct stack *,int,int);
void del(struct stack *,int);
void printline(void);
void main()
{
char c;
int i,temp;
s1.top=-1;
mark:
clrscr();
81
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

gotoxy(28,2);
printf("BASIC STACK OPERATIONS");
gotoxy(34,4); printf("(1) Push");
gotoxy(34,6); printf("(2) Pop");
gotoxy(34,8); printf("(3) Search");
gotoxy(34,10); printf("(4) Insert");
gotoxy(34,12); printf("(5) Replace");
gotoxy(34,14); printf("(6) Delete\n\n");
gotoxy(0,18); printline();
c=getch();
switch (c)
{
case '1':
printf("\nWhat element do you wish to push?");
scanf("%d",&temp);
push(&s1,temp);
break;
case '2':
pop(&s1);
break;
case '3':
printf("\nEnter the element you wish to search?");
scanf("%d",&temp);
printf("\nThe
element
is
at
index
%d\n",search(&s1,temp));
break;
case '4':
printf("\nEnter the POSTION and ELEMENT you
wish to insert?");
scanf("%d %d",&i,&temp);
insert(&s1,i,temp);
break;
case '5':
printf("\nEnter the POSTION and ELEMENT you
wish to replace?");
scanf("%d %d",&i,&temp);
replace(&s1,i,temp);
break;
case '6':
printf("\nEnter the POSTION you wish to delete
from stack?");
scanf("%d",&temp);
del(&s1,temp);
break;
default :
printf("\nInvalid entry! Try again!");
82
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

break;
}
for (i=s1.top;i>=0;i--)
printf("\nThe element at position (%d) is %4d",i,s1.items[i]);
printf("\n\nDo you wish to continue?");
c=getch();
if (c=='y')
goto mark;
}
void push(struct stack *sx,int x)
{
if (sx->top==SIZE-1)
{
printf("\n\tSTACT OVERFLOW\n");
getch();
exit(1);
}
sx->items[++sx->top]=x;
}
int pop(struct stack *sx)
{
if (empty(sx))
{
printf("\n\t STACK UNDERFLOW\n");
getch();
exit(1);
}
return(sx->items[sx->top--]);
}
int stacktop(struct stack *sx)
{
return(sx->items[sx->top]);
}
int empty(struct stack *sx)
{
return((sx->top==-1));
}
int search(struct stack *sx,int n)
{
int arr[20];
int i=0,j,result=-1;
for (j=sx->top;!(empty(sx));j--)
{
if (n==stacktop(sx))
{
result=sx->top;
83
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

break;
}
arr[i++]=pop(sx);
}
for (j=i-1;j>=0;j--)
push(sx,arr[j]);
return(result);
}
void insert(struct stack *sx,int pos,int ele)
{
int arr[20];
int i=0,j;
for (j=sx->top;j>=pos;j--)
arr[i++]=pop(sx);
push(sx,ele);
for (j=i-1;j>=0;j--)
push(sx,arr[j]);
}
void replace(struct stack *sx,int pos,int ele)
{
int arr[20];
int i=0,j;
for (j=sx->top;j>=pos;j--)
arr[i++]=pop(sx);
push(sx,ele);
for (j=i-2;j>=0;j--)
push(sx,arr[j]);
}
void del(struct stack *sx,int pos)
{
int arr[20];
int i=0,j;
for (j=sx->top;j>pos;j--)
arr[i++]=pop(sx);
pop(sx);
for (j=i-1;j>=0;j--)
push(sx,arr[j]);
}
void printline(void)
{
int i;
for (i=0;i<40;i++)
printf("");
}

84
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

Problema 11.11.
// program cu motoare de date tip liste nlnuite
# include <stdio.h>
# include <stdlib.h>
struct qnode
{
int data;
int prio;
struct qnode *next;
};
void quein(struct qnode **, struct qnode **, int , int);
int quedel(struct qnode **, struct qnode **, int *, int *);
int main(void)
{
int tab[10] = {2, 8, 3, 5, 4, 9, 6, 7, 1, 0};
struct qnode *first = NULL;
struct qnode *last = NULL;
int val, prio, i;
for(i = 0; i < 10; i++)
{
val = tab[i], prio = i;
printf("Inserting: value: %d with priority: %d\n", prio, val);
quein(&first, &last, val, prio);
}
printf("=-=\n");
for(i = 0; i < 11; i++)
{
val = tab[i], prio = i;
if(quedel(&first, &last, &val, &prio) != -1)
printf("Deleting: value: %d with priority: %d\n", prio, val);
}
return 0;
}
int quedel(struct qnode **first, struct qnode **last, int *prio, int *val)
{
struct qnode *tmp = NULL;
if((NULL == *last) && (*last == *first))
{
fprintf(stderr, "Empty queue.....\n");
return -1;
}
*val = (*first)->data, *prio = (*first)->prio;
tmp = *first, *first = (*first)->next;
if(*last == tmp)
85
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

*last = (*last)->next;
free(tmp);
return 0;
}
void quein(struct qnode **first, struct qnode **last, int prio, int val)
{
struct qnode *tmp = NULL;
struct qnode *tmp1 = NULL;
tmp = malloc(sizeof(struct qnode));
tmp->data = val;
tmp->prio = prio;
tmp->next = NULL;
if(*last == NULL)
{
*last = tmp;
*first = *last;
}
else
{
if((*first)->prio < prio) {
tmp->next = *first;
*first = tmp;
}
else
{
if((*last)->prio > prio)
{
(*last)->next = tmp;
*last = tmp;
}
else
{
tmp1 = *first;
while((tmp1->next)->prio >= prio)
{
tmp1 = tmp1->next;
}
tmp->next = tmp1->next;
tmp1->next = tmp;
}
}
}
return;
}

86
MatrixRom 2013

ISBN: 978-973-755-897-8

Elemente de baz ale programrii n C - Aplicaii de Laborator

11.7.

Probleme

10.7.1. Ce sunt algoritmi?


10.7.2. Care sunt tipurile de algoritmi?
10.7.3. Care sunt tipurile de algoritmi de stocare i de cutare?
10.7.4. Ce se nelege prin motoare de date?
10.7.5. Care sunt tipurile de motoare de date?
10.7.6. Scriei cte un program care s foloseasc algoritmi de stocare, de cutare i
motoare de date

87
MatrixRom 2013

ISBN: 978-973-755-897-8

S-ar putea să vă placă și