Muitos mais exercícios!TopAulas práticas - inclui folhas, exercícios... 
         e talvez algumas resoluções...e talvez um possível exame...Alguns exercícios...

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

Muitos mais exercícios!TopAulas práticas - inclui folhas, exercícios... 
         e talvez algumas resoluções...e talvez um possível exame...Alguns exercícios...