Aula 2 - Resoluções


Exercício 1

Alínea a)

{   (* Pressupostos: *)
}
{   (* Resultado a atingir: *)
    Deve aparecer escrito um triangulo rectangulo de base m com hipotenusa
    a direita. Por exemplo, se m = 5 deve aparecer:
    *
    **
    ***
    ****
    *****
}
triangulo_m_com_para
inicio
    inteiro m, k;

    escrever linha;

    (* Leitura do valor de m: *)
    escrever "Tamanho do triangulo: ";
    ler para m;

    k <- 1;
    para k <- 1, m:
        (* Escrever linha com k asteriscos: */

        (* Escrever k asteriscos: *)
        repetir k vezes:
            escrever "*";
        fim repetir;

        (* Escrever fim-de-linha: *)
        escrever linha;

    fim para;
fim.

Alínea b

{   (* Pressupostos: *)
    b > 0 e m e n >= 2b.
}
{   (* Resultado a atingir: *)
    Deve aparecer escrito um rectangulo de m x n com borda de b asteriscos. 
    Por exemplo, se m = 6 e n = 5 deve aparecer:
    *****
    *****
    ** **
    ** **
    *****
    *****
}
rectangulo_oco_mxn_b
inicio
    inteiro m, n, b;

    escrever linha;

    (* Leitura dos valores de m, n e b: *)
    escrever "Tamanho do rectangulo (altura, largura e espessura): ";
    ler para m, n, b;

    (* Topo do rectangulo (b linhas de n asteriscos): *)
    repetir b vezes:
        repetir n vezes:
            escrever "*";
    fim repetir;
    escrever linha;

    (* Meio do rectangulo (m-2b linhas): *)
    repetir m - 2*b vezes:
        (* b asteriscos iniciais: *)
        repetir b vezes:
            escrever "*";
        (* n-2b espacos: *)
        repetir n-2*b vezes:
            escrever " ";
        fim repetir;
        (* b asteriscos finais: *)
        repetir b vezes:
            escrever "*";
        escrever linha;
    fim repetir;

    (* Base do rectangulo (b linhas de n asteriscos): *)
    repetir b vezes:
        repetir n vezes:
            escrever "*";
    fim repetir;
    escrever linha;
fim.

Exercício 2

acções n expressões ecrã
n <- 0; 0    
repetir 1 de 20 0    
escrever n, linha; 0   0 <fim-de-linha>
n <- (n + 7) mod 11; 7 7  
repetir 2 de 20 7    
escrever n, linha; 7   7 <fim-de-linha>
n <- (n + 7) mod 11; 3 3  
repetir 3 de 20 3    
escrever n, linha; 3   3 <fim-de-linha>
n <- (n + 7) mod 11; 10 10  
repetir 4 de 20 10    
escrever n, linha; 10   10 <fim-de-linha>
n <- (n + 7) mod 11; 6 6  
repetir 5 de 20 6    
escrever n, linha; 6   6 <fim-de-linha>
n <- (n + 7) mod 11; 2 2  
repetir 6 de 20 2    
escrever n, linha; 2   2 <fim-de-linha>
n <- (n + 7) mod 11; 9 9  
repetir 7 de 20 9    
escrever n, linha; 9   9 <fim-de-linha>
n <- (n + 7) mod 11; 5 5  
repetir 8 de 20 5    
escrever n, linha; 5   5 <fim-de-linha>
n <- (n + 7) mod 11; 1 1  
repetir 9 de 20 1    
escrever n, linha; 1   1 <fim-de-linha>
n <- (n + 7) mod 11; 8 8  
repetir 10 de 20 8    
escrever n, linha; 8   8 <fim-de-linha>
n <- (n + 7) mod 11; 4 4  
repetir 11 de 20 4    
escrever n, linha; 4   4 <fim-de-linha>
n <- (n + 7) mod 11; 0 0  
repetir 12 de 20 0    
escrever n, linha; 0   0 <fim-de-linha>
n <- (n + 7) mod 11; 7 7  
repetir 13 de 20 7    
escrever n, linha; 7   7 <fim-de-linha>
n <- (n + 7) mod 11; 3 3  
repetir 14 de 20 3    
escrever n, linha; 3   3 <fim-de-linha>
n <- (n + 7) mod 11; 10 10  
repetir 15 de 20 10    
escrever n, linha; 10   10 <fim-de-linha>
n <- (n + 7) mod 11; 6 6  
repetir 16 de 20 6    
escrever n, linha; 6   6 <fim-de-linha>
n <- (n + 7) mod 11; 2 2  
repetir 17 de 20 2    
escrever n, linha; 2   2 <fim-de-linha>
n <- (n + 7) mod 11; 9 9  
repetir 18 de 20 9    
escrever n, linha; 9   9 <fim-de-linha>
n <- (n + 7) mod 11; 5 5  
repetir 19 de 20 5    
escrever n, linha; 5   5 <fim-de-linha>
n <- (n + 7) mod 11; 1 1  
repetir 20 de 20 1    
escrever n, linha; 1   1 <fim-de-linha>
n <- (n + 7) mod 11; 8 8  
fim repetir; 8    

Note-se que:

  1. Os valores repetem-se de 11 em 11.
  2. Em cada conjunto de 11 valores constam todos os numeros de 0 a 10.
  3. O operador mod calcula o resto da divisão inteira do primeiro operando pelo segundo. Por exemplo, 7 mod 11 = 7 porque 7 laranjas a dividir por 11 meninos são 0 laranjas a cada um e sobram 7...

Exercício 3

Alínea a)

{   (* Pressupostos: *)
    q >= p
}
{   (* Resultado a atingir: *)
    Deve aparecer escrita a tabuada dos n de p a q. Por exemplo, se n = 5,
    p = 6 e q = 12 deve aparecer:
    5 x 6 = 30
    5 x 7 = 35
    5 x 8 = 40
    5 x 9 = 45
    5 x 10 = 50
    5 x 11 = 55
    5 x 12 = 60
}
tabuada_n_p_q
inicio
    inteiro n, p, q, i;

    escrever linha;

    escrever "Tabuada dos: ";
    ler para n;
    escrever "De: ";
    ler para p;
    escrever "A: ";
    ler para q;

    para i <- p, q:
        escreve n, " x ", i, " = ", n * i, linha;
    fim para;
fim.

Alínea b)

{   (* Pressupostos: *)
    n >= 1
}
{   (* Resultado a atingir: *)
    Deve aparecer escrita uma tabela com os valores de i, i div 2, i div 2 * 2,
    i mod 2 e i div 2 * 2 + i mod 2 quando i varia de 1 a n. Por exemplo, se 
    n = 5 deve aparecer:
    1 0 0 1 1
    2 1 2 0 2
    3 1 2 1 3
    4 2 4 0 4
    5 2 4 1 5
}
tabela_div_mod
inicio
    inteiro n, i;

    escrever linha;

    escrever "Tabela ate': ";
    ler para n;

    para i <- 1, n:
        escreve i, " ", i div 2, " ", i div 2 * 2, " ", i mod 2, " ",
                i div 2 * 2 + i mod 2, linha;
    fim para;
fim.

A realização do traçado fica a cargo do leitor.

Note-se que se n mod 2 for 0, n é par, e se for 1, n é ímpar.


Exercício 4

Alínea a)

Como somar um número variável de valores? Como não se sabe a priori quantos valores se vai somar, torna-se necessário usar uma acção de repetição. Dentro da acção de repetição lê-se cada um dos valores a somar, que se vão acumulando numa variável soma que foi inicializada com 0 (zero, elemento neutro da adição).

{   (* Pressupostos: *)
    n > 0
}
{   (* Resultado a atingir: *)
    Deve aparecer escrita a soma dos n valores lidos da entrada.
}
soma_n
inicio
    inteiro n, soma, valor;

    escrever linha;

    escrever "Quantos somar? ";
    ler para n;

    escrever "Valores a somar: ";
    soma <- 0;
    repetir n vezes:
        ler para valor;
        soma <- soma + valor;
    fim repetir;

    escrever "A soma e' ", soma, linha;
fim.

Alínea b)

A solução é em tudo idêntica à da alínea anterior, devendo-se apenas substituir a linha:

    escrever "A soma e' ", soma, linha;

por

    escrever "A media e' ", soma div n, linha;

Exercício 5

Alínea a)

Como restringir a soma de duas horas ao intervalo 0 a 23? Se a soma resultar em 25h, o resultado deverá ser 1h, se a soma for 50h o resultado deverá ser 2h, tendo-se retirado respectivamente 24h (1 dia) e 48h (2 dias). Assim, a solução corresponde ao que resta quando se retira o máximo número de dias à soma das horas tal que o número de horas restante seja positivo. Isto é, a restrição faz-se calculando o resto da divisão inteira por 24, o que se pode fazer recorrendo ao operador mod.

{   (* Pressupostos: *)
    h1, h2 >= 0
}
{   (* Resultado a atingir: *)
    Deve aparecer escrita a soma das duas horas restrita ao intervalo 0 a 23.
}
soma_horas1
inicio
    inteiro h1, h2;

    escrever linha;

    escrever "Introduza duas horas ";
    ler para h1, h2;

    escrever "O resultado e': ", (h1 + h2) mod 24;
fim.

Alínea b)

O número de dias é dado pela divisão inteira da soma das horas por 24.

{   (* Pressupostos: *)
    h1, h2 >= 0
}
{   (* Resultado a atingir: *)
    Deve aparecer escrito o numero de dias e horas correspondente `a soma das
    duas horas.
}
soma_horas2
inicio
    inteiro h1, h2;

    escrever linha;

    escrever "Introduza duas horas ";
    ler para h1, h2;

    escrever "Sao ", (h1 + h2) div 24, " dias e ", (h1 + h2) mod 24, "horas.";
    escrever linha;
fim.

Alínea c)

Neste caso é importante não esquecer que a soma dos minutos pode resultar num valor não nulo de horas (e.g. 40min + 50min são 1h e 30min).

{   (* Pressupostos: *)
    h1, h2, m1, m2 >= 0
}
{   (* Resultado a atingir: *)
    Deve aparecer escrito o numero de dias, horas e minutos correspondente 
    `a soma das duas horas (com minutos).
}
soma_horas_minutos
inicio
    inteiro h1, m1, h2, m2, hadicionais;

    escrever linha;

    escrever "Introduza duas horas (com minutos)";
    ler para h1, m1, h2, m2;

    (* Calculo do numero de horas adicional devido `a soma dos minutos: *)
    hadicionais = (m1 + m2) div 60;

    escrever "Sao ", (h1 + h2 + hadicionais) div 24, " dias, ";
    escrever (h1 + h2 + hadicionais) mod 24, "horas e";
    escrever (m1 + m2) mod 60, "minutos.", linha;
fim.

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