題目1:
系統選單的設計
界面要求:
1、 要求每次進入各級選單時清屏
2、 “主選單”標題:學生資訊管理系統
3、 以“主選單”形式顯示內容
a) “1.學生資訊增加”
b) “2.學生資訊顯示”
c) “3.學生資訊查找”
d) “4.學生資訊修改”
e) “5.學生資訊洗掉”
f) “0.退出”
4、 選擇操作上述選單項時進入相應“二級選單”功能界面,界面要求
a) 清屏
b) 標題:“學生資訊XX”
c) 顯示“該功能未實作,按任意鍵回傳上一級,”
d) 按任意鍵回傳到主選單,主選單顯示要求按3要求,
5、 在“主選單”界面時,按0鍵結束程式,
對于該選單的實作比較簡單,這里小編只提供一些思路,首先我們要將基本的選單內容輸出出來:
只需要代碼:
printf("1.學生資訊增加\n\n2.學生資訊顯示\n\n3.學生資訊查找\n\n4.學生資訊修改\n\n5.學生資訊洗掉\n\n0.退出\n");
即可,
接下來是進行選單選項,這一功能的實作需要我們用條件判斷陳述句實作,但如果使用if陳述句會使代碼量增加并且變得繁瑣,所以我們可以改用switch陳述句進行操作,如這樣:
int a;
cin>>a;
switch(a)
{
case 1:
printf("學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 2:
printf("學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 3:
printf("學生資訊查找\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 4:
printf("學生資訊修改\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 5:
printf("學生資訊洗掉\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 0:
printf("退出");
}
這里要注意,如果在每個判斷陳述句結尾處不加break的話會使程式繼續向下讀取,如在case 1:陳述句結尾不加break的話,那么在輸出完“學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n”內容后還會繼續輸出“學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,”直到遇到break或末尾處才會結束,switch陳述句的功能其實類似于goto,只是將程式立刻帶到標記處,而這里我們采用case的形式來標記,
為了讓程式不斷的運行,直到我們選擇的退出選項才終止,我們可以將程式放入回圈中如:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int main()
{
int a;
while(a!=0)
{
printf("1.學生資訊增加\n\n2.學生資訊顯示\n\n3.學生資訊查找\n\n4.學生資訊修改\n\n5.學生資訊洗掉\n\n0.退出\n");
cin>>a;
switch(a)
{
case 1:
printf("學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 2:
printf("學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 3:
printf("學生資訊查找\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 4:
printf("學生資訊修改\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 5:
printf("學生資訊洗掉\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 0:
printf("退出");
}
}
return 0;
}
但這樣的回圈會出現問題:
變數a我們是在回圈外面定義的,而輸入卻是在回圈中,也就是說初始化的變數a是隨機值,這就有種可能,即我們還沒輸入回圈就結束了,這樣的選單顯然是失敗的,那么為了解決這個問題我們需要使用do-while回圈:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int main()
{
int a;
do
{
printf("1.學生資訊增加\n\n2.學生資訊顯示\n\n3.學生資訊查找\n\n4.學生資訊修改\n\n5.學生資訊洗掉\n\n0.退出\n");
cin>>a;
switch(a)
{
case 1:
printf("學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 2:
printf("學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 3:
printf("學生資訊查找\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 4:
printf("學生資訊修改\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 5:
printf("學生資訊洗掉\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 0:
printf("退出");
}
}while(a!=0);
return 0;
}
這樣無論如何程式都會將回圈中的內容執行一次,就解決了上述問題,
但是現在這個選單還有很多缺點,如:在輸入選單選項后選項中內容會在選單下面顯示,而不是出現一個新畫面

這樣會使畫面很雜亂,所以還需要加上我們之前說過的清屏程式:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int main()
{
int a;
do
{
system("cls");
printf("1.學生資訊增加\n\n2.學生資訊顯示\n\n3.學生資訊查找\n\n4.學生資訊修改\n\n5.學生資訊洗掉\n\n0.退出\n");
cin>>a;
switch(a)
{
case 1:
system("cls");
printf("學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 2:
system("cls");
printf("學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 3:
system("cls");
printf("學生資訊查找\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 4:
system("cls");
printf("學生資訊修改\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 5:
system("cls");
printf("學生資訊洗掉\n該功能未實作,按任意鍵回傳上一級,\n");
break;
case 0:
system("cls");
}
}while(a!=0);
return 0;
}
好了,加上了system(“cls”);程式后又出現了新問題:在我們選擇了選單選項后會發現屏閃了一下又恢復了原來界面,這正是清屏程式造成的,我們現在需要讓畫面在選單選項后的界面停滯,當我們輸入任意鍵后再回傳,只需要加上getch()即可,該程式即解決了需要停滯的問題,又解決了輸入任意鍵回傳上一級的問題,最終完整代碼如下:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int main()
{
int a;
char t;
do
{
system("cls");
printf("1.學生資訊增加\n\n2.學生資訊顯示\n\n3.學生資訊查找\n\n4.學生資訊修改\n\n5.學生資訊洗掉\n\n0.退出\n");
scanf("%d",&a);
switch(a)
{
case 1:
system("cls");
printf("學生資訊增加\n該功能未實作,按任意鍵回傳上一級,\n");
t=getch();
break;
case 2:
system("cls");
printf("學生資訊顯示\n該功能未實作,按任意鍵回傳上一級,\n");
t=getch();
break;
case 3:
system("cls");
printf("學生資訊查找\n該功能未實作,按任意鍵回傳上一級,\n");
t=getch();
break;
case 4:
system("cls");
printf("學生資訊修改\n該功能未實作,按任意鍵回傳上一級,\n");
t=getch();
break;
case 5:
system("cls");
printf("學生資訊洗掉\n該功能未實作,按任意鍵回傳上一級,\n");
t=getch();
break;
case 0:
system("cls");
}
}
while(a!=0);
return 0;
}
這只是小編做的一個簡潔版的思路,當然完成一個選單的方法還有很多,歡迎大家來一起討論,至于讓你的選單更精致一些,只需要改改細節就好了,
題目2:
根據“實踐專案1、2“Q題的內容進入實質性設計內容如下:
1、現有學生資訊包含三部分:學號(10位數字組成的字串)、姓名(10位英文字母組成的字串)、成績(0~100整數),
2、按照功能選單對應的功能完成一個班的資料資訊的輸入Add、顯示Display、查找Locate、修改Modify、洗掉Delete,其中學號是每名學生的關鍵字,
3、輸入資訊時按照關鍵字先查找是否存在,如不存在,提示輸入資訊
4、顯示資訊時按照兩種顯示方式(兩種方式可以設計子選單):一種是輸入學生的關鍵字,顯示特定學生,找到顯示,找不到提示“未曾找到,無法操作!”;另一種是把當前所有學生的資訊顯示出來,要注意資料最好是按照每屏顯示若干條資訊,
5、查找資訊時按照4的第一種方式進行
6、修改資訊時先輸入要修改學生的關鍵字,如找到,顯示資訊,然后提示是否修改,確認修改后進行修改,取消修改后退出;如沒有找到要修改的學生,提示“未曾找到,無法操作!”
7、洗掉資訊是先輸入要洗掉學生的關鍵字,如找到,顯示資訊,然后提示是否洗掉,確認洗掉后進行洗掉,取消洗掉后退出;如沒有找到要洗掉的學生,提示“未曾找到,無法操作!”
8、所實作的各個功能可參考由實踐2最后一道題設計的函式中實作,注意各個函式時候需要傳遞引數,傳遞引數的型別與個數要確定,
ExitSystem();
AddInfo();
DisplayInfo();
LocateInfo();
ModifyInfo();
DeleteInfo();
這個選單的難度較上一個選單的難度有了很大的提升,我們需要運用函式、結構體等功能來完成,首先我們明確各個函式的功能然后逐漸完善各個函式最后再用主函式來連接,
結構體部分
由于我們需要儲存學生的名字,學號,成績,所以干脆建立一個結構體:
const int N = 1e5+7;
struct book
{
string name,num;//名字、學號
int grade;//成績
} s[N];//結構體陣列
這里注意,結構體由于在各個函式中都需要使用,所以需要定義為全域變數,
ExitSystem()
該函式意為儲存系統,但是我不太明白它具體存些啥,所以我就用它來存了一些初始的學生資訊:
void ExitSystem()
{
s[1].name="Jake";
s[1].num="2004020201";
s[1].grade=59;
s[2].name="Tom";
s[2].num="2004020202";
s[2].grade=62;
s[3].name="Make";
s[3].num="2004020203";
s[3].grade=73;
}
先存三個學生資訊,”杰克“、“湯姆”、“梅克”,
AddInfo()
該函式為輸入系統,根據題目要求“輸入資訊時按照關鍵字先查找是否存在,如不存在,提示輸入資訊”,所以先根據”關鍵字“進行一次查找,資訊存在時將資訊輸出,不存在時進行輸入:
void AddInfo()
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
i++;
cout<<"資訊不存在,請輸入:"<<endl;
cout<<"姓名:";
cin>>s[i].name;
cout<<"\n學號:";
cin>>s[i].num;
cout<<"\n成績:";
cin>>s[i].grade;
}
else
{
cout<<s[j].num<<"資訊已存在!!!"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
這里為了簡單,直接采取了回圈的方法來進行查找資訊,所以在最前面我們還要定義一個全域變數i,并且初始化值為3(因為我們事先儲存了三名同學的資訊,如果你事先儲存了n名同學的資訊,那么這里i的值就要初始化為n)
DisplayInfo()
該函式功能為顯示,根據要求“顯示資訊時按照兩種顯示方式(兩種方式可以設計子選單):一種是輸入學生的關鍵字,顯示特定學生,找到顯示,找不到提示“未曾找到,無法操作!”;另一種是把當前所有學生的資訊顯示出來,要注意資料最好是按照每屏顯示若干條資訊,”
做出:
void DisplayInfo()
{
int a,j;
cout<<"1.顯示全部資訊"<<endl;
cout<<"2.查找關鍵字"<<endl;
cout<<"請輸入數字鍵選擇選單選項:";
cin>>a;
system("cls");
if(a==1)
{
for(int j=1; j<=i; j++)
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
else if(a==2)
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
}
這里比較好理解,顯示全部依然是用回圈所有進行的,
LocateInfo()
該功能為查找,與顯示的功能一樣
void LocateInfo()
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
下面是最難的兩個功能了
ModifyInfo()
首先來說修改功能,這比洗掉資訊要容易點,我們要通過遍歷的方法來找到你想修改的資訊的關鍵字,然后將該關鍵字的資訊全部展示出來,再詢問使用者是否修改,這里需要一個間接的變數來標記找到的資訊所在的結構體陣列的位置,然后將其資訊進行修改:
void ModifyInfo()
{
cout<<"請輸入關鍵字:";
string t,b;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)//j即是用來標記的間接變數
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<s[j].num<<"關鍵字已找到"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
cout<<"請問是否更改?(Y/N)";
cin>>b;
if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
{
cout<<"請輸入:"<<endl;
cout<<"姓名:";
cin>>s[j].name;
cout<<"\n學號:";
cin>>s[j].num;
cout<<"\n成績:";
cin>>s[j].grade;
}
}
}
DeleteInfo()
洗掉資訊也要通過遍歷的方法來找到你想洗掉的資訊的關鍵字,然后將該關鍵字的資訊全部展示出來,再詢問使用者是否洗掉,這里需要一個間接的變數來標記找到的資訊所在的結構體陣列的位置,然后將其資訊進行洗掉,這里的難點是洗掉之后結構體陣列中被洗掉的位置會變成空的,這樣就會影響整個結構體陣列的順序,從而使我們前面查找顯示輸入等功能混亂,所以要將洗掉后的空位置用后面的未洗掉部分補上:
void DeleteInfo()
{
cout<<"請輸入要洗掉的學生的關鍵字:";
string t,b;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<s[j].num<<"關鍵字已找到"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
cout<<"請問是否洗掉?(Y/N)";
cin>>b;
if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
{
for(int a=j;a<=i-1;a++)//從被洗掉位置開始,后面依次向前覆寫
{
s[a].name=s[a+1].name;
s[a].num=s[a+1].num;
s[a].grade=s[a+1].grade;
}
i--;
cout<<"洗掉成功!"<<endl;
}
}
}
這樣我們就實作了所有功能,最后的代碼如下:
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
const int N = 1e5+7;
int i=3;
struct book
{
string name,num;
int grade;
} s[N];
void ExitSystem()
{
s[1].name="Jake";
s[1].num="2004020201";
s[1].grade=59;
s[2].name="Tom";
s[2].num="2004020202";
s[2].grade=62;
s[3].name="Make";
s[3].num="2004020203";
s[3].grade=73;
}
void AddInfo()
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
i++;
cout<<"資訊不存在,請輸入:"<<endl;
cout<<"姓名:";
cin>>s[i].name;
cout<<"\n學號:";
cin>>s[i].num;
cout<<"\n成績:";
cin>>s[i].grade;
}
else
{
cout<<s[j].num<<"資訊已存在!!!"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
void DisplayInfo()
{
int a,j;
cout<<"1.顯示全部資訊"<<endl;
cout<<"2.查找關鍵字"<<endl;
cout<<"請輸入數字鍵選擇選單選項:";
cin>>a;
system("cls");
if(a==1)
{
for(int j=1; j<=i; j++)
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
else if(a==2)
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
}
void LocateInfo()
{
cout<<"請輸入關鍵字:";
string t;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
}
}
void ModifyInfo()
{
cout<<"請輸入關鍵字:";
string t,b;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<s[j].num<<"關鍵字已找到"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
cout<<"請問是否更改?(Y/N)";
cin>>b;
if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
{
cout<<"請輸入:"<<endl;
cout<<"姓名:";
cin>>s[j].name;
cout<<"\n學號:";
cin>>s[j].num;
cout<<"\n成績:";
cin>>s[j].grade;
}
}
}
void DeleteInfo()
{
cout<<"請輸入要洗掉的學生的關鍵字:";
string t,b;
cin>>t;
int x=0,j;
for(j=1; j<=i; j++)
{
if(s[j].num==t)
{
x++;
break;
}
}
if(x==0)
{
cout<<"未曾找到,無法操作!"<<endl;
}
else
{
cout<<s[j].num<<"關鍵字已找到"<<endl;
cout<<"Name:"<<s[j].name<<endl;
cout<<"Num:"<<s[j].num<<endl;
cout<<"Grade:"<<s[j].grade<<endl;
cout<<"請問是否洗掉?(Y/N)";
cin>>b;
if(b=="Y"||b=="y"||b=="yes"||b=="Yes"||b=="YES")
{
for(int a=j;a<=i-1;a++)
{
s[a].name=s[a+1].name;
s[a].num=s[a+1].num;
s[a].grade=s[a+1].grade;
}
i--;
cout<<"洗掉成功!"<<endl;
}
}
}
int main()
{
int a;
char t;
ExitSystem();
do
{
system("cls");
cout<<"\n\n 學生資訊的管理與統計";
cout<<"\n 1.資訊輸入";
cout<<"\n 2.資訊顯示";
cout<<"\n 3.資訊查找";
cout<<"\n 4.資訊修改";
cout<<"\n 5.資訊洗掉";
cout<<"\n 0.退出\n\n\n";
cout<<"請按數字鍵選擇選單選項:";
cin>>a;
switch(a)
{
case 1:
system("cls");
AddInfo();
printf("按任意鍵回傳上一級,\n");
t=getch();
break;
case 2:
system("cls");
DisplayInfo();
printf("按任意鍵回傳上一級,\n");
t=getch();
break;
case 3:
system("cls");
LocateInfo();
printf("按任意鍵回傳上一級,\n");
t=getch();
break;
case 4:
system("cls");
ModifyInfo();
printf("按任意鍵回傳上一級,\n");
t=getch();
break;
case 5:
system("cls");
DeleteInfo();
printf("按任意鍵回傳上一級,\n");
t=getch();
break;
case 0:
system("cls");
}
}
while(a!=0);
}
運行一下試試看:
運行后會先顯示初始選單

輸入2:

顯示一下全部資訊

我們事先儲存的資訊就會顯示出來

現在讓我們輸入一個同學的資訊

名字和學號成績如下:

再次查看全部資訊,發現我們輸入進去的新資訊已經被錄入

將杰克的資訊洗掉試試

再次查找時杰克已經不見了(可憐的杰克)

好啦,今天的內容就這么多,總之做這種實踐類的代碼方法有很多,這里只是提供一種小編的思路,大家可以一起討論,嘗試,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261012.html
標籤:其他
上一篇:2.12 字典型別
