1 / 24

本章涉及指针 , 需要先学第八章内容

函数. 本章涉及指针 , 需要先学第八章内容. 本章主要内容. 函数定义 参数的传递 数组的传递 函数的调用和嵌套 main 函数的参数 函数编程举例. 函数使用事例. #include "stdio.h" double fun(int n){/* 函数定义* / int i; double l=1; if(n<2)return 1; else for(i=2;i<=n;i++)l*=i; return l; } void main() { int n,m; double c;

kesia
Download Presentation

本章涉及指针 , 需要先学第八章内容

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 函数 本章涉及指针,需要先学第八章内容

  2. 本章主要内容 • 函数定义 • 参数的传递 • 数组的传递 • 函数的调用和嵌套 • main函数的参数 • 函数编程举例

  3. 函数使用事例 • #include "stdio.h" • double fun(int n){/*函数定义*/ • int i; • double l=1; • if(n<2)return 1; • else for(i=2;i<=n;i++)l*=i; • return l; • } • void main() • { int n,m; • double c; • printf("输入n m:\n"); • scanf("%d%d",&n,&m); • c=fun(n)/(fun(m)*fun(n-m));/*调用函数*/ • printf("%lf",c); • } 问题: 计算 c= n!/(m!(n-m)!) n和m都是输入的整数

  4. 函数的定义 • 函数定义格式: • [返回值类型] 函数名(形式参数表){ • 函数体 • } • 说明: • 类型说明符省略时,相当于整形 • 函数中声明的参数称为形式参数,调用时代入的值称为实际参数 • 形式参数表可以为空,但是两侧的( )不能省略 • 函数用return 语句返回值,返回值类型必须与函数头声明的返回类型一致 • 没有返回值时,类型应声明成void,这种情况下,可以没有return语句或用空return • 函数必须先声明后使用,如果函数说明出现在调用之后时,要先用函数头说明 • 函数举例: • float area(float radius) • { float a; • a=3.14*radius*radius; • return a; • }

  5. 函数声明在main函数后时 • #include "stdio.h" • double fun(int n); • /*函数的原型声明,还可以写作double (int 任意变量名)或double fun(int )*/ • void main() • { int n,m; • double c; • printf("输入n m:\n"); • scanf("%d%d",&n,&m); • c=fun(n)/(fun(m)*fun(n-m));/*调用函数*/ • printf("%lf",c); • } • double fun(int n){/*函数定义*/ • int i; • double l=1; • if(n<2)return 1; • else for(i=2;i<=n;i++)l*=i; • return l; • }

  6. 头文件的产生

  7. 引用(选学) • //引用就是别名,给一个变量多个名字 • #include <iostream.h> • void main(){ • int a=20,&y=a; • y=30; • cout<<a<<endl; • }

  8. 参数传递方式 • 值传递 • 地址传递 • 引用传递

  9. 参数传递-数值传递 • #include <iostream.h> • void f(int b){ • b++; • cout<<"b="<<b<<endl; • } • void main() • { int a=1; • f(a); • cout<<"a="<<a<<endl; • }

  10. 参数传递-地址传递 • #include <iostream.h> • void f(int *b){ • (*b)++; • cout<<"*b="<<*b<<endl; • } • void main() • { int a=1; • f(&a); • cout<<"a="<<a<<endl; • }

  11. 参数传递-引用传递(选学) • #include <iostream.h> • void f(int &b){ • b++; • cout<<"b="<<b<<endl; • } • void main() • { int a=1; • f(a); • cout<<"a="<<a<<endl; • }

  12. 参数传递举例 • #include "stdio.h" • void fun(int *b){ • int t=5; • printf("1th b=%d\n",*b); • *b=t; /*给*b(变量a)赋值*/ • printf("2th b=%d\n",*b); • } • void main(){ • m1: int a=2; • m2: fun(&a); • m3: printf("3th a=%d\n",a); • } #include "stdio.h" void fun(int *b){ int t=5; printf("1th b=%d\n",*b); b=&t; /*给变量b赋值t的地址*/ printf("2th b=%d\n",*b); } void main(){ m1: int a=2; m2: fun(&a); m3: printf("3th a=%d\n",a); }

  13. 参数传递举例 • #include <iostream.h> • void f(int a,int *b){ • int t; • t=a;a=*b;*b=t; • } • void main() • { int x=2,y=3; • f(x,&y); • cout<<x<<","<<y<<endl; • }

  14. 一维数组传递 • 数组传递是传递数组的首地址 • 形式参数声明为指针、数组形式含义是相同的,都只是声明了一个指针,用来保存实参传来的首地址 • void fun(int p[N]); void fun(int p[]); void fun(int *p);/* 三种形式具有同样的含义*/ • 举例: • #include <iostream.h> • void fun(int *a){ • int i; • for(i=0;i<10;i++)a[i]++;//a[i]++可以写成(*(a+i))++ (*a++)++; • } • void main() • { int b[10]={0,1,2,3,4,5,6,7,8,9},i; • fun(b); • for(i=0;i<10;i++)cout<<b[i]<<","; • cout<<endl; • }

  15. 一维数组传递举例 • #include <iostream.h> • void fun(int a[]){ • int i; • for(i=2;i<5;i++)a[i]++; • } • void main() • { int b[10]={0,1,2,3,4,5,6,7,8,9},i; • fun(&b[3]); • for(i=0;i<10;i++)cout<<b[i]<<","; • cout<<endl; • }

  16. 二维数组传递 • 与二维数组对应的指针是数组指针 • void fun(int p[N][10]); void fun(int p[][10]); void fun(int (*p)[10]);/*数组指针做为参数*/ • #include "stdio.h" • void ainc(int p[][5],int line,int col){ • int i,j; • for(i=0;i<line;i++) • for(j=0;j<col;j++)p[i][j]++; • } • void main(){ • int a[3][5]={0},i,j; • ainc(a,3,5);/*传递处理的首地址,和要处理元素个数*/ • for(i=0;i<3;i++){ • for(j=0;j<5;j++) • printf("%d ",a[i][j]); • printf("\n"); • } • }

  17. 指针数组的传递 • 与指针数组名对应的指针是指针的指针 • void fun(int **p) void fun(int *p[]) void fun(int *p[N])/*三种形式具有相同含义*/ • #include "stdio.h" • #include "string.h" • void sort(char **pp,int len){ • int i,j; • char *t; • for(i=0;i<len-1;i++) • for(j=i+1;j<len;j++) • /*字符串逆序,则调整b[i]指针的次序*/ • if(strcmp(pp[i],pp[j])>0){ • t=pp[i]; • pp[i]=pp[j]; • pp[j]=t; • } • } • void main(){ • char a[5][20]={"she","he","we","me","you"},*b[5]; • int i; • for(i=0;i<5;i++)b[i]=a[i]; • sort(b,5); • for(i=0;i<5;i++)puts(b[i]); • }

  18. 嵌套 • #include <iostream.h> • void f1(){ • cout<<1<<endl; • cout<<2<<endl; • } • void f2(){ • cout<<3<<endl; • f1(); • cout<<4<<endl; • } • void main(){ • cout<<5<<endl; • f2(); • cout<<6<<endl; • }

  19. 主函数参数 • 主函数的形参类型和个数是固定的,第一个参数是整数,内存实参的个数,第二个参数是字符指针数组,或字符指针的指针,内存全部实参字符串的首地址 • 如: main(int argc,char **argv) main(int argc,char*argv[]) • 实参是通过在命令行执行时,后跟参数值实现的 • 例如: 程序名为prog • 形参:void main(int argc,char *argv[]) • 调用:prog aaa bbb ccc

  20. 主函数参数举例 • void main(int argc,char *argv[]) • argc为参数+1 • 例: • #include <stdio.h> • void main(int argc,char *argv[]) • { int i; • printf("%d\n",argc); • for(i=0;i<=argc;i++)puts(argv[i]); • }

  21. 例二主函数形式参数 • //把两个1位数字参数相加 • #include <iostream.h> • void main(int argc,char *argv[]) • { • int a,b; • a=argv[1][0]-'0'; • b=argv[2][0]-'0'; • cout<<a+b<<endl; • }

  22. 函数举例-1 //问题:用牛顿迭代法求方程f(x)=2*x*x*x-4*x*x+3*x-6根 //x=x0-f/f' #include <iostream.h> #include <math.h> double f(double x){ return 2*x*x*x-4*x*x+3*x-6; } double fb(double x){ return 6*x*x-8*x+3; } void main() { double x0,x=0; x0=3.0; x=x0-f(x0)/fb(x0); while(fabs(x-x0)>1e-5){ x0=x; x=x0-f(x0)/fb(x0); } cout<<x<<endl; }

  23. 函数举例-2 • 1. 分别用矩形法和梯形法求 #include <iostream.h> #include <math.h> double f(double x){ return x*exp(-x*x); } void main() { double a=0,b=2.5,h,s=0; int i,n; cin>>n; h=(b-a)/n; for(i=0;i<n;i++){ s+=f(a+i*h)+f(a+(i+1)*h); } s=s*h/2; cout<<s<<endl; }

  24. 函数举例 • 字符串函数的实现: • strlen • strcpy • strcat • strcmp

More Related