[5] 1.
[1] a) Uma cadeia de caracteres é uma sequência de (códigos
de) caracteres guardada numa matriz e terminada pelo código
especial '\0'
, que não corresponde a nenhum
caractere válido.
[1] b) Não se deve usar a função gets()
porque
esta não possui nenhum mecanismo que estabeleça um limite para
o número de caracteres lidos e guardados na matriz que lhe é
passada como argumento. Assim, corre-se sempre o risco de
ultrapassar o limite dessa matriz, por maior que a matriz seja.
[1] c) Pode-se usar a função fgets()
, pois o seu
segundo argumento é o número máximo de caracteres a ler (mais
um), o que resolve o problema apontado para a função gets()
.
[1] d) fgets(cadeia, limite, canal);
[1] e)
r
- abrir para ler. w
- abrir para escrever. a
- abrir para acrescentar. [4] 2.
#include <stdio.h> #include <stdlib.h> int main(void) { int n, i, j, res; printf("Qual o tamanho? "); while((res = scanf("%d", &n)) == 1 && (n < 0 || n % 2 == 0)) printf("Tamanho invalido! Qual o tamanho? "); if(res != 1) { fprintf(stderr, "Erro: encontrei caractere(s) invalido(s)!\n"); return EXIT_FAILURE; } for(i = 0; i < n; i++) { for(j = 0; j < n; j++) if(i == 0 || i == n - 1 || j == 0 || j == n - 1 || i == j || j == n - 1 - i) putchar('*'); else putchar(' '); putchar('\n'); } return EXIT_SUCCESS; }
[6] 3.
[2] a), b) e c)
/* * Nota: considera-se que as matriculas contem apenas maiusculas. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> /* Numero de caracteres numa matricula (com versao em cadeia de caracteres, que sera' usada na funcao scanf(): */ #define MAX_MATR 8 #define MAX_MATR_CAD "8" /* Numero maximo de caracteres num nome (arbitrado, pois nao consta no enunciado: */ #define MAX_NOME 100 /* Numero maximo de caracteres numa linha do ficheiro (incluindo o espaco que separa a matricula do nome e o fim-de-linha final): */ #define MAX_LINHA (MAX_MATR + 1 /* ' ' */ + MAX_NOME + 1 /* '\n' */) /* Procura uma matricula e escreve o seu ano de registo e o nome do seu proprietario: */ int main(void) { char matricula[MAX_MATR + 1]; char nome[MAX_NOME + 1]; int procura_matricula(char [], char [], char []); int ano_registo(char []); printf("Introduza uma matricula: "); scanf("%" MAX_MATR_CAD "s", matricula); if(procura_matricula("auto.txt", matricula, nome) == -1) printf("Matricula %s nao encontrada!\n", matricula); else printf("O carro %s, do ano %d, pertence a %s.\n", matricula, ano_registo(matricula), nome); return EXIT_SUCCESS; } /* Procura, no ficheiro cujo nome esta' contido em fich, uma dada matricula, devolvendo a linha do ficheiro onde a linha foi encontrada (-1 em caso de erro, e guardando em nome o nome do respectivo proprietario: */ int procura_matricula(char fich[], char matricula[], char nome[]) { FILE *canal; char linha[MAX_LINHA + 1]; int l, i; if((canal = fopen(fich, "r")) == NULL) { fprintf(stderr, "Erro: abrindo \"%s\"!\n", fich); exit(EXIT_FAILURE); } for(l = 0; fgets(linha, MAX_LINHA + 1, canal) != NULL; l++) { /* Coloca um terminador no local do espaco que separa a matricula do nome de modo a poder usar a funcao strcmp() para verificar se a matricula corresponde `a que se procura: */ linha[MAX_MATR] = '\0'; if(strcmp(matricula, linha) == 0) { /* Se a matricula corresponde, copia-la para nome, ignorando o \n final: */ for(i = 0; linha[MAX_MATR + 1 + i] != '\n' && linha[MAX_MATR + 1 + i] != '\0'; i++) nome[i] = linha[MAX_MATR + 1 + i]; nome[i] = '\0'; fclose(canal); return l; } } /* Aqui so' se chega se a matricula nao foi encontrada: */ fclose(canal); return -1; } /* Devolve o ano de registo duma matricula: */ int ano_registo(char matricula[]) { return 1900 + (matricula[0] - 'A') * 26 + matricula[1] - 'A'; }
[5] 4.
/* * Nota: Para simplificar a solucao, decidiu-se contar os caracteres lidos do * teclado. Subsituir stdin por outro canal convenientemente aberto para que * a leitura seja feita dum ficheiro. */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(void) { int c, conta[26] = {0} /* inicializa toda a matriz com zeros. */; while((c = fgetc(stdin)) != EOF) if(isalpha(c)) conta[tolower(c) - 'a']++; for(c = 'a'; c <= 'z'; c++) printf("%c: %d\n", c, conta[c - 'a']); return EXIT_SUCCESS; }
Página
concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07) Copyright © 1996-2001 ISCTE |