我正在尝试在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);
}
}
}
答案 0 :(得分:0)
据我所知:
#include <stdio.h>
#include <string.h>
void pause(void);
void print_result(char **menu, int ret);
void clrscr(void);
#define MENU_INPUT(a) menu_input(a,sizeof(a)/sizeof(*a))
char * main_menu[]={
"Display First Menu",
"Display Sencond Menu"
};
char * first_menu[]={
"Format Drive C:",
"Partition First Drive",
"Scan Drive"
};
char * second_menu[]={
"Display an image",
"Play a sound"
};
int menu_input(char **menu,int items){
int i, j;
clrscr();
for(i = 1; i<=items;i++)
printf(" %d - %s\n",i, menu[i-1]);
printf(" 0 - to cancel\n ");
do{
scanf("%d", &i);
}while( i < 0 || i > items);
return i;
}
int main(void){
int ret;
for( ; ; ){
switch( MENU_INPUT( main_menu ) ){
case 0:
return 0;
case 1:
ret = MENU_INPUT( first_menu );
print_result( first_menu, ret );
break;
case 2:
ret= MENU_INPUT(second_menu);
print_result( second_menu, ret );
}
}
return 0;
}
// these are some helpper functions
void pause(void){
char c;
printf("press enter to continue\n");
scanf(" %c", &c);
}
void print_result(char **menu, int ret){
if( ret ){
printf("You pressed %d (%s)\n", ret, first_menu[ ret - 1 ] );
pause();
}
}
// clear screen
void clrscr(void){
#ifdef WIN32
char *cmd = "cls";
#else
char *cmd = "tput reset";
#endif
system(cmd);
}