實驗一 C++基礎的應用
(實驗課時:2 實驗性質:設計)
實驗名稱: C++基礎的應用
實驗目的: (1)進一步學習VC++6.0開發環境及程序調試方法。
(2)練習C++函數的定義及使用;
(3)練習C++數組的定義及使用;
(4)練習C++指針的定義及使用;
(5)練習C++結構體的定義及使用;
(6)練習多文件的程序的編譯和運行方法;
實驗設備: (1)硬件:個人微機(配置不低於:CPU為P4,主頻1.6G,內存256MB,硬盤40GB);
(2)軟件:操作系統為WindowsXP(或2000、server2003等),工具軟件為Visual C++6.0。
實驗內容: (1)熟悉Visual C++6.0編譯系統的常用功能,特別是debug調試功能;
(2)編程1:編寫一個程序c1.cpp,用來求2個或3個整數的最大數。要求:用重載函數的方法來求最大數;函數原型:int max( int a, int b) 和 int max( int a, int b,int c)。
(3)編程2:編寫一個程序c2.cpp,求: a!+ b! + c!的值。要求:使用遞歸函數。主程序和函數分開到兩個源程序文件中,分別進行編譯后,再運行;
(4)編程3:有一個3*4的矩陣,要求編程求出其中值最大的那個元素的值,以及其所在的行號和列號;
(5)編程4:建立一個動態鏈表並進行輸出和刪除管理。鏈表的每個節點為學生信息,包括:學號,姓名,性別,下一學生信息的指針。程序的工作:(a)建立三個學生信息的節點,然后順序輸出該三個學生信息;(b)刪除中間的節點,再順序輸出學生信息。
(6)使用debug調試功能:追蹤第2個程序中函數的運行。
(7)思考:
在第2個程序中,如果a,b,c的值較大,則顯示的結果會怎樣?這時如何解決此問題?
(提示:顯示的結果會不對,可能還會是負數,定義一個數組來存放最后結果。)
實驗要求: (1)掌握Visual C++6.0開發環境的常用功能及使用,能進一步使用Visual C++6.0的debug調試功能:單步調試、設置斷點等;
(2)掌握C++函數的定義及使用,掌握函數的嵌套調用和遞歸調用的方法;
(3)掌握C++數組、指針、結構體的定義及使用;
(4)掌握多文件的程序的編譯和運行方法;
(5)程序格式規范,程序運行正確;
(6)認真書寫實驗報告,如實填寫各項實驗內容。
實驗步驟: (1)啟動Visual C++6.0開發環境;
(2)熟悉Visual C++6.0編譯系統的常用功能;
(3)在file菜單中,新建C++源程序c1.cpp;
(4)編輯C++源程序文件c1.cpp的內容。
(5) 編譯c1.cpp,系統會提示是否創建工程(由於前面沒有創建工程),選擇“是”。則創建一個工程;
(6)程序編譯正確時,則可建立可執行程序;
(注意觀察每步的結果)
(7)運行可執行文件;
(8)關閉工作空間。
(9)對編程2,在file菜單中,新建C++源程序cpp2_1;
(10)編輯C++源程序文件cpp2_1的內容;
(11)編譯cpp2_1,系統會提示是否創建工程(由於前面沒有創建工程),選擇“是”,則創建工程;
(12)在file菜單中,新建C++源程序cpp2_2;
(13)編輯C++源程序文件cpp2_2的內容;
(14)編譯文件cpp2_2時,系統提示是否加入到此工程,選擇“是”,則把文件cpp2_2加入到該工程中。
(15)編譯和運行此程序,並注意觀察每步的結果。
(16)使用調試功能:運行到光標處、單步跟蹤、查看變量值。
(17)使用關閉工作空間。
(18)參照上述方法,完成編程3和編程4。
注意:若編譯時出錯:“fatal error c1010:unexpexted end of file while looking for precompiled header directive.”;
該文件需要包含頭文件:stdafx.h,即在開頭有語句:#include “stdafx.h”
思考題:假如已建立了兩個C++源程序c1.cpp和c2.cpp。先用open打開c1.cpp,並完成了編譯、連接和運行,再打開c2.cpp,對它進行編譯和連接。此時會出現什么問題?原因何在?怎樣解決?
程序一
------》源代碼:
1 #include "iostream.h" 2 3 int max(int a,int b) 4 { 5 if(a>b) 6 return a; 7 else 8 return b; 9 } 10 11 int max(int a ,int b,int c) 12 { 13 if(a>=b&&a>=c) return a; 14 if(b>=a&&b>=c) return b; 15 if(c>=a&&c>=b) return c; 16 } 17 18 main() 19 { 20 int a,b,c,t1,t2; 21 22 23 cout<<"a="; cin>>a; 24 cout<<"b="; cin>>b; 25 cout<<"c="; cin>>c; 26 27 t1=max(a,b); 28 t2=max(a,b,c); 29 30 cout<<"t1="<<t1<<endl; 31 cout<<"t2="<<t2<<endl; 32 }
-------》分析總結:
1、重載函數:在同一命名空間內,可以允許不同函數有相同的名字。要求是這些函數在“參數個數”或“參數類型”這兩方面至少有一個不一樣。
程序二
-----------》源代碼:
1 //功能函數(遞歸) 2 #include "iostream.h" 3 4 double fact(int n) 5 { 6 double result; 7 if(n==1||n==0) 8 result=1; 9 else 10 result=n*fact(n-1); 11 return result; 12 } 13 //主函數 14 #include "iostream.h" 15 16 main( ) 17 { 18 double fact(int n); 19 int sum,a,b,c; 20 cout<<"a="; cin>>a; 21 cout<<"b="; cin>>b; 22 cout<<"c="; cin>>c; 23 sum=fact(a)+fact(b)+fact(c); 24 cout<<"sum="<<sum; 25 }
---------》分析總結:
1.遞歸函數:此函數兩個關鍵點是——遞歸出口、遞歸式子。遞歸出口是判斷什么時候停止遞歸的關鍵;遞歸式子關鍵靠找規律如何自己調用自己。
2.文件、工程:
程序三
----------》》源代碼:
1 //有一個3*4的矩陣,要求編程求出其中值最大的那個元素的值,以及其所在的行號和列號. 2 3 #include "iostream.h" 4 5 main( void ) 6 { 7 8 int a[3][4]; 9 int i,j,max,line=0,list=0; 10 11 for(i=0;i<3;i++) 12 { for(j=0;j<4;j++) 13 { 14 cout<<"請輸入第["<<i<<"]"<<"["<<j<<"]矩陣值:"; 15 cin>>a[i][j]; 16 } 17 } 18 //改進后的---------------------------------------------------------------------------------------------- 19 cout<<"please input no.1 line:"<<endl; 20 for(j=0;j<4;j++) 21 cin>>a[0][j]; 22 cout<<"please input no.2 line:"<<endl; 23 for( j=0;j<4;j++) 24 cin>>a[1][j]; 25 cout<<"please input no.3 line:"<<endl; 26 for( j=0;j<4;j++) 27 cin>>a[2][j]; 28 //---------------------------------------------------------------------------------------------------- 29 for(i=0;i<3;i++) 30 for(j=0;j<4;j++) 31 { 32 if(a[i][j]>=a[line][list]) 33 { 34 line=i; 35 list=j; 36 } 37 } 38 max=a[line][list]; 39 cout<<"max="<<max; 40 cout<<"line="<<line+1; 41 cout<<"list="<<list+1<<endl; 42 return 0; 43 } 44 //增加一個顯示出矩陣的功能:並添加了一些\t\n等的應用,使得界面更好看) 45 cout<<endl; 46 for(i=0;i<3;i++) 47 { for(j=0;j<4;j++) 48 { 49 cout<<a[i][j]; 50 cout<<"\t"; 51 } 52 cout<<"\n"; 53 }
--------》分析總結:
1、多理解和用一些endl、\t,\n這些,使得界面的顯示效果達到最優。
--------》運行結果: