版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、指導(dǎo)教師普田粵院PUTIAN UNIVERSITY數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告題 目: 停車場管理系統(tǒng)姓 名:專 業(yè): 智能科學(xué)與技術(shù)班 級:學(xué) 號:指導(dǎo)教師: 新工科產(chǎn)業(yè)學(xué)院2021年12月 日return 0;7. 8 DeleteQueue 函數(shù)CarNode *DeleteQueue (LinkQueueCar *W, CarNode *x, int m) /出隊 QueueNode *p,*q; int i;p=W-head-next;q=W-head;if (W-head=W-rear) return 0;隊列為空 for(i=l;inext; q-next=p-next;if (W
2、-rear=q)/如果隊中只有一個元素那么p出隊以后成為空隊 W-rear=W-head;x=p-data;free (p);W-num一一; return x;)7. 9 leavel 函數(shù)void leavel (SeqStackCar *Enter, LinkQueueCar *W) 停車場的車離開 int room;CarNode *p, *x;if (Enter-top0T) 判斷車場是否為空 while (1) (printf (ntt 請輸入車在車場的位置/I-%d/:, Enter-top0+l); scanf (d, &room); 獲取停車位 room;if(room=0&
3、roomtop0) break;/判斷輸入位置是否有效 else printf (ntt 輸入有誤,請重輸:);)while(Enter-top0rooni)把要刪除的車輛的前面的車開出來,進臨時棧。 (x=Pop (Enter,0);Push (Enter, x, 1);)p=Pop (Enter,0);PRINT(p, 1);/調(diào)用計費函數(shù)計費 if(W-head! =W-rear) 假設(shè)便道不為空p=DeleteQueue (W, p, 1);Push (Enter, p, 0);printf (n便道里的車進入停車場n);while (Enter-toplMAX) 再把臨時棧里輛進停車
4、場x=Pop (Enter, 1);Push (Enter, x, 0);else printf (/zntt車場里沒有車.n);停車場空直接出去)7. 10 leave2 函數(shù)void leave2 (LinkQueueCar *W) 便道離開函數(shù)int room;CarNode *p;if (W-head! =W-rear) 隊列不為空while (1)(printf (ntt 請輸入車在便道的位置/I-%d/:, W-num);scanf (%d, &room);if(room=l&roomnum) break;判斷輸入位置是否有效 else printf (ntt 輸入有誤,請重輸:)
5、;)p=DeleteQueue(W, p, room);PRINT (p, 2);)else printf (/ztt便道里沒有車);)7. 11 Arrival 函數(shù)int Arrival (SeqStackCar *Enter, LinkQueueCar *W) 車輛進入函數(shù) CarNode *p;p= (CarNode *) malloc (sizeof (CarNode); 生成車輛節(jié)點printf (ntt 請輸入車牌號(例:豫 B1234): );scanf(%s,p-num);printf (ntt車輛到達時間:);scanf(%d:%d, &(p-reach. hour), &
6、(p-reach. min);if(Enter-topLOj +ltopLlJ) Push (Enter, p, 0);printf (ntt 車輛在車場第%d 位置. nn, Enter-top0 +1);system (pause);return (1);else停車場已滿需要進入便道等待,便道用隊列實現(xiàn)printf (ntt該車須在便道等待!有車位0寸進入車場nrT);EnterQue (W, p);return (1);)7. 12 leave 函數(shù)void Leave (SeqStackCar *Enter, LinkQueueCar *W) 車輛離開函數(shù)(車輛的離開int a=l,
7、 b=0; while(a)歡迎使用停車場系統(tǒng).tn);11停車場.tn歡迎使用停車場系統(tǒng).tn);11停車場.tn);2便道.tn);0返回上一級.tn););););printf (nttttt printf (nttttt printf (/znttttt printf (/znttttt printf (ttprintf (/zntt請選擇您需要出庫車輛的存在場地:); scanf(d,&b);switch(b)case 0:a=0;break;leavel (Enter, W);break;leave2(W);break;default: printf (/zntt 輸入錯誤請重新輸
8、入:);break;system(pause);)7. 13 Listl 函數(shù)void Listl (SeqStackCar S)顯示車場里的車輛情況int i;if (S. top0=0)(printf (/zntt 車場:n);printf (/zntt位置t到達時間t車牌號nn);10for(i=0;ireach. hour, S. stacki-reach. min); puts(S. stacki-num);printf (n);)else printf (z,ntt 車場里沒有車nn);)7. 14 List2 函數(shù)void List2(LinkQueueCar *W)顯示便道上的
9、車輛情況QueueNode *p; int i;p邛一head-next;if (W-head!=W-rear)printf (ntt 便道:n);for (i=l; (p!=NULL); i+) printf (ntt 第 %d 輛車:,i); puts(p-data-num);p=p-next;else printf (z,ntt 便道里沒有車nn);)7. 15 List 函數(shù)void List (SeqStackCar S, LinkQueueCar W) 查看列表顯示,遍歷 (int flag, tag;flag=l;while (flag)system(cls); printf(n
10、ttprintf (printf (/znttttt printf (/znttttt printf (z,nttttt printf (ntttttprintf (/znttttt printf (printf (/znttttt printf (/znttttt printf (z,nttttt printf (nttttt查看車輛列表顯示tn);1車場列表.tn);2便道列表.tn); 0返回主菜單.tn);1111);11printf (ntt 請選擇 02:);while (1)(scanf(d, &tag);if(tag=0 & tag=2)break;elseprintf (nt
11、t輸入有誤,請重新選擇02 :);)switch(tag)(case 1:Listl (S);system(pause);break;case 2:List2(&W);printf (n);system(pause);break;case 0:flag=0;break;default:break;system(cls);)八、測試運行8. 1主頁面測試12回 C:Users86152Desktoptest(2) X +歡迎使用停車場系統(tǒng).1車輛到達登記.2車輛離開登記.3車輛列表顯示.0退出管理系統(tǒng).【本停車場收費標(biāo)準(zhǔn)為一分鐘0.05元,便道停車0.02 一分鐘望周知】請選擇:8. 2車輛到達
12、登記功能測試固 C:Users86152Desktoptest(2) X +一 X歡迎使用停車場系統(tǒng).1車輛到達登記.2車輛離開登記.3車輛列表顯示.0退出管理系統(tǒng).【本停車場收費標(biāo)準(zhǔn)為一分鐘.05元,便道停車0.02 一分鐘望周知】請選擇:1請輸入車牌號(例:豫B1234) : 123車輛到達時間:12:22車輛在車場第1位置.請按任意鍵繼續(xù).8. 3車輛離開停車場功能測試13國 C:Users86152Desktoptest(2) X +歡迎使用停車場系統(tǒng).1停車場.2便道.0返回上一級.if匿由,車贏而百茬蕩施;請輸入車在車場的位置/11/: 1車輛離開的時間:12:33離開車輛的車牌號
13、為:123其到達時間為:12:22離開時間為:12:33應(yīng)交費用為:.6元請按任意鍵繼續(xù).8. 4車輛停入便道功能測試固 C:Users86152Desktoptest(2) X +一 X歡迎使用停車場系統(tǒng).1車輛到達登記.2車輛離開登記.3車輛列表顯示.0退出管理系統(tǒng).【本停車場收費標(biāo)準(zhǔn)為一分鐘0.05元,便道停車。.02一分鐘望周知】請選擇:1請輸入車牌號(例:豫B1234) :567車輛到達時間:15:U該車須在便道等待!有車位時進入車場請按任意鍵繼續(xù).8. 5查看停車場車輛信息功能測試14國 C:Users86152Desktoptest(2) 國 C:Users86152Deskto
14、ptest(2) X國 C:Users86152Desktoptest(2) X國 C:Users86152Desktoptest(2) XX1車場列表.2便道列表.0返回主菜單.請選擇0-2:1車場:位置到達時間車牌號112:11123213:22234314:333458. 6查看便道車輛信息功能測試固 C:Users86152Desktoptest(2) X +一 口 X查看車輛列表顯示1車場列表.2便道列表.【0】返回主菜單.瓦荏 二5;便道:第1輛車:567第2輛車:789請按任意鍵繼續(xù).8.7車輛從便道離開功能測試15回 C:Users86152Desktoptest X +一 口
15、 X歡迎使用停車場系統(tǒng).1停車場.2便道.0返回上一級.備還荏惠需萋由豆至贏而音茬蕩施;請輸入車在便道的位置/1-2/: 1車輛離開的時間:15:33離開車輛的車牌號為:567其到達時間為:15:11離開時間為:15:33應(yīng)交費用為:元請按任意鍵繼續(xù).8.7當(dāng)便道有車輛時車輛從停車場第一位置離開功能測試囤 C:Users86152Desktoptest(2) X + z一 口 X歡迎使用停車場系統(tǒng).1停車場.2便道.0返回上一級.圣瓦加音茬蕩布G請輸入車在車場的位置/1一3/: 1車輛離開的時間:13:22離開車輛的車牌號為:123其到達時間為:12:11離開時間為:13:22應(yīng)交費用為:3.
16、5元便道里的車進入停車場請按任意鍵繼續(xù).8.7便道車輛進入停車場后查看停車場車輛信息16國 C:Users86152Desktoptest(2) X查看車輛列表顯示1車場列表.2便道列表.0返回主菜單.請選擇0-2:1車場:位置到達時間車牌號116:11789213:22234314:33345請按任意鍵繼續(xù).九、工程總結(jié)本次工程是棧和隊列的基本算法,是基礎(chǔ)練習(xí),關(guān)鍵是車輛的離開,具體談?wù)勎依斫獾耐\?場。停車場系統(tǒng)總的來說分為五大塊,第一塊和第二塊屬于基本操作,包括初始化棧和隊列; 第三塊是車到達,分為兩個層次:.車到達了進棧.棧滿,進隊列。第四塊是車離開,分為五個層次:.車離開,判斷該車后
17、面是否還有車.有車的話,后面的車讓路,進臨時棧.然后該車離開,打印出離開信息.離開后,判斷臨時棧上是否有車,有車重新進車站.再判斷便道上是否有車,有車也進車站。第五塊是顯示車站信息,分為三個層次:.顯示車站信息.顯示便道信息.返回。17 TOC o 1-5 h z HYPERLINK l bookmark36 o Current Document 1、工程簡介1 HYPERLINK l bookmark38 o Current Document 2、設(shè)計要求23、引言34、需求分析4 HYPERLINK l bookmark44 o Current Document 5、可行性分析5 HYPE
18、RLINK l bookmark46 o Current Document 6、系統(tǒng)分析與設(shè)計6 HYPERLINK l bookmark48 o Current Document 7、代碼實現(xiàn)7 HYPERLINK l bookmark4 o Current Document 8、測試運行8 HYPERLINK l bookmark30 o Current Document 9、工程總結(jié)9附錄:(程序源代碼)/頭文件#ifndef CarParking_HNCLUDED#define CarParking_HJNCLUDED#define MAX 3/*5*1* *1* *.1 *17,*!
19、*、!、! *1* *!* *1*?*、!. *?* *!*、, *!*1* *1*1*1* *1* A* *5*!* *1* *i* *3*/ 、q、?、q、q、?、?、rjw 乙、q、q、?、q、rjw rjw 乙、乙、q、*J、*2* *4* 4、*Z、*Z、*1、?、*4* *J*功能描述:頭文件*其它說明:消息字段之間用分號(;)分隔kJ* *7,.!* .!*7, 7,7,*1* .!* *1*kJ* *2*7, 7,7,*1* *2* *2*7,7,*1* *1*k2* *2* 7/ 7,7* *1.!* *3* *2*7,7,*1* *1*k1 k2* *2* 7/ 7,7*
20、*1. /*J、,、.、,卜.、,、,卜,、(、,j、.、,;、*1* ,j、,、,卜rjw*J、,、.、,卜,卜1、,j、,卜,(、(、,j、.、,;、*rw 1typedef struct int hour;int min;Time;typedef struct node/定義車輛信息結(jié)構(gòu)體char num10;Time reach;到達時間Time leave;/離開時間JCarNode;typedef struct NODE用順序棧棧表示停車場CarNode *stackMAX+l;int top2;JSeqStackCar;typedef struct car 便道結(jié)點 CarNod
21、e *data;struct car *next;JQueueNode;typedef struct Node鏈隊列實現(xiàn)便道 QueueNode *head;頭指針 QueueNode *rear;尾指針 int num;JLinkQueueCar;void showlist();void InitStack(SeqStackCar *);int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,LinkQueueCar *);void Leave(SeqStackCar *,LinkQueueCar *);void List(ScqSta
22、ckCar,LinkQucucCar);void leave 1 (SeqStackCar *Enter,LinkQueueCar *W);void leave2(LinkQueueCar *W);int Push(SeqStackCar *s,CarNode *p,int i);CarNode *Pop(SeqStackCar *s,int i);int EnterQue(LinkQueueCar *W,CarNode *p);#endif/ CarParking_HJNCLUDED18#include#include#include test.h主程序int main()(SeqStack
23、Car Enter; 定義棧和便道LinkQueueCar Wait;int ch;system(color 09);InitStack(&Enter);對棧進行初始化InitQueue(&Wait); 隊列初始化while(l)(showlist();printf( nntt 請選擇:);scanf(”d”,&ch);switch(ch)(Arrival(&Enter,&Wait);break;Leave(&Enter,&Wait);break;List(Enter,Wait);break;case 0:exit(O);default:printf(nn輸入有誤,請重新選擇:03: ”);
24、break;)system(cls);)/自定義函數(shù)#include#include#include #include#include /停車場最大容量為3輛,便于觀察#define PRICE 1 0.05#define PRICE2 0.02#include test.hvoid showlist()19printf(untt );printf(Hntt,);printf(nnttttt歡迎使用停車場系統(tǒng).tn”);printf(Hntttttprintf(nntttttprintf(Hnttttt11printf(Hntttttprintf(nntttttprintf(Hntttttpr
25、intf(nntt【本停車場收費標(biāo)準(zhǔn)為一分鐘0.05元,便道停車0.02 一分鐘望周知】n”);printf(ntt );)void PRINT(CarNode *p,int i)/ 車輛收費 int A1,A2,BI,B2;float m;printf(Hntt車輛離開的時間scanf(n%d:%dn,&(p-leave.hour),&(p-leave.min);printf(nntt離開車輛的車牌號為:”);puts(p-num);A1 =p-reach.hour;A2=p-reach.min;Bl=p-leave.hour;B2=p-leave.min;printf(Hntt 其到達時間
26、為:%d:%dnH,Al,A2);printf(Hntt 離開時間為:%d:%dnn,Bl,B2);switch(i)m=(Bl-Al)*60+(B2-A2)*PRICEl;break;小時跟小時求差換算成分與分鐘求和得出價格m=(B 1-A l)*60+(B2-A2)*PRICE2;break;)if(m0)printf(ntt 應(yīng)交費用為:%2.1f 元n”,m);elseprintf(ntt 無需收費n);free(p);)void InitStack(SeqStackCar *s)/ 棧的初始化int i;s-top0=-l;s-topfll=MAX;for(i=0;istacki=N
27、ULL;)int InitQueue(LinkQueueCar *Q)/ 隊列的初始化Q-head=(QueueNode *)malloc(sizeof(QueueNode);頭結(jié)點生成 if(Q-head!=NULL)Q-head-next=NULL;頭指針 next 域置空20Q-rear=Q-head;尾指針指向頭結(jié)點Q-num=O;return(l);)else return(-l);)int Push(SeqStackCar *s,CarNode *p,int i) 入棧 if(s-top0+l =s-top 1 ) return 0;棧滿 switch(i)case 0:s-top
28、|0|+;s-stacks-top0=p;break;case 1:s-topl-;s-stacks-top 1 =p;break;default:return 0;)return 1;)CarNode *Pop(SeqStackCar *s,int i)出棧CarNode *p;switch(i)case 0:if(s-top0=-l) return NULL;p=s-stacks-top0;/0 號棧元素出棧 s-top0-;break;case 1:if(s-toplJ=MAX) return NULL;p=s-stacks-top 1 ;/0 號棧元素出棧 s-topl+;break;
29、default: return NULL;) return p;)int EnterQue(LinkQueueCar *W,CarNode *p)鏈隊列入隊,生成隊列節(jié)點,存入節(jié)點信息,將尾指針的next指向它,移動尾指針 QueueNode *t;t=(QueueNode *)malloc(sizeof(QueueNode);生成隊列結(jié)點空間if(t!=NULL)t-data=p;t-next=NULL;W-rear-next=t;21W-rear=t;W-num+;system(pausen); return I;)elsereturn 0;)CarNode *DeleteQueue(Li
30、nkQueueCar *W,CarNode *x,int m)出隊QueueNode *p,*q;int i;p=W-head-next;q=W-head;if(W-head=W-rear) return 0;/隊列為空for(i=l;inext;)q-next=p-next;if(W-rear=q)如果隊中只有一個元素那么p出隊以后成為空隊W-rear=W-head;x=p-data;free(p);W-num;return x;)void leave 1 (SeqStackCar *Enter,LinkQueueCar *W)停車場的車離開int room;CarNode *p,*x;if
31、(Enter-top0-l)/判斷車場是否為空(while(l)(printf(ntt 請輸入車在車場的位置/l%d/: ”,Enter-top0+l);scanf(d”,&room); 獲取停車位room;if(room=0&roomtop0J) break;/判斷輸入位置是否有效 else printf(ntt 輸入有誤,請重輸:); )while(Enter-top0room)把要刪除的車輛的前面的車開出來,進臨時棧。 (x=Pop(Enter,0);Push(Enter,x,l);p=Pop(Enter,0);PRINT(p,l);/調(diào)用計費函數(shù)計費if(W-head!=W-rear)
32、 /假設(shè)便道不為空22 p=DeleteQueue(W,p, 1);Push(Enter,p,O);printf(Hn便道里的車進入停車場n”);)while(Entertoplhead! =W-rear) / 隊列不為空while(l)(printf(untt 請輸入車在便道的位置”,W-num);scanf(,%d,&room);if(room= 1 &roomnum) break;判斷輸入位置是否有效 else printf(Hntt 輸入有誤,請重輸:”);)p=DeleteQueue(W,p,room);PRINT(p,2);)elseprintf(Htt便道里沒有車”);)int
33、Arrival(SeqStackCar *Enter,LinkQueueCar *W) 車輛進入函數(shù)CarNode *p;p=(CarNode *)malloc(sizeof(CarNode);生成車輛節(jié)點printf(Hntt 請輸入車牌號(例:豫 B1234):);scanf(%sn,p-num);printf(ntt車輛到達時間:”);scanf(%d:%dH,&(p-reach.hour),&(p-reach.niin);if(Enter-top0+ ltopl)Push(Enter,p,O);printf(ntt 車輛在車場第d 位置.nn”,Entertop0+l);system(
34、npause);return(l);else/停車場已滿需要進入便道等待,便道用隊列實現(xiàn)23printf(”ntt該車須在便道等待!有車位時進入車場nn);EnterQue(W,p);return(l);void Leave(SeqStackCar *Enter,LinkQueueCar *W)車輛離開函數(shù) (/車輛的離開int a=l,b=0;while(a)system(clsn);printf(ntt );printf(ntt ”);printf(ntttttprintf(ntttttprintf(ntttttprintf(nttttt歡迎使用停車場系統(tǒng).tn”);printf(nttt
35、ttprintf(ntttttprintf(ntttttprintf(nttttt【1】停車場.tn”);2便道.tn);0返回上一級.tn);printf(tt );printf(”nN請選擇您需要出庫車輛的存在場地:); scanf(%d,&b);switch(b)case 0:a=0;break;leave 1 (Enter,W);break;leave2(W);break;default: printf(ntt 輸入錯誤請重新輸入:);break;)systemCpause);)void Listl(SeqStackCar S)顯示車場里的車輛情況(int i;if(S.top0=0)
36、printf(Hntt 車場:n);printf(ntt位置t到達時間t車牌號nn“);for(i=0;ireach.hour,S.stack|i|-reach.min);puts(S.stacki-num);printf(nH);else printf(Hntt 車場里沒有車nn);24void List2(LinkQueueCar *W)顯示便道上的車輛情況QueueNode *p;int i;p=W-head-next;if(W-head !=W-rear)(printf(Hntt 便道:n);for(i=l; (p!=NULL); i+) (printf(ntt 第 %d 輛車:二i)
37、; puts(p-data-num);p=p-next;)else printf(Hntt 便道里沒有車nn);void List(SeqStackCar S,LinkQueueCar W) /查看列表顯示,遍歷 int flag,tag;flag=l;while(flag)system(ncls);”);printf(Hnttprintf(ntt ”);”);printf(ntttttprintf(ntttttprintf(ntttttprintf(nttttt查看車輛列表顯示tn);printf(ntttttprintf(ntttttprintf(ntttttprintf(nttttt1車場列表.tn”);2便道列表.tn);0返回主菜單.tn);printf(tt );printf(ntt 請選擇 0-2:);while(l)scanf(%dn,&tag);if(tag=0 & tagleave. hour), &(p-leave. min);printf (ntt離開車輛的車牌號為:);puts(p-num);Al=p-reach. hour;A2=p-reach. min;Bl=p-leave. hour;B2=p-leave, min;printf (ntt 其到達時間為:%d:%
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆湖北省襄陽市高三第五次模擬考試英語試卷含解析
- 2025屆山西省忻州一中等四校重點中學(xué)高三下學(xué)期聯(lián)合考試英語試題含解析
- 2025屆天津市南開區(qū)南開中學(xué)高考數(shù)學(xué)五模試卷含解析
- 山東省濰坊市臨朐縣2025屆高三第二次模擬考試英語試卷含解析
- 2025屆黑龍江青岡縣一中高考考前模擬語文試題含解析
- 2025屆云南省江城縣第一中學(xué)高考語文必刷試卷含解析
- 《數(shù)學(xué)認識百分數(shù)》課件
- 2025屆福建省廈門市翔安一中高三3月份模擬考試語文試題含解析
- 安徽省宿州市埇橋區(qū)2025屆高三下學(xué)期第五次調(diào)研考試英語試題含解析
- 上海市五十二中2025屆高考數(shù)學(xué)押題試卷含解析
- 2024-2025學(xué)年人教版數(shù)學(xué)五年級上冊期末檢測試卷(含答案)
- 【MOOC】犯罪心理學(xué)-中南財經(jīng)政法大學(xué) 中國大學(xué)慕課MOOC答案
- 【MOOC】商業(yè)銀行管理學(xué)-湖南大學(xué) 中國大學(xué)慕課MOOC答案
- 【MOOC】跨文化交際入門-華中師范大學(xué) 中國大學(xué)慕課MOOC答案
- 護理脊柱外科出科
- 2024年陜西省初中學(xué)業(yè)水平考試·數(shù)學(xué)
- 中職語文基礎(chǔ)上冊《寫作:記敘文-人物描寫(篇章)》課件
- 劇院安全隱患排查治理工作方案
- 中華人民共和國統(tǒng)計法
- 工程設(shè)計-《工程勘察設(shè)計收費標(biāo)準(zhǔn)》(2002年修訂本)-完整版
- 業(yè)主授權(quán)租戶安裝充電樁委托書
評論
0/150
提交評論