上機與編程2 分支程序設(shè)計 珍藏版
1. 目的與要求(1) 能正確使用關(guān)系和邏輯運算構(gòu)造各種條件;(2) 能正確選擇if和switch語句進行程序設(shè)計;(3) 能夠使用流程圖和N-S圖進行算法描述。2. 上機練習【練習2-1】若有C源程序2-1.c,其內(nèi)容如下:#include <stdio.h>void main(void)int a=3,b=4,i,j,k;i=(-a=b+)?-a:+b;j=a+;k=b+a+;printf("ni=%d,j=%d,k=%d,a=%d,b=%d",i,j,k,a,b);先分析程序運行的結(jié)果,然后上機編輯和運行程序,并將運行的結(jié)果與分析的結(jié)果進行比較,若分析有誤,試找出原因。i=6,j=2,k=9,a=4,b=7【練習2-2】若有C源程序2-2.c,其內(nèi)容如下:#include <stdio.h>void main(void)int a=3,b=4,c=5,x,y;x=!a+b<c&&(b!=c);y=c/b+(float)a/b&&(float)(a/c);printf("nx=%d,y=%d",x,y);x=a|b-;y=a-3&&c-;printf("n%d,%d,%d,%d,%d",a,b,c,x,y);先分析程序運行的結(jié)果,然后上機編輯和運行程序,并將運行的結(jié)果與分析的結(jié)果進行比較,若分析有誤,試找出原因。x=1,y=13,4,5,1,0【練習2-3】若有C源程序2-3.c,功能是輸入x的值,計算并輸出y1和y2的值。y1=,y2=當x<0y1=0,y2=0當x=0y1=2x,y2=3x當x>0程序內(nèi)容如下:#include <stdio.h>void main(void)float x,y1,y2;printf("Please enter x:");scanf("%f",&x);if(x<0)y1=2/x;y2=3/x;else if(x=0)y1=y2=0;elsey1=2*x;y2=3*x;printf("nx=%.2f,y1=.2f,y2=.2fn",x,y1,y2);(1)上機編輯和運行程序,驗證程序是否正確,若不正確,請找出錯誤的原因,修改后重新運行,直到實現(xiàn)既定的功能。#include <stdio.h>void main(void)float x,y1,y2;printf("Please enter x:");scanf("%f",&x);if(x<0)y1=5/x;y2=8/x;else if(x=0)y1=y2=0;elsey1=2*x;y2=3*x;printf("nx=%.2f,y1=%.2f,y2=%.2fn",x,y1,y2);If語句的嵌套(2)使用ifelse-if語句重寫上面的程序,并調(diào)試運行。#include <stdio.h>void main(void)float x,y1,y2;printf("Please enter x:");scanf("%f",&x);if(x<0)y1=5/x;y2=8/x;else if(x=0)y1=y2=0;elsey1=2*x;y2=3*x;printf("nx=%.2f,y1=%.2f,y2=%.2fn",x,y1,y2);【練習2-4】若有C源程序2-4.c,其內(nèi)容如下:#include <stdio.h>void main(void)int a,b,c,d,x;a=1,b=3,c=5,d=4;if(a<b)if(c<d) x=100;elseif(a<c)if(b<d) x=200;else x=500;else x=600;else x=700;printf("x=%dn",x);(1) 上面代碼的書寫格式非常糟糕,先分析該程序的執(zhí)行結(jié)果,然后上機編輯、調(diào)試和運行程序,認真體會良好的代碼書寫格式對讀程序的重要性。 x=200規(guī)范的程序書寫格式:#include <stdio.h>void main(void)int a,b,c,d,x;a=1,b=3,c=5,d=4;if(a<b)if(c<d) x=100;elseif(a<c)if(b<d) x=200; else x=500;else x=600;else x=700;printf("x=%dn",x);(2) 根據(jù)程序代碼,分別畫出其流程圖和N-S圖。【練習2-5】若有C源程序2-5.c,其內(nèi)容如下:#include <stdio.h>void main(void)int a,b,x,y;a=b=y=0,x=1;switch(x)case 1:switch(y)case 0:a+;break;case 1:b+;break;case 2:a+;b+;break;case 3:a+;b+;break;default:a+;b+;printf("a=%d,b=%dn",a,b);(1) 先分析程序運行的結(jié)果,然后上機編輯和運行程序,并將運行的結(jié)果與分析的結(jié)果進行比較,若分析有誤,試找出原因。a=2,b=1(2)若把第18行和第21行的break語句去掉,程序執(zhí)行的結(jié)果是否會變化?這說明了什么?a=4,b=3 (3)若把第5行中x=1改為x=4,程序執(zhí)行的結(jié)果是什么?若再把第22,23行一起移到第8行,執(zhí)行的結(jié)果有什么變化?a=1,b=1a=3,b=23. 上機編程【編程 2-1】在練習1-7中所給出的程序沒有考慮輸入三條邊后是否能夠構(gòu)成三角形的處理。請重新設(shè)計算法對以上問題進行處理,即輸入三角邊后先判斷是否構(gòu)成三角形,若構(gòu)成三角形則求出面積輸出,否則輸出構(gòu)不成三角形的信息。請畫出流程圖或N-S圖,并編寫程序上機調(diào)試運行。#include <stdlib.h>#include <stdio.h>#include <math.h>void main(void)int a,b,c;float s,area;printf("Please enter three sides a,b and c:");scanf("%d%d%d",&a,&b,&c);if(a+b>c&&abs(a-b)<c)s=1.0/2*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf("Three sides:a=%d,b=%d,c=%dn",a,b,c);printf("Area=%.1fn",area);elseprintf("Three sides:a=%d,b=%d,c=%dn",a,b,c);printf("這三條邊不能組成三角形!n");【編程 2-2】若實現(xiàn)從鍵盤上輸入一個字符,判斷并輸出該字符是以下哪一種的提示信息:字母;數(shù)字;空格;其他字符。如輸入1,則顯示的信息是:輸入的是數(shù)字字符1。請使用ifelse-if語句編程。#include <stdio.h>#include <math.h>void main(void)char c;printf("請輸入一個字符:");c=getchar();if(c>='A'&&c<='Z'|c>='a'&&c<='z')printf("輸入的是字母字符%cn",c);else if(c>='0'&&c<='9')printf("輸入的是數(shù)字字符%cn",c);else if(c='40')printf("輸入的是空格字符%cn",c);else printf("輸入的是其他字符%cn",c);【編程 1-3】若某企業(yè)根據(jù)銷售人員的銷售額發(fā)放提成,計算公式如下(s代表銷售額):s<200沒有提成200s<400提成5%400s<1200提成8%1200s<2400提成8%2400s<4000提成8%s4000請分別使用if和switch語句結(jié)構(gòu)分別編寫程序,實現(xiàn)從鍵盤上輸入銷售額,即輸出銷售額和提成。要求程序具有糾錯能力,如輸入負數(shù)就輸出非法數(shù)據(jù)的提示信息并結(jié)束程序。ifelse-if語句#include <stdio.h>#include <stdlib.h>void main(void)float s;float income;printf("請輸入銷售額:");scanf("%f",&s);if(s<0)printf("這是非法數(shù)據(jù)!n");exit(1);else if(s<200)printf("沒有提成!n");exit(1);else if(s<400)income=(s-200)*0.05;else if(s<1200)income=(s-400)*0.08+200*0.05;else if(s<2400)income=(s-1200)*0.1+800*0.08+200*0.05;else if(s<4000)income=(s-2400)*0.15+1200*0.1+800*0.08+200*0.05;else income=(s-4000)*0.18+1600*0.15+1200*0.1+800*0.08+200*0.05;printf("銷售額是:%.0f,提成是:%.0fn",s,income);Switchcase語句#include <stdio.h>#include <stdlib.h>void main(void)float s;float income;printf("請輸入銷售額:");scanf("%f",&s);if(s<0)printf("這是非法數(shù)據(jù)!n");exit(1);if(s<200)printf("沒有提成!n");exit(1);switch(int)(s/400)case 0:income=(s-200)*0.05;break;case 1:case 2:income=(s-400)*0.08+200*0.05;break;case 3:case 4:case 5:income=(s-1200)*0.1+800*0.08+200*0.05;break;case 6:case 7:case 8:case 9:income=(s-2400)*0.15+1200*0.1+800*0.08+200*0.05;break;default: income=(s-4000)*0.18+1600*0.15+1200*0.1+800*0.08+200*0.05;break;printf("銷售額是:%.0f,提成是:%.0fn",s,income);