Alguns exercícios...
Exercícios:
1) Escreva a função
void vogais(char *s)
que extrai as vogais do "string" s.
Exemplo: "batatas fritas" => "btts frts"
Sugestão: Use 2 inteiros i, j tal que s[j] é o
caracter em análise e s[i] a posição onde
s[i] (se não for vogal) é colocado.
(atribuição básica): s[i] = s[j];
int vogal(int ch){
return(ch=='a' ||ch=='e' ||ch=='i' ||ch=='o' ||ch=='u');
}
void vogais(char *s){
int i=0, j=0;
for(j=0;s[j];j++)
if(!vogal(s[j]))
s[i++]=s[j];
s[i]=0;
}
//------------------------------
#define MAX 1000
main(){
char s[MAX];
while(1){
scanf("%s",s);
vogais(s);
printf(" %s\n",s);
}
}
/*-----------------------------------
Exercícios complementares:
1) escreva "vogal" como macro
2) exercício: escreva uma função "void duplica(char *s)"
que repete todos os caracteres de s.
todos ==> ttooddooss
Não utilize vectores auxiliares.
-------------------------------------*/
2) Escreva a função
int merge(int v[],int m,int w[],int n,int z[])
que efectua a fusão (merge) dos vectores ordenados
v[],m e w[],n em z[]. O valor retornado é o número de
elementos de z[].
int merge(int v[],int m,int w[],int n,int z[]){
int pv=0,pw=0,pz=0;
while(pv<m && pw<n){
if(v[pv]<w[pw]){
z[pz]=v[pv];
pv++;
}
else{
z[pz]=w[pw];
pw++;
}
pz++;
}
for(i=pv;i<m;i++) z[pz++]=v[i];
for(i=pw;i<n;i++) z[pz++]=w[i];
return pz;
}
3) Análogo ao problema das "cruzadas" dado na aula teórica
mas com 8 direcções (horizontal+, horizontal-,
vertical+, vertical-, e 4 direcções diagonais).
Procurar a palavra pal na matriz de caracteres
m[][] a partir da linha i0, coluna j0,
com a direcção di, dj
Resultado: SIM (1) ou NAO (0)
Ex:
pal = "piu", i=2, j=1,
| 'f' 'a' 'p' 'i' |
pal = | 'p' 'p' 'o' 'p' |
| 'i' 'p' 'i' 'u' |
| 'u' 'a' 't' 'o' |
retorna SIM
int procura(char *pal, char v[][],
int i0, int j0,
int di, int dj)
Melhorias:
1) Leitura da matriz
2) Outras direcções (8 no total)
3) Procurar várias palavras
-----------------------------------------*/
#define MAX 4
/* comparar pal[0] com v[i0][j0]
comparar pal[1] com v[i0+di][j0+dj]
...
*/
int procura(char pal[], char v[][MAX],
int i0, int j0,
int di, int dj){
int i=i0, j=j0, c=0;
while(i>=0 && i<MAX && j>=0 && j<MAX){
if(pal[c]!=v[i][j])
return 0;
if(pal[c+1]==0)
return 1;
c++;i+=di;j+=dj;
}
return 0;
}
//------------------------------------------
main(){
int i,j,d,
di[]={0, 0,1,-1,1, 1,-1,-1},
dj[]={1,-1,0, 0,1,-1, 1,-1},
dirs=8;
char
v[MAX][MAX] = {{'p','a','p','i'},
{'i','p','o','p'},
{'p','p','i','u'},
{'u','a','t','o'}},
pal[] = "pi";
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
for(d=0;d<dirs;d++)
if(procura(pal,v,i,j,di[d],dj[d]))
printf("Linha %d, coluna %d, direcção (%d,%d)\n",i+1,j+1,di[d],dj[d]);
}
4) Análogo ao problema das "cruzadas" dado na aula teórica
mas com os seguintes "extras":
- Leitura da tabela de um ficheiro dado na linha
de comando
- Perguntando repetidamente ao utilizador qual a
palavra a procurar até ao utilizador dar ".".
#include <stdio.h>
#define MAX 100
#define MAXP 100
/* comparar pal[0] com v[i0][j0]
comparar pal[1] com v[i0+di][j0+dj]
...
*/
int procura(char pal[], char v[][MAX],int dim,
int i0, int j0,
int di, int dj){
int i=i0, j=j0, c=0;
while(i>=0 && i<dim && j>=0 && j<dim){
if(pal[c]!=v[i][j])
return 0;
if(pal[c+1]==0)
return 1;
c++;i+=di;j+=dj;
}
return 0;
}
//------------------------------------------
void erro(char mes[]){
printf("Erro: %s\n",mes);
exit(1);
}
//------------------------------------------
int letra(int ch){
return(ch>='a' && ch<='z');
}
//------------------------------------------
main(int np, char *par[]){
FILE *f;
int i,j,d,dim,
di[]={0, 0,1,-1,1, 1,-1,-1},
dj[]={1,-1,0, 0,1,-1, 1,-1},
dirs=8;
char v[MAX][MAX], pal[MAXP], ch;
//----- ficheiro -------------------------
if(np!=2)
erro("Uso: cruza <fich>");
f=fopen(par[1],"r");
if(f==NULL) erro("Erro de ficheiro");
//----- leitura sopa ---------------------
fscanf(f,"%d",&dim);
for(i=0;i<dim;i++)
for(j=0;j<dim;j++){
do fscanf(f,"%c",&ch); while(!letra(ch));
v[i][j]=ch;
}
//----- lê pal, procura -------------------
do{
printf(" palavra? ");
scanf("%s",pal);
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
for(d=0;d<dirs;d++)
if(procura(pal,v,dim,i,j,di[d],dj[d]))
printf("Linha %d, coluna %d, direcção (%d,%d)\n",
i+1,j+1,di[d],dj[d]);
}
while(pal[i]!='.');
}
PC/PI - página reservada - versão 2005.02.08