版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.高级语言(C)课程设计题目:小型通讯录设计院(系、部): 信息完生 名:海霞(5120110752)琳(5120110723)班 级:电112指导教师签名:2012年7月4日nn艸 一 -A.f J 、/茜咼su珮岗关*关关关*关*关关关*关关*2、鄉 转萍斗 关关*关关*关关*关关关关*关*2肅洁乂二対淖然关关关关关*关关*关*关*关关关丿 HrTAv Avvv Av Av Av Avv Av Av Avv Av Av Av Av Av Avvvv Av Av y2 V7 V74/4#A44 V7 V74/4/4/A/A/4V7 v74/4/4/44 V7 V7 V7 V74/A/4/4
2、44v74/4rf、厂、 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一fIF5- M)(* *-x-x-x-x-)(-)(-x-x-x-x-x-)(-x-x-x-)(-)(*-x-x-x-)(-)(-x-x*o爺議豪 廡也 *关关关关* * *关关关*关*12議遍潸二 克关关关*关关*关关*关关关关*关*26Z时寺/ 坯眇対凝 1Z关关*关关*关关关*关32弄:梆味刈建滦章*关关关*关关*关关*33一、任务书题目6:小型通讯录设计功能:实现简单的通讯录信息管理,基本信息包括编号、手机、邮编、地
3、址、 关系、性别、生日、QQ、.基本要求:1. 设计简单的菜单,能够进行系统功能选择。2. 实现信息的录入功能。3. 在已有信息的基础上添加新的记录。4. 删除指定编号的记录。5. 复制指定编号的记录6. 实现信息的浏览功能7. 按编号查询功能8. 按手机号排序功能二. 小组成员情况组长:海霞 学号:5120110752 负责:文件导出、删除、排序、复制、输 出组员:琳 学号:5120110723 负责:主菜单、添加、查询、保存退岀另外:主函数,结构体定义,函数声明,文件及实验报告,虽有分工,但是大多 数容是有两人讨论后共同完成的。期间各自编写函数的过程中遇到的问题 均由两人共同商讨,以及询问
4、老师后,一起解决的。三、总体设计利用struct record定义数据结构,用void声明函数,用开关语句switch, case分开事件进行程序,实现系统功能选择,利用辻,while语句判断函数,for 语句实现循环,利用printf和scanf进行输岀与输入,用getchO输入字符串,最 终实现通讯录功能。通讯录中的记录项用结构体record表示,包含10个属性:id、name、phone、 address, postcode、relation. QQ、sex、birthday分别代表用户的编号、 地址、邮编、e_mail.关系、QQ、性别、生日。1、结构体坂组:struct record
5、 /定义一个结构体数组char id10; 编号char name20:/ char phone20;/ char adress40 ; /地址 char postcode10: /邮编 char e_mail30; /e-mail char relation20;/关系 char QQ20;/QQ char sex10 ;/性别 char birthday 20 ; /生日 student500:2、包括的函数:void mainmenuO ;/主菜单 void readfromfileO ;/读取文件 void newrecordO ; /新添纪录 void showall () ; /输
6、出记录 void searchmenu () ; /查询菜单 void searchbyidO ;/按编号查询 void searchbyname() ; /按查询 void searchbyphone () ; /按查询 void deletemenu () ; /删除菜单 void deleteall () ;/删除所有 void deleteoneO ;/删除单个 void deletebyidO ;/按编号删除 void deletebyname() ;/按删除 void listmenu();/排序菜单 void listbyidO ;/按编号排序 void listbyname (
7、) ; /按排序 void copy() ;/复制菜单 void writetofile() ;/保存退出四、模块划分及功能主模块:mainO/主函数 其他模块:/主菜单模块一:void maininenu();模块二:void readfromfile () ;/读取文件模块三:void newrecord();/新添纪录模块四:void showall();/输出记录模块五:void searchmenu();/查询菜单模块六:void searchbyidO ;按编号查询模块七:void searchbyname():/按查询模块八:void searchbyphoneO ;/按查询模块
8、九:void deletemenu();刪除菜单模块十:void deleteall();刪除所有模块十一:void deleteone();刪除单个模块十二:void deletebyidO ;按编号刪除模块十三:void deletebyname();/按删除模块十四:void listmenu();排序菜单模块十五:void listbyidO ;按编号排序模块十六:void listbyname();/按排序模块十七:void copy ();复制菜单模块十八:void writetofileO ;保存退出五、算法说明:1. 通讯录中的记录项用结构体record表示,包含10个属性。2
9、. 主菜单:利用switch语句进行选择所需功能;输入“1”会进入“新添记录” 的界面;输入“2”进入输出记录”的界面;输入3”会进入查询菜单”的 界面;输入“4”进入“刪除记录”的界面;输入“5”进入“记录排序”的界面; 输入“7”进入“保存退出”的界面;输入“8”进入“不保存退出”的界面。3. 添加记录:利用printf ()函数和scanfO函数实现按要求输入信息,再利用 if O语句实现是否继续添加记录。4. 输出记录:利用for循环和if语句实现全部输出;5. 查询菜单:利用switch选择查询方式。在查询菜单中输入“1”进入“按编号 查询”界面;输入“2”进入“按查询”界面;输入“
10、3”进入“按查询” 界面;输入“4”进入“主菜单”界面。6. 按编号查询:利用for循环从第一条记录到最后一条记录进行查找,再利用 if语句判断要查找的记录和待比较的编号是否相等,如找到相同的记录,就输 出此人的全部信息,如果没有找到就显示没有此人的信息”。7. 按查询:利用for循环从第一条记录到最后一条记录进行查找,再利用if语 句判断要查找的记录和待比较的是否相等,如找到相同的记录,就输出此人的全 部信息,再嵌一个if语句进行查找相同名字的人的信息,再嵌一个if语句继续 查找,若不继续查找就输岀“没有相同的学生纪录按任意键返回主菜单”,如果 一开始没有找到就显示“没有此人的信息”。8.
11、按号查询:利用for循环从第一条记录到最后一条记录进行查找,再利用if 语句判断要查找的记录和待比较的是否相等,如找到相同的记录,就输岀此人的 全部信息,如果没有找到就显示“没有此人的信”。9. 刪除菜单:利用switch语句进行选择所需功能;输入“1”会进入“删除所有” 的界面;输入“2”进入“刪除单个”的界面;输入“3”会进入“返回主菜单” 的界面。10删除所有:利用if语句进行是否全部删除。11. 删除单个:利用switch语句选择刪除方式,输入“1”进入“按删除”界面;输入“2”进入“按刪除”界面。11. 按刪除:利用if语句进行判断是否有记录,再利用for循环进行查找信息, 如果找到
12、,就显示所有要删除的信息,再利用if语句进行是否删除,嵌for循 环,把记录前移,嵌if语句实现是否继续删除。12. 按刪除:利用if语句进行判断是否有记录,再利用for循环进行查找信息, 如果找到,就显示所有要删除的信息,再利用if语句进行是否删除,嵌for循 环,把记录前移,嵌if语句实现是否删除相同的同学信息13. 利用switch语句实现排序选择,输入“1”会进入“按排序的界面;输入“2” 进入“按排序”的界面;输入“3”会进入“返回主菜单”的界面。14. 按排序:利用for循环和if语句以及do-, while实现升序,再利用if语句 实现是否显示排序后的信息,调用显示函数。15.
13、按排序排序:利用for循环和if语句以及do-, while实现升序,再利用if 语句实现是否显示排序后的信息,调用显示函数。框架图七.流程开始查找search流程图删除delete流程图开始排序list流程图八、源程序清单include Sinclude Sinclude /控制字符串 Sinclude 控制台输入输出 struct record /定义一个结构体数组 char id10; /编号 char name20;/ char phone20;/ char adress40: /地址 char postcode10: 邮编 char e-mail30; /e_mail char re
14、lation20 ;/关系 char QQ20;/QQ char sex10 ;/性别 char birthday 20:/生日 student500; int num=0;/外部变量num为文件中的纪录数 FILE *p; 定义一个指向文件的指针变量p void mainmenuO : /主菜单 void readfromf订o();/读取文件 void ncwrecord() ;/新添纪录 void showall () ;/输出记录 void searchmenu():/查询菜单 void searchbyidO :/按编号查询 void searchbyname() ;/按查询 voi
15、d searchbyphonc() ; /按查询 void deletemenu() ;/刪除菜单 void deleteall () ;/删除所有 void deleteoneO ;/删除单个 void deletebyphoneO ;/按删除 void dcletebynameO ;/按删除 void listmenu() ; /排序菜单 void listbyphone();/按排序 void listbyname():/按排序 void copy (): /复制菜单 void writetofile():/保存退出 void main() readfromfileO ; while (
16、1)mainmenuO ; void readfromfileO/从文件导出,判断是否有通讯录if (p=fopen(student, txt, Rrb,)=NULL) 将 fopcn 函数的返回值赋给指针变量 P,打 开输入文件student, txtprintf(wntt通讯录文件不存在);if (p=fopen(student, txt,、b)=NULL) /打开输出文件 student, txtprintf(wntt 建立失败);exit(O); /终止正在执行的程序elseprintf(wntt通讯录文件已建立”); printfCntt按任意键进入主菜单”); getchO ; r
17、eturn;exit(0);fseek(p,0,2); 文件位置指针移动到文件末尾,fseek(文件类型指针,位移量,起始点) if (ftell(p)0) /ftell函数的目的是得到当前位置,用相对于文件开头的位移量来表示, 文件不为空rewind(p); 文件位置指针移动到文件开始位置,此函数没有返回值for (num=0;!feof(p) & fread(&studontnum,sizeof(struct record),1p);num+); /*f read (buffer, size, count, pt)(地址,读写的字节数,读写多少数据项,FILE类型指针), 每次从P指向的文
18、件中读入结构体数组的一个元素; feof检查文件是否结束,遇见文件结束符,返回非零值*/ printfCntt文件导入成功); printfCntt按任意键返回主菜单”); getchO ; return; printfCntt文件导入成功); printfCntt通讯录文件中无任何纪录”); printf(wntt按任意键返回主菜单”); getchO ; return; void mainmenuO/主菜单char choice; system(HclsM) ;/清屏printf (Hntt* 主菜单 * *,r) printf(Hntt* 1-新添纪录 2-输出记录 *w) printf
19、(Hntt* 3-查询菜单 4-删除菜单 *w) printf(Hntt* 5-记录排序 6-文件复制 *w) printf(Hntt* 7-保存退出 8-不保存退出*w)printf (Hntt 请选择:M);choice=getch(); switch(choice) case r1r:ncwrecord():break; case f2r:showall():break; case f3r:searchmonu();break; case f4r:deletemonu();break; case f5r:listmenu();break; case f6r: copy() ; break
20、; case 7:writetof订e();broak; case f8r:exit(O); break; default:mainmonu(); void newrecord()添加记录printf (Hntt* 请输入信息 *n,r); printf(Mntt 输入编号:”);scanf(w%sn,&studontnum, id);printf(ntt 输入:”);scanf (w%sn,&studontnum, name);printf(ntt 输入:”);scanf (w%sn,&studontnum, phone); printf(ntt 输入地址:”); scanf (w%sn,&
21、studontnum, adress); printf (ntt 输入邮编:); scanf (w%s,f,&student num postcode); printf(ntt 输入:”);scanf (w%sn,&studontnum, e mail);printfCntt 输入 QQ:);scanf (w%sn,ftstudentnum. QQ);printf(Mntt 输入性别:”);scanf(W%s,&studontnum, sex);printf(Hntt 输入生日);scanf (w%s,&studcntnum, birthday);printf(Mntt 输入关系:”);sca
22、nf(W%s,&studcntnum, relation);num+;printfCntt 是否继续添加?(Y/N):);if (getch()=,y) newrocord (); return; void showall ()/输出记录int i;system(Hclsn);if(num!=0)printf (Hntt* 以下为通讯录所有信息*,r); for (i=0;inum;i+)printf (Hntt 编号:%s J student i id); printf(Hntt: %swt studenti. name); printf(Hntt: %sJ studentiphone);
23、printf (untt 地址:studenti. adress); printf(Hntt: %sM,studenti. e_mail); printf(unttQQ: %sM,studenti. QQ); printf (nntt 邮编:%su, student i. postcode); printf (Hntt 生日:%sH, student i. birthday); printf (Hntt 性别:%sw, student i. sex); printf (untt 关系:%s student i. relation); printf(tt); if (i+lnum)printfC
24、ntt请按任意键继续);getchO ;printf (H ntt*,r); elseprintf(Mntt通讯录中无任何纪录”); printfCntt按任意键返回主菜单:”); getchO ; return;void searchmenu()/查询菜单char choice;system(,clsH);printf(Hntt* 查询菜单 *H); printf (Hntt* 1-按编号查询 2-按查询*); printf (Hntt* 3-按查询 4-返回主菜单*n); printf(Hntt*H); printf (ntt 请选择:); choice=getch(); switch (
25、choice)case flr:searchbyid();break;case f2r:searchbynamo();break;case f3r:searchbyphone():break;case Wmaininenu(); break;void searchbyid()/按编号查询int mark=0; /查找到的个数int i;int a=0;printf (Hntt* 按编号查找 *n); char id10;printfCntt 请输入编号:”); scanf (w%sM,id);for(i=0; inum; i+)/从第一条记录开始直到最后一条if (strcmp(student
26、i. id,id)=0) /记录中的编号和待比较的编号是否相等 printf (Hntt* 以下是您查找的信息 *H);printf (Hntt 编号:%s11, studenti. id);printf(Mntt: %swf studenti. name);printf(Mntt: %sfftstudenti. phone);printf (Mntt 地址:s J student i adress);printf(Hntt: %sM,studenti. e_mail);printf(nnttQQ: %sM,studenti. QQ);printf (Mntt 邮编:%s student i.
27、 postcode);printf (Mntt 生日:%sn, student i. birthday); printf (Hntt 性别:%sstudent i. sex); printf (untt 关系:%s student i. relation); printf (Hntt*,r); printf(wntt按任意键返回主菜单:);mark+;getchO ; return; if (mark=0)printfCntt没有此人的信息”); printfCntt按任意键返回主菜单”); getchO ; return;void searchbyname()/按查询int mark=0;i
28、nt i;int a=0;printf (f,ntt* 按查找 *w); char name20:printf (ntt 请输入:); scanf (r,%sn ,name); for(i=a;inum;i+)if (strcmp(studenti. name,name) =0) 记录中的和待比较的是否相等 printf (Hntt* 以下是您查找的学生信息 *,r); printf (Hntt 编号:studenti. id);printf(Hntt: %swt studenti. name); printf(Hntt: %swt studenti. phone); printf (Hntt
29、 地址:studenti adress); printf(Hntt: %sM,studenti. e_mail); printf(HnttQQ: %s studenti. QQ); printf (Mntt 邮编:%s student i. postcode); printf (Hntt 生日:%sw, student i. birthday); printf (Hntt 性别:%sw, student i. sex); printf (Mntt 关系:%s student i. relation); printf (*ntt*,r); mark+; if (i+l)num) printf(w
30、ntt是否继续查找相同名字的人的信息:(y/n); if (getch()=ry,)a=i;continue; 跳出本次循环,回到第一个if,继续查找elsereturn;elseprintfCntt按任意键返回主菜单”);getchO ;return;if(mark!=0)printfCntt没有相同的学生纪录”);printfCntt按任意键返回主菜单”); getchO ;return;elseprintfCntt没有相同的学生纪录”);printf(ntt按任意键返回主菜单”);getchO;return;voi d searchbyphone ()/按查询int mark=0;int
31、 i;int a=0;printf (Hntt* 按查找 *w); char phono10;printf (ntt 请输入:);scanf(w%sw,phono);for (i=0;inum;i+)if(strcmp(studenti phono,phone)=0) printf (Hntt* 以下是您查找的信息 *H);printf (Hntt 学号:%s J student i id); printf(Hntt: %swt studenti. name); printf(Hntt:studenti. phone);printf (Hntt 地址:studenti adress); pri
32、ntf(Hntt: %sw,studenti. e_mail); printf(HnttQQ: %sstudenti. QQ); printf (Mntt 邮编:s,studonti postcode); printf (Hntt 生日:%sw, student i. birthday); printf (Hntt 性别:%sstudent i. sex); printf (Mntt 关系:%sM,studenti. relation); printf (Hntt*,r); printf(Hntt按任意键返回主菜单:”); mark+; getchO;return; if (mark=0)pr
33、intf(Hntt没有此人的信息”); printfCntt按任意键返回主菜单”); getchO;return; void deletemonuO删除菜单char choice;if (nu hf=0)printfCntt对不起,文件中无任何纪录”); printf(Hntt按任意键返回主菜单”); getchO;return; system(,clsH); printf(ntt*删除菜单*); printf (ntt* 卜删除所有 *,r); printf (Hntt* 2-删除单个 *,r); printf (Hntt* 3-返回主菜单*); printf(ntt*); printf (
34、Hntt 请选择:M);choice二getchO; switch (choice) case 11r:deleteal1();break;case 121:deleteono();break;case 3:mainmenu();break;def au11:ma i nmonu();break;void deleteall ()删除所有printfCntt 确认删除?(y/n)R);if (getchO=,y)fclose(p); 成功执行了关闭操作,返回值为0if (p=fopenC1 student, tex, Wwb) )=NULL) /打开输出文件 printf(wntt不能打开文件
35、,删除失败”);readfromfileO ;num=0;printfCntt纪录已删除,按任意键返回主菜单);getchO ;return;elsereturn;void deleteoneO删除单个char choice;printfCnttl-按删除 2-按删除);printf (ntt 请选择:);choice=getch();switch (choice)case 111:deletebyphone() ; break;case 121:deletebynamo();break;void deletebyphone()/按刪除int i,j;int doletomark=0;char
36、 phone20;printf(wntt请输入要刪除:”);scanf(w%sH,phone);if (nu hf=0)printfCntt对不起,文件中无任何纪录”); printfCntt按任意键返回主菜单”); getchO ;return;for (i=0;inum;i+)if (strcmp(studenti phono,phono)=0)printfCntt以下是您要刪除的纪录:”); printf (Hntt 编号:studenti. id); printf(Hntt: %swt studenti. name); printf(Hntt:studenti. phone);prin
37、tf (Hntt 地址:s J student i adress); printf(Hntt: %sw,studenti. ejnail); printf(unttQQ: %sM,studenti. QQ); printf (nntt 邮编:%s student i. postcode); printf (Hntt 生日:%sw, student i. birthday); printf (Hntt 性别:%sw, student i. sex); printfCntt 是否删除?(y/n); if (getch()=,y)for (j=i; jnum-l; j+) /删除该记录,后续记录前移
38、 studcntj=studentj+l; num; /记录数减1 deletemark+; printfCntt 删除成功); printfCntt 是否继续刪除?(y/n)”); if (getch()=,y) deletobyphoneO ; return;elsereturn;continue;if (deletomark=0)printfCntt没有此人的纪录”); printf(wntt 是否继续刪除?(y/n); if (getch()=ry,) deletobyphoneO ; return; void dcletebynameO/按删除 int a=0; int findma
39、rk=O; int j;int deletomark=0;int i;char name20:printfCntt请输入要刪除学生:”); scanf (w%sn,name); for (i=a;inum;i+)if (strcmp(studenti name,name) =0)printfCntt以下是您要刪除的学生纪录:); findmark+;printf (ntt);printf (Hntt 编号:studenti. id); printf(Hntt: %swt studenti. name); printf(Hntt:studenti. phone);printf (Hntt 地址:
40、s J student i adress); printf(Hntt: studenti e_mail); printf(nnttQQ: %sM,studenti. QQ); printf (nntt 邮编:%s student i. postcode); printf (Hntt 生日:%sH, student i. birthday); printf (Hntt 性别:%sw,studenti. sex);printf (ntt);printfCntt 是否删除?(y/n)R); if (getch0=,y)for (j=i; jnum-l; j+) /纪录移动,后续记录前移 num;de
41、letemark+; printfCntt 删除成功); if(i+l)num)printf(Hntt是否继续刪除相同的同学信息?(y/n)M); if (getch()=ry,)a=i;continue;printf(Hntt 是否继续刪除?(y/n)”);if (getch()=,y)deletebyname();return; /返回主菜单if(i+1)num)printf(Hntt是否继续刪除相同的同学信息?(y/n) ”);if (getch()=,y)a=i;continue;elsecontinue;if (deletcmark=O)&(findmark=0)printf(ntt
42、没有此人的纪录);printf(Hntt 是否继续刪除?(y/n)”);if (getch()=,y)deletebyphoneO ;return;return;else if (findmark!=0)printf (ntt没有重名信息”);printf(ntt没有此人的纪录);printf(Hntt 是否继续刪除?(y/n)”);if (getch()=,y)deletebypphoneO ;return;return;void listmenu()/排序菜单 char choice; if(num=0) printf(Mntt对不起,文件中无任何纪录”); printfCntt按任意键返
43、回主菜单); getchO;return; system(HclsM);printf (Hntt* 排序菜单 *,r);printf (Hntt* 1 -按排序 2-按排序 *,r);printf (Hntt* 3-返回主菜单 *w);printf (Hntt 请选择:w);choice=getch(); switch(choice) case f1r:1i s tbyphone():break; case f2r:listbynamo();break; case f3r:mainmeniK);break; default:mainmonu();break; void listbyphoneO
44、/按排序 int i.j;record tmp; /临时变量做交换数据用for (i=l;inum;i+)if(strcmpCstudenti phone,studenti-1 phone)0)tmp=studcnti:j=i-l;dostudcntj+l=studcntj:j一;/while (strcmp(tmp phono,studentj phone)=0); studontj+l=tmp;printf(Hntt排序成功,是否显示?(y/n)w);if (getch()=ry,)showall ();return;void listbyname()/按排序int i,j;record tmp;for (i=l;inum;i+)if(strcmp(studenti. name,studenti-1. name)0)tmp=student i;j=i-l;dostudentj+l=studcntj;j;while (strcmp(tmp. name,studentj. name)=0);studentj+l=tmp;printfCntt排序成功,是否显示?(y/n)w);if (getch()=,y)showall ();return;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年受欢迎人事代理合同
- 2025年生态环保技术推广合同
- 二零二五年度木材行业信息化建设与数据服务合同2篇
- 镀锡平板轧材项目可行性研究报告建议书申请备案
- 2020-2025年中国半导体激光治疗机行业市场运营现状及投资战略咨询报告
- 贵阳2025年租赁合同含租赁双方权利义务及争议解决机制2篇
- 2025年度文化创意产业知识产权运营框架协议
- 二零二五年度道路工程施工合同纠纷处理协议
- 二零二五年度绿色食品连锁店进货合同电子版
- 二零二五年度2025年度生物制药行业研究员聘用协议
- 2025年长沙穗城轨道交通有限公司招聘笔试参考题库含答案解析
- 人教版物理八年级下册 专项训练卷 (一)力、运动和力(含答案)
- 山东省房屋市政工程安全监督机构人员业务能力考试题库-中(多选题)
- 重庆市2023-2024学年七年级上学期期末考试数学试题(含答案)
- 2024年中考语文满分作文6篇(含题目)
- 北师大版 2024-2025学年四年级数学上册典型例题系列第三单元:行程问题“拓展型”专项练习(原卷版+解析)
- 2023年译林版英语五年级下册Units-1-2单元测试卷-含答案
- 施工管理中的文档管理方法与要求
- DL∕T 547-2020 电力系统光纤通信运行管理规程
- 种子轮投资协议
- 执行依据主文范文(通用4篇)
评论
0/150
提交评论