C语言程序设计章 (6)
C语言程序设计第06章 数组

1 4 2 3 思考: 0 0 0 0 0 注意:在定义数组时,如果没有为数组变量 1、如果想使一个数组中全部10个元 赋初值,那么就不能省略数组的大小。而且 素值为0,可以怎样写? a数组不初始化,其数组元素为随机值。 1 4 0 2 3 0 0 0 0 100 2、如果想使一个数组中全部 个元 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 素值为1,又该怎样写? 例当对全部数组元素赋初值时,可以省略数组变量的大 char str[ ] = {'a', 'b', 'c', 'd', 'e' }; (5) 则数组str的实际大小为5。 小,此时数组变量的实际大小就是初值列表中表达式的个数。
//超出了数组的大小
(3) 表达式1是第1个数组元素的值,表达式2是第2个 数组元素的值,依此类推; 例 int a[5] = {0, 1, 2, 3, 4}; 经过以上定义和初始化后, a[0] = 0,a[1] = 1,a[2] = 2,a[3] = 3,a[4] = 4。
9
(4) 如果表达式的个数小于数组的大小,则未指定值的 数组元素被赋值为0; 例 int a[10] = {0, 1, 2, 3, 4};
7
<6>C语言中规定数组元素的下标总是从0开始, 例如int a[10];说明整型数组a,有10个元素。这10个
元素是: a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8], a
[9]; 注意最后一个元素是a[9],而不是a[10],该数 组不存在数组元素a[10]。 并且特别值得注意的是,C编译器对数组下标越 界不作检查。
大学C语言程序设计 第六章

2.函数表达式: 2.函数表达式: 函数表达式
功能:将函数作为表达式的一部分。 功能:将函数作为表达式的一部分。 如: c=2*max(a,b); 要点:要求函数带回一个确定的值,以参加表达式的运算。 要点:要求函数带回一个确定的值,以参加表达式的运算。
3.一个函数作为另一个函数的参数: 3.一个函数作为另一个函数的参数: 一个函数作为另一个函数的参数
若不需要函数带回任何值,可使用: 若不需要函数带回任何值,可使用:
void printstar(){ …} } void print_message(){…} print_message(){ }
例exp6_5:函数返回值的类型与其定义的 exp6_5:函数返回值的类型与其定义的 类型不符的情况。 类型不符的情况。
一函数的定义重点二函数的调用重点1函数的一般调用2函数的嵌套调用3函数的递归调用三数组作为函数的参数难点四局部变量与全局变量难点五变量的存储类别难点六内部函数与外部函数1概述2函数定义的方法重点3函数的参数难点4函数的返回值难点1c程序的基本结构回顾2什么是函数
第六章
[教学要求] 教学要求]
函
数
1.理解函数的功能。 理解函数的功能。 2.掌握函数定义的一般形式(重点)。 掌握函数定义的一般形式(重点)。 掌握函数的形参与实参的对应关系、 3.掌握函数的形参与实参的对应关系、参数传递方法及函数返回值 的概念(难点) 的概念(难点) 。 掌握函数调用的基本方法(重点) 4.掌握函数调用的基本方法(重点) 。 掌握函数嵌套调用的一般过程(重点) 5.掌握函数嵌套调用的一般过程(重点) 。 了解函数递归调用的几种形式。 6.了解函数递归调用的几种形式。 掌握数组名作为函数的参数的一些特点(难点) 7.掌握数组名作为函数的参数的一些特点(难点) 。 8.掌握局部变量与全局变量的概念及它们的使用特点(难点) 。 掌握局部变量与全局变量的概念及它们的使用特点(难点) 掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 9.掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 10.了解内部函数与外部函数的含义。 10.了解内部函数与外部函数的含义。
C语言程序设计(第3版)第6章习题参考答案

gets(stridiom1);
printf("\nplease input the second idiom: ");
gets(stridiom2);
fnConcat(stridiom1,stridiom2);
printf("\nthe result is: %s",stridiom1)=0;
while(b[j] != '\0') /*把第二个字符串的内容连接到第一个字符串的后面*/
{
a[i+j] = b[j];
j++;
}
a[i+j]= '\0'; /*添加字符串结束符*/
}
void main()
{ char stridiom1[80],stridiom2[80];
i++;
}
a[j]= '\0'; /*添加字符串结束符*/
}
void main()
{ char stridiom1[80];
printf("\nplease input the first idiom: ");
gets(stridiom1);
fnConvert(stridiom1);
printf("\nthe result is: %s",stridiom1);
scanf("%d",&n);
printf("%ld",fnF(n));
getch();
}
(4)编一函数判别某一数是否为素数,若是,返回值为1,否则,返回值为0。
C语言程序设计第六章数组习题及答案

1.以下对一维整型数组a的定义,正确的是_。
(2分)A.int a(10) ;B.int n = 10 , a[n] ;C.int n ;scanf( "%d" , &n ) ;int a[n] ;D.int a[10] ;2.若有定义:int a[10] ;,则对a数组元素的正确引用是_。
(2分)A.a[10]B.a[3.5]C.a(5)D.a[10-10]3.对定义int a[10] = {6 , 7 , 8 , 9 , 10} ; 的正确理解是_。
(2分)A.将5个初值依次赋给a[1]--a[5]B.将5个初值依次赋给a[0]--a[4]C.将5个初值依次赋给a[6]--a[10]D.因为数组长度与初值个数不相同,所以此语句不正确4..若有定义:int a[3][4]; , 则对a数组元素的正确引用是_。
(2分)A.a[3][4]B.a[1,3]C.a[1+1][0]D.a(2)(1)5.以下对二维数组a初始化正确的语句是_。
(2分)A.int a[2][ ]={{0 , 1 , 2}, {3 , 4 , 5}};B.int a[ ][3]={{0, 1, 2}, {3, 4, 5}};C.int a[2][4]={{0, 1 , 2}, {3 , 4}, {5}};D.int a[ ][3]={{0, 1, 2}, { }, {3, 4}};6.对二维数组a进行如下初始化:int a[ ][3]={0 , 1 , 2 , 3 , 4 , 5};则a[1][1]的值是_。
(2分)A.0B.3C.4D.17.下面程序段的运行结果是_。
(2分)#include<stdio.h>int main( ){int i , x[3][3] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9} ;for( i = 0 ; i < 3 ; i++ )printf( "%2d" , x[i][2-i] ) ;return 0 ;}A.1 5 9B.1 4 7C.3 5 7D.3 6 98.以下对数组s的初始化,错误的是_。
第6章C语言程序设计

6.2函数
C语言中又规定在以下几种情况时可以省去主调函数中对 被调函数的函数说明。
本章目录
6.1函数分类 6.2函数
6.3 函数调用
6.4函数和数组 6.5变量的作用域 6.6变量的存储类别 6.7内部函数和外部函数
6.1函数分类 C语言中可从不同的角度对函数分类。
1. 从函数定义的角度,函数分为库函数和用户定义函数。
(1)库函数 由C系统提供,用户无须定义, 不必在程序中作类型说 明,需在程序前包含有该函数原型的头文件即可在程序中直接 调 用。如printf()、scanf()、getchar()、putchar ()等函数 均属库函数。 (2)用户定义函数 由用户按需要写的函数。用户自定义的函数在主调函数中对其 进行类型说明。
6.2函数
例6.2比较两个小朋友的个子,输出个子较高的。 float max(float a,float b) { if(a>b)return a; else return b; } void main() { float x,y,z; printf("input two numbers:\n"); scanf("%f,%f",&x,&y); z=max(x,y); printf("max=%f\n",z);
改例6.2如下:
6.2函数
main() { float max(float a,float b); float x,y,z; printf("input two numbers:\n"); scanf("%f,%f",&x,&y); z=max(x,y); printf("max=%f\n",z); } float max(float a,float b) { if(a>b)return a; else return b; }
C语言程序设计教案第6章21-24

【问题】两种排序算法哪一种排序效率更高,高在什么地方?
6.2嵌套与递归设计与应用(0.5学时)
教学内容
(1)函数的嵌套。
(2)函数的递归设计与应用。
讲解思路
(1)函数的嵌套
二维数组作为函数参数:用实例来说明数组传递数据的重要作用。
【实践】编写程序实现(1)中的例题。
5.4模块化设计中程序代码的访问和应用实例(1学时)
教学内容
(1)模块化设计中程序代码的访问。
(2)应用实例。
讲解思路
(1)模块化设计中程序代码的访问举例说明用指针可以访问程序代码。
(2)应用实例。
计算器增加一个连续相加的功能。
(3)教师程序编写:让学生观摩程序的编写、运行及产生结果的过程,与知识点一一对应,加深理解。
(4)学生用手机C语言模拟器编写程序:题目与例题类似,但小有变化,让学生在设计中的错误。
(5)问答:就一些知识点的变化与学生进行问答互动。
(6)就(4)和(5)中同学们的表现给出部分平时分,为了鼓励同学们的参与积极性,答对者加2-3分。
(3)掌握模块间批量数据传递的方法,提高综合应用程序设计的能力。
重点:简单的排序算法、嵌套与递归设计与应用、模块间的批量数据传递。
难点:递归调用、学生成绩管理综合用例。
教学方法及手段
(1)课件:根据本节课程设计的内容及计划安,逐步展现知识点。
(2)板书:针对学生在学习和练习过程中出现的问题,进行补充讲解。调节课堂节奏,给学生思考的时间。
模块化设计中程序代码的访问
应用实例
C语言程序设计 – 第 06 章课后习题
C语言程序设计– 第六章课后习题电子13-02班王双喜一、选择题1. C语言中一维数组的定义方式为:类型说明符数组名(C)A. [整型常量]B. [整型表达式]C. [整型常量]或[整型常量表达式]D. [常量表达式]2. C语言中引用数组元素时,下标表达式的类型为(C)A. 单精度型B. 双精度型C. 整型D. 指针型3. 若有定义:int a[3][4];,则对a数组元素的非法引用是(D)A. a[0][3*1]B. a[2][3]C. a[1+1][0]D. a[0][4](解释:A、B、C均正确,D看起来引用不太妥当,但其亦有其意义(a[0][4]等价于a[1][0]))4. 若有定义:int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};,则a数组的第一维大小是(C)A. 1B. 2C. 3D. 4(解释:共9个元素,除以3即可得第一维大小是3;若有余数,则应加1)5. 若有定义:int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,则值为5的表达式是(C)A. a[5]B. a[a[4]]C. a[a[3]]D. a[a[5]]6. 要求定义包含8个int类型元素的一维数组,以下错误的定义语句是(A)A. int N = 8;int a[N]; B. #define N 3while (a[2*N+2];C. int a[] = {0, 1, 2, 3, 4, 5, 6, 7};D. int a[1+7] = {0};(解释:数组的大小必须是整型常量或整型常量表达式)7. 若二维数组a有m列,则在a[i][j]前的元素个数为(A)A. i * m + jB. j * m + iC. i * m + i - 1D. i * m + j - 18. 下面是对数组s的初始化,其中不正确的是(D)A. char s[5] = {"abc"};B. char s[5] = {'a', 'b', 'c'};C. char s[5] = "";D. char s[5] = "abcdef";(解释:D中元素个数太多,算上'\0'共六个,非法)9. 下面程序段的运行结果是(B)char c[] = "\t\v\\\0will\n";printf("%d", strlen(c));A. 14B. 3C. 9D. 字符串中有非法字符,输出值不确定(解释:字符串中第四个是'\0'即结束标志,因此字符串长度是3)10. 判断字符串s1是否等于s2,应当使用(D)A. if (s1 == s2)B. if (s1 = s2)C. if (strcpy(s1, s2))D. if (strcmp(s1, s2) == 0)(解释:对于字符串来讲,其名字的内容是该字符串的起始地址,不能通过比较名字来比较相等,而应该用专用的函数进行逐字符匹配)二、写出程序的执行结果1. 程序一:# include <stdio.h>main(){int a[3][3] = {1, 3, 5, 7, 9, 11, 13, 15, 17};int sum = 0, i, j;for (i = 0; i < 3; i++)for (j = 0; j < 3; j++){a[i][j] = i + j;if (i == j) sum = sum + a[i][j];}printf("sum = %d", sum);}执行结果:打印sum = 6.(解释:a中各个元素的值是其行和列数字之和,sum内保存a中对角线元素之和,即sum = 0 + 2 + 4)2. 程序二:# include <stdio.h>main(){int i, j, row, col, max;int a[3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {-1, -2, 0, 5}};max = a[0][0]; row = 0; col = 0;for (i = 0; i < 3; i++)for (j = 0; j < 4; j++)if (a[i][j] > max){max = a[i][j];row = i;col = j;}printf("max = %d, row = %d, col = %d\n", max, row, col);}执行结果:打印max = 9, row = 1, col = 0.(解释:此程序的功能是逐行逐列扫描元素,总是将最大的元素赋给max,并保存该元素的行数和列数;因此执行完毕后,max是最大的元素(9),row是其行数(1),col是其列数(0))3. 程序三:# include <stdio.h>main(){int a[4][4], i, j, k;for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)a[i][j] = i - j;for (i = 0; i < 4; i++){for (j = 0; j <= i; j++)printf("%4d", a[i][j]);printf("\n");}}执行结果:第一行打印0;第二行打印1 0;第三行打印2 1 0;第四行打印3 2 1 0。
C语言程序设计课件第6章 类与对象
2021/7/13
18
【例6.5】 使用构造函数替代例6.3中SetTime() 成员函数,并在主函数中,使用构造函数设置 时间为15时19分56秒并显示该时间。 构造函数也可以重载。关于重载的概念将在第 7章详细介绍,这里先看一个例子。 【例6.6】 构造函数重载定义示例。
【2021例/7/163 .8】 构造函数的调用。
21
6.3.2 析构函数 1.析构函数的特点 当对象创建时,会自动调用构造函数进行初始 化。当对象撤消时,也会自动调用析构函数进 行一些清理工作,如释放分配给对象的内存空 间等。与构造函数类似的是:析构函数也与类 同名,但在名字前有一个“~”符号,析构函数 也具有公有属性,也没有返回类型和返回值, 但析构函数不带参数,不能重载,所以析构函 数只有一个。 【例6.9】 析构函数程序举例。
26
6.4 对象数组与对象指针 6.4.1 对象数组 对象数组是指数组的每一个元素都是相同类型对象的 数组,也就是说,若一个类有若干个对象,把这一系 列的对象用一个数组来表示。对象数组的元素是对象, 不仅具有数据成员,而且还有成员函数。
对象数组的定义和普通数组的定义类似,一般格式如 下: 类名 数组名[第一维大小][第二维数组大小] 其中,类名是指该数组元素属于该类的对象,方括号 内的数组大小给出了某一维元素的个数。一维对象数 组只有一对方括号,二维对象数组要有两个方括号对, 等等。
25
普通构造函数在建立对象时被调用,而复制构造函数
在用已有对象初始化一个新对象时被调用。复制构造
函数被调用通常发生在以下3种情况:
(1)程序中需要新建一个对象并用一个类的对象
C语言程序设计教程第六章课后习题参考答案
C语⾔程序设计教程第六章课后习题参考答案P158 1求三个实数最⼤值#includefloat max(float,float,float);int main(){float a,b,c,m;printf("请输⼊三个实数:");scanf("%f %f %f",&a,&b,&c);printf("最⼤数为%f\n",max(a,b,c));return 0;}float max(float a,float b,float c){float t;if(a>b&&a>c)t=a;else if(b>a&&b>c)t=b;elset=c;return t;}P158 2求最⼤公约数最⼩公倍数#includeint fun1(int a,int b);int fun2(int a,int b);int main(){int a,b;printf("请输⼊两个整数:");scanf("%d %d",&a,&b);printf("最⼤公约数为:%d\n",fun1(a,b));int t,r;if(a{t=a;a=b;b=t;}while((r=(a%b))!=0) {a=b;b=r;}return b;}int fun2(int a,int b) {int n;n=(a*b)/fun1(a,b); return n;}P158 3求完全数#includevoid wan(int n); void main(){int n;for(n=1;n<1000;n++) wan(n);printf("\n");}void wan(int n){if(n%i==0)s=s+i;}if(n==s)printf("%d\t",n); }P158 4⽆暇素数#include#includeint nixvshu(int n);int isPrime(int n);int main(){int n,t;printf("⽆暇素数:\n");for(n=100;n<=999;n++) {t=nixvshu(n);if(isPrime(n)&&isPrime(t)) printf("%d\t",n);}printf("\n");return 0;}int nixvshu(int n){int x=0;while(n){x=x*10+n%10;n=n/10;}return x;int i;for(i=2;i<=sqrt(n);i++)if(n%i==0) return 0;return n;}P158 7递归函数#includeint Y(int n){if(n==0)return 0;if(n==1)return 1;if(n==2)return 2;elsereturn (Y(n-1)+Y(n-2)+Y(n-3)); } int main(){int n,k=0;for(n=0;n<=19;n++){printf("%d\t",Y(n));k++;if(k%5==0)printf("\n");}return 0;}P124 6分解质因数#include#includevoid fenjie(int );int main(){int n;printf("请输⼊⼀个正整数:"); scanf("%d",&n);if(isPrime(n)){printf("%d=1*%d\n",n,n);}else{fenjie(n);printf("\n");}return 0;}int isPrime(int n){int i;for(i=2;i<=sqrt(n);i++){if(n%i==0) return 0;}return 1;}int zhi(int n){int m;for(m=2;m<=n;m++){if(isPrime(m)&&(n%m==0)) break;void fenjie(int n){int m;printf("%d=%d",n,zhi(n));while(n>zhi(n)){m=zhi(n);n=n/m;printf("*%d",zhi(n));}}P47 1输出闰年#includeint f(int year);int main(){int year,k=0;for(year=1900;year<=2000;year++){if(f(year)){printf("%d\t",year);k++;if(k%5==0)printf("\n");}}return 0;}int f(int year){if((year%4==0&&year%100!=0)||(year%400==0)) return year;P47 2输出回⽂数#includeint fun(int n);int main(){int n,k=0;for(n=10;n<=2000;n++) {if(n == fun(n)){printf("%d\t",n);k++;if(k%5==0)printf("\n");}}return 0;}int fun(int n){int i=0;while(n>0){i=i*10+n%10;n=n/10;}return i;}P47 3进制转换#includevoid trans(int n,int base); int main()printf("请输⼊要转换的⼗进制数:"); scanf("%d",&n);printf("请输⼊转换的进制:"); scanf("%d",&base);trans(n,base);printf("\n");return 0;}(⽅法⼀)void trans(int n,int base){if(n){trans(n/base,base);if(n%base>=10)switch(n%base){case 10:printf("A");break;case 11:printf("B");break;case 12:printf("C");break;case 13:printf("D");break;case 14:printf("E");break;case 15:printf("F");break;}elseprintf("%d",n%base);}}(⽅法⼆)void trans(int n,int base){int r;char c;trans(n/base,base); r=n%base;if(r>=10)c='A'+r-10;elsec='0'+r;printf("%c",c);}}。
高树芳C语言程序设计--第六章
[解决方案]设置一个长度为10的类型为整型的数组
存储老题的年龄。
程序代码
5
6.1 一维数组的定义与使用
相关知识: 1.数组的概念 同类型的一组数据。 2.数组的维数 下标的个数 3.一维数组的定义 类型 数组名[常量表达式] 4.一维数组元素的引用 数组名[下标],如:a[1]
6
6.1 一维数组的定义与使用
案例6-10 输出中文大写数字 [案例任务] C语言的字符串知识
[解决方案]使用两维字符数组存储汉字的“壹”
和“拾”等字符串数据。
程序代码
28
6.3字符数组及字符串
相关知识: C语言的字符串知识应用: 数字转换为中国大写汉字数字字符。
29Biblioteka 编写C程序,输入8个整数,将其逆序输出,同 时要输出它们的和。
10
6.2 二维数组的定义与使用
案例6-4 求二维数组中最大数 案例6-5 整数四则运算测试程序
11
6.2 二维数组的定义与使用
案例6-4 求二维数组中最大数
[案例任务]
对于如下3×4的矩阵: 1 2 3 4 6 9 5 4 -10 10 0 -5 编程求出其中的最大值,并输出其所在的行 号和列号。
24
6.3字符数组及字符串
[课堂训练6-4] 统计字符数组中某类字符的个数。设有 一个长度不超过30的字符串s,统计其 中数字字符、大写字母、小写字母、其 它字符的个数。
25
6.3字符数组及字符串
案例6-9字符串处理函数 [案例任务] 从键盘输入两个字符串s1,s2,要求使用 字符串的常用处理函数strlen、strcat、 strcpy、strcmp等。
[解决方案]见流程图。
程序代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
05
printf("please input n:");
06
scanf("%d",&n);
07
do
08
{
09
s*=i;
10
i++;
11
}
12
while(i<=n);
13
printf("%d!=%ld\n", n, s);
14 }
/*求乘积时,乘积 s 应赋初值 1*/
/*循环控制变量 i 增 1*/ /* ";"不可省 */ /* %ld 表示输出长整型变量*/
1! = 1 2! = 2*1 = 2*1! 3! = 3*2*1 = 3*2! 4! = 4*3*2*1 = 4*3!
n! = n*(n-1)*(n-2)*…*2*1 = n*(n-1)!
令 s=1,i 从 1 逐步增加,反复执行 s=s*i,直到 i 等于 n,即可得到 n!。 程序流程图如图 6.4 所示。
图6.7 for循环语句流程图 22
第6章 循环结构程序设计 【例6-6】 用for语句求解1~100的累计和。
01 main()
02 {
03
int i,sum=0;
04
for(i=1; i<=100; i++)
05
sum += i;
06
printf("sum=%d\n",sum);
07 }
/*将累加器 sum 初始化为 0*/ /*实现累加,循环结束时 i=101*/
08
{
09
s*=i;
10
i++;
11
}
12
printf("%d!=%ld\n", n, s);
13 }
程序运行结果如图 6.5 所示。
/*求乘积时,乘积 s 应赋初值 1 */
/*循环控制变量 i 增 1*/ /* %ld 表示输出长整型变量*/
13
第6章 循环结构程序设计
图6.5 例6-3运行结果 14
09
printf("sum=%d\n",sum);
10 }
/*定义并初始化循环控制变量以及累计器*/
/*实现累加*/ /*循环控制变量 n 增 1*/
18
第6章 循环结构程序设计 【例6-5】 用do-while语句求n!。 编程如下:
01 main()
02 {
03
int n,i=1;
04
long int s=1;
23
第6章 循环结构程序设计 【例6-7】 用for语句求n!。
01 main()
02 {
03
int n,i=1;
04
long int fact=1;
05
printf("please input n:");
06 scanf("%d",&n);
07
for(i=1; i<=n; i++)
08
fact *= i;
09
printf("%d!=%ld\n", n, fact);
10 }
/*求乘积时,乘积 fact 应赋初值 1*/ /* %ld 表示输出长整型变量*/
24
第6章 循环结构程序设计
(3) 说明。 ① 表达式1、表达式2和表达式3均可缺省,甚至全部缺省, 但其间的分号“;”绝对不能省略。例如可将例6-6中的for语 句改写成以下几种形式:
19
第6章 循环结构程序设计
6.4 for语句
在3条循环语句中,for语句最为灵活,不仅可用于循环次 数已经确定的情况,也可用于循环次数虽不确定,但给出了循 环继续的条件的情况。
(1) 语句格式: for ( [表达式1];[表达式2];[表达式3] ) { 循环体语句组;}
当循环体语句组仅由一条语句构成时,可以不使用复合语 句形式。
第6章 循环结构程序设计
第6章 循环结构程序设计
6.1 引例 6.2 while语句 6.3 do-while语句 6.4 for语句 6.5 几种循环的比较 6.6 循环嵌套 6.7 break和continue语句 6.8 案例学习
1
第6章 循环结构程序设计
6.1 引 例
【例6-1】 求1~100的累计和。 分析:根据已有的知识,可以用“1+2+…+100”来求解, 但显然很繁琐。现在换个思路来考虑:首先设置一个累计器 sum,其初值为0,利用sum += n来计算(n依次取1,2,…, 100),只要解决以下3个问题即可: (1) 将n的初值置为1; (2) 每执行1次sum += n后,n增1; (3) 当n增到101时,停止计算,此时,sum的值就是1~ 100的累计和。程序流程如图6.1所示。
01 main()
02 {
03
int sum=0, n=1;
04
loop: sum += n; n++;
05
if (n<=100) goto loop;
06
printf("sum=%d\n", sum);
07 }
/*定义并初始化循环控制变量,以及累计器*/ /* loop: 为语句标号*/ /*如果 n≤100,则转向 loop 所在的语句行执行*/ /*输出 sum 的值 */
16
第6章 循环结构程序设计
图6.6 do-while循环语句流程图 17
第6章 循环结构程序设计 【例6-4】 用do-while语句求解1~100的累计和。
01 main()
02 {
03
int sum=0, n=1;
04
do
05
{ sum += n;
06
n++;
07
}
08
while(n<=100);
06
n++;
07
}
08
printf("sum=%d, n=%d\n",sum,n);
09 }
31
第6章 循环结构程序设计
图6.8 例6-8运行结果 32
第6章 循环结构程序设计 【例6-9】 用do-while语句编写程序,写出其运行结果。
01 main()
02 {
03 int sum=0, n=101;
for ( sum=0; i<=100; i++) sum += i;
for (sum=0,i=1; i<=100; i++) sum += i;
④ 表达式2部分是一个逻辑量,除一般的关系(或逻辑)表 达式外,也允许是数值(或字符)表达式。
29
第6章 循环结构程序设计
6.5 几种循环的比较
1.while语句和do-while语句的区别 两者的重要区别在于:执行循环体时,对作为循环条件的 表达式求值和验证的时间不同。while语句先判断循环条件是 否满足,然后再执行循环体语句,故循环体语句有可能一次都 不被执行;而do-while语句先执行循环体语句,然后再判断循 环条件是否满足,故循环体语句至少被执行一次。例如下面的 程序,分别用while语句和do-while语句实现。
2
第6章 循环结构程序设计
图6.1 例6-1流程图 3
第6章 循环结构程序设计 在C语言中,可用以下语句实现循环: (1) for语句。 (2) do-while语句。 (3) while语句。 (4) goto语句和if语句构成循环。
4
第6章 循环结构程序设计 使用goto语句实现求解1~100累计和的程序如下:
sum += i;
i++;
}
i=1; while (1 ) { if (i>100) break; sum += i; i++; }
28
第6章 循环结构程序设计 ② 当循环体语句组仅由一条语句构成时,可以不使用复 合语句形式,如例6-6、例6-7所示。 ③ 表达式1既可以是给循环变量赋初值的赋值表达式,也 可以是与此无关的其它表达式(如逗号表达式)。 例如:
7
第6章 循环结构程序设计
图6.2 while循环语句流程图 8
第6章 循环结构程序设计 【例6-2】 用while语句求1~100的累计和。
01 main()
02 {
03
int sum=0, n=1;
/*定义并初始化循环控制变量以及累计器*/
04
while( n<=100 )
05
{ sum += n;
5
第6章 循环结构程序设计
6.2 while语句
(1) 语句格式: while (表达式) {循环体语句组;}
循环体如果只有一条语句组成,可以不用花括号括起来 (即不用写成复合语句形式)。
6
第6章 循环结构程序设计 (2) 执行过程。while循环语句的执行过程如图6.2所示。 ① 求解表达式,如果其值为真(非0),转②;否则转③。 ② 执行循环体语句组,然后转①。 ③ 执行while语句的下一条。 (3) 特点:先判断表达式,后执行循环体语句。
{ if (i>100) break;
/*如果 i>100,结束循环*/
sum += i;
}
/*注:break 语句将在 6.7 节介绍,若无此语句,循环将无休止地进行下去*/
27