Alocação de Memória, Arquivos e Estruturas em C

Classificado em Computação

Escrito em em português com um tamanho de 4,52 KB.

Exercício de Revisão de Programação I

Alocação de Memória

1) O que seria alocação estática e alocação dinâmica de memória?

A alocação estática ocorre quando o programador define a quantidade de memória necessária para um vetor. Essa alocação pode ser feita pelo compilador e é realizada antes da execução do programa.

A alocação dinâmica ocorre quando o programador não define a quantidade de memória necessária para um vetor, pois o número de elementos não foi predefinido.

2) Qual a diferença entre int *meu_vetor e int meu_vetor[TAM]?

int *meu_vetor declara um ponteiro para inteiro chamado meu_vetor, que terá alocação dinâmica. int meu_vetor[TAM] declara um vetor de inteiros chamado meu_vetor com tamanho definido por TAM, possuindo alocação estática.

Manipulação de Arquivos em C

3) Sobre a manipulação de arquivos na linguagem C, responda:

a) Qual a vantagem de armazenar dados de um programa em arquivos?

Armazenar dados em arquivos permite persistir informações além da execução do programa, sem a necessidade de declarar previamente o tamanho da memória.

b) O que seria a chave de um registro?

A chave de um registro é um campo específico que o identifica unicamente, facilitando sua recuperação.

c) Quais são os três modos de abertura de um arquivo?

  • Modo 'r': Abre um arquivo existente para leitura. Se o arquivo não existir, ocorrerá um erro.
  • Modo 'w': Abre um novo arquivo para gravação. Se o arquivo já existir, seu conteúdo será sobrescrito.
  • Modo 'a': Abre um arquivo para anexação de dados. Se o arquivo não existir, um novo arquivo será criado.

d) Quais as vantagens e desvantagens do uso de arquivos textuais?

(A resposta a esta pergunta não foi fornecida no documento original.)

e) Como são representados os registros em um arquivo binário?

(A resposta a esta pergunta não foi fornecida no documento original.)

Instruções em C

4) Escreva em C instruções para as seguintes operações:

a) A declaração de um tipo estruturado chamado Aluno, com os campos: matrícula (int), nome (vetor de char), nota1 (float) e nota2 (float).

struct Aluno {
  int matricula;
  char nome[100]; // Tamanho do nome definido como exemplo
  float nota1;
  float nota2;
};

b) A declaração de um vetor dinâmico chamado vet e a alocação inicial de 10 posições de memória para ele.

int *vet;
vet = (int *) malloc(10 * sizeof(int));

c) A declaração e alocação dinâmica de memória para uma matriz 3x3 chamada mat.

int **mat;
mat = (int **) malloc(3 * sizeof(int *));
for (int i = 0; i < 3; i++) {
  mat[i] = (int *) malloc(3 * sizeof(int));
}

d) A redução do vetor da letra 'b' para 5 posições de memória.

vet = (int *) realloc(vet, 5 * sizeof(int));

e) A declaração e abertura de um arquivo chamado “dados.txt”, em modo de gravação.

FILE *arquivo;
arquivo = fopen("dados.txt", "w");

Dispositivos Padrões de Entrada e Saída

5) Quais são os dispositivos padrões de entrada e saída, bem como suas constantes e significados?

(A resposta a esta pergunta não foi fornecida no documento original.)

Trecho de Código

6) Onde e o que será gerado no seguinte trecho de código?

int mat[3][3], i, j;
int a = 2;
int b = 3;
FILE *arq;
for (i = 0; i < 3; i++) {
  for (j = 0; j < 3; j++) {
    if (i % 2 == 0 && j % 2 == 0)
      mat[i][j] = a + i;
    else
      mat[i][j] = b + j;
  }
}
arq = stdout; // stdout representa a saída padrão (geralmente o console)
for (i = 0; i < 3; i++) {
  for (j = 0; j < 3; j++) {
    fprintf(arq, "%d ", mat[i][j]);
  }
  fprintf(arq, "\n");
}

O código inicializa uma matriz 3x3 com valores baseados nos índices e variáveis a e b. Em seguida, imprime a matriz na saída padrão (console).

Entradas relacionadas: