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