Programação I

Soluções dos exercícios da aula prática 7


Programa 1

Escreve um programa que atribuí números aleatórios a um array de duas dimensões de 5 por 4 elementos e que apresente esses números no ecrã por colunas.

Resolução:

    #include <stdio.h>
    #include <stdlib.h>

    void randomize()
    {
      time_t agora;

      agora = time(0);
      srandom(agora);
    }

    void main()
    {
        /* Declara o array */
        int matriz[5][4];
        int a, b;

        /* Preenche o array */
        randomize();
        for( a = 0; a < 5; a++ )
          for ( b = 0; b < 4; b++ )
            matriz[a][b] = random();
  
        /* Imprime os elementos do array */
        for ( a = 0; a < 5; a++ )
         {
           for ( b = 0; b < 4; b++ )
             printf("%d\t", matriz[a][b]);
           printf("\n");    /* muda de linha */
         }
    }

Também se pode mostrar os elementos do array à medida que vão sendo gerados. Assim:

    #include <stdio.h>
    #include <stdlib.h>

    void randomize()
    {
      time_t agora;

      agora = time(0);
      srandom(agora);
    }

    main()
    {
      int a[5][4];
      int i,j;

      randomize();
      for (i=0; i<5; i++)
      {
        for (j=0; j<4; j++)
        {
           a[i][j] = random();
           printf("%d\t",a[i][j]);
        }
        printf("\n");
      }
    }

Programa 2

Altera o programa anterior de forma a que apresente também o maior e o menor dos números aleatórios.

Resolução:

    #include <stdio.h>
    #include <stdlib.h>
    
    void randomize()
    {
      time_t agora;

      agora = time(0);
      srandom(agora);
    }

    main()
    {
      int a[5][4];
      int i,j,max=0,min=RAND_MAX;

      randomize();
      for (i=0; i<5; i++)
      {
        for (j=0; j<4; j++)
        {
           a[i][j] = random();
           printf("%d\t",a[i][j]);
           if (max < a[i][j])
	     max = a[i][j];
           if (min > a[i][j])
	     min = a[i][j];
        }
        printf("\n");
      }
      printf("Maximo: %d\n",max);
      printf("Minimo: %d\n",min);
    }

Programa 3

Escreve um programa que ordena uma lista de N números. N pode ir no máximo até 100.

Resolução:

    #include <stdio.h>
    
    #define N 100
    
    main()
    {
      int a[N];
      int i, k, m, min, temp, tam;
      
      /* Receber os valores a ordenar */
      printf("Indique o tamanho do array (maximo 100)\n");
      scanf("%d",&tam);
      for (i=0; i<tam; i++)
       {
         printf("%d.º numero -> ",i+1);
         scanf("%d",&a[i]);
       }

      /* Ordenar o array */   
      for( k=0; k<=tam-1; k++ )
       {
         /* descobre o indice do minimo em a[k], a[k+1], ..., a[N-1] */
         min = a[k];
         m = k;
         for( i=k; i<=tam-1; i++ )
           if( a[i] < min )
            {
              min = a[i];
              m = i;
            }
    
         /* troca a[k] com a[m] */
         temp = a[k];
         a[k] = a[m];
         a[m] = temp;
       }
    
      /* Escrever os elementos do array ordenados */
      for( i=0; i<tam; i++ )
        printf("%d ", a[i]);
      printf("\n");
    }

Também se poderia obter os valores a ordenar de outras formas. Por exemplo, através da geração de números aleatórios, ou por atribuição directa.


Programa 4

Escreve um programa que registe o sexo e a idade de um grupo de dez pessoas. Em seguida o programa deve apresentar a média das idades de cada sexo.

Resolução:

    #include <stdio.h>

    #define N 10

    main()
    {
      int dados[N][2];
      int i, ms=0, fs=0, idade_m=0, idade_f=0;

      /* Registo dos valores */
      for (i=0; i<N; i++)
      {
        printf("Indique os dados da %d.ª pessoa\n",i+1);
        printf("Sexo (0 - M, 1 - F): ");
        do
        {
          scanf("%d",&dados[i][0]);
        } while (dados[i][0] > 1 || dados[i][0] < 0);
        printf("Idade: ");scanf("%d",&dados[i][1]);
      }

      /* Calculo da media das idades por sexo */
      for (i=0; i<N; i++)
      {
        if (dados[i][0] == 0)
        {
          idade_m = idade_m + dados[i][1];
          ms++;
        }
        else
        {
          idade_f = idade_f + dados[i][1];
          fs++;
        }
      }

      /* Mostra dos resultados */
      printf("Media das idades\n");
      printf("Homens: %.2f\n", (float)idade_m/ms);
      printf("Mulheres: %.2f\n", (float)idade_f/fs);
    }

Programa 5

Na aula prática 3, o exercicío 8 consistia no seguinte: Faz um programa que receba 10 valores inteiros e que indique: Quantos são pares, quantos são ímpares, quantos são positivos e quantos são negativos. Volta a escrever o programa, utilizando arrays.

Resolução:

    #include <stdio.h>

    #define N 10

    main()
    {
      int n[N];
      int i, pares=0, impares=0, positivos=0, negativos=0;

      printf("Introduza %d numeros inteiros:\n",N);
      for (i=0; i<N; i++)
        scanf("%d",&n[i]);

      for (i=0; i<N; i++)
      {
        if (n[i] % 2 == 0)
          pares++;
        else
          impares++;
        if (n[i] >= 0)
          positivos++;
        else
          negativos++;
      }

      printf("Resultado final\n");
      printf("Pares -> %d\n",pares);
      printf("Impares -> %d\n",impares);
      printf("Positivos -> %d\n",positivos);
      printf("Negativos -> %d\n",negativos);
    }

Programa 6

Volta a fazer o exercício de contar 0s e 1s de um byte binário, com arrays.

Resolução:

    #include <stdio.h>

    #define N 8

    main()
    {
      int byte[N];
      int i, zeros=0, uns=0;

      printf("Introduza um BYTE binario\n");
      for (i=0; i<N; i++)
        scanf("%d",&byte[i]);

      for (i=0; i<N; i++)
      {
        if (byte[i]==0)
          zeros++;
        else if (byte[i]==1)
          uns++;
        else
          {
	    printf("O numero nao e binario\n");
	    exit();
          }
      }

      printf("Resultado:\n");
      printf("Zeros -> %d\n",zeros);
      printf("Uns -> %d\n",uns);
    }

Programa 7

Volta a fazer o exercício de converter um número decimal para binário, com arrays.

Resolução:

    #include <stdio.h>

    #define N 16

    main()
    {
      int decimal,i,j;
      int bin[N];

      printf("Programa para converter de decimal para binario\n");
      printf("Indique o valor decimal: ");
      do
        scanf("%d",&decimal);
      while (decimal < 0);

      i = 0;
      do 
      {
        bin[i] = decimal % 2;
	decimal = decimal / 2;
        i++;
      } 
      while (decimal != 0);
      
      for (j=i-1; j>=0; j--)   /* Para mostrar o array invertido */
        printf("%d",bin[j]);
      printf("\n");
    }

Programa 8

Faz um programa que apresente uma tabela de conversão de decimal para binário:

Resolução:

    #include <stdio.h>

    #define N 16

    main()
    {
      int decimal,i,j,k,tam;
      int bin[N];

      printf("Tabela de conversao de decimal/binario\n");
      printf("Indique ate que numero deseja a tabela: ");
      do
        scanf("%d",&tam);
      while (tam < 0);

      for (k=0; k<=tam; k++)
      {
        i = 0;
        decimal = k;
        do 
        {
	  bin[i] = decimal % 2;
	  decimal = decimal / 2;
          i++;
        } 
        while (decimal != 0);
      
        printf("%d\t",k);
        for (j=i-1; j>=0; j--)   /* Para mostrar o array invertido */
          printf("%d",bin[j]);
        printf("\n");
      }
    }

Nota: também podiam ter feito uma função para converter um número para binário. Depois essa função seria chamada dentro de um ciclo.