




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1C语言程序设计方案概述~~~~~~~~~~~~~~~~第1页/共446页5657BE0100BF02008BC603C78946FC8BC62BC78946FE5F5E1+2机器语言程序pushsipushdimovsi,0001movdi,0002movax,siaddax,dimov[bp-04],axmovax,sisubax,dimov[bp-02],axpopdipopsi
inta=1;intb=2;inti=a+b;intj=a–b;1-2a=1b=2i=a+bj=a-b汇编语言程序高级语言程序助记符=1010110=1000101111000110翻译第2页/共446页源程序
*.c目标程序*.obj高级语言程序机器语言程序inta=1;intb=2;inti=a+b;intj=a–b;5657BE0100BF02008BC603C78946FC8BC62BC78946FE5F5E编译编译Compiler可执行程序*.exeLinker………连接可执行程序第3页/共446页pushsipushdimovsi,0001movdi,0002movax,siaddax,dimov[bp-04],axmovax,sisubax,dimov[bp-02],axpopdipopsi
汇编语言程序5657BE0100BF02008BC603C78946FC8BC62BC78946FE5F5E机器语言程序第4页/共446页形式参数f (int x){inty;y=x*x;returny;}main(){inta,b;scanf("%d",&a);b=f(a);printf("b=%d\n",b);}函数函数名表参数类型参数名声明部分函数调用函数函数类型自定义函数主函数库函数函数定义函数首部函数体执行部分实际参数变量:先定义,后使用int第5页/共446页main(){ printf(“ThisisasimpleCprogram.\n”);}第6页/共446页第7页/共446页main(){ inta,b,sum;/*addaandb,sumistheresult*/ a=123; b=456; sum=a+b; printf(“Thesumof%dand%dis%d.\n”,a,b,sum);}注释第8页/共446页第9页/共446页intmax(intx,inty){ intz; if(x>y) z=x; else z=y; return(z);}main(){ inta,b,c; scanf(“%d%d”,&a,&b); c=max(a,b); printf(“max=%d\n”,c);}第10页/共446页第11页/共446页源程序
*.c目标程序*.objCompiler可执行程序*.exeLinker第12页/共446页第13页/共446页第14页/共446页数据类型运算符和表达式~~~~~~~~~~~~~~~~~~第15页/共446页五、常量和变量1.标识符
C语言中构成常量名、变量名、函数名、数组名、文件名的有效字符序列称为标识符。
C语言规定,标识符由字母、数字、下划线三种字符组成,而且第一个字符必须为字母或下划线。第16页/共446页C语言中的标识符:πCk2AB3x*yx23Aa3a-ba+_c__dA_b第17页/共446页2.常量
在程序的运行过程中,值不能被改变的量称为常量。
C语言中的常量有三种形式(1)字面常量或直接常量:
1233.14159'a'"Hello"第18页/共446页(2)符号常量在C语言中,也可以用一个标识符来代表一个常量,叫作符号常量。
#define<常量名><常量值>注意后面不要加分号第19页/共446页#definePRICE30
main()
{
intnum,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}PRICE=40;#definePI3.1415926第20页/共446页(3)常量定义
floatpi=3.14159;constconstfloatpi;pi=3.14159;第21页/共446页3.变量
值可以改变的量称为变量
变量要先定义后使用对变量的定义,要放在一个函数开头部分,所有执行语句的前面。第22页/共446页六、算术运算符和算术表达式1.算术运算符双目运算符:有两个操作数参与运算+(加)、-(减)、*(乘)、/(除)、%(求余)单目运算符:有一个操作数参与运算+(正)、-(负)、++(自增)、--(自减)第23页/共446页2.算术表达式算术表达式是指由算术运算符、运算量、括号和函数组成,符合C语言语法规则的式子。算术运算符优先级:操作数
个数
结合
方式
运算符
优先
级
单目
自自右右
向向左左
++++((自自增增))
、、----((自自减减))
++((正正))、、--((负负))
高
**((乘乘))、、//((除除))
%%((求求余余))
中
双
目
自自左左
向向右右
++((加加))、、
--((减减))
低
第24页/共446页3.类型转换(1)自动类型转换 转换的基本原则:
要尽可能地保证运算的精确度10+1.5-123.4510+'a'+1.5-123.45*'b'第25页/共446页各数据类型混合运算的排列顺序:
类型
优先级
longdouble
double
float
longint
unsignedint
int
shortint
char
高
低
第26页/共446页算术表达式的数据类型算术表达式的数据类型即该表达式的值的类型。两个同类型的运算量参加运算,其结果也是同类型的。第27页/共446页(2)强制类型转换(类型名)(表达式)(int)=313%5=313.7%5main(){floatx;inti;x=3.999;i=(int)x;printf("x=%fi=%d\n",x,i);}第28页/共446页使用强制类型转换注意:在进行强制类型转换时,类型关键字必须用括号括住。在对一个表达式进行强制类型转换时,整个表达式也要用括号括住。 如:(float)(a+b)(float)a+b在对变量和表达式进行了强制类型转换后,并不改变原变量或表达式的类型。 如: intz;floatx;doubley; z=(int)(x+y);
执行后x、y的类型不变。第29页/共446页4.自增和自减运算符++、--inti=3;printf("++i=%d",++i);inti=3;printf("i++=%d",i++);作用:将操作数自己增加1或者减少1。前置(前缀):如:++i、--i后置(后缀):如:i++、i--第30页/共446页表达式52+3abc5+abcf(2,3)语句5;2+3;abc;5+abc;f(2,3);表达式语句控制语句for、goto空语句;复合语句{……}变量声明函数声明变量定义inta,b;C语句非语句C程序第31页/共446页intmax(intx,inty){ intz; if(x>y)z=x;elsez=y; return(z);}main(){ inta,b,c;
c=max(a,b); printf("max=%d\n",c);}第32页/共446页inti=3;i++;inti=3;printf("i++=%d",i++);
i++=3
inti=3;++i;printf("++i=%d",++i);
++i=4第33页/共446页自增、自减运算小结:自增运算符和自减运算符是单目运算符,且只能用于单个变量。当前置运算或者后置运算与其他运算结合在一个表达式中时:前置运算:先增值后引用后置运算:先引用后增值++和-的运算结合方向是从右到左第34页/共446页七、赋值运算1.基本赋值运算符赋值运算符:= 优先级很低,仅比逗号运算符高,低于所有的算术运算符结合方式为自右向左赋值表达式:由赋值运算符=将变量和表达式连接起来的式子形式:变量=表达式运算过程:将赋值运算符右边表达式的值赋给左边的变量。第35页/共446页赋值表达式a=a+1;++a;a=b=c=2;a=(b=(c=2));c=2;b=2;a=2;a=2+(b=3);b=3;a=2+3;a=(b=2)*(c=3);b=2;c=3;a=2*3;变量初始化flotaf=123.5;charc='a';inti,j=342,k;inta=b=c=2;第36页/共446页赋值运算的注意事项:=是一个双目运算符,需要左右两个操作数=是赋值运算符,不等于等号,没有相等的含义=左端的运算量必须是单个变量,而不能是表达式赋值运算中,首先使运算符左端的变量具有右端表达式的值,然后整个表达式的结果为右端表达式的值第37页/共446页赋值运算中数值类型的转换
当赋值运算符两端的数据类型不同时,编译程序将赋值运算符右边表达式的数据类型自动转换成左边变量的数据类型。第38页/共446页2.复合的赋值运算符复合赋值运算符:+=、-=、*=、/=、%=等。复合赋值运算表达式的一般形式: 变量op=表达式说明:"op"为其它运算符,如+、-、*、/、%等。举例: a+=b……a*=b
等同:a=a+b……a=a*b第39页/共446页变量op=表达式;的执行过程步骤:(1)求出"表达式"的值(2)把求出的表达式的值与"变量"做op运算(3)把第二步求出的值再赋给"变量"例如:设x=5y=2求x%=y+3的值(1)y+35
即:x%=5(2)x%5 0,(x=5)(3)0x第40页/共446页复合赋值运算小结凡是双目运算符都可以与赋值运算符一起组合成复合的赋值运算符。注意两个运算符之间不能有空格存在。共10种复合赋值运算符:
+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=复合赋值运算符的结合方式为“自右向左”。第41页/共446页练习:设有inta=10;写出下面表达式的值。a+=aa-=12a*=3+aa/=a+an=5a%=n%2a+=a-=a*=a20-2130000第42页/共446页八、逗号运算符、逗号表达式逗号运算符:",",即顺序求值运算符逗号表达式:用逗号把若干独立的运算表达式结合成一个运算表达式,称为逗号表达式逗号表达式的一般形式: 表达式1,表达式2,……,表达式n求解过程:先求"表达式1",再求"表达式2",……,最后求"表达式n"。整个表达式的值为"表达式n"的值。第43页/共446页举例:求下面逗号表达式的值:
a=3*4,b=a+10,c=a*b解题步骤:求表达式1:a=3*4=12求表达式2:b=a+10=22求表达式3:c=a*b=12*22=264写结果:逗号表达式的值为264。第44页/共446页逗号表达式的特点逗号表达式可以作为赋值运算中的表达式逗号运算符的结合方向是从左到右逗号运算符是所有运算符中级别最低的第45页/共446页运算符的优先级和运算顺序C语言中的优先级从高到低分为15级。运算符的一般顺序:先运算优先级别高的,再运算优先级别低的。对于优先级别相同的运算符,按其结合方向执行。第46页/共446页运算符的优先级和结合方向第47页/共446页优先级分级一般规律:单目运算符优先级最高,双目次之,三目较低。双目运算符中,算术运算符较高,关系次之,逻辑较低(!除外)。位运算符中,移位运算高于关系运算,位逻辑运算低于关系运算。逗号运算符最低,圆括号运算符优先级最高,可用括号强调或改变运算顺序。第48页/共446页数据的I/O~~~~~~~~~~~~~~~~第49页/共446页main(){printf("ThisisaCprogram.\n");}第50页/共446页floatmax(floata,floatb) /*函数定义*/{ floatc; if(a>b)c=a;elsec=b; returnc;}main(){ floatx=1.23,y=4.56,z; z=max(x,y); /*函数调用*/ printf("%f",z);}第51页/共446页main(){ floatx=1.23,y=4.56,z; z=max(x,y); /*函数调用*/ printf("%f",z);}floatmax(floata,floatb) /*函数定义*/{ floatc; if(a>b)c=a;elsec=b; returnc;}第52页/共446页main(){ floatx=1.23,y=4.56,z; z=max(x,y); /*函数调用*/ printf("%f",z);}floatmax(floata,floatb) /*函数定义*/{第53页/共446页{ floatc; if(a>b)c=a;elsec=b; returnc;}main(){ floatx=1.23,y=4.56,z;floatmax(floata,floatb) /*函数定义*/ z=max(x,y); /*函数调用*/ printf("%f",z);}第54页/共446页main(){ floatx=1.23,y=4.56,z; z=max(x,y); /*函数调用*/ printf("%f",z);}floatmax(floata,floatb)/*函数定义*/{ floatc; if(a>b)c=a;elsec=b; returnc;}floatmax(floata,floatb);/*函数声明*/#include<stdio.h>第55页/共446页字符输出函数:putchar作用:向终端输出一个字符格式:putchar(c) c是整型或者字符型数据,返回值为所输出的字符字符常量 putchar('A');整数 putchar(65);字符变量 charc='A'; putchar(c);八进制数 putchar('\101');十六进制 putchar('\x41');控制字符 putchar('\n');转义字符 putchar('\'');第56页/共446页字符输入函数:getchar作用:从终端输入一个字符格式:getchar() 函数没有参数,返回值为从输入设备得到的字符第57页/共446页格式输出函数:printf格式:printf(格式控制,输出表列)作用:向终端输出若干个任意类型的数据main(){printf("ThisisaCprogram.");}ThisisaCprogram.ThisisaCprogram.第58页/共446页inti=65;printf("i=%d",i);格式字符i=65i=65inti=65;printf("i=%c",i);i=Ai=A第59页/共446页inti=1,j=2,k=3;printf("i=%d,j=%d,k=%d\n",i,j,k);i=1,j=2,k=3\n函数声明:intprintf(constchar*format,...);格式:printf(格式控制,输出表列);格式说明:%[标志][宽度][.精度][h/l]格式字符第60页/共446页格式说明:%[标志][宽度][.精度][h/l]格式字符数值型:d/isigneddecimalintegeruunsigneddecimalintegerounsignedoctalintegerx/Xunsignedhexadecimalinteger(x:a,b,c,d,e,fX:A,B,C,D,E,F)f floatingpoint[-]d…d.dddddd隐含6位小数e/Efloatingpoint[-]d.ddddd<e/E><+/->dd 规范化g/G floatingpoint
根据输出的数值和精度,从f或e中选取长度较短的一种,不输出无意义的0或者小数点字符型:c singlecharacters stringpointer% %character
第61页/共446页格式说明:%[标志][宽度][.精度][h/l]
格式字符h/l:h(diouxX):shortinteger显示短整数l(diouxX):longinteger显示长整数格式说明:%[标志][宽度][.精度][h/l]格式字符宽度:一个正整数,表示数据输出时所占的最小宽度。不足补空格或零;超过,按实际位数输出。第62页/共446页.精度:一个正整数,用于输出实数或字符串。为了与宽度相区别,在前面加一个小数点。用于实数,表示小数的位数,默认为6位。用于字符串为截取显示的字符数格式说明:%[标志][宽度][.精度][h/l]格式字符
标志:
-:左对齐,右补空格
+:数值带符号显示
0:数值左补零(符号后)
#:显示前导符格式说明:%[标志][宽度][.精度][h/l]格式字符第63页/共446页格式输入函数:scanf格式:scanf(格式控制,地址表列)作用:按指定格式从键盘输入数据1.取地址运算符—&&变量名
inti;scanf("%d",&i);第64页/共446页2.格式控制格式说明:%[*][宽度][h/l]格式字符3.说明:(1)输入数据时,两个数据间用空格、回车或跳格键(Tab)相间隔,不能用其它符号,比如逗号。(2)如果在格式控制字符串中除格式说明外,还有其它字符,这些字符是不会显示在屏幕上的,但是在输入数据的时候,必须同时输入这些字符(3)在用%c格式输入数据时,空格和控制字符都是有效字符第65页/共446页函数
~~~~~~~~~~~~~~第66页/共446页一、函数的定义类型标识符函数名(形式参数表){
声明语句}复合语句第67页/共446页main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);}intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}第68页/共446页1.形式参数无参函数
类型标识符函数名()复合语句
类型标识符函数名(void)复合语句第69页/共446页无参函数示例main(){ printstar(); printword(); printstar();}printstar()/*定义无参函数printstar()*/{printf("******************\n");}printword()/*定义无参函数printword()*/{printf("Thisisanexample\n");}第70页/共446页(2)不定参函数
类型函数名(形式参数表,…)复合语句intprintf(constchar*format,...){……};intscanf(constchar*format,...){……};intmax(intx,inty,...){……};第71页/共446页intmax(constintx,constinty){if(x>y)returnx;elsereturny;}第72页/共446页(3)形参声明的传统方式intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}第73页/共446页2.类型标识符intmax(intx,inty){if(x>y)returnx;elsereturny;}第74页/共446页3.return语句函数的返回值是通过return语句传递的。return语句的一般形式:
return表达式;
return(表达式);第75页/共446页return语句的执行main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);}intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}第76页/共446页返回值类型要与函数类型一致,且以函数类型为准。函数类型缺省时,系统自动按整型处理。一个函数中可以有若干个return语句,流程执行到哪里,就从哪里返回主调函数。若函数体内没有return语句,则执行函数到末尾,然后返回主调函数。当不需要返回值的时候,可以用void定义函数为空类型,表示无返回值。第77页/共446页4.空函数类型说明符
函数名(){}第78页/共446页二、函数的调用1.函数调用的一般格式: 函数名(实参表);
main() {intx,y,z; scanf("%d%d",&x,&y); z=max(x,y); }第79页/共446页main(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d",c);}intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}主调函数被调函数实际参数形式参数第80页/共446页2.值传递调用函数时,在主调函数和被调用函数之间存在一种数据传递关系。C语言规定,实参对形参的数据传递是单向传递,只由实参传给形参,而不能由形参传回来给实参。
实参形参……axby……c=max(a,b);第81页/共446页3.函数调用的方式作为表达式出现在任何允许表达式出现的地方,参与运算。 如:a=sqrt(b);作为一条独立的语句完成特定的操作。 如:gets(str);作为函数的参数被其他函数调用。 如:printf("%s\n",strcpy(str1,"Hello"));第82页/共446页4.函数的嵌套调用C语言程序由函数构成。函数与函数之间是平行的,独立的。不允许在一个函数内部嵌套定义另一个函数;但允许在调用一个函数的过程中,又调用另一个函数。第83页/共446页main函数结束调用函数a调用函数b函数b函数a函数的嵌套调用第84页/共446页5.递归调用递归调用: 在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。第85页/共446页递归函数设计举例:求n!算法描述:
n!=1×2×3×……×(n-1)×n递推公式:f(n)=1 n=0n×(n-1)! n>0第86页/共446页main(){intx;scanf("%d",&x);printf("Theresultis%ld",fact(x));}longfact(intn){if(n==0)return1;elsereturnn*fact(n–1);}第87页/共446页5!的运算过程:?5!5×4!4×3!3×2!2×1!12×13×24×65×241201×0!1×1第88页/共446页6.1数组元素作函数实参数组元素作函数实参,如同简单变量一样,采用单向值传递。6.数组与函数第89页/共446页intisprime(intx)
{
inti;
for(i=2;i<=x/2;i++)
if(x%i==0)return(0);
return(1);
}【例】用程序求出数组a中所有素数的和第90页/共446页main(){inti,a[10],sum=0,n=0;printf("Enter10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++)if(isprime(a[i]))/*若a[i]为素数*/{ sum+=a[i]; /*求素数和*/ n++; /*统计素数个数*/}printf("\nsum=%d,aver=%f\n",sum,aver);}第91页/共446页#defineN10main(){ inta[N];inti,j,temp; printf("Pleaseinput%dnumbers:\n",N); for(i=0;i<N;i++)scanf("%d",&a[i]); for(i=0;i<N-1;i++) for(j=0;j<N-1-i;j++)if(a[j]>a[j+1]) {temp=a[j];a[j]=a[j+1];a[j+1]=temp;} printf("Thesortednumbers:\n"); for(i=0;i<N;i++) printf("%4d",a[i]);}6.2数组名作函数参数第92页/共446页for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}sort()inta[N]{}main(){inta[N];inti;printf("Pleaseinput%dnumbers:\n",N); for(i=0;i<N;i++)scanf("%d",&a[i]); printf("Thesortednumbers:\n"); for(i=0;i<N;i++) printf("%4d",a[i]);}#defineN10inti,j,temp;for(i=0;i<n-1;i++)for(j=0;j<n-1-i;j++)if(b[j]>b[j+1]){temp=b[j];b[j]=b[j+1];b[j+1]=temp;}intb[N],intn)sort(a);sort(a,N);
第93页/共446页三、函数原型intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}main(){intmax(intx,inty);inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);}第94页/共446页main(){
intmax(int,int);inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);}intmax(intx,inty){intz;z=(x>y)?x:y;return(z);}第95页/共446页
函数原型的一般形式为函数类型函数名(参数类型1参数名1,参数类型2参数名2,…);函数类型函数名(参数类型1,参数类型2,…);第96页/共446页intmax(int,int);f1(){……x=max(a,b);
……}f2(){……y=max(c,d);
……}
intmax(intx,inty) {……}
第97页/共446页作业:
P186:8.18.28.138.17
实验:
第8章例题:8.18.28.38.48.58.88.118.128.13
第98页/共446页input(){……}max(){input();……}output(){……}main(){max();output();}file.cfile.objfile.exe第99页/共446页C程序的结构f11(){……}f12(){……}……f21(){……}f22(){……}……fn1(){……}main(){……}…………file1.cfile2.cfilen.cfile1.objfile2.objfilen.obj……prog.exe第100页/共446页模块化程序设计~~~~~~~~~~~~~~第101页/共446页模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之第102页/共446页1.局部变量---内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在
main中有效不同函数中同名变量,占用不同的内存单元形参属于局部变量可定义仅在复合语句中有效的变量不同函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效
复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}四、变量的作用域第103页/共446页若外部变量与局部变量同名,则外部变量被屏蔽全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错2.全局变量---外部变量定义:在函数外定义,可为所在文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束>>>>>第104页/共446页floatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin第105页/共446页intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围第106页/共446页/*ch7_17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}外部变量与局部变量运行结果:max=8第107页/共446页inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf("%c",'*');printf("\n");}外部变量副作用运行结果:*****第108页/共446页程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等静态变量与动态变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束五、变量的存储类别第109页/共446页auto-----自动型register-----寄存器型static-----静态型extern-----外部型变量定义:[存储类型]数据类型变量表;如:intsum;
autointa,b,c;
staticfloatx,y;registerinti;
第110页/共446页auto变量的作用域main(){intx=1;voidprt(void);
{
intx=3;prt();printf(“2ndx=%d\n”,x);
}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}运行结果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域第111页/共446页main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}局部静态变量运行结果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:123第112页/共446页intmax_so_far(intcurr){staticintbigger=0;if(curr>bigger)bigger=curr;returnbigger;}main(){intn,biggest;do{scanf("%d",&n);biggest=max_so_far(n);}while(n>0);printf("themaxnumberis%d\n",biggest);}第113页/共446页registerinti;
(1)只有函数中的局部变量和形式参数可以作为寄存器变量(2)一个计算机系统中的寄存器数目是有限的(3)不允许对寄存器变量作取地址运算(4)对一个变量只能声明为一个存储类别第114页/共446页intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围externc1,c2;c1,c2的作用范围扩展后externcharc1,c2;c1,c2的作用范围扩展后声明外部变量:extern第115页/共446页C程序的结构f11(){……}f12(){……}……f21(){……}f22(){……}……fn1(){……}main(){……}…………file1.cfile2.cfilen.cfile1.objfile2.objfilen.obj……prog.exe第116页/共446页变量作用域存储类别内部变量形式参数外部变量autoregisterstatic扩展(声明)extern变量名;屏蔽(定义)static类型变量名;源程序内存复合语句函数文件程序第117页/共446页静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件register局部staticauto外部static外部存储类别变量定义:[存储类型]数据类型变量表;第118页/共446页六、函数的作用域1.外部函数2.内部函数static类型标识符
函数名(形参表)复合语句定义:[extern]类型标识符
函数名(形参表)复合语句声明:[extern]类型标识符
函数名(形参表);第119页/共446页floatf1(inta){…}main(){
f1(5);…}floatf1(int);floatf1(int);f2(){
f1(10);…}floatf1(int);file1.cfile2.cfile1.objfile2.obj
prog.exe第120页/共446页floatf1(inta){…}main(){…}file1.cfile2.cfile1.objfile2.objprog.execharf1(floatx,floaty){…}staticstatic╳第121页/共446页inta;main(){
a++;…}externa;externa;f(){
a++;…}externa;file1.cfile2.cfile1.objfile2.objprog.exe
inta;
╳第122页/共446页类型函数名(形式参数表){
声明部分执行部分}内部变量定义;外部变量声明;函数声明;第123页/共446页求平均成绩#include<stdio.h>
floataverage(intstu[10],intn);main(){intscore[10],i;floatav;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);av=average(score,10);printf("Averageis:%.2f",av);}floataverage(int
stu[10],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}实参用数组名形参用数组定义,
intstu[]..2109score562312….….88stu第124页/共446页比较:数组元素与数组名作函数参数12a调用前a[0]a[1]12a调用a[0]a[1]12xy21xy交换12a返回#include<stdio.h>voidswap(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};
swap(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}第125页/共446页12a调用前12ax调用21ax交换21a返回#include<stdio.h>voidswap(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};
swap(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}第126页/共446页8.5写一函数,使输入的一个字符串按反序存放。charstr[]="abcdef";charstr[]="abcde";strlen(str)/2strlen(str)/20123456abcdef\0fbcdea\0012345abcde\0fecdba\0fedcba\0ebcda\0edcba\0ijijij第127页/共446页voidinvert(charstr[],intlen){inti,j;charc;for(i=0,j=len-1;i<len/2;i++,j--){c=str[i];str[i]=str[j];str[j]=c;}}main(){charstring[30];scanf("%s",string);invert(string,strlen(string));printf("%s",string);}第128页/共446页求n的阶乘/*ch7_8.c*/#include<stdio.h>long
fac(intn){if(n==0||n==1)return1;elsereturnn*fac(n-1);}main(){intn;printf("Inputaninteger:");scanf("%d",&n);printf("%d!=%ld",n,fac(n));}第129页/共446页hanoi(n,a,b,c)1:acn=1hanoi(n-1,a,c,b)n:achanoi(n-1,b,a,c)n>1voidhanoi(intn,chara,charb,charc){if(n==1)printf("1:%c-->%c\n",a,c);else{hanoi(n-1,a,c,b);printf("%d:%c-->%c\n",n,a,c);hanoi(n-1,b,a,c);}}第130页/共446页voidhanoi(intn,chara,charb,charc){if(n==1)printf("1:%c%c\n",a,c);else{hanoi(n-1,a,c,b);printf("%d:%c%c\n",n,a,c);hanoi(n-1,b,a,c);}}main(){intn;printf("Inputaninteger:");scanf("%d",&n);hanoi(n,'A','B','C');}第131页/共446页
设有一个背包可以放入的物品重量为s,现有n件物品,重量分别为w1,w2,w3,……,wn。要求采用递归方法编写程序来判断能否从这n件物品中选择若干件放入此背包,使得放入物品的重量之和正好为s;如果存在符合上述要求的物品组合,输出其中一组所选各件物品的重量。#defineN10intw[N+1]={0,1,2,3,4,5,6,7,8,9,10};main(){intknap(int,int);ints;printf("s=");scanf("%d",&s);if(knap(s,N))printf("Success\n");elseprintf("False\n");}knap(s,n)knap(s-wn,n–1)knap(s,n–1)s=01s<0s>0且n<100其它intknap(ints,intn){或第132页/共446页
编程寻找满足abcd=(ab+cd)2的所有四位数,如3025=(30+25)2
形如XYZ和YZY的两个十六进制数相减,差为D79,编程求X、Y、Z的值
一个数的平方的尾数等于该数自身的自然数称为“自守数”,如62=36252=625 3762=141376,编程求出20000以内的自守数。
XYZYZYD79第133页/共446页intknap(ints,intn){if(s==0)return1;if((s<0)||(s>0&&n<1))return0;if(knap(s-w[n],n-1)){printf("%d",w[n]);return1;}elsereturnknap(s,n-1);}knap(s,n)knap(s-wn,n–1)knap(s,n–1)s=01s<0s>0且n<100其它或第134页/共446页
指针第135页/共446页什么是地址?在程序执行过程中,所有的数据对象都存储在计算机内存储器里。任何一个数据对象在它被执行的那段期间内都有一个确定的存储位置,占据着确定数目的存储单元。且每个存储单元有一个唯一的编号,即地址。地址在计算机内部是用二进制编码表示的,可作为程序中能够被处理的数据。第136页/共446页scanf(“%d”,&i);
地址和指针地址20002002……3000printf(“%d”,i);i_pointer=&i;
2000i_pointer123i_pointeriinti;int*i_pointer;第137页/共446页1.指针的概念指针是一种特殊的变量,本质是变量,但存放的是某个变量的地址。指针变量同样具有变量名、变量数据类型和变量值。注意内存单元的地址和内存单元的内容是两个不同的概念。第138页/共446页设:inti,j,k;i=3,j=6;k=i+j;(直接访问)i_pointer=&i;(间接访问)第139页/共446页2.指针变量的定义指针变量定义的一般形式: 类型*标识符;说明: “标识符”是指针变量的名字;“类型”表明该指针变量所指向的变量类型。int*i_pointer;inti;第140页/共446页举例:inti,j;int*pointer_1,*pointer_2; pointer_1=&i; pointer_2=&j;注意:一个指针变量只能指向同一个类型的变量。指针变量存储地址,以二进制编码表示,一般占2个字节空间。第141页/共446页3.指针变量的引用指针变量中只能存放地址例如: inta,*p1,*p2; p1=&a;(正确写法) p2=3;(错误写法!)指针变量的相关运算符:
&(取地址运算符)和*(指针运算符)第142页/共446页scanf(“%d”,&i);printf(“%d”,i);i_pointer=&i;
inti,*i_pointer;scanf(“%d”,i_pointer);printf(“%d”,*i_pointer);指针运算符第143页/共446页i_pointer==*i_pointer==&*i_pointer==*&i==i_pointer=&i;
inti,*i_pointer;&ii_pointer
ii第144页/共446页4.指针作为函数参数voidswap(inta,intb){ intc; c=a; a=b; b=c;}main(){ intx,y; scanf("%d%d",&x,&y); if(x<y) swap(x,y); printf("%d,%d",x,y);}第145页/共446页第146页/共446页voidswap(int*a,int*b){ intc; c=*a; *a=*b; *b=c;}main(){ intx,y; scanf("%d%d",&x,&y); if(x<y)swap(&x,&y); printf("%d,%d",x,y);}第147页/共446页第148页/共446页voidswap(int*a,int*b){ int*c;
*c=*a; *a=*b; *b=*c;}main(){ intx,y; scanf("%d%d",&x,&y); if(x<y)swap(&x,&y); printf("%d,%d",x,y);}第149页/共446页voidswap(int*a,int*b){ int*c; c=a; a=b; b=c;}main(){ intx,y; scanf("%d%d",&x,&y); if(x<y)swap(&x,&y); printf("%d,%d",x,y);}第150页/共446页第151页/共446页函数的参数可以是基本类型,也可以是指针类型指针作为函数参数,其作用是将一个变量的地址传送到另一个函数中去指针
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通信号控制系统操作规程
- 三农村电商售后服务与客户关系管理实战指南
- 安装光伏发电划算不
- 汽车 充电桩 新能源
- 课题研究可行性分析格式模板
- 项目进度管理与风险控制的工作计划
- 三农产品三农村市场风险防控方案
- 消防中级监控练习试题及答案
- 中级养老护理练习试题
- 茶艺师复习测试题
- 国立西南联合大学纪念碑碑文课件
- 螳臂当车课件
- 建设项目安全生产三同时情况表
- 五年级上册心理健康教育教案- 会学也会玩 全国通用
- 中国儿童肥胖诊断评估与管理专家共识
- 雾化吸入常见并发症的预防与处理
- 显微镜的使用方法专题培训课件
- 民俗学概论 教学大纲
- 控制工程基础教案第四章
- 盾构机同步注浆及二次注浆施工技术总结
- 粱昆淼第四版数学物理方法第10章
评论
0/150
提交评论