Ir ao conteúdo
  • Cadastre-se

C Criar agenda simples em C


japrendiz

Posts recomendados

Estou começando a aprender logica e programação e não estou conseguindo criar uma lista de no maximo 5 clientes. Criei um menu usando o switch case.
A opção 0 funciona encerrando o programa, a opção 1 também aparentemente funciona. (pelo menos eu consigo inserir os dados, mas não sei se ta salvando corretamente)
O problema é a opção 2 que é para imprimir os clientes cadastrados incluindo o código gerado. Não ta imprimindo os clientes!! e o código continua aumentando a partir do 5. Quero que imprima o codigo e não que continue gerando. Imagino que seja algum erro básico, mas não to achando.
Segue o meu código e a tela de execução da opção 2 após cadastrar 2 clientes

 

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

struct agenda {
char nome [40], telefone [20], email [30];

};

int main ()
{
setlocale(LC_ALL, "Portuguese");
struct agenda dados [5];
int i, op, cont;

do {

printf ("\nDigite 1 para cadastrar novo cliente; \nDigite 2 para visualizar clientes; \nDigite 0 para encerrar:\n");
scanf ("%d", &op);
fflush (stdin);

switch (op)
{

case 0:
system ("cls");
printf ("Aplicação encerrada!\n");
break;

case 1:

if (cont<=5){
system ("cls");
printf ("Código: %d\n", cont);
printf ("Digite o nome:");
fgets (dados[cont].nome, 40, stdin);
fflush (stdin);
printf ("Digite o telefone:");
fgets (dados[cont].telefone, 20, stdin);
fflush (stdin);
printf ("Digite o e-mail:");
fgets (dados[cont].email, 30, stdin);
fflush (stdin);
printf("\n");
cont++;
}
else
printf ("*****AGENDA LOTADA!*****\n");

break;

case 2:

system ("cls");
if (cont==1) {
{printf ("*****AGENDA VAZIA!*****\n");}
fflush (stdin);
}
else {


for (i=1; i<=5; i++);

printf ("Código: %d\n", i);
printf ("\nNome: %s", dados.nome);
printf ("\nTelefone: %s", dados.telefone);
printf ("\nE-mail: %s", dados.email);
printf ("\n______________________________________");
printf ("\n");
}
break;

default:
printf ("Erro: opção inválida!");
}
}

while (op!=0);
return(0);
}


================================
EXECUÇÃO DA OPÇÃO 2: só mostra o ultimo cadastrado e não imprime os dados
==============================
Código: 6

Nome:
Telefone:
E-mail:
______________________________________

Digite 1 para cadastrar novo cliente;
Digite 2 para visualizar clientes;
Digite 0 para encerrar:

Link para o comentário
Compartilhar em outros sites

case 2:

system ("cls");
if (cont==1) {
{printf ("*****AGENDA VAZIA!*****\n");}
fflush (stdin);
}
else {


for (i=1; i<=5; i++);

printf ("Código: %d\n", i);
printf ("\nNome: %s", dados.nome);
printf ("\nTelefone: %s", dados.telefone);
printf ("\nE-mail: %s", dados.email);
printf ("\n______________________________________");
printf ("\n");
}
break;

Se usou os índices para ler porque não usou para mostrar? dados.nome nem existe.

 

Os índices começam de zero. Se não vai usar o zero aumente um na conta e declare 6

 

você usou cont == 1  na condição. Porque? Está claro que pretendia usar < 1...

Link para o comentário
Compartilhar em outros sites

22 horas atrás, arfneto disse:

case 2:

system ("cls");
if (cont==1) {
{printf ("*****AGENDA VAZIA!*****\n");}
fflush (stdin);
}
else {


for (i=1; i<=5; i++);

printf ("Código: %d\n", i);
printf ("\nNome: %s", dados.nome);
printf ("\nTelefone: %s", dados.telefone);
printf ("\nE-mail: %s", dados.email);
printf ("\n______________________________________");
printf ("\n");
}
break;

Se usou os índices para ler porque não usou para mostrar? dados.nome nem existe.

 

Citação

 

Se usou os índices para ler porque não usou para mostrar? dados.nome nem existe.

Vdd. Acho que quando refiz o código esqueci de corrigir isso. Obrigada!

 

Os índices começam de zero. Se não vai usar o zero aumente um na conta e declare 6

mudei tudo para cont e atribui valor     cont =0; na função main, ao invés de usar outra variável. Mas mesmo assim não deu. A mensagem agenda vazia está funcionando bem. Os códigos e a impressão dos clientes cadastrados que não.

 

você usou cont == 1  na condição. Porque? Está claro que pretendia usar < 1...

Corrigi isso e iniciei a variavel cont com 0, Deu certo a mensagem "agenda vazia" (apesar que estava dando certo antes rsrrs)

Gostaria de criar o codigo na opcao 1 e só imprimir na opção 2. Desse jeito que estou fazendo está gerando o código na opção 2 também, não é? será que tenho que usar um vetor ou função rand pra criar codigos aleatórios. Não sei como fazer, mas seria uma melhor opção?

 

Link para o comentário
Compartilhar em outros sites

Olá

 

Sabe usar funções? São apenas blocos de código com nomes e parâmetros mas facilitam muito as coisas.

 

Você tem um livro? Seu curso adota um? Recomendo muito ter um livro.

 

Evite ao máximo usar menus antes de seu programa estar pronto. Só vai atrasar tudo: é muito chato de testar e demora demais. Crie constantes de teste e programe as funções todas antes de colocar um menu e ficar em frente ao terminal inventando campos à toa.

 

Veja esse resultado

#0: Nome: 'nome1' Tel: 'tel1' e-mail 'email1'
#1: Nome: 'nome2' Tel: 'tel2' e-mail 'email2'
#2: Nome: 'nome3' Tel: 'tel3' e-mail 'email3'
#3: Nome: 'nome4' Tel: 'tel4' e-mail 'email4'

4 entradas na agenda

Para esse programa

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

typedef struct
{
	char	nome[40];
	char	telefone[20];
	char	email[30];

}	Agenda;

int main()
{
	setlocale(LC_ALL, "Portuguese");

	Agenda agenda[5] = {
		{ "nome1", "tel1", "email1" },
		{ "nome2", "tel2", "email2" },
		{ "nome3", "tel3", "email3" },
		{ "nome4", "tel4", "email4" }
	};
	int cont = 4;

	for (int i = 0; i < cont; i = i + 1)
	{
		printf("#%d: Nome: '%s' Tel: '%s' e-mail '%s'\n",
			i,
			agenda[i].nome,
			agenda[i].telefone,
			agenda[i].email
		);
	};	// for()
	printf("\n%d entradas na agenda\n\n", cont);
	return 0;
};

Comece com algo assim. Já tem 4 itens na agenda, já mostra algo. Cabe mais um pra testar a inserção. Não precisa ler nada para inserir, basta escrever

	agenda[cont] = agenda[0];
	cont = cont + 1;

por exemplo e copia o primeiro item para a posição 4, no fim. Não faz diferença. Mas agora não cabe mais. 


De volta ao programa, control-c control-v e lista de novo com 5:

#0: Nome: 'nome1' Tel: 'tel1' e-mail 'email1'
#1: Nome: 'nome2' Tel: 'tel2' e-mail 'email2'
#2: Nome: 'nome3' Tel: 'tel3' e-mail 'email3'
#3: Nome: 'nome4' Tel: 'tel4' e-mail 'email4'

4 entradas na agenda

#0: Nome: 'nome1' Tel: 'tel1' e-mail 'email1'
#1: Nome: 'nome2' Tel: 'tel2' e-mail 'email2'
#2: Nome: 'nome3' Tel: 'tel3' e-mail 'email3'
#3: Nome: 'nome4' Tel: 'tel4' e-mail 'email4'
#4: Nome: 'nome1' Tel: 'tel1' e-mail 'email1'

5 entradas na agenda

E o programa claro, só tem o trecho copiado de diferente

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

typedef struct
{
	char	nome[40];
	char	telefone[20];
	char	email[30];

}	Agenda;

int main()
{
	setlocale(LC_ALL, "Portuguese");

	Agenda agenda[5] = {
		{ "nome1", "tel1", "email1" },
		{ "nome2", "tel2", "email2" },
		{ "nome3", "tel3", "email3" },
		{ "nome4", "tel4", "email4" }
	};
	int cont = 4;

	for (int i = 0; i < cont; i = i + 1)
	{
		printf("#%d: Nome: '%s' Tel: '%s' e-mail '%s'\n",
			i,
			agenda[i].nome,
			agenda[i].telefone,
			agenda[i].email
		);
	};	// for()
	printf("\n%d entradas na agenda\n\n", cont);

	agenda[cont] = agenda[0];
	cont = cont + 1;


	for (int i = 0; i < cont; i = i + 1)
	{
		printf("#%d: Nome: '%s' Tel: '%s' e-mail '%s'\n",
			i,
			agenda[i].nome,
			agenda[i].telefone,
			agenda[i].email
		);
	};	// for()
	printf("\n%d entradas na agenda\n\n", cont);

	return 0;
};

No entanto as coisas andam mais depressa. SEM LER DO TECLADO.

 

Agora eu usei duas vezes o mesmo código e provavelmente vou usar muitas vezes, isso de listar o que tem na agenda.

Uma exemplo de função então seria conveniente.

 

O resultado é claro o mesmo mas veja o programa

#include<stdio.h>
#include<locale.h>

typedef struct
{
	char	nome[40];
	char	telefone[20];
	char	email[30];

}	Agenda;

int		lista_agenda(Agenda[],int); // agenda, total de itens

int main()
{
	setlocale(LC_ALL, "Portuguese");

	Agenda agenda[5] = {
		{ "nome1", "tel1", "email1" },
		{ "nome2", "tel2", "email2" },
		{ "nome3", "tel3", "email3" },
		{ "nome4", "tel4", "email4" }
	};
	int cont = 4;
	lista_agenda(agenda, cont);

	agenda[cont] = agenda[0];
	cont = cont + 1;
	lista_agenda(agenda, cont);

	return 0;
};

int		lista_agenda(Agenda A[], int N)
{
	for (int i = 0; i < N; i = i + 1)
	{
		printf("#%d: Nome: '%s' Tel: '%s' e-mail '%s'\n",
			i,
			A[i].nome,
			A[i].telefone,
			A[i].email
		);
	};	// for()
	printf("\n%d entradas na agenda\n\n", N);
	return 0;
}

Mais simples, porque pode só escrever lista_agenda() e chamar de qualquer lugar do programa.

 

É só um exemplo que copiei de seu programa pra mostrar uma maneira de escrever. Nem é a melhor maneira. Mas serve para ilustrar uns pontos.

 

sobre typedef

 

typedef cria um tipo, um alias. Então declarar 

typedef struct
{
	char	nome[40];
	char	telefone[20];
	char	email[30];

}	Agenda;

cria um tipo Agenda e você pode declarar coisas desse tipo. Uma das vantagens é que você não precisa ficar repetindo struct em toda declaração.

 

Poste seu programa como está agora.

Link para o comentário
Compartilhar em outros sites

@arfnetoagradeço muito a atenção que tem dado às minhas dúvidas.

Estou tentando fazer um exercicio que pede para que o usuario tenha uma opção de inserir os dados na agenda e com outra opção mostrar esses dados.(Inclui uma descrição do que quero que faça na opção 1 e na opção 2 no codigo) Precisa que o sistema gere um codigo unico para cada contato e imprima o código quando mostrar os dados. Estou usando um livro com base no livro do Campos Ascencio. Todos os exercícios parecidos no livro tem essa lógica de digitar, ler e imprimir usando o fflush pra limpar o buffer do teclado. 

Alterei algumas coisas no código: inclui o typedef (mas não sei se usei corretamente);defini uma constante max 5 pra aprender a usar constante para facilitar manutenção futura do código (apesar desse exercicio ser bem simples); inclui a função rand pra gerar os códigos. Está gerando, mas não imprime, como não imprime nenhum dado da agenda e tbem não funciona a mensagem de agenda lotada quando passa de 5 contatos. E não sei o que fiz de errado que o sistema não ta mais aceitando escrever palavras na opção 1. Só aceita um caractere. :(

 

 

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
#define max 5

typedef struct contatos {
	char nome [50], telefone [40], email [40];
	
}agenda;

int main ()
{
	setlocale(LC_ALL, "Portuguese");  
	agenda dados [max];
	int  op, cont;
	
	cont =0;
		
	do {
		
	printf ("\nDigite 1 para cadastrar novo cliente; \nDigite 2 para visualizar clientes cadastrados; \nDigite 0 para encerrar:\n");
	scanf ("%d", &op);
	fflush (stdin);
	
		switch (op)
		{
		/*se digitar 0 encerra a aplicação*/
		case 0: 
		system ("cls");
		printf ("APLICAÇÃO ENCERRADA!\n");	
		break;
		
		case 1: 
		/*se digitar 1 cadastra os contatos da agenda e gera um código*/
		
			if (cont<max){
			system ("cls");
			
			for (cont=0; cont<max; cont++);
			printf ("Código: %d\n", rand()%5);  /*inclui essa função rand pra gerar codigo, mas como imprimir esse codigo gerado?*/
			printf ("Digite o nome:"); /*se digito letras da erro. só permite digitar um caractere ???*/
			fgets (dados[cont].nome, 50, stdin); 
			fflush (stdin);
			printf ("Digite o telefone:");
			fgets (dados[cont].telefone, 40, stdin);
			fflush (stdin);
			printf ("Digite o e-mail:");
			fgets (dados[cont].email, 40, stdin);
			fflush (stdin);
			printf("\n");
			cont++;
			system ("pause");
			}
			else
			printf ("*****AGENDA LOTADA!*****\n"); /*não está funcionando com a condição if con< max*/
			
		
		break;
		
		case 2: 
		/*se digitar 2 exibe os cadastros efetuados inclusive o codigo gerado e
		caso não tenha cadastrado nada mostra a mensagem de agenda vazia e
		se tiver cadastrado os 5 mostra mensagem agenda lotada*/
			
			system ("cls");
			if (cont<1) {
					{printf ("*****AGENDA VAZIA!*****\n");}
					fflush (stdin);
					system ("pause");
						}
			else {
			
				for (cont=0; cont<max; cont++);
				
			
				printf ("\nNome: %s", dados[cont].nome);
				printf ("\nTelefone: %s", dados[cont].telefone);
				printf ("\nE-mail: %s", dados[cont].email);
				printf ("\n______________________________________");
				printf ("\n");
			}		
		break;
		
		default:
			printf ("*****ERRO: OPÇÃO INVÁLIDA!******");
		}
	}

	while (op!=0);
	return(0);
}

 

Link para o comentário
Compartilhar em outros sites

4 minutos atrás, japrendiz disse:

Estou usando um livro com base no livro do Campos Ascencio. Todos os exercícios parecidos no livro tem essa lógica de digitar, ler e imprimir usando o fflush pra limpar o buffer do teclado. 

 

O propósito do autor deve ter sido ter algo interativo. Nunca li esse livro. Assim o leitor digita algo e vê o resultado e tal. Mas não é nada produtivo e você vai ver isso a cada vez que insistir nisso. Só vai perder seu tempo. 

 

fflush(stdin)


Isso é bobagem e é uma pena que esteja até em livros e em artigos pela internet. Já expliquei isso outras vezes e a razão é simples

  • fflush() só está definido para arquivos de saída. É oficial.
  • o comportamento de fflush() para arquivos de entrada é indefinido. Apenas a Microsoft usa isso na entrada e nem é certo que vá funcionar em todas situações.
  • se usou fgets() não tem nada no buffer para você "limpar".
  • Se quer mesmo fazer isso em Windows o oficial é FlushConsoleInputBuffer() e é só uma linha e é oficial e suportado rem todas as versões desde os anos 80.

Você vai mesmo a cada vez que for testar seu programa digitar ao menos 2 ou 3 conjuntos de dados da agenda? Sério?

Usando isso

typedef struct contatos {
	char nome [50], telefone [40], email [40];
	
}agenda;

Ao invés disso

typedef struct
{
	char	nome[40];
	char	telefone[20];
	char	email[30];

}	Agenda;

E depois

	Agenda agenda[5] = {
		{ "nome1", "tel1", "email1" },
		{ "nome2", "tel2", "email2" },
		{ "nome3", "tel3", "email3" },
		{ "nome4", "tel4", "email4" }
	};
	int cont = 4;

E isso

	int cont = 4;
	lista_agenda(agenda, cont);

	agenda[cont] = agenda[0];
	cont = cont + 1;
	lista_agenda(agenda, cont);

 

Não sei o que fez você mudar isso em relação ao que te mostrei. Espero que não tenha visto isso nesse seu livro. Se viu recomendo mudar de livro.

  • Não há razão para declarar contatos. Justamente para não declarar a struct contatos é que está usando o typedef: para poder usar agenda
  • Use alguma convenção para esses typedef. Tem gente que usa a primeira letra em maiúscula como te mostrei, tem gente que usa um prefixo, tem gente que usa tudo em maiúsculas. Escolha algo, mas recomendo fazer isso.
  • Evite ao máximo declarar mais de uma variável na mesma linha.  É só problema. Dificulta mudar algo, achar as variáveis, inicializar as coisas. Isso está em muitos guias de conduta de empresas e escolas e na internet. E podia bem estar em seu livro

Viu como inserir um cara a mais no fim da agenda? Como usar uma função para poder listar os caras? Siga por esse caminho e vai terminar antes. Use uma função para inserir e outra para listar (sim, eu já te deixei uma) e coloque isso no programa. Uma função que insere() recebe uma struct e grava na agenda. Simples assim.

 

Dese modo quando você ler e quiser inserir um valor você só escreve insere(valor,agenda);
 

Não mistures as coisas.

 

Assim não:

	printf ("Código: %d\n", rand()%5);  /*inclui essa função rand pra gerar codigo, mas como imprimir esse codigo gerado?*/
	printf ("Digite o nome:"); /*se digito letras da erro. só permite digitar um caractere ???*/
	fgets (dados[cont].nome, 50, stdin); 
	fflush (stdin);
	printf ("Digite o telefone:");
	fgets (dados[cont].telefone, 40, stdin);
	fflush (stdin);
	printf ("Digite o e-mail:");
	fgets (dados[cont].email, 40, stdin);

Veja a diferença

  Agenda	um; // nunca misture as coisas

	printf ("Código: %d\n", rand()%5);  /*inclui essa função rand pra gerar codigo, mas como imprimir esse codigo gerado?*/
	printf ("Digite o nome:"); /*se digito letras da erro. só permite digitar um caractere ???*/
	fgets um.nome, 50, stdin); 
	printf ("Digite o telefone:");
	fgets (um.telefone, 40, stdin);
	printf ("Digite o e-mail:");
	fgets (um.email, 40, stdin);

	insere( um, agenda );

Você nunca mistura as coisas lendo direto dentro da sua estrutura. Isso fica no meio do programa e como já expliquei só vai atrasar tudo. Veja acima e entenda que você pode usar insere direto e gravar um cara ou 6.700 deles num comando só. E isso é produtivo e não o contrário. E você pode chamar insere() com dados constantes e testar o programa já, como te mostrei.

 

Isso não foi uma boa ideia:

			printf ("Código: %d\n", rand()%5);
    /*inclui essa função rand pra gerar codigo, 
    mas como imprimir esse codigo gerado?*/
	

rand()%5 vai retornar um número entre 0 e 4. Para que isso? Apenas use um código sequencial, a própria posição na agenda. E rand() pode duplicar e você precisa tratar isso: se vierem dois 3 em seguida por exemplo, ou vai gravar um sobre o outro? Não somou nada e criou um problema. 


Note que rand() em geral começa por uma chamada a srand(). Leu a documentação?

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...