ISCTE - IGE - Exame de Programação I
Lisboa, 28 de Fevereiro de 1997
Duração: 3 horas Exame sem consulta
Este exame é composto por 7 questões
divididas em duas partes, Parte I e Parte II.
Resolver cada Parte em folhas separadas.
Leia atentamente todo o enunciado antes de começar a prova.
A cotação está explicitada no fim do enunciado.


PARTE I

1. Considere o seguinte código:

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

a) Reescreva-o usando um ciclo while.

b) Reescreva-o usando um ciclo for.

c) Qual das três versões é preferível?

d) Explique as diferenças entre uma variável int e uma variável double.

2. Faça um programa que, dada a distância percorrida e os litros de combustível consumidos, calcule o consumo da viatura em litros gastos por cada 100 Km.

3. A figura representa um quadrado de lado L com um círculo de raio r = L/2, centrado no centro do quadrado. Faça um programa que, depois de pedir o valor de L, calcule a área a sombreado.

 

4. Faça um programa que calcule as raízes de um polinómio de 2º grau de forma genérica ax^2 + bx + c = 0. O programa pede os valores de a, b e c calcula as raízes x1 e x2 reais, se existirem.

5. Escreva um programa que peça duas cadeias de caracteres c1 e c2 e copie o ficheiro "entrada.txt" para o ficheiro "saida.txt" fazendo as seguintes alterações:

entrada: "Tenho 20 anos, nao sei ler"
c1: "02,a"
c2: "81"
saída: "Tenho 18 nos no sei ler"

Nota: só a primeira ocorrência dos caracteres na cadeia c1 conta.


PARTE II

6. Escreva um programa que procure todas as linhas dum ficheiro que contenham uma dada cadeia de caracteres. Quer o nome do ficheiro quer a cadeia devem ser pedidas ao utilizador do programa. As linhas que contêm a cadeia devem ser escritas no ecrã, precedidas do seu número (a primeira linha é a linha 1), assinalando-se a primeira ocorrência da cadeia na linha colocando-a entre "*". Devem-se distinguir maiúsculas de minúsculas. Por exemplo, se a cadeia for "teste" e o ficheiro contiver as linhas:

Ola mundo
Isto e um teste e outro teste
Mais uma linha com Teste
Ultima linha do teste

O programa deve escrever no ecrã:

2: Isto e um *teste* e outro teste
4: Ultima linha do *teste*

7. a) Escreva uma função int converte(char cadeia[], int *erro) que devolve a conversão para inteiro do valor representado pelos dígitos contidos no início da cadeia de caracteres cadeia (ignorando espaços e tabuladores iniciais) e coloque o conteúdo de erro a 1 ou 0, consoante tenha havido conversão ou não.

Exemplos: cadeia devolve erro
  " 43 5" 43 0
  "265Ola" 265 0
  "Bom dia" 0 1
  "" 0 1

b) Escreva um programa que usando a função converte() some todos os números que encontrar no início das linhas lidas no teclado e escreva no ecrã o valor total. O programa termina quando ocorrer o primeiro erro.


Cotações:
Parte I 1 a) 1
b) 1
c) 1
d) 1
2 1
3 1
4 2
5 4
Parte 2 6 4
7 a) 3
b) 1

Descrições abreviadas de algumas funções de que pode precisar

FILE *fopen(const char nome[], const char modo[])
Estabelece um canal de comunicação com o ficheiro cujo nome está guardado na cadeia nome. O canal é estabelecido para leitura ou escrita de acordo com modo. Devolve o descritor do canal.
int fclose(FILE *dcanal)
Fecha o canal descrito por canal.
int printf(const char formato[], ...)
Escreve no ecrã o conteúdo da cadeia formato, substituindo as ocorrências de %d, %s, %c, etc. pelos valores dos argumentos respectivos.
int fprintf(FILE *dcanal, const char formato[], ...)
Como printf(), mas a escrita faz-se no canal descrito por dcanal.
int sprintf(char cadeia[], const char formato[], ...)
Como printf(), mas a escrita faz-se na matriz cadeia, sendo terminada por '\0'.
int scanf(const char formato[], ...)
Lê do teclado o conteúdo da cadeia formato, guardando nos argumentos os valores convertidos de acordo com as corrências de %d, %s, %c, etc. na cadeia. Devolve EOF caso se tenha atingido o fim do ficheiro.
int fscanf(FILE *dcanal, const char formato[], ...)
Como scanf(), mas a leitura faz-se do canal descrito por dcanal. Devolve EOF caso se tenha atingido o fim do ficheiro.
int sscanff(const char cadeia[], const char formato[], ...)
Como scanf(), mas a leitura faz-se da cadeia cadeia.
int putchar(int c)
Escreve no ecrã o caractere de código c.
int fputc(int c, FILE *dcanal)
Escreve no canal descrito por dcanal o caractere de código c.
int getchar()
Lê um caractere do teclado e devolve o seu código (ou EOF caso se tenha atingido o fim do ficheiro).
int fgetc(FILE *dcanal)
Lê um caractere do canal descrito por dcanal e devolve o seu código (ou EOF caso se tenha atingido o fim do ficheiro).
int puts(char cadeia[])
Escreve no ecrã o conteúdo da cadeia cadeia e acrescenta um '\n'.
int fputs(const char cadeia[], FILE *dcanal)
Escreve no canal descrito por dcanal o conteúdo da cadeia cadeia.
char *gets(char cadeia[])
Lê do teclado uma linha (até ao '\n') e guarda-a na matriz cadeia terminada por '\0'. O fim-de-linha não é guardado. Devolve NULL caso se tenha atingido o fim do ficheiro.
char *fgets(char cadeia[], int tamanho, FILE *dcanal)
Lê uma linha do canal descrito por dcanal e guarda-a na matriz cadeia terminada por '\0'. Lê no maximo tamanho-1 caracteres. Guarda também o fim-de-linha (se couber). Devolve NULL caso se tenha atingido o fim do ficheiro.
char *strcpy(char para[], const char de[])
Copia o conteúdo da cadeia de para a matriz para (põe o terminador '\0').
char *strcat(char para[], const char de[])
Concatena o conteúdo da cadeia de no final da cadeia para (põe o terminador '\0').
int strcmp(const char cad1[], const char cad2[])
Compara as cadeias cad1 e cad2. Devolve 0 se forem iguais, > 0 se cad1 for maior que cad2 e < 0 se cad1 for menor que cad2 (usa ordenação do dicionário, excepto quanto à relação entre minúsculas e maiúsculas).
int strlen(const char cadeia[])
Devolve o comprimento da cadeia cadeia.
double atof(const char cadeia[]), int atoi(const char cadeia[]) e long int atol(const char cadeia[])
Devolvem a conversão do conteúdo da cadeia cadeia em valores double, int e long int.
int isdigit(int c), int alpha(int c), int islower(int c), int isupper(int c) e int isspace(int c)
Devolvem um valor lógico verdadeiro ou falso consoante o caractere correspondente ao código guardado em c seja: um dígito, uma letra, uma letra minúscula, uma letra maiúscula, e um espaço branco (espaço, tabulador, fim-de-linha, etc.).
int tolower(int c)
Devolve o código correspondente à versão minúscula do caractere cujo código é guardado por c.
int toupper(int c)
Devolve o código correspondente à versão maiúscula do caractere cujo código é guardado por c.
double sqrt(double x)
Devolve a raíz quadrada de c.

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