ISCTE, IGE, PROGRAMAÇÃO I


Ano lectivo de 1996/97 - Resolução da Frequência de 3 de Fevereiro de 1997


[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.
Abre um canal para leitura dum ficheiro. Se o ficheiro não existir o canal não é aberto.
w - abrir para escrever.
Abre um canal para escrita num ficheiro. Se o ficheiro não existir, é criado. Se existir, é "esvaziado", perdendo-se tudo o que continha.
a - abrir para acrescentar.
Abre um canal para escrita num ficheiro. Se o ficheiro não existir, é criado. Se existir, tudo o que continha é mantido, e o que se escrever será acrescentado o final do ficheiro.

[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