C語言第1次上機
C語言程序設(shè)計 實驗報告班級 日期學(xué)生姓名 學(xué)號第 1 次上機實驗1 表達式與標準輸入輸出1.1實驗?zāi)康模?)熟練掌握各種運算符
C語言程序設(shè)計 實驗報告
班級 日期
學(xué)生姓名 學(xué)號
第 1 次上機
實驗1 表達式與標準輸入輸出
1.1實驗?zāi)康?/p>
(1)熟練掌握各種運算符的運算功能,操作數(shù)的類型,運算結(jié)果的類型及運算過程中的類型轉(zhuǎn)換,重點是C 語言特有的運算符,例如位運算符,問號運算符,逗號運算符等;熟記運算符的優(yōu)先級和結(jié)核性。
(2)掌握getchar,putchar,scanf 和printf 函數(shù)的用法。
(3)掌握簡單C 程序(順序結(jié)構(gòu)程序)的編寫方法。
1.2 實驗任務(wù)
編寫并上機調(diào)試運行能實現(xiàn)以下功能的程序。
(1)編寫一個程序,輸入字符c,如果c是大寫字母,則將c轉(zhuǎn)換成對應(yīng)的小寫,否則c的值不變,最后輸出c。
(2)編寫一個程序,輸入無符號短整數(shù)x ,m,n(0 ≤m≤ 15, 1 ≤ n≤ 16-m), 取出x 從第m位開始向左的n位(m從右至左編號為0~15),并使其向左端(第15位)靠齊。
(3)IP 地址通常是4個用句點分隔的小整數(shù)(即點分十進制),如32.55.1.102。這些地址在機器中用無符號長整形表示。編寫一個程序,以機器存儲的形式讀入一個互聯(lián)網(wǎng)IP 地址,對其譯碼,然后用常見的句點分隔的4部分的形式輸出。例如,
整形676879571二進制表示就是:00101000 01011000 01011100 11010011,按照8位一組可表示為:40 88 92 211,由于CPU 處理數(shù)據(jù)的差異,它的順序是顛倒的,所有最終格式為211.92.88.40。
1.3 實驗步驟及結(jié)果
(要求給出源程序和程序運行結(jié)果。另外,根據(jù)實驗內(nèi)容,記錄編輯、編譯、鏈接、調(diào)試程序的操作過程和實驗中出現(xiàn)的問題)
(1)分析:輸入字符,判斷是否為大寫字母,轉(zhuǎn)換時只需對字符C 作C-‘A ’ ’a ’處理。 #include
void main(void)
{
char c;
printf("Input c:n");
scanf("c",&c);
if(c>'A'&&c<'Z'){
,}
c=c-'A' 'a'; printf("c",c); } else printf("c",c);
問題:當if 句后面缺{ }時
(2)分析:欲使其向左端靠齊,需要使無關(guān)項為零,可以先向左移再引入邏輯尺,也可以先移到最右端再移到最左端。這里用后者,對X 作X 》》M 《《(15—N 1)處理。
#include
void main()
{
unsigned short int x,m,n;
printf("Input x,m,n:n");
scanf("hu hu hu",&x,&m,&n);
x=x>>m<<(15-n 1);
printf("hun",x);
}
,問題:當缺少分號時
(3)分析:把長整型數(shù)8位一組表示出來,需要先分別把這8位數(shù)移到最右端,再分別轉(zhuǎn)換成十進制數(shù)字。這里還需注意四組數(shù)的順序。
#include
main()
{
unsigned long x,a,b,c,d;
printf("Input x:n");
scanf("ul",&x);
a=(x&0xff000000)>>24;
b=(x&0x00ff0000)>>16;
c=(x&0x0000ff00)>>8;
d=(x&0x000000ff);
printf("d.d.d.d",d,c,b,a);
}
問題:當printf("d.d.d.d",a,b,c,d);時結(jié)果順序顛倒
實驗2 流程控制實驗
2.1 實驗?zāi)康?/p>
(1)掌握復(fù)合語句、if 語句、switch 語句的使用,熟練掌握for 、while 、do-while 三種基本的循環(huán)語句的使用,掌握重復(fù)循環(huán)技術(shù),了解轉(zhuǎn)移語句與標號語句。
(2)熟練運用for 、while 、do-while 語句來編寫程序。
(3)練習(xí)轉(zhuǎn)移語句與標號語句的使用。
(3)使用集成開發(fā)環(huán)境中的調(diào)試功能:單步執(zhí)行,設(shè)置斷點,觀察變量值。
2.2 實驗任務(wù)
,編寫并上機調(diào)試運行能實現(xiàn)以下功能的程序。
(1) 假設(shè)工資稅金按以下方法計算:x < 1000元,不收取稅金;1000 ≤ x < 2000,收取5的稅金;2000 ≤ x < 3000,收取10的稅金;3000 ≤ x < 4000,收取15的稅金;4000 ≤ x < 5000,收取20的稅金;x >5000,收取25的稅金。編寫一個程序, 輸入工資金額,輸出應(yīng)收取稅金額度,要求分別用if 語句和switch 語句來實現(xiàn)。
(2)編寫一個程序, 將輸入的一行字符復(fù)制到輸出,復(fù)制過程中將一個以上的空格字符用一個空格代替。
(3)編寫一個程序, 打印如下的楊輝三角形。
1 /* 第0行 */
1 1 /* 第1行 */
1 2 1 /* 第2行 */
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
j j C C i i 每個數(shù)據(jù)值可以由組合計算(表示第i 行第j 列位置的值),而的計算如下:
C i 0=1 (i=0,1,2,…)
C i j =C i j -1*(i-j 1) / j (j=0,1,2,3,…,i)
說明:本程序中為了打印出金字塔效果,要注意空格的數(shù)目。一位數(shù)之間是3個空格,兩位數(shù)之間有2個空格,3位數(shù)之間只有一個空格,程序編制過程中要注意區(qū)分。
(4)編寫一個程序,將用戶輸入的任意正整數(shù)逆轉(zhuǎn),例如,輸入1234,輸出4321。 在此基礎(chǔ)上添加代碼找出5000以內(nèi)的所有回文數(shù),要求一屏顯示20行每行5個回文數(shù),用戶輸入ESC 鍵退出,其它鍵繼續(xù)顯示。
2.3 實驗步驟及結(jié)果
(要求給出源程序和程序運行結(jié)果。另外,根據(jù)實驗內(nèi)容,記錄編輯、編譯、鏈接、調(diào)試程序的操作過程和實驗中出現(xiàn)的問題)
(1)
i>分析:if 句需要列出所有表達式,除按要求的范圍分別輸出外,還需考慮X 《0的情況。注意if 語句的格式和輸出數(shù)據(jù)的形式。
#include
int main()
{
float x;
printf("input the salary:n");
scanf("f",&x);
if(x<0)printf("wrongn");
else if(x>=0 && x<1000)printf("0n");
else if(x<2000)printf("fn",x*0.05);
,else if(x<3000)printf("fn",x*0.1);
else if(x<4000)printf("fn",x*0.15);
else if(x<5000)printf("fn",x*0.2);
else
printf("fn",x*0.25);
return 0;
}
問題:當if 句后面多加了分號時
ii>分析:switch 語句重在定義case 為(int )(x/1000.0),就列舉了0,1,2,3,4和default 幾種情況,注意switch 的格式。
#include
int main()
{
float x ;int Case = 0;
printf("input the salary:n");
scanf("f",&x);
Case = (int)(x/1000.0);
switch(Case)
{
case 0:printf("0n");break;
case 1:printf("fn",x*0.05);break;
case 2:printf("fn",x*0.1);break;
case 3:printf("fn",x*0.15);break;
case 4:printf("fn",x*0.2);break;
default:printf("fn",x*0.25);
}
return 0;
}
,問題:當未定義case 為int 類型時
(2)分析:引入while 語句循環(huán)處理字符,引入switch 語句處理空格。注意這兩種語句的格式。
#include
#define COPY 0
#define START 1
void main(void)
{
char c;
int state;
state=COPY;
printf("Input chars end with ctrl z:n");
while((c=getchar())!=EOF)
switch(state){
case COPY:
if(c==' ')state=START;
else putchar(c);
break;
case START:
if(c==' ')state=START;
else{
printf(" ");
putchar(c);
state=COPY;
}
}
}
問題:當if(c=='')時
,(3)分析:用a[i][j]表示i 行j 列的數(shù)有a[i][j]=a[i-1][j] a[i-1][j-1]這個關(guān)系式,用for 語句處理循環(huán)和空格問題,用域?qū)捳f明解決數(shù)字間隔寬度問題。
#include
#define M 10
void main()
{
int a[M][M] , i , j ;
int m,k=33,t;
char b[100];
for(t=0;t<100;t )
b[t]=32;
for(i=0;i for(m=k;m>=0;m--) printf("c",b[m]); for(j=0;j<=i;j ) { if(i==j||j==0) a[i][j]=1; else a[i][j]=a[i-1][j] a[i-1][j-1]; printf("M",a[i][j]); if(i==j) printf("n"); } k=k-2; } } 問題:當沒考慮空格時 。 。 。 。 。 (4) i>分析:把數(shù)字連續(xù)除以10就可以從余數(shù)得到反方向的數(shù)字,引入do-while 語句循環(huán)處理。 #include main() { int x,digit; printf("Input x:n"); scanf("d",&x); do { digit=x; printf("d",digit); x/=10; }while(x!=0); printf("n"); } 說明:參照課本設(shè)計 ii>分析:由于5000較小,可直接判斷是否為回文數(shù)引入if 句。用while 句處理逐個循環(huán)直到考慮了所有數(shù)。并用if 句處理換行和固定行問題。 #include main() { int i=0,j=0,line=0; char m; while(i<=5000){ i ; if( (( i>=10&&i<100 ) && ( ( i/10 i*10 ) == i ) ) ||( ( i>=100&&i<1000 ) && ( (i/100 (i/10)*10 i*100) == i ) )||( (i>=1000&&i<5000 ) && ( (i/1000 (i/100)*10 (i/10)*100 i*1000)==i))) { printf("dt",i); j ; if(j5==0){ printf("n"); line ; if(line==20){ scanf("c",&m); line=0; } } } } printf("n"); } 問題:當沒有設(shè)計好if 中表達式時 實驗心得與體會 經(jīng)過本次實驗,我不但熟悉了c 語言語法,而且明白了程序設(shè)計不單單需要對代碼熟練,更重要的是要有好的設(shè)計思路,其中算法非常重要。一個好的設(shè)計思路不僅能處理一些實用的問題,還能節(jié)約設(shè)計程序所用的時間和運行程序所花的時間。所以我應(yīng)該嘗試多設(shè)計一些簡捷實用的程序,盡量多想一些簡單可行的方法??傊敬螌嶒炲憻捔宋襝 語言上機動手能力。 選做題 一個世紀的100個年號均為合數(shù)的世紀稱謂合數(shù)世紀。編程序找出最早的合數(shù)世紀。例如16719世紀(1671801~1671899)和26379世紀(2637801~2637899)都是合數(shù)世紀。 分析:引入for 語句處理逐個循環(huán),從2世紀開始排除,直到找到合數(shù)世紀才停止。 #include #include