Faça um programa que armazena filmes produzidos por vários diretores e:
  • Crie e leia um vetor de 5 diretores, cada um contendo nome (máximo 20 letras), quantidade de filmes e filmes. O membro filmes é um vetor, que deve ser criado após ter lido quantidade de filmes. Cada filme é composto por nome, ano e duração.
  • Procure um diretor por nome, mostrando todos os filmes que ele já produziu. Repita o processo até digitar uma string vazia.

Passo 1

A questão pede um programa em C que armazene informações de 5 diretores, cada um com um número variável de filmes, e depois permita buscar um diretor pelo nome exibindo seus filmes. Vamos precisar de estruturas (structs), alocação dinâmica para o vetor de filmes, leitura de strings com fgets, laços para ler e buscar e, por fim, liberar a memória alocada.

Passo 2

Definimos duas structs: “Filme” com nome, ano e duração, e “Diretor” com nome, quantidade de filmes e um ponteiro para um vetor de “Filme”.

Passo 3

Para ler os dados dos 5 diretores, fazemos um laço for de 0 a 4. Em cada iteração, usamos fgets para capturar o nome (até 20 caracteres) e scanf para a quantidade de filmes. Em seguida alocamos dinamicamente o vetor de filmes do tamanho informado. Dentro de outro laço, usamos fgets e scanf para ler nome, ano e duração de cada filme.

Passo 4

Implementamos um laço while que repete a busca até o usuário digitar uma string vazia. Em cada iteração, usamos fgets para ler o nome buscado e strcmp para comparar com cada diretor. Se achar, imprimimos todos os filmes; se não, exibimos mensagem de “não encontrado”.

Passo 5

Por fim, após sair do loop de busca, liberamos a memória de cada vetor de filmes com free e encerramos o programa retornando 0. Mantemos a interface de leitura/exibição simples com printf, fgets, scanf e getchar para consumir quebras de linha.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char nome[50];
int ano;
int duracao;
} Filme;
typedef struct {
char nome[21];
int qtd;
Filme *filmes;
} Diretor;
int main() {
Diretor diretores[5];
for (int i = 0; i < 5; i++) {
    printf("Diretor %d nome: ", i + 1);
    fgets(diretores[i].nome, sizeof(diretores[i].nome), stdin);
    diretores[i].nome[strcspn(diretores[i].nome, "\n")] = '\0';

    printf("Quantidade de filmes: ");
    scanf("%d", &diretores[i].qtd);
    getchar(); // consome o \n após o número

    diretores[i].filmes = malloc(sizeof(Filme) * diretores[i].qtd);
    for (int j = 0; j < diretores[i].qtd; j++) {
        printf("  Filme %d nome: ", j + 1);
        fgets(diretores[i].filmes[j].nome, sizeof(diretores[i].filmes[j].nome), stdin);
        diretores[i].filmes[j].nome[strcspn(diretores[i].filmes[j].nome, "\n")] = '\0';

        printf("  Ano: ");
        scanf("%d", &diretores[i].filmes[j].ano);
        printf("  Duracao (minutos): ");
        scanf("%d", &diretores[i].filmes[j].duracao);
        getchar(); // consome o \n
    }
}

char busca[21];
while (1) {
    printf("\nDigite nome do diretor (ENTER para sair): ");
    fgets(busca, sizeof(busca), stdin);
    busca[strcspn(busca, "\n")] = '\0';
    if (busca[0] == '\0')
        break;

    int achou = 0;
    for (int i = 0; i < 5; i++) {
        if (strcmp(busca, diretores[i].nome) == 0) {
            achou = 1;
            printf("Filmes de %s:\n", diretores[i].nome);
            for (int j = 0; j < diretores[i].qtd; j++) {
                printf(" - %s (%d, %d min)\n",
                       diretores[i].filmes[j].nome,
                       diretores[i].filmes[j].ano,
                       diretores[i].filmes[j].duracao);
            }
            break;
        }
    }
    if (!achou) {
        printf("Diretor nao encontrado.\n");
    }
}

for (int i = 0; i < 5; i++) {
    free(diretores[i].filmes);
}

return 0;
}

Exercícios relacionados