ISCTE, IGE, PROGRAMAÇÃO II


Ano lectivo de 1995/96 - Resolução da frequência de 28 de Junho de 1996


1.a) fp = fopen("nome.ext", "rb") - abre para leitura um ficheiro binário nome.ext já existente.
1.b) fp = fopen("nome.ext", "w") - cria para escrita, ou abre e trunca se já existir, um ficheiro de texto nome.ext.
c) fp = fopen("nome.ext", "r+b") - abre para leitura e escrita um ficheiro binário nome.ext já existente.
Em qualquer dos casos é devolvido NULL para assinalar erros.
d) FILE *fp, admitindo que se incluiu stdio.h

2.a) No ecrã aparece:

prog [ou prog.exe]
a
b
c

2.b) O valor de argc é 4.

3.a) Deve ser utilizada a segunda linha de código, pois não há nenhuma maneira de limitar o número de caracteres lidos pela função gets(), ao contrário do que acontece com fgets(). A chamada a gets() pode portanto resultar na atribuição de valores (caracteres) para além do final da cadeia (matriz de caracteres) nome1, o que, para além de ser um erro grave, conduz a resultados indefinidos.
3.b) A função fgets() coloca na cadeia (se para tal houver espaço, daí o if no código abaixo!) o caractere de fim-de-linha ('\n'), que é descartado por gets(). Esse efeito pode ser corrigido com

if(nome2[strlen(nome2)-1] == '\n')
    nome2[strlen(nome2)-1] = '\0';

admitindo que se incluiu string.h.

4.a) A variável alunos consiste numa matriz com 100 estruturas do tipo alunotipo, cada uma com três campos: um inteiro numero, uma matriz de inteiros notas com três elementos e uma cadeia (matriz de caracteres) nome com 41 caracteres.
4.b)

int i;
for(i = 0; i < 100; i++) 
    printf("Nome: \"%s\"\nNumero: %d\n", alunos[i].nome, alunos[i].numero);

4.c) Para atribuir 20 à terceira nota do décimo aluno pode-se usar a instrução:

alunos[9].notas[2] = 20;

5. O programa imprime

3, 10, 11, 10

6. A chamada func(15) imprime:

15
7
3
1

7. A execução do programa resulta em:

1
2
3
4
5
10
8
8

8. A função Lremove(Lista *l) pode ser escrita, por exemplo:


void *Lremove(Lista *l)

{
    void *dados;
    Lelemento *corr;

    /* As condicoes de erro sao: lista nula, lista vazia, ou elemento corrente
       nulo. */
    if(l == 0 || l->inicio == NULL || l->corrente == NULL)
        return NULL;

    corr = l->corrente;                            /* ponteiro para o corrente */
    dados = corr->dados;                           /* guarda dados do corrente */

    l->numero--;                                   /* decrementa numero de elementos */

    if(corr->seguinte != NULL)                     /* existe elemento seguinte? */
    {
        corr->seguinte->anterior = corr->anterior; /* corrige anterior do seguinte */
        l->corrente = corr->seguinte;              /* novo corrente e' o seguinte */
    }
    else                                           /* nao existe elemento seguinte */
        l->corrente = corr->anterior;              /* novo corrente e' o anterior */

    if(corr->anterior != NULL)                     /* existe elemento anterior? */
        corr->anterior->seguinte = corr->seguinte; /* corrige seguinte do anterior */
    else                                           /* nao existe elemento anterior */
        l->inicio = corr->seguinte;                /* novo inicio e' o seguinte */

    free(corr);                                    /* liberta elemento ex-corrente */

    return dados;                                  /* devolve dados */
}

9. O resultado da execução do programa é:

0 11 2
38 66 2

Página concebida e mantida por Eng. Manuel Menezes de Sequeira (última actualização 2006/07/07)
Copyright © 1996-2001 ISCTE