#include
#include
#include
#include
#define SIZE 1000
char mingzi[20];
char shuru[8];
void printInfo();
void Register();
void Loading();
void RegisterorLoading();
void Menu();
void Visit();
void Vocabulary();
void danciyulanordancixuexi();
void cuotiben();
void Exit();
void delword();
void addword();
void findword();
這邊必須提醒大家的是,上述代碼包含了整個單詞本程序所有涉及到的需要進行聲明的子函數、頭文件等,并不是只對本文提到的主函數、主菜單函數等進行聲明。
主函數編寫
int main()
{
RegisterorLoading(); //注冊與登錄界面
Menu(); //菜單界面
Exit(); //退出界面
return 0;
}
為了提高代碼的可讀性c語言菜單界面設計,主函數中只進行子函數調用,所有功能都編寫子函數實現。
登錄/注冊界面編寫 1、注冊/登錄框架編寫
void RegisterorLoading() //注冊與登錄界面
{

int i; //選擇登錄或注冊的變量
printInfo(); //窗口界面美觀
scanf("%d",&i);
system("cls"); //清空已有窗口界面
switch(i)
{ case 1 : Register(); getchar();getchar(); //跳轉注冊或登錄
case 2: Loading();system("cls"); break;
}
}
其中“()”函數用于使界面較為美觀,其源碼如下:
void printInfo() //界面外形框
{
printf("\n\n\n\n\n");
printf("\t ***************************\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & 1.注冊 &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & 2.登錄 &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t & &\n");
printf("\t &**************************\n\n");
}
“()”函數只是起到使界面美觀的作用,筆者為了方便,只在最開始演示一次,如果大家對界面的美觀度要求較高,可以照著上述代碼對之后的代碼做一點修改,就能達到相同的頁面效果。
2、“注冊”子函數編寫
void Register() //用戶名注冊
{
int dk=1; //打卡數
char yonghuming1[20],mima1[8],mima2[8],mima3[8],mm[8]; //用戶名,第一次設的密碼,第一次確認的密碼,第一次確認密碼錯誤時第二次確認的密碼,最終存入文件的密碼。
FILE *fp;
fp=fopen("D:\\Ctext\\yonghushuju.txt","a+");
if(!fp)
{
printf("file error\n");
exit(1);
};
printf("請注冊你的用戶名:\n");
scanf("%s",yonghuming1);
printf("請輸入密碼:\n");
scanf("%s",mima1);
printf("請確認密碼:\n");
scanf("%s",mima2);
if(!strcmp(mima1,mima2)) //如果第一次輸入的密碼與確認的密碼一致則注冊成功。
{
strcpy(mm,mima1);
printf("注冊成功!");
}
else
{
printf("請再次確認密碼:\n");
scanf("%s",mima3);
if(!strcmp(mima1,mima3)) //若第一次不一致則需第二次確認一致。
{
strcpy(mm,mima1);
printf("恭喜你,注冊成功!\n");
}
else

{ printf("注冊失敗!\n");getchar();getchar(); //密碼兩次確認不一致則注冊失敗直接退出。
exit(1);}
}
fprintf(fp,"%s %s %d\n",yonghuming1,mm,dk); //用戶名與密碼還有初始打卡數存入文件。
fclose(fp);
}
3、“登錄”子函數編寫
void Loading() //登錄
{
int ch=0; //中間變量,用來判斷用戶名是否存在。
typedef struct yhsj //定義結構體
{
char name[20];
char password[8];
int dkts;
}sj;
sj yhxx[1000]; //定義結構體數組,用來存儲用戶信息
int i=0; //循環變量
FILE *fp; //定義文件指針
fp=fopen("D:\\Ctext\\yonghushuju.txt","r");//以只讀的形式打開用戶數據文件
if(!fp)
{
printf("file error!\n");
exit(1);
} //若打開失敗,則退出程序
printf("請輸入用戶名登錄:\n");
scanf("%s",mingzi); //將用戶輸入的信息存儲到字符數組中
fscanf(fp,"%s%s%d",yhxx[i].name,yhxx[i].password,&yhxx[i].dkts);
while(!feof(fp))
{
i++;
fscanf(fp,"%s%s%d",yhxx[i].name,yhxx[i].password,&yhxx[i].dkts);
} //將文件里所有的用戶信息讀入結構體
fclose(fp); //關閉文件

for (i=0;i<1000;i++)
{
if(!strcmp(mingzi,yhxx[i].name)) //判斷用戶數據文件里是否有與之相配的用戶名
{
ch=1; //若存在該用戶名,則將ch賦值為1;
printf("請輸入密碼:\n");
scanf("%s",shuru);
if(!strcmp(shuru,yhxx[i].password)) //將用戶輸入的密碼與用戶數據文件中的密碼比對
{printf("登錄成功!(請按回車繼續)\n");
getchar();getchar();} //停頓
else
{
printf("密碼錯誤,請重新輸入:\n");
scanf("%s",shuru);
if(!strcmp(shuru,yhxx[i].password)) //再次進行密碼比對
{ printf("登錄成功!(請按回車繼續)\n");
getchar();getchar();}
else
{
printf("輸入錯誤次數過多,再見!\n");
getchar();getchar();exit(1); //密碼輸入次數超限,停頓后直接結束程序。
}
}
}
}
if(ch==0) //用戶數據文件里找不到該用戶名,引導進行用戶注冊
{printf("無此用戶名,請注冊!\n");getchar();getchar();
exit(1);}
}
主菜單編寫
void Menu()
{
int i; //選擇變量,用于后面做選擇。

do{
printf("主菜單\n");
printf("1.查看單詞本\n");
printf("2.編輯單詞本\n");
printf("3.單詞學習\n");
printf("4.查看錯題集\n");
printf("0.退出\n");
printf("請輸入您的選擇:");
scanf("%d",&i);
getchar();
switch(i) //菜單欄往下跳轉
{
case 1: Visit();break;
case 2:Vocabulary();break;
case 3:danciyulanordancixuexi();break;
case 4:cuotiben();break;
case 0: Exit();
default:printf("請輸入正確的選擇!\n");
}
}while(i);
}
效果圖 主界面
“注冊”功能
“登錄”功能
跳轉主菜單
后記
至此c語言菜單界面設計,單詞本程序的主菜單及整體框架已經基本編寫完成,接下來將進行“查看單詞本”功能的編寫。
————————————————————————
2021.03.24更新:剛剛看到自己上傳的源碼需要積分才能下載,enm如果大家沒有積分的話,可以微信搜索我的個人公眾號“茶遷”或者掃描下圖,關注后在后臺回復“單詞本”,就可以直接拿到源碼啦。我平時也會在公眾號發一些編程相關的文章,歡迎大家關注~