c語言課程設計-學生信息管理系統(tǒng)設計報告_第1頁
已閱讀1頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  C語言課程設計</b></p><p>  題 目:學生成績管理系統(tǒng)</p><p>  完成時間:2010年6月24號</p><p><b>  一、設計目的</b></p><p>  1、通過課程設計全面掌握《C語言程序設計》關鍵知識點,掌握C語言中數(shù)組、

2、指針、結構體、文件等方面的基本知識。</p><p>  2、通過課程設計了解并掌握C語言程序設計的方法,熟悉C程序設計的開發(fā)環(huán)境及C程序的調試過程。</p><p>  3、培養(yǎng)學生查閱參考資料、手冊的自學能力,通過獨立思考深入鉆研有關問題,學會自己分析、解決問題的方法。</p><p><b>  二、設計內容</b></p>

3、<p>  設計一個學生成績管理系統(tǒng),對上學期的本班的學習成績進行管理,具有查詢和檢索功能,并且能夠對指定文件操作,也可將多個文件組成一個文件。</p><p><b>  主要功能:</b></p><p><b>  1、鍵入學生信息</b></p><p><b>  2、查看錄入的信息<

4、/b></p><p><b>  3、按姓名查看信息</b></p><p><b>  4、按學號查看信息</b></p><p><b>  5、按平均成績排序</b></p><p><b>  6、刪除信息</b></p>&

5、lt;p><b>  7、保存信息</b></p><p><b>  8、讀取文件</b></p><p><b>  9、我的個人信息</b></p><p><b>  0、退出</b></p><p><b>  三、系統(tǒng)流程圖&l

6、t;/b></p><p><b> ?。ㄒ娤乱豁摚?lt;/b></p><p>  四、函數(shù)主要功能說明:</p><p>  1、輸入學生的信息函數(shù)功能:type函數(shù)通過循環(huán)向結構體中輸入學生的學號、姓名、性別、英語成、數(shù)學成績、語文成績。</p><p><b>  Type函數(shù)流程圖</b>

7、;</p><p>  2、查看輸入的信息功能:通過look函數(shù)以一個循環(huán)的形式輸出所要查看的信息。</p><p>  3、查詢功能:通查詢信息,過search_name函數(shù)和search_number函數(shù)來進行比較查找,找到后輸出該學生信息</p><p><b>  查找函數(shù)的流程圖</b></p><p>  4

8、、排序功能:對數(shù)據進行排序,通過order函數(shù)對數(shù)據按平均分進行排序,排序結束后調用save函數(shù)保存。</p><p>  5、刪除功能:刪除信息,通過del函數(shù)實現(xiàn),刪除后調用save函數(shù)對數(shù)據保存。</p><p>  6、保存功能:對數(shù)據進行保存,用save函數(shù)向文件中寫入數(shù)據實現(xiàn)該功能。</p><p><b>  7、退出程序</b>

9、</p><p>  五、調試方法以及測試過程中的問題及解決方法</p><p>  調試方法:逐條的對程序中的錯誤進行修改;修改程序中的變量、聲明新函數(shù)以及聲明頭文件對函數(shù)進行調試。</p><p>  測試過程中遇到的問題:</p><p>  1、刪除學生信息功能不能實現(xiàn)。</p><p>  問題描述:在選擇刪

10、除功能后不能把選擇的學生信息刪除,而總是刪除其他學生的信息。</p><p>  解決辦法:出現(xiàn)這個問題肯定是數(shù)據覆蓋的時候出現(xiàn)了錯誤,也就是循環(huán)出現(xiàn)了錯誤。檢查循環(huán)程序后發(fā)現(xiàn),循環(huán)體內數(shù)據交換出現(xiàn)了錯誤,沒有定義結構體變量。重新定義結構體變量后問題解決了。</p><p>  2、顯示結果時候出錯</p><p>  問題描述:每一個功能在現(xiàn)實結果現(xiàn)實的信息部完整

11、,部分信息部能現(xiàn)實或被覆蓋。</p><p>  解決辦法:現(xiàn)實出錯也就是printf語句中的結構沒有排列好所導致的。檢查所有的Printf語句后發(fā)現(xiàn)所有的printf語句中少輸出了以個語文成績,且它們不能完全對齊。在增加了“語文”,修改了轉義字符以及空格后,問題解決了。</p><p>  3、在查詢信息的時候出錯</p><p>  問題描述:在輸入不在文件中保

12、存的姓名、學號時,沒有信息提示。</p><p>  解決辦法:出現(xiàn)此問題說明if語句后少了一條else語句,加上該語句后,顯示的結果正確了。</p><p><b>  4、打開文件出錯</b></p><p>  問題描述:當顯示保存成功后關閉程序。重新打開程序選擇打開文件后,文件不能正常打開,或打開文件后沒有顯示結果。</p>

13、<p>  解決辦法:查看文件文件中有數(shù)據,說明文件在保存的是后沒有出錯。再仔細觀察運行結果后,發(fā)現(xiàn)該函數(shù)在執(zhí)行到循環(huán)輸出的時候把該循環(huán)跳了過去沒有執(zhí)行。出現(xiàn)此問題是因為循環(huán)的終止條件改變了。將openl函數(shù)該為有返回值函數(shù)之后,重新定義了一個see函數(shù)來調用openl函數(shù),并在see函數(shù)中用循環(huán)輸出已經打開的文件中的數(shù)據。重新定義一個函數(shù)后保存的文件可以成功的打開。</p><p>  5、在排序

14、后沒有保存文件</p><p>  解決辦法:在order函數(shù)后邊加上了</p><p>  printf("是否保存?(y or n)");</p><p>  getchar();</p><p>  scanf("%c",&a);</p><p>  if(a==&

15、#39;y') </p><p><b>  save();</b></p><p><b>  else</b></p><p>  printf("退出");語句后可以選擇是否保存排序后的文件。</p><p><b>  六、設計心得</b>

16、</p><p>  通過一個星期的課程設計,我更深刻的了解了C語言中每個函數(shù)的含義,領會了算法是C語言的靈魂這句話的真諦。一個好的算法可以使程序簡潔,運行速度更快。同時也對C語言中的循環(huán),函數(shù)的調用有了更深的理解。</p><p>  雖然這次的課程設計,老師已經給出了程序讓我們改錯??雌饋肀容^容易,但是要讓程序實現(xiàn)要求的幾個功能卻不是很容易。而且要看懂每一個函數(shù)也不是十分的容易。在修改

17、程序的過程中也收獲了很多以前忽略的東西。在修改的過程中鞏固了基礎,認識了自已以前常犯得錯誤,也發(fā)現(xiàn)了自己的不足之處。</p><p>  在程序編寫中,我認識編寫一個系統(tǒng)不僅僅要有良好的用戶界面,良好的程序編寫風格也是相當重要的。只有良好的種程序編寫風格,程序代碼的可讀性才會好,開發(fā)的復雜度才能大大減少,檢查錯誤、修改代碼時才會更加容易下手。</p><p>  通過實際操作,學會 C語言

18、程序編程的基本步驟、基本方法,開發(fā)了自己的邏輯思維能力,培養(yǎng)了分析問題、解決問題的能力。深刻體會到了團隊協(xié)作的重要性。</p><p><b>  七、程序代碼</b></p><p>  #include"stdio.h"</p><p>  #include"conio.h"</p>&

19、lt;p>  #include"string.h"</p><p>  #include"stdlib.h"</p><p>  void look(); /*聲明查看函數(shù)*/</p><p>  void save(); /*聲明保存函數(shù)*/</p><p>  void search_

20、name(); /*聲明按姓名查看函數(shù)*/</p><p>  void search_number(); /*聲明按學號查看函數(shù)*/</p><p>  void order(); /*聲明排序函數(shù)*/</p><p>  void del(); /*聲明刪除函數(shù)*/</p><p>  int openl(); /*聲明

21、打開函數(shù)*/</p><p>  void welcome(); /*聲明我的個人信息函數(shù)*/</p><p>  void type(); /*聲明輸入函數(shù)*/</p><p>  void see(); /*聲明打開并查看文件函數(shù)*/</p><p>  struct student /*定義學生信息的結構體類型*/

22、</p><p><b>  {</b></p><p>  char num[15]; /*學號*/</p><p>  char name[20]; /*姓名*/</p><p>  char sex[4]; /*性別*/</p><p>  int english; /*英語成績

23、*/</p><p>  int math; /*數(shù)學成績*/</p><p>  int chinese; /*語文成績*/</p><p>  float aver; /*平均成績*/</p><p>  float sum; /*總成績*/</p><p>  }stu[100];&l

24、t;/p><p>  int n; /*聲明一個全局變量*/</p><p>  void main() /*主函數(shù)即用戶的操作界面*/</p><p><b>  { </b></p><p>  system("color 1E"); /*設計文本顏色*

25、/</p><p>  int b,flag=0; /*聲明局部變量*/</p><p>  while(1) /*循環(huán)輸出以下信息*/</p><p><b>  {</b></p><p>  printf("\n\t\t\t歡迎來到學生成績管理系統(tǒng)!

26、\n");</p><p>  printf("\n\t\t\t\t 郗綠陽制作\n");</p><p>  printf("\t\t\t-------------------------------\n");</p><p>  printf("\t\t\t1.鍵入學生的信息\n\n");

27、 /*鍵入學生的信息*/</p><p>  printf("\t\t\t2.查看錄入的學生信息\n\n"); /*查看錄入的學生信息*/</p><p>  printf("\t\t\t3.按姓名查看學生的信息\n\n"); /*按姓名查看學生的信息*/</p><p>  printf("\t\t\t4.

28、按學號查看學生的信息\n\n"); /*按學號查看學生的信息*/</p><p>  printf("\t\t\t5.按平均成績排序\n\n"); /*排序*/</p><p>  printf("\t\t\t6.刪除學生信息\n\n"); /*刪除學生信息*/</p><p>  printf("\

29、t\t\t7.保存學生信息\n\n"); /*保存*/</p><p>  printf("\t\t\t8.打開文件\n\n"); /*打開文件*/</p><p>  printf("\t\t\t9.我的個人信息\n\n"); /*我的個人信息*/</p><p>  printf("\t\t\t

30、0.退出\n\n"); /*退出*/</p><p>  printf("\t\t\t請輸入你的選擇:");</p><p>  scanf("%d",&b);</p><p><b>  switch(b)</b></p><p><b>  {&l

31、t;/b></p><p>  case 1:type();break; /*調用鍵入學生信息函數(shù)*/</p><p>  case 2:look();break; /*調用查看函數(shù)*/</p><p>  case 3:search_name();break; /*調用姓名查看函數(shù)*/</p><p>  case 4:search

32、_number();break; /*調用學號查看函數(shù)*/</p><p>  case 5:order();break; /*調用排序函數(shù)*/</p><p>  case 6:del();break;/*調用刪除函數(shù)*/</p><p>  case 7:save();break;/*調用保存函數(shù)*/</p><p>  case 8:

33、see();break;/*調用打開文件函數(shù)*/</p><p>  case 9:welcome();break;/*調用我的個人信息函數(shù)*/</p><p>  case 0:flag=1;break;/*退出SWITCH語句*/</p><p>  default :printf("錯誤!");</p><p>&l

34、t;b>  }</b></p><p>  if(flag) break; /*如果選擇0就退出循環(huán)*/</p><p><b>  }</b></p><p><b>  }</b></p><p>  void welcome() /*我的個人信息函數(shù)*/</p>

35、;<p><b>  {</b></p><p>  system("CLS");</p><p>  printf("\n\n\t\t------------個人信息------------"); /*在屏幕上輸出一下信息*/</p><p>  printf("\n\n\n\

36、n\t\t姓名:郗綠陽");</p><p>  printf("\t\t\tSex:男\(zhòng)n");</p><p>  printf("\t\t年齡:20\n");</p><p>  printf("\n\t\t\t--------學習經歷--------\n\n\n");</p>

37、<p>  printf("\t\t小學:北大小學\n\n");</p><p>  printf("\t\t初中:禹州市神垕一中\(zhòng)n\n");</p><p>  printf("\t\tS高中:禹州五高\n\n");</p><p>  printf("\t\t大學:洛陽理工學院\

38、n\n");</p><p>  printf("\n\n\t\t按任意鍵返回歡迎屏幕!");</p><p>  getch(); /*按任意鍵返回主函數(shù)*/</p><p><b>  }</b></p><p>  void type() /*定義鍵入學生信息函數(shù)*/</

39、p><p><b>  {</b></p><p>  system("CLS");</p><p>  int i; /*定義局部變量*/</p><p>  printf("\t\t輸出你想輸入的學生信息個數(shù):");</p><p>  scanf(

40、"%d",&n);</p><p>  for(i=0;i<n;i++) /*輸入每個學生的信息*/</p><p><b>  {</b></p><p>  printf("\n\t\t\t----------------\n");</p><p>  

41、printf("\t\t\t學號:");</p><p>  scanf("%s",&stu[i].num); /*輸入學號*/</p><p>  printf("\t\t\t姓名:");</p><p>  scanf("%s",&stu[i].name); /

42、*輸入姓名*/</p><p>  printf("\t\t\t性別:");</p><p>  scanf("%S",&stu[i].sex); /*輸入性別*/</p><p>  printf("\t\t\t英語:");</p><p>  scanf("

43、%d",&stu[i].english); /*輸入英語成績*/</p><p>  printf("\t\t\t數(shù)學:");</p><p>  scanf("%d",&stu[i].math); /*輸入數(shù)學成績*/</p><p>  printf("\t\t\t語文:"

44、;);</p><p>  scanf("%d",&stu[i].chinese); /*輸入語文成績*/</p><p>  stu[i].aver=((float)stu[i].english+(float)stu[i].math+(float)stu[i].chinese)/3;/*計算平均成績*/</p><p>  stu[i

45、].sum=(float)stu[i].english+(float)stu[i].math+(float)stu[i].chinese;/*計算總成績*/</p><p>  printf("\t\t\t平均成績=%4.1f\n",stu[i].aver); /*輸出平均成績*/</p><p>  printf("\t\t\t總成績=%4.1f\n&qu

46、ot;,stu[i].sum); /*輸出總成績*/</p><p><b>  }</b></p><p>  printf("\n\n\t\t\t按任意鍵返回菜單!!");</p><p><b>  getch();</b></p><p><b>  sa

47、ve();</b></p><p><b>  }</b></p><p>  void save() /*建立保存文件函數(shù)*/</p><p><b>  {</b></p><p>  system("CLS");</p><p>  

48、FILE *fp; /*定義文件型指針*/</p><p><b>  int i;</b></p><p>  if((fp=fopen("student.txt","wb"))==NULL) /*打開輸出文件*/</p><p><b>  {</b></p>

49、;<p>  printf("不能打開文件!\n"); </p><p>  return; /*終止程序*/</p><p><b>  }</b></p><p>  for(i=0;i<n;i++) /*向student文件中寫入信息

50、*/</p><p>  if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)</p><p>  printf("文件寫入錯誤\n");</p><p>  fclose(fp); /*關閉文件*/</p><p>  printf("\n\n\

51、n\n\t\t\t學生信息保存成功!\n");</p><p>  printf("\n\n\n\n\t\t\t按任意鍵返回菜單!!");</p><p><b>  getch();</b></p><p><b>  }</b></p><p>  void loo

52、k() /*定義查看函數(shù)*/</p><p><b>  {</b></p><p>  system("CLS");</p><p><b>  int i;</b></p><p>  //n=openl(); /*調用openl函數(shù)*/</p>&

53、lt;p>  printf("\t學號\t姓名\t性別\t英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++) /*輸出所有的學生信息*/</p><p><b>  {</b></p><p>  printf("%10s\t%s\t%2s\

54、t%d\t%d\t%d\t%3.1f\t\t%6.1f\n",stu[i].num,stu[i].name,</p><p>  stu[i].sex,stu[i].english,stu[i].math,stu[i].chinese,stu[i].aver,stu[i].sum);</p><p><b>  }</b></p><p&

55、gt;  printf("\n\n\n\t\t\t按任意鍵返回菜單");</p><p><b>  getch();</b></p><p><b>  }</b></p><p>  void search_name() /*按姓名查看函數(shù)*/</p><p><b&

56、gt;  {</b></p><p>  system("CLS");</p><p><b>  int i;</b></p><p>  char name[20]; /*聲明字符數(shù)組*/</p><p>  printf("\t\t\t請輸入學生姓名:\n")

57、;</p><p>  scanf("%s",name);</p><p>  printf("\t學號\t姓名\t性別\t英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++)</p><p>  if(strcmp(stu[i].name,n

58、ame)==0) /*將輸入的姓名與結構體中的姓名進行比較*/</p><p><b>  {</b></p><p>  printf("%10s\t%s\t%2s\t%d\t%d\t%d\t%3.1f\t\t%6.1f\n",stu[i].num,stu[i].name,</p><p>  stu[i].sex,

59、stu[i].english,stu[i].math,stu[i].chinese,stu[i].aver,stu[i].sum);</p><p>  printf("\n\n\n\t\t\t按任意鍵返回菜單");</p><p><b>  }</b></p><p><b>  getch();</b&

60、gt;</p><p><b>  }</b></p><p>  void search_number() /*定義按學號查看函數(shù)*/</p><p><b>  {</b></p><p>  system("CLS");</p><p><

61、b>  int i;</b></p><p>  char number[15]; /*聲明字符數(shù)組*/</p><p>  printf("\t\t\t請輸入學號:\n");</p><p>  scanf("%s",number);</p><p>  printf(&quo

62、t;\t學號\t姓名\t性別\t英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++)</p><p>  if(strcmp(stu[i].num,number)==0) /*將輸入的學號與結構體中的學號進行比較*/</p><p>  printf("%10s\t%s\t%2s\

63、t%d\t%d\t%d\t%3.1f\t\t%6.1f\n",stu[i].num,stu[i].name,</p><p>  stu[i].sex,stu[i].english,stu[i].math,stu[i].chinese,stu[i].aver,stu[i].sum);</p><p>  printf("\n\n\n\t\t\t按任意鍵返回菜單"

64、;);</p><p><b>  getch();</b></p><p><b>  }</b></p><p>  void order() /*定義排序函數(shù)*/</p><p><b>  {</b></p><p>  system(&quo

65、t;CLS");</p><p><b>  int i,j;</b></p><p><b>  char a;</b></p><p>  struct student temp; /*聲明結構體變量*/</p><p>  printf("\t學號\t姓名\t性別\t

66、英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++) /*對數(shù)據進行排序*/</p><p><b>  {</b></p><p>  for(j=i+1;j<n;j++)</p><p>  if(stu[i].sum<stu[j].

67、sum)</p><p><b>  {</b></p><p>  temp=stu[i];</p><p>  stu[i]= stu[j];</p><p>  stu[j]=temp;</p><p><b>  }</b></p><p> 

68、 printf("%10s\t%s\t%2s\t%d\t%d\t%d\t%3.1f\t\t%6.1f\n",stu[i].num,stu[i].name,</p><p>  stu[i].sex,stu[i].english,stu[i].math,stu[i].chinese,stu[i].aver,stu[i].sum);</p><p><b>  }

69、</b></p><p><b>  getch();</b></p><p>  printf("是否保存?(y or n)");</p><p>  getchar();</p><p>  scanf("%c",&a);</p><p&

70、gt;  if(a=='y') /*是否保存排序后的文件*/</p><p><b>  save();</b></p><p><b>  else</b></p><p>  printf("退出");</p><p><b>  getch();

71、</b></p><p><b>  }</b></p><p>  void del() /*定義刪除學生信息函數(shù)*/</p><p><b>  {</b></p><p><b>  int i;</b></p><p><b&g

72、t;  char a;</b></p><p>  char name[20];</p><p>  system("CLS");</p><p>  printf("\t\t\t輸入學生名字:\n");</p><p>  scanf("%s",name);</p

73、><p>  system("CLS");</p><p>  printf("\t學號\t姓名\t性別\t英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++)</p><p>  if(strcmp(stu[i].name,name)==0)&l

74、t;/p><p><b>  {</b></p><p>  printf("%10s\t%s\t%2s\t%d\t%d\t%d\t%3.1f\t\t%6.1f\n",stu[i].num,stu[i].name,</p><p>  stu[i].sex,stu[i].english,stu[i].math,stu[i].ch

75、inese,stu[i].aver,stu[i].sum);</p><p><b>  getch();</b></p><p>  printf("真的刪除?(y or n)");</p><p>  getchar();</p><p>  scanf("%c",&a

76、);</p><p>  if(a=='y') /*是否刪除該信息*/</p><p><b>  {</b></p><p>  for(;i<n;i++)</p><p>  stu[i]=stu[i+1];</p><p><b>  n=n-1;</

77、b></p><p>  printf("你已經刪除信息");</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("退出");</p><p><b>

78、;  getch();</b></p><p><b>  }</b></p><p><b>  save();</b></p><p><b>  }</b></p><p>  int openl() /*定義打開文件函數(shù)*/</p><

79、p><b>  {</b></p><p>  system("CLS");</p><p><b>  int i;</b></p><p><b>  FILE *fp;</b></p><p>  if((fp=fopen("stud

80、ent.txt","rb"))==NULL)</p><p><b>  {</b></p><p>  printf("Cannot open file.\n");</p><p><b>  exit(0);</b></p><p><b&

81、gt;  }</b></p><p>  for(i=0;!feof(fp);i++)</p><p>  fread(&stu[i],sizeof(struct student),1,fp);</p><p>  fclose(fp);</p><p>  return(i-1);</p><p>

82、;<b>  }</b></p><p>  void see() /*打開并查看文件*/</p><p><b>  {</b></p><p>  system("CLS");</p><p><b>  int i;</b></p>

83、<p>  n=openl();</p><p>  printf("文件打開成功!\n");</p><p>  printf("按任意鍵查看!\n");</p><p><b>  getch();</b></p><p>  printf("\t學號\t

84、姓名\t性別\t英語\t數(shù)學\t語文\t平均成績\t總成績\n");</p><p>  for(i=0;i<n;i++) /*輸出所有的學生信息*/</p><p><b>  {</b></p><p>  printf("%10s\t%s\t%2s\t%d\t%d\t%d\t%3.1f\t\t%6.1f\n

85、",stu[i].num,stu[i].name,</p><p>  stu[i].sex,stu[i].english,stu[i].math,stu[i].chinese,stu[i].aver,stu[i].sum);</p><p><b>  }</b></p><p>  printf("\n\n\n\t\t\

86、t按任意鍵返回菜單");</p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  八、運行結果</b></p><p><b>  菜單屏幕</b></p><

87、p><b>  輸入學生信息</b></p><p><b>  查看學生信息</b></p><p><b>  按姓名查詢</b></p><p><b>  按學號查詢</b></p><p><b>  按平均成績排序</b&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論