Linguagem C

Apontadores, memória dinâmica e listas ligadas

  1. Se i é uma variável do tipo int e p e q são apontadores para int, quais das seguintes atribuições são legais?
    1.   p  =  i;
    2. *p  = &i;
    3. &p = q;
    4.   p = &q;
    5.   p = *&q;
    6.   p =  q;
    7.   p = *q;
    8. *p =  q;
    9. *p = *q;

    [Resolução]

  2. Considere o seguinte exemplo:

    int i, *p;
    i = 5;
    p = &i;

    Qual é o valor de i depois da execução deste segmento de código?

  3. Quais são os valores de p e q após a execução do código seguinte?

    int i, *p, *q;
    i = 5;
    p = &i;
    q = p;
    i = 10;

  4. Escreva uma função void maximo(int *n1, int *n2, int *max) que devolve o máximo entre *n1 e *n2 em *max.
  5. Escreva uma função que receba o endereço de dois inteiros e troque o seu valor. 
  6. Consegue encontrar algum erro no código seguinte?

    int num(int *n){
        int i;
        for(i=0;i<n;i++)
             i += n;
        return i;
    }

  7. Dadas as seguintes declarações:

    int a[] = {5, 15, 34, 54, 14, 2, 52, 72};
    int *p = &a[1], *q = &a[5];

    1. Qual é o valor de *(p+3)?
    2. Qual é o valor de *(q-3)?
    3. Qual é o valor de q - p?
    4. A condição p < q é verdadeira ou falsa?
    5. A condição *p < *q é verdadeira ou falsa?

    [Resolução]

  8. Qual será o conteúdo do vector depois da execução deste pedaço de código:

    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int *p = &a[0], *q = &a[9], temp;

    while(p < q) {
        temp = *p;
        *p++ = *q;
        *q-- = temp;
    }

  9. Reescreva o programa seguinte usando apontadores. Elimine todo o uso de [].

    int soma_vector(int a[], int n){
        int i, soma;
        soma = 0;
        for(i=0; i <n; i++)
             soma += a[i];
        return soma;
    }

  10. Crie um programa que, usando ponteiros, leia 10 inteiros e os imprima na ordem inversa.
    [Resolução]
  11. Crie um programa que, usando memória dinâmica, armazene dois conjuntos de inteiros (em dois vectores) e determine a sua intersecção.
  12. Por questões de segurança, a recepção dum edifício dum banco mantém o registo de todas as pessoas que entram e saem do mesmo. Sobre cada pessoa são armazenadas as seguintes informações:

    Elabore um programa que permita gerir a informação das entradas sobre a forma duma lista ligada. Sempre que alguém entra, os seus dados são adicionados à lista. Sempre que alguém sai são apagados. Deve ser possível listar as pessoas que se encontram no edifício. Para aumentar o nível de segurança sempre que alguém sai do edifício é registado num ficheiro texto o seu nome, BI, hora de entrada e hora de saída. Este ficheiro de texto deverá ter como nome a data a que diz respeito.

    [Resolução]

  13. Escreva um programa que leia do teclado palavras de no máximo 30 caracteres e as insira numa lista simplesmente ligada por ordem alfabética. Na lista não são admitidas palavras repetidas pelo que, para cada palavra deve ser contabilizada o número de vezes que ocorreu. Para maior facilidade considere que as palavras são separadas por <enter> e que a introdução das mesmas termina com a palavra  <end>. Dado um comprimento imprima todas as palavras encontradas, com esse número de caracteres.
  14. Escreva um programa que crie duas listas de inteiros e construa:
    1. a união das listas
    2. a intersecção das listas.
Voltar

Complementos de Programação - ISEP 2003
HTML Válido