Faça um programa para associar nomes as linhas de uma matriz de caracteres. O usuário irá informar o número máximo de nomes que poderão ser armazenados. Cada nome poderá ter até 30 caracteres com o ’
'. O usuário poderá usar 5 opções diferentes para manipular a matriz:
(a) Gravar um nome em uma linha da matriz;
(b) Apagar o nome contido em uma linha da matriz;
© Informar um nome, procurar a linha onde ele se encontra e substituir por outro nome;
(d) Informar um nome, procurar a linha onde ele se encontra e apagar;
(e) Pedir para recuperar o nome contido em uma linha da matriz;
(a) Gravar um nome em uma linha da matriz;
(b) Apagar o nome contido em uma linha da matriz;
© Informar um nome, procurar a linha onde ele se encontra e substituir por outro nome;
(d) Informar um nome, procurar a linha onde ele se encontra e apagar;
(e) Pedir para recuperar o nome contido em uma linha da matriz;
Passo 1
O enunciado nos pede um programa em C que armazene até N nomes (cada até 30 caracteres + ‘\0’) em uma matriz de caracteres e ofereça um menu com operações de gravação, exclusão, busca/substituição, busca/exclusão e recuperação.
Em C, podemos representar N nomes como uma matriz de caracteres
Em C, podemos representar N nomes como uma matriz de caracteres
char nomes[N][31]
, onde cada linha é um nome terminado em \0
. Para manipular strings, vamos usar funções da <string.h>
, como strcpy
, strncmp
e strcmp
. Também precisamos garantir validações de índice e tratar nomes vazios definindo o primeiro caractere como \0
.Passo 2
Definimos uma função
No
inicializar(nomes, N)
que percorre de 0 a N-1 e faz nomes[i][0] = '\0'
, marcando todas as linhas como vazias.No
main()
, lemos o valor de N
, alocamos estaticamente char nomes[N][31];
e chamamos inicializar
. Entramos em um laço do…while
que exibe o menu e lê a opção do usuário.Passo 3
Para a opção (a) – gravação: lemos um índice
Para a opção (b) – apagar por índice: lemos
Para © – substituir nome: lemos
Para (d) – apagar por nome: lemos
Para (e) – recuperar por índice: lemos
i
(0 ≤ i < N), lemos uma string novoNome
e copiamos para nomes[i]
usando strncpy
garantindo o \0
. Se o índice for inválido, exibimos mensagem de erro.Para a opção (b) – apagar por índice: lemos
i
, validamos, e fazemos nomes[i][0] = '\0'
, tornando aquela linha vazia.Para © – substituir nome: lemos
antigo
, procuramos com strcmp
em 0…N-1. Se encontrado em j
, lemos novo
e fazemos strncpy(nomes[j], novo, 30); nomes[j][30]='\0'
. Se não achar, avisamos o usuário.Para (d) – apagar por nome: lemos
alvo
, procuramos em 0…N-1. Se achar em j
, fazemos nomes[j][0] = '\0'
. Caso contrário, avisamos.Para (e) – recuperar por índice: lemos
i
, validamos. Se nomes[i][0] != '\0'
, imprimimos o nome; senão indicamos que está vazio.Passo 4
O laço só termina quando o usuário escolher uma opção de saída (por exemplo, digitando 0). Vamos agrupar tudo num único programa em C, comentado e organizado.
Resposta
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
void inicializar(char nomes[][31], int N) {
for (int i = 0; i < N; i++) {
nomes[i][0] = ‘\0’;
}
}
for (int i = 0; i < N; i++) {
nomes[i][0] = ‘\0’;
}
}
int main() {
int N;
printf(“Digite o número máximo de nomes: “);
if (scanf(”%d”, &N) != 1 || N <= 0) {
printf(“Número inválido. Encerrando.\n”);
return 1;
}
int N;
printf(“Digite o número máximo de nomes: “);
if (scanf(”%d”, &N) != 1 || N <= 0) {
printf(“Número inválido. Encerrando.\n”);
return 1;
}
char (*nomes)[31] = malloc(N * 31 * sizeof(char));
if (!nomes) {
printf("Falha na alocação.\n");
return 1;
}
inicializar(nomes, N);
int opc;
do {
printf("\nMenu:\n");
printf("1. Gravar nome em linha\n");
printf("2. Apagar nome em linha\n");
printf("3. Substituir nome existente\n");
printf("4. Apagar por nome\n");
printf("5. Recuperar nome de linha\n");
printf("0. Sair\n");
printf("Escolha uma opcao: ");
scanf("%d", &opc);
if (opc == 1) {
int i;
char novo[31];
printf("Linha para gravar (0 a %d): ", N-1);
scanf("%d", &i);
if (i < 0 || i >= N) {
printf("Índice inválido!\n");
} else {
printf("Digite o nome (max 30 chars): ");
scanf(" %30[^"]", novo);
strncpy(nomes[i], novo, 30);
nomes[i][30] = '\0';
printf("Nome gravado na linha %d.\n", i);
}
} else if (opc == 2) {
int i;
printf("Linha para apagar (0 a %d): ", N-1);
scanf("%d", &i);
if (i < 0 || i >= N) {
printf("Índice inválido!\n");
} else {
nomes[i][0] = '\0';
printf("Linha %d apagada.\n", i);
}
} else if (opc == 3) {
char antigo[31], novo[31];
printf("Nome a ser substituído: ");
scanf(" %30[^"]", antigo);
int achou = -1;
for (int j = 0; j < N; j++) {
if (strcmp(nomes[j], antigo) == 0) {
achou = j;
break;
}
}
if (achou < 0) {
printf("Nome não encontrado.\n");
} else {
printf("Digite o novo nome: ");
scanf(" %30[^"]", novo);
strncpy(nomes[achou], novo, 30);
nomes[achou][30] = '\0';
printf("Linha %d substituída.\n", achou);
}
} else if (opc == 4) {
char alvo[31];
printf("Nome a apagar: ");
scanf(" %30[^"]", alvo);
int achou = -1;
for (int j = 0; j < N; j++) {
if (strcmp(nomes[j], alvo) == 0) {
achou = j;
break;
}
}
if (achou < 0) {
printf("Nome não encontrado.\n");
} else {
nomes[achou][0] = '\0';
printf("Nome apagado na linha %d.\n", achou);
}
} else if (opc == 5) {
int i;
printf("Linha para recuperar (0 a %d): ", N-1);
scanf("%d", &i);
if (i < 0 || i >= N) {
printf("Índice inválido!\n");
} else if (nomes[i][0] == '\0') {
printf("Linha %d está vazia.\n", i);
} else {
printf("Nome na linha %d: %s\n", i, nomes[i]);
}
} else if (opc != 0) {
printf("Opcao invalida!\n");
}
} while (opc != 0);
free(nomes);
printf("Fim do programa.\n");
return 0;
}