Revisões sobre C


Informação complementar:

  1. Considere o seguinte bloco de código:

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

  2. Tendo como referência o código que se segue, escreva um programa que use apontadores para cada um dos vários tipos de dados básicos (char, short, int, long, float e double). Comece por declarar e iniciar uma variável para cada tipo básico juntamente com um apontador para essa variável. De seguida, utilize o operador sizeof para imprimir o tamanho de cada variável, o tamanho do seu endereço de memória, o tamanho de cada apontador e o tamanho do conteúdo apontado por cada apontador. Por fim, imprima o endereço e o conteúdo de cada uma das variáveis.

      char c, *cptr;
      c = 'a';
      cptr = &c;
      printf("tamanho de um char: %lu\n", sizeof(c));
      printf("tamanho do endereço de um char: %lu\n", sizeof(&c));
      printf("tamanho de um apontador para um char: %lu\n", sizeof(cptr));
      printf("tamanho do conteúdo apontado por um apontador para um char: %lu\n", sizeof(*cptr));
      printf("Os valores apontados pelos endereços '%p' e '%p' são '%c' e '%c'\n", &c, cptr, c, *cptr);
    
  3. Considere a seguinte declaração:

      int x[3] = {23, 41, 17};
    

    Qual é o valor das expressões que se seguem:

  4. Complete o código que se segue de forma a imprimir os valores e os endereços de um vector de caracteres com as 10 primeiras letras do alfabeto. Que alterações são necessárias fazer ao programa para se poder imprimir o conteúdo do vector com a instrução "printf("%s", v);".

      #include <stdio.h>
      #define SIZE 10
    
      void show_vector(char *a, int n);
    
      int main() {
        char v[SIZE] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
        show_vector(v, SIZE);
        return 0;
      }
    
      void show_vector(char *a, int n) {
        int i;
        for (i = 0; i < n; i++) {
          // imprima aqui os valores e os endereços de cada elemento do vector
        }
      }
    
  5. Relativamente ao seguinte fragmento de código que se segue, explique por palavras suas o que são os identificadores mp, alloc_matrix e fun.

      #include <stdio.h>
      #include <stdlib.h>
    
      int add(int a, int b) {
        return a + b;
      }
    
      int *alloc_matrix(int m, int n) {
        return (int *) malloc(m * n * sizeof(int));
      }
    
      int main() {
        int *mp;
        int (*fun)(int, int);
    
        mp = alloc_matrix(3, 5);
    
        // Notação tradicional
        fun = &add;
        printf("2 + 3 = %d\n", (*fun)(2, 3));
    
        // Notação abreviada
        fun = add;
        printf("4 + 5 = %d\n", fun(4, 5));
        return 0;
      }
    
  6. Escreva o programa mat2file que pede ao utilizador que introduza os elementos (inteiros) de uma matriz, e que os armazena num ficheiro (utilizando como separador o caracter espaço). As dimensões da matriz e o nome do ficheiro são passados através da linha de comando (e.g., "mat2file 2 3 matriz.txt"), sendo os elementos pedidos, um a um, ao utilizador. No ficheiro, os dois primeiros elementos são o número de linhas e de colunas, sendo os restantes os elementos da matriz. Por exemplo, a matriz:

    10 20 30
    40 50 60

    deve ser armazenada como:

    2 3 10 20 30 40 50 60

    Funções a ter em conta: atoi(), scanf(), fopen(), fprintf() e fclose().

  7. Escreva o programa file2mat que lê um ficheiro criado pelo mat2file, cujo nome deve ser passado na linha de comando (e.g., "file2mat matriz.txt") e imprime o seu conteúdo no ecrã, com os elementos da mesma linha e de diferentes colunas separados por tabs (\t).

    Funções a ter em conta: fopen(), fscanf() e fclose().