“非数据验证+=INDIRECT(N2)”是个什么概念,没能理解,抱歉。
但实现动态二级菜单的方法有很多,下面介绍一种笨而直观的:
如图,N列车牌,数据行数动态
F2用数据验证(可能不是“非数据验证”)得到动态下拉菜单:
=OFFSET(N$1,1,,COUNTA(N:N)-1)
如果跨表,把上面的公式定义为一个名称,如“车牌”
司机用数据验证设置二级下拉菜单:
=OFFSET(N$1,MATCH(F$2,N$2:N$200,),1,,COUNTA(OFFSET(N$1,MATCH(F$2,N$2:N$200,),1,,20)))
上面的验证考虑了199个车牌,每个车对应可能20个司机。请根据实际可能数据修改。
跨表时,同样先定义名称,如“司机”
C语言课程设计报告-------学生成绩简单管理程序
一、系统菜单的主要功能
(1)输入若干条记录
(2)显示所有记录
(3)按学号排序
(4)插入一条记录
(5)按姓名查找,删除一条记录
(6)查找并显示一条记录
(7)输出统计信息 (新增)
(8)从正文中添加数据到结构体数组中
(9)将所有数据写入文件中
(0)退出程序
二、题目分析
该题主要考察学生对结构体,指针,文件的 *** 作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比较。
功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的 *** 作,提前准备好数据。
三、程序正文部分
#include /引用库函数/
#include
#include
#include
typedef struct /定义结构体数组/
{
char num[10]; /学号/
char name[20]; /姓名/
int score; /成绩/
}Student;
Student stu[80]; /结构体数组变量/
int menu_select() /菜单函数/
{
char c;
do{
system("cls"); /运行前清屏/
printf("\t\tStudents' Grade Management System\n"); /菜单选择/
printf("\t\t | 1 Input Records |\n");
printf("\t\t | 2 Display All Records |\n");
printf("\t\t | 3 Sort |\n");
printf("\t\t | 4 Insert a Record |\n");
printf("\t\t | 5 Delete a Record |\n");
printf("\t\t | 6 Query |\n");
printf("\t\t | 7 Statistic |\n");
printf("\t\t | 8 Add Records from a Text File|\n");
printf("\t\t | 9 Write to a Text file |\n");
printf("\t\t | 0 Quit |\n");
printf("\t\t\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /读入选择/
}while(c'9');
return(c-'0'); /返回选择/
}
int Input(Student stud[],int n) /输入若干条记录/
{int i=0;
char sign,x[10]; /x[10]为清除多余的数据所用/
while(sign!='n'&&sign!='N') /判断/
{ printf("\t\t\tstudent's num:"); /交互输入/
scanf("\t\t\t%s",stud[n+i]num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i]name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n+i]score);
gets(x); /清除多余的输入/
printf("\t\t\tany more records(Y/N)");
scanf("\t\t\t%c",&sign); /输入判断/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /显示所有记录/
{
int i;
printf("\t\t\t-----------------------------------\n"); /格式头/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++) /循环输入/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1]num,stud[i-1]name,stud[i-1]score);
if(i>1&&i%10==0) /每十个暂停/
{printf("\t\t\t-----------------------------------\n"); /格式/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(Student stud[],int n) /按学号排序/
{ int i,j,p,q,s;
char t[10];
for(i=0;i<n-1;i++) /冒泡法排序/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j]num,stud[j+1]num)>0)
{strcpy(t,stud[j+1]num);
strcpy(stud[j+1]num,stud[j]num);
strcpy(stud[j]num,t);
strcpy(t,stud[j+1]name);
strcpy(stud[j+1]name,stud[j]name);
strcpy(stud[j]name,t);
p=&stud[j+1]score;
q=&stud[j]score;
s=p;
p=q;
q=s;
}
}
int Insert_a_record(Student stud[],int n) /插入一条记录/
{char x[10]; /清除多余输入所用/
printf("\t\t\tstudent's num:"); /交互式输入/
scanf("\t\t\t%s",stud[n]num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n]name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n]score);
gets(x);
n++;
Sort_by_num(stud,n); /调用排序函数/
printf("\t\t\tInsert Successed!\n"); /返回成功信息/
return(n);
}
int Delete_a_record(Student stud[],int n) /按姓名查找,删除一条记录/
{ char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /交互式问寻/
scanf("%s",s);
while(strcmp(stud[i]name,s)!=0&&i<n) i++; /查找判断/
if(i==n)
{ printf("\t\t\tnot find!\n"); /返回失败信息/
return(n);
}
for(j=i;j<n-1;j++) /删除 *** 作/
{
strcpy(stud[j]num,stud[j+1]num);
strcpy(stud[j]name,stud[j+1]name);
stud[j]score=stud[j+1]score;
}
printf("\t\t\tDelete Successed!\n"); /返回成功信息/
return(n-1);
}
void Query_a_record(Student stud[],int n) /查找并显示一个记录/
{ char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /交互式输入/
scanf("\t\t\t%s",s);
while(strcmp(stud[i]name,s)!=0&&i<n) i++; /查找判断/
if(i==n)
{ printf("\t\t\tnot find!\n"); /输入失败信息/
return;
}
printf("\t\t\this(her) number:%s\n",stud[i]num); /输出该学生信息/
printf("\t\t\this(her) score:%d\n",stud[i]score);
}
void Statistic(Student stud[],int n) /新增功能,输出统计信息/
{ int i,j=0,k=0,sum=0;
float aver; /成绩平均值/
for(i=0;i<n;i++) /循环输入判断/
{
sum+=stud[i]score;
if(stud[j]score>stud[i]score) j=i;
if(stud[k]score<stud[i]score) k=i;
}
aver=10sum/n;
printf("\t\t\tthere are %d records\n",n); /总共记录数/
printf("\t\t\tthe hignest score:\n"); /最高分/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j]num,stud[j]name,stud[j]score);
printf("\t\t\tthe lowest score:\n"); /最低分/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k]num,stud[k]name,stud[k]score);
printf("\t\t\tthe average score is %52f\n",aver); /平均分/
}
int AddfromText(Student stud[],int n) /从文件中读入数据/
{ int i=0,num;
FILE fp; /定义文件指针/
char filename[20]; /定义文件名/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /输入文件名/
if((fp=fopen(filename,"rb"))==NULL) /打开文件/
{ printf("\t\t\tcann't open the file\n"); /打开失败信息/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",&num); /读入总记录量/
while(i<num) /循环读入数据/
{
fscanf(fp,"%s%s%d",stud[n+i]num,stud[n+i]name,&stud[n+i]score);
i++;
}
n+=num;
fclose(fp); /关闭文件/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /将所有记录写入文件/
{
int i=0;
FILE fp; /定义文件指针/
char filename[20]; /定义文件名/
printf("\t\t\tWrite Records to a Text File\n"); /输入文件名/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /打开文件/
{
printf("\t\t\tcann't open the file\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /循环写入数据/
while(i<n)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i]num,stud[i]name,stud[i]score);
i++;
}
fclose(fp); /关闭文件/
printf("Successed!\n"); /返回成功信息/
}
void main() /主函数/
{
int n=0;
for(;;)
{
switch(menu_select()) /选择判断/
{
case 1:
printf("\t\t\tInput Records\n"); /输入若干条记录/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /显示所有记录/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /按学号排序/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /插入一条记录/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /按姓名查找,删除一条记录/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /查找并显示一个记录/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /新增功能,输出统计信息/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\tAdd Records from a Text File\n");
n=AddfromText(stu,n); /新增功能,输出统计信息/
break;
case 9:
printf("\t\t\tWrite to a Text file\n");
WritetoText(stu,n); /循环写入数据/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /结束程序/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}
四、函数调用关系图
注:“→”代表调用
Input函数
打印链表记录
Display函数
输入若干条记录
menu_select()函数
选择菜单
Sort_by_num函数
显示所有记录
Delete_a_record函数
按姓名查找,删除一条记录
Query_a_record查找并显示一条记录
Statistic函数
输出统计信息 (新增)
AddfromText函数
从正文中添加数据到结构体数组中
Main函数
Insert_a_record插入一条记录
WritetoText函数 将所有数据写入文件中
退出程序
Reverse(head)函数
按学号排序
五、设计测试流程
1、进入界面
2、输入选项1,回车;
按提示输入数据:
3、回到主菜单;
输入选项7,回车;
输入文件名:datatxt,回车;
出现成功提示,则读入文件 *** 作成功。
4、回到主菜单,输入2,回车
每10个暂停显示数据
5、回到主菜单,输入3,回车
出现排序成功信息。
6、回到主菜单,输入4,回车
按提示插入一组数据
7、回到主菜单,输入5,回车
按提示输入姓名,删除数据
出现删除成功的信息
8、回到主菜单,输入6,回车
输入姓名进行查询
9、回到主菜单,输入7,回车
出现统计信息
10、回到主菜单,输入9,回车
输入resulttxt,回车
出现成功写入文件的信息
11、回到主菜单,输入0,回车退出系统
回答者:kingkey001 - 试用期 一级 7-14 22:38
修改答复: kingkey001,您要修改的答复如下: 积分规则 关闭
C语言课程设计报告-------学生成绩简单管理程序
一、系统菜单的主要功能
(1)输入若干条记录
(2)显示所有记录
(3)按学号排序
(4)插入一条记录
(5)按姓名查找,删除一条记录
(6)查找并显示一条记录
(7)输出统计信息 (新增)
(8)从正文中添加数据到结构体数组中
(9)将所有数据写入文件中
(0)退出程序
二、题目分析
该题主要考察学生对结构体,指针,文件的 *** 作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明:
功能1和4的算法相似,输入一条记录到结构体中去,其中有一部很关键,就是通过gets将所有的多余的字符,回车读去,否则就会出错。
功能2是显示所有的记录,通过循环输出,格式也比较重要。
功能3为按学号排序,因为学号定义成了字符数组的形式,因此在运用冒泡法进行排序的时候,要用到strcmp,strcpy等函数。
功能5为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。
功能6的算法在5中就已经体现了,输入姓名,一一比较。
功能7为新增的功能,因为考虑到原来给出的函数中竟然没有对学生成绩的统计功能,因此新增此功能,可以得出所有的记录个数,最高、最低、平均分,并输出相关的学生信息等。
功能8和9是对文件的 *** 作,提前准备好数据。
三、程序正文部分
#include /引用库函数/
#include
#include
#include
typedef struct /定义结构体数组/
{
char num[10]; /学号/
char name[20]; /姓名/
int score; /成绩/
}Student;
Student stu[80]; /结构体数组变量/
int menu_select() /菜单函数/
{
char c;
do{
system("cls"); /运行前清屏/
printf("\t\tStudents' Grade Management System\n"); /菜单选择/
printf("\t\t | 1 Input Records |\n");
printf("\t\t | 2 Display All Records |\n");
printf("\t\t | 3 Sort |\n");
printf("\t\t | 4 Insert a Record |\n");
printf("\t\t | 5 Delete a Record |\n");
printf("\t\t | 6 Query |\n");
printf("\t\t | 7 Statistic |\n");
printf("\t\t | 8 Add Records from a Text File|\n");
printf("\t\t | 9 Write to a Text file |\n");
printf("\t\t | 0 Quit |\n");
printf("\t\t\n");
printf("\t\t\tGive your Choice(0-9):");
c=getchar(); /读入选择/
}while(c'9');
return(c-'0'); /返回选择/
}
int Input(Student stud[],int n) /输入若干条记录/
{int i=0;
char sign,x[10]; /x[10]为清除多余的数据所用/
while(sign!='n'&&sign!='N') /判断/
{ printf("\t\t\tstudent's num:"); /交互输入/
scanf("\t\t\t%s",stud[n+i]num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n+i]name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n+i]score);
gets(x); /清除多余的输入/
printf("\t\t\tany more records(Y/N)");
scanf("\t\t\t%c",&sign); /输入判断/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /显示所有记录/
{
int i;
printf("\t\t\t-----------------------------------\n"); /格式头/
printf("\t\t\tnumber name score\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++) /循环输入/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1]num,stud[i-1]name,stud[i-1]score);
if(i>1&&i%10==0) /每十个暂停/
{printf("\t\t\t-----------------------------------\n"); /格式/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_num(Student stud[],int n) /按学号排序/
{ int i,j,p,q,s;
char t[10];
for(i=0;i<n-1;i++) /冒泡法排序/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j]num,stud[j+1]num)>0)
{strcpy(t,stud[j+1]num);
strcpy(stud[j+1]num,stud[j]num);
strcpy(stud[j]num,t);
strcpy(t,stud[j+1]name);
strcpy(stud[j+1]name,stud[j]name);
strcpy(stud[j]name,t);
p=&stud[j+1]score;
q=&stud[j]score;
s=p;
p=q;
q=s;
}
}
int Insert_a_record(Student stud[],int n) /插入一条记录/
{char x[10]; /清除多余输入所用/
printf("\t\t\tstudent's num:"); /交互式输入/
scanf("\t\t\t%s",stud[n]num);
printf("\t\t\tstudent's name:");
scanf("\t\t\t%s",stud[n]name);
printf("\t\t\tstudent's score:");
scanf("\t\t\t%d",&stud[n]score);
gets(x);
n++;
Sort_by_num(stud,n); /调用排序函数/
printf("\t\t\tInsert Successed!\n"); /返回成功信息/
return(n);
}
int Delete_a_record(Student stud[],int n) /按姓名查找,删除一条记录/
{ char s[20];
int i=0,j;
printf("\t\t\ttell me his(her) name:"); /交互式问寻/
scanf("%s",s);
while(strcmp(stud[i]name,s)!=0&&i<n) i++; /查找判断/
if(i==n)
{ printf("\t\t\tnot find!\n"); /返回失败信息/
return(n);
}
for(j=i;j<n-1;j++) /删除 *** 作/
{
strcpy(stud[j]num,stud[j+1]num);
strcpy(stud[j]name,stud[j+1]name);
stud[j]score=stud[j+1]score;
}
printf("\t\t\tDelete Successed!\n"); /返回成功信息/
return(n-1);
}
void Query_a_record(Student stud[],int n) /查找并显示一个记录/
{ char s[20];
int i=0;
printf("\t\t\tinput his(her) name:"); /交互式输入/
scanf("\t\t\t%s",s);
while(strcmp(stud[i]name,s)!=0&&i<n) i++; /查找判断/
if(i==n)
{ printf("\t\t\tnot find!\n"); /输入失败信息/
return;
}
printf("\t\t\this(her) number:%s\n",stud[i]num); /输出该学生信息/
printf("\t\t\this(her) score:%d\n",stud[i]score);
}
void Statistic(Student stud[],int n) /新增功能,输出统计信息/
{ int i,j=0,k=0,sum=0;
float aver; /成绩平均值/
for(i=0;i<n;i++) /循环输入判断/
{
sum+=stud[i]score;
if(stud[j]score>stud[i]score) j=i;
if(stud[k]score<stud[i]score) k=i;
}
aver=10sum/n;
printf("\t\t\tthere are %d records\n",n); /总共记录数/
printf("\t\t\tthe hignest score:\n"); /最高分/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j]num,stud[j]name,stud[j]score);
printf("\t\t\tthe lowest score:\n"); /最低分/
printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k]num,stud[k]name,stud[k]score);
printf("\t\t\tthe average score is %52f\n",aver); /平均分/
}
int AddfromText(Student stud[],int n) /从文件中读入数据/
{ int i=0,num;
FILE fp; /定义文件指针/
char filename[20]; /定义文件名/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /输入文件名/
if((fp=fopen(filename,"rb"))==NULL) /打开文件/
{ printf("\t\t\tcann't open the file\n"); /打开失败信息/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",&num); /读入总记录量/
while(i<num) /循环读入数据/
{
fscanf(fp,"%s%s%d",stud[n+i]num,stud[n+i]name,&stud[n+i]score);
i++;
}
n+=num;
fclose(fp); /关闭文件/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /将所有记录写入文件/
{
int i=0;
FILE fp; /定义文件指针/
char filename[20]; /定义文件名/
printf("\t\t\tWrite Records to a Text File\n"); /输入文件名/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /打开文件/
{
printf("\t\t\tcann't open the file\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /循环写入数据/
while(i<n)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i]num,stud[i]name,stud[i]score);
i++;
}
fclose(fp); /关闭文件/
printf("Successed!\n"); /返回成功信息/
}
void main() /主函数/
{
int n=0;
for(;;)
{
switch(menu_select()) /选择判断/
{
case 1:
printf("\t\t\tInput Records\n"); /输入若干条记录/
n=Input(stu,n);
break;
case 2:
printf("\t\t\tDisplay All Records\n"); /显示所有记录/
Display(stu,n);
break;
case 3:
printf("\t\t\tSort\n");
Sort_by_num(stu,n); /按学号排序/
printf("\t\t\tSort Suceessed!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\tInsert a Record\n");
n=Insert_a_record(stu,n); /插入一条记录/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\tDelete a Record\n");
n=Delete_a_record(stu,n); /按姓名查找,删除一条记录/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\tQuery\n");
Query_a_record(stu,n); /查找并显示一个记录/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\t\t\tStatistic\n");
Statistic(stu,n); /新增功能,输出统计信息/
printf("\t\t\t");
不用宏,也不用数据有效性,可以换个思路,用定义名称的方法设置函数的选择。
1、用快捷键Ctrl+F3,调试出定义名称栏,新建一个名称,如“公式一”,在下方输入公式,这里需要把据对引用符号,即$去掉,变成相对引用,点击关闭,重复再定义“公式二”、“公式三”等自己需要的函数表达式,
2、在需要输入公式的单元格中输入“公式”、或“公”字时,就会出现名称选择框,就可以在选择框内选择自己需要的函数式,
3、这里需要注意的是名称定义用的是相对引用,就是说引用的单元格要有一定的规律,在定义名称的时候,函数式引用的单元格与要计算的单元格的规律一致,如引用在B1输入定义名称”公式一,定义函数式为if(A1=“”,0,""),引用名称时在B输入公式一时,函数式为if(A2=“”,0,""),这跟用下拉填充函数的形式一样。
4、对于长度偏长,或不能用下拉复制公式的方法复制,都可以用定义名称的方法来使用。定义名可以使IF函数突破局限,也可以是表达式更加直观的表达出计算所用到的数据(将数据函数定义一个相关的名称)。
5、对于你提问的问题,可以这样设置,定义名称“0#柴油”、“93#汽油”、“97#汽油”,分别公式设置为=A1/1205;=A1/1370;=A1/1346;这里A1代表数据所在的单元格,定义完毕后,就可以在单元格中输入“0#柴油”、“93#汽油”、“97#汽油”,对应引用相关公式。
你所说的多级菜单是不是在输入数据时,使用数据有效性里的序列功能,在需要输入重复数据的地方改变为从下拉菜单中选择数据?
如果是这个多级菜单的话,根本不用弄这么多辅助单元格,可以像制作一级菜单一样,在序列内容里填入一个长一点的复杂公式就能完成了。
给你一个简单的菜单程序吧。其中的子函数,填充成楼主所需即可。
#include
/子函数1/
fun1() {
printf ("子函数1\n");
}
/子函数2/
fun2() {
printf ("子函数2\n");
}
/子函数3/
fun3() {
printf ("子函数3\n");
}
/子函数4/
fun4() {
printf ("子函数4\n");
}
int main(void) {
int key; /命令编号/
do {
system("cls"); /清屏/
/打印菜单/
printf ("======================================================\n");
printf (" #\t功能详情\n");
printf ("------------------------------------------------------\n");
printf (" 1\t功能1\n");
printf (" 2\t功能2\n");
printf (" 3\t功能3\n");
printf (" 4\t功能4\n");
printf (" 5\t退出\n");
printf ("======================================================\n");
printf ("\n");
printf("请输入命令编号以开启 *** 作:");
/输入命令编号/
scanf("%d",&key);
printf ("\n");
/switch函数实现输入功能序号执行相应函数/
switch (key) {
case 1: fun1(); break; /子函数1/
case 2: fun2(); break; /子函数2/
case 3: fun3(); break; /子函数3/
case 4: fun4(); break; /子函数4/
case 5: printf("程序结束!按任意键退出\n\n"); break;
default:printf("输入错误,请重新输入!\n\n"); break;
}
/屏幕暂留/
if (key!=5) {
printf ("\n");
printf("按Enter键继续\n");
printf ("\n");
fflush(stdin);
getch ();
}
} while (key!=5);
/屏幕暂留/
fflush(stdin);
getch ();
return 0;
}运行结果
#include <iostreamh> // cin 及 cout
#include <stdlibh>
#include <malloch> // 用到申请内存函数 malloc() 和释放内存函数 free()
#include <stringh> // 字符串处理
#include <stdioh> // 文件 *** 作(读文件)
struct address /家庭地址/
{
char city[10]; /城市/
char town[10]; /县城/
char village[10]; /乡镇/
};
struct telephone /****/
{
char SJ[50]; /手机/
char JD[30]; /家庭电话/
char XD[30]; /学校电话/
};
struct person /个人信息/
{
char name[20]; /名字/
char sex[10] ; /性别/
char MZ[16]; /民族/
char GJ[17]; /国籍/
char XL[19]; /学历/
};
struct score //成绩
{
char num[20]; //学号
char english[20];
char chinese[20];
char math[20];
char physics[20];
};
typedef struct linknode //定义节点的类型
{
char address[100]; //地址
char birthday[100]; //出生日期
struct score sc; //成绩
struct person pe; //个人信息
struct telephone te; //****
bool flag;
struct linknode next;
}nodetype;
class List
{
nodetype head;
public:
List();
List::~List();
linknode creatlist(int); //创建链表
int listlen(); //返回链表长度
nodetype findnode(int); //通过查找序号返回节点的指针
nodetype find(char c[]); //通过查找姓名返回节点的指针
int find2(char c[]); //通过查找姓名返回节点的序号
nodetype insnode(int); //插入节点
void delnode(int); //删除节点
nodetype load(); //初始化:从外部读入数据
void readstr(FILE f,char string); //读行函数
bool check(char a, char b); //对比两个字符串是否相等
void help(); //显示帮助菜单
void editperson(nodetype); //编辑个人说明
void editscore(nodetype); //编辑学科成绩
void edittelephone(nodetype); //编辑****
void dispname(); //显示所有学生姓名
void dispnode(nodetype p); //显示一个学生的所有信息
void dispperson(nodetype); //显示一个学生的个人说明
void dispscore(nodetype); //显示一个学生的学科成绩
void disptelephone(nodetype); //显示一个学生的****
};
bool List::check(char a, char b) //对比两个字符串是否相等
{
int i;
int j=strlen(b);
for(i=0; i<j; i++)
{
if(a==b)
{
a++;
b++;
}
else
return 0;
}
return 1;
}
nodetype List::creatlist (int n) //创建链表
{
nodetype h=NULL, s, t;
int i=1;
for(int j=0; j<n; j++)
{
if(i==1) //创建第一个节点
{
h=(nodetype)malloc(sizeof(nodetype));
h->next=NULL;
t=h;
}
else //创建其余节点
{
s=(nodetype)malloc(sizeof(nodetype));
s->next=NULL;
t->next=s;
t=s; //t 始终指向生成的单链表的最后一个节点
}
i++;
}
head=h;
return h;
}
void List::readstr(FILE f,char string)
{
do
{
//①: 先读入一行文本
fgets(string, 255, f); //fgets(): 从文件 f 读入长度为 255-1 的字符串
// 并存入到 string 中
} while ((string[0] == '/') || (string[0] == '\n'));
return;
}
nodetype List::load()
{
FILE fp;
nodetype p;
char c[255];
int num;
if((fp=fopen("studenttxt", "r"))==NULL)
{
cout<<"打开文件失败"<<endl;
return 0;
}
readstr(fp, c);
sscanf(c, "The Length Of Link: %d", &num); //获取链表长度
p=creatlist(num); //创建链表
for(int i=0; i<num; i++)
{
readstr(fp, c);
strcpy(p->address, c);
readstr(fp, c);
strcpy(p->birthday, c);
readstr(fp, c);
strcpy(p->scnum, c);
readstr(fp, c);
strcpy(p->scchinese, c);
readstr(fp, c);
strcpy(p->scenglish, c);
readstr(fp, c);
strcpy(p->scmath, c);
readstr(fp, c);
strcpy(p->scphysics, c);
readstr(fp, c);
strcpy(p->pename, c);
readstr(fp, c);
strcpy(p->pesex, c);
readstr(fp, c);
strcpy(p->peGJ, c);
readstr(fp, c);
strcpy(p->peMZ, c);
readstr(fp, c);
strcpy(p->peXL, c);
readstr(fp, c);
strcpy(p->teSJ, c);
readstr(fp, c);
strcpy(p->teJD, c);
readstr(fp, c);
strcpy(p->teXD, c);
p=p->next;
}
fclose(fp);
return p;
}
void List::dispnode(nodetype p) //显示一个学生的所有信息
{
if(p!=NULL)
{
dispperson(p);
dispscore(p);
disptelephone(p);
}
}
void List::dispname() //显示所有学生姓名
{
nodetype p=head;
cout<<"现有的学生: "<<endl;
if(p==NULL)
cout<<"没有任何学生数据"<<endl;
while(p!=NULL)
{
cout<<"姓名: "<<p->pename;
p=p->next;
}
}
int List::listlen() //返回链表长度
{
int i=0;
nodetype p=head;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
nodetype List::findnode (int i) //通过查找序号返回节点的指针
{
nodetype p=head;
int j=1;
if( i>listlen()||i<=0 ) // i 上溢或下溢
return NULL;
else
{
while( p!=NULL && j<i ) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return p;
}
}
nodetype List::find(char c[]) //通过查找姓名返回节点的指针
{
nodetype p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pename))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return p;
}
int List::find2(char c[]) //通过查找姓名返回节点的序号
{
nodetype p=head;
int j=1;
strcat(c, "\n"); //从外部读入的字符串末尾都带了一个换行符
while( p!=NULL && !(check(c, p->pename))) //查找第 i 个节点并由 p 指向该节点
{
j++;
p=p->next;
}
return j;
}
nodetype List::insnode(int i)
{
nodetype h=head, p, s;
s=(nodetype)malloc(sizeof(nodetype)); //创建节点 s
s->next=NULL;
if(i==0) //i=0 时 s 作为该单链表的第一个节点
{
s->next = h;
h=s; //重新定义头节点
}
else
{
p=findnode(i); //查找第 i 个节点,并由 p 指向该节点
if(p!=NULL)
{
s->next=p->next;
p->next=s;
}
else cout<<"输入的 i 值不正确"<<endl;
}
head=h;
return s;
}
void List::delnode(int i) //删除第 i 个节点
{
nodetype h=head, p=head, s;
int j=1;
if(i==1) //删除第一个节点
{
h=h->next;
free(p);
}
else
{
p=findnode(i-1); //查找第 i-1 个节点,并由 p 指向这个节点
if(p!=NULL && p->next!=NULL)
{
s=p->next; // s 指向要删除的节点
p->next=s->next;
free(s);
}
else
cout<<"输入的 i 值不正确"<<endl;
}
head=h;
}
void List::editperson(nodetype p)
{
char c[100];
cout<<"请输入姓名: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pename, c);
cout<<"请输入性别:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->pesex, c);
cout<<"请输入生日(格式举例:1982-1-1): "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->birthday, c);
cout<<"请输入民族:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->peMZ, c);
cout<<"请输入国籍:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->peGJ, c);
cout<<"请输入学历:"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->peXL, c);
cout<<"请输入家庭住址(例如:广西玉林市解放路11号)"<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->address, c);
cout<<"编辑个人信息完成!"<<endl;
dispperson(p);
}
void List::editscore(nodetype p)
{
char a[50];
cout<<"请输入学号: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->scnum, a);
cout<<"请输入语文成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->scchinese, a);
cout<<"请输入英语成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->scenglish, a);
cout<<"请输入数学成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->scmath, a);
cout<<"请输入物理成绩: "<<endl;
cin>>a;
strcat(a, "\n");
strcpy(p->scphysics, a);
cout<<"编辑学科成绩完成!"<<endl;
dispscore(p);
}
void List::edittelephone(nodetype p)
{
char c[50];
cout<<"请输入手机号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->teSJ, c);
cout<<"请输入家庭电话号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->teJD, c);
cout<<"请输入学校电话号码: "<<endl;
cin>>c;
strcat(c, "\n");
strcpy(p->teXD, c);
cout<<"编辑****完成!"<<endl;
disptelephone(p);
}
void List::dispperson(nodetype p)
{
cout<<"姓名: "<<p->pename;
cout<<"性别: "<<p->pesex;
cout<<"民族: "<<p->peMZ;
cout<<"国籍: "<<p->peGJ;
cout<<"学历: "<<p->peXL;
cout<<"出生日期: "<<p->birthday;
cout<<"家庭住址: "<<p->address;
}
void List::dispscore(nodetype p)
{
cout<<"学号: "<<p->scnum;
cout<<"语文成绩: "<<p->scchinese;
cout<<"英语成绩: "<<p->scenglish;
cout<<"数学成绩: "<<p->scmath;
cout<<"物理成绩: "<<p->scphysics;
}
void List::disptelephone(nodetype p)
{
cout<<"手机号码是: "<<p->teSJ;
cout<<"家庭电话是: "<<p->teJD;
cout<<"学校电话是: "<<p->teXD;
}
void List::help()
{
cout<<endl<<endl;
cout<<""<<endl;
cout<<"1: 编辑个人信息"<<endl;
cout<<"2: 编辑学科成绩"<<endl;
cout<<"3: 编辑****"<<endl;
cout<<"4: 显示个人信息"<<endl;
cout<<"5: 显示学科成绩"<<endl;
cout<<"6: 显示****"<<endl;
cout<<"7: 显示该学生所有信息"<<endl;
cout<<"8: 帮助菜单"<<endl;
cout<<"9: 返回上一级菜单"<<endl;
cout<<""<<endl;
}
List::~List()
{
nodetype pa=head, pb;
if(pa!=NULL)
{
pb=pa->next;
if(pb==NULL)
free(pa);
else
{
while(pb!=NULL)
{
free(pa);
pa=pb;
pb=pb->next;
}
free(pa);
}
}
}
class Operater
{
List L1;
public:
void Loop(); //主循环
void display(); //显示菜单
};
List::List()
{
head = NULL;
}
void Operater::display()
{
cout<<endl<<endl;
cout<<" 学生管理系统 "<<endl;
cout<<"1: 添加一个学生信息"<<endl;
cout<<"2: 删除一个学生信息"<<endl;
cout<<"3: 显示所有学生的姓名"<<endl;
cout<<"4: 根据姓名显示单个学生所有信息"<<endl;
cout<<"5: 根据姓名对单个学生进行编辑"<<endl;
cout<<"6: 帮助菜单"<<endl;
cout<<"7: 保存数据"<<endl;
cout<<"0: 退出系统"<<endl;
cout<<""<<endl;
}
void Operater::Loop()
{
List L1; //List 对象
char ch[20];
nodetype p, head;
int i; //存放节点序号
p=L1load(); //初始化:从外部读入数据创建链表
head=p;
display();
while(1)
{
cout<<endl<<endl;
cout<<"请输入选择(帮助选项--> 6 ): "<<endl;
cin>>ch;
////system("cls");
if(L1check(ch, "1"))
{
p=L1insnode(0);
head=p;
//system("cls");
cout<<endl;
cout<<" 添加一个学生信息 "<<endl;
cout<<"下面输入个人信息: "<<endl;
L1editperson(p);
cout<<"下面输入学科成绩: "<<endl;
L1editscore(p);
cout<<"下面输入****: "<<endl;
L1edittelephone(p);
}
if(L1check(ch, "2"))
{
//system("cls");
cout<<endl;
cout<<" 删除一个学生信息 "<<endl;
L1dispname();
cout<<"请输入学生姓名: "<<endl;
cin>>ch;
i=L1find2(ch);
L1delnode(i);
}
if(L1check(ch, "3"))
{
//system("cls");
cout<<endl;
cout<<" 显示所有学生姓名 "<<endl;
L1dispname();
}
if(L1check(ch, "4"))
{
//system("cls");
cout<<endl;
cout<<" 根据姓名显示单个学生所有信息 "<<endl;
L1dispname();
cout<<"请输入学生姓名: "<<endl;
cin>>ch;
p=L1find(ch);
L1dispnode(p);
}
if(L1check(ch, "6"))
{
display();
}
if(L1check(ch, "7")) //保存数据
{
FILE fp;
if((fp=fopen("studenttxt", "w"))==NULL)
{
cout<<"打开文件失败"<<endl;
return;
}
int i;
char t[255];
//将 L1listlen() 赋予字符串中的数字
sprintf(t, "The Length Of Link: %d\n", L1listlen());
fputs(t, fp);
strcpy(t, "\n");
fputs(t, fp);
p=L1findnode(1); //将链表头指针赋予 p
for(i=0; i<L1listlen(); i++)
{
fputs(p->address, fp); //输出地址
fputs(p->birthday, fp); //输出生日
fputs(p->scnum, fp); //输出学号
fputs(p->scchinese, fp); //输出语文成绩
fputs(p->scenglish, fp); //输出英语成绩
fputs(p->scmath, fp); //输出数学成绩
fputs(p->scphysics, fp); //输出物理成绩
fputs(p->pename, fp); //输出姓名
fputs(p->pesex, fp); //输出性别
fputs(p->peGJ, fp); //输出国籍
fputs(p->peMZ, fp); //输出民族
fputs(p->peXL, fp); //输出学历
fputs(p->teSJ, fp); //输出手机
fputs(p->teJD, fp); //输出家庭电话
fputs(p->teXD, fp); //输出学校电话
fputs(t, fp);
p=p->next;
}
p=head;
fclose(fp);
}
if(L1check(ch, "5"))
{
char c[20];
//system("cls");
cout<<endl;
cout<<" 根据姓名对单个学生进行编辑 "<<endl;
L1dispname();
cout<<"请输入学生姓名: "<<endl;
cin>>c;
p=L1find(c);
//system("cls");
cout<<endl<<endl;
cout<<""<<endl;
cout<<"1: 编辑个人信息"<<endl;
cout<<"2: 编辑学科成绩"<<endl;
cout<<"3: 编辑****"<<endl;
cout<<"4: 显示个人信息"<<endl;
cout<<"5: 显示学科成绩"<<endl;
cout<<"6: 显示****"<<endl;
cout<<"7: 显示该学生所有信息"<<endl;
cout<<"8: 帮助菜单"<<endl;
cout<<"9: 返回上一级菜单"<<endl;
cout<<""<<endl;
while(1)
{
cout<<endl<<endl;
cout<<"请输入选择(帮助选项--> 8 ): "<<endl;
cin>>c;
//system("cls");
if(L1check(c, "1"))
{
//system("cls");
cout<<endl;
cout<<" 编辑个人信息 "<<endl;
L1editperson(p);
}
else if(L1check(c, "2"))
{
//system("cls");
cout<<endl;
cout<<" 编辑学科成绩 "<<endl;
L1editscore(p);
}
else if(L1check(c, "3"))
{
//system("cls");
cout<<endl;
cout<<" 编辑**** "<<endl;
L1edittelephone(p);
}
else if(L1check(c, "4"))
{
//system("cls");
cout<<endl;
cout<<" 显示个人信息 "<<endl;
L1dispperson(p);
}
else if(L1check(c, "5"))
{
//system("cls");
cout<<endl;
cout<<" 显示学科成绩 "<<endl;
L1dispscore(p);
}
else if(L1check(c, "6"))
{
//system("cls");
cout<<endl;
cout<<" 显示**** "<<endl;
L1disptelephone(p);
}
else if(L1check(c, "7"))
{
//system("cls");
L1dispnode(p);
}
else if(L1check(c, "8"))
{
//system("cls");
L1help();
}
else if(L1check(c, "9"))
{
display();
break; //用 break 跳出本循环,不要用 return ,return 是退出程序
}
}
}
else if(L1check(ch, "0"))
return;
}
return;
}
int main()
{
system("color 3A");
Operater chp;
chpLoop();
return 0;
}
绝对可以用的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)