日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现。在C++程序的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代码调用。 一个程序,无论复杂或简单,总体上都是一个“函数”;这个函数就称为“main 函数”,也就是“主函数”。比如有个“做菜”程序,那么“做菜”这个过程就是“主函数”。在主函数中,根据情况,你可能还需要调用“买菜,切菜,炒菜档桥”等子函数。 [编辑本段] main函数的参数 C程序最大的特点就是所有的程序都是用函数来装配的。main()称之为主函数,是所有程 序运行的入口。其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用 的是有参函数,则参数在调用时传递。 main() { ... y1=f1(x1,x2); ... } f1(int a,int b) { .... Y2=f2(x3,x4); .... } f2(int m,int n) { .... ..... } 在前面课程的学习中,对main()函数始终作为主调函数处理,也就是说,允许main()调用 其它函数并传递参数。事实上,main()函数既可以是无参函数,也可以是有参的函数。对于有 参的形式来说,就需要向其传递参数。但是其它任何函数均不能调用main()函数。当然也同样 无法向main()函数传递,只能由程序之外传递而来。这个具体的问题怎样解决呢? 我们先看一下main()函数的带参的形式: main(argc,argv) int argc,char *argv[]; { ..... } 从函数参数的形式上看,包含一个整型和一个指针数组。当一个C的源程序经过编译、链接后,会生成扩展名为.EXE的可执行文件,这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的。对main()函数既然不能由其它函数调用和传递参数,就只能由 系统在启动运行时传递参数了。 在操作系统环境下,一条完整的运行命令应包括两部分:命令与相应的参数。其格式为: 命令参数1参数2....参数n¿ 此格式也称为命令行。命令行中的命令就是可执行文件的文件名,其后所跟参数需用空格分隔,并为对命令的进一步补充,也即是传递给main()函数的参数。 命令行与main()函数的参数存在如下的关系: 设命令行为:program str1 str2 str3 str4 str5 其中program为文件名,也就是一个由program.c经编译、链接后生成的可执行文件 program.exe,其后各跟5个参数。对main()函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数 argc的值决定,即为char*argv[6],前森指针数组的取值情况如图6-15所示。 数组的各指针分别指向一个字符串。应当引起注意的是接收到的指针数组的各指针是从命令行的开始接收的,首先接收到的是命令,其后 才是参数。 下面用实例来说明带参数的main()函数的正确使用。 [例6-29] 利用图形库函数绘制一个变化的环。它是把一个半径为R 1的圆周分成n份,然 后以每个等分点为圆心,以R s为半径画n个圆(关于作图的详细理论本教材第9章第1节作了专 门介绍,这里只作简单分析)。利用m a i n ( )函数的带参数形式,我们可以从键盘以命令行的方 式输入R 1和R s及屏幕的背景色。 #include <graphics.h> /*包含图形库函数的头文件* / #include <math.h> #define pi 4.1415926 m a i n ( a r g c , a r g v ) int argc;char *argv[]; /* 定义带参数的m a i n ( ) * / { int x,y,r1,rs,color; double a; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,"..\\bgi ")启;/动*图形工作方式*/ r1=atoi(argv[1]);/*计算基础圆半径*/ rs=atoi(argv[2]);/*计算同心圆半径*/ color=atoi(argv[3]);/*背景色*/ cleardevice();/行悔猛*清除图形屏幕*/ setbkcolor(color);/*设置背景色*/ setcolor(4);/*设置图形显示颜色*/ for(a=0;a<=2*pi;a+=pi/18)/*绘制同心圆*/ { x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs);/*以圆心坐标为x、y,半径为rs画圆*/ } getch();/*等待按键继续*/ close graph();/*关闭图形工作方式*/ } 若程序名为L6-29.c,经编译、连结生成可执行文件L6-29.exe。在操作系统的环境下运行 程序,命令行方式为: l6-29 40 20 3 则命令行与main()函数的参数有如图6-16所示的关系 图6-16中,argv[0]是程序名,argv[1]是r1的值, argv[2]是rs的值,argv[3]是屏幕的背景色。 由于指针数组均存放字符串,所需的圆半径及背景 色彩通过atoi()函数转换为整型。 通过带参数的main()函数,我们可以为自己的程序设置口令,在运行程序的命令行中给出所需的口令,正确则继续,否则退出。程序图形输出如图6-17所示。 [例6-30]将上述程序作修改,在程序的入口处添置密码,若给定密码正确,则显示图 形。 #include<graphics.h> #include <math.h> #define pi 4.1415926 m a i n ( a r g c , a r g v ) int argc;char *argv[]; { int x,y,r1,rs,color; double a; int gdriver=DETECT,gmode; if (strcmp(argv[1],"pass")!=0) 设/置* 口令的比较*/ { printf("password error!\n"); e x i t ( 0 ) ; } initgraph(&gdriver,&gmode,"..\\bgi "); r1=atoi(argv[2]); rs=atoi(argv[3]); color=atoi(argv[4]); cleardevice(); setbkcolor(color); setcolor(4); for(a=0;a<=2*pi;a+=pi/18) { x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs); } getch(); closegraph(); } 在操作系统的环境下运行程序, 命令行中增加口令“p a s s”,命令行方式为: l6-30 pass 20 40 3 指针数组的存储字符串如图6-18所示。 若给定字符串argv[1]的值是pass,则程序正确运行,否则程序退出。口令正确的情况下,显示的图形为图6-17中的一个。 [编辑本段] 函数的分类 1、从用户使用的角度看,函数有两种: (1)、标准函数,即库函数。这是由系统提供的。 (2)、用户自定义的函数。可以解决用户的专门需要。 2、从函数的形势看,函数分两类: (1)无参函数。printstar和print_message就是无参函数。在调用无参函数时,主调函数并不将数据传送给被调用函数,一般用来执行指定的一组操作。 (2)有参函数。在调用函数时,在主调函数和被调用函数之间有数据传递。也就是说,主调函数可以将数据传递给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。 [编辑本段] 函数定义的一般形式 1、无参函数的定义形式 类型标示符 函数名() {声明部分 语句 } 2、有参函数定义的一般形式 类型标示符 函数名 (形式参数列表) {声明部分 语句 } 3、可以有“空函数” 它的形式为 类型说明符 函数名() { } 例如: dummy(){} 4、对形参的声明的传统方式 在老版本c语言中,对形参类型的声明是放在函数定义的第二行,也就是不再第一行的括号内指定形参的类型,而在括号外单独指定,例如上面定义的max函数可以写成一下形式: int max (x,y)/*指定形参x,y*/ int x,y;/*对形参指定类型*/ {int z; z=x>y?x:y; return(z); }