




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学生信息管理程序
一、设计目的:
使用结构体数组结构实现简单的学生信息管理功能,要
求具有数据输入、数据输出、数组排序、兀索插入、兀
素删除、查询信息等功能。程序最多容纳60名学生的
记录。
二、设计要求:
1、intInput(void);〃使用程序中一个空白结构体,输入一名
学生的个人及学习信息信息。此功能区返回一个值记录程序存
储学生记录的数量*/
2、voidChange_record(void);〃修改学生的记录选项。
voidDeleterecord(void);〃删除学生记录选项。
4、voidSortjecord(void);〃根据学生某项信息排序学生记
录选项。
5^voidQueryrecord(void);〃查询学生记录选项。
voidDisplay(void);〃显示出当前程序存储的所有学生信
息选项。
7、voidAdd_from_text(inte);〃从文本中提取学生记录输入
程序进行处理。
8、voidWritetotext(void);〃将当前程序中存储的学生记
录写入一个文本文件中。
9、voidEnding(void);〃退出选项。
三、总体设计:
1、主函数模块:
主函数设计较为简单,主要是使用switch语句通
过选择结构将整个程序能够实现的功能提示用户选择。
主函数代码:
intmain(void)〃对主函数的定case1:
义。Input(n);〃插入学
{生记录函数。
n=0;for(i=0,n=0;i
for(i=0;i<N;i++)<N;i++)
((
strcpy(stu[i].name,if
(stu[i].num!=U)
stu[i].num=0;n++;
stu[i].score=0;)
)break;
for(;;)〃通过for语句实现case2:
使用户自由决定是否重复使用此程ChangerecordO;//
序。修改学生的记录函数。
(break;
switchcase3:
(\lenu_selectl())//使用switch语句Delete_record()://
调用用户指定菜单项对应的函数。删除学生记录函数。
break;
case4:break;
Sortrecord。;〃排case7:
序函数。printf("请输入文件
break;的路径:〃);
case5:scanf("s”,nameO)
Query_rccord();//printf(〃请输入此文
查询函数。本中有多少名学生的记录:〃);
break;scanf("%d",&j);
case6:
DispalyO;〃展示函
数。
Add_from_text(j,nameO);〃从文本中添加学生记录的函数。
n+=j;
break;case9:〃结束程序使用
case8:界面选项。
printf(”请输入文件Ending();
的路径:〃);break;
scanfnameO);cefault:
Write_to_tpxt();//centinui?;〃菜单循
将学生记录写入文本的函数。环显示。
break;)
system(〃c1s〃);序运行窗口闪退。
)return0;
system(^pause^);〃防止程)
2、菜单模块:
菜单模块包括主菜单和部分功能中要调用的附属菜
单,作用是向用户说明其输入的选择信息将使程序实现什么
3、功能模块
功能模块的设计就是通过编写多个的函数对应程
序所要求实现的功能。函数在主函数中将被编号,使用户向
程序输入的编号就能调用相应的函数体现程序的功能。
四、详细设计及源代码:
#include<stdio.h>
#include<windows.h〉〃提供system();语句。
#include<slrii电.h>〃提供strleu()函数。
^defineN60〃定义全局常量N作为结构体数组stu口下标。
intb,c,numO,n,i=0,j=0;
charname0[40];/*将程序中多次定义的标识符设置为全局变量。*/
structstudent
{
charname[40];
intnum;
intscore;
}stu[N];
intMenuselectl(void);
intMenuselect2(void);
intMenu_select3(void);
intMenuselectd(void);
intMenuselect5(void);
intMenu_select6(void);
intMenuselect?(void);
intMenu_select8(void);
intMenu_select9(void);〃声明程序中用到的多种菜单函数。
structstudent*pointl,*point2;〃全局定义程序中多次用到得结构体指针变
量。
int(*pot2)(void)=Menu_select2:
int(*pot4)(void)=Mcnu_select4;
int(*pot6)(void)=Menu_select6;
int(*pot8)(void)=Menu_select8;〃定义指向菜单pK数的指针。
intjudgement(void);
intjudgement_small(void);〃声明程序要调用的两个判断特殊情况的函数。
FILE*fp;〃定义指向文件型数据的指针变量。
voidChangeservice(void);
voidQuery_service(void);
voidDelete_service(void):
void(*serl)(void)=Changeservice;
void(*ser2)(void)=Deleteservice;
void(*ser3)(void)=Query_scrvice;〃定义指向在有特定功能的函数内部使用
的函数的指针。
voidSortservicel(intpo);
voidSort_service2(intpo);〃声明两个在有排序功能的函数中腰使用的函数。
voidswap(structstudent*pol,structstudent*po2);〃对交换函数的声明。
voidEnding(void);〃对有结束功能的函数的声明。
voidfind(int(*p)(void),void(*q)(void));〃对一个形参是指向函数的指针
的函数的声明。
voidInput(intn)〃对有插入学生记录功能的函数的定义。
{
printf(〃请输入学生姓名:〃);
scanf&stu[n].name);
printf(〃请输入学生序号:〃);
stu[n].num=judgement();
printf(〃请输入学生信息:〃);
scanf&stu[n].score);
system(〃cls〃);〃此语句执行后将清除运行窗口显示的结果。
)
VOidChangp_rpcord(vcid)〃对■有修改学生记录功能的函数的定义。
find(pot2,serl);〃在函数内部调用函数。
)
voidDelete_record(void)〃对有删除学生记录功能的函数的定义。
{
find(pot4,ser2);
(
voidSort_record(void)〃对有排序学生记录功能的匣数的定义。
{
j=Menu_select8();〃通过菜单函数的返回值提供用户的选择信息来执行
用户选定的功能
for(;judgement_smal1()>0;)〃for语句中的判断用判断函数处理后以
提示是否输入错误。
(
if(j==1)
(
j=Menu_select9();
Sort_servicel(j);〃通过菜单函数的返回值作为另一个函数的实
参来执行用户选定的功能,
break;
)
elseif(j==2)
j=Menu_select9();
Sort_service2(j);
break;
)
else
continue;
)
}
voidQucry_rccord(void)〃对有查询学生记录功能的函数的定义。
{
find(pot6,ser3);
)
voidDispaly(void)〃对有显示全部学生记录功能的函数的定义。
(
for(i=0;i<n;i++)〃for语句打印出当时的所有学生记录。
(
printf("第%d位学生姓名为%s\n”,i+1,stu[i].name);
prinlf("班内序号为%d\n",stu[i].num);
printf("学习信息为%d\n'n”,stu[i].score);
)
system("pause");〃防止运行窗口闪退。
)
voidEnding(void)〃对有退出功能的函数的定义。
system(〃cls〃);
printff\n\t
亭亭5^C?jc?!c5|c?jc?jc?!c?jc?!c?jc?|c51c51c51c5}C51C5jC51c5j*55«5jc不5{C5fc*|C5!C?|C5|C?!C?jc\[)\n\\
);
printfC\n\t\t\t欢迎下次继续使用,再见!\n\n");
printf(〃\n\n\n\t
exit(O);〃正常退出程序。
}
voidAddfromtext(inte,charch)〃对有可从文本文件中提取学生记录的函
数的定义。
fp=fopen(nameO,"r");〃使指针指向文件。
if((fp=fopen(name。,"r〃))=NULL)〃判断指针所指向的文件是否存
在,不存在退出此函数。
printf(〃无法找到路径为%s的文本文件。\n〃,nameO);
system("pause");
return;
)
else〃存在则从此文件中提取学生记录。
(
for(i=n;i<(n+e+1);i++)
(
fscanf(fp,&stu[i].name,&stu[i].num,
&stu[i].score);
)
prinlf("已提取出文本文件名称为刎中的所有学生记录!\n",nameO);
system("pause");
}
fclose(fp);〃关闭文本文件,即指针fp不再指向任何文件。
)
voidWrite_to_text(void)〃对可将程序中存储并处理后的学生记录输出至一
个文本文件。
{
fp=fopen(nameO,〃w");〃使指针指向文件。
if((fp=foppn(namoO,,,w,/))==NULL)〃判断指针所指向的文件是否存
在,不存在退出此函数。
printf("无法找到名为%d的文本文件。\n",nameO);
system("pause");
return;
)
else〃存在则将程序中储存的学生记录写入该文件。
(
fprintf(fp,〃姓名\t\t\t\t\t*班内序号\t*学习信息*\n〃);
for(i=0;i<n;i++)
(
fprintf(fp,"%-40s*%T4d*%-5d*\n",stu[i].name,
stu[i].num,stu[i].score);
}
printf(〃已将学生记录存储入名称为%s的文件中!\n”,nameO);
system("pause");
)
fclose(fp);〃关闭文本文件,即指针fp不再指向任何文件。
}
voidChange_service(void)〃对在有修改学生记录功能的函数中要调用的函数
的定义。
chartempi[40];
inttomp2,temp3;
switch(Menu_select3())/*菜单函数的返回值用作switch语句的选择信息
(选择项较多用switch语句较少则用if语句)。*/
(
system("cis");
case1:
printf(〃此学生当前姓名为%s,请输入要修改后的名字;〃,
(*pointl).name);/*由于此函数作为实参
在find()函数被调
用,在调用前已经将寻找到得项的地址付给了全局指针变量point1*/
scanf("%s〃,tempi);
strcpy(pointl->name,tempi);
break;
case2:
printf(〃此学生当前序号为刎,请输入要修改后的序号二
(*pointl).num);
temp2=judgement();
(*pointl).num=temp2;
break:
case3:
prinlf(〃此学生当前信息为%d,请输入要修改后的信息;。
(*pointl).score);
scanf(,,%d,,»&temp3);
(*pointl).score=temp3;
break;
default:
break;
)
}
voidQuory_servic。(void)〃对在有查询学生记录功能的函数中要调用的函数
的定义。
{
switch(Menu_select7())〃同上,选择项较多用switch语句。
(
case1:
printf(〃此学生当前姓名为加,班级内序号为%d,学习信息为%d\n”,
pointl->name,pointl->num,
pointb>score);/*由于此函数作为实参在find()函数被调用,在其
内调用前已经将寻找到得项的地址付给了
全局指针变量point!*/
system("pause");
break;
case2:
printf(“此学生当前姓名为%乙\n",pointl->name);
system("pause");
break;
case3:
printf("此学生当前班内序号为%d。\n〃,pointl->num);
system("pause");
break;
case4:
prinlf(“此学生当前班内序号为%d。\n”,pointl->score);
system("pause");
default:
break;
}
)
voidDe1ete_service(void)〃对在有删除学生记录功能的函数中要调用的函数
的定义。
(
j=Meni.i_selec.t5():〃选择项较少用if语句。
if(j==1)
charsure;
printf(“此学生当前姓名为%$,班级内序号为%d,学习信息为%d\n〃,
pointl->name,pointl->num,
pointl->score);/*由于此函数作为实参在find()函数被调用,在其
内调用前已经将寻找到得项的地址付给了
全局指针变量pointl*/
printf(〃请按回车键确认您的操作!\n〃);
for(;;)
(
if(getchar(sure)=='\n')
(
point2=&stu[n-1];
swap(pointi,point2);
n-;
break;
)
}
systein("cls〃);
printf("删除记录成功,感谢使用!〃):
system("pause");
}/*这里删除一个学生的全部记录的实现方法是:锁定要删除的学生记录符
其地址赋给pointl,通过地址来
把此时存入得学生记录中最后一位的信息存入该名学生信息存储的位置,
然后清空最后一位学生的占用的结构体
数组元素并对程序中记录存入学生记录数量的全局变量n做减一处理*/
elseif(j=2)〃只删除一名学生的信息的功能。
(
pointl->score=0;〃指定学生信息清零。
)
else
system("pause");
)
voidSort_servicel(intpo)〃对在有排序学生记录功能的函数中要调用的第一
个函数的定义,即通过班内序号排序。
{
intm=judgementsinall();
if(po==1)〃成立做降序处理。
(
for(i=0;i<m;i++)
for(c=i+1;c<m+1;c++)
b=i;
if(stu[c].num>stu[b].num)
(
pointl=&stu[c];
point2=&stu[b];
b=c;
swap(pointl,point2);〃调用函数交换两个结构体数组元
素内的所有信息。
}
)
}
printf(〃排序成功!感谢使用!\n〃);
system("pause");
}
else〃不成立则做升序处理。
(
for(i=0;i<m;i++)
(
for(c=i+l:c<m+l:c++)
(
b=i;
if(stu[c].num<stu[b].num)
pointl=&stu[c];
point2=&stu[b];
b=c;
swap(pointl,point2);
)
)
}
printf(〃排序成功!感谢使用!\n");
system("pause");
}
}
VOidSort_servicc2(charpo)〃对在有排序学生记录功能的函数中要调用的第
二个函数的定义,即通过学习信息排序。
(
intm=judgementsinall();
if(po=D〃做升序处理
for(i=0;i<m;i++)
for(c=i+1;c<m+1;c++)
b=i;
if(stu[c].score>stu[b].score)
(
pointl=&stu[c];
point2=&stu[b];
b=c;
swap(pointl,point2);
}
)
}
printf("排序成功!感谢使用!\n");
system("pause");
return;
)
else〃做降序处理。
(
for(i=0:i<m:i++)
for(c=i+1;c<m+1;c++)
b=i;
if(stu[c].score<stu[b].score)
(
pointl=&stu[c];
point2=&stu[b];
b=c;
swap(pointl,point2);
}
)
}
printf(〃排序成功!感谢使用!\n〃);
system("pause");
return;
)
)
voidswap(structstudent*pol,structstudent*po2)/*对一个具有交换值
功能的函数的定义,具体功能是交换两个结构体数组元素内的所有信息*/
{
structstudenttempO;
tempO=*pol;
pol=po2;
*po2=tempO;
}
voidfind(int(*p)(void),void(*q)(void))/*对一个形参是指向函数的指针的
函数的定义,此函数将在查询、删除、修改函数中被使用,即通过用户输入的一
名学生的名字或班内序号锁定该名学生记录的地址,保存在全局指针变量
point1中,然后用.service函数处理*/
{
for(;;)
(
j=p();〃通过函数的指针调用函数
if(j==1)
(
printf(〃请输入学生的姓名:〃);
scanf('%s”,nameO);
nameO[str1en(nameO)+1]='\0';〃防止字符数组越界。
for(i=0;i<N;i++)
{
if(strcmp(nameO,stu[i].name)==0)〃比较两个字符数组
pointl=&stu[i];〃全局变量存入锁定的学生地址。
q();
return;〃退出函数。
}
)
if(i>n)〃对特殊情况的处理。
printf(〃经寻找后没有发现姓名为%$的学生记录存入程序!
nameO);
system("pause");
break;
)
elseif(j==2)
(
printf(“请输入学生的序号:〃);
scanf(线d〃,&numO);
for(i=0;i<N;i++)
(
if(numO==stu[i].num)
(
pointl=&stu[i]:
q();
return;
)
)
if(i>n)
printf(〃经寻找后没有发现序号为刎的学生记录存入程序!\n
numO);
system("pause");
brecik;
}
else
conlinue;〃用户在选择出错时可以重新输入选择。
}
)
intmain(void)〃对主函数的定义。
(
n=0;
for(i=0;i<N;i++)
(
strepy(stu[i].name,〃\0");
stu[i].num=0:
stu[i].score=0;
}
for(;;)〃通过for语句实现使用户自由决定是否重发使用此程序。
switch(Menu一select]())〃使用switch语句调用用户指定菜单项对应
的函数。
(
case1:
Input(n);〃插入学生记录函数。
for(i=0,n=0;i<N;i++)
(
if(stu[i].num!=0)
n++;
}
break;
case2:
Chcinge_record();〃修改学生的记录函数。
break;
case3:
Delete_record();〃删除学生记录函数。
brpak:
case4:
Sort_record();//排序函数。
break;
case5:
Queryrecord0;〃查询函数。
break;
case6:
DispalyO;〃展示函数。
brecik;
case7:
printf(〃请输入文件的路径:〃);
scanf(飞s”,nameO);
printf(〃请输入此文本中有多少名学生的记录:〃);
scanf("机T,&j);
Add_fromtext(j,name。);〃从文本中添加学生记录的函数。
n+=j;
break;
case8:
printf(“请输入文件的路径:〃);
scanf('%s”,nameO);
();〃将学生记录写入文本的函数。
break;
case9:〃结束程序使用界面选项。
Ending();
break;
default:
continue;〃菜单循环显示。
)
system("cls");
)
system("pause");〃防止程序运行窗口闪退。
return0;
)
intMenu_selectl(void)〃对第一个菜单函数的定义。
printf(z,\t
\\>>>I•
rr»rrw*T*rfc*T»*7*rT»*T»*«**«*J»*J**J*#•rj**T»*T*\]1\I1
printfC\n\t\t\t***欢迎使用学生信息管理程序***\n\n〃);
printf("\t\t\t\t功能菜单\n\n\n");
printfC\t1、添加学生记录信息选项\n〃);
printf("\t2、修改学生的记录选项\n〃);
printf(",\t3、删除学生记录选项\n"):
printfCXt4、根据学生某项信息排序学生记录\n〃);
printfC\t5、查询学生信息选项\n〃);
printf(,?\t6、显示出当前存储的所有学生信息\n");
printfC\t7、从文本文档中添加学生记录\n〃);
printfC\t8、将当前存入的学生记录写入文本文档\n〃);
printf(,z\t9、退出选项\n〃);
printfC\t
************************************************************\n\
printf("\t\t\t\t\t此时程序中存储了%d个学生的信息\n\n”,n);
printf("请输入您的选择:");
scanf(〃%d〃,&i);〃将用户指定的菜单项序号储存在变量i中。
system("cis");
return(i);//将i作为函数返回值。
)
intMenuselect.2(void)〃对第二个菜单函数的定义。
(
system(〃cls");
printfC\tl,通过名字找出要修改的学生记录\n\n〃);
printfC\t2.通过序号找出要修改的学生记录\n\n〃);
printf("\t\t请输入1或者2:;
scanf&i):
return(i);
intMcnu_selcct3(void)〃对第三个菜单函数的定义。
system("cis");
printf("\tl、修改学生的姓名\n\n");
printfr\t2.修改学生的序号\n\n〃);
printf("\t3、修改学生的信息\n\n");
printf(,z\t\t\t请输入1或2或者3:");
scanf("%d",&i);
return(i);
}
intMcnu_select4(void)〃对第四个菜单函数的定义。
{
system("cis");
printfC\tl,通过名字找出要删除的学生记录\n\n〃);
printf(〃\t2、通过序号找出要删除的学生记录\n\n〃);
printf请输入1或者2:;
scanf&i);
return(i);
intMenuselect5(void)〃对第五个菜单函数的定义。
system(〃cls");
printfC\tl,删除此学生的所有信息\n\n〃);
printff\t3,删除此学生的学习信息\n\n〃);
printf("\t\t\t请输入1或者2:〃);
scanf&i);
return(i);
)
intMenuselect6(void)//对第六个菜单函数的定义。
(
system("cis");
printff\tl,通过名字找出要查询的学生记录\n\n〃);
printf(〃\t2、通过序号找出要查询的学生记录\n\n〃);
printf(*\t\t请输入1或者2:;
scanf&i);
return(i);
)
intMenuselect7(void)〃对第七个菜单函数的定义。
(
system("cis"):
printfC\tl>查询此学生的所有信息\n\n〃);
printfC\t2.查询此学生的姓名\n\n〃);
printf(〃\t3、查询此学生的班内序号\n\n");
printfC\t4>查询此学生的学习信息\n\n〃);
printf(*\t\t\t请输入1到4间的一个整数;
scanf&i);
return(i);
)
intMenu_select8(void)〃对第八个菜单函数的定义。
{
systcm(〃cls〃);
printfCAtl.根据学生的班内序号排序学生记录\n\n");
printfC\t2,根据学生的学习信息排序学生记录\n\n〃);
printf请输入1或者2:");
scanf&i);
return(i);
)
intMenu_select9(void)〃对第九个菜单函数的定义。
{
system("cls");
printfC\tK按此组数据对•学生记录进行降序排序\n\n〃):
printfC\t2>按此组数据对学生记录进行升序排序\n\n〃);
printf请输入1或者20;
scanf(,,%d,/,&i);
return(i);
}
intjudgement(void)〃对第一个判断函数的定义,判断班内序号是否大于60
或者有重复序号的情况。
(
inti,out,k,final;
scanf("%d”,&final);
for(out=1;out==1;)
(
if(final>N)
(
system(zzcls/x);
printf(〃序号为1到60之间的一个整数,请重新输入:〃);
scanf(“/d",殳final);
}
if(final<=60)
(
for(i=0,k=0;i<N;i++)
if(final==stu[i].num)
k++;
break;
1
)
}
if(k==0)
break;
else
(
system(〃cIs");
printf(〃您输入的序号已被使用请再次输入不同的序号:〃);
scanf("%d”,殳final);
}
)
return(final);
)
intjudgement_small(void)〃对第二个判断函数的定义,针对于排序函数中的
一类特殊情况设计。
intm=-1;
for(i=0;i<N;i++)
if(stu[i].num!=0)
m++;
}
if(m<=0)
printf(〃程序当前只存储了%d位学生的信息,无法排序!\n",m+1);
system("pause");
)
returnm;}
五、程序调试:
运行程序:
显示:
S1^si*5^si**1*
,1、,1、,广,A、,.、,,、’1、,4、'I、,4、*j*,.、'I、,'、'I、,'、'I、,|、'I、«、,4、’1、,4、,I、,4、'I、。、'I、,,、*T*,,、'I、,|、’I、’1、,卜’[、,,、’1、,4、*T*,,、,1、,上、‘I、,‘、'I、,'、'I、‘1、’;、*T*';、*T*,4、,1、,「'I、,4、
***欢迎使用学生信息管理程序***
功能菜单
1、添加学生记录信息选项
2、修改学生的记录选项
3、删除学生记录选项
4、根据学生某项信息排序学生.记录选项
5、查询学生记录选项
6、显示当前存储的所有学生记录选项
7、从文本文件中提取学生记录选项
8、将当前存入程序的学生记录写入文本文件
9、退出选项
si*sx*•£>sXzsL*^£xs^*^1/si^^£z^lz^£zxL*^£z
,:、,,、匕、,4、,;',.、']、f,[、^7*,[、,1、,[、,:、,j、,:、,[、(、J、,[、,《、,;、,A、,[、,]、,>、,[、,广可、,[、,;、,卜,;、,,、,[、J、,j、,[、,.、,,、,;、,,、,]、,卜,;、,,、,[、,[、
此时程序中存储了0个学生的记录
请输入您的选择:
输入:1回车
显示:请输入学生姓名:
输入:a回车
显示:请输入学生序号:
输入:1回车
显示:请输入学生信息:
输入:78回车
(回到菜单,在菜单的下面一行中将变为“此时程序中存储了1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- XX县XX局一次性告知制度
- 内管管理暂行办法
- 内部调煤管理办法
- 军校讲师管理办法
- 农业园区管理办法
- 农垦项目管理办法
- 农村兽药管理办法
- 农村用户管理办法
- 农田承包管理办法
- 农行工资管理办法
- 教育心理学2025年考试试题及答案
- 湖南土建中级职称-建筑工程《法律法规及技术标准》考试题(附答案)
- 2025-2030全球及中国石油、天然气和化学品软件行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 水泵保养操作规程
- 2025年国家粮食和物资储备局科学研究院招聘1人历年自考难、易点模拟试卷(共500题附带答案详解)
- 2024年江苏省扬州市中考数学试卷(附答案)
- 民法典继承篇课件
- 《铁路技术管理规程》(普速铁路部分)
- 喷漆车间火灾应急预案
- 路灯设施维修工程施工组织设计方案
- T-CTSS 3-2024 茶艺职业技能竞赛技术规程
评论
0/150
提交评论