Você está na página 1de 25

ESTRUTURA DE DADOS

Ricardo de Almeida (ricardo.almeida@univix.edu.br)

Agenda
1.

2.
3. 4.

5.

Relembrando... Funes de Manipulao Funes Recursivas Exerccios de Fixao Reviso

Relembrando...
Quais pontos foram vistos na aula anterior? Caracteres.

Cadeia de Caracteres.
Declaraes da Cadeia de Caracteres. Leitura de Caracteres e Cadeia de Caracteres.

Funes de Manipulao
Funes de Manipulao

Vamos verificar a
manipulam cadeia

implementao
de caracteres.

de

algumas

funes

que
a

Inicialmente

considerar

implementao de duas funes que imprimem uma cadeia de caracteres, caractere por caractere e uma string inteira.
/ * caractere por caractere */ void imprime (char* s) / * impresso de string*/ void imprime (char* s)

{
int i; for (i=0; s[i] != '\0'; i++) printf("%c",s[i]);

{
printf("%s\n",s); }

printf("\n");
}

Funes de Manipulao
Funes de Manipulao

Veremos agora uma funo que retorne o comprimento de uma


cadeia de entrada; conte o nmero de de caracteres at encontrar o caractere nulo; o caractere nulo em si no contado. Ex: 7.8
#include <stdio.h> #include <stdlib.h> int main (void) {

/* 7.8 Comprimento */
int comprimento (char* s){ int i; int n = 0; /* contador */

int tam;
char cidade[] = "Rio de Janeiro"; tam = comprimento(cidade);
printf("A string \"%s\" tem %d caracteres\n",

for (i=0; s[i] != '\0'; i++)


n++; return n; }

cidade, tam);

system ("PAUSE"); return 0; }

Funes de Manipulao
Funes de Manipulao

Vamos implementar uma funo para copiar os elementos de


uma cadeia de caracteres para outra; a que receber a cpia, dever ter espao suficiente para executar a operao. Ex: 7.9
#include <stdio.h> #include <stdlib.h> int main (void) {

/* 7.9 Copia */
void copia (char* dest, char* orig){ int i; for (i=0; orig[i] != '\0'; i++)

char cidade[] = "Rio de Janeiro";


char capital[20]; copia (capital, cidade);
printf("A cidade eh: %s\n", cidade);

dest[i] = orig[i];
/* fecha a cadeia copiada */ dest[i] = '\0'; } }

printf("A capital eh: %s\n", capital);

system ("PAUSE"); return 0;

Funes de Manipulao
Funes de Manipulao

Vamos implementar uma funo para concatenar uma cadeia de


caracteres com outra j existente. Isto , os caracteres de uma cadeia so copiados no final da outra cadeia. Ex: 7.10
#include <stdio.h> #include <stdlib.h>

void concatena (char* dest, char* int i = 0; int j; while (dest[i] != '\0) i++; for (j=0; orig[j] != '\0'; j++) { dest[i] = orig[j]; i++; } dest[i] = '\0'; }

orig) { /* 7.10 Concatena */ /* indice da cadeia destino */ /* indice da cadeia origem */ /* acha o final da cadeia destino */
/* copia para o final do destino */

/* fecha cadeia destino */

Funes de Manipulao
int main (void) { char nome [30], sobrenome [30]; printf("Informe o seu nome: "); scanf(" %[^\n]", nome); printf("Informe o seu sobrenome: "); scanf(" %[^\n]", sobrenome); concatena (nome, sobrenome); printf("Seu nome completo eh: %s\n", nome); system ("PAUSE"); return 0;

Funes de Manipulao
Funes de Manipulao

Vamos implementar uma funo para comparar caractere por


caractere de duas cadeias dadas. Para fazer a comparao, usaremos os cdigos numricos associados aos caracteres para determinar a ordem relativa entre eles. Dessa forma, se as duas cadeias passadas para a funo forem compostas apenas por letras minsculas ou apenas por letras maisculas, conseguimos determinar a ordem alfabtica relativa entre elas. Para o valor de

retorno da funo ser -1; e se a segunda preceder a primeira,


ser 1; se ambas as cadeias estiverem na mesma sequncia de caracteres, ser 0. Uma possvel implementao dessa funo mostrada a seguir: Ex: 7.11

Funes de Manipulao
#include <stdio.h> #include <stdlib.h> /* 7.11 - Funo para comparar duas cadeias de caracteres */ int compara (char* s1, char* s2) { int i; /* compara caractere por caractere */ for (i=0; s1[i]!=\0 && s2[i]!=\0; i++) { if (s1[i] < s2[i]) return -1; else if (s1[i] > s2[i]) return 1; } /* compara se cadeias tm o mesmo comprimento */ if (s1[i]==s2[i]) return 0; /* cadeias iguais */ else if (s2[i]!= '\0') return -1; /* s1 menor, pois tem menos caracteres */ else return 1; /* s2 menor, pois tem menos caracteres */

Funes de Manipulao
int main (void) { int retorno; char senha1 [8], senha2 [8]; printf("Informe uma senha: "); scanf(" %[^\n]", senha1); printf("Confirme sua senha: "); scanf(" %[^\n]", senha2); /* Comparao das Senhas */ retorno = compara (senha1, senha2); if (retorno == 0) printf("As senhas conferem!!!\n"); else if (retorno == (-1)) printf("A senha [%s] vem antes da senha [%s]!!!\n", senha1, senha2); else printf("A senha [%s] vem depois da senha [%s]!!!\n", senha1, senha2);

system ("PAUSE"); return 0;

Funes de Manipulao
Funes de Manipulao

Funes anlogas s funes comprimento, copia, concatena e


compara, so disponibilizadas pela biblioteca padro de C. As funes da biblioteca padro so, respectivamente, strlen, strcpy, strcat e strcmp; que fazem parte da biblioteca de cadeias de caracteres (strings), string.h.

Existem diversas outras funes que manipulam cadeias de


caracteres nessa biblioteca. A razo de mostrarmos possveis implementaes destas funes como exerccio ilustrar a codificao da manipulao de cadeias de caracteres.

Funes de Manipulao
Funes de Manipulao

Vamos implementar uma funo para duplicar uma cadeia de


caracteres, copiando elementos, usando para isso a conhecida Alocacao Dinamica so copiados no final da outra cadeia. Ex: 7.12
#include <stdio.h> #include <stdlib.h>

#include <string.h>
char* duplica (char* s) { int n = strlen(s);

char* d = (char*) malloc ((n+1)*sizeof(char));


strcpy(d,s); return d; }

Funes de Manipulao
int main (void) { char cidade [20]; char * capital; printf("Informe o nome de uma cidade: "); scanf(" %[^\n]", cidade); capital = duplica (cidade); printf("A cidade eh: %s\n", cidade); printf("A capital eh: %s\n", capital); free (capital); system ("PAUSE"); return 0;

Funes Recursivas
Funes Recursivas

Uma cadeia de caracteres pode ser definida de forma recursiva.


Podemos dizer que uma cadeia de caracteres representada por: uma cadeia de caracteres vazia; ou um caractere seguido de uma (sub) cadeia de caracteres. Isto , podemos dizer que uma cadeia s no vazia pode ser representada pelo seu primeiro caractere s[0] seguido da cadeia

que comea no endereo do ento segundo caractere, &s[1].


Vamos reescrever algumas das funes mostradas anteriormente, agora com a verso recursiva.

Funes Recursivas
Funes Recursivas

Uma verso recursiva da funo para imprimir a cadeia caractere


por caractere mostrada a seguir. A funo deve primeiro testar se a condio da cadeia vazia, se for, nada precisa ser impresso; se no for vazia, devemos imprimir o primeiro caractere e ento chamar uma funo para imprimir a sub-cadeia que se segue.
#include<stdio.h> #include<stdlib.h> int main() {

/* 7.13 - Impresso Recursiva */


void imprime_rec (char* s) { if (s[0] != '\0') { printf("%c",s[0]);

char cidade[ ] = SALVADOR";


imprime_rec(cidade); printf("\n"); system ("PAUSE");

imprime_rec(&s[1]); }
} }

return 0;

Funes Recursivas
Funes Recursivas

Algumas implementaes ficam bem mais simples se feitas


recursivamente. Por exemplo, simples alterar a funo anterior e fazer com que os caracteres da cadeia sejam impressos em ordem inversa, de trs para a frente: basta imprimir a sub-cadeia antes de imprimir o primeiro caractere.
#include<stdio.h> #include<stdlib.h> int main() {

/* 7.14 - Impresso Inversa Rec. */


void imprime_inv (char* s) { if (s[0] != '\0) { imprime_inv(&s[1]);

char cidade[ ] = SALVADOR";


imprime_rec(cidade); printf("\n"); system ("PAUSE");

printf("%c",s[0]); }
} }

return 0;

Funes Recursivas
Funes Recursivas

Uma implementao recursiva da funo que retorna o nmero


de caracteres existentes na cadeia mostrada a seguir. Ex: 7.15
#include <stdio.h> #include <stdlib.h> /* 7.15Compr. Recur. */ int comprimento_rec (char* s) { if (s[0] == '\0') int main (void) {

int tam;
char cidade[] = "Rio de Janeiro"; tam = comprimento(cidade);
printf("A string \"%s\" tem %d

return 0;
else return 1 + comprimento_rec(&s[1]);

caracteres\n", cidade, tam);

system ("PAUSE"); return 0; }

Funes Recursivas
Funes Recursivas

Vamos mostrar agora uma possvel implementao recursiva da


funo copia mostrada anteriormente. Ex: 7.16
#include <stdio.h> #include <stdlib.h> int main (void) {

/* 7.16 Copia Recursiva */


void copia_rec (char* dest, char* orig) { if (orig[0] == '\0')

char cidade[] = "Rio de Janeiro";


char capital[20]; copia (capital, cidade);
printf("A cidade eh: %s\n", cidade);

dest[0] = '\0';
else { dest[0] = orig[0]; copia_rec(&dest[1],&orig[1]); } }

printf("A capital eh: %s\n", capital);

system ("PAUSE"); return 0;

Funes Recursivas
Funes Recursivas

Vamos mostrar agora uma possvel implementao recursiva da


funo copia mais compacta. Ex: 7.17
#include <stdio.h> #include <stdlib.h> int main (void) {

/* 7.17 Copia Rec. Compacta */


void copia_rec2 (char* dest, char* orig) {

char cidade[] = "Rio de Janeiro";


char capital[20]; copia (capital, cidade);
printf("A cidade eh: %s\n", cidade);

dest[0] = orig[0];
if (orig[0] != '\0') copia_rec_2(&dest[1],&orig[1]); } }

printf("A capital eh: %s\n", capital);

system ("PAUSE"); return 0;

Exerccios Prticos de Fixao

Exerccios Prticos de Fixao

Funes Recursivas
E como seria para trabalharmos com Nova Estrutura? o que veremos no prximo captulo, quando discutirmos: Tipos Estruturados.

Reviso
Quais pontos foram vistos nesta aula? Funes de Manipulao.

Funes Recursivas.

ESTRUTURA DE DADOS

Ricardo de Almeida (ricardo.almeida@univix.edu.br)