270 likes | 443 Views
C. 语 言 程 序 设 计. Program Design in C Language. 武 汉 大 学 刘 英. 1.1 课程简介. 上课时间 :1-18 周 周 3 7-8 节课,上机 9-10 上课地点 :211201 手机: 15072489457 E-mail : yingliu@whu.edu.cn 课程网站: http://dayi.whu.edu.cn. 上机安排: 第 4 周 、 第 8 周 、第 12 周机房上课、上机。. 读程序. #include<stdio.h> int main(void)
E N D
C 语 言 程 序 设 计 Program Design in C Language 武 汉 大 学 刘 英
1.1 课程简介 • 上课时间:1-18周 周3 7-8节课,上机 9-10 • 上课地点:211201 • 手机:15072489457 • E-mail:yingliu@whu.edu.cn • 课程网站:http://dayi.whu.edu.cn • 上机安排:第4周、第8周、第12周机房上课、上机。
读程序 #include<stdio.h> int main(void) { int k=0,n; do { scanf("%d",&n); k+=n; } while(n!=-1); printf("k=%d n=%d\n",k,n); return 0; } 当运行以下程序时,从键盘键入1 2 3 4 5 -1 <回车> k=14 n=-1
写程序 【例4-20】用公式 求π的近似值,直到最后一项的绝对值小于10-6为止。 • 算法分析:此题是利用多项式之和的公式求π的近似值,当最后一项 时,求和结束。这就是循环的条件。显然,在循环开始前,循环的次数(求和的项数)是未知的,但有一个结束循环的条件:最后一项的绝对值小于10-6,这个值10-6是一个“标记值”,来表示“求和结束”。 • 分析多项式中的每一项,可以写出每项的通式为:,因此在循环体中执行的是:计算新的和值与本次的通项值。
写程序 从第2项开始有: n从1开始 循环条件:
写程序 /*【例4-20】利用多项式求和公式求π的近似值*/ #include <stdio.h> #include <math.h> int main(void) { double n=0,s=0,pi=0; do{ n+=1; s+=pow(-1,n+1)/(2*n-1); }while(1./(2*n-1)>=1e-6); pi=4*s; printf("π的近似值为= %.6f \n",pi); return 0; }
写程序 统计输入的字符个数,并输出它们,以“!”终止。 运行序列如下: 输入 if(chr==‘!’) 输出 a 假 a 5 假 5 $ 假 $ B 假 B ! 真 4 {char chr; int s; for( s=0; (chr=getchar( ))!=‘!’ ; s++) {chr=getchar( ) ; if (chr==‘!’) break; else printf(“%c”,chr);} printf(“s=%d\n”,s); } 如果if判断语句为真,则结束循环,执行循环结构后面的语句。 当输入字符为“!”时,chr==‘!’为真,结束for循环,执行循环结构后面的语句,即执行printf (“s=%d\n”,s)语句
写程序 【例4-14】 任意输入10个数找出其中的最大数和最小数。 #include <stdio.h> int main(void) { int max, min, x, n; printf("请输入第1个数:\n"); scanf("%d",&x); max = min = x; for (n=2;n<=10;n++) { printf("请输入第%d个数:\n",n); scanf("%d",&x); if (x> max) { max = x; continue; } if (x< min) min = x; } printf("最大数:%d;最小数:%d。\n",max,min); return 0; } 算法分析:首先设第一个数为最大数、最小数,然后将其余9个数分别与最大数、最小数进行比较,如果当前读的数x比最大数max还大,则将x的值赋给max。显然这时不需要再去比较数x与最小数min了,这时可以用continue语句。
写程序 输出如下图形: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
写程序 分析: 共有5行,外循环 i:1~5 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第一行输出4个空格,1个星号 第二行输出3个空格,3个星号 第三行输出2个空格,5个星号 …… 第五行输出0个空格,9个星号 空格用循环变量j控制,j=5-i 星号用循环变量k控制,k=2*i-1
写程序 程序 : #include <stdio.h> int main(void) { int i,j,k; for(i=1;i<=5;i++) { for(j=1;j<=5-i;j++) printf(“ ”); for(k=1;k<=2*i-1;k++) printf(“*”); printf(“\n”); } return 0; }
写程序 输出3~100中的所有素数。 算法分析: • 对于某个数n,如果从2到n-1都不能被n整除,则该数n为素数。 • 此处,除数2到n可以用一个for语句来表示: • for (i=2;i<=n-1;i=i+1) • 对于3~100之间的数,可以表示如下: for (n=3;n<=100;n=n+1)
写程序 程序 : #include <stdio.h> int main(void) { int n,i; for (n=3;n<=100;n=n+1) { for (i=2;i<=n-1;i=i+1) if (n%i==0) break; if (i>=n) printf("%d\t",n); } return 0; }
写程序 输出如下图所示的图形(回文塔)。
写程序 • 算法分析:图4-12为金字塔状图形,可将金字塔图形分解成3个小的三角形。第一个是1-1-5(左边)组成的直角三角形,第二个是1-4-1(右边)组成的直角三角形,第三个是在1-1-5左上角一个由空格组成的三角形。
写程序 #include <stdio.h> int main(void) { int i,j,k,s; for (i=1;i<=5;i++) { for (j=1;j<=5-i;j++) printf(" "); for (k=1;k<=2*i-1;k++) { if ( k < i) printf("%2d",k); else if (k==i) { s=k; printf("%2d",s);} else printf("%2d",--s); } printf("\n"); } return 0;}
写程序 按下述形式输出九九乘法表。 1 * 1 = 1 1 * 2 = 2 2 * 2 = 4 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 ······ 1 * 9 = 9 2 * 9 =18 ······ 9 * 9 = 81
写程序 • 算法分析:该九九表为一个九行九列呈阶梯状的图表。如果设相乘的两个数为i、j,两数相乘的乘积为m,j*i=m表示为一列。按行观察:第1行,只有一列,1*1=1;第2行,有2列,1*2= 2 2*2= 4,其中,第1列1*2中第2个数字为2与行号相同,第2列2*2中第2个数字也与行号相同,而第1个数字与列号相同,从1到2每列增1;第3行,有3列,1*3= 3 2*3= 6 3*3= 9,其中,每一列的第2个数字为3均与行号相同,而第1个数字从1到3每列增1。以此类推,每行每一列的第2个数字均相同且为行号,每行每一列的第1个数字从1开始每列增1,直到等于行号。定义i为行数的循环控制变量,j为列数的循环控制变量,因此,利用双重循环设计该程序,其中,外循环控制行数有for (i=1;i<=9;i++),内循环控制列数,对每一行,内循环有for (j=1;j<=i;j++)。
写程序 #include <stdio.h> int main(void) { int i,j; for (i=1;i<=9;i++ ) /*外循环为行*/ { for (j=1;j<=i;j++ ) /*内循环为列*/ { printf("%d*%d = %2d",j,i,i*j ); } printf("\n"); } return 0; }
上机练习 3.程序填空。 (1)下面程序实现的功能是:输入一个小写字母,将该字母循环后移5个字母位置后输出。如'a'变成'f','w'变成'b'。请在程序下划线处填上正确的内容,以实现程序的功能。
上机练习 #include <stdio.h> int main(void) { char c; c= ① ; if(c>='a'&& ② ) ③ ; else if(c>='v'&&c<='z') ④ ; putchar(c); return 0; }
上机练习 (2)下面程序的功能是分别计算1~10之间的奇数和与偶数和。请在程序下划线处填上正确的内容,以实现程序的功能。 #include <stdio.h> int main(void) { int a,b,c,i; a=c=0; for(i=0;i<=10;i+=2) { a+=i; ⑤ ; c+=b; } printf("偶数之和=%d",a); printf("奇数之和=%d", ⑥ ); return 0; }
上机练习 (3)下面程序的功能是求1~1000之间满足“用3除余2、用5除余3、用7除2”的数,且一行只打印5个数。请在程序下划线处填上正确的内容,以实现程序的功能。 #include <stdio.h> int main(void) { int i=1,j=0; do{ if ( ⑦ ) { printf("%4d",i); j=j+1; if ( ⑧ ) printf("\n"); } i=i+1; } while(i<=1000); return 0; }
上机练习 5.分析程序,写出程序执行的结果。 (1) #include <stdio.h> int main(void) { float a=2.0,b; if (a<10.0) b=1.0/a; else if((a<0.5)&&(a!=2.0)) b= 1.0/(a+2.0); else if(a<10.0) b= 1.0/a ; else b=10.0; printf("%f\n",b); return 0; }
上机练习 (2) #include <stdio.h> int main(void) { int a = 13, b = 21,m = 0; switch(a%3) { case 0: m ++;break; case 1: m ++; switch(b%2) { default: m++; case 0: m++; break; } } printf("%d\n",m); return 0; }
上机练习 (3) #include <stdio.h> int main(void) { int n=10; while (n>7) { n--; printf("%d ",n); } return 0; }
上机练习 (4) #include <stdio.h> int main(void) { int x, y; for(y=1,x=1;y<=50;y++) { if(x>=10) break; if (x%2==1) { x+=5; continue; } x-=3; } printf("y=%d\n",y); return 0; }