• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

allskin

Procurar filme por género

30 mensagens neste tópico

Boas,

Estou a desenvolver um pequeno e simples programa de gestão de filmes.

Já insere e mostra todos os filmes existentes.

No entanto, quero agora procurar um filme por genero, ou seja, o utilizador digita "accao" e aparecem os filmes de acção.

Deixo aqui o código na integra:

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
//Estrutura de dados que vai ser usada ao longo da aplicaçao
struct filme{
char genero[50];
char titulo[50];
char editora[50];
int ano;
int codigo;
};
//Declaracao de variaveis essenciais para o funcionamento da aplicaçao
int op;
filme *filmes;
int quantidade;

int i=0;


void inserir_filme(); //prototipo para a funçao de inserçao de filmes
void consultar_filme_todos(); /*prototipo para a funçao para consultar todos os filmes*/
void consultar_filme_genero(); /*prototipo para a funçao de consulta de filmes por genero*/
void consultar_filme_titulo(); /*prototipo para a funçao de consulta de filmes por titulo*/
void consultar_filme_editora(); /*prototipo para a funçao de consulta de filmes por editora*/
void consultar_filme_ano(); /*prototipo para a funçao de consulta de filmes por ano*/
void alterar_filme(); /*prototipo para a funçao de alteraçao de filmes*/
void apagar_filme(); /*prototipo para a funçao de apagar filmes*/

//Inicio da aplicacao

void main(){
cout<<'\t'<<'\t'<<'\t'<<"Bem Vindo ao DVD Database Manager \n";
cout<<'\t'<<'\t'<<'\t'<<'\t'<<"Menu Principal \n \n";
cout<<'\t'<<'\t'<<'\t'<<'\t'<<"Quantos filmes deseja inserir?";
cin>>quantidade;
filmes = new filme [quantidade]; //aloca memoria dinamica

do { //Executar o menu ate o utilizador digitar 9 (sair da aplicaçao)
cout<<"Insira o numero correspondente a opçao desejada: \n \n";
cout<<"1-Inserir novo filme \n";
cout<<"2-Consultar todos os filmes \n";
cout<<"3-Consultar filme (genero) \n";
cout<<"4-Consultar filme (titulo) \n";
cout<<"5-Consultar filme (editora) \n";
cout<<"6-Consultar filme (ano) \n";
cout<<"7-Alterar filme \n";
cout<<"8-Apagar filme \n";
cout<<"9-Sair \n";
cin>>op;
      
	switch (op){
	case 1: inserir_filme(); break;
	case 2: consultar_filme_todos(); break;
	case 3: consultar_filme_genero(); break;
	case 4: consultar_filme_titulo(); break;
	case 5: consultar_filme_editora(); break;
	case 6: consultar_filme_ano(); break;
	case 7: alterar_filme(); break;
	case 8: apagar_filme(); break;
	case 9: break;
	default: cout<<"Opçao nao valida, insira novamente o numereo pretendido"; // resposta por defeito se o numero do menu inserido nao for valido

				}

	} while (op !=9);
}
void inserir_filme(){

cout<<"Insira o genero do filme \n";
cin>>filmes[i].genero;
cout<<"Insira o titulo do filme \n";
cin>>filmes[i].titulo;
cout<<"Insira a editora do filme \n";
cin>>filmes[i].editora;
cout<<"Insira o ano do filme \n";
cin>>filmes[i].ano;
cout<<"Insira o codigo do filme \n";
cin>>filmes[i].codigo;
cout<<"Dados inseridos \n";
cout<<"Verifique se os dados foram inseridos correctamente: \n";

cout<<'\n'<<"Genero: "<<filmes[i].genero;
cout<<'\n'<<"Titulo: "<<filmes[i].titulo;
cout<<'\n'<<"Editora: "<<filmes[i].editora;
cout<<'\n'<<"Ano: "<<filmes[i].ano<<
cout<<'\n'<<"Codigo do Filme: "<<filmes[i].codigo<<'\n';
i++;

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}


void consultar_filme_todos(){

int j;

for (j=0; j<i; j++){
cout<<'\n'<<"Genero: "<<filmes[j].genero;
cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
cout<<'\n'<<"Editora: "<<filmes[j].editora;
cout<<'\n'<<"Ano: "<<filmes[j].ano;
cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo<<'\n';
}

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}
void consultar_filme_genero(){

char genero;

cout<<"Introduza o genero a pesquisar:"<<'\n';
cin>>genero;

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}
void consultar_filme_titulo(){
}
void consultar_filme_editora(){
}
void consultar_filme_ano(){
}
void alterar_filme(){
}
void apagar_filme(){
}

A minha dúvida é para a função "consultar_filme_genero", será que alguém me pode dar uma ajuda?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa mas não percebi ao certo qual é a tua dúvida.. Podias explicar melhor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, claro.

É o seguinte, ao carregar em 3 no MENU, vai parar à função consultar_filmes_genero.

Ou seja, vai dizer ao utilizador "Digite o genero do filme", o utilizador mete por exemplo terror e vai dar os filmes que há de terror previamente inseridos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahh ok é que no fim dizes que a dúvida é para a função consultar_filme_código.

Já agora onde tens a função consultar_filmes_género?

Bem de qualquer modo para fazeres uma pesquisa por género é simples. Só precisas de usar o código que tens em cima na pesquisa_todos. Mas com uma condição só imprime quando os géneros forem iguais.

Pedes que o utilizador escreva o género para uma variável, por exemplo Temp_genero e depois:

for (j=0; j<i; j++)
{
    if( strcmp(filmes[j].genero, Temp_genero) == 0 )
    {
        cout<<'\n'<<"Genero: "<<filmes[j].genero;
        cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
        cout<<'\n'<<"Editora: "<<filmes[j].editora;
        cout<<'\n'<<"Ano: "<<filmes[j].ano;
        cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo<<'\n';
    }
}

Já agora podes querer passar ambas as strings para Maúscula ou Minúscula no acto de inserção porque o strcmp() destingue maiúsculas de minúsculas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma (pequeníssima) correcção ao código acima: no for, substitui "j<i" por "j<quantidade".

Já agora podes querer passar ambas as strings para Maúscula ou Minúscula no acto de inserção porque o strcmp() destingue maiúsculas de minúsculas.

Podes usar a função _stricmp() que ignora as diferenças de capitalização. Não tenho a certeza que seja standard, mas no MSDN diz que é especificada pela ISO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto, foi erro meu, já corrigi lá em cima, primeiro queria por código mas desisti, quero por género e esqueci-me de alterar.

Muito obrigado, vou experimentar então :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não podes substituir o i por quantidade. Porque quantidade é o total de filmes que podes ter. O i é o número de filmes que realmente tens. Além de ser desnecessário procura onde não há filmes, deves ter lá lixo que pode causar erros.

Troca o nome ao i, por tipo total_filmes ou assim fica mais compreensivel..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O erro é que declaras-te género como 1 caracter e género tem que ser um array de caracteres. Algo do tipo

char genero[10];

no if tens que fazer a verificacao se o strcmp() e igual a 0. Senão ele não te entra no if, aliás entra quando não forem  iguais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas ele está definido na struct como char genero[50].

Quanto ao 0, nunca usei isso nas aulas e sempre funcionou  :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estranho fiz ainda agora um teste e não funcionava tinha que ter o == mas isso depois testas e se resulta ainda bem lol

o genero da struct é o que tu chamas em filmes[j].genero. Mas quando so escreves genero é outra variável a que te referes. Nesse caso é a char género que está declarada antes dos j.

Tens que declarar char genero[50];

Ao bocado disse 10 como exemplo, se puseres 50 assim fica mais correcto pois ambos tem o mesmo tamanho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que não podes substituir o i por quantidade. Porque quantidade é o total de filmes que podes ter. O i é o número de filmes que realmente tens. Além de ser desnecessário procura onde não há filmes, deves ter lá lixo que pode causar erros.

Troca o nome ao i, por tipo total_filmes ou assim fica mais compreensivel..

Tens razão, nem tinha visto o i... :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Já adiantei mais um bom bocado, mas tenho uma dúvida quanto à modificação dos dados de um filme.

Ou seja, imaginemos que tenho o filme "blabla" com o código 1.

Peço ao utilizador o código de filme que ele quer alterar, e depois posso alterar os dados, só que não sei fazer isso numa struct.

Segue então o código já bem mais adiantado. O problema está na penúltima função alterar_filme()

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
//Estrutura de dados que vai ser usada ao longo da aplicaçao
struct filme{
int codigo;
char genero[50];
char titulo[50];
char editora[50];
int ano;
};
//Declaracao de variaveis essenciais para o funcionamento da aplicaçao
int op;
filme *filmes;
int quantidade;

int i=0;


void inserir_filme(); 				//prototipo para a funçao de inserçao de filmes
void consultar_filme_todos(); 	/*prototipo para a funçao para consultar todos os filmes*/
void consultar_filme_genero(); 	/*prototipo para a funçao de consulta de filmes por genero*/
void consultar_filme_titulo(); 	/*prototipo para a funçao de consulta de filmes por titulo*/
void consultar_filme_editora(); 	/*prototipo para a funçao de consulta de filmes por editora*/
void consultar_filme_ano(); 		/*prototipo para a funçao de consulta de filmes por ano*/
void alterar_filme(); 				/*prototipo para a funçao de alteraçao de filmes*/
void apagar_filme(); 				/*prototipo para a funçao de apagar filmes*/

//Inicio da aplicacao

void main(){
cout<<'\t'<<'\t'<<'\t'<<"Bem Vindo ao DVD Database Manager \n";
cout<<'\t'<<'\t'<<'\t'<<'\t'<<"Menu Principal \n \n";
cout<<'\t'<<'\t'<<'\t'<<"Quantos filmes deseja inserir?";
cin>>quantidade;
filmes = new filme [quantidade]; //aloca memoria dinamica

do { //Executar o menu ate o utilizador digitar 9 (sair da aplicaçao)
	cout<<"Insira o numero correspondente a opçao desejada: \n \n";
	cout<<"1-Inserir novo filme \n";
	cout<<"2-Consultar todos os filmes \n";
	cout<<"3-Consultar filme (genero) \n";
	cout<<"4-Consultar filme (titulo) \n";
	cout<<"5-Consultar filme (editora) \n";
	cout<<"6-Consultar filme (ano) \n";
	cout<<"7-Alterar filme \n";
	cout<<"8-Apagar filme \n";
	cout<<"9-Sair \n";
	cin>>op;

	switch (op){
		case 1: inserir_filme(); break;
		case 2: consultar_filme_todos(); break;
		case 3: consultar_filme_genero(); break;
		case 4: consultar_filme_titulo(); break;
		case 5: consultar_filme_editora(); break;
		case 6: consultar_filme_ano(); break;
		case 7: alterar_filme(); break;
		case 8: apagar_filme(); break;
		case 9: break;
		default: cout<<"Opçao nao valida, insira novamente o numereo pretendido"; // resposta por defeito se o numero do menu inserido nao for valido
  }
} while (op !=9);
}
void inserir_filme(){

cout<<"Insira o codigo do filme \n";
cin>>filmes[i].codigo;
cout<<"Insira o genero do filme \n";
gets(filmes[i].genero);
cout<<"Insira o titulo do filme \n";
gets(filmes[i].titulo);
cout<<"Insira a editora do filme \n";
gets(filmes[i].editora);
cout<<"Insira o ano do filme \n";
cin>>filmes[i].ano;
cout<<"Dados inseridos \n";
cout<<"Verifique se os dados foram inseridos correctamente: \n";

cout<<'\n'<<"Codigo do Filme: "<<filmes[i].codigo;
cout<<'\n'<<"Genero: "<<filmes[i].genero;
cout<<'\n'<<"Titulo: "<<filmes[i].titulo;
cout<<'\n'<<"Editora: "<<filmes[i].editora;
cout<<'\n'<<"Ano: "<<filmes[i].ano<<'\n';
i++;

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}


void consultar_filme_todos(){

int j;

for (j=0; j<i; j++){
cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
cout<<'\n'<<"Genero: "<<filmes[j].genero;
cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
cout<<'\n'<<"Editora: "<<filmes[j].editora;
cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
}

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}
void consultar_filme_genero(){

char genero[50];
int j;

cout<<"Introduza o genero a pesquisar:"<<'\n';
gets(genero); //Variavel auxiliar

for (j=0; j<i; j++)
{
 if( !strcmp(filmes[j].genero, genero) ) {
	  cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
	  cout<<'\n'<<"Genero: "<<filmes[j].genero;
	  cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
	  cout<<'\n'<<"Editora: "<<filmes[j].editora;
	  cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
 }
}

cout<<'\t'<<'\t'<<'\t'<<"---...-- A voltar ao menu principal ---...--- \n";

}
void consultar_filme_titulo(){

char titulo[50];
int j;

cout<<"Introduza o titulo a pesquisar:"<<'\n';
gets(titulo); //Variavel auxiliar

for (j=0; j<i; j++)
{
 if( !strcmp(filmes[j].titulo, titulo) ) {
	  cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
	  cout<<'\n'<<"Genero: "<<filmes[j].genero;
	  cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
	  cout<<'\n'<<"Editora: "<<filmes[j].editora;
	  cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
 }
}

}
void consultar_filme_editora(){

char editora[50];
int j;

cout<<"Introduza a editora a pesquisar:"<<'\n';
gets(editora); //Variavel auxiliar

for (j=0; j<i; j++)
{
 if( !strcmp(filmes[j].editora, editora) ) {
	  cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
	  cout<<'\n'<<"Genero: "<<filmes[j].genero;
	  cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
	  cout<<'\n'<<"Editora: "<<filmes[j].editora;
	  cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
 }
}

}
void consultar_filme_ano(){

int j;
int ano;

cout<<"Introduza o ano a pesquisar:"<<'\n';
cin>>ano; //Variavel auxiliar

	for (j=0; j<i; j++)
	 if ( ano == filmes[j].ano) {
	  cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
	  cout<<'\n'<<"Genero: "<<filmes[j].genero;
	  cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
	  cout<<'\n'<<"Editora: "<<filmes[j].editora;
	  cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
	  }

}
void alterar_filme(){

int codigo;
int j;
cout<<"Consulte pela lista abaixo o codigo do filme que deseja modificar: "<<'\n';
for (j=0; j<i; j++){
	  cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
	  cout<<'\n'<<"Genero: "<<filmes[j].genero;
	  cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
	  cout<<'\n'<<"Editora: "<<filmes[j].editora;
	  cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
}

cout<<"Insira o codigo do filme que deseja modificar: ";
cin>>codigo;

}
void apagar_filme(){
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse caso se calhar devia ser melhor dares a opção ao utilizador de escolher se quer ou não ver a lista de filmes.

De qualquer modo tudo o que tens a fazer é depois de pedir o código percorreres o vector de filmes sempre á procura do do código inserido. usas tipo um while

while(codigo != filmes[j].codigo && j<i)
{
    j++;
}

Assim quando o ciclo acabar só tens que verficar se j é menor que i. Se for é porque o filme com esse código foi encontrado.

Depois podes perguntar que tipo de dados é que ele quer alterar e teres um switch que faz a escolha dele, ou então pedes os dados todos e só tens que fazer com que ele escreva para a posicao do filme no vector.. tipo

cin>>filmes[j].codigo;
cin>>filmes[j].ano;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estranho que ele não está a alterar.

Estou a fazer:

cout<<"Introduza o novo genero do filme: "<<'\n';
gets(filmes[j].genero);
cout<<"Introduza o novo titulo do filme: "<<'\n';
gets(filmes[j].titulo);
cout<<"Introduza a nova editora do filme: "<<'\n';
gets(filmes[j].editora);
cout<<"Introduza o novo ano do filme: "<<'\n';
cin>>filmes[j].ano;

E não está a alterar, mas não dá erro  :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes por essa parte do código? é que não tou a ver porque seja  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, claro.

void alterar_filme(){

char novo_genero[50];
char novo_titulo[50];
char nova_editora[50];
int novo_ano;
int codigo;
int j;
cout<<"Consulte pela lista abaixo o codigo do filme que deseja modificar: "<<'\n';

for (j=0; j<i; j++){
cout<<'\n'<<"Codigo do Filme: "<<filmes[j].codigo;
cout<<'\n'<<"Genero: "<<filmes[j].genero;
cout<<'\n'<<"Titulo: "<<filmes[j].titulo;
cout<<'\n'<<"Editora: "<<filmes[j].editora;
cout<<'\n'<<"Ano: "<<filmes[j].ano<<'\n';
}

cout<<"Insira o codigo do filme que deseja modificar: ";
cin>>codigo;

while(codigo != filmes[j].codigo && j<i)
{
 j++;
}

cout<<"Introduza o novo genero do filme: "<<'\n';
gets(filmes[j].genero);
cout<<"Introduza o novo titulo do filme: "<<'\n';
gets(filmes[j].titulo);
cout<<"Introduza a nova editora do filme: "<<'\n';
gets(filmes[j].editora);
cout<<"Introduza o novo ano do filme: "<<'\n';
cin>>filmes[j].ano;


}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

olha antes do while tens que incializar o j a 0. Senão começas logo com o j igual a i ou seja nem entra no ciclo.

e tens que por a parte de inserção dos dados dentro de um if a verificar se o código foi encontrado ou não. Tipo

if( j < i )
{
   //codigo
}

porque se o j for igual a i quer dizer que percorres-t o vector até ao fim e não encontras-te esse código. No while tu percorres  enquanto não encontrares o código e enquanto j < i. logo se ele não encontrar o código vai chegar  um ponto em que j não é menor que i. j sai com o valor de i nesse caso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o que tu disseste, ele nem sequer pede para alterar.

Aqui está:

c_.jpg

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tens o if com > ou < é que eu enganei-me e depois editei.. ms se foste mais rápido do que eu podes ter mal.. o k era suposto ter a seguir ao teu "Aqui está:"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora