习惯用符号常量并作亚及 #include 注意语法格式 *define PI 3. 14 问题 float I(flat):/函数声明* 函数声明后有分号 般都写在前面 float s( float):腆函数声明 float I( float r)函数定义:求周长 return只能返回一个值 I return PIr 2:3 暂时还不能用一个函数 float s(ftr)/函数定义:求面积求两个值 [return PTrr:J void maino float r, cir, area rinf("please input r: ) scanf( gf &r printf"circumference=%7 2f\n, area=%7 2f\n.(o), s(r)): 第二种调用方式:(),s(r)作为prnO的参数*/
1 #include #define PI 3.14 float l(float); /*函数声明*/ float s(float); /*函数声明*/ float l(float r) /*函数定义:求周长*/ { return PI*r*2; } float s(float r) /*函数定义:求面积*/ { return PI*r*r; } void main() { float r, cir, area; printf("please input r:"); scanf("%f",&r); cir =l(r); /*函数调用*/ area =s(r); /*函数调用*/ printf("circumference=%7.2f\n,area=%7.2f\n", cir, area); } 作业及 问题 习惯用符号常量,并 注意语法格式 •函数声明后有分号 •一般都写在前面 •return只能返回一个值 •暂时还不能用一个函数 求两个值。 printf("circumference=%7.2f\n,area=%7.2f\n",l(r),s(r)); /*第二种调用方式: l(r),s(r) 作为printf()的参数*/
第4讲 多函数程序设计一变量的作用域 选择结构程序设计
第4讲 多函数程序设计-变量的作用域 选择结构程序设计
include <stdio. h define PI 3.14 问题 flat( float):/函数声明 float s( float):腆函数声明 若这样起名会 flat(f|la↑r)函数定义:求周长* 怎样? [return Prr*2: 3 float s(fltn)/函数定义:求面积 [return parr:y 会有错误提示, void maino ○ 因为相同的名字 [ float 造成了冲突。 printf("please input r: ) scanf( %f", &r): l=(r):函数调用*/ s=s(r):函数调用*/ printf circumference=77 2f\n, area=77 2f\n",I, s):
3 #include #define PI 3.14 float l(float); /*函数声明*/ float s(float); /*函数声明*/ float l(float r) /*函数定义:求周长*/ {return PI*r*2; } float s(float r) /*函数定义:求面积*/ { return PI*r*r; } void main() { float r, l, s; printf("please input r:"); scanf("%f",&r); l=l(r); /*函数调用*/ s=s(r); /*函数调用*/ printf("circumference=%7.2f\n,area=%7.2f\n", l, s); } 问题 若这样起名会 怎样? 会有错误提示, 因为相同的名字 造成了冲突
include define PI 3.14 问题 float I(flat):/函数声明* float s( float):腆函数声明* 若这样起名又 float I( float r/函数定义:求周长* 会怎样?会冲 [return PIr 2: 3 突吗? float s( float r)/函数定义:求面积*/ [return pIrr: y 不会,它们虽然 void maino 是不同的r,但 float r, cir, area, 因为它们的作用 printf("please input r: ) 域不同,所以不 scanf( %of &r: 会产生冲突。 cir=():/函数调用*/ area=s():/函数调用*/ printf( circumference=%67 2f\n, area=672f\n",cir, area)
4 #include #define PI 3.14 float l(float); /*函数声明*/ float s(float); /*函数声明*/ float l(float r) /*函数定义:求周长*/ {return PI*r*2; } float s(float r) /*函数定义:求面积*/ { return PI*r*r; } void main() { float r, cir, area; printf("please input r:"); scanf("%f",&r); cir =l(r); /*函数调用*/ area =s(r); /*函数调用*/ printf("circumference=%7.2f\n,area=%7.2f\n", cir, area); } 问题 若这样起名又 会怎样?会冲 突吗? 不会,它们虽然 是不同的r,但 因为它们的作用 域不同,所以不 会产生冲突
涉及的语法 作用域 作用域:即作用范围 可分为: 局部变量 全局变量
5 涉及的语法 -作用域 ▪ 作用域:即作用范围 ▪ 可分为: ▪ 局部变量 ▪ 全局变量
局部变量 局部变量 在语句块内(即{]内)定义的变量 形式参数也是局部变量 特点 定义时不会自动初始化,除非程序员指定初值 进入语句块时获得内存,仅能由语句块内语句 访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰
6 局部变量 ▪ 局部变量 ▪ 在语句块内(即{ }内)定义的变量 ▪ 形式参数也是局部变量 ▪ 特点 ▪ 定义时不会自动初始化,除非程序员指定初值 ▪ 进入语句块时获得内存,仅能由语句块内语句 访问,退出语句块时释放内存,不再有效 ▪ 并列语句块各自定义的同名变量互不干扰
例运行结+是一个运算符,+表示 将j变量的值加1 maino I int i=1, j=2. prn"%dj=%,小) (int i=3, s printf("i=%d, a=%d\n", i, a) ++ int i=5; printf"i=yd\n,i: 运行结果为: printf(i=%d, j=%d \ n", i, j: 3,a=4 q) i=5
7 main() { int i=1,j=2; printf(″i=%d,j=%d\n ″,i,j); {int i=3,a=4; printf(″i=%d,a=%d\n ″ , i,a); j++; } {int i=5; printf(″i=%d\n ″,i); j++; } printf(″i=%d,j=%d\n ″,i,j); } 运行结果为: i=1,j=2 i=3,a=4 i=5 i=1,j=4 例,运行结果?++是一个运算符,j++表示 将j变量的值加1
例3-7,运行结果? Include void swap( int x, int y):/函数声明x vor ain () I in prnt实参a,b的值没发生变化!函数之前 单向值传递 之后* 即由实参向形参的方向传递 /函数值而不会朝相反的方向! int temp. printf("215 a=%d/d\n" 体交换变值之前* temp=a:a=b;b=/p:∧交器:交换变量xy的值 prnt("22>a=%d.b=%d\n",a.b):/交换变量值之后*
8 例3-7,运行结果? #include void swap(int x,int y); /* 函数声明 */ void main( ) { int a=3,b=5; printf("11>a=%d, b=%d\n",a,b);/* 调用交换函数之前 */ swap(a,b); /* 调用交换函数swap */ printf("12>a=%d, b=%d\n",a,b);/* 调用交换函数之后 */ } /* 函数定义:交换两个变量的值的函数 */ void swap(int a,int b) { int temp; printf("21> a=%d, b=%d\n",a,b); /* 交换变量值之前 */ temp=a; a=b; b=temp; /* 交换器:交换变量x,y的值 */ printf("22> a=%d, b=%d\n",a,b); /* 交换变量值之后 */ } 3 5 a b 3 5 a b temp 3 5 3 实参a,b的值没发生变化! 单向值传递! 即由实参向形参的方向传递 数值!而不会朝相反的方向!
全局变量 全局变量 在所有函数之外定义的变量 特点 默认作用范围:在源程序c中,从定义它的位置以 后都有效 在定义点之前或在其他c文件中引用,应该进行如 下声明: extern类型名变量名; 从程序运行起即占据内存,程序运行过程中可随时 访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效 但是尽量少用,因为谁都可以改写全局变量,所以很难确 定是谁改写了它 破坏了函数的独立性(封装性)
9 全局变量 ▪ 全局变量 ▪ 在所有函数之外定义的变量 ▪ 特点 ▪ 默认作用范围:在源程序.c中,从定义它的位置以 后都有效 ▪ 在定义点之前或在其他.c文件中引用,应该进行如 下声明: extern 类型名 变量名; ▪ 从程序运行起即占据内存,程序运行过程中可随时 访问,程序退出时释放内存 ▪ 使函数之间的数据交换更容易,也更高效 ▪ 但是尽量少用,因为谁都可以改写全局变量,所以很难确 定是谁改写了它 ▪ 破坏了函数的独立性(封装性)
include global 定义全厂 void GlobalPlusPlus(void) Before GlobalPlusphuso, it is 1 maino Before++,计ti global =1: IsO, itie printf("efore G -plus GlobalPlusPluso: printf"Afta 注意:全局变 函数功能 量具有“记忆 函 函数 性” Noid Global printf("Before globar: global++ priltfC"After ++ it is %d\n", global)
10 #include int global; /*定义全局变量*/ void GlobalPlusPlus(void); main() { global = 1; printf("Before GlobalPlusPlus(), it is %d\n", global); GlobalPlusPlus(); printf("After GlobalPlusPlus(), it is %d\n", global); } /* 函数功能: 对全局变量global加1,并打印加1之前与之后的值 函数入口参数: 无 函数返回值: 无 */ void GlobalPlusPlus(void) { printf("Before ++, it is %d\n", global); global++; printf("After ++, it is %d\n", global); } Before GlobalPlusPlus(), it is 1 例 Before ++, it is 1 After ++, it is 2 After GlobalPlusPlus(), it is 2 注意:全局变 量具有“记忆 性”