变量
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全局变量(外部变量 : 全局变量 外部变量): 外部变量 在函数外部定义的变量 局部变量(内部变量 内部变量): 局部变量 内部变量 : 在函数内部定义的变量, 在函数内部定义的变量, 包括形式参数
自动变量
作用域: 作用域:从定义点开始到所在的分程序结束 生存期:开始执行分程序就生成, 生存期:开始执行分程序就生成,分程序执行结束就消亡 初始化:可以初始化,缺省值为随机值。 初始化:可以初始化,缺省值为随机值。 作用域不可以扩展 【例】 #include "iostream.h" int f(int x) { x++; int y=5; //auto int k=5; y++; return x+y; } void main() { int k=2; cout<<f(k)<<endl; cout<<f(k+1)<<endl; }
外部变量与局部 变量同名, 变量同名,起作 用的是局部变量
注意: 外部变量的作用域只限于定义处到文件结束, 注意: 外部变量的作用域只限于定义处到文件结束, 定 义点之前的函数或其它文件中的函数不可以引用该外部变 量。 可以使用extern声明符来扩展外部变量的作用域 声明符来扩展外部变量的作用域 可以使用
一个函数可能被调用多次, 一个函数可能被调用多次, 前一次调用的结果带到下一次去。 前一次调用的结果带到下一次去。
#include "iostream.h" int fac(int n) {static int f=1; f=f*n; return(f);} void main() {auto int i; for(i=1;i<=5;i++) cout<<"i!="<<fac(i); }
缺省的存储类别: 缺省的存储类别:auto 注意: 注意:只有内部变量存 储类别才能auto 储类别才能
静态局部变量
作用域:从定义点开始到所在的分程序结束。 作用域:从定义点开始到所在的分程序结束。 生存期: 生存期:程序的执行周期 初始化:可以初始化,缺省值为 或 初始化:可以初始化,缺省值为0或'\0 ' 。 【例】 初始化一次 在开始执行程序时初始化 作用域不可以扩展
void itoc(int n,char s[]) { void reverse(char []); int i=0; int sign; if((sign=n)<0) n=-n; do {s[i]=n%10+'0';i++;n=n/10;} while (n>0); if(sign<0) s[i++]='-'; s[i]='\0'; reverse(s); }
(1)作用域向定义点之前的函数扩展 #include <iostream.h> extern int i; //不能初始化 不能初始化 void fun() { // extern int i; cout<<i; } int i=5; void main() { int j=20; cout<<j; fun(); } #include <iostream.h> extern int i; void fun() { //extern int i; 错误 cout<<i; } void g() {i++;} int i=5; void main() { int j=20; cout<<j; g(); fun(); }
【例】外部变量示例 #include "iostream.h" int m=10; void f1(int n) { n=2*n;m=m/3; } int n; void f2() { n=5;m++;n++; } void main() { int n=2; f1(n); f2(); cout<<m<<n<<endl; }
(2)作用域扩展到另一个文件 【例】作用域横向扩展示例 //file1.cpp extern max,min; #include "iostream.h" void main() { void maxmin(int x[],int n); int a[10]={11,2,3,-4,5,6,7,8,0,20}; maxmin(a,10); cout<<max<<" "<<min<<endl; } //file2.cpp int max,min; void maxmin(int x[],int n) { max=x[0];min=x[0]; for(int i=0;i<n;i++) { if(x[i]>max)max=x[i]; if(x[i]<min)min=x[i]; } }
总结: 总结:
外部变量 作用域 生存期 初始化 auto变量 变量 static内部变量 内部变量
从定义点到分程序 不可扩展 程序的整个执行周期 分程序的执行周期 程序的整个执行周期 缺省为0 缺省为 或'\0 ' 缺省为随机值 缺省为0 缺省为 或'\0 '
从定义点到文件结束 从定义点到分程序 用extern扩展 扩展 不可扩展
【 例 5.30】 统计字符串中各个 】 字母( 不区分大、 小写) 字母 ( 不区分大 、 小写 ) 出现 的频率, 的频率 , 同时找出频率出现最 高的字母及次数。 高的字母及次数。 分析: 分析 : 由于函数需要返回多个 值 , 故可通过传址调用或引用 调用实现。 调用实现 。 将要处理的数据及 处理的结果设为形参。 处理的结果设为形参。
5.8 程序举例
【例5.27】编一判断质数的函数,验证歌德巴赫猜想:任何 】编一判断质数的函数,验证歌德巴赫猜想: 大于2的偶数均可表示为两个素数的和 例如: 的偶数均可表示为两个素数的和。 大于 的偶数均可表示为两个素数的和 。 例如 : 4=2+2(特 ( 仅此一个) 例, 仅此一个) , 6=3+3,8=3+5,…。程序要求输入任一 , , 。 偶数,输出6到该数范围内的各个满足条件的组合 到该数范围内的各个满足条件的组合。 偶数,输出 到该数范围内的各个满足条件的组合。 分析:对一个偶数,分解为两个质数和, 分析:对一个偶数,分解为两个质数和,既n=a+b。方法是 。 从找最小的质数a为3开始 开始( 2是偶数 另一个必定是偶数, 是偶数, 从找最小的质数a为3开始(因2是偶数,另一个必定是偶数, 不可能是质数) 判断b=n-a是否是质数, 若 b也是质数, 是否是质数, 也是质数, 不可能是质数 ) , 判断 是否是质数 也是质数 符合要求; 则n符合要求;否则,找下一个质数 ,再判断 。 符合要求 否则,找下一个质数a,再判断b。
【例5.29】用梯形法求积分: 】用梯形法求积分:
分析: 等分积分区间 等分积分区间[a,b],每一个小梯型的面积和即 分析:n等分积分区间 , 近似为f(x)在[a,b]的积分值。即将求积分转化求和。 在 的积分值。 近似为 的积分值 即将求积分转化求和。
程序: 程序: #include "iostream.h" #include "math.h" double f(double x) { return exp(-x*x/2);} double integral(double a,double b,int n) { int sum;double h=(b-a)/n; sum=(f(a)+f(b))/2; int x=a+h; for(int i=1;i<n;i++) { sum+=f(x); x+=h; } return sum*h; } void main() { double a,b; int n; cout<<"输入区间值、等分数:"<<endl; 输入区间值、 输入区间值 等分数: cin>>a>>b>>n; cout<<integral(a,b,n)<<endl; }
全局变量
作用域: 作用域:从定义点开始到所在的文件结束 生存期: 生存期:程序的整个执行周期 初始化:可以初始化,缺省值为 或 初始化:可以初始化,缺省值为0或'\0 '。 。 作用域可以扩展: 作用域可以扩展: 向上扩展 横向扩展, 横向扩展,扩展到另一个文件 注意: 注意:扩展的地方不能初始化
作用域与存储类别
从下面三方面分析各变量 作用域(可见性): 作用域(可见性): 在什么范围内可以访问 空间概念 生存期: 生存期: 在什么时间存在 时间概念 初始化
【例】 #include "iostream.h" int digit(long n) { int k=0; while(n!=0) {n/=10; k+=1;} return k; } void main() { long x; cin>>x; cout<< digit(x)<<endl; }
程序: 程序: #include "iostream.h" int isprime(int m) //判别 是否为质数 判别m是否为质数 判别 { for(int i=2;m%i!=0;i++); return (i==m); } void main() { int n,x,a,b; cin>>x; for(n=6;n<=x;n+=2) for(a=3;a<=n/2;a+=2) if(isprime(a)) { b=n-a; if(isprime(b)) { cout<<n<<"="<<a<<"+"<<b<<endl; break; //退出 循环,判别下一个 的组合 退出a循环 退出 循环,判别下一个n的组合 } } }
把数字转变成字符串。 【例5.28】写一函数 】写一函数itoc(),把数字转变成字符串。如数字 ( 把数字转变成字符串 -123,经过itoc(-123)后,变为 ,经过 后 变为″-123″。 。 分析:函数 先判断n是否有符号 分析:函数itoc()先判断 是否有符号,若有符号,应先保存 先判断 是否有符号,若有符号, 加以处理。数字变为对应的字符须将其ASCII码加上 码加上30H, 加以处理。数字变为对应的字符须将其 码加上 , 即加上字符’ 。把一个数( 即加上字符’0’。把一个数(如n)的每一位分离出来可以 ) 用n%10,而循环结束条件为 而循环结束条件为n/10>0。但这样处理的数据是从 。 而循环结束条件为 个位向前的,所以还要作反转处理。 个位向前的,所以还要作反转处理。
程序: 程序: #include "iostream.h" #include "string.h" void main() { void itoc(int,char []); int n;char s[100]; cin>>n; itoc(n,s); cout<<s<<endl; } void reverse(char s[]) { int c,i,j; j=strlen(s)-1; for(i=0;i<j;i++,j--) {c=s[i];s[i]=s[j];s[j]=c;} s[i+j+1]='\0'; }
#include "iostream.h" 程序: 程序: #include "stdio.h" #include "string.h" void freq(char s[],int p[],char &chmax,int &max) { for(int i=0;i<26;i++)p[i]=0; strlwr(s); i=0; while(s[i]!='\0') { if(s[i]>='a'&&s[i]<='z') p[(s[i]-'a')]++; i++; } max=p[0]; int k=0; for(i=1;i<26;i++) if(p[i]>max) { max=p[i];k=i;} chmax=k+97; } void main() { int p[26],i,max; char s[80],chmax; gets(s); freq(s,p,chmax,max); for(i=0;i<26;i++) if(p[i])cout<<char(i+97)<<"----"<<p[i]<<endl; cout<<chmax<<"----"<<max<<endl; }