软件质量保证与测试
大学生在校作业专栏
何患现在@何惧将来
这个作者很懒,什么都没留下…
展开
-
7-2 N个数求和
7-2 N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。输入样例1:52/5 4/15 1/30 -2/60 8/3输出样例1:3 1/3输入样例2:24/3 2/3输出样例2:2输入样例3:31/3原创 2021-12-19 22:29:17 · 257 阅读 · 0 评论 -
工作分配问题
工作分配问题问题描述:设有n件工作分配给n个人。将工作i分配给第j个人需要支付的劳务费为cij,请设计算法,为每个人都分配1件不同的工作,并使得总劳务费达到最小。实现提示:该问题的解空间是一棵排列树,可用搜索排列树的回溯框架实现。输入格式:输入数据的第一行为1 个正整数n (1≤n≤20),表示工作的数量,随后输入n行,每行n个数,表示相应的劳务费。输入样例:310 2 32 3 43 4 5输出样例:9import java.util.Scanner;pu原创 2021-12-14 22:50:58 · 318 阅读 · 0 评论 -
子集和问题
子集和问题问题描述:给定集合S,S中有n个正整数,M是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中各元素之和等于M。请设计回溯法求解子集和问题,如果问题无解,输出“No Solution”问题有解,则输出满足子集S1中各元素的值。import java.io.*;@SuppressWarnings("all")public class subset_sum_problem {//子集和问题--回溯法 static int sum = 0; static原创 2021-12-14 22:50:25 · 153 阅读 · 0 评论 -
整数变换问题
整数变换问题描述:整数i的两种变换定义为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6dpn4EV-1639493352658)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)],[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZqZQHftH-1639493352661)(file:///C:/Users/86152/AppDat原创 2021-12-14 22:50:00 · 258 阅读 · 0 评论 -
最大k乘积问题
问题描述:设X是一个n位十进制整数,如果将X划分为K段,则可得到K个整数,这K个整数的乘积称为X的一个K乘积。请设计算法并编程实现,对于给定的X 和K,求出X的最大K乘积。输入:X,K,n输出:X的最大K乘积。实现提示:设f(s,t)是X从第s位开始的t位数字组成的十进制数,t(i,j)表示前 i 位数分成 j 段的最大乘积,则状态转移方程为:t(i,j) = max{ t(k,j-1) * f(k,i-k) } (1<=k<i)测试用例:421234原创 2021-12-14 22:48:40 · 242 阅读 · 0 评论 -
最大子段和
最大子段和给定由n个整数(可能有负整数)组成的序列(a1,a2,…,an),最大子段和问题要求该序列形如[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QvnwfjV-1639493275486)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20211213153243081.png)]的最大值(1<=i<=j<=n),当序列中所有整数均为负整数时,其最大子段和为0。@原创 2021-12-14 22:48:05 · 165 阅读 · 0 评论 -
矩阵连乘问题 动态规划
矩阵连乘问题在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52HGaeO4-1639391368981)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_ima原创 2021-12-14 22:47:35 · 124 阅读 · 0 评论 -
最长公共子序列 动态规划
最长公共子序列 动态规划若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,原创 2021-12-13 18:29:06 · 808 阅读 · 0 评论 -
多机调度问题 贪心算法
多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业要求:分别采用以下两种贪心策略实现算法求解,对比实验结果,分析哪种贪心策略更适合应用于多机调度问题。最长处理时间作业优先的贪心选择策略。最短处理时间作业优先的贪心选择策略。至少采用两组实验数据进行实验,请参考实验数据一,自己再设计一组实验数据。实验数据一:7个独立的作业由3台机器加工处理,各作原创 2021-12-13 18:28:32 · 2342 阅读 · 0 评论 -
最优分解问题 贪心算法
最优分解问题问题描述:设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。输入:正整数n输出:计算的最大乘积。如输入10,则输出30.提示:若a+b的值为一个常量,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。import java.util.Scanner;public class Optimal_decomposition_proble原创 2021-12-13 18:27:58 · 684 阅读 · 0 评论 -
删数问题 贪心算法
删数问题描述:给定一个高精度正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。应用贪心算法设计求解 设计要点操作对象为n位高精度数,存储在数组a中。在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i原创 2021-12-13 18:27:25 · 384 阅读 · 0 评论 -
最优服务次序问题 贪心算法
最优服务次序问题问题描述:设有 n个顾客同时等待一项服务,顾客i需要的服务时间为ti,(1<=i<=n)。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?(平均等待时间是n个顾客等待服务时间总和除以n)输入:第一行为一个正整数n,表示有n个顾客第二行为n个正整数,表示n个顾客需要的服务时间输出:最小平均等待时间。import java.util.Arrays;import java.util.Scanner;public class Optimal_se原创 2021-12-13 18:26:53 · 709 阅读 · 0 评论 -
棋盘覆盖问题
棋盘覆盖问题输入:棋盘大小、特殊方格的行号和列号输出:基本要求:以相同的数字表示一个L型骨牌,输出棋盘中每个方格对应的数字。扩展部分:以图示的方法显示棋盘,以不同的颜色区别L型骨牌。import java.util.Scanner;public class Chessboard_coverage_problem {//棋盘覆盖问题 分治 public static void main(String args[]) { int size = 0,jx = 0,jy原创 2021-12-13 18:26:22 · 234 阅读 · 0 评论 -
半数集问题
半数集问题问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:(1) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-psaYtobW-1639391125334)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)];(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(3) 按此规则进行处理,直到不能再添加自然数为止原创 2021-12-13 18:26:00 · 121 阅读 · 0 评论 -
找出两数组的中位数 O(log n ) 分治与递归
设X[0:n - 1 ] 和 Y[0:n - 1 ] 为两个数组,每个数组含有 n 个已经 排好序的数,试设计一个O(log n ) 时间的算法,找出X 和 Y 的 2n个数的中位数public class Median_of_two_sorted_arrays {// public static void main(String args[]){ // int []arr1 = {1,4,7,9}; // int []arr2 = {原创 2021-12-13 18:25:11 · 349 阅读 · 0 评论 -
Fibonacci数列 递归与分治
Fibonacci数列无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfsZSW9z-1639391007775)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20211212181754705.png)]第n个Fibonacci数可递归地计算如下:int fibonacci(原创 2021-12-13 18:24:05 · 197 阅读 · 0 评论 -
最大子段和问题
最大子段和问题描述:给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20输入格式:第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。输出格式:输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。输入样例:6-2 11 -4 13 -5 -2输出样例:202原创 2021-12-13 18:22:59 · 94 阅读 · 0 评论 -
输出所有可能的五位数
由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。/** 3. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数* */public class test { public static void main(String args[]) {//穷举 int a,b,c,d,e;//万 千 百 十 个 for(a=1;a<=4;a++){原创 2021-12-12 23:13:42 · 348 阅读 · 0 评论 -
排序算法效率比较
排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。记录不同排序算法的运行时间。对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。im原创 2021-12-12 23:12:45 · 130 阅读 · 0 评论 -
求两个整数的最大公约数
分别用穷举法和欧几里德算法实现求两个整数的最大公约数,并比较算法的效率。import java.util.Scanner;public class greatest_common_divisor { public static void main(String []args){ Scanner scanner = new Scanner(System.in); System.out.println("请输入两个整数"); int a = 0, b原创 2021-12-12 23:11:55 · 78 阅读 · 0 评论 -
子集和问题 回溯
子集和问题给定n个不同的正整数集合w=(w1,w2,…,wn)和一个正数W,要求找出w的子集s,使该子集中所有元素的和为W。输入格式:第一行输入n和W,第二行依次输入n个数。输出格式:每行输出一个符合要求的子集。输入样例:4 3111 13 24 7输出样例:11 13 724 7import java.io.*;@SuppressWarnings("all")public class subset_sum_problem {//子集和问题--回溯法原创 2021-12-12 09:06:15 · 436 阅读 · 0 评论 -
0/1背包问题 回溯
0/1背包问题描述:0/1背包问题。给定一载重量为W的背包及n个重量为wi、价值为vi的物体,1≤i≤n,要求而且重量和恰好为W具有最大的价值。输入格式:第一行输入背包载重量W及背包个数n,再依次输入n行,每行为背包重量wi和价值vi。输出格式:第一行输出装入背包内的物体编号(末尾有空格),若没有任何物品能装入,输出: No,第二行输出背包内的物体总价值。输入样例:5 102 62 36 55 44 6输出样例1 2 515输入样例:2 1011原创 2021-12-12 09:05:45 · 889 阅读 · 0 评论 -
回溯算法_调度问题
回溯算法_最佳调度问题描述:假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。输入格式:输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。输出格式:将计算出的完成全部任务的最早时间输出到屏幕。输入样例:7 32 14 4 16 6 5 3原创 2021-12-12 09:00:49 · 214 阅读 · 0 评论 -
排序算法效率比较
排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。记录不同排序算法的运行时间。对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。im原创 2021-12-12 08:54:53 · 281 阅读 · 0 评论 -
输出可能的五位数
由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。/** 3. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数* */public class test { public static void main(String args[]) {//穷举 int a,b,c,d,e;//万 千 百 十 个 for(a=1;a<=4;a++){原创 2021-12-12 08:54:10 · 195 阅读 · 0 评论 -
最大子段和问题
最大子段和问题描述:给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20输入格式:第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。输出格式:输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。输入样例:6-2 11 -4 13 -5 -2输出样例:202原创 2021-12-12 08:52:41 · 89 阅读 · 0 评论 -
Mybatis 学习记录
Mybatis简介MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。持久层持久化就是将程序在持久和瞬时状态转化过程为什么需要mybatis传统的JDBC代码太复杂,需要一个框架将其简化帮助原创 2021-12-10 22:31:43 · 848 阅读 · 0 评论 -
活动选择问题 贪心算法
活动选择问题描述:假定一个有n个活动(activity)的集合S={a1,a2,…,a**n},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a**i都有一个开始时间s**i和一个结束时间f**i,其中0<=s**i<f**i<=32767。如果被选中,任务a**i发生在半开时间区间[s**i,f**i)期间。如果两个活动a**i和a**j满足[s**i,f**i)和[s**j,f**j)不重叠,则称它们是兼容的。也就说,若s**i&g原创 2021-12-10 20:38:52 · 399 阅读 · 0 评论 -
汽车加油问题 贪心算法
汽车加油问题描述:题目来源:王晓东《算法设计与分析》一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。输入格式:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。输出格式:输出最少加油次数。如果无原创 2021-12-10 20:38:16 · 587 阅读 · 0 评论 -
月饼问题 贪心算法
月饼描述:月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿原创 2021-12-10 16:31:32 · 172 阅读 · 0 评论 -
装箱问题 贪心算法
装箱问题描述:假设有N项物品,大小分别为s1、s2、…、s**i、…、s**N,其中s**i为满足1≤s**i≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数s**i(1≤s**i≤100,表示第i项物品的大小)。输出格式:原创 2021-12-10 16:30:50 · 459 阅读 · 0 评论 -
求解矩阵最小路径和问题 动态规划
求解矩阵最小路径和问题描述:给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。输入格式:首先输入行数m及列数n,接下来输入m行,每行n个数。输出格式:输出第一行为最小路径(假定测试数据中的最小路径唯一),第2行为最小路径和。输入样例:4 41 3 5 98 1 3 45 0 6 18 8 4 0输出样例:1 3 1 0 6 1 012149原创 2021-12-10 16:30:19 · 2704 阅读 · 0 评论 -
石子合并 动态规划
石子合并描述:在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出一个算法,计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。输入格式:数据的第 1 行是正整数 N ,表示有 N 堆石子。第 2 行有 N 个整数,第 i 个整数 a**i 表示第 i 堆石子的个数。输出格式:输出共 2 行,第 1 行为最小得分,第 2 行为最大得分。输入样例:44 5 9原创 2021-12-10 16:29:42 · 534 阅读 · 0 评论 -
回文串问题_动态规划
描述:一个字符串,如果从左到右读和从右到左读是完全一样的,比如"aba",我们称其为回文串。现在给你一个字符串,可在任意位置添加字符,求最少添加几个字符,才能使其变成一个回文串。输入格式:任意给定的一个字符串,其长度不超过1000.输出格式:能变成回文串所需添加的最少字符数。输入样例:Ab3bdAbb输出样例:21import java.util.Scanner;@SuppressWarnings("all")public class Palindro原创 2021-12-09 23:08:39 · 227 阅读 · 0 评论 -
分形的递归输出
描述:分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。输入格式:输入一系列度,每行给出一个不大于7的正整数。输入的最后一行以-1表示输入结束输出格式:对于每个用例,输出用’X’标记的盒状分形。**在每个测试用例后输出包含一个短划线“-”的一行。输入样例:1234-1输出样例:XX XXX XX X X XX XX X原创 2021-12-08 22:28:12 · 195 阅读 · 0 评论 -
JavaScript在发送AJAX请求时,URL地址是使用绝对地址还是相对地址
js到最后会把相对地址转化为绝对地址,所以使用相对也没事相对地址是相对当前,绝对地址是从你的根目录开始,我个人倾向于相对,绝对太长了,你不一定打的对,但他有他的好处,不容易出错。...原创 2021-11-16 14:00:44 · 641 阅读 · 0 评论 -
游览器的跨域访问
跨域指的是跨域名访问,一个域上加载的脚本获取获取或操作另一个域上的得文档属性,跨域情况包括①域名不同,②域名相同端口不同③二级域名不同三种情况为什么会有跨域问题呢 跨域不—定会有跨域问题。因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。因此:跨域问题是针对ajax的—种限制。·如何实现①JSONP②CORS③降域...原创 2021-11-14 16:42:00 · 339 阅读 · 0 评论 -
软件全面质量管理的思想体系
全面质量管理是世界各国普遍采用的先进的质量管理方法,其内涵是指质量管理的范围不仅仅限于产品质量本身,而是包含质量管理的各个方面,即将质量管理工作从生产扩大到设计、研制、生产准备、材料采购、生产制造、销售和服务等各个环节;将产品质量扩大到工序质量、工作质量和管理质量。所以,全面质量管理是一种涵盖全员、全面、全过程的质量管理体系。在项目质量管理中,运用全面质量管理的思想,就是将项目的质量管理对象、过程、活动、主体等看成一个有机整体,对影响项目质量的各种因素,从宏观、微观、人员、技术、管理、方法、环境等各方面进原创 2021-11-12 23:12:04 · 75 阅读 · 0 评论 -
CMM与CMMI的关系
首先让我们来了解一下什么是CMMCMM是目前世界上公认的软件产品进入国际市场的通行证,不仅是对产品质量的认证,更是软件过程改善的途径。由美国卡内基梅隆大学的软件研究所(SEI)创立的CMM的认证评估,CMM是目前世界公认的软件产品进入国际市场的通行证,它不仅仅是对产品质量的认证,更是一种软件过程改善的途径。软件开发企业通过CMM的评估认证不仅仅是目标,它是推动软件企业在产品的研发、生产、服务和管理上不断成熟和进步的手段,是一种持续提升和完善企业自身能力的过程。那什么是CMMI呢CMMI(Capabi原创 2021-11-12 23:05:37 · 194 阅读 · 0 评论 -
什么是MTTF、MTBF、MTRF
①MTTF(meantime to failure)对于不可修复系统, 系统的平均寿命指系统发生失效前的平均工作(或存储) 时间或工作次数, 也称为系统在失效前的平均时间, 记为MTTF 。系统的可靠性越高,平均无故障时间越长。②MTBF(mean time between failure)对于可修复系统, 系统的寿命是指两次相邻失效(故障) 之间的工作时间, 而不是指整个系统的报废时间。平均寿命即是平均无故障时间, 也称为系统平均失效间隔, 记为MTBF。MTBF越长,表示可靠性越高正确工作能力越原创 2021-11-09 23:43:34 · 8468 阅读 · 0 评论