《C語言》實驗指導書-32學時_第1頁
《C語言》實驗指導書-32學時_第2頁
《C語言》實驗指導書-32學時_第3頁
《C語言》實驗指導書-32學時_第4頁
《C語言》實驗指導書-32學時_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《C語言程序設計》實驗指導書PAGEPAGE28《C語言程序設計》實驗指導書實驗一順序結構程序設計一、實驗目的及要求1. 了解如何編輯、編譯、連接和運行一個C程序;2. 熟悉基本類型的變量的定義;3. 掌握C語言中使用最多的一種語句——賦值語句的使用;4. 掌握數(shù)據(jù)的輸入輸出的方法,能正確使用各種格式轉換符。二、實驗任務1.熟悉使用VC++6.0編輯、編譯、連接和運行一個C程序的過程。1)啟動VisualC++,選擇“文件”菜單中的“新建”命令,選擇“文件”標簽中的“C++SourceFile”選項。2)選擇源程序存放的目錄和輸入源程序名,單擊“確定”。3)在編輯器中編寫源程序。4)單擊F7或“編譯”中的“重建全部”編譯源程序,若編譯通過,單擊“執(zhí)行”,在DOS屏上看結果,任按一鍵返回編輯器。2.輸入并運行一個簡單的程序。輸入下面的程序#include<stdio.h>voidmain(){printf(“ThisisaCprogram.\n”);}編譯和連接該程序,觀察屏幕上顯示的編譯信息。如果出現(xiàn)“出錯信息”,則應找出原因并改正之,再進行編譯。如果編譯無錯誤,運行該程序,觀察分析運行結果。3.輸入并編輯一個C程序。輸入以下程序#include<stdio.h>voidmain(){inta,b,sum;a=123;b=456;sum=a+b;print(“sumis%d、n”,sim);}編譯改程序,仔細分析編譯信息窗口,可能顯示有多個錯誤,逐個修改,直到不出現(xiàn)錯誤。運行程序,分析運行結果。4.以下程序多處有錯。要按下面指定的形式輸入數(shù)據(jù)和輸出數(shù)據(jù)時,請對該程序做相應的修改。#include<stdio.h>voidmain(){doublea,b,c,s,v;printf(inputa,b,c:\n);scanf("%d%d%d",a,b,c);s=a*b;v=a*b*c;printf("%d%d%d",a,b,c);printf("s=%f\n",s,"v=%d\n",v);}當程序執(zhí)行時,屏幕的顯示和要求輸入形式如下:inputa,b,c:1.02.03.0à此處的1.02.03.0是用戶輸入的數(shù)據(jù)a=1.000000b=2.000000,c=3.000000à此處是要求的輸出格式s=2.000000,v=6.000000相關知識:①檢查程序錯誤時應注意幾點:a)有時程序中一個錯誤會引發(fā)一系列錯誤信息,工作中不應被這種情況所迷惑,改正了一些錯誤后應及時對源程序重新進行編譯;b)如果修改錯誤時增刪了行,或是一個行里有多個錯誤,更正前面錯誤時增刪了字符,就可能導致系統(tǒng)對錯誤定位不準,此時應該重新編譯;c)系統(tǒng)給出的警告信息一般都說明程序中有問題,因為系統(tǒng)發(fā)現(xiàn)了可疑情況。對于警告信息同樣要逐個仔細分析。除非明確認定不是問題,否則絕不能簡單地認為不是錯誤而不予理睬。實際上,很多警告都是因為程序中確實有嚴重的隱含錯誤。d)在連接中發(fā)現(xiàn)新錯誤也需要仔細檢查和修改程序。連接時發(fā)現(xiàn)的錯誤一般是由于函數(shù)名或外部變量名字寫錯,或者一些函數(shù)、外部變量沒有定義引起的。系統(tǒng)不能對連接錯誤給以自動定位,只能提供有關的名字信息等。對于這類問題,可以借助編輯器的字符串查找命令進行定位。②正確調用scanf函數(shù)和printf函數(shù)構成輸入和輸出語句。5.有以下程序#include<stdio.h>voidmain(){charc1,c2;intn1,n2;c1=getchar();c2=getchar();n1=c1-'0';n2=n1*10+(c2-'0');printf("%d\n",n2);}程序運行時輸入:12<回車>,執(zhí)行后輸出結果是什么?相關知識:①getchar()函數(shù)用來輸入兩個字符分別賦給變量c1和c2;②n1=c1-'0'相當于n1='1'-'0',字符1的ASCII碼值比0大一,所以n1中的值為1,c2-'0'相當于'2'-'0';③把字符串轉換為多位數(shù)的算法。6.若有以下程序#include<stdio.h>voidmain(){inti,j;intx,y;scanf("i=%d,j=%d",&i,&j);scanf("%d%d",&x,&y);printf("i=%d,j=%d\n",i,j);printf("%4d%4d\n",x,y);}要求給i賦值為10,j賦值為20,則應該怎樣從鍵盤輸入數(shù)字?相關知識:①在調用scanf()函數(shù)時在格式串中若包含有格式描述符之外的字符時,則要求在輸入數(shù)據(jù)時在對應的位置上輸入完全匹配的字符;②scanf()函數(shù)只包含格式描述符時可用跳格鍵Tab、空格和回車分隔數(shù)據(jù);③在調用printf()函數(shù)時在格式串中若包含有格式描述符之外的字符時,則在輸出數(shù)據(jù)時在對應的位置上輸出完全匹配的字符,%d之類的格式符位置輸出對應輸出項的值;故輸出時要注意插入適當?shù)姆歉袷椒员銋^(qū)分各個輸出結果。7.計算定期存款本利之和設銀行定期存款的年利率rate為2.25%,并已知存款期為n年,存款本金為capital元,試編程計算n年后的本利之和deposit。要求定期存款的年利率rate、存款期n和存款本金capital均由鍵盤輸入。三、實驗重點、難點符數(shù)據(jù)輸入輸出函數(shù)格式輸入輸出函數(shù)四、操作要點(1)編譯選擇主菜單“編譯(Build)”中的“編譯(Compile)”命令,或單擊工具條上的圖標,系統(tǒng)只編譯當前文件而不調用鏈接器或其它工具。輸出(Output)窗口將顯示編譯過程中檢查出的錯誤或警告信息,在錯誤信息處單擊鼠標右鍵或雙擊鼠標左鍵,可以使輸入焦點跳轉到引起錯誤的源代碼處大致位置以進行修改。(2)構建選擇主菜單“編譯(Build)”中的“構建(Build)”命令,或單擊工具條上的圖標,對最后修改過的源文件進行編譯和連接。程序構建完成后生成的目標文件(.obj),可執(zhí)行文件(exe)存放在當前工程項目所在文件夾的“Debug”子文件夾中。(3)運行選擇主菜單“編譯(Build)”中的“執(zhí)行(BuildExecute)”命令,或單擊工具條上的圖標,執(zhí)行程序,將會出現(xiàn)一個新的用戶窗口,按照程序輸入要求正確輸入數(shù)據(jù)后,程序即正確執(zhí)行,用戶窗口顯示運行的結果。對于比較簡單的程序,可以直接選擇該項命令,編譯、連接和運行一次完成。五、注意事項輸入輸出的數(shù)據(jù)類型與所用格式說明符不一致輸入變量時忘記使用地址符號實驗二邏輯結構程序設計一、實驗目的及要求了解C語言表示邏輯量的方法。學會正確使用邏輯運算符和邏輯表達。熟練掌握if語句和switch語句。二、實驗任務1源程序中包含有一些錯誤,調試下列程序,使之具有如下功能:輸入a、b、c三個整數(shù),求最小值。#include“stdio.h”voidmain()

{

inta,b,c;

scanf("%d%d%d",a,b,c);

if((a>b)&&(a>c))

if(b<c)

printf("min=%d\n",b);

else

printf("min=%d\n",c);

if((a<b)&&(a<c))

printf("min=%d\n",a);

}再次運行程序,輸入為“2,1,3”,程序輸出卻是“min=2”。用單步執(zhí)行的方法,馬上發(fā)現(xiàn)變量a、b、c的值是不對的,原因是程序要求輸入數(shù)據(jù)的分隔符是空格(還允許使用回車或<Tab>

#include“stdio.h”voidmain()

{inta,b,c;

scanf("%d%d%d",&a,&b,&c);

if((a<b)&&(a<c))

printf("min=%d\n",a);

elseif((b<a)&&(b<c))

printf("min=%d\n",b);

elseif((c<a)&&(c<b))

printf("min=%d\n",c);

else

printf("Nofindminimum\n");

}上述程序是按在三個數(shù)中僅有一個最小值時才稱其為最小值進行設計的。另外,注意程序的書寫格式,一定要采用縮進格式,即不同層次(分支)的語句左起的空格不同,這樣可以有效地提高程序的可讀性。相關知識:①類似a<b<c表達式的表示方法;②if語句的嵌套;③調試工具的使用。④求最值的簡單算法。2.參考上一題,編寫一個C程序,求a、b、c、d四個數(shù)中的最大者。編程點撥:①多定義一個變量,并一開始令變量max=a;②if(max<b)max=b;其余多個數(shù)據(jù)中求最值依此類推。3.輸入4個整數(shù),要求按由小到大順序輸出。得到正確結果后,修改程序使之按由大到小順序輸出。相關知識:①輸入函數(shù)scanf()的使用;②簡單的排序算法;③通過中間變量t交換a和b值的方法:t=a;a=b;b=t;。4.根據(jù)以下函數(shù)關系,對輸入的每個x值,計算出相應的y值。當x取其他值時當x取其他值時#includevoidmain(){floatx,y;scanf("%f",&x);if()y=;elseif()y=;elseprintf("x=%f,y=%f",x,y);}相關知識點:if語句的嵌套;數(shù)學函數(shù)的調用方式。5模仿第4題,寫程序實現(xiàn)以下函數(shù):用scanf函數(shù)輸入x的值,求y值。運行程序,輸入x的值(分別為x<1、1≤x<10、x>10三種情況),檢查輸出的y值是否正確。相關知識:①用if的嵌套實現(xiàn)分段函數(shù);②比較運算符的正確使用;③算術運算符*的正確使用。6.閱讀分析以下程序的功能。#include<stdio.h>voidmain(){ intchoice; intvalue; printf("Convert:\n");/*顯示菜單*/printf("1:decimaltohexadecimal\n");printf("2:hexadecimaltodecimal\n");printf("3:decimaltooctal\n");printf("4:octaltodecimal\n");printf("enteryourchoice:");scanf("%d",&choice); switch(choice){ case1:/*選中1時處理*/ printf("enterdecimalvalue:"); scanf("%d",&value); printf("%dinhexadecimalis:%x\n",value,value); break;case2:/*選中2時處理*/ printf("enterhexadecimalvalue:"); scanf("%x",&value); printf("%xindecimalis:%d\n",value,value); break; case3:/*選中3時處理*/ printf("enterdecimalvalue:"); scanf("%d",&value); printf("%dinoctalis:%o\n",value,value); break; case4:/*選中4時處理*/ printf("enteroctalvalue:"); scanf("%o",&value); printf("%oindecimalis:%d\n",value,value); break; }}相關知識:①用switch語句實現(xiàn)菜單的方法;②數(shù)制轉換的方法。7.模仿第6題,要求對輸入的數(shù)字1~7轉換成文字星期幾,對其它數(shù)字不轉換。例如,輸入5時,程序應該輸出Friday。=1\*GB3①編輯、調試和運行該程序,然后輸入4。其輸出結果是什么?為什么是這樣的結果?=2\*GB3②該程序有哪些錯誤?如何修改?相關知識:①switch語句的正確使用;②break在switch語句中的作用。三、實驗重點、難點表達式選擇型程序設計語句邏輯表達式四、操作要點選擇主菜單“編譯(Build)”中的“重建全部(RebuildAll)”命令,允許用戶編譯所有的源文件,而不管它們何時曾經被修改過。選擇主菜單“編譯(Build)”中的“批構建(BatchBuild)”命令,能單步重新建立多個工程文件,并允許用戶指定要建立的項目類型。五、注意事項誤把“=”作為關系運算符“等于”沒有注意大寫字母和小寫字母代表不同的標識符當一個復合語句中使用多層括號時,常出現(xiàn)大括號不配對的現(xiàn)象。實驗三循環(huán)控制一、實驗目的及要求熟悉掌握用分for語句,while語句和do_while語句實現(xiàn)循環(huán)的方法。掌握在程序設計中用循環(huán)的方法實現(xiàn)一些常用算法(如窮舉、迭代、遞推等)。二、實驗任務下面程序求1+…+100,填空,實現(xiàn)該功能。#include<stdio.h>voidmain(){ints,i;s=0;/*第5行*/for()s=s+i;printf("1+...+100=%d\n",s);}思考:(1)第5行能不能去掉?其作用是什么?(2)不用for語句,用while語句改寫該程序,實現(xiàn)同樣的功能。比較下列兩個程序。(驗證)#include<stdio.h>voidmain(){inti,n,sum=0;scanf("%d",&i);n=i;while(i<=10){sum+=i; i++;}printf("%d+...+10=%d",n,sum);}#include<stdio.h>voidmain(){inti,n,sum=0;scanf("%d",&i);n=i;do{sum+=i; i++;}while(i<=10);printf("%d+...+10=%d",n,sum);}分別運行這兩題,若輸入7,這兩個程序的結果分別是多少?若輸入12,這兩個程序的結果又分別是多少?比較為什么會有這樣的區(qū)別?預習下面程序,若輸入12345,分析輸出結果是多少?上機驗證。#include<stdio.h>voidmain(){longdata;scanf("%ld",&data);while(data){printf("%ld,",data%10);data=data/10;}}下面程序實現(xiàn)求Fibonacci數(shù)列的前n個數(shù)。(驗證、調試)運行程序,寫出運行結果;采用單步跟蹤技術運行該程序,觀察一下變量的變化。#include<stdio.h>voidmain(){longintf1,f2;inti,n;printf("Inputn:");/*第5行*/scanf("%d",&n);/*第6行*/f1=f2=1;for(i=1;i<n;i++){printf("%ld\t%ld\n",f1,f2);/*第9行*/f1=f1+f2;f2=f2+f1;}}思考:(1)f1、f2這兩個變量為什么定義為longint型?(2)第5行和第6行的相互作用,你會用這種方式來實現(xiàn)輸入嗎?(3)注意第9行的輸出“%ld”中的“1”是字母“L”的小寫形式,不是數(shù)字1。預習下面程序,寫出預習結果并上機驗證。(驗證)#include<stdio.h>voidmain(){inti,j,x;for(i=0,x=0;i<2;i++){x++;for(j=0;j<3;j++){if(j%2)continue;x++;}x++;}printf("x=%d\n",x);}思考:用一句話概括if(j%2)語句的作用。相關知識:嵌套for循環(huán)的執(zhí)行過程及continue語句的作用。6.下面程序輸入一批考試分數(shù),用-1作為結束標志,若輸入大于100分,則提示重新輸入,然后計算最高分、最低分與平均分。請調試、檢查程序中的錯誤,并改正之。#include<stdio.h>voidmain(){intmark;intn=0;sum=0;intmax=100;min=0;for(;;);{scanf("%d",&mark);if(mark>100){printf("Mark>100,Pleasereinput\n");break;}if(mark=-1)break;n++;sum=sum+mark;if(mark>max)max=mark;if(mark<min)min=mark;}sum=sum/n;printf("max=%d,min=%d,aver=%d\n",max,min,sum);}提示:該程序有很多錯誤,下面給出某些錯誤的說明。當求一批數(shù)中的最大值時,若已知一批數(shù)的最小值,則將這個最小值作為最大值的初始值;當求最小值時,情況相反,即若已知這批數(shù)的最大值,則將這個最大值作為最小值的初始值。本例中求一批分數(shù)的最高分,則最高分的初始值應該設為0,然后在程序循環(huán)中逐漸地升高,直至求出最高分;本例中還要求這批分數(shù)的最低分,則最低分的初始值設為100,然后在程序循環(huán)中逐漸地降低,直至求出最小值。實現(xiàn)“若輸入大于100分,則提示重新輸入”功能的語句有錯;實現(xiàn)“用-1作為結束標志”功能的語句有錯。思考:(1)“一批數(shù)據(jù)”是幾個數(shù)據(jù)?輸入的數(shù)據(jù)如何結束?程序中哪一行是實現(xiàn)結束這個要求的,寫出該語句。(2)程序中哪個語句是實現(xiàn)”若輸入大于100分,則提示重新輸入”這個要求的,寫出該語句。(3)寫出您的測試數(shù)據(jù)及運行結果,注意輸入的數(shù)據(jù)序列中最后一個應是-1。7.編程:輸入20個1~90的整數(shù),分類統(tǒng)計1~30、31~60、61~90的數(shù)各有多少個?編程點撥:count1計1~30的個數(shù),count2計31~60的個數(shù),count3計61~90的個數(shù)。用for循環(huán)20次實現(xiàn)該程序的功能:輸入一個整數(shù)x,判斷該數(shù)所在的范圍,若x是1~30,則count1加1;若x是31~60,則count2加1;若x是61~90,則count3加1。最后,輸出統(tǒng)計的結果。#include<stdio.h>voidmain(){intcount1=0,count2=0,count3=0;inti,x;printf(“Pleaseinput20numbers:”);for(i=0;i<20;i++){scanf(“%d”,&x);………/*補充完成程序*/}/*輸出統(tǒng)計結果*/……………}補充完成該程序。8.編程:素數(shù)是除了1和其本身以外,不能被其他自然數(shù)整除的自然數(shù)。從鍵盤輸入一個數(shù),判斷該數(shù)是不是素數(shù)?編程點撥:輸入這個數(shù)x。用for循環(huán)2~x-1,用2~x-1的每一個數(shù)去除x,若有一個數(shù)整除x,則說明x不是素數(shù);否則,x就是素數(shù)。最后,將判斷結果輸出。#include<stdlib.h>voidmain(){inti,x;printf("Enteronenaturalinteger:");scanf("%d",&x);for(i=2;i<x-1;i++)/*補充完成該程序*/……………}思考:其實,只需要判斷2~之間的整數(shù)能否整除x就可以判斷x是否為素數(shù),此時,如何修改程序?9.編程:顯示所有的水仙花數(shù)。謂水仙花數(shù),是指一個3位數(shù),其各位數(shù)字立方和等于該數(shù)字本身。例,153是水仙花數(shù),因為153=13+53+33。有兩種解題思路,選擇其中之一編程實現(xiàn):利用三重循環(huán),將這三個數(shù)通過一定的運算符連接成一個3位數(shù),然后判斷是否是水仙花數(shù)。for(i=1;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++)注意,因水仙花是一個三位數(shù),百位i是從1開始,不能從0開始,十位j和個數(shù)位k可以從0開始。利用一個循環(huán),對100~999范圍內的每個3位數(shù)逐位分離后進行判斷。for(i=100;i<999;i++){a=i/100;b=(i-a*100)/10;c=i%10;………}*****************************分析:這是由星號構成的5行5列的三角形圖形。每一行的星號數(shù)量為:1、3、5、7、9??紤]兩點,一是每一行上星號的生成規(guī)則,二是每一行第一個星號字符的輸出位置。每一行的星號與行號有關,即2*i+1,其中i是行號;每一行的輸出位置比上一行少一個空格,可以這樣實現(xiàn):for(j=1;j<=4-i;j++)printf(“%c”,‘’),其中i是行號。三、實驗重點、難點循環(huán)語句循環(huán)的嵌套break和continue語句四、操作要點選擇主菜單“編譯(Build)”中的“開始調試(StartDebug)”命令,選擇下一級提供的調試命令,或者在菜單區(qū)空白處單擊鼠標右鍵,在彈出的菜單中選中“調試(Debug)”項。激活調試工具條,選擇需要的調試命令,系統(tǒng)將會進入調試程序界面。同時提供多種窗口監(jiān)視程序運行,通過單擊“調試(Debug)”工具條上的按鈕,可以打開/關閉這些窗口。五、注意事項對應該有花括號的復合語句,忘記加花括號在不該加分號的地方加了分號實驗四數(shù)組一、實驗目的及要求掌握一維數(shù)組和二維數(shù)組的定義、賦值和輸入輸出的方法;掌握字符數(shù)組和字符串函數(shù)的使用;掌握與數(shù)組有關的算法(特別是排序算法)。二、實驗任務1.調試下列程序,使之具有如下功能:輸入10個整數(shù),按每行3個數(shù)輸出這些整數(shù),最后輸出10個整數(shù)的平均值。寫出調試過程。#inclue<stdio.h>#defineN10voidmain(){inti,a[N],av;for(i=0;i<N;i++)

scanf("%d",a[i]);

for(i=0;i<N;i++)

{printf("%d",a[i]);

if(i%3==0)

printf("\n");

}

for(i=0;i!=N;i++)

av+=a[i];

printf("av=%f\n",av);

}上面給出的程序是完全可以運行的,但是運行結果是完全錯誤的。調試時請注意數(shù)組元素的輸入問題、輸出格式問題等。請使用前面實驗所掌握的調試工具,判斷程序中的錯誤并改正。相關知識:①數(shù)組元素值的輸入;②求和求平均值的相關變量初始化問題;③輸出格式符的正確使用。④數(shù)組元素的格式化輸出。2.下面程序是輸入5個數(shù)據(jù),然后求它們的和并輸出結果。#include<stdio.h>voidmain(){inti,a[5],sum=0;scanf("%d,%d,%d,%d,%d",a);for(i=0;i<=4;i++)sum+=a[i];printf("sum=%d\n",sum);}該程序中有哪些錯誤?如何修改?寫出正確運行后的結果。相關知識:數(shù)組元素的輸入和輸出只能逐個元素操作,而不能以數(shù)組名作整體操作。3.有一個3行4列的矩陣,現(xiàn)要求編程求出其中最大的那個元素的值,以及它所在的行號與列號。下面程序的初始說明和輸出語句如下所示,請補充完成該程序。#include<stdio.h>voidmain(){ inti,j,row,column,max; staticinta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};…… printf("Max=%d,Row=%d,Column=%d\n",max,row,column);}編程點撥:①初始化row、column及max。②使用for循環(huán)的雙重循環(huán)逐行把元素值與max值進行比較,比較結果如果元素值比max值大,則改變max值,同時改變row和column的值。③最后輸出max,row和column的值。相關知識:①二維數(shù)組的定義和初始化;②使用二重循環(huán)對二維數(shù)組元素的訪問;③求最值時相關變量初值的設定。4.數(shù)組中已存互不相同的10個整數(shù),從鍵盤輸入一個整數(shù),輸出與該值相同的數(shù)組元素下標。編程點撥:輸入要查找的變量x的值;使用循環(huán)將輸入的數(shù)和數(shù)組元素逐個進行比較,若找到,則提前退出循環(huán);根據(jù)循環(huán)是正常結束還是提前結束來判斷是否找到x。部分源代碼:#include<stdio.h>voidmain(){inti,x,a[10]={1,2,3,4,5,6,7,8,9,10};/*輸入x變量的值*/for(i=0;i<10;i++)printf("%4d",a[i]);printf("\n");/*循環(huán)查找與x相等的元素*/if()printf("%d\n",i);/*輸出查找結論,輸出下標值*/elseprintf("Notfound%d\n",x);}5.以下程序的功能是:從鍵盤上輸入若干個學生的成績,統(tǒng)計計算出平均成績,并輸出低于平均分的學生成績,用輸入負數(shù)結束輸入。請?zhí)羁眨?include<stdio.h>voidmain(){floatx[1000],sum=0.0,ave,a;intn=0,i;printf("Entermark:\n");scanf("%f",&a);while(a>=0.0&&n<1000){sum+=;x[n]=;n++;scanf("%f",&a);}ave=;printf("Output:\n");printf("ave=%f\n",ave);for(i=0;i<n;i++)if()printf("%f\n",x[i]);}6.綜合編程題:打印如下楊輝三角形11112113311464115101051編程點撥:楊輝三角形有如下特點:只有下半三角形有確定的值;第一列和對角線上的元素值都是1;其它元素值均是前一行同一列元素與前一行前一列元素之和。7.調試下列程序,使之具有如下功能:任意輸入兩個字符串(如:“abc123”和“china”),并存放在a,b兩個數(shù)組中。然后把較短的字符串放在a數(shù)組,較長的字符串放在b數(shù)組。并輸出。#include<stdio.h>#include<string.h>voidmain(){chara[10],b[10];intc,d,k,ch;scanf("%s",&a);scanf("%s",&b);printf("a=%s,b=%s\n",a,b);c=strlen(a);d=strlen(b);if(c>d)for(k=0;k<d;k++){ch=a[k];a[k]=b[k];b[k]=ch;}printf("a=%s\n",a);printf("b=%s\n",b);}相關知識:程序中的strlen()是庫函數(shù),功能是求字符串的長度,它的原型保存在頭文件"string.h"中。調試時注意庫函數(shù)的調用方法,不同的字符串輸入方法,通過錯誤提示發(fā)現(xiàn)程序中的錯誤。8.閱讀下面的程序,然后回答后面的問題:#include<stdio.h>#include<string.h>voidmain(){ chars1[80],s2[40]; inti=0,j=0; printf("\nPleaseinputstring1:"); scanf("%s",s1); printf("\nPleaseinputstring2:"); scanf("%s",s2); while(s1[i]!='\0') i++; while(s2[j]!='\0') s1[i++]=s2[j++];s1[i]='\0'; printf("\nNewstring:%s",s1);}編輯、運行該程序,然后分別輸入Country和side。請問:=1\*GB3①程序執(zhí)行的結果是什么?=2\*GB3②該程序的功能是什么?相關知識:=1\*GB3①串結束符’\0’;=2\*GB3②自編寫庫函數(shù)。9.填空完成下面程序,使其功能是對從鍵盤上輸入的兩個字符串進行比較,然后輸出兩個字符串中第一個不相同字符的ASCII碼之差。例如:輸入的兩個字符串分別為abcdefg和abceef,則輸出為-1。程序如下:#include<stdio.h>voidmain(){charstr1[100],str2[100];inti,s;printf("\nInputstring1:\n");gets(str1);printf(“\nInputstring2:\n”);gets(str2);i=(1);while((str1[i]==str2[i])&&(str1[i]!=(2)))i++;s=(3);printf("%d\n",s);}10.填空完成下面程序,使其的功能是統(tǒng)計從終端輸入字符中每個大寫字母的個數(shù)。用#號作為輸入結束標志。程序如下:#include<stdio.h>#include<ctype.h>voidmain(){intnum[26],i;charc;for(i=0;i<26;i++)num[i]=0;while((1)!='#')/*統(tǒng)計從終端輸入的大寫字母個數(shù)*/if(isupper(c))num[c-65](2);for(i=0;i<26;i++)/*輸出大寫字母和該字母的個數(shù)*/if(num[i])printf("%c:%d\n",i(3),num[i]);}11.編寫程序,輸入若干個字符串,求出每個字符串的長度,并打印最長一個字符串的內容。以“stop”作為輸入的最后一個字符串。相關知識:①字符數(shù)組的輸入輸出可以有兩種方法:逐個字符輸入輸出。用格式符“%c”輸入或輸出一個字符,此時輸入輸出函數(shù)中的輸入輸出項是數(shù)組元素名,而不是字符數(shù)組名;將整個字符串一次輸入或輸出。用“%s”格式符,意思是輸出字符串(string),此時輸入輸出函數(shù)中的輸入輸出項是字符數(shù)組名,而不是數(shù)組元素名。寫成下面這樣是不對的:printf("%s",c[0]);②gets()函數(shù)和scanf()函數(shù)輸入字符串的區(qū)別,puts()函數(shù)和printf()函數(shù)輸出字符串的區(qū)別;③求每個字符串的長度函數(shù)strlen()的使用,字符串比較函數(shù)strcmp()的使用;④二維數(shù)組處理多個字符串。12.編寫程序,輸入字符串s1和s2以及插入位置f,在字符串s1中的指定位置f處插入字符串s2。如:輸入"BEIJING"、"123"和位置3,則輸出:"BEI123JING"。三、實驗重點、難點一維數(shù)組二維數(shù)組和多維數(shù)組字符數(shù)組四、操作要點可以通過單擊調試(Debug)工具條上的按鈕或按快捷鍵的方式選擇多種單步執(zhí)行命令。①單步跟蹤進入子函數(shù)(StepInto,F(xiàn)11),每按一次F11鍵或按,程序執(zhí)行一條無法再進行分解的程序行,如果涉及到子函數(shù),進入子函數(shù)內部;②單步跟蹤跳過子函數(shù)(StepOver,F(xiàn)10),每按一次F10鍵,程序執(zhí)行一行;Watch窗口可以顯示變量名及其當前值,在單步執(zhí)行的過程中,可以在Watch窗口中加入所需觀察的變量,輔助加以進行監(jiān)視,隨時了解變量當前的情況,如果涉及到子函數(shù),不進入子函數(shù)內部;③單步跟蹤跳出子函數(shù)(StepOut,Shift+F11),按鍵后,程序運行至當前函數(shù)的末尾,然后從當前子函數(shù)跳到上一級主調函數(shù)。④運行到當前光標處當按下CTRL+F10后。程序運行至當前光標處所在的語句。五、注意事項對應該有花括號的復合語句,忘記加花括號在不該加分號的地方加了分號引用數(shù)組元素時誤用圓括號引用數(shù)組元素超界對二維或多維數(shù)組定義和引用的方式不對誤以為數(shù)組名代表整個數(shù)組實驗五函數(shù)與編譯預處理一、實驗目的及要求掌握函數(shù)定義的方法;掌握函數(shù)實參與形參的對應關系以及“值傳遞”的方式;掌握函數(shù)的嵌調用和遞歸調用的方法;掌握全局變量和局部變量動態(tài)變量、靜態(tài)變量的概念和使用方法;掌握預處理的定義與使用方法。二、實驗任務閱讀下面程序,通過調試該程序,熟悉函數(shù)的調用方法及單步跟蹤鍵F7和F8的不同。#include<stdio.h>voidmain(){voidfun(inti,intj,intk);intx,y,z;x=y=z=6;fun(x,y,z);printf("%x=%d;y=%d;z=%d\n",x,y,z);}voidfun(inti,intj,intk){intt;t=(i+j+k)*2;printf("t=%d\n",t);}閱讀下面程序,注意在調試時F11和F10的區(qū)別,還要注意函數(shù)調用過程中形參、實參的關系。#include<stdio.h>voidmain(){intx=10,y=20;voidswap(int,int);printf("(1)inmain:x=%d,y=%d\n",x,y);swap(x,y);printf("(4)inmain:x=%d,y=%d\n",x,y);}voidswap(intm,intn){inttemp;printf("(2)inmain:m=%d,n=%d\n",m,n);temp=m;m=n;n=temp;printf("(3)inmain:m=%d,n=%d\n",m,n);}把用戶自定義函數(shù)swap()中的形式參數(shù)m和n對應改成x和y,使其與實參變量同名,再用F7跟蹤程序的運行,看看有什么變化。相關知識:形參具有“用之則建,用完則撤”的特點。在函數(shù)定義時,函數(shù)名后面圓括號內的參數(shù)稱為形參;在函數(shù)調用時,函數(shù)名后面圓括號內的參數(shù)稱為實參。對于實參,在調用函數(shù)中對其進行定義時,不僅指明它的類型,而且系統(tǒng)還為其分配存儲單元。而對于形參,定義時僅僅只是指明它的類型,并不在內存中為它們分配存儲單元,只是在調用時才為其分配臨時存儲單元,函數(shù)執(zhí)行結束,返回調用函數(shù)時,該存儲單元立即撤銷。下面程序是實現(xiàn)求素數(shù)的,請?zhí)羁胀瓿稍摮绦?,并上機運行測試。#include<math.h>#include<stdio.h>voidmain(){intm;;/*申明求素數(shù)函數(shù)*/printf("Pleaseinputadatam=:");scanf("%d",&m);;/*調用求素數(shù)函數(shù)*/}voidprime(intn){inti,k;k=sqrt(n);for(i=2;i<=k;i++)if(n%i==0)break;if(i>=k+1)printf("Thisisaprimenumber");elseprintf("Thisisn’taprimenumber");}下面程序的功能是從鍵盤上輸入的若干個數(shù)并求出最大值。請?zhí)羁胀瓿稍摮绦颉?include<stdio.h>voidmain(){ inti; ints[10],max;/*Findmax()函數(shù)的申明*/; printf("Input10number:\n"); /*輸入10個數(shù)據(jù)到s數(shù)組中*/; /*調用Findmax函數(shù)*/; for(i=0;i<10;i++) printf("%4d",s[i]); printf("\nthemaxis%d",max);}intFindmax(intx[],intn){intmax,i;max=x[0];for(i=1;i<n;i++)if(max<x[i])max=x[i];returnmax;}相關知識:練習形參是數(shù)組的函數(shù)申明、調用格式;復習數(shù)組的輸入方法。下面程序的功能是從鍵盤上輸入的若干個數(shù)按升序排序。請調試檢查該程序中的錯誤,程序如下:#include<stdio.h>voidmain(){ inti,k; floats[100],j; printf("Inputnumber:\n"); for(i=0;scanf("%f",&j);i++) s[i]=j; sort(s,i); for(k=0;k<i;k++) printf("%f",s[k]); printf("\n");}voidsort(intx[n],intn){inti,j,temp,min;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++) if(x[j]<x[min]) min=j;if(min!=i){temp=x[i];x[i]=x[min];x[min]=temp;} } }錯誤提示:形參和實參的數(shù)據(jù)類型不一致;一般形參數(shù)組在說明時不指定數(shù)組的長度,而僅給出類型、數(shù)組名和一對方括號;用戶自定義函數(shù)sort()沒有申明過。注意:for(i=0;scanf("%f",&j);i++)這一行中for語句第二個表達式的使用形式,此處用了scanf()函數(shù)的出錯來結束輸出循環(huán)。請讀者查一下教材后面的附錄,看看什么時候scanf()函數(shù)返回0,此時就可以結束循環(huán)。編寫程序,實現(xiàn)由主函數(shù)輸入m、n,按下述公式計算并輸出的值。提示:定義一個求階層的函數(shù),然后在主函數(shù)中調用三次即可求得。閱讀如下遞歸程序,其功能是什么?上機調試。#include<stdio.h>voidmain(){ intm,k;voiddtoo(intn,intr); printf("Pleaeinputthedecimalnumber:");scanf("%d",&m); printf("\nPleaseinputanumberin(2,8,16):"); scanf("%d",&k);dtoo(m,k);}voiddtoo(intn,intr){if(n>=r)dtoo(n/r,r);printf("%d",n%r);}8.預習下面程序,寫出預習結果,上機驗證并寫出分析。變量的作用范圍#defineLOW10#defineHIGH5#defineCHANGE2inti=LOW;#include<stdio.h>voidmain(){intworkover(inti),reset(inti);inti=HIGH;reset(i/2);printf("i=%d\n",i);reset(i=i/2);printf("i=%d\n",i);reset(i/2);printf("i=%d\n",i);workover(i);printf("i=%d\n",i);}intworkover(inti){i=(i%i)*((i*i)/(2*i)+4);printf("i=%d\n",i);return(i);}intreset(inti){i=i<=CHANGE?HIGH:LOW;return(i);}相關知識:“變量用之不盡,一寫就走”。在main()主函數(shù)中reset(i/2)和reset(i=i/2)不同,第一個reset的i沒有被賦值到,所以該函數(shù)調用結束后還保持原來的值;而第二個reset的i被賦值了,所以函數(shù)調用結束后以前的值就沒有。全局變量:在所函數(shù)外面定義的變量,其有效范圍到整個源程序結尾;局部變量:在函數(shù)內部定義的變量或在函數(shù)頭部定義的形參,其有效范圍只在所定義的函數(shù),局部變量具有“用之則建,用完則撤”的特點。在不同函數(shù)內定義的變量同名互不干擾。如果一個源程序中的局部變量和全局變量同名,則局部變量優(yōu)先。9.上機調試下面程序,觀察靜態(tài)局部變量在調用過程中的變化。#include<stdio.h>voidmain(){ inti;intf(int); for(i=1;i<=5;i++) printf("(%d):%d\n",i,f(i));printf("\n");}intf(intn){ staticintj=1;j=j*n;return(j);}相關知識:靜態(tài)局部變量。如果希望在函數(shù)調用結束后仍然保留函數(shù)中定義的局部變量的值,則可以將該局部變量定義為靜態(tài)局部變量(或稱局部靜態(tài)變量)。靜態(tài)局部變量具有這樣一些特點:①全局壽命:靜態(tài)局部變量的數(shù)據(jù)存儲在靜態(tài)存儲區(qū)的存儲單元中,在函數(shù)調用結束后,它的值并不消失,直到整個應用程序執(zhí)行結束,它的存儲空間才被收回去。②局部可見性:其作用域只在定義它的函數(shù)內部,盡管它的值在函數(shù)調用結束后并不消失,但其他函數(shù)仍然不能訪問它,在進入到它所在的函數(shù)內,它的值才可見。③初始化的特點:若在定義該局部變量時有賦初值的,則賦初值只在編譯過程中進行,只賦值一次;若沒有賦初值,則默認的初值為0(數(shù)值型)或空字符(字符型)。10.預習下面程序,分析在程序運行前宏NUM的值,并上機運行,比較一下的預習結果和實際結果。#include"stdio.h"#defineN2#defineMN+1#defineNUM(M+1)*M/2voidmain(){inti,n=0;for(i=1;i<=NUM;i++){n++;printf("%d\n",n);}printf("\n");}11.分析下面程序的運行結果,上機驗證。#definePOWER(x)((x)*(x))#defineMAX(x,y)(x)>(y)?(x):(y)#definePRprintf#include<stdio.h>voidmain(){inta,b,c,d,x;a=5;b=10;x=200;c=POWER(a+b);x=x/POWER(a+b);d=MAX(a+6,b);PR("c=%d,d=%d,x=%d\n",c,d,x);}三、實驗重點、難點函數(shù)的定義函數(shù)的參數(shù)及返回值函數(shù)的調用數(shù)組作為函數(shù)參數(shù)局部變量和全局變量變量的存儲類別四、操作要點設置斷點的方法:可以通過下述方法設置一個斷點。首先把光標移動到需要設置斷點的代碼行上,然后按F9快捷鍵或者單擊“編譯”工具條上的按鈕,斷點處所在的程序行的左側會出現(xiàn)一個紅色圓點。選擇主菜單“編譯(Build)”中的“開始調試(StartDebug)”命令的下一級的“去(Go)”調試命令,或者單擊“編譯(Compile)”工具條上的按鈕,程序執(zhí)行到第一個斷點處程序將暫停執(zhí)行,該斷點處所在的程序行的左側紅色圓點上添加一個黃色箭頭,此時,用戶可方便地進行變量觀察。繼續(xù)執(zhí)行該命令,程序運行到下一個相鄰的斷點。只需在代碼處再次按F9或者單擊“編譯”工具條上的按鈕。也可以打開“Breakpoints”對話框后,按照界面提示去掉斷點。五、注意事項所調用的函數(shù)在調用語句之后定義,但在調用之前沒有說明誤認為形參值的改變會影響實參的值函數(shù)的實參和形參類型不致。實驗六指針一、實驗目的1.通過實驗進一步掌握指針的概念,會定義和使用指針變量;2.能正確使用數(shù)組的指針和指向數(shù)組的指針變量;3.能正確使用字符串的指針和指向字符串的指針變量;4.能正確使用指向函數(shù)的指針變量;5.了解指向指針的指針的概念及其使用方法。二、實驗內容編程序并上機調試運行程序(都要求用指針處理)。1.上機驗證以下程序的運行結果#include<stdio.h>voidmain(){inti,j,*pi,*pj;pi=&i;pj=&j;i=5;j=7;printf("\n%d\t%d\t%d\t%d",i,j,pi,pj);printf("\n%d\t%d\t%d\t%d",&i,*&i,&j,*&j);}運行結果:5 7 -34 -32-345-327相關知識:指針的值與指針指向的變量值的區(qū)別。在VC環(huán)境下,以上運行結果中的負數(shù)是另一個值。2.上機驗證以下程序的運行結果#include<stdio.h>voidmain(){inti,a[]={1,2,3},*p;p=a;/*將數(shù)組a首地址賦給指針p*/for(i=0;i<3;i++)printf("%d,%d,%d,%d\n",a[i],p[i],*(p+i),*(a+i));}運行結果:1,1,1,12,2,2,23,3,3,3相關知識:①指針指向數(shù)組的方法;②指針表示數(shù)組元素的方法。③數(shù)組元素的多種表示方法。3.調試下列程序,使之具有如下功能:用指針法輸入12個數(shù),然后按每行4個數(shù)輸出。寫出調試過程。#include<stdio.h>voidmain(){intj,a[12],*p=a;for(j=0;j<12;j++)scanf("%d",p++); p=a;for(j=1;j<=12;j++){printf("%4d",*p++);if(j%4==0)printf("\n");}}

相關知識:①調試時指針變量指向哪個目標變量;②區(qū)分指針的值和指針指向變量的值;③通過指針操作數(shù)組元素。4.調試下列程序,使之具有如下功能:任意輸入2個數(shù),調用兩個函數(shù)分別求:

⑴2個數(shù)的和,

⑵2個數(shù)交換值。#include<stdio.h>voidmain(){inta,b,c,*p=&c;voidsum(int,int,int*);voidswap(int*,int*);scanf("%d,%d",&a,&b);sum(a,b,p);swap(&a,&b);printf("sum=%d\n",c);printf("a=%d,b=%d\n",a,b);}voidsum(inta,intb,int*c){*c=a+b;}voidswap(int*a,int*b){int*t;t=a;a=b;b=t;}相關知識:①調試程序時注意參數(shù)傳遞的是數(shù)值還是地址。②指針作為參數(shù);③利用指針得到多個返回值。5.下面的程序是用來從鍵盤輸入10個整數(shù),然后求出其中的最小值。填寫空缺部分。#include<stdio.h>inttable[10];voidlookup(int*t,int*a,intn){intk;*a=t[0];for(k=1;k<n;k++)if()*a=t[k];}voidmain(){intk,min,*p=&min;for(k=0;k<10;k++)scanf("%d",table+k);lookup(,,10);printf("min=%d\n",min);}相關知識:①用數(shù)組名加地址偏移量表示數(shù)組元素地址的方法;②數(shù)組名作為函數(shù)參數(shù);③指針變量作為函數(shù)參數(shù)。6.以下程序建立一個如下所示的二維數(shù)組,并按以下格式輸出。請從對應的一組選擇項中,選擇正確的填入。1000101010001000101010001#include<stdio.h>voidmain(){inta[5][5]={0},*p[5],i,j;for(i=0;i<5;i++)p[i]=(1);for(i=0;i<5;i++){*(p[i]+(2))=1;*(p[i]+5-(3))=1;}for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%2d",p[i][j]);(4);}}(1)A.&a[i][0]B.&a[i][1]C.&p[i]D.&a[0][i](2)A.0B.1C.iD.(i+1)(3)A.0B.1C.iD.(i+1)(4)A.putchar("\n");B.putchar('\n');

溫馨提示

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

最新文檔

評論

0/150

提交評論