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 |
||||