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 ’ backslash 0 '. 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;

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 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 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 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>
void inicializar(char nomes[][31], int N) {
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;
}
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;
}

Exercícios relacionados