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 |
![]() |