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).