ISCTE, IGE, PROGRAMAÇÃO II


Ano lectivo de 1995/96 - Resolução do exame de 15 de Julho de 1996


Grupo I

Teoria

1.a) A definição de MULT3()
1.b) A chamada printf("%d\n", 8 / MULT1(1, 4)) imprime 32.
1.c) A chamada printf("%d\n", MULT2(1+1, 2)) imprime 3.

2.a) A chamada a f2() deveria ser f2(b).
2.b) Imprime 1, 0

3. A chamada func(4) imprime:

1
3
6
10

Grupo II

Programação - Listas

1.

typedef struct Lelemento
{
    int valor;
    struct Lelemento *seguinte;
} Lelemento;
typedef struct
{
    Lelemento *inicio;
} Lista;

2.

Lista *Lcria(void)
{
    Lista *l;

    if((l = malloc(sizeof(*l))) == NULL)
        return NULL;
    l->inicio = NULL;
    return l;
}

3.

Lista *Linsere(Lista *l, int valor)
{
    Lelemento *novo, *ptr;

    if(l == NULL)
        return NULL;
    if((novo = malloc(sizeof(*novo))) == NULL)
        return NULL;
    novo->valor = valor;
    if(l->inicio == NULL || l->inicio->valor >= valor)
    {
        novo->seguinte = l->inicio;
        l->inicio = novo;
        return l;
    }
    for(ptr = l->inicio; ptr->seguinte != NULL; ptr = ptr->seguinte)
        if(ptr->seguinte->valor > valor)
            break;
    novo->seguinte = ptr->seguinte;
    ptr->seguinte = novo;
    return l;
}

4.

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

typedef struct Lelemento
... /* ver acima */

typedef struct
... /* ver acima */

Lista *Lcria(void)
... /* ver acima */

Lista *Linsere(Lista *l, int valor)
... /* ver acima */

int main(void)

{
    Lista *l;
    Lelemento *e;
    int valor;
    
    if((l = Lcria()) == NULL)
	return EXIT_FAILURE;
    while(scanf("%d", &valor) == 1 && valor >= 0)
	Linsere(l, valor);
    for(e = l->inicio; e != NULL; e = e->seguinte)
	printf("%d\n", e->valor);
    return EXIT_SUCCESS;
}

Grupo III

Programação - Ficheiros binários

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

int main(void)

{
    int valor, valori, valorj, i, j, n;
    FILE *saida;
    
    if((saida = fopen("numeros.bin", "w+b")) == NULL)
    {
	fprintf(stderr, "Erro abrindo ficheiro!\n");
	return EXIT_FAILURE;
    }
    for(n = 0; scanf("%d", &valor) == 1 && valor >= 0; n++)
	fwrite(&valor, sizeof(int), 1, saida);
    if(ferror(saida))
    {
	fprintf(stderr, "Erro escrevendo no ficheiro!\n");
	return EXIT_FAILURE;
    }

    for(i = 0; i < n; i++)
    {
	fseek(saida, i * sizeof(int), SEEK_SET);
	fread(&valori, sizeof(int), 1, saida);
	for(j = 0; j < n; j++)
	{
	    fseek(saida, j * sizeof(int), SEEK_SET);
	    fread(&valorj, sizeof(int), 1, saida);
	    if(valori < valorj)
	    {
		fseek(saida, j * sizeof(int), SEEK_SET);
		fwrite(&valori, sizeof(int), 1, saida);
		fseek(saida, i * sizeof(int), SEEK_SET);
		fwrite(&valorj, sizeof(int), 1, saida);
		valori = valorj;
	    }
	}
    }
    if(ferror(saida))
    {
	fprintf(stderr, "Erro ordenando!\n");
	return EXIT_FAILURE;
    }

    fseek(saida, 0, SEEK_SET);
    while(fread(&valor, sizeof(int), 1, saida) == 1)
	printf("%d\n", valor);
    
    fclose(saida);
    
    return EXIT_SUCCESS;
}

Grupo IV

Programação - Recursividade, funções e ciclos

1.

double fact(int n)
{
    if(n <= 1)
	return 1.0;
    return n * fact(n-1);
}

2.

double seno(double val, double tol)
{
    double res, novo;
    int sinal, n;
    
    sinal = 1;
    n = 1;
    res = 0;
    do
    {
	res += novo = sinal * pow(val, n) / fact(n);
	sinal = -sinal;
	n += 2;
    }
    while(novo < -tol || novo > tol);
    return res;
}

3.

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

double fact(int n)
... /* ver acima */

double seno(double val)
... /* ver acima */

int main(int argc, char **argv)

{
    double valor;
    
    while(scanf("%lg", &valor) == 1)
	printf("sin(%g) = %g, seno(%g) = %g\n", 
	       valor, sin(valor), valor, seno(valor, 1e-6));
    return EXIT_SUCCESS;
}

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