南邮2014软件设计报告_第1页
南邮2014软件设计报告_第2页
南邮2014软件设计报告_第3页
南邮2014软件设计报告_第4页
南邮2014软件设计报告_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、软件设计报告 姓名:姓名: 学号:学号: 2014 年年 月月 日日2014 年年 月月 日日 目目 录录 第一章 软件设计介绍.1 第二章 软件开发平台简介.2 第三章软件设计的内容.3 3.1分数统计软件(A1).3 3.1.1 设计题目及要求.3 3.1.2 设计思想及程序流程框图.3 3.1.3 逻辑功能程序.4 3.1.4 结果及完善方向.6 3.2打字软件(A2).8 3.2.1 设计题目及要求.8 3.2.2 设计思想及程序流程框图.8 3.2.3 逻辑功能程序.9 3.2.4 结果及完善方向.11 3.3文本编辑器(A3).12 3.3.1 设计题目及要求.12 3.3.2 设

2、计思想及程序流程框图.12 3.3.3 逻辑功能程序.13 3.3.4 结果及完善方向.16 3.4加密软件(A4).17 3.4.1 设计题目及要求.17 3.4.2 设计思想及程序流程框图.18 3.4.3 逻辑功能程序.20 3.4.4 结果及完善方向.23 3.5进制转换器(A5).24 3.5.1 设计题目及要求.24 3.5.2 设计思想及程序流程框图.24 3.5.3 逻辑功能程序.25 3.5.4 结果及完善方向.28 3.6学生成绩核算系统的设计与实现(B1).30 3.6.1 设计题目及要求.30 3.6.2 设计思想及程序流程框图.31 3.6.3 逻辑功能程序.34 3

3、.6.4 结果及完善方向.41 3.7模拟电信计费系统的设计与实现(B2).47 3.7.1 设计题目及要求.47 3.7.2 设计思想及程序流程框图.48 3.7.3 逻辑功能程序.50 3.7.4 结果及完善方向.58 第四章 心得体会.63 第一章第一章 软件设计介绍软件设计介绍 通过软件设计的学习,掌握软件生存期过程和软件工程、 软件需求分析、软件复用技术、软件测试、软件维护、软件再工程、 软件工具、软件开发环境、软件质量保证体系、软件工程标准化和 软件文档、软件过程能力估计、软件工具项目管理等内容的基本概 念、方法和原理,并运用可视化开发工具,结合软件设计方法,通 过上机实验,提高应

4、用系统的开发能力。 本课程是一门技能训练课,为在校学生的必修课程。通过设计 培养学生良好的编程习惯,使学生掌握编程的基本步骤,规范学生 的编写程序的格式,锻炼学生编写程序的能力,为将来编写较大程 序的打好基础。 目的:目的:通过集中时间上机实验,对学生的程序设计能力进行一 次综合训练,使学生充分发挥已有的编程能力,熟悉编译环境。选 择若干课题,进行审题、分析、设计和调试,在程序准备、程序实 现、完成文档、答辩验收过程中,将全面巩固已学过的编程知识, 全面提高编程技能,在编程风格、调试器的使用、测试技术等方面 得到全面训练。学生在程序设计过程中,学生需要查找各种资料获 取有用信息解决实际问题,自

5、学相关知识,提高文档书写能力,加 强团队合作意识,提高口头表达能力。 任务:任务:软件设计课题共分 A 、B 两档。A 档共 5 题,题目 较简单,第一周完成;B 档共 2 题,题目是综合性的,较复杂,第 二周完成。 主要仪器设备 硬件:硬件:微型计算机 软件:软件:C、C+、Visual C+等 第二章第二章 软件开发平台简介软件开发平台简介 Visual Studio 是一套完整的开发工具集,它向开发的各 个过程提供辅助工具。Visual Studio 的主要功能,包括开发 Windows 窗体应用程序、开发 ASP.NET Web 应用程序、开发移 动应用程序等。Visual Studi

6、o 提供了开发应用程序的工具集。 编写.NET 程序最简单的环境其实有一个记事本和一个编译器就 足够了,之所以需要工具集或者 IDE 是因为现在企业需要你快 速、高效地开发出稳定、实用的计算机应用程序,而工具集的 作用也在于帮助你快速、高效地开发。 Visual Studio 提供了在设计、开发、调试和部署应用程 序时所需的工具,Visual C#集成开发环境(IDE)是 Visual Studio IDE 中的一种。打开 Visual Studio 选择 C#即 可进入 Visual C#集成开发环境,它里面有些工具是与其他 Visual Studio 语言共享的,还有一些工具(如 C#编译

7、器) 是 Visual C#特有的。 Visual Studio Remote Tools,用于远程操作的工具集合。 Visual Studio Tools,用于 Visual Studio .NET 开发的一些 辅助工具,有一些工具是 Visual Studio 系列开发工具一直都 有的,比如 Spy+工具,用来监视系统的进程、线程、窗口和 窗口消息等。 MSDN,提供全方位、丰富的帮助文档。 第三章第三章 软件设计的内容软件设计的内容 3.1 分数统计软件(分数统计软件(A1) 3.1.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个分数统计程序。包括学生信息的输入输出以及

8、排序。通过该课题全面熟悉数 组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求:课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 3.1.2 设计思想及程序流程框图设计思想及程序流程框图 输入学 生人数 n 输出菜单 选项 输入选项 n 输入学生 姓名 name 和分数 score 用程序将学生 分数排序 输出排序 后的学生 数据 结 束 开 始 3.1.3 逻辑功能程序逻辑功能程序 #include #include #include #include struct student int ID; ch

9、ar name10; /学生姓名 float score; /学生成绩 stu100; int num; void dis_menu(); /菜单显示函数 void set_menu(); /菜单设置程序 void set_inf(); /学生信息输入函数 void dis_inf(); /学生信息显示函数 void dec_sort(); /学生成绩降序排列 int main() while(1)/进入菜单程序 dis_menu(); set_menu(); return 0; void dis_menu()/菜单显示函数 printf(t 分数统计程序n); printf(tn); pri

10、ntf(t1、输入学生数据n); printf(t2、成绩降序排列n); printf(t3、退出程序n); printf(tn); printf(t 请选择你要进行的操作:); void set_menu()/菜单设置程序 char n100; scanf(%s,n);/键盘输入功能序号 if(strlen(n)1) printf(t 输入错误!请重新输入:); /报错返回菜单设置 set_menu(); else switch(*n) case 1: set_inf(); dis_inf(); break;/调用学生信息输入函数和学生信息显示函 数 case 2: dec_sort();

11、dis_inf(); break;/调用学生成绩降序排列函数和学生信息 输入函数 case 3: printf(t); exit(1); break;/退出程序 default: printf(t 输入错误!请重新输入:); set_menu(); break;/返回菜单 void set_inf()/学生信息输入函数 int i; for(i=0;inum;i+) stui.ID=i+1;/输入一个学号后自动+1 printf(t 学号:%dn,stui.ID); printf(t 姓名:); scanf(%s,);/键盘输入姓名 printf(t 成绩:); scanf(

12、%f,/键盘输入成绩 printf(n); void dis_inf()/学生信息显示函数 int i; printf(t 学生成绩统计如下:n); printf(t%-st%-10st%-8stn,学号,姓名,成绩); for(i=0;inum;i+) printf(t%-dt%-10st%-8gtn,stui.ID,,stui.score);/调用输入函数中输入 的数据 printf(n); void dec_sort()/学生成绩降序排列 int i,j,max_index,n=num; struct student stu_temp; for(i=0;in-1;i+)

13、/循环排序 max_index=i; for(j=i+1;jstumax_index.score) max_index=j; if(max_index!=i) stu_temp=stui; stui=stumax_index; stumax_index=stu_temp; 3.1.4 结果及完善方向结果及完善方向 3.2 打字软件(打字软件(A2) 3.2.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个打字程序。包括随机产生字符串,以及字符串比较和统计。通过此课题,熟 练掌握数组、格式输出、字符串处理等。 课题要求:课题要求: (1)随机产生一字符串,每次产生的字符串内容、长

14、度都不同; (2)根据(1)的结果,输入字符串,判断输入是否正确,输出正确率; (3)具有输入输出界面。 3.2.2 设计思想及程序流程框图设计思想及程序流程框图 3.2.3 逻辑功能程序逻辑功能程序 #include #include #include #include void dz() char magic20; char guess20; int length; int flag; int right=0; float r; int k,j,i,n; srand(time(NULL); length=rand()%15+1; printf(字符串长度为:%dn,length); i+

15、ai=bi count+ i=n i=0,k=0 k=1.0*count/n ai=bi count+ i+ in k=1.0*count/m m 结束 Y Y Y Y Y N N N N N for(j=0;jlength;j+)/产生随即字符 flag=rand()%2; if(flag) magicj=a+rand()%26; else magicj=A+rand()%26; /随机输入 26 个字母大小写任意 printf(n 字符串为:); for(i=0;ilength;i+)/产生字符串 printf(%c,magici); printf(n 请输入字符:); getchar()

16、; scanf(%s,guess);/键盘输入字符 k = strlen(guess);/检测长度 if (k != length)/长度比较 printf(长度错误!n); return;/报错并返回主界面 getchar(); /进行对比 for(n=0;nlength;n+) if(magicn=guessn) right+; printf(%dn,right); r= (float)right/length;/正确的字符数/字符串长度 printf(你的正确率是%fnn,r); void main() char n10; int c = 1; while (c) printf(1.打字

17、练习n); printf(2.停止打字,退出程序n); printf(请选择n); scanf(%c, c=n0-48; switch(c) case 1: dz(); break; case 2: c = 0; /退出程序 break; default: c = 1; /报错 printf(输入错误nn); break; /返回主界面 printf(n); 3.2.4 结果及完善方向结果及完善方向 3.3 文本编辑器(文本编辑器(A3) 3.3.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个简单的文本编辑器,该系统要求对一个文本文件中的内容进行各种常规操作, 如:插入、删除

18、、查找、替换等功能。通过此课题,熟练掌握文本文件的操作及用字符数 组或字符指针实现字符串操作的功能。 课题要求:课题要求: (1)编辑文本; (2)保存、打开指定位置的文本文件; (3)具有输入输出界面。 3.3.2 设计思想及程序流程框图设计思想及程序流程框图 2 3 1 3.3.3 逻辑功能程序逻辑功能程序 #include #include /包含 exit(1)的原型 #include void menu1(); void create_file(FILE *fp,char *fname);/创建文件函数 void write_file(FILE *fp,char *fname);/编

19、辑文件函数 void read_file(FILE *fp,char *fname);/读取文件函数 int main() FILE *fp; int count=0; char num100; int flag1,flag2,flag3; char F_name20; 开 始 输出功能菜单 输入 n n 结 束 建立文本 编辑文本 输入文件名 输入文件名 输入文件名 读取文本 while(1)/进入程序 menu1(); printf(t 请选择你要进行的文件操作:); scanf(%s,num); getchar(); while(strlen(num)1|num052) printf(t

20、 输入错误!请重新输入:); scanf(%s,num);/键盘输入选项 getchar(); switch(num0) case 1: flag1=1; break;/选择创建文件函数 case 2: flag2=1; break;/选择编辑文件函数 case 3: flag3=1; break;/选择读取文件函数 case 4: printf(t); exit(0); break;/退出程序 if(flag1=1) flag1=0; create_file(fp,F_name); else if(flag2=1) flag2=0; write_file(fp,F_name); else i

21、f(flag3=1) flag3=0; read_file(fp,F_name); return 0; void menu1() printf(t 文本编辑器n); printf(tn); printf(t1、建立文本n); printf(t2、编辑文本n); printf(t3、读取文本n); printf(t4、退出程序n); printf(tn); void create_file(FILE *fp,char *fname) printf(t 请键入新建的文件名(如 D:name.txt):nt); gets(fname); if(fp=fopen(fname,w+)=NULL)/没有输

22、入正确的文件名时报错 printf(t 不能打开文件!n); exit(0); printf(t%s 文件已经创建好!nn,fname); fclose(fp); void write_file(FILE *fp,char *fname) char ch; printf(t 请键入编辑的文件名(如 D:name.txt):nt); gets(fname); if(fp=fopen(fname,w)=NULL)/文件不存在时报错 printf(t 不能打开文件!n); exit(0); printf(t 请输入内容(以#号键结束):nt); ch=getchar(); while(ch!=#)/

23、检测到“#”时结束输入 fputc(ch,fp); ch=getchar(); printf(nn); getchar(); fclose(fp); void read_file(FILE *fp,char *fname) char ch; printf(t 请键入读取的文件名(如 D:name.txt):nt); gets(fname); if(fp=fopen(fname,r)=NULL)/文件不存在或文件名错误时报错 printf(t 不能打开文件!n); exit(0); printf(t); while(ch=fgetc(fp)!=EOF) putchar(ch); printf(t

24、nn); fclose(fp); 3.3.4 结果及完善方向结果及完善方向 3.4 加密软件(加密软件(A4) 3.4.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个加密程序。包括明文与密钥的转换。通过此课题,熟练掌握数组、格式输出、 字符串处理、类型转换等。 课题要求:课题要求: (1)输入任意一段明文 M,以及密钥 K; (2)根据以下公式将其转换为密文 C。 Ci = mi + K ,其中 i = 0,1,n-1 , K 为密钥; (3)具有输入输出界面。 3.4.2 设计思想及程序流程框图设计思想及程序流程框图 1.程序整体框图程序整体框图 开始 输入明文和密钥 密钥

25、转换 加密 解密 输出明文 输出密文 结束 N Y 2.密钥转换流程图密钥转换流程图 开始 密钥字符串 s , i=0,k=0 L=strlen(s) i127 结束 输出 k k=k%128 N N Y Y 3.加密流程图加密流程图 3.4.3 逻辑功能程序逻辑功能程序 #include #include #include #include #include void menu(); mi126 mi=mi-127 i+ mi33 mi=mi+33 开始 明文 m ,密钥 k i=0 L=strlen(m) iL mi=mi+k mi0 mi=mi+127 输出密文 结束 N N N N Y

26、 Y Y int itn(char s); void Jiami(char m,int k); void Jiemi(char m,char y); int main() char m1000; /输入的明文 char y1000; /输入的密钥 char s10; char m11000; char ch; int k,choice; int i,n; do system(cls); menu(); printf( 请输入一段明文:); gets(m); strcpy(m1,m); printf(n 请输入密钥(按#号键结束):); for(i=0;i+) /密钥输入不显示字符,显示* ch

27、=getch(); if(ch=#) yi=0; break;/检测到“#”时自动结束输入 putchar(*); yi=ch; k=itn(y); Jiami(m,k); printf(是否需要解密?(y/n): ); ch=getchar(); getchar(); if(ch=y|ch=Y) Jiemi(m1,y); printf(n 继续请按 1,退出请按 0:); scanf(%d, getchar(); while(n); return 0; void menu()/菜单程序 printf(t 加密程序nn); printf(tnnn); int itn(char s) int i

28、,k=0,l;/输入字符串转换为数值 l=strlen(s); for(i=0;i127) k=k%128; return k; void Jiami(char m,int k) /加密程序 int i,l; l=strlen(m); printf(tttnn- 密文 - nn); for(i=0;il;i+) / 其间为可打印字符 mi=mi+k; if(mi126) mi=mi-127; if(mi33) mi=mi+33; printf(%c,mi); printf(nn n); void Jiemi(char m,char y)/解密程序 int count=0,i,f;/加密程序的逆

29、过程 char s1000,ch; do f=0; printf(n 请输入密钥(按#号键结束):); for(i=0;i+) /密钥输入不显示字符,显示* ch=getch(); if(ch=#) si=0; break;/检测到“#”停止 putchar(*); si=ch; if(strcmp(s,y)=0) printf(nn 解密成功,明文为:);puts(m); else printf( 密钥错误!n);f=1;count+; if(count=3)printf(n 您输入的 3 次密钥均错误,解密失败!n); break; while(f); 3.4.4 结果及完善方向结果及完善

30、方向 3.5 进制转换器(进制转换器(A5) 3.5.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个进制转换器程序。包括二进制、八进制、十进制、十六进制数互相转换。通 过此课题,熟练掌握字符串、格式输出、进制换算的各种操作。 课题要求:课题要求: (1)可输入二进制、八进制、十进制、十六进制数; (2)将已输入的数转换成其余进制的数; (3)具有输入输出界面。 3.5.2 设计思想及程序流程框图设计思想及程序流程框图 开始 输入“输入进制”base1 输入一个 base1 进制的数 n n 合法 N Y 3.5.3 逻辑功能程序逻辑功能程序 #include #include

31、 #include #include void dis_menu(); /菜单显示 void set_menu(); /菜单设置 void DX_transfer(int num,int n); /十进制转换为其他进制 int XD_transfer(int n); /其他进制转换成十进 int main() while(1)/进入程序 dis_menu(); set_menu(); return 0; void dis_menu() printf(t 进制转换器程序n); printf(tn); printf(t1、输入二进制n); printf(t2、输入八进制n); printf(t3、

32、输入十进制n); printf(t4、输入十六进制n); printf(t5、退出程序n); printf(tn); 输入“输出进制”base2 n 转换成十进制数 temp temp 转换成 base2 进制数 输出 结束 printf(t 请选择你要进行的操作:); void set_menu()/菜单设置函数 int num; char n500; scanf(%s,n); if(strlen(n)1) printf(t 输入错误!请重新输入:); set_menu(); else switch(*n) case 1: num=XD_transfer(2); DX_transfer(nu

33、m,8); printf(t 转换 10 进制输出为: %dn,num); DX_transfer(num,16); printf(tn); break; case 2: num=XD_transfer(8); DX_transfer(num,2); printf(t 转换 10 进制输出为: %dn,num); DX_transfer(num,16); printf(tn); break; case 3: num = XD_transfer(10); DX_transfer(num,2); DX_transfer(num,8); DX_transfer(num,16); printf(tn)

34、; break; case 4: num=XD_transfer(16); DX_transfer(num,2); DX_transfer(num,8); printf(t 转换 10 进制输出为:%dn,num); printf(tn); break; case 5: printf(t); exit(1); break; default: printf(t 输入错误!请重新输入:); set_menu(); break; void DX_transfer(int num,int n) char num_tp100; int i=0; printf(t 转换%d 进制输出为:,n); if(n

35、9 else num_tpi=0+num%16; num=num/16; i+; num_tpi=0; while(i!=0) putchar(num_tp-i); printf(n); int XD_transfer(int n) char temp100,ch,m; int num=0,i=0,flag=1,count=0; while(flag) i=0; flag=0; count=0; fflush(stdin); /清空输入缓冲区,确保读入无错 printf(t 请输入%d 进制数:,n); m=48+n-1; if(n16) while(ch=getchar()!=n) if(c

36、hm) printf(t 输入数字有误!n); flag=1; break; tempi=ch; count+; i+; tempi=0;/ 输入正确八进制结束 for(i=0;icount;i+) num=num+(tempi-0)*(int)pow(n,(count-i-1);/计算值 else while(ch=getchar()!=n) if(ch9) flag=1; break; tempi=ch; count+; i+; tempi=0;/ 输入正确十六进制结束 for(i=0;i=0 return num; 3.5.4 结果及完善方向结果及完善方向 3.6 学生成绩核算系统的设计

37、与实现(学生成绩核算系统的设计与实现(B1) 3.6.1 设计题目及要求设计题目及要求 课题内容:课题内容: 设计一个学生成绩核算系统。能实现从文件中读取学生成绩资料,并提供成绩查询统 计服务。通过此课题,熟练掌握文件、数组、结构体的各种操作以及友好界面的设计。 课题要求:课题要求: (1)按班级按课程从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩。 (2)三个成绩对总评成绩的百分比被定义为常数,各占总成绩的 30%、30%和 40%。 (3)计算每位学生的总评成绩。 (4)计算该班级本课程的总平均成绩。 (5)计算处于优、良、中、及格、不及格的学生人数以及占总人数的百分比。其中 10

38、0-90 为优,89-80 为良,79-70 为中,69-60 为及格,60 分以下为不及格。 (6)按要求输出成绩在优、良、中、及格、不及格各区间的学生学号、成绩。 3.6.2 设计思想及程序流程框图设计思想及程序流程框图 1、程序系统框图程序系统框图 开始 输入选项 choice=1choice=2 choice=3 choice=4choice=5 choice=6choice=7choice=0 从文 件中 读取 数据 计算 并显 示成 绩 按 等级 查询 按总 评成 绩排 序 按 学号 查询 查询 所有 等级 保存 到文 件 退出系统 结束 按 任 意 键 返 回 主 菜 单 输入错

39、误 2、查询部分程序流程(以查询学号为例)查询部分程序流程(以查询学号为例) 输入待查询学号 ch10 i=0 i60? listi.grade=C listi.score70? listi.grade=B listi.score80? listi.grade=A listi.score90? 计算总评成绩 listi.score=listi.s1*0.3+listi.s2*0.3+listi.s3*0.4 输出 iamount? i=0 N Y N Y N Y N Y Y N 结束 开始 3.6.3 逻辑功能程序逻辑功能程序 #include #include #include struct

40、 stu char code10; float s1,s2,s3; float score; char grade; temp; void set(int *choice) printf( -1、从文件读取数据-n); printf( -2、计算并显示成绩-n); printf( -3、按等级查询 -n); printf( -4、按总评成绩排序-n); printf( -5、按学号查询 -n); printf( -6、查询所有等级 -n); printf( -7、保存到文件 -n); printf( -0、退出系统 -nn); printf( 请选择功能:); *choice=getch();

41、 void dispinfo() system(cls); printf(nn); printf( *欢迎进入成绩核算系统 *n); printf( *nn); int readfile(struct stu *list) int n; int i=0; FILE *fp; fp=fopen(note.dat,r); fscanf(fp,%d, for(i=0;in;i+) fscanf(fp,%s %f %f %f,listi.code, printf(n n); printf( 学号 平时成绩期中成绩期末成绩n); printf( n); for(i=0;in;i+) printf( %s

42、 %5.1lf %5.1lf %5.1lf n,listi.code,listi.s1,listi.s2,listi.s3); printf( n); printf(nn 读取文件成功!按任意键继续 n); getch(); fclose(fp); return n; void view(struct stu *list,int amount) int i=0; float average=0; printf(n n); printf( 学号 平时 期中 期末 总分 等级n); printf(n); for(i=0;iamount;i+) average+=listi.score; print

43、f(%10s%6.1f%6.1f%6.1f%6.1f %c n,listi.code,listi.s1,listi.s2,listi.s3,listi.score,listi.grade); printf(n); average/=amount; printf( 本班总人数 %d 本班平均成绩 %.1fn,amount,average); printf(nnnnn *按任意键继续* n); getch(); void discharge(struct stu *list,int amount) float temp; char temp1; char temp210; int i,j; for(i=0;iamount;i+) for(j=i+1;jlisti.score) /比较分数 temp=listj.score; listj.score=listi.score; listi.score=temp; strcpy(temp2,listj.code); strcpy(listj.code,listi.code

温馨提示

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

评论

0/150

提交评论