ISCTE, IGE, PROGRAMAÇÃO I


Ano lectivo de 1996/97 - Resolução do Exame de 28 de Fevereiro de 1997


PARTE I

1. a)

while((c = getchar()) != EOF)
    putchar(c);

1. b)

for(c = getchar(); c != EOF; c = getchar())
    putchar(c);

ou

for(; (c = getchar()) != EOF; )
    putchar(c);

c) A versão menos apropriada é sem dúvida a versão original, utilizando o ciclo do while, pois obriga à utilização de um teste adicional dentro do corpo do ciclo. O algoritmo, expresso em Português, seria: enquanto se conseguir ler um caracter do teclado, escrever o caracter lido no ecrã. Esta frase, traduzida para C, dá origem imediatamente à versão com o ciclo while. A primeira versão usando o ciclo for é também bastante clara, correspondendo a uma versão usando o ciclo while em que se não faz leitura e atribuição na mesma expressão que o teste:

c = getchar();
while(c != EOF)
{
    putchar(c);
    c = getchar();
}

A última versão com o ciclo for não parece razoável, pois não utiliza as expressões de inicialização e evolução do ciclo, e portanto é substituível, com vantagem, pela primeira versão com ciclo while.

d) Uma variável int guarda valores inteiros positivos e negativos numa gama limitada. Quer a gama quer o formato interno destas variáveis depende da plataforma utilizada, mas é comum os inteiros serem representados por 32 bits usando a notação complemento para 2. Uma variável double guarda valores racionais com gama e precisão limitadas. Chama-se de virgula flutuante porque é usual a representação interna dividir os bits disponíveis para a representação em duas partes: mantissa m e expoente e (base 2), sendo o valor representado m 2^e.

2.

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

int main(void)
{
    double distancia, consumo;
    printf("Quantos quilometros percorreu? ");
    scanf("%lf", &distancia);
    if(distancia <= 0)
    {
        fprintf(stderr, "Distancia invalida!\n");
        return EXIT_FAILURE;
    }
    printf("Quantos litros de gasolina gastou? ");
    scanf("%lf", &consumo);
    if(consumo < 0)
    {
        fprintf(stderr, "Consumo invalido!\n");
        return EXIT_FAILURE;
    }
    printf("Consumo medio [l/100 Km] = %g.\n", consumo / distancia * 100.0);
    return EXIT_SUCCESS;
}

3.

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

#define PI 3.141592654

int main(void)
{
    double L;

    printf("Qual o valor de L? ");
    scanf("%lf", &L);
    printf("A area e´: %g.\n", L * L * (1.0 - PI / 4.0));
    return EXIT_SUCCESS;
}

4.

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

int main(void)
{
    double a, b, c, d;

    printf("Quais os valores de a, b e c? ");
    scanf("%lf%lf%lf", &a, &b, &c);
    if(a == 0.0)
      /* Equacao do 1o grau: */
      if(b == 0.0)
	/* Equacao de grau zero: */
	if(c == 0.0)
	  printf("Qualquer valor real e' solucao!\n");
	else
	  printf("Nao tem solucao!\n");
      else
	printf("Uma raiz: %g\n", - c / b);
    else if((d = b * b - 4 * a * c) < 0)
      printf("Equacao tem duas raizes complexas!\n");
    else
    {
	printf("Raiz 1: %g\n",   (sqrt(d) - b) / (2.0 * a));
	printf("Raiz 2: %g\n", - (sqrt(d) + b) / (2.0 * a));
    }
    return EXIT_SUCCESS;
}

5.

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

#define MAX 1000

int main(void)

{
    FILE *entrada, *saida;
    char cad1[MAX+1], cad2[MAX+1];
    int i, c, comp;
    
    if((entrada = fopen("entrada.txt", "r")) == NULL)
    {
	fprintf(stderr, "Erro abrindo a entrada!\n");
	return EXIT_FAILURE;
    }
    if((saida = fopen("saida.txt", "w")) == NULL)
    {
	fprintf(stderr, "Erro criando a saida!\n");
	fclose(entrada);
	return EXIT_FAILURE;
    }
    
    printf("Introduza as cadeias de caracteres:\n");
    fgets(cad1, MAX+1, stdin);
    if(cad1[strlen(cad1) - 1] == '\n') 
	cad1[strlen(cad1) - 1] = '\0'; 
    fgets(cad2, MAX+1, stdin);
    comp = strlen(cad2);
    if(cad2[comp - 1] == '\n') 
	cad2[--comp] = '\0'; 

    while((c = fgetc(entrada)) != EOF)
    {
	for(i = 0; cad1[i] != c && cad1[i] != '\0'; i++)
	    /* Nada! */;
	if(cad1[i] == '\0')
	    fputc(c, saida);
	else if(i < comp)
	    fputc(cad2[i], saida);
    }
    
    fclose(entrada);
    fclose(saida);
    
    return EXIT_SUCCESS;
}

PARTE II

6.

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

int procura(char c1[], char c2[])

{
    int i, j;
    
    if(c2[0] == '\0')
	return 0;
    for(i = 0; c1[i] != '\0'; i++)
	if(c1[i] == c2[0])
	{
	    for(j = 1; c1[i + j] == c2[j] && c2[j] != '\0'; j++)
		/* Nada! */;
	    if(c2[j] == '\0')
		return i;
	}
    return -1;
}


#define MAXLINHA 1000
#define MAXNOME 1000

void mataLinha(void)

{
    int c;

    while((c = getchar()) != EOF && c != '\n')
	/* Nada! */;
}

int main(void)

{
    FILE *entrada;
    char linha[MAXLINHA+1], cadeia[MAXLINHA+1], nome[MAXNOME+1];
    int l, i, pos, comp;
    
    printf("Qual e' o ficheiro de entrada?\n");
    scanf("%1000s", nome);
    if((entrada = fopen(nome, "r")) == NULL)
    {
	fprintf(stderr, "Erro abrindo o ficheiro de entrada!\n");
	return EXIT_FAILURE;
    }
    mataLinha();

    printf("Qual e' a cadeia a procurar?\n");
    fgets(cadeia, MAXLINHA+1, stdin);
    if(cadeia[strlen(cadeia) - 1] == '\n')
	cadeia[strlen(cadeia) - 1] = '\0';
    comp = strlen(cadeia);

    for(l = 0; fgets(linha, MAXLINHA+1, entrada) != NULL; l++)
	if((pos = procura(linha, cadeia)) >= 0)
	{
	    printf("%d: ", l);
	    for(i = 0; i < pos; i++)
		putchar(linha[i]);
	    putchar('*');
	    for(i = 0; i < comp; i++)
		putchar(cadeia[i]);
	    putchar('*');
	    for(i = pos + comp; linha[i] != '\0'; i++)
		putchar(linha[i]);
	}
    
    return EXIT_SUCCESS;
}

7. a) e b)

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

int converte(char cadeia[], int *erro)

{
    int i, numero;
    
    for(i = 0; isspace(cadeia[i]); i++)
	/* Nada! */;
    if(!isdigit(cadeia[i]))
    {
	*erro = 1;
	return 0;
    }
    numero = 0;
    for(; isdigit(cadeia[i]); i++)
	numero = numero * 10 + cadeia[i] - '0';
    *erro = 0;
    return numero;
}

#define MAXLINHA 1000

int main(void)

{
    char linha[MAXLINHA+1];
    int erro, total;
    
    total = 0;
    while(fgets(linha, MAXLINHA+1, stdin) != NULL)
    {
	total += converte(linha, &erro);
	if(erro)
	    break;
    }
    printf("O total e': %d.\n", total);
    
    return EXIT_SUCCESS;
}

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