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

Margas

Dúvidas no Projecto

8 mensagens neste tópico

Boa tarde a todos.

Estou a tentar fazer o projecto da disciplina de C, no entanto deparei-me com um problema.

Depois de no meu menu ter escolhido a opção de criação do cartão de cliente para inserção de dados, não consigo que depois de inserir os dados, volte de novo para o menu inicial.

Qualquer ajuda é bem vinda.

void main(void){
     char opcao;
	printf("KIOSK@EST \n Selecione o numero associado.\n");
	printf("1----------------- Criar cartao\n");
	printf("2----------------- Anular cartao\n");
	printf("3----------------- Alterar dados de cartao\n");
	printf("4----------------- Informacao de cartao\n");
	printf("5----------------- Transacoes\n");
	printf("6----------------- Listagens\n");
	scanf("%c", &opcao);

	switch (opcao){
		case '1': cria();break;
	  /*case '2': anula();break;
		case '3': altera();break;
		case '4': mostra();break;
		case '5': transacoes();break;
		case '6': listagens();break;*/
		case '7' : printf("Opcao Invalida");
	}

void cria(void){
	for(int i=0;i<101;i++)
		lerdados(i);
}

void lerdados(int i){

	printf("\n Cartao numero %d \n", i+1);
	CARTAO[i].utnumero=i;
	printf("Insira o nome:\n");
	fflush(stdin);
	gets(CARTAO[i].utnome);
printf("Selecione o tipo de utente:\n 0-----Aluno\n 1-----Docente\n 2-----Funcionario\n");
	fflush(stdin);
	scanf("%[^\n]",CARTAO[i].utente);
	printf("Carregamento minimo: 5 euros.\n Qual o valor que deseja carregar...");
	fflush(stdin);
	scanf("%[^\n]",CARTAO[i].TRANSACAO[0].saldo1);
	CARTAO[i].estado=0;
	CARTAO[i].TRANSACAO[0].movimento=0;
	strtime(data);
	/*CARTAO[i].TRANSACAO[0].data2= strtime(data);*/




}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mete um ciclo,

do{

// código
switch() {

// ...

}

}while(apcao != '0');

Enquanto não for digitado 0, o menu é apresentado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais, obrigado pela resposta.

Já tentei essa possibilidade mas ele continua para o cartão nº2....e assim sucessivamente.

Em anexo coloquei o objectivo do programa para melhor percepção.

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta ourto tipo de menu:

void menu ()
{
     char opcao;
     do
	printf("KIOSK@EST \n Selecione o numero associado.\n");
	printf("1----------------- Criar cartao\n");
	printf("2----------------- Anular cartao\n");
	printf("3----------------- Alterar dados de cartao\n");
	printf("4----------------- Informacao de cartao\n");
	printf("5----------------- Transacoes\n");
	printf("6----------------- Listagens\n");
	scanf("%c", &opcao);

	switch (opcao){
		case '1': cria();break;
	  /*case '2': anula();break;
		case '3': altera();break;
		case '4': mostra();break;
		case '5': transacoes();break;
		case '6': listagens();break;*/
		case '7' : printf("Opcao Invalida");
                        case ' 8': para sair /+ pa sair do programa*/
                }
                 while (opcao != 1 && opcao !=2 e assim sucessivamente pas 8  opções);

	}

Não testei mas tentar ver se percebeste a ideia, com o ciclo do while facilita bastante

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais, obrigado pela resposta.

Já tentei essa possibilidade mas ele continua para o cartão nº2....e assim sucessivamente.

Em anexo coloquei o objectivo do programa para melhor percepção.

Obrigado.

Mostra lá como é que fizeste essa possibilidade. É que para não dar é porque fizeste mal...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa noite.

Mesmo com a chamada da função menu(), que contem um ciclo while, depois de chamar a  função cria(), que por sua vez chama a função lerdados(), e  executa a criação do primeiro cartão só que depois passa para o segundo cartão em vez de voltar ao menu inicial.

Penso que o problema é o ciclo for, mas preciso dele para a atribuição automática do nº de cartão.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>


typedef enum{ CRG, DBT, TRF }TIPO_MOVIMENTO;
typedef enum{Bar, Livraria, Refeitorio, Reprografia, Outros }OBSERVA;

struct opera{
         char data1[9]; /*data da transacao*/
         TIPO_MOVIMENTO movimento; /*carregamento, transferencias, debitos*/
         float montante; /*valores utilizados*/
         char data2[9];
		 float saldo1; /*saldo apos transacao*/
         OBSERVA observacoes; /*bar, livraria, etc*/
        }TRANSACAO[10]; /*variavel TRANSACAO do tipo opera*/

typedef enum{Aluno, Docente, Funcionario }TUTENTE;/*variavel tipo de utente*/
typedef enum{Activo, Inactivo }ESTADO;/*estado do cartao activo ou inactivo*/

struct registos{
                int utnumero;/*numero do cartao*/
			char utnome[50];/*nome do utente*/
			TUTENTE utente;/*tipo de utente*/
			//char data2[9];/*data de criacao do cartao*/
			struct opera TRANSACAO[10];/*transacoes*/
			ESTADO estado;
		   }CARTAO[100];/*cem cartoes ou utentes*/

char data[9];


char mostra_transacoes(void);
carrega();
debita();
transfer();
void transacoes(void);
void lerdados(int i);
void cria(void);
anula();
altera();
mostra();
listagens();
menu();




void main(void){

menu();


}


menu(){
     char opcao;
	do{
	printf("KIOSK@EST \n Selecione o numero associado.\n");
	printf("1----------------- Criar cartao\n");
	printf("2----------------- Anular cartao\n");
	printf("3----------------- Alterar dados de cartao\n");
	printf("4----------------- Informacao de cartao\n");
	printf("5----------------- Transacoes\n");
	printf("6----------------- Listagens\n");
	scanf("%c", &opcao);


	switch (opcao){
		case '1': cria();break;
	  /*case '2': anula();break;
		case '3': altera();break;
		case '4': mostra();break;
		case '5': transacoes();break;
		case '6': listagens();break;*/
		case '7' : printf("Opcao Invalida");
	}
}while ((opcao!=1) && (opcao!=2) && (opcao!=3) && (opcao!=4) && (opcao!=5) && (opcao!=6) && (opcao!=7));
}




void transacoes(void){
	char opcao2;
	opcao2=mostra_transacoes();

	switch (opcao2){
		/*case '1': carrega();break;
		case '2': debita();break;
		case '3': transfer();break;*/
		default: printf("Opcao Invalida");
    	}
}

char mostra_transacoes(void){
		char opcao3;
	printf("KIOSK@EST \n Selecione o numero associado.");
	printf("1----------------- Efectuar carregamento");
 	printf("2----------------- Efectuar debito");
	printf("3----------------- Efectuar transferencia");
	scanf("%c", &opcao3);
return opcao3;
}

void cria(void){

	for(int i=0;i<100;i++)

		lerdados(i);

}

void lerdados(int i){

	printf("\n Cartao numero %d \n", i+1);
	CARTAO[i].utnumero=i;
	printf("Insira o nome:\n");
	fflush(stdin);
	gets(CARTAO[i].utnome);
        printf("Selecione o tipo de utente:\n 0-----Aluno\n 1-----Docente\n 2-----Funcionario\n");
	fflush(stdin);
	scanf("%[^\n]",CARTAO[i].utente);
	printf("Carregamento minimo: 5 euros.\n Qual o valor que deseja carregar...");
	fflush(stdin);
	scanf("%[^\n]",CARTAO[i].TRANSACAO[0].saldo1);
	CARTAO[i].estado=0;
	CARTAO[i].TRANSACAO[0].movimento=0;
	strtime(data);
	/*CARTAO[i].TRANSACAO[0].data2= strtime(data);*/




}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas o defeito, tal como eu tinha previsto, não é do ciclo. O problema está na função criar. Com aquele ciclo for vais estar a chamar a função lerdados() 100 vezes, com os números de 1 a 100, por isso é que ele te passa para o número 2.

Tens que rever isso... Provavelmente devias usar uma variável global que é incrementada de cada vez que crias um novo cliente e depois a tua função cria passaria a ser qualquer coisa como:

void cria(){
numero_de_clientes = numero_de_clientes+1;

lerdados(numero_de_clientes);
}

Já agora... na condição do ciclo do...while faltam as plicas. O correcto é

while ((opcao!='1') && (opcao!='2') && (opcao!='3') && (opcao!='4') && (opcao!='5') && (opcao!='6') && (opcao!=7));

e quando meteres código usa o GeSHI ;)

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