Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

JoaoNascimento

Programa de clube de video para iniciantes

Mensagens Recomendadas

JoaoNascimento

O seguinte programa gera um clube de video, ou algo parecido, permite ao utilizador que ele faça pesquisas sobre os dados em memoria...

O programa pode ser melhorado isto é apenas o básico para os que tem menos experiencia possam ver...

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void pesquisa_nome(char nome[100][50],char categoria[100][50],float preco[100],int ano[100],char editora[100][50],char realizador[100][50],int N)
{
char nome_ref[50];
int i;

fflush(stdin);
printf("Insira o nome do filme que quer procurar: "); gets(nome_ref);

for (i=0;i<N;i++)
{
	if (!strcmp(nome[i],nome_ref))
	{
		printf("-------------------------------------------------------------------------------\n");
		printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
		printf("-------------------------------------------------------------------------------\n\n");
	}
	else
		puts("O ficheiro que pretende visulizar não se encontra no registo: ");
}
system("pause");
}

void pesquisa_categoria(char nome[100][50],char categoria[100][50],float preco[100],int ano[100],char editora[100][50],char realizador[100][50],int N)
{
char categoria_ref[50];
int i;

fflush(stdin);
puts("Insira a categoria do filme que quer procurar: "); gets(categoria_ref);

for (i=0;i<N;i++)
{
	if (!strcmp(categoria[i],categoria_ref))
	{
		printf("-------------------------------------------------------------------------------\n");
		printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
		printf("-------------------------------------------------------------------------------\n\n");
	}
	else
		puts("O ficheiro que pretende visulizar não se encontra no registo: ");
}
system("pause");
}

void pesquisa_ano(char nome[100][50],char categoria[100][50],float preco[100],int ano[100],char editora[100][50],char realizador[100][50],int N)
{
int ano_ref[100];
int i;

fflush(stdin);
puts("Insira o ano do filme que quer procurar: "); scanf("%d",&ano_ref);

for (i=0;i<N;i++)
{
	if (ano_ref==ano[i])
	{
		printf("-------------------------------------------------------------------------------\n");
		printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
		printf("-------------------------------------------------------------------------------\n\n");
	}
	else
		puts("O ficheiro que pretende visulizar não se encontra no registo: ");
}
system("pause");
}

void pesquisa_editora(char nome[100][50],char categoria[100][50],float preco[100],int ano[100],char editora[100][50],char realizador[100][50],int N)
{
char editora_ref[50];
int i;

fflush(stdin);
puts("Insira o nome do filme que quer procurar: "); gets(editora_ref);

for (i=0;i<N;i++)
{
	if (!strcmp(editora[i],editora_ref))
	{
		printf("-------------------------------------------------------------------------------\n");
		printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
		printf("-------------------------------------------------------------------------------\n\n");
	}
	else
		puts("O ficheiro que pretende visulizar não se encontra no registo: ");
}
system("pause");
}

void pesquisa_realizador(char nome[100][50],char categoria[100][50],float preco[100],int ano[100],char editora[100][50],char realizador[100][50],int N)
{
char realizador_ref[50];
int i;

fflush(stdin);
puts("Insira o nome do filme que quer procurar: "); gets(realizador_ref);

for (i=0;i<N;i++)
{
	if (!strcmp(realizador[i],realizador_ref))
	{
		printf("-------------------------------------------------------------------------------\n");
		printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
		printf("-------------------------------------------------------------------------------\n\n");
	}
	puts("O ficheiro que pretende visulizar não se encontra no registo: ");
}
system("pause");
}

int main()
{
int op=0,i,N,op2=0;
int ano[100];
char nome[100][50], categoria[100][50], editora[100][50], realizador[100][50];
float preco[100];

while (op!=3)
{
	system("cls");
	printf("\t\t\tSistema de Apoio a Clube de Video\n");
	printf("\t\t\t\t\t\t\t\t\t\t\t\t\t");
	printf("----------------------------------");
	printf("\n\t\t\t|1 Inserir dados de filmes       |\n");
	printf("\n\t\t\t|2 Pesquisas                     |\n");
	printf("\n\t\t\t|3 Sair                          |\n");
	printf("\t\t\t\t\t\t\t\t\t\t\t\t\t");
	printf("----------------------------------");
	puts("\nInsira a opçao pretendida: ");
	scanf("%d",&op);

	system("cls");
	switch (op)
	{
	case 1:
		{
			puts("Quantos filmes quer introduzir: ");	scanf("%d",&N);
			system("cls");
			for(i=0;i<N;i++)
			{
				fflush(stdin);
				puts("Insira o nome do filme: ");
				gets(nome[i]);

				fflush(stdin);
				puts("Insira a categoria do filme: ");
				gets(categoria[i]);

				fflush(stdin);
				puts("Insira o preço do filme: ");
				scanf("%f",&preco[i]);

				fflush(stdin);
				puts("Insira o ano do filme: ");
				scanf("%d",&ano[i]);

				fflush(stdin);
				puts("Insira a editora do filme: ");
				gets(editora[i]);

				fflush(stdin);
				puts("Insira o nome do realizador: ");
				gets(realizador[i]);
				system("cls");

				printf("Ja introduziu %d de %d\n",i+1,N);

			}
			system("cls");

			for(i=0; i<N; i++)
			{
				printf("-------------------------------------------------------------------------------\n");
				printf("Nome filme:%s\nCategoria:%s\nPreço:%.2f\nAno:%d\nEditora:%s\nRealizador:%s\n",nome[i],categoria[i],preco[i],ano[i],editora[i],realizador[i]);
				printf("-------------------------------------------------------------------------------\n\n");
			}
			fflush(stdin);
			system("pause");
			break;
		}

	case 2: 
		{
			system("cls");
			printf("\t\tSistema de Apoio a Clube de Video - Pesquisas\n");
			printf("\t\t\t\t\t\t\t\t\t\t\t\t\t");
			printf("----------------------------");
			printf("\n\t\t\t|1 Nome filme              |\n");
			printf("\n\t\t\t|2 Categoria               |\n");
			printf("\n\t\t\t|3 Ano Edição              |\n");
			printf("\n\t\t\t|4 Editora                 |\n");
			printf("\n\t\t\t|5 Realizador              |\n");
			printf("\n\t\t\t|6 Sair                    |\n");
			printf("\t\t\t\t\t\t\t\t\t\t\t\t\t");
			printf("----------------------------");
			fflush(stdin);
			puts("\nInsira a opçao pretendida: ");
			scanf("%d",&op2);


			switch (op2)
			{
			case 1:
				{
					system("cls");
					pesquisa_nome(nome,categoria,preco,ano,editora,realizador,N);
					break;
				}
			case 2:
				{
					system("cls");
					pesquisa_categoria(nome,categoria,preco,ano,editora,realizador,N);
					break;
				}
			case 3:
				{
					system("cls");
					pesquisa_ano(nome,categoria,preco,ano,editora,realizador,N);
					break;
				}
			case 4:
				{
					system("cls");
					pesquisa_editora(nome,categoria,preco,ano,editora,realizador,N);
					break;
				}
			case 5:
				{
					system("cls");
					pesquisa_realizador(nome,categoria,preco,ano,editora,realizador,N);
					break;
				}

			}


		}
	}

}

}

Atenção:O seguinte codigo não está coemantado, quer necessitar dele comentado que avise.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JoaoNascimento

Mas ao não utilizares o gets o scanf não te vai ler por exemplo se inserires "ola mundo", chega ao espaço e para...

Com o gets podes sempre colocar um espaço por exemplo 500,  no meu caso nao a nenhum nome de filme com 50 caracteres acho eu...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

no entanto fgets eh dirigido a ficheiros, não vai ler ah consola...

já agora, se poderes, posta um exemplo igual a este

#include 

int main(void) {
char s_1[8], s_2[8], s_3[8];
gets(s_1);
gets(s_2);
gets(s_3);
printf("%s\n%s\n%s\n", s_1, s_2, s_3);
return 0;
}

em que uses outra função mas segura

(neste caso substituir gets -> fgets)


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpedro20

#include<stdio.h>
#include<string.h>

int main(void) {
char s_1[9], s_2[9], s_3[9];

fgets(s_1,8,stdin);
fgets(s_2,8,stdin);
fgets(s_3,8,stdin);

s_1[strlen(s_1)-1]='\0';
s_2[strlen(s_2)-1]='\0';
s_3[strlen(s_3)-1]='\0';

printf("%s\n%s\n%s\n", s_1, s_2, s_3);
return 0;
}

com o fgets o último caracter é '\n' portanto tens de substituir por '\0'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Ah a minha unica duvida era que ficheiro utilizar, mas o stdin faz todo o sentido :D

Seja como for devias ter postado logo... Dar um exemplo de como esta errado E de como esta correcto eh sempre bom para as pessoas entenderem melhor e corrigirem os habitos

Já agora, les 8+1 (9) caracteres no fgets?

Rasão especial? Eu tb já trabalhei com isto mas agora estou um bocadinho esquecido

fgets(s_1,9,stdin);

Supostamente ele iria ler 7 caracteres mais o \0

Se ultrapassar, em vez de ter \n ou \0 teria o 8º caracter, não?

(depois arranja-se o ultimo caracter, como tu fizeste)


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

Fica aí então joão!

No fundo, o gets faz o mesmo que o fgets, mas no gets vai logo buscar ao stdin, enquanto no fgets podes especificar o ficheiro

ADICIONALMENTE o fgets controla o numero de caracteres que lês, portanto evita o stack overflow...

ou seja, o gets eh um fgets ao stdin...

Ja agora... isto não devia ser postado nalgum sitio para dicas para melhor programação ou assim? Bem que eh algo importante!


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Fica aí então joão!

No fundo, o gets faz o mesmo que o fgets, mas no gets vai logo buscar ao stdin, enquanto no fgets podes especificar o ficheiro

ADICIONALMENTE o fgets controla o numero de caracteres que lês, portanto evita o stack overflow...

ou seja, o gets eh um fgets ao stdin...

Ja agora... isto não devia ser postado nalgum sitio para dicas para melhor programação ou assim? Bem que eh algo importante!

Primeiro, o que querias dizer era buffer overflow, stack overflow acontece quando a *stack* fica preenchida, buffer overflow ocorre quando o *buffer* fica preenchido. Não confundas as coisas.

Depois não percebi a afirmação de que a função gets é a função fgets ao stdin.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

obrigado pela correcção

eu gosto de inventar, eh mais divertido xDDDDD

jk... mas tds aprendemos um bocado, penso que tava distraido a escrever isso


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pinguim

sempre tive a noção que o stdin é , no fundo, o buffer do input

fazer um fgets ao stdin seria o mesmo que fazer exactamente o mesmo que gets

apesar de o fgets tambem ler o \n, mas isso é apenas um promenor a ser considerado

como tambem disse, o fgets serve para ler uma string de um ficheiro, o gets eh para ler da consola...

no entanto, podemos usar o fgets para ler da consola tambem, indo buscar ao stdin

Penso eu... estou errado?


"Rather than continuing to seek the truth, simply let go of your views" - David RossC, C++, C#, Pascal

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
R35

Boas a todos.

Sou iniciante na matéria c. :wallbash:

E precisava do programa clube de video comentado para tentar perceber melhor.

Se puderem arranjar agradeço bastante. :)

Cumpz

--

R35

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Se és iniciante aconselho-te a comprares um livro ou uma boa referência online. Quando encontrares um destes dois vais ver que lá tens muitos exemplos comentados e bem explicados.


here since 2009

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.