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>
#include <stdlib.h>
#include <string.h>
typedef struct {
char nome[50];
int ano;
int duracao;
} Filme;
char nome[50];
int ano;
int duracao;
} Filme;
typedef struct {
char nome[21];
int qtd;
Filme *filmes;
} Diretor;
char nome[21];
int qtd;
Filme *filmes;
} Diretor;
int main() {
Diretor diretores[5];
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;
}