《实验2用用C语言编写程序.ppt》由会员分享,可在线阅读,更多相关《实验2用用C语言编写程序.ppt(99页珍藏版)》请在三一办公上搜索。
1、Chap 1 用C语言编写程序,1.1 在屏幕上显示 Hello World!1.2 求华氏温度 100F 对应的摄氏温度1.3 计算分段函数1.4 输出华氏摄氏温度转换表1.5 生成乘方表与阶乘表,本章要点,怎样编写程序,在屏幕上显示一些信息?怎样编写程序,实现简单的数据处理,例如将华氏温度转换为摄氏温度?怎样使用 if 语句计算分段函数?怎样用 for 语句求 1+2+100?如何定义和调用函数生成一张乘方表?,1.1 在屏幕上显示Hello World!,例1-1 在屏幕上显示一个短句:Hello World!,1.1 在屏幕上显示Hello World!,/*显示“Hello Worl
2、d!”*/注释文本#include int main(void)主函数 printf(“Hello World!n”);语句结束 return 0;输出函数 换行符,1.任何程序都有主函数1.程序由若干语句组成3.语句由;结束,1.1 在屏幕上显示一些信息,例1-2 在屏幕上显示:Programming is fun!And Programming in C is even more fun!#include 编译预处理命令int main(void)printf(Programming is fun!n);printf(And Programming in C is even more fu
3、n!n);return 0;,1.2 求华氏温度 100F 对应的摄氏温度,摄氏温度 C=(5/9)(F-32)1.2.1 程序解析1.2.2 常量、变量和数据类型1.2.3 算术运算和赋值运算1.2.4 格式化输出函数printf,1.2.1 程序解析,例1-3 求华氏温度 100F 对应的摄氏温度。摄氏温度 C=(5/9)(F-32)#include int main(void)int celsius,fahr;变量定义 fahr=100;变量使用 celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);输出结果 ret
4、urn 0;,输出:fahr=100,celsius=37,1.2.2 常量、变量和数据类型,int celsius,fahr;celsius=5*(fahr-32)/9;数据常量:在程序运行过程中,其值不能被改变 变量:在程序运行过程中,其值可以被改变 数据类型常量:5 和 9是整型常量(整数)变量:在定义时指定,变量的定义,变量定义的一般形式:类型名 变量名表;例如:int celsius,fahr;定义整型变量float x;定义单精度浮点型变量double area,length;定义双精度浮点型变量double型数据比float精度高,取值范围大,变量名:小写字母;见名知义,变量的定
5、义,定义变量时要指定变量名和数据类型类型名 变量名表;int celsius,fahr;float x;double area,length;变量名代表内存中的一个存储单元存放该变量的值该存储单元的大小由变量的数据类型决定C语言中的变量代表保存数据的存储单元数学中的变量代表未知数 x=x+1,变量的定义与使用,变量必须先定义,后使用。#include int main(void)int celsius,fahr;fahr=100;celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);return 0;,一个变量名只能定义一
6、次变量一般都定义在程序的头上不能定义在程序的中间或后面,应该先赋值,后引用,1.2.3 算术运算和赋值运算,fahr=100;celsius=5*(fahr-32)/9;1、算术运算双目算术运算符:+-*/%算术表达式:用算术运算符将运算对象连接起来的符合C语言语法规则的式子 数学式:(5/9)(F-32)C表达式:5*(fahr-32)/9 或者:数学式:s(s-a)(s-b)(s-c)C表达式:,算术运算,双目算术运算符:+-*/%算术表达式:用算术运算符将运算对象连接起来的符合C语言语法规则的式子 注意/整数除整数,得整数如:1/2 0,9/4 2?5*(fahr-32)/9 和 5/9
7、*(fahr-32)等价吗%针对整型数据如:565,941,10040双目运算符两侧操作数的类型要相同,赋值运算,赋值运算符=赋值表达式:用=将一个变量和一个表达式连接起来的式子 变量 表达式例如:fahr=100;celsius=5*(fahr-32)/9;计算赋值运算符右侧表达式的值将赋值运算符右侧表达式的值赋给左侧的变量,的左边必须是一个变量,1.2.4 格式化输出函数printf,数据输出:格式化输出函数 printf#include printf(Hello World!n);printf(fahr=%d,celsius=%dn,fahr,celsius);printf(格式控制字符
8、串,输出参数1,输出参数n);,用双引号括起来,表示输出的格式,要输出的数据,printf格式控制字符串,printf(Hello World!n);printf(fahr=%d,celsius=%dn,fahr,celsius);printf(Hin,fahr);格式控制字符串:普通字符:原样输出格式控制说明:按指定的格式输出数据,%与数据类型有关int型:%dfloat double型:%fprintf(fahr=%d,celsius=%dn,fahr,celsius);,输出:fahr=100,celsius=37,1.3 计算分段函数,1.3.1 程序解析1.3.2 关系运算1.3.3
9、 if-else语句1.3.4 格式化输入函数scanf1.3.5 常用数学库函数,1.3.1 程序解析,例1-4 分段计算水费要解决的问题:输入计算分段函数输出,并保留2位小数 求ex,1.3.1 程序解析求分段函数,#include int main(void)double x,y;printf(Enter x(x=0):n);/*输入提示*/scanf(%lf,Enter x(x=0):9.5f(9.500000)=11.67,Enter x(x=0):15f(12.000000)=20.00,数据必须输入吗?,Enter x(x=0):21.3f(21.300000)=41.75,1.
10、3.2 关系运算,x y x=y x!=y关系表达式:用关系运算符将2个表达式连接起来的式子。如:x=1,区分=和=,运用关系表达式,表示比较的数学式 C关系表达式x10 x10 x10 x=10,x=10 x!=10 x=10,用关系表达式描述条件判断 x 是否为负数x 0判断 x 是否不为零x!=0,1.3.3 if-else语句,if(表达式)语句1else 语句2,if(x=15)y=4*x/3;else y=1.5*x-10.5;,计算二分段函数,if(表达式)语句1else 语句2,if(x!=0)y=1/x;else y=0;,源程序,#include int main(void
11、)double x,y;printf(Enter x:n);scanf(%lf,#include/*例1-4*/int main(void)double x,y;printf(Enter x(x=0):n);scanf(%lf,运行结果,#include int main(void)double x,y;printf(Enter x:n);scanf(%lf,input x:1.5f(1.50)=0.4,input x:0f(0.00)=0.0,软件测试的基本思想,软件测试精心设计一批测试用例 输入数据,预期输出结果,然后分别用这些测试用例运行程序,看程序的实际运行结果与预期输出结果是否一致。
12、,input x:1.5f(1.50)=0.4,input x:0f(0.00)=0.0,if(x!=0)y=1/x;else y=0;,if(x=15)y=4*x/3;else y=1.5*x-10.5;,Enter x(x=0):9.5f(9.500000)=11.67,Enter x(x=0):15f(12.000000)=20.00,Enter x(x=0):21.3f(21.300000)=41.75,1.3.4 格式化输入函数scanf,数据输入:格式化输入函数 scanf#include scanf(%lf,用双引号括起来,表示输入的格式,变量地址,scanf格式控制字符串,格式
13、控制字符串:格式控制说明:按指定的格式输入数据,%与数据类型有关int型:%dfloat型:%fdouble型:%lf普通字符:原样输入例如:scanf(%lf,输入:9.5,scanf(x=%lf,输入:x=9.5,尽量不要出现普通字符,改进例1-3的程序,例1-3 求华氏温度 100F 对应的摄氏温度。摄氏温度 C=(5/9)(F-32)#include int main(void)int celsius,fahr;fahr=100;celsius=5*(fahr-32)/9;printf(fahr=%d,celsius=%dn,fahr,celsius);return 0;,scanf(
14、%d,printf(“Enter fahr:n);,Enter fahr:100fahr=100,celsius=37,1.3.5 常用数学库函数,库函数C语言处理系统提供事先编好的函数,供用户在编程时调用。scanf(),printf(),exp()在相应的系统文件(头文件)中定义一些必需的信息。#include命令用户调用库函数时,将相应的头文件包含到源程序中。例如调用scanf,printf,需要#include 调用sqrt,需要#include,常用数学库函数,平方根函数 sqrt(x)绝对值函数 fabs(x)fabs(-3.56)的值为3.56幂函数 pow(x,n):xnpow
15、(1.1,2)的值为1.21(即1.12)指数函数 exp(x):exexp(1.3)的值为e1.3以e为底的对数函数 log(x):ln xlog(123.45)的值为4.815836以10为底的对数函数 log10(x):log10 xlog10(123.45)的值为1.091491。,例1-5 计算存款的本息,输入存款金额 money、存期 year 和年利率 rate,根据公式计算存款到期时的本息合计sum(税前),输出时保留2位小数。sum=money(1+rate)year,sum=money*pow(1+rate),year),例1-5 程序,#include#include i
16、nt main(void)int money,year;double rate,sum;printf(“Enter money:);scanf(%d,Enter money:1000Enter year:3Enter rate:0.025sum=1076.89,scanf(%d%d%lf,调用scanf函数输入多个数据,scanf(%d%d%lf,程序运行时,输入的多个数据之间必须有间隔。,scanf(%d%lf%d,如何输入?,输入参数、格式控制说明、输入数据,1.4 输出华氏摄氏温度转换表,1.4.1 程序解析1.4.2 for语句1.4.3 指定次数的循环程序设计,1.4.1 程序解析,
17、例1-6输入2个整数lower和 upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是lower,upper,每次增加1F。fahr celsius 30-1.1 31-0.6 32 0.0 33 0.6 34 1.1 35 1.7,1.4.1 程序解析-温度转换表,#include int main(void)int fahr,lower,upper;double celsius;printf(Enter lower:);scanf(%d,fahr=fahr+1,Enter lower:30Enter upper:35fahr celsius 30-1.1 31-0.6 32 0.0
18、 33 0.6 34 1.1 35 1.7,例1-8中for语句的流程,for(fahr=lower;fahr=upper;fahr+)celsius=(2.0/9.0)*(fahr-32);printf(%d%6.1fn,fahr,celsius);,fahr=fahr+2输出?,Enter lower:30Enter upper:35fahr celsius 30-1.1 31-0.6 32 0.0 33 0.6 34 1.1 35 1.7,for(表达式1;表达式2;表达式3)循环体语句实现C语句的重复执行,1.4.2 for语句循环语句,3个表达式、循环体语句!书写顺序和执行顺序不同!
19、表达式1只执行一次,循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行for(fahr=lower;fahr=upper;fahr+)celsius=(2.0/9.0)*(fahr-31.0);printf(%d%6.1fn,fahr,celsius);,for语句中的循环变量,赋初值,判断其值,改变其值,for(fahr=lower;fahr=upper;fahr+)celsius=(2.0/9.0)*(fahr-31.0);printf(%d%6.1fn,fahr,celsius);,表达式1:给循环变量赋初值,指定循环的起点。fahr=lower表达式2:给出循环
20、的条件,决定循环的继续或结束。fahr=upper表达式3:设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。fahr+语句:被反复执行的语句,一条语句。,for语句的说明,for(fahr=lower;fahr=upper;fahr+)celsius=(2.0/9.0)*(fahr-31.0);printf(%d%6.1fn,fahr,celsius);,for(fahr=lower;fahr=upper;fahr=fahr+1)celsius=(2.0/9.0)*(fahr-31.0);printf(%d%6.1fn,fahr,celsius);,复合语句 和空语句;,for(
21、fahr=lower;fahr=upper;fahr=fahr+1);celsius=(2.0/9.0)*(fahr-31.0);printf(%d%6.1fn,fahr,celsius);,!不要在for语句中随意加分号,求 1+2+100抽取具有共性的算式:sum=sum+i sum初值为0,该算式重复100次,i从1变到100设i为循环变量,则:指定循环起点的表达式1:i=1给出循环条件的表达式2:i=100设置循环步长的表达式3:i+循环体语句:sum=sum+i;for(i=1;i=100;i+)sum=sum+i;,1.4.3 指定次数的循环程序设计,/*计算1+2+3+100*/
22、#include int main(void)int i,sum;sum=0;/*置累加和sum的初值为0*/for(i=1;i=100;i+)/*循环重复100次*/sum=sum+i;/*反复累加*/printf(“sum=%dn”,sum);/*输出累加和*/return 0;,源程序求 1+2+100,for(i=1;i=100;i+)sum=0;sum=sum+i;,sum=5050,#include int main(void)int i,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%dn”,sum);return 0;,求 1
23、+1/2+1/3+1/100,for(i=1;i=100;i+)sum=sum+1.0/i;,int i;double sum;,printf(“sum=%fn”,sum);,一般包含四个部分:初始化:指定循环起点给循环变量赋初值,如i=1;进入循环之前,设置相关变量的初值,如sum=0。条件控制:只要i 100,循环结束。,指定次数的循环程序设计,输入一个正整数n,求前n项和,即循环n次#include int main(void)int i,sum;sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“sum=%dn”,sum);return 0;,例1-7 求
24、 1+2+3+n,for(i=1;i=n;i+)sum=sum+i;,printf(“Enter n:);scanf(%d,Enter n:100Sum=5050,#include int main(void)int i,sum;printf(“Enter n:);scanf(%d,求1+1/2+1/3+1/n,#include int main(void)int i;double sum;printf(“Enter n:);scanf(%d,求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i+)sum=sum+item(第i项)item=1.0/(2*i-1),求 1+1/3+
25、1/5+的前n项和,#include int main(void)int i,n;double item,sum;printf(“Enter n:);scanf(%d,源程序求 1+1/3+1/5+,求前n项和,即循环n次,每次累加1项。for(i=1;i=n;i+)sum=sum+item(第i项)item=flag*1.0/denominator denominator=denominator+2flag=-flag,例1-8 求 1-1/3+1/2-的前n项和,item=flag*1.0/(2*i-1),#include int main(void)int denominator,fla
26、g,i,n;double item,sum;printf(“Enter n:);scanf(%d,例1-8 源程序,n!=1*2*nfor(i=1;i=n;i+)product=product*item(第i项)item=i,例1-9 求n!,product=?,#include int main(void)int i,n;double product;printf(input n:n);scanf(%d,例1-9 源程序,输入实数x和正整数n,计算xn=x*x*xfor(i=1;i=n;i+)power=power*item(第i项)item=?,求 xn,#include int main
27、(void)int i,n;double x,power;printf(“Enter x,n:n);scanf(%lf%d,源程序求 xn,1.5 生成乘方表和阶乘表,1.2.1 程序解析1.2.2 结构化程序设计思想,1.2.1 程序解析,例1-10(1)输入一个正整数n,生成一张2的乘方表,输出20到2n的值,可以调用幂函数计算2的乘方。,for(i=0;i=n;i+)power=pow(2,i);/*调用幂函数pow(2,i)计算2的i次方*/输出power的值;,源程序生成乘方表,#include#include int main(void)int i,n;double power;p
28、rintf(Enter n:);scanf(%d,Enter n:4pow(2,0)=1pow(2,1)=2pow(2,2)=4pow(2,3)=8pow(2,4)=16,例1-10(2)生成阶乘表,输入一个正整数n,生成一张阶乘表,输出0!到n!的值。要求定义和调用函数fact(n)计算n!,函数类型是double。,for(i=0;i=n;i+)power=pow(2,i);/*调用幂函数pow(2,i)计算2的i次方*/输出power的值;,for(i=0;i=n;i+)product=fact(i);/*调用自定义函数fact(i)计算i!*/输出product的值;,源程序生成阶乘表
29、,#include double fact(int n);/*自定义函数的声明*/int main(void)int i,n;double result;printf(Enter n:);scanf(%d,Enter n:30!=11!=12!=23!=6,double fact(int n)/*函数首部*/int i;double product;product=1;for(i=1;i=n;i+)product=product*i;return product;/*将结果回送主函数*/,1.2.2 结构化程序设计思想,结构化程序设计(Structured Programming)程序设计技术
30、C语言是结构化程序设计语言强调程序设计的风格和程序结构的规范化,提倡清晰的结构,其基本思路是将一个复杂问题的求解过程划分为若干阶段,每个阶段要处理的问题都容易被理解和处理。按自顶向下的方法对问题进行分析、模块化设计和结构化编码等3个步骤。,自顶向下的分析方法,把大的复杂的问题分解成小问题后再解决面对一个复杂的问题,首先进行上层(整体)的分析,按组织或功能将问题分解成子问题,如果子问题仍然十分复杂,再做进一步分解,直到处理对象相对简单,容易处理为止。当所有的子问题都得到了解决,整个问题也就解决了。每一次分解都是对上一层的问题进行细化和逐步求精,最终形成一种类似树形的层次结构,来描述分析的结果。,
31、学生成绩统计程序的层次结构图,模块化设计,将模块组织成良好的层次系统,顶层模块调用其下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。遵循模块独立性的原则,即模块之间的联系应尽量简单。一个模块只完成一个指定的功能。模块之间只通过参数进行调用。一个模块只有一个入口和一个出口。模块内慎用全局变量。,结构化编码,选用顺序、选择和循环三种控制结构,使程序具有良好的风格。对变量、函数、常量等命名时,要见名知意,有助于对变量含义或函数功能的理解。在程序中增加必要的注释,增加程序的可读性。程序要清晰易懂,语句构造要简单直接,一行写一条语句,
32、采用缩进格式。程序有良好的交互性,输入有提示,输出有说明,并尽量采用统一整齐的格式。,Chap 2 函数,2.1 计算圆柱体积2.2 使用函数编写程序2.3 变量与函数,本章要点,怎样定义函数?如何调用函数?如何声明函数?什么是函数的参数?在函数调用时,参数是如何传递的?在使用函数的过程中,要注意哪些问题?怎样确定函数的参数?如何使用局部变量和全局变量?什么是静态变量?,2.1 计算圆柱体积,2.1.1 程序解析2.1.2 函数的定义2.1.3 函数的调用,2.1.1 程序解析计算圆柱体积,例2-1 输入圆柱体的高和半径,求圆柱体积,volume=*r2*h。要求定义和调用函数cylinder
33、(r,h)计算圆柱体的体积。,例2-1源程序,/*计算圆柱体积*/#include int main(void)double height,radius,volume;double cylinder(double r,double h);/*函数声明*/printf(Enter radius and height:);scanf(%lf%lf,例2-1源程序,/*定义求圆柱体积的函数*/double cylinder(double r,double h)double result;result=3.1415926*r*r*h;/*计算体积*/return result;/*返回结果*/,Ent
34、er radius and height:3.0 10Volume=281.743,2.1.2 函数的定义,函数是指完成一个特定工作的独立程序模块。库函数:由C语言系统提供定义如scanf()、printf()等函数自定义函数:需要用户自己定义如计算圆柱体体积函数cylinder()main()也是一个函数,C程序由一个main()或多个函数构成。程序中一旦调用了某个函数,该函数就会完成一些特定的工作,然后返回到调用它的地方。函数经过运算,得到一个明确的运算结果,并需要回送该结果。例如,函数cylinder()返回圆柱的体积。函数完成一系列操作步骤,不需要回送任何运算结果。,1返回运算结果的函
35、数定义,函数类型 函数名(形参表)/*函数首部*/*函数体*/函数实现过程 return 表达式;,把函数运算的结果回送给主函数,只能返回一个值,函数返回值的类型,没有分号,double cylinder(double r,double h)double result;result=3.1415926*r*r*h;return result;,形参,类型1 参数1,类型2 参数2,类型n 参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明,函数类型 函数名(形参表)函数实现过程 return 表达式;,不能写成 double r,h,double cylinder(double r,d
36、ouble h)double result;result=3.1415926*r*r*h;return result;,double cylinder(double r,double h)/*函数首部*/*函数体,写在一对大括号内*/double result;result=3.1415926*r*r*h;/*计算圆柱体积*/return result;/*返回运算结果*/,分析函数的定义,函数类型,函数名,形参表,与函数类型一致,1.不返回运算结果的函数定义,void 函数名(参数表)/*函数首部*/*函数体*/函数实现过程 return;/*可以省略return*/,这类函数通常用于屏幕输
37、出等,表示不返回结果,不能省略否则函数类型被默认定义为int,例2-2 输出5之内的数字金字塔。,/*输出数字金字塔*/#include int main(void)void pyramid(int n);/*函数声明*/pyramid(5);/*调用函数,输出数字金字塔*/return 0;void pyramid(int n)/*函数定义*/int i,j;for(i=1;i=n;i+)/*需要输出的行数*/for(j=1;j=n-i;j+)/*输出每行左边的空格*/printf();for(j=1;j=i;j+)/*输出每行的数字*/printf(%d,i);/*每个数字的前后各有一个空
38、格*/putchar(n);,12 2 3 3 3 4 4 4 45 5 5 5 5,2.1.3 函数的调用,定义一个函数后,就可以在程序中调用这个函数。调用标准库函数时,在程序的最前面用#include命令包含相应的头文件。调用自定义函数时,程序中必须有与调用函数相对应的函数定义。,1函数调用的形式和过程,使用返回值:volume=cylinder(radius,height);printf(“%f n”,cylinder(radius,height);完成操作:pyramid(5);,常用于void类型函数的调用,常用于返回结果的函数的调用,常量、变量、表达式,函数名(实参表),函数调用的
39、过程,计算机在执行程序时,从主函数main开始执行,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后,将返回主函数,然后再从原先暂停的位置继续执行。函数遇return或最后的大括号,返回主函数,分析函数调用的过程,#include int main(void)double height,radius,volume;double cylinder(double r,double h);printf(Enter radius and height:);scanf(%lf%lf,调用函数,实参形参,执行函数中的语句,返回调用它的地方,1.参数传递,函数定义时的参数被称为形式
40、参数(简称形参)double cylinder(double r,double h);函数调用时的参数被称为实际参数(简称实参)volume=cylinder(radius,height);实参形参在参数传递过程中,实参把值复制给形参。形参和实参一一对应:数量一致,类型一致,顺序一致形参:变量,用于接受实参传递过来的值实参:常量、变量或表达式,单向传递,3函数结果返回,函数返回的两种情况完成确定的运算,有一个运算结果返回给主调函数。完成指定工作,没有确定的运算结果需返回给主调函数(函数类型void)。函数结果返回的形式:return 表达式;return(表达式);,【例2-3】定义判断奇偶数
41、的函数even(n),定义一个判断奇偶数的函数even(n),当n为偶数时返回1,否则返回0。/*判断奇偶数的函数*/int even(int n)/*函数首部*/if(n%2=0)/*判别奇偶数*/return 1;/*偶数返回1*/elsereturn 0;/*奇数返回0*/,如何调用该函数?,4函数原型声明,函数类型 函数名(参数表);double cylinder(double r,double h);void pyramid(int n);函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明
42、。函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。,只写函数定义中的第1行(函数首部),并以分号结束。,2.2 使用函数编写程序,例2-4 输入精度e,使用格里高利公式求的近似值,精确到最后一项的绝对值小于e。要求定义和调用函数 funpi(e)求的近似值。,例2-4 源程序,/*用格里高利公式计算的近似值,精度为e*/#include#include int main(void)double e,pi;double funpi(double e);printf(Enter e:);scanf(%lf,double funpi(double e)int de
43、nominator,flag;double item,sum;flag=1;denominator=1;item=1.0;sum=0;while(fabs(item)=e)item=flag*1.0/denominator;sum=sum+item;flag=-flag;denominator=denominator+2;return sum*4;,Enter e:0.0001pi=3.1418,例2-5 判断素数的函数,例2-5 求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数时返
44、回1,否则返回0。算法描述:对2100之间的每个数进行判断,若是素数,则输出该数。for(m=2;m=100;m+)if(m是素数)printf(%d,m);,prime(m)!=0,例2-5 源程序,#include#include int main(void)int count,m;int prime(int m);count=0;for(m=2;m=100;m+)if(prime(m)!=0)printf(%6d,m);count+;if(count%10=0)printf(n);printf(n);,int prime(int m)int i,n;if(m=1)return 0;n=s
45、qrt(m);for(i=2;i=n;i+)if(m%i=0)return 0;return 1;,2.3 变量与函数,2.3.1 局部变量和全局变量2.3.2 变量生命周期和静态局部变量,2.3.1 局部变量和全局变量,局部变量在函数内定义的变量(包括形参)作用范围:本函数内部定义在复合语句内的变量作用范围:复合语句内部全局变量在函数以外定义的变量,不从属于任一函数。作用范围:从定义处到源文件结束(包括各函数),例2-6 在复合语句中定义局部变量。,#include int main(void)int a;a=1;/*复合语句开始*/int b=2;b=a+b;a=a+b;/*复合语句结束*
46、/printf(%d,a);return 0;,b:小范围内的临时变量,4,例2-7 全局变量定义,#include stdio.hint x;/*定义全局变量x*/int f()int x=4;/*x为局部变量*/return x;int main(void)int a=1;x=a;/*对全局变量 x 赋值*/a=f();/*a的值为4*/int b=2;b=a+b;/*b的值为4*/x=x+b;/*全局变量运算*/printf(%d%d,a,x);return 0;,4,7,若局部变量与全局变量同名,局部变量优先,变量作用范围示例,int x=1;void main()int a=2;.i
47、nt b=3;.f();.int t=4;void f()int x=5,b=6;.int a=7;,x=?a=?b=?,b=?,x=5 b=6 t=4 a没定义,x=?b=?t=?a=?,自动变量(auto):普通的局部变量int x,y;auto int x,y;char c1;auto char c1;函数调用时,定义变量,分配存储单元。函数调用结束,收回存储单元。全局变量:从程序执行开始,到程序的结束,存储单元始终保持。变量生命周期变量从定义开始分配存储单元,到运行结束存储单元被回收的整个过程。,2.3.2 变量生命周期和静态局部变量,存储类型:动态存储:自动变量静态存储:全局变量、静态局部变量用户存储空间,存储区,static 类型名 变量表作用范围:局部变量生命周期:全局变量,静态局部变量,例2-9 静态局部变量示例,#include void fun(int k);int main(void)int k;for(k=1;k=3;k+)fun(k);return 0;void fun(int k)static int a;printf(%d,a);a+=k;,0,1,3,静态变量会记住前一次调用时留下来的值,静态变量的初值为0,