Faça um programa que simule a memória de um computador: o usuário irá especificar o tamanho da memória, ou seja, quantos bytes serão alocados do tipo inteiro. Para tanto, a memória solicitada deve ser um valor múltiplo do tamanho do tipo inteiro. Em seguida, o usuário terá 2 opções: inserir um valor em uma determinada posição ou consultar o valor contido em uma determinada posição. A memória deve iniciar com todos os dados zerados.
Passo 1
O programa vai usar conceitos de alocação dinâmica de memória e manipulação de arrays para simular uma área de memória de inteiros.
Passo 2
Ler do usuário o tamanho em bytes da memória. Checar se esse valor é múltiplo de sizeof(int). Se não for, avisar o erro e pedir novamente.
Calcular o número de posições inteiras: qtd = bytes / sizeof(int). Alocar com calloc(qtd, sizeof(int)) para já iniciar tudo com zero.
Calcular o número de posições inteiras: qtd = bytes / sizeof(int). Alocar com calloc(qtd, sizeof(int)) para já iniciar tudo com zero.
Passo 3
Entrar num laço de menu com três opções: inserir valor, consultar valor ou sair.
Passo 4
Para inserir: pedir índice, validar se 0 ≤ índice < qtd; em caso positivo, pedir o valor inteiro e armazenar memoria[indice] = valor.
Para consultar: pedir índice, validar como acima; se for válido, exibir o valor em memoria[indice].
Para consultar: pedir índice, validar como acima; se for válido, exibir o valor em memoria[indice].
Passo 5
Ao sair do laço, liberar a área alocada com free e terminar o programa.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
int main(void) {
size_t bytes;
int *memoria = NULL;
size_t qtd = 0;
size_t bytes;
int *memoria = NULL;
size_t qtd = 0;
// Passo 1: ler e validar tamanho em bytes
do {
printf("Digite o tamanho da memória em bytes (múltiplo de %zu): ", sizeof(int));
if (scanf("%zu", &bytes) != 1) {
printf("Entrada inválida. Tente novamente.\n");
// limpar stdin
while (getchar() != '\n');
continue;
}
if (bytes == 0 || bytes % sizeof(int) != 0) {
printf("O número de bytes deve ser múltiplo de %zu e maior que zero.\n", sizeof(int));
}
} while (bytes == 0 || bytes % sizeof(int) != 0);
// Passo 2: alocar e iniciar com zeros
qtd = bytes / sizeof(int);
memoria = (int*) calloc(qtd, sizeof(int));
if (!memoria) {
printf("Falha na alocação de memória.\n");
return 1;
}
// Passo 3: menu de operações
int opcao;
do {
printf("\nMenu:\n");
printf("1 - Inserir valor em uma posição\n");
printf("2 - Consultar valor em uma posição\n");
printf("0 - Sair\n");
printf("Escolha uma opção: ");
if (scanf("%d", &opcao) != 1) {
printf("Opção inválida.\n");
while (getchar() != '\n');
continue;
}
if (opcao == 1) {
size_t idx;
int val;
printf("Digite a posição (0 a %zu): ", qtd - 1);
if (scanf("%zu", &idx) != 1) {
printf("Entrada inválida.\n");
while (getchar() != '\n');
continue;
}
if (idx >= qtd) {
printf("Posição fora do intervalo.\n");
} else {
printf("Digite o valor inteiro: ");
scanf("%d", &val);
memoria[idx] = val;
printf("Valor inserido com sucesso.\n");
}
} else if (opcao == 2) {
size_t idx;
printf("Digite a posição (0 a %zu) para consulta: ", qtd - 1);
if (scanf("%zu", &idx) != 1) {
printf("Entrada inválida.\n");
while (getchar() != '\n');
continue;
}
if (idx >= qtd) {
printf("Posição fora do intervalo.\n");
} else {
printf("Valor em memoria[%zu] = %d\n", idx, memoria[idx]);
}
} else if (opcao != 0) {
printf("Opção não reconhecida.\n");
}
} while (opcao != 0);
// Passo 4: liberar memória e encerrar
free(memoria);
printf("Programa encerrado.\n");
return 0;
}