Sumário Funções e vetores Menismo de pssgem dos vetores Aplição dos oneitos no desenvolvimento de funções de ordenção e de prour em vetores. Algoritmos de ordenção e de prour em vetores Algoritmo I: Bule-Sort Algoritmo II: Ordenção om prour do mínimo Prour inári, num vetor que estej ordendo Progrmção 2007/2008 DEEC-IST Ordenção dos elementos de um vetor Prolem: É neessário desenvolver um progrm que efetue ordenção de um onjunto de números, por ordem resente de vlores. Os números estão rmzendos num vetor. Considere que o vetor tem dimensão DIMV. Algoritmo: Ordenr os elementos de um vetor signifi ter de tror os elementos do vetor té que ondição de ordenção sej válid. Existem diversos lgoritmos que podem ser utilizdos n ordenção, uns mis efiientes (em termos de rpidez) do que outros. O estudo dos lgoritmos de ordenção e de prour, ssim omo o respetivo desempenho será relizdo n disiplin de Algoritmos e Estruturs de Ddos. Progrmção 2007/2008 DEEC-IST 2
Ordenção dos elementos de um vetor Ações: Ler os números pr um vetor Definir quntidde de números que é neessário rmzenr Definir dimensão do vetor Desenvolver o lgoritmo de ordenção Comprr dus posições do vetor Se [i] > [j] então tror os onteúdos Prr tro de onteúdos qundo todos os números estiverem ordendos Apresentr o resultdo Progrmção 2007/2008 DEEC-IST Ordenção dos elementos de um vetor Algoritmo I (Bule-Sort): Considerem-se os elementos do vetor v[ ] e use-se um vriável uxilir ux pr relizr tro Psso Psso 2 Psso V[] V[] ux V[] V[] ux V[] V[] ux Progrmção 2007/2008 DEEC-IST 4
Ordenção dos elementos de um vetor Algoritmo I (ont.): Psso 4 Como o vetor não está ordendo é neessário omeçr do iníio novmente. Psso Psso 6 V[] V[] ux V[] V[] ux V[] V[] ux Psso 7 Psso 8 V[] V[] ux V[] V[] ux Progrmção 2007/2008 DEEC-IST Ordenção dos elementos de um vetor Algoritmo I: Código (Versão ) /*-------------------------------------+ Progrm: Orden os elementos de um vetor de inteiros utilizndo o lgoritmo Bule Sort Vers o:.0, - Progrm sem funções Autor: B. Andrde d Cost Dt: 200/0/0 +-------------------------------------*/ #inlude <stdio.h> #define DIMV int min(void){ int v[dimv]; int orden, numvolts, i,numve; printf("leitur dos numeros \n"); printf(" f - fim\n MAX = %d \n", DIMV); /* Le o mximo de DIMV elementos */ for(i=0; i<dimv;++i){ printf("v[%d]=", i); if(0== snf("%d",&(v[i]))) rek; /* Se erro fim d leitur */ /* Por exemplo qundo o utilizdor rreg em f */ /* Numero de elementos no vetor */ numve=i; /* Cont o numero de volts o vetor */ numvolts=; orden=; while(orden == ){ printf("%d volt o vetor \n", numvolts); orden=0; Progrmção 2007/2008 DEEC-IST 6
Ordenção dos elementos de um vetor Algoritmo I: Código (Cont.) for(i=0; i<(numve-); ++i) if(v[i]>v[i+]){/* tro */ int ux; ux=v[i+]; v[i+]=v[i]; v[i]=ux; /* E neessrio verifir todos mis um vez */ orden=; ++numvolts; /* Apresent o resultdo */ printf("\n"); for(i=0; i<numve; ++i) printf("v[%d]=%d\n", i, v[i]); if(numve == 0) printf("vetor Vzio \n"); printf("fim."); return 0; Síd do progrm: Leitur dos numeros f - fim MAX = v[0]=4 v[]= v[2]=2 v[]= v[4]=0 v[]=f volt o vetor 2 volt o vetor volt o vetor 4 volt o vetor volt o vetor v[0]=0 v[]= v[2]=2 v[]= v[4]=4 Fim. Progrmção 2007/2008 DEEC-IST 7 Ordenção dos elementos de um vetor Comentários reltivos o progrm nterior: A odifição do lgoritmo não é mis dequd. A leitur e nálise do progrm não é fáil, ddo que todo o ódigo foi olodo n função min. A utilizção do lgoritmo de ordenção noutro progrm é extremmente difíil ddo que o progrmdor tem sempre que se preoupr om os detlhes d solução nterior. Pr melhorr legiilidde do ódigo devem ser utilizds funções. É fáil onluir que o progrm seri mis fáil de nlisr e de esrever se tivessem sido utilizds funções. Progrmção 2007/2008 DEEC-IST 8
Funções e vetores Comentários reltivos o progrm nterior: No exemplo nterior é onveniente ter funções om rgumentos do tipo vetor pr: Ler os números do teldo pr o vetor. Esrever os elementos do vetor no erã. Testr se existe neessidde de tror o onteúdo de dus vriáveis do vetor. Tror dois elementos do vetor Ordenr os elementos do vetor. Colo-se então o prolem d definição de funções que reeem rgumentos do tipo vetor. Progrmção 2007/2008 DEEC-IST 9 Funções e vetores Em C os vetores são sempre pssdos por referêni. O nome do vetor é interpretdo omo o endereço do primeiro elemento do vetor. Qundo é neessário pssr um vetor omo rgumento de um função podem ser utilizds dus forms: Notção vetoril, exemplo do protótipo de um função que reee um vetor de inteiros (int v[]). int le_vetor(int v[], int dimv); Notção om pontdor Neste so é importnte lemrr que os elementos de um vetor estão ontíguos em memóri. O esso d um desses elementos pode ser relizdo utilizndo o endereço do primeiro elemento om operções sore os pontdores. Este ssunto será orddo num próxim ul. int le_vetor(int*v, int dimv); Progrmção 2007/2008 DEEC-IST
Funções e vetores É importnte slientr que um função não onsegue determinr por si só qul é o omprimento do vetor. É neessário pssr pr função o omprimento do vetor. Ou em lterntiv o número de elementos que têm informção útil. No exemplo seguinte int le_vetor(int v[], int dimv){... dimv - é um vriável lol à função que é utilizd pr gurdr dimensão do vetor. Esse vlor que deve ser forneido no momento em que função é invod. Note-se que, em prinípio, o ompildor não verifi se o ódigo de um função está efetur essos for d memóri que foi triuid o vetor. Por exemplo, eder à posição 20 qundo o vetor tem só elementos. Qundo isso ontee é usul que o progrm deixe de funionr. O progrmdor deve ter muito uiddo qundo efetu operções om vetores. Progrmção 2007/2008 DEEC-IST Funções e vetores N versão do ódigo que vi ser presentd, prourou-se dividir o progrm em funções de modo filitr esrit e respetiv ompreensão. As funções estão olods em três fiheiros: min. vet. Função prinipl do progrm. Contém s funções de leitur de um vetor (do teldo) e esrit no erã es_int. Contém s funções que efetum mnipulção de eslres do tipo int orden. função de omprção função de tro de ontéudo de vriáveis. Contém função de ordenção ule_sort Os fiheiros ontêm tmém omentários de modo filitr respetiv leitur e nálise. Progrmção 2007/2008 DEEC-IST 2
Funções e vetores Algoritmo I: Código (Fiheiro min.) /*-------------------------------------+ Progrm: (fiheiro: min.) Orden os elementos de um vetor de inteiros utilizndo o lgoritmo Bule Sort Vers o: 2.0, - Progrm om funções Autor: B. Andrde d Cost Dt: 200/0/0 +-------------------------------------*/ #inlude <stdio.h> #define DIMV #define ORDEM_CRES /* Aqui podemos utilizr fiheiros de inlude om prototipos */ extern int le_vetor(hr nome[], int vint[], int dimvi); extern void es_vetor(hr nome[], int vint[], int dimvi); extern int ule_sort(int vint[], int dimvi, int odr); int min(void){ int v[dimv]; int numelemv; Progrmção 2007/2008 DEEC-IST Funções e vetores Algoritmo I: Código (Fiheiro min.) printf("algoritmo ule sort \n"); printf("leitur dos numeros \n"); printf(" f - fim\n MAX = %d \n", DIMV); /* Le o mximo de DIMV elementos */ numelemv = le_vetor("", v, DIMV); /* Orden o vetor, ordem sendente */ ule_sort(v, numelemv, ORDEM_CRES); printf("\n"); if(numelemv>0){ /* Apresent o resultdo só os numelemv elementos */ printf("vetor Ordendo \n"); es_vetor("",v, numelemv); else printf("vetor Vzio \n"); printf("fim."); return 0; Progrmção 2007/2008 DEEC-IST 4
Funções e vetores Algoritmo I: Código (Fiheiro vet.) /*-------------------------------------------- Fiheiro: vet. Contem s funoes: le_vetor : Le um vetor inteiros do teldo es_vetor : Esreve um vetor de inteiros no er Dependênis: Nenhum Versão: 2.0, - Progrm om funções Autor: B. Andrde d Cost Dt: 200/0/0 +--------------------------------------------*/ Progrmção 2007/2008 DEEC-IST Funções e vetores Algoritmo I: Código (Fiheiro vet.) /*--------------------------------------------- Funo: le_vetor Argumentos: nome - String om o nome do vetor que deve preer no er vint - vetor de int que vi reeer os vlores dimvi - dimenso do vetor Retorn: Quntidde de numeros no vetor +----------------------------------------------*/ int le_vetor(hr nome[], int vint[], int dimvi){ int i; for(i=0; i<dimvi;++i){ printf("%s[%d]=", nome, i); if(snf("%d",&(vint[i]))==0) rek; /* Se erro fim d leitur */ /* Por exemplo qundo o utilizdor rreg em f */ return i; Progrmção 2007/2008 DEEC-IST 6
Funções e vetores Algoritmo I: Código (Fiheiro vet.) /*--------------------------------------------- Funo: es_vetor Argumentos: nome - String om o nome do vetor que deve preer no er vint - vetor de int que tem os vlores dimvi - dimenso do vetor ou numero de elementos serem imprimidos +---------------------------------------------*/ void es_vetor(hr nome[], int vint[], int dimvi){ int i; for(i=0; i<dimvi; ++i) printf("%s[%d]=%d\n", nome, i, vint[i]); /* Fim do fiheiro vet. */ Progrmção 2007/2008 DEEC-IST 7 Funções e vetores Algoritmo I: Código (Fiheiro orden.) /*-------------------------------------------- Fiheiro: orden. Contem s funoes: ule_sort : Reee um vetor e orden-o. E possivelespeifir o tipo de ordeno Dependênis: So neessáris s funoes int ompr_ints (int x, int y); void tro_ints (int *x, int *y) Versão: 2.0, - Progrm om funções Autor: B. Andrde d Cost Dt: 200/0/0 +--------------------------------------------*/ extern int ompr_ints(int x, int y); extern void tro_ints(int*x, int*y); Progrmção 2007/2008 DEEC-IST 8
Funções e vetores Algoritmo I: Código (Fiheiro orden.) int ule_sort(int vint[], int dimvi, int odr){ int i, orden=; if((odr!= )&&(odr!=-)) return 0; while(orden == ){ orden=0; for(i=0; i<(dimvi-); ++i) if(ompr_ints(vint[i], vint[i+]) == odr){/* tro */ tro_ints(&(vint[i]),&(vint[i+])); /* E neessrio verifir mis um vez */ orden=; return ; Progrmção 2007/2008 DEEC-IST 9 Funções e vetores Algoritmo I: Código (Fiheiro es_int.) /*-------------------------------------------- Fiheiro: eslr. Contem s funoes que mnipulm eslres do tipo int ompr_ints : Compr s vriveis x e y, devolve se x > y devolve 0 de x se igul y devolve - se x < y tro_ints :Tro o onteudo de dus vriveis Dependenis: Nenhum Versão: 2.0, - Progrm om funções Autor: B. Andrde d Cost Dt: 200/0/0 +--------------------------------------------*/ Progrmção 2007/2008 DEEC-IST 20
Funções e vetores Algoritmo I: Código (Fiheiro es_int.) /*--------------------------------------------- Funo: ompr_ints Argumentos: x e y - vriveis do tipo inteiro Retorn: devolve se x > y devolve 0 se x e igul y devolve - se x < y +----------------------------------------------*/ int ompr_ints(int x, int y){ if(x>y) return ; if(x== y) return 0; return-; Progrmção 2007/2008 DEEC-IST 2 Funções e vetores Algoritmo I: Código (Fiheiro es_int.) /*-------------------------------------------- Funo: tro_ints Argumentos: x e y - pontdores pr s vriveis Retorn: void +----------------------------------------------*/ void tro_ints(int*x, int*y){ int ux; ux=*x; *x=*y; *y=ux; /* Fim do fiheiro es_int. */ Resultdo do progrm: Algoritmo ule sort Leitur dos numeros f - fim MAX = [0]=2 []= [2]=4 []= [4]=0 []=f Vetor Ordendo [0]=0 []= [2]=2 []= [4]=4 Fim. Progrmção 2007/2008 DEEC-IST 22
Ordenção dos elementos de um vetor Algoritmo II: Considere-se um vetor de dimensão n. Utilizem-se s vriáveis w = n e p = ; Determin o menor dos w elementos do vetor e respetiv posição, k. De seguid tror o ontéudo d posição p do vetor om o onteúdo d posição k onde está o vlor mínimo. Repete-se os pssos nteriores, pr os w- elementos do vetor om p = p+ Psso Psso 2 Psso V[] V[] ux V[] V[] ux V[] V[] ux Progrmção 2007/2008 DEEC-IST 2 Ordenção dos elementos de um vetor Exeríio II: Esrev um função que relize o lgoritmo II de ordenção. Utilize, se possível, s funções que já form desenvolvids pr o progrm de teste do ule sort. Esrev função min que permit testr função que desenvolver. Progrmção 2007/2008 DEEC-IST 24
Ordenção dos elementos de um vetor Algoritmo II: Código d função int orden_lg2(int vint[], int dimvi, int odr){ int i, j; if((odr!= )&&(odr!=-)) return 0; for(i=0; i<(dimvi-);++i) { int minimo = vint[i]; int pos_minimo = i; for(j=i+; j<dimvi; ++j){ if(ompr_ints(minimo, vint[j]) == odr){ pos_minimo=j; minimo=vint[j]; tro_ints(&(vint[i]),&(vint[pos_minimo])); return ; Progrmção 2007/2008 DEEC-IST 2 Prour inári num vetor Prolem: Pretende-se desenvolver um função que relize prour inári num vetor de inteiros. Assume-se que o vetor está ordendo. Est ondição é fundmentl pr plição do lgoritmo. O lgoritmo de prour inári onsiste nos seguintes pssos: Iniilmente é feito um esso um elemento do vetor. A esolh do indie do elemento pode ser por exemplo i=n/2 em que N é dimensão do vetor se estiver totlmente preenhido. Aqui podem oorrer três situções: O elemento prourdo está n posição i e omo onsequêni foi enontrdo e prour termin. Ou o elemento está no intervlo [0; i[ Ou pode estr no intervlo ]i+; N-] Como o vetor está ordendo deve então esolher-se o intervlo onde o elemento pode estr e divide-se esse novo intervlo o médio. Este proesso termin qundo o último intervlo tiver um únio elemento. Progrmção 2007/2008 DEEC-IST 26
Prour inári num vetor Exemplo Enontrr o índie do vlor x= no vetor ordendo que se segue: 0 2 4 6 7 8 9 2 4 2 4 6 7 8 20 2 2 24 2 28 29 Progrmção 2007/2008 DEEC-IST 27