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. |
![](imagens/quadratura.gif) |
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. |
![](imagens/formula.gif) |
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:
- Se o caractere lido não existir na cadeia c1, deve ser escrito sem
alteração.
- Se o caractere lido existir na cadeia c1 na posição n e n
for inferior ao comprimento de c2,
escrever o caractere que se encontra na posição n da cadeia c2.
- Se o caractere lido existir na cadeia c1 na posição n e n
for igual ou superior ao comprimento de c2, não escrever qualquer
caractere. Exemplo:
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.