我想在C程序中實現2件事情。我不認爲有必要向您展示代碼,因爲我只是想知道如果他們有可能完成。我已經查過這個,但找不到明確的答案。需要一些幫助搞清楚如何在我的C程序中做2件事
我有這個程序在C中,有許多功能,main()和3個「子菜單」。 主要是基本上只是程序的主菜單,它包含哪種情況下去其他子菜單,並且每個子菜單去相關的功能。 我想知道的是如何使這些函數返回到這些子菜單,而不是返回到main()。 在這些函數中,我有一個「返回」;在最後,但他們返回到主,而不是子菜單。如果能夠澄清一點,這將是非常好的。
我的另一個問題是,如果有可能返回到子菜單,在從該子菜單輸入數據的功能之前,按下退格鍵,或者按下該鍵時,取消功能(好像我誤點了這個功能並想返回)並返回到子菜單。
我真的很感激一些幫助,如果需要,我可以張貼代碼,或它的一部分,因爲它仍然是相當大的,給予一定的上下文(但要注意裸露的,所有的變量,函數名, printf和什麼都不是葡萄牙語)。編號: 這是代碼。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#define NR 1000
////////////////////////////////////////////////////////////////////////////////
typedef struct
{
int idJogo;
char nomeJogo[50];
char genero[50];
char empresa[50];
char plataforma[50];
long int preco;
int estado; // 1 - Ocupado e 0 - Livre
}jogo;
typedef struct
{
int idCliente;
char nomeCliente[50];
long int contacto;
char cidade[50];
int estado; // 1 - Ocupado e 0 - Livre
}cliente;
typedef struct
{
int idCompra;
int idCliente;
int idJogo;
char nomeJogo[50];
char nomeCliente[50];
char dataCompra[20];
long int valor;
int estado; // 1 - Ocupado e 0 - Livre
}compra;
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// FICHEIROS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Ler Ficheiros ////////////////////////////////////
int lerficheiros (jogo *jogo, cliente *cliente, compra *compra)
{
int m, n, o;
printf("\n\tA carregar os ficheiros...\n\n");
FILE *fj, *fc, *fk;
// Verifica se existe o ficheiro txt dos jogos
if(!(fj=fopen("jogos.txt", "r")))
{
printf("\n\n\tO ficheiro de jogos não existe. <Enter> para criar o ficheiro.");getch();
// Cria o ficheiro caso não exista
fj=fopen("jogos.txt", "w");
printf("\n\tO ficheiro dos jogos foi criado.");
}
// Lê o ficheiro dos jogos
fj=fopen("jogos.txt", "r");
for (m=1; m<NR; m++)
{
fscanf(fj, "%d\n", &jogo[m].idJogo);
fscanf(fj, "%s\n", jogo[m].nomeJogo);
fscanf(fj, "%s\n", jogo[m].genero);
fscanf(fj, "%s\n", jogo[m].empresa);
fscanf(fj, "%s\n", jogo[m].plataforma);
fscanf(fj, "%ld\n", &jogo[m].preco);
fscanf(fj, "%d\n", &jogo[m].estado);
}
fclose(fj);
printf("\n\tFicheiro dos jogos lido <Enter> para continuar.\n");getch();
//Igual para o ficheiro dos clientes
if(!(fc=fopen("clientes.txt", "r")))
{
printf("\n\n\tO ficheiro de clientes não existe. <Enter> para criar o ficheiro.");getch();
// Cria o ficheiro caso não exista
fc=fopen("clientes.txt", "w");
printf("\n\tO ficheiro dos clientes foi criado.");
}
// Lê o ficheiro dos clientes
fc=fopen("clientes.txt", "r");
for (n=1; n<NR; n++)
{
fscanf(fc, "%d\n", &cliente[n].idCliente);
fscanf(fc, "%s\n", cliente[n].nomeCliente);
fscanf(fc, "%ld\n", &cliente[n].contacto);
fscanf(fc, "%s\n", cliente[n].cidade);
fscanf(fc, "%d\n", &cliente[n].estado);
}
fclose(fc);
printf("\n\tFicheiro dos clientes lido <Enter> para continuar.\n");getch();
//Mais uma vez igual para o ficheiro das compras
if(!(fk=fopen("compras.txt", "r")))
{
printf("\n\n\tO ficheiro de compras não existe. <Enter> para criar o ficheiro.");getch();
// Cria o ficheiro caso não exista
fk=fopen("compras.txt", "w");
printf("\n\tO ficheiro de compras foi criado.");
}
// Lê o ficheiro das compras
fk=fopen("compras.txt", "r");
for (o=1; o<NR; o++)
{
fscanf(fk, "%d\n", &compra[o].idCompra);
fscanf(fk, "%d\n", &compra[o].idCliente);
fscanf(fk, "%d\n", &compra[o].idJogo);
fscanf(fk, "%s\n", compra[o].nomeJogo);
fscanf(fk, "%s\n", compra[o].nomeCliente);
fscanf(fk, "%s\n", compra[o].dataCompra);
fscanf(fk, "%ld\n", &compra[o].valor);
fscanf(fk, "%d\n", &compra[o].estado);
}
fclose(fk);
printf("\n\tFicheiro de compras lido <Enter> para continuar.\n");getch();
}
///////////////////////////// Gravar Ficheiros /////////////////////////////////
void gravarficheiros(char sair, jogo *jogo, cliente *cliente, compra *compra)
{
int m, n, o;
FILE *fj, *fc, *fk;
// Grava ficheiro dos jogos
fj=fopen("jogos.txt", "w");
for(m=1;m<NR;m++)
{
if(jogo[m].estado==1)
{
fprintf(fj,"%d\n%s\n%s\n%s\n%s\n%ld\n%d\n",jogo[m].idJogo,jogo[m].nomeJogo,
jogo[m].genero,jogo[m].empresa,jogo[m].plataforma,jogo[m].preco,jogo[m].estado);
}
}
fclose(fj);
// Grava ficheiro dos clientes
fc=fopen("clientes.txt", "w");
for(n=1;n<NR;n++)
{
if(cliente[n].estado==1)
{
fprintf(fc,"%d\n%s\n%ld\n%s\n%d\n",cliente[n].idCliente,cliente[n].nomeCliente,
cliente[n].contacto,cliente[n].cidade,cliente[n].estado);
}
}
fclose(fc);
// Grava ficheiro de compras
fk=fopen("compras.txt", "w");
for(o=1;o<NR;o++)
{
if(compra[o].estado==1)
{
fprintf(fk,"%d\n%d\n%d\n%s\n%s\n%s\n%ld\n%d\n",compra[o].idCompra,compra[o].idCliente,
compra[o].idJogo,compra[o].nomeJogo,compra[o].nomeCliente,compra[o].dataCompra,
compra[o].valor,compra[o].estado);
}
}
fclose(fj);
if (sair=='S') exit(0);
printf("\n\n\n\tFicheiros gravados <Enter> para continuar."); getch();
}
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// JOGOS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Consultar Jogos //////////////////////////////////
int consultarjogos(jogo *jogo)
{
int n;
system ("cls");
printf("\n----------------------- LISTA DE JOGOS -----------------------\n");
for(n=1;n<NR;n++)
{
if(jogo[n].estado==1)
{
printf("\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
printf("Plataforma: %s | Preco: %ld€\n", jogo[n].plataforma, jogo[n].preco);
}
}
printf("\n--------------------------------------------------------------\n");
printf("\n\tListagem concluída. <Enter> para continuar.");
getch();
}
///////////////////////////// Inserir Jogo /////////////////////////////////////
int inserirjogo(jogo *jogo)
{
int n;
system ("cls");
fflush(stdin);
printf("\n----------------------- INSERIR JOGO -----------------------\n");
for(n=1;n<NR;n++)
{
if(jogo[n].estado!=1)
{
jogo[n].idJogo=rand() % 999;
printf("\n\tNome do Jogo -> "); gets(jogo[n].nomeJogo);
printf("\n\tGenero -> "); gets(jogo[n].genero);
printf("\n\tEmpresa -> "); gets(jogo[n].empresa);
printf("\n\tPlataforma -> "); gets(jogo[n].plataforma);
printf("\n\tPreco (€) -> "); scanf("%ld", &jogo[n].preco); fflush(stdin);
jogo[n].estado=1;
printf("\n\n------------------------------------------------------------\n");
printf("\n\tJogo inserido. <Enter> para continuar.");
getch();
return(0);
}
}
printf("\n\tErro, não foi possivel inserir o jogo. <Enter> para continuar.");
getch(); return(1);
}
/////////////////////////////// Alterar Jogo ///////////////////////////////////
int alterarjogo(jogo *jogo)
{
int n;
long int altjogo;
system("cls");
printf("\n----------------------- ALTERAR JOGO -----------------------\n");
printf("\n\tID do Jogo que pretende alterar: ");
scanf("%d", &altjogo); fflush(stdin);
for(n=1;n<NR;n++)
{
if(jogo[n].idJogo==altjogo)
{
jogo[n].estado=0;
printf("\n\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
printf("Plataforma: %s | Preco: %ld€", jogo[n].plataforma, jogo[n].preco);
printf("\n\n\tNome do Jogo -> "); gets(jogo[n].nomeJogo);
printf("\n\tGenero -> "); gets(jogo[n].genero);
printf("\n\tEmpresa -> "); gets(jogo[n].empresa);
printf("\n\tPlataforma -> "); gets(jogo[n].plataforma);
printf("\n\tPreco (€) -> "); scanf("%ld", &jogo[n].preco); fflush(stdin);
jogo[n].estado=1;
printf("\n\n------------------------------------------------------------\n");
printf("\n\tJogo alterado. <Enter> para continuar.");
getch();
return(0);
}
}
printf("\n\tErro, jogo não encontrado. <Enter> para continuar.");
getch(); return(1);
}
/////////////////////////////// Eliminar Jogo //////////////////////////////////
int eliminarjogo(jogo *jogo)
{
char conf;
int n;
long int elimjogo;
system("cls");
printf("\n----------------------- ELIMINAR JOGO -----------------------\n");
printf("\n\tID do Jogo que pretende eliminar: ");
scanf("%ld", &elimjogo); fflush(stdin);
for(n=1;n<NR;n++)
{
if(jogo[n].idJogo==elimjogo)
{
printf("\n\n\tID: %d | Nome: %s | Genero: %s\n\tEmpresa: %s | ", jogo[n].idJogo, jogo[n].nomeJogo, jogo[n].genero, jogo[n].empresa);
printf("Plataforma: %s | Preco: %ld€", jogo[n].plataforma, jogo[n].preco);
printf("\n\n\tTem a certeza que quer eliminar o jogo? <S/N>");
conf=toupper(getch());
if (conf!='S') return(1);
jogo[n].estado=0;
printf("\n\n-------------------------------------------------------------\n");
printf("\n\tJogo eliminado. <Enter> para continuar.");
getch();
return(0);
}
}
printf("\n\tErro, jogo não encontrado. <Enter> para continuar.");
getch(); return(1);
}
///////////////////////////// Menu Gerir Jogos /////////////////////////////////
int gerirjogos(jogo *jogo)
{
system("cls");
char op;
do {
printf("\n----------------------- GERIR JOGOS -----------------------\n");
printf("\n\t 1 - Consultar Jogos\n\t 2 - Inserir Jogo\n\t 3 - Alterar Jogo\n\t 4 - Eliminar Jogo\n\t 0 - Voltar");
printf("\n\n-----------------------------------------------------------\n");
printf("\n\t Opcao:"); op=getch();
} while(op<'0' || op>'4');
switch (op){
case '1': consultarjogos(jogo); break;
case '2': inserirjogo(jogo); break;
case '3': alterarjogo(jogo); break;
case '4': eliminarjogo(jogo); break;
case '0': return(0); break;
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// CLIENTES /////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////// Consultar Clientes //////////////////////////////////
int consultarclientes(cliente *cliente)
{
int n;
system ("cls");
printf("\n----------------------- LISTA DE CLIENTES -----------------------\n");
for(n=1;n<NR;n++)
{
if(cliente[n].estado==1)
{
printf("\n\tID: %d | Nome: %s", cliente[n].idCliente, cliente[n].nomeCliente);
printf("\n\tContacto: %ld | Cidade: %s\n", cliente[n].contacto, cliente[n].cidade);
}
}
printf("\n-----------------------------------------------------------------\n");
printf("\n\tListagem concluída. <Enter> para continuar.");
getch();
}
///////////////////////////// Inserir Cliente //////////////////////////////////
int inserircliente(cliente *cliente)
{
int n;
system ("cls");
fflush(stdin);
printf("\n----------------------- INSERIR CLIENTE -----------------------\n");
for(n=1;n<NR;n++)
{
if(cliente[n].estado!=1)
{
cliente[n].idCliente=rand() % 999;
printf("\n\tNome do Cliente -> "); gets(cliente[n].nomeCliente);
printf("\n\tContacto -> "); scanf("%ld", &cliente[n].contacto); fflush(stdin);
printf("\n\tCidade -> "); gets(cliente[n].cidade);
cliente[n].estado=1;
printf("\n\n---------------------------------------------------------------\n");
printf("\n\tCliente inserido. <Enter> para continuar.");
getch(); return(0);
}
}
printf("\n\tErro, não foi possivel inserir o cliente. <Enter> para continuar.");
getch(); return(1);
}
/////////////////////////////// Alterar Cliente ////////////////////////////////
int alterarcliente(cliente *cliente)
{
int n;
long int altcliente;
system("cls");
printf("\n----------------------- ALTERAR CLIENTE -----------------------\n");
printf("\n\tID do Cliente que pretende eliminar: ");
scanf("%d", &altcliente); fflush(stdin);
for(n=1;n<NR;n++)
{
if(cliente[n].idCliente==altcliente)
{
cliente[n].estado=0;
printf("\n\n\tID: %d | Nome: %s | ", cliente[n].idCliente, cliente[n].nomeCliente);
printf("\n\tContacto: %ld | Cidade: %s", cliente[n].contacto, cliente[n].cidade);
printf("\n\n\tNome do Cliente -> "); gets(cliente[n].nomeCliente);
printf("\n\tContacto -> "); scanf("%ld", &cliente[n].contacto); fflush(stdin);
printf("\n\tCidade -> "); gets(cliente[n].cidade);
cliente[n].estado=1;
printf("\n\n---------------------------------------------------------------\n");
printf("\n\tCliente alterado. <Enter> para continuar.");
getch(); return(0);
}
}
printf("Erro, cliente não encontrado. <Enter> para continuar.");
getch(); return(1);
}
//////////////////////////// Eliminar Cliente //////////////////////////////////
int eliminarcliente(cliente *cliente)
{
char conf;
int n;
long int elimcliente;
system("cls");
printf("\n----------------------- ELIMINAR CLIENTE -----------------------\n");
printf("\n\tID do Cliente que pretende eliminar: ");
scanf("%ld", &elimcliente); fflush(stdin);
for(n=1;n<NR;n++)
{
if(cliente[n].idCliente==elimcliente)
{
printf("\n\n\tID: %d | Nome: %s | ", cliente[n].idCliente, cliente[n].nomeCliente);
printf("\n\tContacto: %ld | Cidade: %s", cliente[n].contacto, cliente[n].cidade);
printf("\n\n\tTem a certeza que quer eliminar o cliente? <S/N>");
conf=toupper(getch());
if (conf!='S') return(1);
cliente[n].estado=0;
printf("\n\n----------------------------------------------------------------\n");
printf("\n\tCliente eliminado. <Enter> para continuar.");
getch();
return(0);
}
}
printf("\n\tErro, cliente não encontrado. <Enter> para continuar.");
getch(); return(1);
}
///////////////////////////// Menu Gerir Clientes //////////////////////////////
int gerirclientes(cliente *cliente)
{
system("cls");
char op;
do {
printf("\n----------------------- GERIR CLIENTES -----------------------\n");
printf("\n\t 1 - Consultar Clientes\n\t 2 - Inserir Cliente\n\t 3 - Alterar Cliente\n\t 4 - Eliminar Cliente\n\t 0 - Voltar");
printf("\n\n--------------------------------------------------------------\n");
printf("\n\t Opcao:"); op=getch();
} while(op<'0' || op>'4');
switch (op){
case '1': consultarclientes(cliente); break;
case '2': inserircliente(cliente); break;
case '3': alterarcliente(cliente); break;
case '4': eliminarcliente(cliente); break;
case '0': return(0); break;
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// COMPRAS //////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Consultar Compras ////////////////////////////////
int consultarcompras(compra *compra)
{
int n;
system ("cls");
printf("\n----------------------- REGISTO DE COMPRAS -----------------------\n");
for(n=1;n<NR;n++)
{
if(compra[n].estado==1)
{
printf("\n\tID Compra: %d | ID Jogo: %d | ID Cliente: %d", compra[n].idCompra, compra[n].idJogo, compra[n].idCliente);
printf("\n\tNome do Jogo: %s | Nome do Cliente: %s", compra[n].nomeJogo, compra[n].nomeCliente);
printf("\n\tData da Compra: %s | Valor da Compra: %ld€\n", compra[n].dataCompra, compra[n].valor);
}
}
printf("\n------------------------------------------------------------------\n");
printf("\n\tListagem concluída. <Enter> para continuar.");
getch();
}
///////////////////////////////// Nova Compra //////////////////////////////////
int novacompra(compra *compra, jogo *jogo, cliente *cliente)
{
int n, m, o, idj, idc;
system ("cls");
printf("\n----------------------- NOVA COMPRA -----------------------\n");
for(n=1;n<NR;n++)
{
if(compra[n].estado!=1)
{
compra[n].idCompra=rand() % 999;
printf("\n\tID do Jogo -> "); scanf("%d", &idj); fflush(stdin);
for(m=1;m<NR;m++)
{
if(jogo[m].idJogo == idj)
{
printf("\n\tNome do Jogo: %s", jogo[m].nomeJogo);
compra[n].idJogo = jogo[m].idJogo;
strcpy(compra[n].nomeJogo, jogo[m].nomeJogo);
compra[n].valor = jogo[m].preco;
printf("\n\n\tID do Cliente -> "); scanf("%d", &idc); fflush(stdin);
for(o=1;o<NR;o++)
{
if(cliente[o].idCliente == idc)
{
printf("\n\tNome do Cliente: %s", cliente[o].nomeCliente);
compra[n].idCliente = cliente[o].idCliente;
strcpy(compra[n].nomeCliente, cliente[o].nomeCliente);
printf("\n\n\tData da Compra (dd/mm/aaaa) -> "); scanf("%s", compra[n].dataCompra);
printf("\n\tValor: %ld€", compra[n].valor);
compra[n].estado=1;
printf("\n\n-----------------------------------------------------------\n");
printf("\n\tCompra registada. <Enter> para continuar.");
getch(); return(0);
}
}
}
}
}
}
printf("\n\tErro, não foi possivel concluir a compra. <Enter> para continuar.");
getch(); return(1);
}
//////////////////////////// Eliminar Compra ///////////////////////////////////
int eliminarcompra(compra *compra)
{
char conf;
int n;
long int elimcompra;
system("cls");
printf("\n----------------------- ELIMINAR COMPRA -----------------------\n");
printf("\n\tID da Compra que pretende eliminar: ");
scanf("%ld", &elimcompra); fflush(stdin);
for(n=1;n<NR;n++)
{
if(compra[n].idCompra==elimcompra)
{
printf("\n\n\tID Compra: %d | ID Jogo: %d | ID Cliente: %d", compra[n].idCompra, compra[n].idJogo, compra[n].idCliente);
printf("\n\tNome do Jogo: %s | Nome do Cliente: %s", compra[n].nomeJogo, compra[n].nomeCliente);
printf("\n\tData da Compra: %s | Valor da Compra: %ld€", compra[n].dataCompra, compra[n].valor);
printf("\n\n\tTem a certeza que quer eliminar a compra? <S/N>");
conf=toupper(getch());
if (conf!='S') return(1);
compra[n].estado=0;
printf("\n\n---------------------------------------------------------------\n");
printf("\n\tCompra eliminada. <Enter> para continuar.");
getch();
return(0);
}
}
printf("\n\tErro, registo da compra não encontrado. <Enter> para continuar.");
getch(); return(1);
}
///////////////////////////// Menu Gerir Compras ///////////////////////////////
int gerircompras(compra *compra, jogo *jogo, cliente *cliente)
{
system("cls");
char op;
do {
printf("\n----------------------- GERIR COMPRAS -----------------------\n");
printf("\n\t 1 - Consultar Compras\n\t 2 - Nova Compra\n\t 3 - Eliminar Compra\n\t 0 - Voltar");
printf("\n\n-------------------------------------------------------------\n");
printf("\n\t Opcao:"); op=getch();
} while(op<'0' || op>'3');
switch (op){
case '1': consultarcompras(compra); break;
case '2': novacompra(compra, jogo, cliente); break;
case '3': eliminarcompra(compra); break;
case '0': return(0); break;
}
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// MAIN /////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
main()
{
system("COLOR 1F");
char op, sair='N';
int n;
srand(time(NULL));
jogo jogo[NR];
cliente cliente[NR];
compra compra[NR];
system ("chcp 1252");
for(n=1;n<NR;n++)
{
jogo[n].estado=0;
cliente[n].estado=0;
compra[n].estado=0;
}
lerficheiros(jogo, cliente, compra);
for(;;)
{
do
{
system("cls");
printf("\n----------------------- LOJA DE JOGOS -----------------------\n");
printf("\n\t 1 - Gerir Jogos\n\t 2 - Gerir Clientes\n\t 3 - Gerir Compras");
printf("\n\t 4 - Ler Ficheiros\n\t 5 - Gravar Ficheiros \n\t 0 - Sair");
printf("\n\n-------------------------------------------------------------\n");
printf("\n\t Opcao:"); op=getch();
}while (op<'0' || op>'5');
switch (op) {
case '1': gerirjogos(jogo); break;
case '2': gerirclientes(cliente); break;
case '3': gerircompras(compra, jogo, cliente); break;
case '4': lerficheiros(jogo, cliente, compra); break;
case '5': gravarficheiros(sair, jogo, cliente, compra); break;
case '0': sair='S'; gravarficheiros(sair, jogo, cliente, compra);
}
}
}
第一個是容易通過把一個環子菜單中的功能做。第二個更難,因爲例如,退格鍵由鍵盤驅動程序處理,永遠不會到達您的程序。 – user3386109
我投票結束這個問題太廣泛了...(哎呀....我沒有足夠的積分到我的帳戶)。問題是,你向我們遞交了一堆沒有與問題相關的代碼片段的問題。 – Mike
這是不可能的解釋爲什麼*在每個函數中,我都有一個「return *」,但是在沒有看到您使用的代碼的情況下,它們會返回到main而不是sub menu。關於第二個問題,是的。 。在當前的代碼中,也不可能告訴你如何這樣做,因爲**我們看不到你當前的代碼**。請自己幫忙:在[help]中花點時間,特別是[How do我在這裏問一個好問題?](http://stackoverflow.com/help/how-to-ask),然後發佈你的下一個問題在這裏。 –