课程设计--订餐管理系统(共67页)_第1页
课程设计--订餐管理系统(共67页)_第2页
课程设计--订餐管理系统(共67页)_第3页
课程设计--订餐管理系统(共67页)_第4页
课程设计--订餐管理系统(共67页)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上 成 绩 课 程 设 计设计课程名称 C语言课程设计 题 目 1 多文件系统设计 2链表结构系统设计 3 订餐管理系统设计 学 院 常州大学怀德学院 专 业 班 级 计算机141 学 号 姓 名 周尧明 指 导 教 师 林 荫 部 门 计算机教研室 设 计 时 间 2015 年 6 月 26 日 2015 年 7 月 17 日C语言课程设计任务书 常州大学怀德 学院 计算机141 班 周尧明 同学:一、设计题目 1 多文件系统设计 2链表结构系统设计 3 订餐管理系统设计二、C语言课程设计的目的和意义C语言课程设计是C语言程序设计课程的一个重要的环节。它是根据教学计划

2、的要求,在老师指导下,对学生实施程序设计训练的必要过程,是对前期课堂教学效果的检验。其目标在于培养学生综合应用理论知识来分析和解决实际问题的能力。通过本次课程,要求学生能够遵循软件开发过程的基本规范,应用结构化程序设计的方法,按照题目要求,独立完成设计任务,使学生更加深刻地理解和掌握C语言的基本概念、语言特点和编程技巧,为以后相关课程的学习打下良好基础。三、设计内容本课程设计的内容分三个阶段来完成。各部分目的及内容:任务一 多文件系统设计目的:(1)树立项目意识,体验C语言的模块化设计风格;(2)掌握函数调用及其参数传递的方法;(3)学习多文件程序的编写和调试方法;(4)学习基于软件工程的项目

3、实现方法和文档编写方法。内容和要求:(1)使用多文件结构形式完成本设计。(2)使用数组结构存储学生的成绩,通过函数调用实现学生成绩的增加、显示、指定成绩的删除、查找和排序。(3)为各项操作功能设计菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。(4)各功能使用相应的函数实现,各函数包含在不同的文件中。(5)构造独立的头文件,包含所需的所有的头文件和函数原型说明。(6)设计报告包括课题的需求分析、系统设计、详细设计、系统实现和测试。(7)扩展: 性能扩展,指用户使用的友好程度体验。(1)成绩的有效性判断;(2)部分选单功能必要的循环操作,等。 功能扩展:(1)添加

4、功能; (2)成绩从文件度读、写功能,等。任务二 链表结构系统设计目的:(1)熟悉使用结构体和链表进行复杂数据的表示方法 ;(2)掌握结构体和链表数据的的常用操作的实现方法;(3)熟悉一个完整的信息管理软件的开发流程、设计和表示方法。内容和要求:(1) 使用多文件结构形式完成本设计。基本要求同任务一:通过函数调用实现学生成绩的增加、显示、指定成绩的删除、查找和排序功能。各功能使用相应的函数实现,各函数包含在不同的文件中。为各项操作功能设计菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。(2) 使用结构体存储每位学生的信息(包括成绩),将多位学生的信息以链表方式组

5、织。(3)使用指针操作访问学生结构体数组的每一个学生信息。(4)使用动态申请和释放内存函数完成对学生信息的增删操作。(5)构造独立的头文件,包含所需的所有的头文件和函数原型说明。(6)设计报告包括课题的需求分析、系统设计、详细设计、系统实现和测试。(7)扩展:如任务一。任务三 订餐管理系统设计目的:(1)熟悉使用软件工程的思想完成一个信息系统的设计步骤和方法。(2)熟悉软件设计各步骤表示的常用工具。(3)掌握使用C语言进行多文件程序编写和调试的方法。内容和要求:(1)使用多文件结构形式完成本设计。(2)为各项操作功能设计一个菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的

6、操作项目。(2)使用链表结构存储订餐信息,通过函数调用实现订餐信息添加、查询、删除、输出和排序。(3)为各项操作功能设计菜单。应用程序运行后,先显示主菜单,然后用户通过菜单项选择希望进行的操作项目。(4)各功能使用相应的函数实现,各函数包含在不同的文件中。(5)构造独立的头文件,包含所需的所有的头文件和函数原型说明。(6)设计报告包括课题的需求分析、系统设计、详细设计、系统实现和测试。(7)扩展: 性能扩展,指用户使用的友好程度体验。(1)添加订餐信息;(2)部分选单功能必要的循环操作,等。 功能扩展:(1)添加功能; (2)订餐信息从文件度读、写功能,等。课程设计的排版要求一、总体要求1、

7、纸型:A4;3、页面设置:左、右、下边距为2.5厘米,上边距为2.8厘米,页眉和页脚均为2.0厘米(页眉页脚如该文档);4、行间距:固定值18磅;5、中文采用宋体字体,西文、数字等符号均采用Times New Roman字体。二、课程设计正文排版要求 1 题名(宋体 小四号 粗体)(段前、段后0.5行)说明:章、节编号全部顶格排,编号与标题之间空1个字的间隙。1.1 题名(宋体 五号 粗体)(段前、段后0.5行)1.1.1 题名(宋体 五号 粗体)(段前、段后0.5行)××××××××××

8、15;×××××××××××××××××××××××××××××××××(内容:宋体 五号,段前距和段后距均为0磅;)三、页眉和页脚常州大学怀德学院课程设计(字体:宋体、五号) 学号:姓名:第 页 共 页四、设计要求1、编写源程序的要求:(1) 实现任务书中的所有功能,

9、可扩展;(2) 尽可能使界面友好、直观、易操作;(3) 源程序要有注释,使程序容易阅读;(4)使用多文件实现。2、撰写“课程设计报告”,要求如下: (1)封面:统一采用常州大学课程设计说明书封面格式 (2)任务书 (3)目录 (4)正文。每部分按各自的要求编写,依次按照任务一、任务二和任务三完成。3、 “课程设计报告”排版要求:4、课程设计答辩验收要求:(1)运行所设计的系统;(2)回答有关问题;(3)电子稿:提交源程序和课程设计报告电子稿,打包上传至网络课堂相关节点书面稿:提交课程设计报告书面稿五、进度安排1 任务一 多文件系统设计:16学时+课外2 任务二 链表结构系统设计:16学时+课外

10、3任务三 信息系统设计系统分析和系统设计阶段:4学时+课外编程及系统调试阶段:22学时 +课外总结和书写课程设计报告阶段:课外考核阶段:2学时六、设计时间:2015 年 6 月26 日到 2015 年7 月 17 日参考文献(宋体 小四号 粗体)内容: (中文用宋体五号,西文、数字等符号均采用Times New Roman字体):序号作者.文献题名M.出版地:出版者,出版年.起止页码如:1毛利锐,沈灌群.中国教育通史M.济南:山东教育出版社,1988.20-222中国力学学会第三届全国实验流体力学学术会议论文集C天津:19903李晓东,张庆红,叶瑾琳气候学研究的若干理论问题J北京大学学报:自然

11、科学版,1995,35(1):101-106专心-专注-专业目 录任务一 多文件系统设计.11 问题描述.12 系统设计.1 2.1 系统功能结构图.1 2.2 系统流程设计图.1 2.3 系统文件结构图.23 详细设计 .2 3.1文件和自定义函数间的关系. . .2 3.2 函数之间调用关系.3 3.3 函数设计.44 系统实现.75 系统测试和结果.12任务二 链表结构系统设计.161 问题描述.162 系统设计.16 2.1 系统功能结构图. .16 2.2 系统流程设计图.16 2.3 数据设计.17 2.4 系统文件结构图.173 详细设计.18 3.1结构体定义. . .18 3

12、.2文件和自定义函数间的关系. .18 3.3 函数之间调用关系.19 3.4 函数设计.194 系统实现.205 系统测试和结果.25任务三 订餐信息系统设计.271 问题描述.272 系统分析.27 2.1 课题的基本要求.27 2.2 输入/输出要求.28 2.3 数据分析.28 2.4 系统操作流程分析.283 系统设计.29 3.1 数据设计.29 3.2 系统功能结构设计.30 3.3 输入/输出设计.313.3.1 输入设计.313.3.2 输出设计.31 3.4 设计过程中的重点和难点.314 详细设计.32 4.1数据定义. . .32 4.2文件和自定义函数间的关系. .3

13、3 4.3 函数之间调用关系.33 4.4 函数设计.34 5 系统实现.37 5.1 系统构架(文件组织结构)37 5.2 源程序清单37 5.3实现中的重点和难点.50 5.4遇到的问题及解决.506 测试和结果分析总结.50 6.1 测试和结果.51 6.2 结果分析.567 系统使用说明.568 结论.57 8.1课题完成情况说明.57 8.2系统的亮点.57 8.3系统的不足.57 8.4系统可能的改进和扩展 57总结.57参考文献.57致谢.58任务一 多文件系统设计1 问题描述本系统是用于管理学生的成绩,通过本系统可以实现成绩的输入、排序、查询、删除、插入、显示的功能,并且还可以

14、显示所有学生的成绩。2 系统设计2.1系统功能结构图如图1所示学生成绩管理系统删除学生成绩查询学生成绩显示学生成绩排序学生成绩输入学生成绩插入学生成绩 图1 系统功能结构图 学生成绩管理系统分为6个部分,分别为输入学生成绩、删除学生成绩、查询学生成绩、显示学生成绩、排序学生成绩、插入学生成绩。2.2系统流程设计图如图1所示欢迎界面进入菜单选项1.成绩输入,并判断是否有效3.成绩循环查询5.显示成绩2.成绩循环删除4.成绩排序0退出系统.6.循环插入成绩和判断插入的成绩是否有效图1 系统流程设计图该系统会先进入欢迎界面,然后出现7个菜单,1.成绩输入,并判断是否有效,2成绩循环删除,3成绩循环查

15、询,4成绩排序,5显示成绩,6循环插入成绩,0退出系统。3.1数据设计2.3系统文件结构图如图3所示main.c-主函数input.c-成绩输入del.c-成绩删除find.c-成绩查询insert.c-成绩插入menu.c-主菜单sort.c-成绩排序display.c-成绩显示task.h-头文件图3系统文件结构图首先建立一个工程名为task1.h,然后建立8个源文件和一个头文件,分别为删除成绩、显示成绩、查询成绩、输入成绩、插入成绩、主菜单、主函数。3 详细设计3.1文件和自定义函数之间的关系文件名文件所对应的函数功能说明main.cvoid main()主函数,进行选择功能选项menu

16、,cvoid menu()主菜单,输入功能选项input.cint input(floata,int n)输入成绩,并对数据有效判断del.cint del(float a,int n)删除成绩,可以循环删除find.cvoid find(float a,int n)查询成绩,可以循环查询sort.cvoid sort(floata,int n)成绩从高到低排序display.cvoid display(floata,int n) 显示成绩insert.cint insert(float a,int n)插入成绩,如果在成绩表中存在,输出提示信息;如果不在,将其插入在表的末尾。然后输出整个表。

17、 图4文件和自定义函数的关系3.2 函数之间调用关系如图5所示main()menu()input()del()sort()display()insert()exit()find()图5 函数之间调用关系3.3 函数设计(1)主函数A.函数原型:void main( )B.功能:显示学生成绩管理系统的7个功能选项C.入口参数:无D.出口参数:无E.描述:定义一个数组来储存成绩,通过调用函数实现相应的功能。(2)菜单函数A.函数原型:void menu( )B.功能:显示菜单界面C.入口参数:无D.出口参数:无E.描述:输出显示菜单选项 (3)学生成绩的输入A.函数原型:int input(flo

18、ata,int n)B.功能:输入学生的实际人数与学生的成绩并保存到数组中,然后将输入的数据带回main函数C.入口参数:ai 保存学生的成绩;n:学生人数D.出口参数:n:学生实际人数n:学生实际人数E .描述:先输入学生人数,再输入学生成绩,并判断成绩是否有效,无效从新输入。打开文件,将学生成绩写入文件中,最后关闭文件。(4)删除学生成绩A.函数原型:int del(float a,int n)B.功能:输入要删除的成绩 C.入口参数: ai 保存学生的成绩;n:学生人数D.出口参数:n:学生实际人数E .描述:输入要删除的成绩,若输入数不存在,就输出不存在,并用循环判断是否继续。 (5)

19、查询学生成绩A.函数原型:void find(float a,int n)B.功能:输入要查询的成绩 C.入口参数: ai 保存学生的成绩;n:学生人数D.出口参数:无E .描述:输入要查询的成绩,若输入的成绩不存在,就输出不存在,并用循环判断是否继续。(6)排序学生成绩A.函数原型:void sort(floata,int n)B.功能:成绩排序 C.入口参数:ai 保存学生的成绩; n:学生人数D.出口参数:无E .描述:对成绩排序并输出。(7)查询学生成绩A.函数原型:void find(float a,int n)B.功能:输入要查询的成绩 C.入口参数:ai 保存学生的成绩; n:学

20、生人数D.出口参数:无E .描述:输入要查询的成绩,若输入的成绩不存在,就输出不存在,并用循环判断是否继续。(8)显示学生成绩A.函数原型:void display(floata,int n)B.功能:成绩显示 C.入口参数:ai 保存学生的成绩;n:学生人数。D.出口参数:无E .描述:打开文件将数据从文件中读出,并把成绩输出,最后再关闭文件。(9)插入学生成绩A.函数原型:int insert(float a,int n)B.功能:成绩插入 C.入口参数:ai 保存学生的成绩;n:学生人数D.出口参数:n:学生实际人数E .描述:先输入要插入的成绩,判断数据是否有效,若有效将其插入到数组末

21、端,并用循环判断是否继续。4.系统实现(1) 头文件task.h#include"stdio.h"/定义输入输出头文件#include"stdlib.h"/定义清屏头文件#include"conio.h"/定义通过控制台进行数据输入和数据输出#define SIZE 80/宏定义,学生人数最大值为80FILE *fp; /定义文件int inpput(float a,int n);int del(float a,int n);void find(float a,int n);void sort(float a,int n);void

22、display(float a,int n);int insert(float a,int n);void menu();(2) 主函数main.c#include"task.h"void main() /系统主函数int j,num;float scoreSIZE; while(1)menu();scanf("%d",&j); /输入读取的选项的数字switch(j) /判断所选项目case 1: num=inpput(score,num);break; case 2: num=del(score,num);display(score,num)

23、;break; case 3: find(score,num);break; case 4: sort(score,num);display(score,num);break; case 5: display(score,num);break; case 6: num=insert(score,num);display(score,num);break; case 0: exit(0);(3) 主菜单 menu.c#include"task.h"void menu() /主菜单显示system("cls"); /清屏printf("nnnttt

24、 欢迎使用学生成绩管理系统nnn");printf("ttt*n");printf("ttt* 主菜单 *n");printf("ttt*nnn");printf("tt 1 成绩输入 2 成绩删除n");printf("tt 3 成绩查询 4 成绩排序n");printf("tt 5 显示成绩 6 成绩插入n"); printf("tt 0 退出系统n");printf("tt 请选择1/2/3/4/5/6/0:");(4)

25、 成绩输入 input.c#include"task.h"int inpput(float a,int n) /成绩输入int i;system("cls");if(fp=fopen("text","wb")=NULL)/打开文件判断printf("cannot openn file");exit(1);printf("n请输入学生人数(180):");scanf("%d",&n);/学生人数显示printf("n请输入学生成绩:&quo

26、t;);for(i=0;i<n;i+)/循环输入学生成绩scanf("%f",&ai);for(i=0;i<n;i+)if(ai<0|ai>100) /数据是否有效判断printf("数据%.1f无效,继续输入n",ai);scanf("%f",&ai);for(i=0;i<n;i+) /循环将数据写入文件fprintf(fp,"%.1ft",ai);fclose(fp); /关闭文件printf("按回车返回:");getch();return n

27、;(5) 成绩删除 del.c#include"task.h"int del(float a,int n) /成绩删除int i,j,k=0,b;float m;system("cls");/清屏if(fp=fopen("text","r")=NULL)/以读的方式打开文件printf("cannot read file");exit(1);for(i=0;i<n;i+) /从文件中读取数据fscanf(fp,"%f",&ai);doprintf("n

28、请输入要删除的成绩:");scanf("%f",&m); /输入要删除的成绩for(i=0;i<n;i+) /删除成绩if(m=ai) k=1;for(j=i;j<n-1;j+)aj=aj+1;n-;break;if(!k)printf("找不到要删除的成绩:");printf("n结束请按0,继续请按1:");scanf("%d",&b);while(b); /循环删除fclose(fp); /关闭文件printf("按回车返回:");getch();re

29、turn n; (6) 排序学生成绩 sort.c#include"task.h"void sort(float a,int n) /成绩排序int i,j,b;float t;if(fp=fopen("text","w")=NULL) /以写的方式打开文件printf("cannot openn file");exit(1);for(i=0;i<n;i+) /从文件中读取数据fscanf(fp,"%f",&ai);for(i=0;i<n-1;i+) /将学生成绩从高到底排序

30、for(j=0;j<n-i-1;j+) /采用冒泡排序法if(aj<aj+1)t=aj;aj=aj+1;aj+1=t;printf("n输出排序结果:"); for(i=0;i<n;i+) /输出排序结果printf("%.1ft",ai);printf("n");for(i=0;i<n;i+)fprintf(fp,".1%ft",ai);fclose(fp); /关闭文件printf("按回车返回:");getch();(7) 显示学生成绩 display.c#incl

31、ude"task.h"void find(float a,int n) /成绩查询int i,b;float m;system("cls"); /清屏if(fp=fopen("text","r")=NULL) /以读的方式打开文件printf("cannot read file");exit(1);for(i=0;i<n;i+)fscanf(fp,"%f",&ai); /从文件中读取数据doprintf("n请输入要查询的成绩:");scan

32、f("%f",&m); /输入要查询的成绩for(i=0;i<n;i+) /循环查找输入的成绩if(m=ai)printf("已找到,是第%d项,值为%.fn",i+1,ai);/输出查询的成绩break;if(i>=n)printf("找不到!n");printf("n结束请按0,继续请按1:");scanf("%d",&b);while(b);/循环查找ifclose(fp);printf("按回车返回:");getch(); (8) 学生成绩

33、查询find.c#include"task.h"void find(float a,int n) /成绩查询int i,b;float m;system("cls"); /清屏if(fp=fopen("text","r")=NULL) /以读的方式打开文件printf("cannot read file");exit(1);for(i=0;i<n;i+)fscanf(fp,"%f",&ai); /从文件中读取数据doprintf("n请输入要查询的成绩

34、:");scanf("%f",&m); /输入要查询的成绩for(i=0;i<n;i+) /循环查找输入的成绩if(m=ai)printf("已找到,是第%d项,值为%.fn",i+1,ai);/输出查询的成绩break;if(i>=n)printf("找不到!n");printf("n结束请按0,继续请按1:");scanf("%d",&b);while(b); /循环查找ifclose(fp);printf("按回车返回:");get

35、ch();(9)学生成绩插入 insert.c#include"task.h"int insert(float a,int n) /成绩插入int b,i;float c;system("cls"); /清屏if(fp=fopen("text","w")=NULL) /打开文件printf("cannot read file");exit(1);for(i=0;i<n;i+) /从文件中读取数据fscanf(fp,"%f",&ai);doprintf("

36、;输入要插入的数:n");scanf("%f",&c); /输入要插入的数for(i=0;i<n;i+)if(ai=c|c<=0|c>100) /判断输入的成绩是否有效printf("n%.1f数据错误,继续输入:n",c);break;if(i>=n) an+=c;printf("n结束请按0,继续请按1:");scanf("%d",&b);while(b); /循环插入for(i=0;i<n;i+)fprintf(fp,"%.1f",a

37、i); /将插入的数写入文件fclose(fp); /关闭文件printf("按回车返回:");getch();return n;5.系统测试结果(1)进入欢迎界面:如图所示(2)学生成绩输入:如图所示(3) 成绩删除:如图所示(4)成绩查询:如图所示(5)成绩排序:如图所示(6)成绩插入:如图所示(7)显示成绩:如图所示任务二 链表结构系统设计1 问题描述本程序是通过链表来实现对动态数据结构来保存学生信息,并在链表中实现数据的输入、删除、查询、排序、显示、插入的功能。本课题需要实现一些拓展,并且用多文件操作。将成绩存入文件中,还要从文件中读出成绩。2 系统设计2.1系统功

38、能结构图如图1所示学生信息管理系统输入学生信息删除学生信息查询学生信息学生成绩排序输出学生信息插入学生信息图1 系统功能结构图2.2系统流程设计图如图2所示欢迎界面1.成绩输入,并判断成绩是否有效进入菜单选项2.循环删除成绩3.循环查找学生成绩4.学生成绩排序,并输出成绩0.退出系统5.输出学生成绩6.循环插入成绩,并判断学号是否相同图2 系统流程设计图2.3数据设计包括以下成员:学号:num 整型数据姓名:name2020位长的数字字符串成绩:score浮点型数据2.4系统文件结构图如图3所示zym_task2.h-头文件zym_main.c-主函数zym_menu.c-主菜单zym_inp

39、ut.c- -成绩输入zym_del.c-成绩删除zym_find.c-成绩查询zym_scort.c-成绩排序zym_display.c-成绩显示zym_insert.c-成绩插入图3 系统文件结构图3详细设计3.1 结构体定义结构体是一种构造类型数据,可以将一组不同的数据组合在一起统一管理。对于学生成绩管理程序,每个学生的信息除了成绩以外,还可以包含学号、姓名等不同类型的数据。因此,可构造结构体来表示每一个学生的信息,结构体的数据包括学号、姓名、成绩。结构体定义如下:typedef structint num;char name20;float score; STU;3.2文件和自定义函数

40、间关系文件名文件所对应的函数功能说明zym_main.cvoid main()主函数,进行选择功能选项zym_menu.cvoid menu()主函数,输入功能选项zym_ input.cSTU *input()输入学生信息,并对数据有效判断,可循环输入zym_ del.cSTU* del(STU*h)删除学生信息,可循环删除zym_find.cvoid find(STU*h)按学号查询成绩,可循环查询zym_sort.cSTU *scort(STU * h)成绩排序,并输出学生信息zym_display.cvoid display(STU *h)学生成绩显示zym_insert.cSTU *

41、insert(STU *h)在链表的结尾插入学生信息,并输出3.3函数之间调用关系如图5所示void menu()void main()STU *insert(STU *h)void display(STU *h)void find(STU*h)STU* del(STU*h)STU *input()STU *scort(STU * h)图5 函数之间调用关系3.4函数设计(1) 主函数A.函数原型:void main()B.功能:显示学生信息管理系统的7个功能C.入口参数:无D.出口参数:无E.通过键盘的输入,实现函数调用从而实现相应的功能。(2) 菜单函数A.函数原型:void menu()B.功能:显示菜单主界面C.入口参数:无D.出口参数:无E.描述:输出菜单选项(3) 学生的信息输入A.函数原型:STU *input()B. 功能:输入学生信息C.入口参数:无D. 出口参数:学生信息单链表的头指针E.描述:循环输入学生信息,并判断输入的信息是否有效,有效就写入链表中,无效则不写入链表。(4) 学生信息删除A.函数原型:STU* del(STU*h)B.功能:学生信息删除C.入口参数:学生信息单链表的头指针D.出口参数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论