[實驗目的和要求]
1,熟悉C語言運行環境。
2.掌握C語言程序的編寫格式和結構。
3、掌握C語言計算機步驟,了解運行C程序的方法。
4.這個實驗可以在學完教材第壹章後進行。
[實驗內容和步驟]
1.輸入壹個簡單的C語言程序:輸入壹個矩形的兩條邊,求矩形的面積。
[分析和討論]
1.寫下調試過程中發現的錯誤,系統給出的錯誤信息和對策。分析討論對策成敗的原因。
2.總結C程序的結構和編寫規則。
實驗2數據類型、運算符和表達式
[實驗目的]
1.熟練表達的表示
2.理解表達式的運行結果
3.理解C語言中數據類型的含義
[實驗內容和步驟]
1.使用printf函數輸入表達式運行結果。
2.該程序試圖計算鍵盤輸入的任意兩個整數的平均值:
[問題討論]
1.“=”和“= =”有什麽區別?
2." & amp和“&;& amp“|”和“||”有什麽區別?
3.如何正確選擇數據類型?
實驗三:選擇結構
[實驗目的]
1,了解條件和程序流程的關系
2.理解程序的進程覆蓋了不同的語句、分支和不同數據的路徑。
[實驗內容和步驟]
1,主題
有以下程序段:
{……
如果(a & gt1。& ampb = = 0)x = x/a;
if(a = = 2 | | x & gt;1)x = x+1;
}
為了更容易理解程序的邏輯結構,需要用流程圖來描述。
要求添加壹些輸入語句和輸出語句,使上述程序在a、b、X的不同值下運行,可以觀察到程序流經過了(覆蓋)哪些語句、分支和路徑。
[分析和討論]
(1)哪壹組數據可以使程序中的每個處理語句執行壹次?為了找出程序中每個處理語句的錯誤,應該用什麽樣的數據來測試程序?請在電腦上檢查妳的結論。
(2)哪兩組數據可以使程序中的每個分支運行壹次?這種情況和上面的討論有什麽不同?為了找出程序中backlog分支的錯誤,應該用什麽樣的數據來測試程序?請在電腦上檢查妳的結論。
(3)哪兩組數據可以用來執行壹次決策框中的每個條件運算?為了檢驗判斷條件中的錯誤,應該用什麽數據來檢驗程序?請在電腦上檢查妳的結論。
(4)哪四組數據可以用來檢驗各種條件的所有組合?應該用什麽樣的測試數據來檢驗各種條件的組合?請在電腦上檢查妳的結論。
(5)哪四組數據可以用來壹次覆蓋從開始到結束的所有路徑?為了測試程序在不同路徑下的錯誤,應該使用什麽樣的測試數據?請在電腦上檢查妳的結論。
實驗四循環結構(1)
[目的和要求]
1.掌握在編程條件循環結構時,如何正確設置循環條件,如何控制循環次數。
2.了解條件循環結構的基本測試方法。
[實驗內容和步驟]
1,下面是計算e的近似值(使誤差小於給定的δ)的程序。
主()
{double e=1.0,x=1.0,y,detax
int I = 1;
printf("\n請輸入錯誤:");
scanf("%lf ",& ampdetax);
y = 1/x;
while(y & gt;=detax)
{
x = x * I;
y = 1/x;
e = e+y;
++ I;
}
printf("%12.10lf ",e);
}
[分析和討論]
(1),閱讀上面的程序,寫出程序所依據的計算公式。
(2)、當輸入detax是什麽值時,可以使程序按以下要求運行:
。不進入循環;
僅循環壹次;
只循環兩次;
進入無限循環(程序會永遠循環下去)。
為了知道程序循環了多少次,應該在程序中添加什麽樣的語句?
(3) Y >在原程序的while語句中;=detax,分別用y & gtdetax,y=detax,y & ltdetax,y & lt=detax,觀察程序運行會發生什麽。
如果不知道機器中程序的每條語句實際是什麽,輸入什麽樣的detax來測試while語句的循環條件是錯誤的。
(4)去掉原程序中while語句前的y=1/x語句,觀察程序的運行會發生什麽變化。
如果不知道機器裏的程序實際是怎麽寫的,可以輸入什麽樣的detax來測試上面的語句是否缺失。
(5)如果將原程序中的++i替換為i++,觀察程序的運行發生了哪些變化?
如果不知道這個語句具體是怎麽寫的,可以通過輸入什麽樣的detax來檢驗這個語句是錯的。
(6)將原程序中的while結構改寫成do-while結構,然後分別按照上述步驟(2)和(3)進行實驗。
實驗五循環結構(2)
[目的和要求]
1,掌握如何正確控制計數周期結構的個數。
2.了解測試盤點周期結構的基本方法。
3.了解在嵌套循環結構中提高程序效率的方法。
4.本實驗應在學完教材第三段3.3.4後進行。
[實驗內容和步驟]
實驗題目:下面是壹個循環結構的C程序。
主()
{
int i,j;
long sum = 0;
for(i=1,i & lt=20,i++)
for(j = 1;j & lt=3;j++)
sum = sum+(I+1)*(I+1)*(j+2)
printf("sum is :%d\n ",sum);
}
[分析和討論]
(1)上述程序中的和將分別做哪些改變,使程序能按以下要求運行:
無循環;
外循環1次,不進入內循環;
外循環和內循環各1次;
外循環1次,內循環2次;
外循環兩次,內循環1次;
外循環19次,內循環3次;
外循環20次,內循環2次;
外循環21次,內循環3次。
(2)嘗試修改程序,以便知道控制表達式。
I = 1;j & lt=20;i++
和
j = 1;j & lt3;j+=
每條線妳都握過幾次?
(3)交換內循環和外循環的控制表達式,觀察程序的執行結果有無變化,觀察
切換後外循環和內循環的控制表達式的執行總數有變化嗎?
(4)將(3)中的程序編寫如下
主()
{
int i,j,k;
long sum = 0;
for(j = 1 . j & lt;=3.j++)
{
k = j+2;
for(I = 1;我& lt=20;i++)
sum = sum+(I+1)*(I+1)* * k;
}
printf("sum is :%d\n ",sum);
}
觀察程序的執行結果有變化嗎?
(5)按如下方式重寫(3)中的程序
主()
{
int I,j,m,n;
long sum = 0;
for(j = 1;j & lt=3;j++)
{
m = j+2;
for(I = 1;j & lt=20;I++)
{
n = I+1;
sum = sum+m * m * k;
}
}
printf("sum is :%d\n ",sum);
}
觀察程序的執行結果有變化嗎?
(1)
實驗六函數(1)
[實驗目的]
1.了解並掌握多模塊編程和調試的方法。
2.掌握函數的定義和調用方法。
3.學會用遞歸方法編程。
[實驗內容和步驟]
1.寫壹個判斷壹個數是否是質數的函數。在main函數中輸入壹個整數,輸出是否是質數的信息。
實驗步驟和要求:
(1)寫壹個函數prime(n)返回給定的整數n是否是素數。
(2)寫壹個主函數,輸入壹個整數,調用(1)中的函數,判斷這個整數是否是素數,輸出結果。
(3)對於有多個功能的程序,可以分別編輯編譯每個功能,然後連接運行。如果編譯有錯誤,可以單獨修改,方便調試。實驗二和實驗三也可以使用這種調試方法。
2.用梯形法求函數的定積分。
實驗步驟和要求:
(1)編譯壹個函數sab(a,b,n),它的作用是求函數f(x)在[a,b]上的定積分,其中n是區間[a,b]的等分數。這個函數需要在壹個單獨的文件中。
(2)編譯壹個主函數和壹個計算被積函數值的函數f(x),在主函數中調用(1)中的函數,計算並輸出下面的整數值。要求主函數和函數f(x)在同壹個文件中。
(3)編寫另壹個主函數和函數f(x)用於計算被積函數的值,在主函數中調用(1)中的函數,計算並輸出下面的整數值。要求主函數和函數f(x)在同壹個文件中。
描述:
用梯形法求定積分,梯形公式為
S=h[f(a)+f(b)]/2+hf(a+kh)其中h = (b-a)/n。
3.用遞歸的方法寫壹個程序求n階勒讓德多項式的值,遞歸公式為
1 (n=0)
pn(x)=x (n=1)
((2n-1)xpn-1(x)-(n-1)pn-2(x))/n(n & gt;1)
,
[分析和討論]
1.匯總函數的定義和調用方法。
2.匯總函數中形參和實參的組合規則。
實驗七函數(2)
[目的和要求]
1,掌握C語言函數的定義和調用規則。
2.了解參數傳遞的過程。
[實驗內容和步驟]
1,在電腦上調試以下程序,記錄系統給出的錯誤信息,指出錯誤原因。
主()
{
int,y;
printf("%d\n ",sum(x+y));
int sum(a,b)
{
int a,b;
返回(a+b);
}
}
2.編寫並調試壹個遞歸函數find (n為整數),希望能動態顯示遞歸函數在程序運行時的軌跡。
[分析和討論]
1.根據以上實驗內容寫出相應的參數傳遞過程,並對結果進行分析。
2.討論參數傳遞的幾種形式。
實驗八數組(1)
[實驗目的]
掌握數組和字符串的編程方法。
[實驗內容和步驟]
1知道壹組數據如下:
6,3,42,23,35,71,98,67,56,38
寫程序,按從小到大的順序排列。
該過程如下:
/*EX3-1*/
# include & ltstdio.h & gt
#定義編號10
主()
{
int a[N]={6,3,42,23,35,71,98,67,56,38 };
int i,j,t;
printf("排序前的數組:");
for(I = 0;我& ltn;i++)
printf("%4d ",a[I]);
for(I = 0;我& lt9;i++)
{
for(j = I+1;j & lt10;j++)
{
if(a[I]& gt;a[j])
{
t = a[I];
a[I]= a[j];
a[j]= t;
}
}
}
for(I = 0;我& ltn;i++)
printf("%4d ",a[I]);
返回o;
}
[分析和討論]
1.定義數組中光標的用法和註意事項。
2.什麽情況下下標越界?
實驗九陣列(2)
[目的和要求]
1,掌握數組定義的規則。
2.掌握C語言數組的基本用法。
[實驗內容和步驟]
1.寫壹個程序測試下面的數組定義是否正確。
(1) main()
{
int n;
scanf("%d ",& ampn);
int a[n];
……
}
(2)主要()
{
const int n = 10;
int a[n];
}
③# include & lt;stdio.h & gt
#定義M 10
主()
{
int a[M];
}
(4)主要()
{
int a[2+2 * 4];
}
(5) #include <stdio.h & gt
#定義M 2
#定義N 8
主()
{ int a[M+N];
}
這個實驗能說明什麽?
2.運行下面的C程序。根據運行結果,可以說明什麽?
主( )
{ int num[5]={1,2,3,4,5 };
inti I;
for(I = 0;我& lt=5;i++)
printf("%d ",num[I]);
}
3.運算符&;查找函數scanf中使用的變量的地址。現在我要妳設計壹個程序,返回壹個3 * 5的二維數組中元素的地址,從而解釋二維數組中元素的存儲順序。
4.為冒泡排序程序設計壹個測試用例,並測試它。
[分析和討論]
通過實驗,分析了定義數組和參考數組的區別。
實驗十指針(1)
[目的和要求]
1.熟悉指針的正確用法。
[實驗內容和步驟]
1.指出下列程序錯誤的原因。
主( )
{
int x=10,y=5,*px,* py
px = py
px = & ampx;
py = & ampy;
printf("*px=%d,*py=%d,*px,* py);
}
2.下面的程序能得到上面的運行結果嗎?
主()
{
char *S= "計算機";
char c;
printf("妳要哪種風格\ n ");
printf("大寫(c)或非大寫(u);");
c = getchar();
if(c='c ')
賣出;
否則{
s= "計算機";
賣出期權;
}
}
分析錯誤的原因。
3.設計壹個C程序來測試下列表達式的運算。
(1) y=*px++
(2)y = * +++py
(3) y=(*py)++
(4) y= - *ppx++
[分析和討論]
數組和指針之間的聯系。
實驗十壹指針(2)
[目的和要求]
1,了解指針參數的特殊性。
2.掌握函數、指針和數組的用法。
[實驗內容和步驟]
1.如果想讓指針變量pt1指向A和B中較大的壹個,pt2指向較小的壹個,下面的程序能達到這個目的嗎?
swap(int *p1,int *p2)
{
int * p;
p = p 1;p 1 = p2;p2 = p;
}
主()
{
int a,b;
scanf("%d,%d ",& amp壹,& ampb);
pt 1 = & amp;a;pt2 = & ampb;
如果(a & ltb)swap(pt 1 . pt2);
printf("%d,%d\n ",*pt1,* pt2);
}
在計算機上調試這個程序。如果達不到題目要求,指出原因,進行修改。
2.以下程序。註意復雜的申報報表;
int(* function[4])();
並且記錄每個標記的含義。
主()
{
int fun 1();
int fun 2();
int fun 3();
int fun 4();
int(* function[4])();
int a=10,b=5,I;
函數[0]= fun 1;
函數[1]= fun 2;
函數[2]= fun 3;
函數[3]= fun 4;
for(I = 0;我& lt4;i++)
printf("趣味號% d->;%d\n ",i+1,execute(a,b,function[I]);
}
execute(int x,int y,int *fun())
{
return(*fun)(x,y);}
fun1(int x,int y)
{
return(x+y);}
fun2(int x,int y)
{
返回(x-y);}
fun3(int x,int y)
{
return(x * y);}
fun4(int x,int y)
{
返回(x/y);}
[分析和討論]
指針、數組和函數的關系。
實驗12中相關文件的程序設計
[實驗目的]
1.掌握文檔創建的方法。
2.掌握包括文件操作在內的程序設計和調試方法。
[實驗內容和步驟]
1創建壹個磁盤文件,其內容是0到90之間間隔為5的正弦值。
該過程如下:
//EX8-1
# include & ltiostream.h & gt
# include & ltfstream.h & gt
# include & ltmath.h & gt
#定義PI 3.14159
主()
{
float S[19];
int i,a;
of stream out(" fsin . bny ");
如果(!out)
{
cout & lt& lt"無法打開文件。"& lt& ltendl
返回1;
}
for(i=0,a =-5;我& lt19;i++)
{
a+= 5;
s[I]= sin(a * PI/180.0);
}
out.write((無符號字符*)& amp;s,sizeof s);
out . close();
返回0;
}
[分析和討論]
每個函數在文件操作中的作用,以及具體的使用方法。
實驗13結構和* * *用戶
[目的和要求]
1,掌握結構類型方法以及結構變量的定義和引用。
2.掌握指向結構變量的指針變量的應用,尤其是鏈表的應用。
3.掌握運算符”和“->;“的應用。
4.* * *用戶的概念及應用。
[實驗內容和步驟]
1.編程:有4個學生,每個學生的數據包括學號,姓名,年級。要求找出成績最高的人的姓名和年級,在電腦上運行程序。
2.建立壹個鏈表。每個節點包括以下成員:員工編號和薪金。用malloc打印出來。用creat創建壹個鏈表,用list輸出數據。這五個員工編號分別是101,103,105,107,109。
3.在以上問題的基礎上,添加壹個新員工的數據,按照員工編號的順序插入鏈表。新插入的員工編號是106。編寫壹個函數insert來插入壹個新節點。
4.在上面的基礎上,寫壹個函數delete來刪除壹個節點。需要刪除員工編號為103的節點。打印出刪除的鏈表。
5.構造鏈表時,有沒有辦法測試內存空間的動態分配?
[分析和討論]
如何引用結構變量成員?
實驗性14位操作
[目的和要求]
1.掌握位運算的概念和方法。
2.主機位操作(&;, |, ~).
3.掌握位運算的用法。
[實驗內容和步驟]
1.根據練習8.2的要求,寫壹個程序分別輸出壹個整數的高字節和低字節(按位運算法)。在電腦上運行。
2.根據習題8.6的要求,寫壹個程序翻轉壹個整數的低四位。在計算機上運行,用十六進制數輸入輸出。
3.根據習題8.10的要求,將壹個整數I的每壹位左移4位,設I的值為十六進制數fe13。
4.根據練習8.13的要求,設計壹個函數。給定壹個整數,就可以得到該數的補數(要考慮該整數是正數還是負數)。
[分析和討論]
鉆頭操作要註意哪些問題?
實驗15綜合應用實例
[目的和要求]
1,熟悉C語言的端口和硬件控制的方法和原理。
2.用C語言實現語音程序,了解要訪問的端口。
[實驗內容和步驟]
1.調試教材中示例10.8的程序,註意不同的效果。
2.調試總結程序中用到的知識點,在樂譜文件中寫出演奏的是什麽樂譜。
樂譜示例:
6000 H5 1 H3 2 H2 0.5 H3 0.5 h1 4 H2 1 M7 2 M6 0.5 h1 0.5 M5 4 m3 2 M5 1.5
M6 0.5 h1 1.5 H2 0.5 M6 0.5 h1 0.5 M5 1 H5 1.5 h6 0.5 H5 0.5 H3 0.5
H5 0.5 H2 4 H2 1.5 H3 0.5 M7 1 M6 1 M5 1 M6 0.5h 1 1 H2 1 m3 1h 1 1 M6 0
M5 0.5 M6 0.5h 1 0.5 M5 4 H3 1.5 H5 0.5 M7 1 H2 1 M6 0.5h 1.5 M5 3 m3 0。
M5 0.5 m3 0.5 M5 0.5 M5 0.5 M6 0.5 M7 0.5 H2 0.5 M6 3 M5 0.5 M6 0.5h 1 1.5
H2 0.5 H5 1 H3 1 H2 1 H3 0.5 H2 0.5h 1 1 M6 0.5 M5 0.5 m3 2h 1 2 M6 0.5h 1
0.5 M6 0.5 M5 0.5 m3 0.5 M5 0.5 M6 0.5h 1 0.5 M5 3 H3 0.5 H5 0.5 H2 0.5 H3
0.5 H2 0.5h 1.5 M7 1 M6 1 H5 4 # #
void play _ music(char * filename)/* filename是音樂文件名格式。參見*/
{
FILE * fp
利息率;
char sound _ high[3];
浮音_ long
寄存器int i=0,j;
int sign = 0;
float str[1000][2];
if ((fp=fopen(filename," r))= = NULL)
{
printf("打開文件music.doc錯誤!\ n ");
退出(1);
}
fscanf(fp," %d ",& amp率);
而(!金融衍生工具公司& amp!簽名)
{
fscanf(fp," %s%f ",& amp聲音高& amp聲音_長);
str[I][1]=速率*聲音_ long
開關(sound_high[0])
{
案例“h”:
開關(sound_high[1])
{
案例“1”:
str[i++][0]= 1046.5;
打破;
案例“2”:
str[i++][0]= 1174.7;
打破;
案例“3”:
str[i++][0]= 1318.5;
打破;
案例“4”:
str[i++][0]= 1396.9;
打破;
案例“5”:
str[i++][0]= 1568;
打破;
案例“6”:
str[i++][0]= 1760;
打破;
案例“7”:
str[i++][0]= 1975.5;
打破;
默認值:printf(" \ n Error music . doc \ n ");
打破;
}
打破;
案例“m”:
開關(sound_high[1])
{
案例“1”:
str[i++][0]= 523.3;
打破;
案例“2”:
str[i++][0]= 587.3;
打破;
案例“3”:
str[i++][0]= 659.3;
打破;
案例“4”:
str[i++][0]= 698.5;
打破;
案例“5”:
str[i++][0]= 784.0;
打破;
案例“6”:
str[i++][0]= 880;
打破;
案例“7”:
str[i++][0]= 987.8;
打破;
默認值:printf(" \ n Error music . doc . " \ n ");
打破;
}
打破;
案例“l”:
開關(sound_high[1])
{
案例“1”:
str[i++][0]= 262;
打破;
案例“2”:
str[i++][0]= 296;
打破;
案例“3”:
str[i++][0]= 329.6;
打破;
案例“4”:
str[i++][0]= 349.2;
打破;
案例“5”:
str[i++][0]= 392;
打破;
案例“6”:
str[i++][0]= 440;
打破;
案例“7”:
str[i++][0]= 493.9;
打破;
默認值:printf(" \ n Error music . doc . " \ n ");
打破;
}
打破;
大小寫' * ':
開關(sound_high[1])
{
案例“1”:
str[i++][0]= 131;
打破;
案例“2”:
str[i++][0]= 147;
打破;
案例“3”:
str[i++][0]= 165;
打破;
案例“4”:
str[i++][0]= 176;
打破;
案例“5”:
str[i++][0]= 196;
打破;
案例“6”:
str[i++][0]= 220;
打破;
案例“7”:
str[i++][0]= 247;
打破;
默認值:printf(" \ n Error music . doc \ n ");
打破;
}
打破;
案例' # ':
if(sound _ high[1]= = ' # ')sign = 1;
打破;
案例“x”:
if(sound _ high[1]= = ' 0 ')str[i++][0]= 20;
打破;
默認值:printf(" \ n ERRor music . doc \ n ");
退出(1);
}
}
for(j = 0;j & lt= I-1;j++)
{
sound(str[j][0]);
delay(str[j][1]);
}
nosound();
}
[分析和討論]
如何用1.c語言管理數據庫?
2.分析如何在編程過程中靈活運用基礎知識。