c++課程設計實踐報告_第1頁
c++課程設計實踐報告_第2頁
c++課程設計實踐報告_第3頁
c++課程設計實踐報告_第4頁
c++課程設計實踐報告_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、c+課程設計實踐報告 班級:83121 姓名:張弛 學號:xx1000491 題目一、 題目描述: 銀行整存整取存款不同期限的月息利率(采用復利 方式,即利滾利)分別為 0.63% 期限一年 0.66% 期限二年 月息利率= 0.69% 期限三年 0.75% 期限五年 0.85% 期限八年 要求輸入存錢的本金和期限(以整數年為單位) ,求到期時能從銀行 得到的利息與本金的合計。 提示:可以用嵌套的 if-else 結構或 switch 結構實現,核心函數 pow(1+月利率,月份)。 請思考年份是四、六、七或八年以上的情況。 設計思路: (一)使用 switch 選擇語句 對應年份 (二)明確

2、核心函數 pow 是計算復利的(例如:x 的 n 次方 ) ;由于 是以年為計算期限的,而所給的利率是月利率,所以計算時 應該在年的根底上乘以 12; (三)復利計算就是一種冪運算,i=p*(1+i)n,本金和利率都是變 動的 (四)在除了 1、2、3、5 和 8 年之外的其他年份中,要注意“就低 不就高”的原那么,尤其是在 8 年之后,也是套用期限八年的利率。 附源程序如下: #include #include void main() int years; float capital,sum; scanf("%f %d",&capital,&years);

3、 switch(years) case 1:sum=capital*pow(1+0.63*0.01,12);break; case 2:sum=capital*pow(1+0.66*0.01,24);break; case 3:sum=capital*pow(1+0.69*0.01,36);break; case 4:sum=capital*pow(1+0.69*0.01,48);break; case 5:sum=capital*pow(1+0.75*0.01,60);break; case 6:sum=capital*pow(1+0.75*0.01,72);break; case 7:su

4、m=capital*pow(1+0.75*0.01,84);break; case 8:sum=capital*pow(1+0.85*0.01,96);break; default:sum=capital*pow(1+0.85*0.01,12*years); printf("%f",sum); 題目二、 題目描述: 簡單計算器。用 switch 語句編寫一個程序計算表達式: data1 op data2 的值。其中 op 為運算符+、-、*、/。 設計思路: (一)明確計算器是怎樣進行計算的; (二) 細節, 比方很多地方需要分號, 在遇到字符時, 我們應該用 , 而不是“

5、” ; (三 switch 語句主要用于多分支選擇,此題有+、-、*、/,這就是 選擇。使用 switch 每個 case 對應+ - * /符號 程序涉及到至 少三個量,運算符 op 和兩個數字;先讓用戶輸入兩個數字和運算符, 兩個數字的計算在后面的程序中用 swith 結構運行。 運 行 效 果 截 圖 : 附源程序如下:#include int main() float data1,data2,c; char op; printf("請輸入表達式中兩個數字 data1 和 data2 "); /打印 scanf("%f%c%f",&data

6、1,&op,&data2); /輸入 printf("請輸入運算符+、-、*、/ ");/ 打印 switch(op) /switch ()case stick:break; 這個是個選擇結構 如果 op = stick 那么執行這一句 如果沒有 那么執行 default 后面 的語句 case '+':c=data1+data2;break; case '-':c=data1-data2;break; case '*':c=data1*data2;break; case '/':c=data1

7、/data2;break; default:printf("輸入錯誤");break; printf("%f",c); return 0; 題目三 題目描述:編寫程序,用二分法求方程 2x3-4x2+3x-6=0 在(-10,10) 之間的根。 提示: 用 do-while 語句實現。 二分法的計算步驟: (1) 準備 計算 f(x)在有根區間a,b端點處的值 f(a),f(b) (2) 二分 計算 f(x)在區間中點(a+b)/2 處的值 f(a+b)/2 (3) 判斷假設 f(a+b)/2=0,那么即是根,計算過程結束。 否那么,檢測: a. 假設

8、f(a+b)/2與 f(a)異號, 那么根位于區間a,(a+b)/2內, 這時以(a+b)/2 代替 b; b. 假設 f(a+b)/2與 f(a)同號, 那么根位于區間(a+b)/2,b內, 這時以(a+b)/2 代替 a; 反復執行步驟 2 和 3,直到區間a,b長度縮小到允許的誤差范圍之 內,此時中點(a+b)/2 即為所求的根 設計思路: (一)二分法是指在整個算法中,讓計算值無限趨近于根的值,利用 數學知識可知,當了兩個點的結果異號時,函數的根就在這兩個數之 間,利用二分法可以無限的把根的范圍縮小,直到可以確定為止; (二)do-while 是循環語句,先執行一次指定的循環體語句,然

9、后 判別表達式, 當表達式的值為非零 (真) 時, 返回重新執行循環語句, 如此反復,直到表達式的值等于 0(假)為止才結束。 (三)void main()是聲明函數,并且是對主函數的聲明。題目所 給的范圍是(-10,10) ,因此在聲明函數中定義一個 a 和 b 來代替區 間的范圍,而用 c 來代指中間指也是最后的結果,在這個程序中 a、 b、c 都是隨著范圍不斷變化的變量。如果(-10,10)的范圍過大, 就需要循環語句來縮小區間范圍, 即 a=c 或 b=c。 當函數值在 (-10,10) 中任意一點取得 0 時,就正是我們所要的結果。循環條件是當區間 a 和 b 的函數值小于精度 0.

10、01。 運行效果截圖: 附源程序如下: #include "stdio.h" float f(float x) float y; y=2*x*x*x-4*x*x+3*x-6; return y; void main() float a=-10,b=10,c; doc=f(a+b)/2); if(c=0) break; if(c*f(a)>0) a=c; else b=c; while(f(b)*f(a)<0.01); /*解的精度為 0.01*/ printf("方程的解是:%f",c); 題目四 題目描述:編寫程序,給定一個整數 i,請求出

11、另一個整數 j,使 i 和 j 在用 8 位二進制表示時互為逆序。例如:給定 i=3 時,應得到 j=192(3 的二進制為:00000011,192 的二進制為 11000000) 。 提示: 十進制整數轉換為二進制整數用“除 2 求余”法。 二進制整數轉換為十進制整數用“按權相加”法。 設計思路: (一)二進制整數轉化為十進制整數用“按權相加”法 (二)二十進制整數轉化為二進制整數用“除 2 求余” ,用&轉化。 (三)運算符:<<是指左移一位,>>是指右移一位,<<=結合時從右 到左運算, 其中 a<>a 是指 b 向右移 a 位,

12、 左移一位相當于乘 2 右移 1 位相當于除 2 (四)在交換時,用的是中間法 運行效果截圖: 附源程序如下:#include "stdio.h" void main() int i,j,s=1,a8; printf("請輸入一個整數 i: "); scanf("%d",&i); for(j=0;j<8;j+,s<<=1) aj=i & s; printf("所得到的 j 為: "); printf("%d ",(a0<<7) | (a1<&l

13、t;5) | (a2<<3) | (a3<<1) | (a4>>1) | (a5>>3) | (a6>>5) | (a7>>7); 題目五 題目描述:編寫程序,抓交通肇事犯。 一輛卡車違反交通規那么,撞人后逃跑。現場有三人目擊事件,但都沒 有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數字是相 同的;乙說:牌照的后兩位數字是相同的,但與前兩位不同;丙是位 數學家,他說:四位的車號剛好是一個整數的平方。根據以上線索求 出車號。 提示: 按照題目的要求,造出一個前兩位數相同、后兩位數相同且相互 間又不同的整數,然后判斷該

14、整數是否是另一個整數的平方。 用窮舉法解此題。窮舉法是最簡單、最常見的一種程序設計方法, 它充分利用了計算機處理的高速特征。窮舉法的關鍵是要確定窮 舉的范圍,既不能過分擴大窮舉的范圍,也不能過分縮小窮舉的 范圍,否那么程序的運行效率會很低,或有可能遺漏正確的結果而 產生錯誤。 設計思路: (一)11 11 到 11 99 在 99 11 這樣 窮舉 判斷是否一個 數的平方 那么是 將這個數開方 取整 再取平方 是否還是原來的數 (二)此題需要滿足三個條件:前兩個數相同,后兩個數相同; 前后兩數分別不相同;這個數是一個整數的平方。需要每個條件都 滿足,if 才為真。 (三)主要思路是窮舉。窮舉是

15、指在適當的范圍內舉出一個數。 運 行 效 果 截 圖 : 附源程序如下: #include void main() int a,b; for(a=32;a<=99;a+) b=a*a; if(b/1000=b%1000/100 b%100!=(b/1000)*10+b%1000/100) printf("the license plate is:%d ",b); && b%100/10=b%10 && 題目六 題 目 描 述 : 從 終 端 輸 入 實 數 ex=1+x+x2/2!+x3/3!+?+xn/n!的值。 設計思路: 先輸入一

16、個 x 的值; 再設計一個子函數, 計算 1! , 2! , 3! ?n! 的值;之后用 sum 函數,和 pow 函數處理分子,用累加的方式進行分 子計算,并形成等式;最后輸出結果。 x , 用 遞 推 法 求 附源程序如下:#include "stdio.h" int f(int x,int n) int i,m=0; for(i=0;i for(i=0,s=0;f(x,i)<0.001;i+) s+=f(x,i); printf("其結果為:%d ",s); 題目七 題目描述:打印出以下的楊輝三角形(要求打印出 10 行) 。 1 1 1 1

17、 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ? ? ? 設計思路: (一)二維數組主要用于處理多行的問題,而且第一行在數組之中是 第 0 行。 (二)楊輝三角有一個明顯的特點:每一行的最后一個數字與第一個 數是相同的,此外,下 (三)一行的第二個數是由上一行的第一個數和第二個數相加之和, 以此類推。 定義指針是為了讓整個程序不那么復雜。 運行效果截圖: 附源程序如下: #include int main(void) int a1010,(*p)10=a,i,j; for(i=0;i<10;i+) *(*(p+i)+0)=1; *(*(p+i)+i)=1; f

18、or(i=2;i<10;i+) for(j=1;j 題目八 題目描述:找出一個二維數組的“鞍點” ,即該位置上的元素在該行 上最大,在該列上最小。 提示: 一個二維數組可能有鞍點也可能沒有鞍點,假設有鞍點,那么只有一 個。 準備兩組測試數據: (1) 二維數組有鞍點: 9 80 205 90 -60 210 40 96 1 89 -3 101 (2) 二維數組沒有鞍點: 9 80 205 90 -60 210 40 1 89 196 -3 101 7 45 54 156 用 scanf 函數從鍵盤輸入數組各元素的值,檢查結果是否正確。如 果已指定了數組的行數和列數,可以在程序中對數組元素

19、賦初值,而 不必用 scanf 函數。請同學們修改程序以實現之。 設計思路: (一) 先找出一行中值最大的元素,然后看它是不是該列中的最小值,由于 一個二維數組最多有一個鞍點,所以如果是那么鞍點存在且它就是鞍 點,輸出該鞍點;如果不是,那么再找下一行的最 大數,以此類推。如果每一行的最大數都不是鞍點,那么此數組無鞍點 (二) 在程序中,先令 ai0最大賦值給 maxi,在 for 循環的比擬中,把 符合條件的行的最大值賦給 maxi,將每一次比擬后的最大的列數賦 值給 maxj,從而找出 i 行最大的那個。 再假設那個數就是鞍點,將最大數和同列的數值相比,如果 maxj 不 是最小的,那么不是

20、鞍點,繼續找。 (三)引入一個參數 flag=1,假設不存在鞍點那么 flag 為 0,假設存在鞍 點那么 flag 依舊為 1 運行效果截圖: 附源程序如下:#include "stdio.h" #define s 80 #define t 80 void main() int m,n,i,j,t,maxh,maxl,flag,ast; printf("請輸入二維數組的行數 m 和列數 n: "); scanf("%d %d",&m,&n); printf("請輸入二維數組的各個元素: "); f

21、or(i=0;iai0) t=aij;maxh=i;maxl=j; for(i=0;i a%d%d=%d ",maxh,maxl,amaxhmaxl); 題目九 題目描述:某班期終考試科目為高數 mt、英語 en 和物理 ph,有 30 個人參加考試。為評定獎學金,要求統計并輸出一個表格,表格內容 包括學好、各科分屬、總分和平均分,并標出 3 門課均在 90 分以上 者(該欄標志輸出為 y,否那么為 n) ,表格形式如下: no mt en ph sum v >90 1 2 3 97 87 92 276 92 92 91 90 273 91 90 81 82 253 84 .

22、n y n #include "stdio.h" void main() 設計思路:由于是對 30 個學生的數據進行輸入與統計,所以建立二 維數組, 根據各位置的條件來定義其內容, 第 8 個數據是字符型數據, 所以另設一數組進行存儲,最后在將數據整合輸出。 附源程序如下:#include "stdio.h" void main() int i,j,sum,flag,a307; printf("請輸入 30 個考生的三科成績: "); for(i=0;i<30;i+) ai0=i+1; for(sum=0,j=1;j<4;

23、j+) scanf("%d",&aij); sum+=aij; if(aij>90) flag=1; else flag=0; ai4=sum; ai5=sum/3; if(flag=1) ai6='y' else ai6='n' printf("no mt en ph sum v >90 "); for(i=0;i<30;i+) for(j=0;j<6;j+) printf("%5d",aij); printf(" %c ",ai6); 題目十 題目

24、描述下面是一個 5*5 階的螺旋方陣,試編程打印出此形式的 n*n (n<10)階的方陣(順時針旋進) 。 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 提示:用二維數組實現。 設計思路:定義一個 n*n 維數組存放該方陣,m 為該方陣的圈數,一個大循環中嵌套了 四個小循環,每一圈為一個大循環,第一個小循環按順序寫出第一行的數,第二個小循環按 順序寫出最后一列的數, 第三個小循環按順序寫出最后一行的數, 第四個小循環按順序寫出 第一列的數,再進行第二次大循環,循環完畢后再進行循環輸出數組中的 n*n 個

25、數,該螺旋 方陣就出來了。 附源程序如下: #include "stdio.h" void main() int i, j, k = 0, m, n,a1010; printf("請輸入方陣行列數 n(n<10): "); scanf("%d",&n); if(n%2=0) m = n / 2; else m = n / 2 + 1; for(i=0;i k+; aij=k; for (j=i+1;j=i;j-) k+; an-i-1j =k; for (j=n-i-2;j>=i+1;j-) k+; aji=k; for (i=0;i printf("%5d", aij); printf(" "); 附: 實習總結與心得體會 經過 c 語言實習,讓我加深了對 c 語言的了解,而不只是單單 的在課本中學到的那些理論,平時乏味的課程,通過自己動手親自編 寫,變的生動有趣,而在自己動手的過程中,出現的問題很多,比理 論要難的多,當一個程序寫完以后,經常會有很多錯誤而沒法解決。 不過,通過幾天的實習,逐漸積攢了一些經驗,有些錯誤可以很快就 看出來。 這次實習有很大的收獲,讓我對 c 語言有了更深的認識,平時 在課堂上學到的東西可以自己動手編寫,將其轉化成一些實用的技

溫馨提示

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

評論

0/150

提交評論