excel利用函数的多层下拉菜单的设置?

excel利用函数的多层下拉菜单的设置?,第1张

“非数据验证+=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;

}

绝对可以用的

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12180728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存