C程序設計實驗報告
實驗項目:基本的程序語句實驗;程序的簡單算法設計實驗
姓名:魏志遠 實驗地點:第一教學樓514教室 實驗時間:3月19號
一、實驗目的與要求
1、
(1)掌握C語言幾種基本數據類型,如整型(int)、字符型(char)、單精度(float)、雙精度(double),以及由這些基本類型構成的常量和變量的使用方法。
(2)掌握C語言的運算符和表達式的正確使用。
(3)掌握自增(++)和自減(--)運算符的正確使用。
(4)掌握基本的輸入輸出函數scanf()、getchar()、printf()、和putchar()函數的基本功能、調用方法、輸入輸出格式控制規定。
(5)能獨立編寫順序結構程序並調試通過。
(6)用表達式語句、輸入輸出語句解決簡單的應用問題並上機實現。
2、
(1)掌握結構化程序的算法描述方法。
(2)了解C語言的基本語法要素,能熟練地將算大描述轉化為C語言程序。
(3)熟練掌握C語言的運算符,即運算符的優先級和結合性、運算規則、運算對象類型。
二、實驗內容
1、實驗練習:
(1)2.3.3 字符和ASCII碼
問題的簡單描述:從鍵盤輸入一個大寫字母,要求轉換成小寫字母輸出,並輸出這個小寫字母和相鄰的二個字母,以及他們的ASCII碼值。
實驗代碼:
#include<stdio.h> main() { printf("請輸入一個大寫字母;\n"); char ch; scanf("%c",&ch); printf("小寫字母為%c %c %c\n",ch+31,ch+32,ch+33); printf("ASCII碼為%d %d %d",ch+31,ch+32,ch+33); }
問題分析:開始想使用自增自減的方式來運算3個相鄰的數,然后發現得出的結果與同學間的不一樣,得出錯誤的結果,因此去求教了同學,在得到同學的展示和提醒之后,發現可以在printf輸出函數里面給我輸出的結果賦值,就可以很容易的得出正確結果。
(2)2.3.4 運算符與表達式的應用
問題的簡單描述:從鍵盤輸入一個三位整數,將輸出的該數的逆序數。例如,輸入123,輸出321.
實驗代碼:
#include<stdio.h> main() { int a,b,c,x,y; printf("請輸入一個3位的正整數;\n"); scanf("%d",&x); a=x/100; b=(x%100)/10; c=x%10; y=c*100+b*10+a; printf("%d:%d\n",x,y); return 0; }
問題分析:編寫這個程序時沒出現什么問題,主要是自己沒想到怎么將三位數的位數取出來,老師在我們實驗之前給了我們提示,所以便成功了。
(3)2.3.5 順序結構應用程序
問題的簡單描述:編寫一個程序,用於醫院收費處出納算賬。要求輸入所在醫院費用(西葯房、檢查費、材料費、床位費、觀察費和護理費),打印出應付錢數,再輸入病人所付錢數,打印出應找的錢數。
實驗代碼:
#include<stdio.h> int main() { float x,j,c,hj,fk,zh,cw,g,f; printf("輸入西葯費,檢查費,材料費,床位費,觀察費,護理費:\n"); scanf("%f%f%f%f%f%f",&x,&j,&c,&cw,&g,&f); hj=x+j+c+cw+g+f; printf("應付款(元):%.2f",hj); printf("病人付款(元):"); scanf("%f",&fk); zh=fk-hj; printf("計算結果:\n"); printf("病人付款=%6.2f元\n應付款=%6.2f元應找回=%6.2f\n",fk,hj,zh); return 0; }
問題分析:第一次編寫的時候,沒有在scanf的變量里加入&,導致自己無法編譯成功,卻自己沒有發現問題,在同學幫助下找到問題並解決了。而后又發現在scanf里多加了一個%f,導致輸入數據時多了一個字節,按回車沒有得到任何東西,刪掉之后便可以正常運行。
2、實驗練習:
(1)3.3.1 制定數學函數的計算方法
問題的簡單描述:有一函數:y=
實驗代碼:
#include<stdio.h> main() { float x,y; printf("請輸入x的值:\n"); scanf("%f",&x); if (x<1) y=x; else if (x<10) y=2*x-1; else y=3*x-1; printf("y的值%.2f\n",y); }
問題分析:編譯代碼時對於if else不熟悉,所以不知道如何下手,編譯怎么樣的代碼才能判斷變量的值與常量的大小。經過與同學間的探討和書籍上的例題的提醒,我便理解了if else的用法,問題也就成功解決了。
(2)3.3.2 雞兔同籠問題。
問題的簡單描述:用流程圖描述求解雞兔同籠問題的算法:已知雞兔的總頭數有h(head),總腳數有f(feet),求雞兔各多少只?
實驗代碼:
#include<stdio.h> main() { int h,f,x,y; printf("雞兔總數,雞兔腳數:\n"); scanf("%d %d",&h,&f); if(h>0&&f>0) { x=(4*h-f)/2; y=(f-2*h)/2; printf("雞:%d 兔:%d\n",x,y); } else printf("輸入錯誤!\n"); }
問題分析:編寫代碼時太依賴書籍,書上的程序模板是if (x>0&&y>0),而真實需要的是if (h>0&&f>0),像書上模板的代碼,編譯時不會出現問題,但在運行時卻沒有結果,得到的一直顯示輸入錯誤,與同學商討后才發現問題,成功解決了。
(3)3.3.3 根據平面坐標,輸出圓塔的高度。
問題的簡單描述:有4個圓塔,圓心分別為(2,2)、(-2,2)、(2,-2)、(-2,-2),圓半徑為1。這4個塔的高度均為10m,塔以外無建築物。先輸入任一點的左邊,若該點左邊在任一圓塔內,則輸出圓塔的高度;若該點不在塔外,則輸出為0.
2實驗代碼:
#include<stdio.h> #include<math.h> main() { int h=10; float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4; printf("請輸入一個點(x,y)"); scanf("%f%f",&x,&y); d1=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)); d2=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2)); d3=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3)); d4=sqrt((x-x4)*(x-x4)+(y-y4)*(y-y4)); if( d1>1&& d2>1&& d3>1&& d4>1) h=0; printf("該點的高度=%d",h); }
問題分析:在實驗時,出現了一個問題,就是對於平方的表達,一般我們了解到的是^2,但是在C語言中卻表達不出來,在邀請同學講解的時候發現了都是(x1-x)*(x1-x)運算,而老師就在網上查找了,發現在C語言中編碼要用pow,例如 double a = pow(3.14, 2); // 計算3.14的平方。所以我發現遇到問題要去動手解決問題。
三、實驗小結(在本次實驗中收獲與不足)
在大學第一次C語言的實驗中,共進行了6個實驗。在實驗中,也發現了不少的問題。對鍵盤的不熟練,特別是對於#%&*位置的不了解,每次編寫代碼的時候都要去慢慢摸索;對於代碼的記憶不好,會忘記一些代碼怎么輸入,導致卡殼;對於細節的把握也不仔細,容易忘掉在語句后面添加分號,在編譯時出現錯誤。但是,這次試驗中,收獲的還是更多,學到了很多代碼和理解了一點優先級,通過自己編寫代碼,對於記憶也有很大的幫助。最主要的是,學到了去如何找到問題,並且有了解決的方向,可以尋求同學和老師的幫忙,也可以運用百度搜索,遇到問題要及時解決。