ISCTE, IGE, PROGRAMAÇÃO II


Ano lectivo de 1995/96 - Frequência de 28 de Junho de 1996


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


1. [2,0] Indique o que faz cada uma das seguintes instruções:

a) fp = fopen("nome.ext", "rb");
b) fp = fopen("nome.ext", "w");
c) fp = fopen("nome.ext", "r+b");
d) Escreva a declaração da variável fp.

Programa 1 (prog.c):

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int i;
    for(i = 0; i < argc; i++)
        printf("%s\n", argv[i]);
    return EXIT_SUCCESS;
}

2. [2,0] Relativamente ao Programa 1 (executável prog.exe), executado com o comando prog a b c:

a) Diga o que aparece no ecrã.
b) Qual o valor de argc?

3. [2,0] Suponha as declarações char nome1[41], nome2[41]:

a) Qual das seguintes linhas de código deve ser utilizada (e porquê) para ler um nome do teclado?
gets(nome1);
fgets(nome2, 41, stdin);
b) A função fgets() não tem o mesmo efeito que gets(). Admita que introduziu o mesmo texto no teclado tanto para gets() como para fgets(). Corrija o conteúdo de nome2 de modo a garantir que strcmp(nome1, nome2) devolve 0 (zero).

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

typedef struct
{
    int numero;
    int notas[4];
    char nome[41];
} alunotipo;
alunotipo alunos[100];

a) Explique em que consiste a variável alunos.
b) Escreva código que imprima o nome e o número de todos os alunos.
c) Escreva código que atribua 20 à terceira nota do décimo aluno.

5. [2.0] Suponha que tem definida a seguinte função:

void f(int a, int *b)
{
    a = *b = 10;
}

Diga o que imprime o seguinte fragmento de programa:

int x = 3, y = 7, a = 11, *b = &y
f(x, &y);
printf("%d, %d, %d, %d\n", x, y, a, *b);

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

int func(int a)
{
    printf("%d\n", a);
    return a <= 1 ? 0 : func(a / 2);
}

7. [2,0] 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[5];
    *p++ = 10;
    (*p)++;
    p = matriz;
    for(i = 0; i < 8; i++)
        printf("%d\n", p[i]);
    return EXIT_SUCCESS;
}

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

typedef struct LelementoStr
{
    void *dados; /* ponteiro generico para os dados. */
    struct LelementoStr *anterior, *seguinte;
} Lelemento;

typedef struct
{
    unsigned long numero; /* numero de elementos na lista. */
    Lelemento *inicio, *corrente;
} Lista;

Escreva uma função void *Lremove(Lista *l) que remova da lista l o elemento apontado pelo campo corrente da estrutura Lista, ou seja L->corrente, e que devolva os seus dados. Uma lista vazia tem sempre l->inicio com valor NULL.

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

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

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

int main(void)
{
    printf("%d %d %d\n",
           a, b, c);
    f();
    f();
    g(33);
    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