ISCTE, IGE, PROGRAMAÇÃO II


Ano lectivo de 1995/96 - Frequência de 15 de Julho de 1996


A cotação completa de cada questão/alínea é indicada junto.


[2,0] 1. Explique a diferença entre os seguintes pares de expressões:
a)

fp = fopen("nome.ext", "r")
fp = fopen("nome.ext", "rb")

b)

fp = fopen("nome.ext", "w+b")
fp = fopen("nome.ext", "r+b")

c)

fprintf(fich, "%d", val)
fwrite(&val, sizeof(int), 1, fich)

d) Escreva a definição das variáveis fich e val.

[2,0] 2. Considere as seguintes definições de macros:

#define MULT1(a, b) a * b
#define MULT2(a, b) (a * b)
#define MULT3(a, b) ((a) * (b))

a) Qual das definições é a mais correcta?
b) O que imprime a chamada printf("%d\n", 8 / MULT1(1, 4))?
c) O que imprime a chamada printf("%d\n", MULT2(1+1, 2)) ?

[2,0] 3. Suponha a definição int valor:
a) Qual das seguintes linhas de código deve ser utilizada para ler um valor inteiro do teclado e colocá-lo em valor?
scanf("%d", valor);
scanf("%d", &valor);
b) Justifique pormenorizadamente a resposta anterior.

[2,0] 4. Suponha as seguintes definições:

#define MAXALUNOSTURMA 100   /* numero maximo de alunos por turma */
#define MAXTURMAS      40    /* numero maximo de turmas */
#define MAXNOME 50
typedef struct
{
    int numero;              /* numero do aluno */
    char nome[MAXNOME+1];    /* nome do aluno */
} alunoTipo;
typedef struct
{
    alunoTipo alunos[MAXALUNOSTURMA];
    int numero,              /* numero da turma */
        numeroAlunos,        /* numero de alunos na turma */
        ano;                 /* ano da turma */
} turmaTipo;
turmaTipo turmas[MAXTURMAS];
int numeroTurmas;            /* numero de turmas */

a) Explique pormenorizadamente em que consiste a variável turmas.
b) Escreva código que imprima o nome e o número de todos os alunos de todas as turmas (admita as posições das matrizes são sempre ocupadas a partir do seu início, por exemplo, se numeroTurmas contiver o valor 2, só as duas primeiras posições de turmas estão ocupadas).
c) Escreva código que atribua 111 ao número do sétimo aluno da nona turma.

[2.0] 5. Suponha que tem definidas a seguintes funções:

void f1(int *val)
{
    *val = 1;
}
void f2(int val)
{
    val = 2;
}

e suponha o seguinte fragmento do programa:

int a = 0, b = 0;
f1(&a);
f2(&b);
printf("%d, %d\n", a, b);

a) Corrija um (único) erro no fragmento de programa.
b) Diga o que imprime o fragmento de programa depois de corrigido.

[2,0] 6. O que imprime a chamada func(4)?

int func(int n)
{
    int res;
    if(n <= 0) return 0; printf("%d\n", res="n" +
func(n-1)); return res; } 

[2,0] 7. Indique o resultado da execução do seguinte programa:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int matriz[8] = {1, 2, 3, 4, 5, 6, 7, 8}, *p, i;
    p = &matriz[3];
    *--p = 10;
    (*--p) = 5;
    ++*p;
    p = matriz;
    for(i = 0; i < 8; i++)
        printf("%d\n", p[i]);
    return EXIT_SUCCESS;
}

[3,0] 8. Suponha os seguintes tipos para utilização em listas simplesmente ligadas:

typedef struct LelementoStr
{
    void *dados; /* ponteiro generico para os dados. */
    struct LelementoStr *seguinte;
} Lelemento;
typedef struct
{
    unsigned long numero; /* numero de elementos na lista. */
    Lelemento *inicio, *corrente, *anterior;
} Lista;
Escreva uma função int Ltroca(Lista *l) que troque, na lista
l, o elemento apontado pelo campo corrente da
estrutura Lista, ou seja L->corrente, com a
elemento imediatamente a seguir. A função deve devolver 1 caso a troca tenha
sucesso e 0 (zero) no caso contrário (por exemplo, se
L->inicio é NULL, ou se
L->corrente é NULL, ou se
L->corrente é o último elemento da lista).

Admita que o campo anterior da estrutura Lista, ou seja L->anterior, aponta o elemento imediatamente anterior a L->corrente (L->anterior tem valor NULL se o elemento corrente for o primeiro da lista).

(Sugestão: faça um pequeno diagrama com as trocas de ponteiros necessárias.)

[3,0] 9. Diga qual o resultado da execução do seguinte programa:

/* Ficheiro fich1.c */                          /* Ficheiro fich2.c */  
#include <stdio.h>                              extern int b;        
#include <stdlib.h>                             static int c = 5;       
                                                                        
extern void g(int);                             void g(int val)         
                                                {                       
int b = 11;                                         b = val + c;        
                                                    c = val * c;        
int c = 2;                                      }                       

void f(int *v)
{
    static int a = 0;
    *v = a;
    a++;
}

int main(void)
{
    int a;
    printf("%d %d %d\n",
           a, b, c);

    {
        int a;

        f(&a);
    }
    f(&a);
    g(3);
    printf("%d %d %d\n",
           a, b, c);
    return EXIT_SUCCESS;
}

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