Aula 5 - Resoluções


Exercício 1

Alínea a)

/* Programa: primeiros_primos */
#include <stdio.h>
#include <stdlib.h>

int main(void)

{
    int n, valor, divisor;

    printf("\nPrimos ate': ");
    scanf("%d", &n);

    /* E' escusado testar o 2, que sabemos ser primo... */
    printf("2\n");

    for(valor = 3; valor <= n; valor++)
    {
        divisor = 2;
        while(divisor < valor && valor % divisor != 0)
            divisor = divisor + 1;
        if(divisor == valor)
            printf("%d\n", valor);
    }
    return EXIT_SUCCESS;
}
/* Maximo divisor comum (algoritmo de Euclides): */
#include <stdio.h>
#include <stdlib.h>

int main(void)

{
    int a, b, temp;

    printf("\nMdc de: ");
    scanf("%d%d", &a, &b);

    do
    {
        temp = b;
        b = a % b;
        a = temp;
    }
    while(b != 0);
    printf("%d\n", a);
    return EXIT_SUCCESS;
}

Alínea b)

(Resolução não publicada)


Exercício 2

Alínea a)

Ver solução da Alínea 1.a)!

Alínea b)

(Resolução não publicada)


Exercício 3

Alínea a)

(Resolução não publicada)

Alínea b)

Embora o enunciado não o peça, a ordenação dos valores será feita dentro da própria matriz.

Assim, o algoritmo de ordenação de uma matriz com n elementos é, de acordo com as sugestões feitas:

  1. Ler os n valores para a matriz.
  2. Ordenar a matriz.
    Para cada elemento i da matriz excepto o último (porquê?), isto é, para i de 0 a n-2:
    1. Procurar o elemento da matriz com valor mínimo entre o índice i e o final da matriz (índice n-1). Guardar o seu valor numa variável minimo e a sua posição (índice) na variável k (algoritmo já bem conhecido...).
    2. Trocar os elementos da matriz de índices i e k, se necessário.
  3. Escrever os valores na matriz.

Ou seja:

OrdenaPorSeleccao
inicio
    inteiro valores[10], n, i, j, k, minimo;

    n <- 10;   (* para evitar explicitar os valores nos ciclos. *) 

    (* Ler valores: *)
    escrever linha, "Introduza 10 valores: ";
    para i <- 0, n-1:
        ler para valores[i];
    fim para;

    (* Ordenar a matriz: *)

    (* Para cada elemento i desde 0 a n-2: *)
    para i <- 0, n-2:
        (* Procurar o elemento com o valor mi'nimo entre i e n-1: *)
        minimo <- valores[i];
        k <- i;
        para j <- i + 1, n-1:
            se valores[j] < minimo:
                minimo <- valores[j];
                k <- j;
            fim se;
        fim para;
        (* Trocar elemento i com elemento k (se forem diferentes!): *)
        se i <> k:
            valores[k] <- valores[i];
            valores[i] <- minimo;
        fim se;
    fim para;

    (* Escrever os valores da matriz: *)
    para i <- 0, n-1:
        escrever valores[i], " ";
    fim para;
    escrever linha;
fim.

Traduzindo para C:

/* Ordena matriz por seleccao: */
#include <stdio.h>
#include <stdlib.h>

int main(void)

{
    int valores[10], n, i, j, k, minimo;

    n = 10;   /* para evitar explicitar os valores nos ciclos. */

    /* Ler valores: */
    printf("\nIntroduza 10 valores: ");
    for(i = 0; i < n; i++)
        scanf("%d", &valores[i]);

    /* Ordenar a matriz: */

    /* Para cada elemento i desde 0 a n-2: */
    for(i = 0; i < n - 1; i++)
    {
        /* Procurar o elemento com o valor mínimo entre i e n-1: */
        minimo = valores[i];
        k = i;
        for(j = i + 1; j < n; j++)
            if(valores[j] < minimo)
            {
                minimo = valores[j];
                k = j;
            }
        /* Trocar elemento i com elemento k (se forem diferentes!): */
        if(i != k)
        {
            valores[k] = valores[i];
            valores[i] = minimo;
        }
    }

    /* Escrever os valores da matriz: */
    for(i = 0; i < n; i++)
        printf("%d ", valores[i]);
    printf("\n");
    
    return EXIT_SUCCESS;
}

Alínea c)

(Resolução não publicada)


Página concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07)
Copyright © 1996-2001 ISCTE