C程序設計、大數據結構綜合模擬實習_第1頁
C程序設計、大數據結構綜合模擬實習_第2頁
C程序設計、大數據結構綜合模擬實習_第3頁
C程序設計、大數據結構綜合模擬實習_第4頁
C程序設計、大數據結構綜合模擬實習_第5頁
免費預覽已結束,剩余39頁可下載查看

下載本文檔

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

文檔簡介

1、實用標準一、實習目的通過模擬實習,主要要到達兩個目的,一是檢驗和穩固專業知識、二是提升 綜合素質和水平.信管08級學生的模擬實習主要是復雜程序和簡單軟件的實現. 通過該模擬實習,可以將學生課堂上掌握的理論知識與處理數據的業務相結合, 以檢驗我們同學們掌握知識的寬度、深度及對知識的綜合運用水平.二、實習環境如軟硬件1硬件:CPU RV,內存1G2操作系統: Windows 73軟件:Visual c+6.0, Microsoft Word 2003三、實習內容內容一:紙牌游戲任務:編號為1-52張牌,正面向上,從第2張開始,以2為基數,是2 的倍數的牌翻一次,直到最后一張牌;然后,從第 3張開始

2、,以3為基數,是3 的倍數的牌翻一次,直到最后一張牌;然后一從第 4張開始,以4為基數,是4 的倍數的牌翻一次, 直到最后一張牌;.再依次5的倍數的牌翻一次,6的,7 的 直到 以52為基數的 翻過,輸出:這時正面向上的牌有哪些?內容二:文章編輯功能:輸入一頁文字,程序可以統計出文字、數字、空格的個數.靜態存儲一頁文章,每行最多不超過 80個字符,共N行;要求1分別統 計出其中英文字母數和空格數及整篇文章總字數;2統計某一字符串在文章中出現的次數,并輸出該次數;3刪除某一子用,并將后面的字符前移.存儲結構使用線性表,分別用幾個子函數實現相應的功能;輸入數據的形式和范圍:可以輸入大寫、小寫的英文

3、字母、任何數字及標點 符號.輸出形式:1分行輸出用戶輸入的各行字符;2分4行輸出全部字母 數、數字個數、空格個數、文章總字數3輸出刪除某一字符串后的文 章內容三:1.設計學生成績治理系統.該系統中存儲學生的學號、姓名、性別、年齡、 課程成績等信息.要求:1瀏覽學生信息2 添加學生信息3 刪除學生信息4 查找學生信息文檔實用標準5 )修改學生信息6 )對成績的處理求出每個學生各門課程的總成績、平均成績、最高分和最低分.求出某一門課程所有學生的總成績、平均成績、最高分和最低分.7 )根據學生某門課程的成績對學生排序四、算法分析、設計與描述1 .算法分析和設計內容一:當每個號每次遇到是某個數的倍數時

4、,都會相應的翻一次,這樣,每張牌 會翻的次數就各不一樣,可能很屢次,也可能只有一兩次,結果就只是要輸出在 經過各個不同次數的翻牌后,正面向上的牌都有哪幾個.舉例說明一下,比方24, 第一次它是2的倍數時要從正面翻到反面,當進行到3時,就又要從反面翻回來, 而到4時還要在翻,同理呢,到6.8.12它都要往返的翻.如果它在屢次的翻牌 后,正面還向上了,那么它就是要輸出的結果之一.I定義結構體struct line ,文本行采用順序存儲,行與行之間采用鏈式存儲. 利用指針、鏈表來實現文章編輯數據結構設計內容三:(1)整個系統均用C語言實現;(2)利用指針、鏈表來實現學生成績的數據結構設計;(3)系統

5、具有輸入、顯示、查詢、刪除、排序、插入,保存、讀取根本功能;(4)系統的各個功能模塊都用函數的形式來實現;(5)可以將學生成績信息保存在文件中;(6)可以將學生信息從文件中讀取出來.2 .算法描述(可插入流程圖)內容一:文檔文檔實用標準內容二:內容三:實用標準五、程序設計1.程序設計的根本思路內容一:用#define OPPOSITE(i) i = i?0:1這個宏將牌的狀態標志求反 ,也即為翻牌操作.將所有的牌建立一個數組,運用for的循環嵌套執行以下操作:把 52張牌初始化成正面朝上、限制基數和翻牌次數,判斷最終的紙牌朝向并打印出結果內容二:將文本框中的信息讀入,系統處理了大多記事本應有的

6、功能,進行簡 單的文件處理(包括保存,另存為,新建等).同時對讀入的數據進行相關的統計 功能.系統處理了大多記事本應有的功能,進行簡單的數據統計和文件處理(包括保存,另存為,新建等).內容三:(1)主函數 main()利用無限次循環for(;)和swithch()實現各函數的調用,系統根據輸入的數字 選項來調用相應的函數.2 .初始化函數 STUDENT *init()這是一個無參函數,里面只有一個語句,它的作用是使鏈表初始化,使head的值 為NULL比方:沒有這個函數的話,在你沒有輸入任何數據的情況下,去執行顯示 功能的時候會顯示一些亂碼!3 .菜單項選擇擇函數 int menu_sele

7、ct();這是一個無參函數,主要實現“功能選擇的界面,在這個界面里有顯示系統的 九大功能,根據每個功能前面的序號進行選擇,中間還顯示系統當前的時間.等執行 完每一個函數功能后,接任一鍵回到主界面也要通過這個函數來實現!4 .輸入記錄函數 STUDENT *create()文檔實用標準這是一個無參函數,用來執行第學生成績記錄的輸入,當學生為0時停止輸入,函數結束后,帶回一個指向鏈表頭的指針head.算法:先聲明一個首節點head,并將head-next設為NULL每輸入一個數據就 聲明一個新節點p,把p-next設為NULL并且鏈接到之前列表的尾端.5 .顯示記錄函數 void print(ST

8、UDENT *head)這是一個不返回值的有參函數,形參為“鏈表頭的指針,負責對全部學生成績 記錄的輸出,缺乏之處就是不能對學生成績進行分頁顯示.算法:先將p結點的指針指向第一個結點,將p結點(即第一個結點)的數據輸出. 然后再將p結點的指針指向p指針的的指針(即下一結點),將p結點(即第一結點) 的數據輸出.重復執行此步聚直到 p指針指向NULLA止.6 .查找記錄函數 void search(STUDENT *head)這是一個不返回值的有參函數,形參為“鏈表頭的指針,實現按學號對某個學 生進行查找,并顯示所查找到的記錄.算法:采用線性查找法往下一個節點查找.輸入所要查找的學生的學號 s,

9、設一 個指針變量p,先指向第一個結點,當 strcmp(p-name,s) & p != NULL 時,使p 后移一個結點,如果p!=NULL,輸出p所指的結點.7 .刪除記錄函數 STUDENT *delete(STUDENT *head)這是一個有參函數,形參為“鏈表頭的指針,先輸入要刪除的學生記錄的學號, 找到后顯示該學生信息,等確認后便可按“ Y進行刪除.算法:從p指向的第一個結點開始,檢查該結點中的num值是否等于輸入的要求 刪除的那個學號.如果相等就將該結點刪除,如不相等,就將 p后移一個結點,再如 此進行下去,直到遇到表尾為止.8.排序函數 STUDENT *sort(STUDE

10、NT *head)這是一個有參函數,形參為“鏈表頭的指針,按學生成績的平均分上下進行排 序,還可以顯示名次.9、插入函數 STUDENT *insert(STUDENT *head,STUDENT *new)這是一個有參函數,形參有兩個,一個是“鏈表頭的指針,一個是“待插入指 針,根據原來成績平均分的上下進行插入,插入后會重新進行排序,并返回.文檔實用標準算法:先將學生的成績按平均分由高分到低分進行排序,再插入一個新生的結點,要求按平均分的上下順序插入.先用指針變量P0指向待插入的結點,pl指向第一個結點.如果p0-averageaverage ,那么待插入的結點不應插在 pl所指的結點之 前

11、.此時將pl后移,并使p2指向剛剛pl所指的結點.重復以上的步驟,直到 p0-average=p1-average為止.這時將p0指向的結點插到pl所指結點之前.但 是如果pl所指的已是表尾結點,那么pl就不應后移了.如果p0-average比所有結點 的average者B小,那么應將p0所指的結點插到鏈表末尾.如果插入的位置既不在第一 個結點之前,又不在表尾結點之后,那么將 p0的值賦給p2- ,使p2-next指向待插 入的結點,然后將pl的值賦給p0-next ,使得p0-next指向pl指向的變量.如果 插入位置為第一個結點之前,那么將 p0賦給head,將pl賦給p0-next.如果

12、要插到 表尾之后,應將p0賦給p1-next , NULlMZp p0-next.最后再調用排序的函數,將 學生成績重新排序.10、保存數據到文件函數void save(STUDENT *head)這是一個不返回值的有參函數,形參為“鏈表頭的指針,可以把學生記錄保存 在電腦上由自己任意命名的二進制文件.11、從文件讀數據函數 STUDENT *load()這是一個不返回值的有參函數,形參為“鏈表頭的指針,根據輸入的文件地址 進行讀取.2.程序代碼 內容一:#include void main() int i,j,card52;for(i=0;i52;i+)/52張牌所有狀態均為 1,即均為正面

13、cardi=1;for(j=2;j=52;j+)/對52張牌(序號放在i里)對2, 3.52 (放在j里)按i+1是否是j的倍數進行狀態翻轉.for(i=0;i52;i+) if(i+1)%j=0)文檔實用標準cardi=cardi?0:1;printf(positive card are:);for(i=0;i52;i+)對翻轉處理后狀態仍然是正面的( card保持為1)的將其編號輸出.if(cardi)printf(%d ,i+1);內容二:#include #include #include using namespace std; struct ListNode char data;L

14、istNode *link;ListNode *first;定義全局變量,存儲鍵盤輸入的長度包括回車int ko;/ListNode *CreatList() ListNode *first,*p,*q; char i;int m=1000000;int count=0;bool flag;cout請輸入文章,以#號結束: / 創立鏈表 / first=new ListNode;q=first;for(int j=1;jdata=i;/p-link=NULL;q-link=p;/q=q-link;每輸入一個子符,count加一,記錄文早長度 向鏈表結點賦值指針向后移文檔實用標準) if(fla

15、g=false) /( ko=count; goto loop;) ) loop:return first;/當輸入結束,將 count的值賦給ko返回first 指針/查文章中共有多少個字符/void countchar(ListNode *j) (ListNode *h;h=j-link;/hint mm;mm=ko;/for(int rr=0;rrdata=n)/mm-;/mmh=h-link;/j的返回指針為first 指針為頭指針的下一個結點的指針將全局變量的值賦給mm如果結點的內容為回車的值減一,最后mmW值就是字符數cout這篇文章共有mm,個字.endl;/查文章中共有多少個數

16、字/sumlink;/mfor(int cc=0;ccdata=0 & m-datalink;coutlink;/m文檔的返回指針為first 指針為頭指針的下一個結點的指針實用標準for(int ccc=0;cccdata=A & m-datadata=a & m-datalink;cout文章中的字母個數是:sumlink;/m為頭指針的下一個結點的指針for(int ss=0;ssdata=)sum+;m=m-link;cout文章中的空格個數是:sumendl;/自由查找字符 /void countcharnumber(ListNode *r)/rint m;coutm;/if(m=1

17、)/ListNode *o;char c;coutc;o=r;int sum=0;for(int s=0;sdata=c) sum+; o=o-link; cout 文章中c的個數是: 的返回指針為first 指針;定義要查找的字符鏈表長度長度為1時的查找方式sumendl;文檔實用標準當要查找的長度大于 1的情況為存儲要查字符的鏈表的頭指針建立鏈表存儲要查的字符if(m!=1)/(char i;ListNode *hh, *h, *n,*hhh,*o,*oo;hh=new ListNode;h=hh;hhh=hh;/hhhcout請輸入字符:;for(int j=0;ji;n=new Lis

18、tNode;n-data=i;h-link=n;h=n;h-link=NULL;hh=hhh-link;oo=r;/讓oo指向存儲文章鏈表的頭結點o=r-link;/o為頭結點的下一個結點的指針int sumadd=0;/sumadd為記數變量for(int s=0;sdata!=hh-data) /如果文章鏈表的內容和要找的內容小一致時(o=oo-link; o=o-link;/oo/oo為記錄第L個一樣內容的位置的指針如終仕o附刖回,兩拍針起后移oo=oo-link;hh=hhh-link;/hh是存儲查找內容鏈表的第一個結點的指針 else/如果兩鏈表的內容相同,hh和o指針后移hh=h

19、h-link; o=o-link;/oo不動,用來定位,方便指針的回溯 else/如果存儲要查內容的鏈表的指向最后/說明找到一個相符,sumadd加一hh=hhh-link; sumadd+;/hh回到存儲要查找內容鏈表的個結點cout 文章中要查找的字符個數是:sumaddendl;文檔實用標準)/刪除指定的字符 /void deletechar(ListNode *rr1)/rr1(int ml;coutm1;if(m1=1)/(ListNode *oo1,*g1; char c1;coutc1;oo1=rr1;while(oo1-link!=NULL) (if(oo1-link-data

20、=c1) ( g1=oo1-link;oo1-link=g1-link;) oo1=oo1-link;) ) if(m1!=1)/(ListNode *o2,*oo2,*hhh2,*n2,*hh2, *h2; char i2;hh2=new ListNode; /hh2 h2=hh2;hhh2=hh2;/cout請輸入字符:; for(int j2=0;j2i2;n2=new ListNode; n2-data=i2; h2-link=n2;h2=n2;)h2-link=NULL;hh2=hhh2-link;/hh2的返回指針為first 指針;當要刪除一個字符時的情況當要刪除多個字符時的情況

21、為頭指針讓hhh2指向頭指針建立鏈表存儲要刪除的內容后移一個,為頭指針指向的結點的指針oo2=rr1;/oo2o2=rr1-link;/o2為存儲文章鏈表的頭結點為頭結點所指向的結點指針for(int s2=0;s2data!=hh2-data) (o2=oo2-link;o2=o2-link; / oo2=oo2-link; / hh2=hhh2-link; else (當文章鏈表結點的內空不為空時當記錄要刪除的字符的鏈表指針不指向最后結點時與查找功能類似,oo2為定位指針,方便回溯 如果兩鏈表的內容不同,指針分別后移hh2=hh2-link; /如果兩鏈表內容相同,兩指針同時后移o2=o2

22、-link; /oo2不移,定位作用else(hh2=hhh2-link; / oo2-link=o2;/找到符合條件的鏈表后,hh2回到頭結點的下一個結點 定位指針指向符合條件的最后的一個結點的下一個結點符合內容的鏈表結點被刪除/輸出鏈表內容函數 /void putch(ListNode *uuu) /uuu的返回指針為 first 指針(ListNode *uu;uu=uuu-link; while(uu!=NULL) ( coutdata; uu=uu-link; coutlink;ofstream outfile(f1.txt,ios:trunc); /文檔的返回指針為first 指針

23、清空并翻開文件實用標準for(int nn=1;nndata);yyy=yyy-link;outfile.close();/將刪除字符后的文本存到文件中的函數/void writech1(ListNode *yy) /yy(ListNode *yyy;yyy=yy-link;ofstream outfile(f2.txt,ios:trunc); / for(int nn=0;nndata);yyy=yyy-link;outfile.close();int main()(first=CreatList();countchar(first);countletter(first);countspac

24、e(first);countnumber(first);countcharnumber(first);writech(first);char ch;ListNode *milk;milk=first-link;ifstream infile(f1.txt,ios:in); / if(!infile)(cerropen f1.txt error!data=ch;的返回指針為first 指針清空并翻開文件翻開文件將文件內容賦給鏈表文檔實用標準milk=milk-link;)infile.close();deletechar(first);putch(first);writech1(first);r

25、eturn 0;)內容三:/*頭文件*/#ifndef H_STUDENT_HH#define H_STUDENT_HH#include stdio.h#include string.h#include malloc.h#define LEN sizeof(struct message_student) /*一個結構體數組元素的長度*/#define numsubs 5/*學科數目 */typedef struct message_student /*結構體定義 */char number6;char name20;char sex4;float subjectnumsubs;float sc

26、ore;float average;int index;student;學生數目*/指向結構體數組*/extern int numstus; /* extern student *pointer; /* extern int lens;/*函數聲明*/int menu_select();/*界面選擇*/int openfile(student stu);/*翻開文件*/int findrecord(student stud); /*信息記錄*/int writetotext(student stud); /* void welcome();/*void display1();/*保存義件開始*

27、/ 結束*/*/void showtable();/*顯小表頭*/void sort(student stu);/*void deleterecord(student stu,int i);void addrecord(student stud);查詢信息*/文檔實用標準void display(student stud,int n1,int n2);void amendrecord(student stud);/*void count(student stud);void sortnum(student stud);void sortnum2(student stud);void sortn

28、ame(student stud);void sortname2(student stud);void sortcount(student stud);void sortcount2(student stud);void statistic(student stud);修改信息*/#endif/*選擇菜單板塊*/int menu_select()char c;printf(nn);printf( printf( printf( printf( printf( printf(nn);printf( 請選擇(0-8):);c=getchar();getchar();return (c-0); 1.

29、增加學生記錄 2.查詢學生記錄 3.修改學生記錄 4.學生記錄排序 5.統計信息n) 6.翻開文件n) 7.保存文件n) 8.顯示記錄n) 0.退出系統n)/*查找信息記錄板塊*/int findrecord(student stud) char str2;int i,num;if(numstus=0)printf(沒有可被查找的記錄n);return -1; elseprintf(以何種方式查找?n1.學號t2.姓名t3.名次n);gets(str);if(str0=1)/*按學號查找 */printf(請輸入學號:);gets(str);for(i=0;i=numstus;i+)文檔實用標

30、準if(strcmp(str,studi.number)=0)(display(stud,i,i);break;else continue;else if(str0=2)/*按姓名查找 */(printf(請輸入姓名:);gets(str);for(i=0;i=numstus;i+)if(strcmp(str,)=0)(display(stud,i,i);break;else continue;else if(str0=3)/*按名次查找 */(printf(請輸入名次:);scanf(%d,&num);getchar();for(i=0;inumstus)(printf(

31、沒有查找所要的信息.n);return -1;return i; void sort(student stud)/* 查詢方式*/ (int i,j=0;char str5;student *p;文檔實用標準p=stud;if(numstus=0)(printf(沒有可供查詢的記錄!);)while(1)(for(i=0;i+)(printf(請輸入查詢方式:);printf(直接輸入回車那么結束查詢操作)n);printf(1.根據學號t);printf(2.根據姓名t);printf(3.根據名次n);gets(str);if(strlen(str)=0) break;if(str0=1)

32、(printf(請輸入排序次序:n);printf(1.升序排列 t);printf(2.降序排列 n);gets(str);if(str0=1)sortnum2(p);elsesortnum(p);display(stud,0,numstus-1);)else if(str0=2)(printf(請輸入排序次序:n);printf(1.升序排列 t);printf(2.降序排列 n);gets(str);if(str0=1)sortname2(p);elsesortname(p);display(stud,0,numstus-1);)else if(str0=3)(printf(請輸入排序次

33、序:n);printf(1.升序排列 t);printf(2.降序排列 n);gets(str);if(str0=1)sortcount2(p);elsesortcount(p);文檔實用標準display(stud,0,numstus-1);)else printf( 請輸入 13);printf(是否退出排序?(y/n);gets(str);if(str0=y|str0=Y) break;) return;)void sortnum(student stud) /*降序 */int i,j;student temp;student *p;p=stud;for(i=0;inumstus;i+

34、)for(j=0;j0)temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;)void sortnum2(student stud)/*升序 */int i,j;student temp;student *p;p=stud;for(i=0;inumstus;i+)for(j=0;j0)temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;)void sortname(student stud)/*姓名 B序 */int i,j;student temp;student *p;p=stud;文檔實用標準for(i=0;inumstus

35、;i+)for(j=0;j0)(temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sortname2(student stud) /*姓名升序 */(int i,j;student temp;student *p;p=stud;for(i=0;inumstus;i+)for(j=0;j0)(temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sortcount(student stud)/*名次降序 */(int i,j;student temp;student *p;p=stud;for(i=0;inums

36、tus;i+)for(j=0;jstudj.index)(temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;void sortcount2(student stud)/*名次升序 */(int i,j;student temp;student *p;文檔實用標準p=stud;for(i=0;inumstus;i+) for(j=0;jstudj+1.index) (temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;/*輸出統計信息*/void statistic(student stud)(int i,j=0,k=0;char

37、 c1,str2;float averagenumsubs,sum=0;if(numstus=0)printf(沒有可被查找的記錄n);else(while(1)(printf( 下面將統計測試成績n);printf(請選擇你要統計哪科的成績1.高數t2.英語t3. SQLt4.C 語言t5.毛概n);c1=getchar();printf(t一共有個d記錄n,numstus); /*總共記錄數*/switch(c1)(case 1:for(i=0;istudi.subject0) k=i; if(studj.subject0studi.subject0) j=i; average0=sum/

38、numstus; printf(t高數的最高分:n);/*最高分*/printf(tt學 號 :s姓 名 :s分數:%.2fn,studj.number,,studj.subject0); printf(t高數的最低分是:n);/*最低分*/printf(tt學 號 :s姓 名 :s分數:.2fn,studk.number,,studk.subject0); printf(t高數的平均分是 5.2fn,average0);/*平均分 */break; case 2: for(i=0;istudi.subject1) k=i;if(studj.subjec

39、t1studi.subject1) j=i;average1=sum/numstus;printf(t printf(tt英語的最高分:n);/*學 號 :%s最高分*/姓 名:%s數:%.2fn,studj.number,,studj.subject1);printf(t printf(tt英語的最低分是:n);學 號 :s/*最低分*/:%s數:%.2fn,studk.number,,studk.subject1);printf(t break;case 3:英語的平均分是 5.2fn,average1);/*平均分*/for(i=0;istudi.

40、subject2) k=i;if(studj.subject2studi.subject2) j=i;average2=sum/numstus;printf(t SQL printf(tt的最高分:n);/*學 號 :%s最高分*/ 姓:%s數:%.2fn,studj.number,,studj.subject2);printf(t SQL printf(tt的最低分是:n);學 號 :s/*最低分*/姓 名:%s數:%.2fn,studk.number,,studk.subject2);printf(t SQL break;case 4:for(i=0

41、;istudi.subject3) k=i;if(studj.subject3studi.subject3) j=i;average3=sum/numstus;printf(tC printf(tt語言的最高分:n);學 號 :s/*最高分*/姓 名:%s數:%.2fn,studj.number,,studj.subject3);printf(tC printf(tt語言的最低分是:n);學 號 :s/*最低分*/:%s數:.2fn,studk.number,,studk.subject3);printf(tC break;case 5:語言的平均分是 %5.2fn,average3);/*平均分*/for(i=0;istudi.subject4) k=i;if(studj.subject4studi.subject4) j=i;文檔實用標準)average4=sum/numstus;printf(t毛概的最高分:n);/*最高分*/printf(tt學 號 :%s姓 名:%s分%.2fn,studj.numbe

溫馨提示

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

評論

0/150

提交評論