實(shí)驗(yàn)一 C語(yǔ)言程序初步
創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的敖漢網(wǎng)站建設(shè)公司,敖漢接單;提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行敖漢網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
[實(shí)驗(yàn)?zāi)康暮鸵骫
1、 熟悉C語(yǔ)言運(yùn)行環(huán)境。
2、 掌握C語(yǔ)言程序的書(shū)寫(xiě)格式和C語(yǔ)言程序的結(jié)構(gòu)。
3、 掌握C語(yǔ)言上機(jī)步驟,了解運(yùn)行一個(gè)C程序的方法。
4、 本實(shí)驗(yàn)可在學(xué)習(xí)完教材第一章后進(jìn)行。
[實(shí)驗(yàn)內(nèi)容和步驟]
1、輸入一個(gè)簡(jiǎn)單的C語(yǔ)言程序:輸入矩形的兩條邊,求矩形的面積。
[分析與討論]
1、記下在調(diào)試過(guò)程中所發(fā)現(xiàn)的錯(cuò)誤、系統(tǒng)給出的出錯(cuò)信息和對(duì)策。分析討論對(duì)策成功或失敗的原因。
2、總結(jié)C程序的結(jié)構(gòu)和書(shū)寫(xiě)規(guī)則。
實(shí)驗(yàn)二 數(shù)據(jù)類(lèi)型、運(yùn)算符和表達(dá)式
[實(shí)驗(yàn)?zāi)康腯
1.熟練表達(dá)式的表示方法
2.了解表達(dá)式的運(yùn)行結(jié)果
3.了解C語(yǔ)言中數(shù)據(jù)類(lèi)型的意義
[實(shí)驗(yàn)內(nèi)容和步驟]
1. 用printf函數(shù)來(lái)輸入表達(dá)式運(yùn)行結(jié)果
2. 程序試圖計(jì)算由鍵盤(pán)輸入的任意兩個(gè)整數(shù)的平均值:
[問(wèn)題討論]
1.“=”和“==”有什么區(qū)別?
2.“”和“”、“|”和“||”有什么區(qū)別?
3. 如何正確地選用數(shù)據(jù)類(lèi)型?
實(shí)驗(yàn)三 選擇結(jié)構(gòu)
[實(shí)驗(yàn)?zāi)康腯
1、了解條件與程序流程的關(guān)系
2、了解用不同的數(shù)據(jù)使程序的流程覆蓋不同的語(yǔ)句、分支和路徑。
[實(shí)驗(yàn)內(nèi)容和步驟]
1、題目
有如下程序段:
{……
if (a1b= =0) x=x/a;
if(a==2||x1) x=x+1;
}
為了更容易明白程序的邏輯結(jié)構(gòu),要求用流程圖來(lái)加以描述。
要求增加一些輸入語(yǔ)句和輸出語(yǔ)句,以便使上述程序能在不同的a,b和x值下運(yùn)行,并且能觀察程序流程經(jīng)過(guò)(覆蓋)了哪些語(yǔ)句、哪些分支及哪些路徑。
[分析討論]
(1) 用哪一組數(shù)據(jù)就可使程序中的每個(gè)處理語(yǔ)句都執(zhí)行一次?為了找出程序中各條處理語(yǔ)句中的錯(cuò)誤,應(yīng)該使用什么樣的數(shù)據(jù)對(duì)程序進(jìn)行測(cè)試?請(qǐng)上機(jī)驗(yàn)證自己的結(jié)論。
(2) 用哪兩組數(shù)據(jù)就可以使程序段中的每個(gè)分支都運(yùn)行一次?這種情形與上面的討論有何不同?如果為了找出程序中積壓分支中的錯(cuò)誤,應(yīng)該使用什么樣的數(shù)據(jù)對(duì)程序進(jìn)行測(cè)試?請(qǐng)上機(jī)驗(yàn)證自己的結(jié)論。
(3)用哪兩組數(shù)據(jù)就可以把判定框中的每個(gè)條件運(yùn)算都進(jìn)行一次?如果為了測(cè)試出判定條件中的錯(cuò)誤,應(yīng)使用哪些數(shù)據(jù)對(duì)程序進(jìn)行測(cè)試?請(qǐng)上機(jī)驗(yàn)證自己的結(jié)論。
(4)用哪四組數(shù)據(jù)才可以把各種條件的組合都檢測(cè)一遍? 如果為了測(cè)試各種條件的組合的情形,應(yīng)該使用什么樣的測(cè)試數(shù)據(jù)?請(qǐng)上機(jī)驗(yàn)證自己的結(jié)論。
(5)用哪四組數(shù)據(jù)才可以把起始到終止的各條路徑都覆蓋一次?如果為了測(cè)試出程序在不同路徑下的錯(cuò)誤,應(yīng)該使用什么樣的測(cè)試數(shù)據(jù)?請(qǐng)上機(jī)驗(yàn)證自己的結(jié)論。
實(shí)驗(yàn)四 循環(huán)結(jié)構(gòu)(1)
[目的和要求]
1、掌握在程序設(shè)計(jì)條件型循環(huán)結(jié)構(gòu)時(shí),如何正確地設(shè)定循環(huán)條件,以及如何控制循環(huán)的次數(shù)。
2、了解條件型循環(huán)結(jié)構(gòu)的基本測(cè)試方法。
[實(shí)驗(yàn)內(nèi)容與步驟]
1、下面是一個(gè)計(jì)算e的近似值(使誤差小于給定的δ)的程序。
main()
{double e=1.0,x=1.0,y,detax;
int i=1;
printf(“\n please input enter a error:”);
scanf(“%lf”,detax);
y=1/x;
while(y=detax)
{
x=x*I;
y=1/x;
e=e+y;
++i;
}
printf(“%12.10lf”,e);
}
[分析討論]
(1)、閱讀上面的程序,寫(xiě)出程序所依據(jù)的計(jì)算公式。
(2)、當(dāng)輸入的detax各是什么值時(shí),能分別使程序按下面的要求運(yùn)行:
.不進(jìn)入循環(huán);
.只循環(huán)一次;
.只循環(huán)兩次;
.進(jìn)入死循環(huán)(程序?qū)⒂肋h(yuǎn)循環(huán)下去)。
為了能知道程序循環(huán)了多少次,應(yīng)該在程序中增加一條什么樣的語(yǔ)句?
(3)、原程序中while語(yǔ)句中的y=detax,分別換成ydetax,y=detax,ydetax,y=detax,觀察程序運(yùn)行將會(huì)有什么變化。
假如不知道機(jī)器內(nèi)的程序中的各語(yǔ)句實(shí)際上是什么,分別輸入什么樣的detax來(lái)測(cè)試出while語(yǔ)句的循環(huán)條件寫(xiě)錯(cuò)了。
(4)、把原程序中while語(yǔ)句之前的y=1/x語(yǔ)句去掉,觀察程序的運(yùn)行將會(huì)發(fā)生什么樣的變化。
假如不知道機(jī)器內(nèi)的程序?qū)嶋H上是怎么寫(xiě)的,輸入什么樣的detax就能測(cè)試出少了上述這條語(yǔ)句。
(5)、若把原程序中的++i換成i++,觀察程序的運(yùn)行發(fā)生了什么變化?
假如不知道這條語(yǔ)句到底是怎么寫(xiě)的,輸入什么樣的detax就能測(cè)試出這條語(yǔ)句寫(xiě)錯(cuò)了.
(6)、把原程序中的while結(jié)構(gòu)改寫(xiě)成do—while結(jié)構(gòu),再分別按上述的(2)、(3)兩步進(jìn)行實(shí)驗(yàn)。
實(shí)驗(yàn)五 循環(huán)結(jié)構(gòu)(2)
[ 目的和要求]
1、 掌握如何正確地控制計(jì)數(shù)型循環(huán)結(jié)構(gòu)的次數(shù)
2、 了解對(duì)計(jì)數(shù)型循環(huán)結(jié)構(gòu)進(jìn)行測(cè)試的基本方法
3、 了解在嵌套循環(huán)結(jié)構(gòu)中,提高程序效率的方法
4、 本實(shí)驗(yàn)應(yīng)在學(xué)習(xí)了教材第3.3.4進(jìn)行
[實(shí)驗(yàn)內(nèi)容與步驟]
實(shí)驗(yàn)題目:下面是一個(gè)循環(huán)結(jié)構(gòu) 的C程序。
main()
{
int i ,j;
long sum=0;
for(i=1,i=20,i++)
for(j=1;j=3;j++)
sum=sum+(i+1)*(i+1)*(j+2)
printf(“sum is :%d\n”,sum);
}
[ 分析討論]
(1) 將上述程序中的和分別做什么樣修改,能使程序按如下要求運(yùn)行:
.不循環(huán);
.外循環(huán)1次,不進(jìn)入內(nèi)循環(huán);
.外循環(huán),內(nèi)循環(huán)各1次;
.外循環(huán)1次,內(nèi)循環(huán)2次;
.外循環(huán) 2次, 內(nèi)循環(huán)1次;
.外循環(huán)19次,內(nèi)循環(huán)3次;
.外循環(huán)20次,內(nèi)循環(huán)2次;
.外循環(huán)21次,內(nèi)循環(huán)3次。
(2) 試修改程序,以便能知道控制表達(dá)式
i=1;j=20;i++
和
j=1;j3;j+=
各執(zhí)行了多少次?
(3)內(nèi)循環(huán)與外循環(huán)的控制表達(dá)式進(jìn)行對(duì)換,觀察程序的執(zhí)行結(jié)果有無(wú)變化,并且觀
察對(duì)換后的外循環(huán)與內(nèi)循環(huán)控制表達(dá)式執(zhí)行的總次數(shù)有無(wú)變化?
(4)將(3)中程序?qū)憺?/p>
main()
{
int i,j,k;
long sum=0;
for (j=1.j=3.j++)
{
k=j+2;
for(i=1;i=20;i++)
sum=sum+(i+1)*(i+1)**k;
}
printf(“sum is :%d\n”,sum);
}
觀察程序的執(zhí)行結(jié)果有無(wú)變化?
(5)將(3)中程序改寫(xiě)為
main()
{
int I,j,m,n;
long sum=0;
for(j=1;j=3;j++)
{
m=j+2;
for(I=1;j=20;I++)
{
n=I+1;
sum=sum+m*m*k;
}
}
printf(“sum is :%d\n”,sum);
}
觀察程序的執(zhí)行結(jié)果有無(wú)變化?
(1)
實(shí)驗(yàn)六 函數(shù)(1)
[實(shí)驗(yàn)?zāi)康腯
1.理解和掌握多模塊的程序設(shè)計(jì)與調(diào)試的方法。
2.掌握函數(shù)的定義和調(diào)用的方法。
3.學(xué)會(huì)使用遞歸方法進(jìn)行程序設(shè)計(jì)。
[實(shí)驗(yàn)內(nèi)容和步驟]
1. 編寫(xiě)一個(gè)函數(shù),判斷一個(gè)數(shù)是不是素?cái)?shù)。在主函數(shù)中輸入一個(gè)整數(shù),輸出是否是素?cái)?shù)的信息。
實(shí)驗(yàn)步驟與要求:
(1) 編寫(xiě)一個(gè)函數(shù)prime(n),返回給定整數(shù)n是否為素?cái)?shù)。
(2) 編寫(xiě)一個(gè)主函數(shù),輸入一個(gè)整數(shù),調(diào)用(1)中的函數(shù),判斷此整數(shù)是否為素?cái)?shù),并輸出結(jié)果。
(3) 對(duì)于屬于多函數(shù)程序,可以采用每個(gè)函數(shù)分別進(jìn)行編輯、編譯的方法,然后再連接、運(yùn)行。如果編譯有錯(cuò)時(shí),可分別修改,這樣便于調(diào)試。實(shí)驗(yàn)2和實(shí)驗(yàn)3也可以使用這樣的調(diào)試方法。
2. 用梯形法求函數(shù)的定積分。
實(shí)驗(yàn)步驟與要求:
(1) 編制一個(gè)函數(shù)sab(a,b,n),其功能是求函數(shù)f(x)在[a,b]上的定積分,其中n為區(qū)間[a,b]的等分?jǐn)?shù)。要求該函數(shù)在一個(gè)獨(dú)立的文件中。
(2) 編制一個(gè)主函數(shù)以及計(jì)算被積函數(shù)值的函數(shù)f(x),在主函數(shù)中調(diào)用(1)中的函數(shù)計(jì)算并輸出下列積分值。要求主函數(shù)與函數(shù)f(x)在同一個(gè)文件中。
(3) 編制另一個(gè)主函數(shù)以及計(jì)算被積函數(shù)值的函數(shù)f(x),在主函數(shù)中調(diào)用(1)中的函數(shù)計(jì)算并輸出下列積分值。要求主函數(shù)與函數(shù)f(x)在同一個(gè)文件中。
說(shuō)明:
用梯形法求定積分,梯形公式為
s=h[f(a)+f(b)]/2+hf(a+kh)其中,h=(b-a)/n
3. 用遞歸方法編寫(xiě)程序,求n階勒讓德多項(xiàng)式的值,遞歸公式為
1 (n=0)
pn(x)=x (n=1)
((2n-1)xpn-1(x)-(n-1)pn-2(x))/n (n1)
,
[ 分析討論]
1. 小結(jié)函數(shù)的定義及調(diào)用方法。
2. 小結(jié)函數(shù)中形參和實(shí)參的結(jié)合規(guī)則。
實(shí)驗(yàn)七 函數(shù)(2)
[目的與要求]
1、 掌握C語(yǔ)言函數(shù)定義及調(diào)用的規(guī)則。
2、 理解參數(shù)傳遞的過(guò)程。
[ 實(shí)驗(yàn)內(nèi)容與步驟]
1、 上機(jī)調(diào)試下面的程序,記錄系統(tǒng)給出的出錯(cuò)信息,并指出出錯(cuò)原因。
main()
{
int,y;
printf(“%d\n”,sum(x+y));
int sum(a,b)
{
int a,b;
return(a+b);
}
}
2、 編寫(xiě)并調(diào)試一個(gè)求(n為整數(shù))的遞歸函數(shù),希望能在程序運(yùn)行過(guò)程中動(dòng)態(tài)地顯示遞歸函數(shù)被調(diào)用的軌跡。
[分析討論]
1、 針對(duì)以上實(shí)驗(yàn)內(nèi)容寫(xiě)出相應(yīng)的參數(shù)傳遞過(guò)程并分析結(jié)果。
2、 討論參數(shù)的傳遞的幾種形式。
實(shí)驗(yàn)八 數(shù)組(1)
[實(shí)驗(yàn)?zāi)康腯
掌握有關(guān)數(shù)組和字符串的程序設(shè)計(jì)方法。
[實(shí)驗(yàn)內(nèi)容和步驟]
1 已知一組數(shù)據(jù)如下:
6,3,42,23,35,71,98,67,56,38
編寫(xiě)程序,把它們按從小到大的次序排列起來(lái)。
程序如下:
/*EX3-1*/
# includestdio.h
# define N 10
main()
{
int a[N]={6, 3, 42, 23, 35, 71, 98, 67, 56, 38};
int i, j, t;
printf(“The array before sorted:”);
for(i=0; iN; i++)
printf(“%4d”, a[i]);
for(i=0; i9; i++)
{
for(j=i+1; j10; j++)
{
if(a[i]a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0; iN; i++)
printf(“%4d”, a[i]);
return o;
}
[ 分析討論]
1. 定義數(shù)組時(shí)下標(biāo)的用法和注意事項(xiàng).
2.什么情況下出現(xiàn)下標(biāo)越界.
實(shí)驗(yàn)九 數(shù)組(2)
[目的和要求]
1、掌握數(shù)組定義的規(guī)則。
2、掌握C語(yǔ)言數(shù)組的基本用法。
[實(shí)驗(yàn)內(nèi)容與步驟]
1、編寫(xiě)程序,測(cè)試下列數(shù)組的定義方式是否正確
(1) main()
{
int n;
scanf(“%d”,n);
int a[n];
……
}
(2) main()
{
const int n=10;
int a[n];
}
(3) #include stdio.h
#define M 10
main()
{
int a[M];
}
(4) main()
{
int a[2+2*4];
}
(5) #include stdio.h
#define M 2
#define N 8
main()
{ int a[M+N];
}
通過(guò)這一實(shí)驗(yàn),可以說(shuō)明什么問(wèn)題?
2、運(yùn)行下面的C程序,根據(jù)運(yùn)行結(jié)果,可以說(shuō)明什么?
main( )
{ int num[5]={1,2,3,4,5};
inti i;
for(i=0;i=5;i++)
printf(“%d”,num[i]);
}
3、操作符用以求一個(gè)變量的地址,這在函數(shù)scanf中已經(jīng)使用過(guò)了?,F(xiàn)在要你設(shè)計(jì)一個(gè)程序,返回一個(gè)3 * 5 的二維數(shù)組各元素的地址,并由此說(shuō)明二維數(shù)組中各元素是按什么順序存諸的。
4、為一個(gè)起泡排序程序設(shè)計(jì)測(cè)試用例,并測(cè)試之。
[分析討論]
通過(guò)實(shí)驗(yàn),分析定義與引用數(shù)組的區(qū)別。
實(shí)驗(yàn)十 指 針 (1)
[目的和要求]
1. 熟悉指針的正確用法。
[實(shí)驗(yàn)內(nèi)容和步驟]
1、指出下面程序錯(cuò)誤的原因。
main( )
{
int x=10,y=5,*px,*py;
px=py;
px=x;
py=y;
printf(“*px=%d,*py=%d,*px,*py);
}
2.下面的程序能獲得上述運(yùn)行結(jié)果嗎?
main()
{
char *S=”COMPUTER”;
char c;
printf(“which style you want to \n”);
printf(“capital (c) or uncapital(u);”);
c=getchar();
if(c=’c’)
put(s);
else {
s=”computer”;
puts(s);
}
}
分析出錯(cuò)原因。
3.設(shè)計(jì)一個(gè)C程序,用以測(cè)試下列各表達(dá)式的運(yùn)算。
(1) y=*px++
(2) y=*++py
(3) y=(*py)++
(4) y=--*ppx++
[分析討論]
數(shù)組與指針的聯(lián)系。
實(shí)驗(yàn)十一 指針(二)
[目的和要求]
1、了解指針參數(shù)的特殊性。
2、掌握函數(shù)、指針、數(shù)組的用法。
[實(shí)驗(yàn)內(nèi)容與步驟]
1、想使指針變量pt1指向a 和b 中的大者,pt2指向小者,以下程序能否實(shí)現(xiàn)此目的?
swap(int *p1,int *p2)
{
int *p;
p=p1;p1=p2;p2=p;
}
main()
{
int a,b;
scanf(“%d,%d”,a,b);
pt1=a;pt2=b;
if(ab)swap(pt1.pt2);
printf(“%d,%d\n”,*pt1,*pt2);
}
上機(jī)調(diào)試此程序。如果不能實(shí)現(xiàn)題目要求,指出原因,并修改之。
2、 下面的程序。注意其中的復(fù)雜聲明語(yǔ)句;
int (*function[4])();
和各標(biāo)記符的含義,并記錄執(zhí)行結(jié)果。
main()
{
int fun1();
int fun2();
int fun3();
int fun4();
int (*function[4])();
int a=10,b=5,i;
function[0]=fun1;
function[1]=fun2;
function[2]=fun3;
function[3]=fun4;
for(I=0;I4;i++)
printf(“fun no.%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)
{
return(x-y);}
fun3(int x,int y)
{
return(x*y);}
fun4(int x,int y)
{
return(x/y);}
[分析討論]
指針、數(shù)組、函數(shù)的聯(lián)系。
實(shí)驗(yàn)十二 有關(guān)文件的程序設(shè)計(jì)
[實(shí)驗(yàn)?zāi)康腯
1. 掌握文件建立的方法。
2. 掌握包含文件操作的程序設(shè)計(jì)和調(diào)試方法。
[實(shí)驗(yàn)內(nèi)容和步驟 ]
1 建立一個(gè)磁盤(pán)文件,其內(nèi)容是0~90°之間每隔5°的正弦值。
程序如下:
//EX8-1
#includeiostream.h
#includefstream.h
#includemath.h
#define PI 3.14159
main()
{
float S[19];
int i, a;
ofstream out(“fsin.bny”);
if(!out)
{
cout”Cannot open file.”endl;
return 1;
}
for(i=0,a=-5; i19; i++)
{
a+=5;
S[i]=sin(a*PI/180.0);
}
out.write((unsigned char*)s, sizeof s);
out.close( );
return 0;
}
[ 分析討論]
文件操作中各函數(shù)的功能,具體使用方法.
實(shí)驗(yàn)十三 結(jié)構(gòu)體和共用體
[目的和要求]
1、掌握結(jié)構(gòu)體類(lèi)型方法以及結(jié)構(gòu)體變量的定義和引用。
2、掌握指向結(jié)構(gòu)體變量的指針變量的應(yīng)用,特別是鏈表的應(yīng)用。
3、掌握運(yùn)算符”.”和”-”的應(yīng)用。
4、共用體的概念和應(yīng)用。
[實(shí)驗(yàn)內(nèi)容和步驟]
1、編寫(xiě)程序:有4名學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名、成績(jī),要求找出成績(jī)最高者的姓名和成績(jī),上機(jī)運(yùn)行程序。
2、建立一個(gè)鏈表每個(gè)結(jié)點(diǎn)包括的成員為:職工號(hào)、工資。用malloc打印出來(lái)。用一個(gè)creat 來(lái)建立鏈表,用list來(lái)輸出數(shù)據(jù)。5個(gè)職工號(hào)為101,103,105,107,109。
3、在上題基礎(chǔ)上,新增加一個(gè)職工的數(shù)據(jù),按職工號(hào)的順序插入鏈表,新插入的職工號(hào)為106。寫(xiě)一函數(shù)insert來(lái)插入新結(jié)點(diǎn)。
4、在上面的基礎(chǔ)上,寫(xiě)一函數(shù)delete,用來(lái)刪除一個(gè)結(jié)點(diǎn)。要求刪除職工號(hào)為103的結(jié)點(diǎn)。打印出刪除后的鏈表.
5、你有無(wú)辦法測(cè)試構(gòu)造鏈表時(shí),內(nèi)存空間的動(dòng)態(tài)分配情形?
[分析討論]
怎樣引用結(jié)構(gòu)體變量成員?
實(shí)驗(yàn)十四 位運(yùn)算
[目的和要求]
1. 掌握位運(yùn)算的概念和方法。
2. 掌握位運(yùn)算(,|,^,~)的使用方法。
3. 掌握有關(guān)位運(yùn)算的用法。
[實(shí)驗(yàn)內(nèi)容和步驟]
1. 按習(xí)題8.2的要求,編一個(gè)程序,將一個(gè)整數(shù)的高字節(jié)和低字節(jié)分別輸出(用位運(yùn)算方法)。上機(jī)運(yùn)行。
2. 按習(xí)題8.6的要求,編一個(gè)程序,使一個(gè)整數(shù)的低4位翻轉(zhuǎn)。上機(jī)運(yùn)行,用十六進(jìn)制數(shù)輸入和輸出。
3. 按習(xí)題8.10的要求,將一個(gè)整數(shù)i的各位循環(huán)左移4位,設(shè)i的值為十六進(jìn)制數(shù)fe13。
4. 按習(xí)題8.13的要求,設(shè)計(jì)一個(gè)函數(shù),當(dāng)給定一個(gè)整數(shù)后,能得到該數(shù)的補(bǔ)碼(應(yīng)考慮該整數(shù)是正數(shù)或負(fù)數(shù))。
[分析討論]
位運(yùn)算時(shí)應(yīng)注意什么問(wèn)題?
實(shí)驗(yàn)十五 綜合應(yīng)用舉例
[目的與要求]
1、熟悉C語(yǔ)言的端口及硬件控制的方法與原理。
2、了解用C語(yǔ)言實(shí)現(xiàn)發(fā)聲程序所要訪問(wèn)的端口。
[實(shí)驗(yàn)內(nèi)容和步驟]
1、調(diào)試課本中例10.8程序,注意調(diào)出不同的效果。
2、調(diào)試并總結(jié)程序中所用的知識(shí)點(diǎn),寫(xiě)出樂(lè)譜文件播放的是什么樂(lè)譜?
樂(lè)譜實(shí)例:
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 h1 0.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.5 m6 0.5 h1 1 h2 1 m3 1 h1 1 m6 0
m5 0.5 m6 0.5 h1 0.5 m5 4 h3 1.5 h5 0.5 m7 1 h2 1 m6 0.5 h1 0.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.5 h1 1.5
h2 0.5 h5 1 h3 1 h2 1 h3 0.5 h2 0.5 h1 1 m6 0.5 m5 0.5 m3 2 h1 2 m6 0.5 h1
0.5 m6 0.5 m5 0.5 m3 0.5 m5 0.5 m6 0.5 h1 0.5 m5 3 h3 0.5 h5 0.5 h2 0.5 h3
0.5 h2 0.5 h1 0.5 m7 1 m6 1 h5 4##
void play_music(char *filename) /*filename為音樂(lè)文件名格式見(jiàn)上*/
{
FILE *fp;
int rate;
char sound_high[3];
float sound_long;
register int i=0,j;
int sign=0;
float str[1000][2];
if ((fp=fopen(filename,"r"))==NULL)
{
printf("Open file music.doc Errors!\n");
exit(1);
}
fscanf(fp,"%d",rate);
while(!feof(fp)!sign)
{
fscanf(fp,"%s%f",sound_high,sound_long);
str[i][1]=rate*sound_long;
switch(sound_high[0])
{
case 'h':
switch(sound_high[1])
{
case '1':
str[i++][0]=1046.5;
break;
case '2':
str[i++][0]=1174.7;
break;
case '3':
str[i++][0]=1318.5;
break;
case '4':
str[i++][0]=1396.9;
break;
case '5':
str[i++][0]=1568;
break;
case '6':
str[i++][0]=1760;
break;
case '7':
str[i++][0]=1975.5;
break;
default: printf("\n Error Music.doc\n");
break;
}
break;
case 'm':
switch(sound_high[1])
{
case '1':
str[i++][0]=523.3;
break;
case '2':
str[i++][0]=587.3;
break;
case '3':
str[i++][0]=659.3;
break;
case '4':
str[i++][0]=698.5;
break;
case '5':
str[i++][0]=784.0;
break;
case '6':
str[i++][0]=880;
break;
case '7':
str[i++][0]=987.8;
break;
default: printf("\n Error music.doc.\n");
break;
}
break;
case 'l':
switch(sound_high[1])
{
case '1':
str[i++][0]=262;
break;
case '2':
str[i++][0]=296;
break;
case '3':
str[i++][0]=329.6;
break;
case '4':
str[i++][0]=349.2;
break;
case '5':
str[i++][0]=392;
break;
case '6':
str[i++][0]=440;
break;
case '7':
str[i++][0]=493.9;
break;
default: printf("\n Error music.doc.\n");
break;
}
break;
case '*':
switch(sound_high[1])
{
case '1':
str[i++][0]=131;
break;
case '2':
str[i++][0]=147;
break;
case '3':
str[i++][0]=165;
break;
case '4':
str[i++][0]=176;
break;
case '5':
str[i++][0]=196;
break;
case '6':
str[i++][0]=220;
break;
case '7':
str[i++][0]=247;
break;
default: printf("\n Error music.doc\n");
break;
}
break;
case '#':
if (sound_high[1]=='#') sign=1;
break;
case 'x':
if (sound_high[1]=='0') str[i++][0]=20;
break;
default:printf("\n ERRor music.doc\n");
exit(1);
}
}
for(j=0;j=i-1;j++)
{
sound(str[j][0]);
delay(str[j][1]);
}
nosound();
}
[分析討論]
1.c語(yǔ)言怎樣對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理?
2.分析程序設(shè)計(jì)過(guò)程中怎樣對(duì)基礎(chǔ)知識(shí)進(jìn)行靈活運(yùn)用。
extern int x,y; 說(shuō)明x,y為外部整型變量
下面分別介紹以上四種存儲(chǔ)類(lèi)型:
一、自動(dòng)變量的類(lèi)型說(shuō)明符為auto。
這種存儲(chǔ)類(lèi)型是C語(yǔ)言程序中使用最廣泛的一種類(lèi)型。C語(yǔ)言規(guī)定, 函數(shù)內(nèi)凡未加存儲(chǔ)類(lèi)型說(shuō)明的變量均視為自動(dòng)變量, 也就是說(shuō)自動(dòng)變量可省去說(shuō)明符auto。 在前面各章的程序中所定義的變量凡未加存儲(chǔ)類(lèi)型說(shuō)明符的都是自動(dòng)變量。例如:
{ int i,j,k;
char c;
……
}等價(jià)于: { auto int i,j,k;
auto char c;
……
}
自動(dòng)變量具有以下特點(diǎn):
1. 自動(dòng)變量的作用域僅限于定義該變量的個(gè)體內(nèi)。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效。在復(fù)合語(yǔ)句中定義的自動(dòng)變量只在該復(fù)合語(yǔ)句中有效。 例如:
int kv(int a)
{
auto int x,y;
{ auto char c;
} /*c的作用域*/
……
} /*a,x,y的作用域*/
2. 自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式,只有在使用它,即定義該變量的函數(shù)被調(diào)用時(shí)才給它分配存儲(chǔ)單元,開(kāi)始它的生存期。函數(shù)調(diào)用結(jié)束,釋放存儲(chǔ)單元,結(jié)束生存期。因此函數(shù)調(diào)用結(jié)束之后,自動(dòng)變量的值不能保留。在復(fù)合語(yǔ)句中定義的自動(dòng)變量,在退出復(fù)合語(yǔ)句后也不能再使用,否則將引起錯(cuò)誤。例如以下程序:
main()
{ auto int a,s,p;
printf("\ninput a number:\n");
scanf("%d",a);
if(a0){
s=a+a;
p=a*a;
}
printf("s=%d p=%d\n",s,p);
}
{ auto int a;
printf("\ninput a number:\n");
scanf("%d",a);
if(a0){
auto int s,p;
s=a+a;
p=a*a;
}
printf("s=%d p=%d\n",s,p);
}
s,p是在復(fù)合語(yǔ)句內(nèi)定義的自動(dòng)變量,只能在該復(fù)合語(yǔ)句內(nèi)有效。而程序的第9行卻是退出復(fù)合語(yǔ)句之后用printf語(yǔ)句輸出s,p的值,這顯然會(huì)引起錯(cuò)誤。
3. 由于自動(dòng)變量的作用域和生存期都局限于定義它的個(gè)體內(nèi)( 函數(shù)或復(fù)合語(yǔ)句內(nèi)), 因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。 即使在函數(shù)內(nèi)定義的自動(dòng)變量也可與該函數(shù)內(nèi)部的復(fù)合語(yǔ)句中定義的自動(dòng)變量同名。例5.14表明了這種情況。
[例5.14]
main()
{
auto int a,s=100,p=100;
printf("\ninput a number:\n");
scanf("%d",a);
if(a0)
{
auto int s,p;
s=a+a;
p=a*a;
printf("s=%d p=%d\n",s,p);
}
printf("s=%d p=%d\n",s,p);
}
本程序在main函數(shù)中和復(fù)合語(yǔ)句內(nèi)兩次定義了變量s,p為自動(dòng)變量。按照C語(yǔ)言的規(guī)定,在復(fù)合語(yǔ)句內(nèi),應(yīng)由復(fù)合語(yǔ)句中定義的s,p起作用,故s的值應(yīng)為a+ a,p的值為a*a。退出復(fù)合語(yǔ)句后的s,p 應(yīng)為main所定義的s,p,其值在初始化時(shí)給定,均為100。從輸出結(jié)果可以分析出兩個(gè)s和兩個(gè)p雖變量名相同, 但卻是兩個(gè)不同的變量。
4. 對(duì)構(gòu)造類(lèi)型的自動(dòng)變量如數(shù)組等,不可作初始化賦值。
二、外部變量外部變量的類(lèi)型說(shuō)明符為extern。
在前面介紹全局變量時(shí)已介紹過(guò)外部變量。這里再補(bǔ)充說(shuō)明外部變量的幾個(gè)特點(diǎn):
1. 外部變量和全局變量是對(duì)同一類(lèi)變量的兩種不同角度的提法。全局變是是從它的作用域提出的,外部變量從它的存儲(chǔ)方式提出的,表示了它的生存期。
2. 當(dāng)一個(gè)源程序由若干個(gè)源文件組成時(shí), 在一個(gè)源文件中定義的外部變量在其它的源文件中也有效。例如有一個(gè)源程序由源文件F1.C和F2.C組成: F1.C
int a,b; /*外部變量定義*/
char c; /*外部變量定義*/
main()
{
……
}
F2.C
extern int a,b; /*外部變量說(shuō)明*/
extern char c; /*外部變量說(shuō)明*/
func (int x,y)
{
……
}
在F1.C和F2.C兩個(gè)文件中都要使用a,b,c三個(gè)變量。在F1.C文件中把a(bǔ),b,c都定義為外部變量。在F2.C文件中用extern把三個(gè)變量說(shuō)明為外部變量,表示這些變量已在其它文件中定義,并把這些變量的類(lèi)型和變量名,編譯系統(tǒng)不再為它們分配內(nèi)存空間。 對(duì)構(gòu)造類(lèi)型的外部變量, 如數(shù)組等可以在說(shuō)明時(shí)作初始化賦值,若不賦初值,則系統(tǒng)自動(dòng)定義它們的初值為0。
三、靜態(tài)變量
靜態(tài)變量的類(lèi)型說(shuō)明符是static。 靜態(tài)變量當(dāng)然是屬于靜態(tài)存儲(chǔ)方式,但是屬于靜態(tài)存儲(chǔ)方式的量不一定就是靜態(tài)變量, 例如外部變量雖屬于靜態(tài)存儲(chǔ)方式,但不一定是靜態(tài)變量,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱(chēng)靜態(tài)全局變量。 對(duì)于自動(dòng)變量,前面已經(jīng)介紹它屬于動(dòng)態(tài)存儲(chǔ)方式。 但是也可以用static定義它為靜態(tài)自動(dòng)變量,或稱(chēng)靜態(tài)局部變量,從而成為靜態(tài)存儲(chǔ)方式。
由此看來(lái), 一個(gè)變量可由static進(jìn)行再說(shuō)明,并改變其原有的存儲(chǔ)方式。
1. 靜態(tài)局部變量
在局部變量的說(shuō)明前再加上static說(shuō)明符就構(gòu)成靜態(tài)局部變量。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)方式,它具有以下特點(diǎn):
(1)靜態(tài)局部變量在函數(shù)內(nèi)定義,但不象自動(dòng)變量那樣,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失。靜態(tài)局部變量始終存在著,也就是說(shuō)它的生存期為整個(gè)源程序。
就是說(shuō)你有個(gè)變量定義了,但沒(méi)有用。警告你是不是忘了,或別的什么的。