Paradigmas da Programação II

Ano Lectivo: 00/01 (2º semestre)

Código C relativo aos Exemplos de problemas
propostos e resolvidos nas Aulas Teóricas e Práticas


Exemplos das Aulas Teóricas

Ciclos em C (aula T) (ex2.c)

#include <stdio.h>

/*----- programa principal -----*/  
int main( )
{int n; 
 int i;

  printf("Inicio da Execucao do 2. Exemplo \n"); 
  scanf("%d",&n); 
  while (n>0)
    { for (i=1; i<=n; i++) { printf("%d ",n); }
      scanf("%d",&n); 
    }
  printf("\n"); 
  printf("Fim da Execucao do 2. Exemplo \n"); 
  return(0);
}

                                                      

ficheiro: ex2.c autor: PRH versao de: 2001.02.14

  • uso do scanf()
  • uso de ciclos diversos

    Arrays e Funcoes Variaveis em C (aula T) (ex5.c)

    #include <stdio.h>
    
    #define MAX 10
    
    /*----- funcoes auxiliares -----*/  
    int par( int n )  { return( n%2 == 0 ); }
    int impar( int n ){ return( n%2 != 0 ); }
    
    /*----- programa principal -----*/  
    int main( )
      { int i=0, a[MAX], max;
        int (*f)( int ); 
        
        scanf("%d",&a[i]); 
        max = a[i++];
        while( i<MAX )
          { 
            scanf("%d",&a[i]);
            if ( a[i]>max ) { max=a[i]; }
            i++;
          }
        if ( par(max) ) { f=par; } else { f=impar; }
        for( i=0; i<max; i++)
          {
            if ( (*f)(a[i]) ) { printf("%d ",a[i]); }
          }
        return( 0 ); 
      } 
    

    ficheiro: ex5.c autor: PRH versao de: 2001.03.10

  • uso de arrays
  • uso de funcoes variaveis
  • calculo do Maximo de uma sequencia

    Insercao Ordenada em C (aula T) (ex7.c)

    #include <stdio.h>
    
    #define MAX 10
    
    /*----- programa principal -----*/  
    int main( )
      { int i, n, max=0, a[MAX];
        
        while ((scanf("%d",&n)!=EOF)&&(max<MAX-1))
          { 
            i=max-1;
            while ( (i>=0)&&(n<a[i]) ) { a[i+1]=a[i]; i--; }
            a[i+1]=n;
            max++;
          }
        for( i=0; i<max; i++)
          {
            printf("%d ",a[i]); 
          }
        printf( "\n" ); 
        return( 0 ); 
      } 
    

    ficheiro: ex7.c autor: PRH versao de: 2001.03.15

  • uso de arrays
  • ordenacao na insercao

    Bubble-Sort em C (aula T) (ex7c.c)

    #include <stdio.h>
    #include <strings.h>
    
    #define bool int
    #define true 1
    #define false 0
    
    #define MAX 10
    #define troca  strcpy(sigla,pals[j]); strcpy(pals[j],pals[j-1]); strcpy(pals[j-1],sigla); aux=cambio[j]; cambio[j]=cambio[j-1]; cambio[j-1]=aux
    
    typedef char str[20];
    
    /*----- programa principal -----*/  
    int main( )
      { int i, j, ult, max=0;
        float aux, cambio[MAX];
        str sigla, pals[MAX];
        bool hatrocas;
        
        while ((max<MAX)&&(scanf("%s",&pals[max])!=EOF))
          { 
            scanf("%f",&cambio[max]); max++;
          }
        i=0; ult=max-1; hatrocas=true;
        while ((i<ult-1)&&hatrocas)
          { hatrocas = false;
            for (j=ult; j>i; j--)
              {
                if (strcmp(pals[j],pals[j-1])<0) { hatrocas=true; troca; }
              } 
            i++;
          }
    printf("%d\n",i);
        for ( i=0; i<max; i++ )
          {
            printf("%s --> %f \n",pals[i],cambio[i]); 
          }
        return( 0 ); 
      } 
    

    ficheiro: ex7c.c autor: PRH versao de: 2001.03.22

  • uso de arrays emparelhados
  • ordenacao por trocas com paragem logo que nao haja alteracoes

    Exercícios das Aulas Teórico-Práticas

    Ciclos em C (aula TP1) (ex1.c)

    #include <stdio.h>
    
    /*----- programa principal -----*/  
    int main( )
    {int n; 
     int conta=0, ant=0;
    
      printf("Inicio da Execucao do 1. Exemplo \n"); 
      scanf("%d",&n); 
      while (n>0)
        { if ((n%2)==0) { conta++; }
          if (n!=ant) { printf("%d ",n); } 
          ant = n;
          scanf("%d",&n); 
        }
      printf("\nO Numero de Pares e: %d \n",conta); 
      printf("Fim da Execucao do 1. Exemplo \n"); 
      return(0);
    }
    
                                                          
    

    ficheiro: ex1.c autor: PRH versao de: 2001.02.13

  • uso do printf() e do scanf()
  • uso de condicoes
  • uso de ciclos diversos

    Codificador de caracteres em C (aula TP1) (ex3.c)

    #include <stdio.h>
    
    /*----- programa principal -----*/  
    int main( )
    {int delta=4; 
     char ch;
    
      ch = getchar(); 
      while (ch != '.')
        { // ch += delta % 256;
          ch = (ch + delta) % 256;
          putchar(ch); 
          ch = getchar(); 
        }
      putchar((ch+delta)%256); 
      return(0); 
    }
    
                                                          
    

    ficheiro: ex3.c autor: PRH versao de: 2001.02.19

  • uso do putchar() e do getchar()
  • uso de caracteres e operacoes numericas com caracteres
  • a leitura da Seq termina com "."

    Codificador de caracteres em C, versao 2 (aula TP1) (ex31.c)

    #include <stdio.h>
    
    /*----- programa principal -----*/  
    int main( )
    {int delta=4; 
     int ch;
      
      while ((ch = getchar()) != EOF)
        { 
          ch = (ch + delta) % 256;
          putchar(ch); 
        }
      return(0); 
    }
    
                                                          
    

    ficheiro: ex31.c autor: PRH versao de: 2001.03.12

  • a leitura da Seq termina com Fim de Ficheiro (Ctrl-D) "EOF"

    DesCodificador de caracteres em C (aula TP1) (ex4.c)

    #include <stdio.h>
    
    /*----- programa principal -----*/  
    int main( )
    {int delta=4; 
     char ch;
    
      ch = getc(stdin); 
      while (ch != (('.'+delta)%256))
        { 
          ch = (ch - delta);
          if (ch < 0) { ch = (256 + ch); }
          putc(ch,stdout); 
          ch = getc(stdin); 
        }
      putc('.',stdout); 
      return(0); 
    }
    
                                                          
    

    ficheiro: ex4.c autor: PRH versao de: 2001.02.19

  • uso do putc() e do getc()
  • uso de caracteres e operacoes numericas com caracteres
  • a leitura da Seq termina com "."

    Processamento de Strings em C (aula TP1) (ex6.c)

    #include <stdio.h>
    
    typedef char str[50];
    
    /*----- programa principal -----*/  
    int main( )
    {int erro,i; 
     str linha;
     char ch;
    
      while ((erro = scanf("%[^\n]",linha)) != 1) 
         { scanf("\n"); }
      scanf("\n%c",&ch);
      for (i=0; (i<strlen(linha)&&(linha[i]!=ch)); i++) { ;} 
      if (linha[i]==ch) {printf("\nposicao: %d\n",i+1);}
         else {printf("\nnao existe!\n");}
      return(0); 
    }
    
                                                          
    

    ficheiro: ex6.c autor: PRH versao de: 2001.03.12

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C (aula TP1) (ex9.c)

    #include <stdio.h>
    
    typedef char str[50];
    
    /*----- programa principal -----*/  
    int main( )
    {int i=0, conta[256]; 
     str linha;
     char ch;
    
      for(i=0; i<256;i++){
    	conta[i]=0;
      }
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      i = 0; 
      while(i<strlen(linha)){
    	conta[linha[i++]]++;
      }
      for(i='a'; i<='z'; i++){
    	printf("%c--%d\n", i, conta[i]);
      }
      return(0); 
    }
    
                                                          
    

    ficheiro: ex9.c autor: Bruno(TP1) versao de: 2001.03.21

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()
  • uso de array de contadores indexado por caracteres

    Processamento de Valores Enumerados (aula TP1) (exp1.c)

    #include<stdio.h>
    
    typedef enum dias {
    	Dom= 1,
    	Seg, 
    	Ter,
    	Qua,
    	Qui,
    	Sex,
    	Sab
                      }  Dias_Semana;
    
    int main()
    {
    	Dias_Semana dia;
    
    	printf("Insira um dia da semana (1 a 7): ");
    	scanf("%d", &dia);
    	switch(dia)
    	{
    		case Seg:
    			printf("E Segunda-Feira.\n");
    			break;
    		case Ter:
    			printf("E Terca-Feira.\n"); 
    			break;
    		case Qua:
    			printf("E Quarta-Feira.\n");
    			break;
    		case Qui:
    			printf("E Quinta-Feira.\n");
    			break;
    		case Sex:
    			printf("E Sexta-Feira.\n");
    			break;
    		case Sab:
    			printf("E Sabado.\n");
    			break;
    		case Dom:
    			printf("E Domingo.\n");
    			break;
    		default:
    			printf("");
    	}
    
    	return (0);
    	
    }
    

    ficheiro: exp1.c autor: Bruno(TP1) versao de: 2001.03.21

  • definicao de Tipo Enumerado
  • uso e construcao condicional SWITCH

    Processamento de Strings em C: pattern matching (aula TP1) (ex10.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    int imax=20;
    
    typedef int bool;
    typedef char str[imax+2];
    
    int match(str s1, str s2 )
    {int i=0, j, fim, res; 
     bool enc=false; 
     
     fim = strlen(s1) - strlen(s2);
     while ((i <= fim) && !enc){
    	j=0;
    	while((s2[j] == s1[i+j]) && (s2[j] != '\0')){
    	     j++;
    	     }
    	if(s2[j] == '\0') enc = true;
    	else i++;
            }
     if (enc) res = i;
     else    res = -1;
     return(res);
    }
    
    
    /*----- programa principal -----*/  
    int main( )
    {int p; 
     str linha, palavra;
     
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      
      while (scanf("%[^\n]",palavra) != 1) 
         { scanf("\n"); }
    
      if((p=match(linha, palavra)) != -1) 
          printf("Ocorreu pela primeira vez na posicao %d\n", p); 
      else printf("Nao ocorreu\n");
      return(0); 
    }
    
                                                          
    

    ficheiro: ex10.c autor: (TP1) versao de: 2001.03.27

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C: pattern matching (aula TP1) (ex10a.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    
    int match(str s1, str s2 )
    {int i=0, j, fim, res=0; 
     bool enc=false; 
     
     fim = strlen(s1) - strlen(s2);
     while (i <= fim)  {
    	j=0;
    	while((s2[j] == s1[i+j]) && (s2[j] != '\0')){
    	     j++;
    	     }
    	if(s2[j] == '\0') 
               {printf("Ocorreu uma vez na posicao %d\n",i);
                res++; }
    	 i++;
            }
     return(res);
    }
    
    
    /*----- programa principal -----*/  
    int main( )
    {int p; 
     str linha, palavra;
     
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      
      while (scanf("%[^\n]",palavra) != 1) 
         { scanf("\n"); }
    
      if((p=match(linha, palavra)) >0 ) 
          printf("Ocorreu  %d vezes\n", p); 
      else printf("Nao ocorreu\n");
      return(0); 
    }
    
                                                          
    

    ficheiro: ex10a.c autor: (TP1) versao de: 2001.04.03

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C: pattern matching (aula TP1) (ex10b.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    
    int match(str s1, str s2 )
    {int i=0, j, fim, res=0; 
     bool enc=false; 
     
     fim = strlen(s1) - strlen(s2);
     while (i <= fim)  {
    	j=0;
    	while(((s2[j] == s1[i+j] )|| (s2[j]=='?')) && 
                  (s2[j] != '\0')){
    	     j++;
    	     }
    	if(s2[j] == '\0') 
               {printf("Ocorreu uma vez na posicao %d\n",i);
                res++; }
    	 i++;
            }
     return(res);
    }
    
    
    /*----- programa principal -----*/  
    int main( )
    {int p; 
     str linha, palavra;
     
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      
      while (scanf("%[^\n]",palavra) != 1) 
         { scanf("\n"); }
    
      if((p=match(linha, palavra)) >0 ) 
          printf("Ocorreu  %d vezes\n", p); 
      else printf("Nao ocorreu\n");
      return(0); 
    }
    
                                                          
    

    ficheiro: ex10b.c autor: (TP1) versao de: 2001.04.03

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C: pattern matching (aula TP1) (ex10c.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    
    int match(str s1, str s2 )
    {int i=0, j, fim, res=0; 
     bool enc=false; 
     
     fim = strlen(s1) ;
     while (i <= fim)  {
    	j=0;
    	while(((s2[j] == s1[i+j] )|| (s2[j]=='?')) && 
                  ((s2[j] != '\0')&& (s2[j] != '*'))){
    	     j++;
    	     }
    	if((s2[j] == '\0')|| (s2[j] == '*')) 
               {printf("Ocorreu uma vez na posicao %d\n",i);
                res++; }
    	 i++;
            }
     return(res);
    }
    
    
    /*----- programa principal -----*/  
    int main( )
    {int p; 
     str linha, palavra;
     
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      
      while (scanf("%[^\n]",palavra) != 1) 
         { scanf("\n"); }
    
      if((p=match(linha, palavra)) >0 ) 
          printf("Ocorreu  %d vezes\n", p); 
      else printf("Nao ocorreu\n");
      return(0); 
    }
    
                                                          
    

    ficheiro: ex10c.c autor: (TP1) versao de: 2001.04.03

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C: pattern matching (aula TP1) (ex10d.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    
    int match(str s1, str s2 )
    {int i=0, j, k, fim, res=0; 
     bool enc=false; 
     
     fim = strlen(s1) ;
     while ((i < fim) && !enc){
    	k=j=0;
    	while (((s2[j] == s1[i+k]) || (s2[j]=='?') || (s2[j] == '*')) && 
                   (s2[j] != '\0') && (s1[i+k] != '\0'))
                  { if (s2[j] == '*') 
                         { while ((s1[i+k] != s2[j+1])&&(s1[i+k] != '\0')) {k++;} }
                    else { k++; }
                    j++; 
    	      }
    	if (s2[j] == '\0') { enc = true; }
    	else { i++; }
            }
     res = (enc)? i : -1;
     return(res);
    }
    
    
    /*----- programa principal -----*/  
    int main( )
    {int p; 
     str linha, palavra;
     
      while (scanf("%[^\n]",linha) != 1) 
         { scanf("\n"); }
      
      while (scanf("%[^\n]",palavra) != 1) 
         { scanf("\n"); }
    
      if((p=match(linha, palavra)) != -1) 
          printf("Ocorreu pela primeira vez na posicao %d\n", p); 
      else printf("Nao ocorreu\n");
    
      return(0); 
    }
    
                                                          
    

    ficheiro: ex10d.c autor: (PRH) versao de: 2001.04.17

  • uso de arrays de caracteres para implementar strings
  • pesquisa de padrões admitindo wild-cards "+" e "*" em qualquer posição

    Processamento de Strings em C (aula TP1) (ex11.c)

    #include <stdio.h>
    #define true 1
    #define false 0
     
    typedef int bool;
    typedef char str[50];
    
    bool  eseparador( char c){ 
          bool res;
    	switch (c){
    	case  ' ': 
    	case  '\t': 
    	case  '\n': 
    	case  '.': 
    	case  ',': 
    	case  '!': 
    	case  '?': 
    	case  ';':res = true;break; 
    	default  :res = false;
    	}
    	return( res);
    }
    
    /*----- programa principal -----*/  
    int main( )
    {int i,conta=0; 
     str linha;
     char ch;
    
      while ((scanf("%[^\n]",linha)) != 1) 
         { scanf("\n"); }
      i=0;
     while (eseparador(linha[i])) { i++; } 
     while (i < strlen(linha)) { conta++; 
            while(!eseparador(linha[i])) { i++;}  
     	while (eseparador(linha[i])&& (i<strlen(linha))) { i++;} 
    }
      printf("Ocorreram %d palavras \n",conta); 
     return(0); 
    }
    
                                                          
    

    ficheiro: ex11.c autor: PRH versao de: 2001.03.12

  • definicao de Tipos
  • uso de arrays de caracteres para implementar strings
  • uso de expressoes regulares para ler 1 linha com scanf()
  • uso da funcao strlen()

    Processamento de Strings em C: splitting (aula TP1) (ex12.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    char *tab2[100];
    
    int split(char *frase, char c)
      {	int conta=0,i;
    	str palavra;
    
    	while (*frase) /*enquanto nao atingir o fim de frase*/
    	  {  i=0;
    	    while(*frase!=c)
    	      { palavra[i++]=*(frase++); }
    	    palavra[i]='\0';
    	   // tab2[conta]=(char *)malloc(strlen(palavra)+1);
    	   // strcpy(tab2[conta++],palavra);
    	    tab2[conta++]=(char *) strdup(palavra);
    	    frase++;
    	  }
    	return(conta);
       }                                                      
    
    /*----- programa principal -----*/  
    int main( int argc, char *argv[])
      { int i,j,k;
    	str aux;
    	
    	if (argc<3)
               { printf("Erro, numero de argumentos: %d\n",argc-1); }
    	else
    	   { i=split(argv[1],*argv[2]);
    	     printf("Foram separadas %d palavras.\n",i);
    		for(j=0;j<i-1;j++){
    			for(k=j+1;k<i;k++){
    			if(strcmp(tab2[j],tab2[k])>0){
    				strcpy(aux,tab2[j]);
    				strcpy(tab2[j],tab2[k]);
    				strcpy(tab2[k],aux);} 
    					}
    				}
    	     for(j=0;j<i;j++){printf("%s\n",tab2[j]);}
               }
    	return(0); 
      }
    
    

    ficheiro: ex12.c autor: (TP1) versao de: 2001.05.08

  • representação de strings como pointer para caracter
  • passagem de argumentos na invocao do programa (argc, argv)
  • armazenamento das strings numa Tabela que e um Array de Pointers
  • impressao das palavras ordenadas alfabeticamente

    Processamento de Strings em C: splitting (aula TP1) (ex12a.c)

    #include <stdio.h>
    #define true 1
    #define false 0
    
    typedef int bool;
    typedef char str[50];
    str tab1[100];
    
    int split(char *frase, char c)
      {	int conta=0,i;
    	str palavra;
    
    	while (*frase) /*enquanto nao atingir o fim de frase*/
    	  { i=0;
    	    while(*frase!=c)
    	      { palavra[i++]=*(frase++); }
    	    palavra[i]='\0';
    	    printf("%s\n",palavra);
                strcpy(tab1[conta++],palavra); 
    	    frase++;
    	  }
    	return(conta);
       }                                                      
    
    /*----- programa principal -----*/  
    int main( int argc, char *argv[])
      { int i,j;
    	
    	//for (i=1;i<argc;i++){printf("%s\n",argv[i]);}  
    	if (argc<3)
               { printf("Erro, numero de argumentos: %d\n",argc-1); }
    	else
    	   { i=split(argv[1],*argv[2]);
    	     printf("Foram separadas %d palavras.\n",i);
    	     for(j=0; j<i; j++) { printf("%s \n",tab1[j]); }
               }
    	return(0); 
      }
    
    

    ficheiro: ex12a.c autor: (TP1) versao de: 2001.05.08

  • representaç~ao de strings como pointer para caracter
  • passagem de argumentos na invocao do programa (argc, argv)
  • armazenamento das strings numa Tabela que e um Array de Arrays de Caracteres

    Processamento de Strings em C (aula TP1) (ex13.c)

    #include <stdio.h>
    
    #define true 1
    #define false 0
    typedef int bool;
    
    typedef char str[250];
    
    /*----- programa principal -----*/  
    int main( )
    {int i; 
     str linha, par1, par2, par3;
     bool fim=false;
    
      while ( !fim ) 
         { 
           while ((scanf("%[^\n]",linha)) != 1) 
              { scanf("\n"); }
    
           if (sscanf(linha,"copia(%[^,],%[^)])",par1,par2)==2) 
    	     printf("reconheceu COPIA\n");
           else if (sscanf(linha,"apaga(%[^)])",par1)==1) 
    	     printf("reconheceu APAGA\n");
           else if (sscanf(linha,"junta(%[^,],%[^,],%[^)])",par1,par2,par3)==3) 
    	     printf("reconheceu JUNTA\n");
           else if (strcmp(linha,"fim()")==0) 
    	     { printf("reconheceu FIM\n"); fim=true; }
                else printf("Comando Desconhecido \n");
         } 
      return(0); 
    }
                                                          
    

    ficheiro: ex13.c autor: (TP1) versao de: 2001.05.08

  • implementacao dum Interpretador de Comandos Rudimentar
  • uso da funcao "sscanf()"

    Calculo com Polinomios em C (aula TP1) (ex14a.c)

    #include<stdio.h>
    
    #define coef p[grau]
    #define MAX 20
    
    typedef int tExp;
    typedef float tCoef;
    typedef tCoef tPoli[MAX];
    
    tExp lerPoli1(tPoli p)
    {
    	tExp exp, grau;
    
    	printf("\nQual o grau do polinomio? ");
    	scanf("%d", &exp);
    	grau = exp;
    	for( ;exp >= 0; exp--)
    	{
    		printf("\nIntroduza o coeficiente de expoente %d: ", exp);
    		scanf("%f", &p[exp]);
    	}
    	return (grau);
    }
    
    
    void escrevePoli1(tPoli p, tExp grau)
    {
    	for( ;grau >= 0; grau--)
    	{
    		if(p[grau])
    		printf("\n%.1fx^%d", coef,grau);
    	}
    	printf("\n");
    }
    
    void derivaPoli1(tPoli p, tExp grau, tPoli d)
    {
    	for( ;grau >0; grau--)
    	{
    		d[grau-1] = (coef*grau);
    	}
    }
    
    int main()
    {
    	tPoli polinomio, derivada;
    	tExp grau;
    
    	grau = lerPoli1(polinomio);
    	escrevePoli1(polinomio, grau);
    	derivaPoli1(polinomio, grau, derivada);
    	escrevePoli1(derivada, grau-1);
    	return (0);	
    }
    

    ficheiro: ex14a.c autor: (TP1) versao de: 2001.05.15

  • implementacao de Polinomios com um array de coeficientes (expoentes como indices)
  • calculo da derivada

    Calculo com Polinomios em C (aula TP1) (ex14.c)

    #include<stdio.h>
    
    #define MAX 20
    
    typedef int tExp;
    typedef float tCoef;
    typedef struct m {
    	tCoef coef;
    	tExp exp;
    		}tMono;
    typedef tMono tPoli[MAX];
    
    int lerPoli1(tPoli p)
    {
    	tExp num, max;
    
    	printf("\nQuantos termos? ");
    	scanf("%d", &num);
    	max = num;
    	for( ;num > 0; num--)
    	{
    		printf("\nIntroduza o %d coeficiente e expoente: ", num);
    		scanf("%f,%d", &p[num-1].coef, &p[num-1].exp);
    	}
    	return(max);
    }
    
    
    void escrevePoli1(tPoli p, int num)
    {
    	for( ; --num >= 0; )
    	{
    		if(p[num].coef)
    		  { printf("%.1fx^%d\n", p[num].coef,p[num].exp); }
    	}
    }
    
    int derivaPoli1(tPoli p, int comp, tPoli d)
    {
    	tExp i,j;
    
    	for( i=j=0 ;i < comp; i++,j++ )
    	{
    		if (p[i].exp == 0) { i++; }
    	        d[j].coef = (p[i].coef*p[i].exp);
    		d[j].exp  = (p[i].exp)-1;
    	}
    	return(j);
    }
    
    int main()
    {
    	tPoli polinomio, derivada;
    	tExp comp;
    
    	comp = lerPoli1(polinomio);
           printf("Polinomio lido:\n");
    	escrevePoli1(polinomio, comp);
    	comp = derivaPoli1(polinomio, comp, derivada);
           printf("Polinomio derivado:\n");
    	escrevePoli1(derivada, comp);
    	return (0);	
    }
    

    ficheiro: ex14.c autor: (TP1) versao de: 2001.05.15

  • implementacao de Polinomios com uma array de pares (coef,exp)
  • calculo da derivada

    Calculo com Polinomios em C (aula TP1) (ex14b.c)

    #include<stdio.h>
    
    #define MAX 20
    
    typedef int tExp;
    typedef float tCoef;
    typedef struct m {
    	tCoef coef;
    	tExp exp;
    		}tMono;
    typedef struct lista{
    	tMono monomio;
    	struct lista *seg;
    	}tLista,*tPtr;
    typedef tPtr tPoli;
    
    /*---------funcoes auxiliares------------*/
    tPoli criaMono(tCoef c,tExp e)
    {
    tPoli nova;
    	nova = (tPoli) malloc(sizeof(tLista));
    	nova->monomio.coef = c;
    	nova->monomio.exp = e;
    
    return(nova);
    }	
    
    tPoli insere(tPoli cel,tPoli lst)
    {
    if (lst==NULL)
    	lst = cel;
    
    else {
    	if (cel->monomio.exp<lst->monomio.exp){
    		lst->seg=insere(cel,lst->seg);
    		}
    	else {
    		if (cel->monomio.exp>lst->monomio.exp){
    			cel->seg=lst;
    			lst = cel;}
    		else {
    			lst->monomio.coef=lst->monomio.coef+cel->monomio.coef;
    		     }
    	     
    	     }
         }
    return (lst);
    }
    
    /*---------funcoes principais------------*/
    tPoli lerPoli1()
    {
    tPoli final=NULL;
    tPoli novo;
    tCoef coef;
    tExp exp;
    
    printf("\nIntroduza o coeficiente (0 para terminar)");
    scanf("%f", &coef);
    while(coef!=0)
    	{
    		printf("\nIntroduza o expoente ");
    		scanf("%d", &exp);
    		novo=criaMono(coef,exp);
    		final=insere(novo,final);
    		printf("\nIntroduza o coeficiente (0 para terminar)");
    		scanf("%f", &coef);
    	}
    
    return(final);
    }
    
    //escrita: variante recursiva
    void escrevePoli1(tPoli p)
    {
    if (p!=NULL){
    		   printf("%4.1fx^%d\n", p->monomio.coef,p->monomio.exp); 
    		   escrevePoli1(p->seg);
    	    }
    	
    }
    
    //escrita: variante iterativa
    void escrevePoli2(tPoli p)
    {
    while(p!=NULL){
    		   printf("%4.1fx^%d\n", p->monomio.coef,p->monomio.exp); 
    		   p=p->seg;
    	      }
    }
    
    tPoli derivaPoli1(tPoli p)
    {
    tPoli d=NULL;
    tCoef coef;
    tExp exp;
    
    if (p!=NULL){ 
    		if (p->monomio.exp != 0) { 
    	        	coef = (p->monomio.coef*p->monomio.exp);
    			exp  = (p->monomio.exp)-1;
    			d=criaMono(coef,exp);
    			d->seg=derivaPoli1(p->seg);}
    	}       
    
    return(d);
    }
    
    /*---------funcao main------------*/
    int main()
    {
    	tPoli polinomio, derivada;
    	tExp comp;
    
    	polinomio = lerPoli1();
            printf("Polinomio lido:\n");
    	escrevePoli1(polinomio);
    	derivada = derivaPoli1(polinomio);
            printf("Polinomio derivado:\n");
    	escrevePoli1(derivada);
    	return (0);	
    }
    

    ficheiro: ex14b.c autor: (TP1) versao de: 2001.05.22

  • implementacao de Polinomios com uma lista ligada de pares (coef,exp)
  • calculo da derivada

    Exemplo de uso das funções NCURSES

    Teste do uso com NCurses (ncursestst.c)

    #include <curses.h>
    
    int main(void) {
    	// Declare a character variable but INT (because curses want it)
    	int c;
    
    	// The first three initialization asked from curses
    	initscr();
    	cbreak();
    	noecho();
    
    	// Note that printf DOES NOT work
    	printw("Press 'y' to quit...\n");
    
    	// Look while c not 'y'
    	while((c = getch())!='y')
    		printw("%c is not a 'y'...\n",c);
    
    	// Make echo for shell, again
    	endwin();
    }
    

    ficheiro: ncursestst.c autor: Alberto versao de: 2001.04.06

    Makefile para uso do teste com NCurses (ncurses.mak)

    all: teste.c
    	gcc -o teste teste.c -lcurses
    

    ficheiro: ncurses.mak autor: Alberto versao de: 2001.04.06


    Resolução de Problemas do CeNPL'01

    problema do CeNPL'01: "Palindromizador" (proposta extra-aula) (cnpl01b.c)

    #include <stdio.h>
     
    typedef char str[100];
    
    char *palindromizador( str orig, int i, int j )
      { char *p, *p1, *p2;
        
        if ( i==j ) 
           { p = (char *)malloc(2); sprintf( p, "%c\0", orig[i] ); }
        else if ( j-i==1 ) 
           { if ( orig[i]==orig[j] )
                { p = (char *)malloc(3); sprintf( p, "%c \0", orig[i] ); }
             else 
                { p = (char *)malloc(3); sprintf( p, "%c%c\0", orig[i],orig[j] ); }
           }
        else 
           { if ( orig[i]==orig[j] )
                { p1 = palindromizador( orig,i+1,j-1 );
                  p = (char *)malloc(strlen(p1)+1); 
                  sprintf( p, "%c%s", orig[i],p1 ); 
                }
             else 
                { p1 = palindromizador( orig,i+1,j );
                  p2 = palindromizador( orig,i,j-1 );
                  if ( strlen(p1)<=strlen(p2) )
                     { p = (char *)malloc(strlen(p1)+1); 
                       sprintf( p, "%c%s", orig[i],p1 ); 
                     }
                  else
                     { p = (char *)malloc(strlen(p2)+1); 
                       sprintf( p, "%c%s", orig[j],p2 ); 
                     }
                }
           }
        return( p );
      }
    
    /*----- programa principal -----*/  
    int main( )
    { int i,conta=0; 
      str pal; 
      char *palindroma;
    
      while ((scanf("%s",pal)) != 1) { ; }
      palindroma=palindromizador( pal, 0, strlen(pal)-1 ); 
      printf("Um possivel palindroma sera: "); 
        for (i=0; (palindroma[i]!='\0'); i++) 
            { if (palindroma[i]!=' ') { putchar(palindroma[i]); } }
        for (i=i-2; (i>=0); i--) { putchar(palindroma[i]); } 
      printf("\n"); 
      return(0); 
    }
    
    

    ficheiro: cnpl01b.c autor: PRH versao de: 2001.04.29

  • processamento de Strings em C;
  • uso de arrays de caracteres para implementar strings

    problema do CeNPL'01: "Palindromizador" (proposta extra-aula) (cnpl01.c)

    #include <stdio.h>
     
    typedef char str[100];
    
    char *palindromizador( str p1 ){ 
        char *p2;
        int i, j, k;
    	p2=(char *)malloc(2*strlen(p1));
            k=i=0; j=strlen(p1)-1;
    	while ( i < j )
              { if ( p1[i]==p1[j] ) 
                     { p2[k++]=p1[i++]; j--; }
                else { if ( ((i+1)<j)&&(p1[i+1]==p1[j]) ) 
                            { p2[k++]=p1[i++]; }
                       else { p2[k++]=p1[j--]; }
                     }
               }
            if (i==j) 
               {  p2[k++]=p1[i++]; for (j=k-1; j; j--) { p2[k++]=p2[j-1]; } }
            else //(i>j)
               { for (j=k; j; j--) { p2[k++]=p2[j-1]; } }
            p2[k]='\0'; 
    	return( p2 );
    }
    
    /*----- programa principal -----*/  
    int main( )
    { int i,conta=0; 
      str pal; 
      char *palindroma;
    
      while ((scanf("%s",pal)) != 1) { ; }
      palindroma=palindromizador( pal );
      printf("Um possivel palindroma sera: %s \n",palindroma); 
      return(0); 
    }
    
                                                          
    

    ficheiro: cnpl01.c autor: PRH versao de: 2001.04.14

  • processamento de Strings em C;
  • uso de arrays de caracteres para implementar strings

    variante dum problema do CeNPL'01: "Apanha Moedas num Labirinto" (proposta extra-aula) (cnpl03.c)

    #include <stdio.h>
     
    #define true 1
    #define false 0
    typedef int bool;
    
    #define MAXL 9
    #define MAXC 5
    #define Moedas 7
    #define InicL 5
    #define InicC 4
    /* #define InicC 3 */
    
    typedef int tTabuleiro[MAXL][MAXC];
    typedef int tProxMove[4];
    
    tProxMove   IncrL={-1,0,+1,0};
    tProxMove   IncrC={0,-1,0,+1};
    
    tTabuleiro  Tab={{0,0,0,0,-1},
                     {-1,0,0,0,0},
                     {0,0,0,-1,0},
                     {0,-1,0,0,0},
                     {0,0,0,0,0},
                     {0,-1,0,0,0},
                     {0,0,0,0,0},
                     {0,0,-1,0,0},
                     {0,0,0,0,-1}
                    };
    
    bool valido( int i, int j ){ 
        return( (i>=0)&&(i<MAXL)&&(j>=0)&&(j<MAXC)&&(Tab[i][j]<=0) );
    }
        
    bool comeMoedas( int i, int j, int m, int vez ){ 
        int ant, tenta;
        int i1, j1;
        bool suc;
        
        if ( Tab[i][j]==-1 ) { m--; }
        ant=Tab[i][j]; Tab[i][j]=vez++;
        if ( m==0 ) 
           { suc=true; }
        else 
           { suc=false; 
             tenta=0; 
    	 while (( tenta < 4 )&&( !suc ))
              { i1=i+IncrL[tenta]; j1=j+IncrC[tenta];
                if ( valido(i1,j1) ) 
                     { suc=comeMoedas(i1,j1,m,vez); }
                tenta++;
               }
             if (!suc) Tab[i][j]=ant;
            }
        return( suc );
    }
    
    /*----- programa principal -----*/  
    int main( )
    { int i,j,conta=0; 
    
      if (comeMoedas( InicL, InicC, Moedas, 1 ) )
           { printf("Terminou com Sucesso \n"); 
             for(i=0; i<MAXL; i++)
                { for(j=0; j<MAXC; j++) { printf("%2d ",Tab[i][j]); }
                  printf("\n");
                }
           }
      else { printf("Nao Conseguiu Terminar com Sucesso \n"); }
      return(0); 
    }
    
    

    ficheiro: cnpl03.c autor: PRH versao de: 2001.05.06

  • uso de arrays multiplos para implementar matrizes, ou tabuleiros
  • resoluç~ao recursiva de problemas por "try-and-error"

    Exemplos de Makefiles

    ex1.mak (ex1.mak)

    ex1: ex1.o 
    	gcc -o ex1  ex1.o  
    
    ex1.o: ex1.c 
    	gcc  -c   ex1.c
    
    relex1: relex1.tex ex1.c
    	latex relex1
    	latex relex1
    	dvips -o relex1.ps relex1
    	ghostview relex1.ps
    
    clear: 
    	rm  -f ex1.o relex1.aux relex1.log relex1.dvi relex1.toc
    
    

    ex34.mak (ex34.mak)

    ex3: ex3.o 
    	gcc -o ex3  ex3.o  
    
    ex3.o: ex3.c 
    	gcc  -c   ex3.c
    
    ex4: ex4.o 
    	gcc -o ex4  ex4.o  
    
    ex4.o: ex4.c 
    	gcc  -c   ex4.c
    
    testeA: ex3 ex4
    	ex3 >a
    	ex4 <a
    
    testeB: ex3 ex4
    	ex3 | ex4 
    
    clean: 
    	rm -f ex3.o ex4.o
    
    


    author: prh@di.uminho.pt; 
    Last modified: 03 de Abril de 2001