C语言设计

第25章


=i)
      {
strcpy(st,cs[i]);
strcpy(cs[i],cs

);
strcpy(cs

,st);
      }
    puts(cs[i]);}printf(" ");
}
本程序的第一个 for 语句中,用 gets 函数输入五个国家名字符串。上面说过C语言允
许把一个二维数组按多个一维数组处理,本程序说明 cs[5][20]为二维字符数组,可分为五
个一维数组 cs[0],cs[1],cs[2],cs[3],cs[4]。因此在 gets 函数中使用 cs[i]是合法的。
在第二个 for 语句中又嵌套了一个 for 语句组成双重循环。这个双重循环完成按字母顺序排
序的工作。在外层循环中把字符数组 cs[i]中的国名字符串拷贝到数组 st 中,并把下标 i
赋予 P。进入内层循环后,把 st 与 cs[i]以后的各字符串作比较,若有比 st 小者则把该字
符串拷贝到 st 中,并把其下标赋予 p。内循环完成后如 p 不等于 i 说明有比 cs[i]更小的字
符串出现,因此交换 cs[i]和 st 的内容。至此已确定了数组 cs 的第 i 号元素的排序值。然
后输出该字符串。在外循环全部完成之后即完成全部排序和输出。
7.5 本章小结
谭浩强      C 语言程序设计               2001 年 5 月 1 日
1.数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组
以及后面将要介绍的指针数组,结构数组等。
2.数组可以是一维的,二维的或多维的。
3.数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又
称为下标变量。 数组的类型是指下标变量取值的类型。
4.对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。
对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行
操作。
8.1 概述
谭浩强      C 语言程序设计               2001 年 5 月 1 日
8 函 数
在前面已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序中大都只有一个
主函数 main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函
数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅
提供了极为丰富的库函数(如 Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自
己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来
使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函
数式语言。
由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清
晰,便于程序的编写、阅读、调试。
在C语言中可从不同的角度对函数分类。
1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。
1) 库函数:由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序
前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用
到 printf、scanf、getchar、putchar、gets、puts、strcat 等函数均属此类。
2) 用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定
义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能
使用。
2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为
有返回值函数和无返回值函数两种。
1) 有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数
返回值。如数学函数即属于此类函数。由用户定义的这种要返回函数值的函数,必
须在函数定义和函数说明中明确返回值的类型。
2) 无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返
回函数值。这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此
类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。
3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。
1) 无参函数:函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之
间不进行参数传送。此类函数通常用来完成一组指定的功能,可以返回或不返回函
数值。
2) 有参函数:也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简
称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函
数调用时,主调函数将把实参的值传送给形参,供被调函数使用。
4. C语言提供了极为丰富的库函数,这些库函数又可从功能角度作以下分类。
1) 字符类型分类函数:用于对字符按 ASCII 码分类:字母,数字,控制字符,分隔符,
大小写字母等。
2) 转换函数:用于字符或字符串的转换;在字符量和各类数字量(整型,实型等)之间
谭浩强      C 语言程序设计               2001 年 5 月 1 日
进行转换;在大、小写之间进行转换。
3) 目录路径函数:用于文件目录和路径操作。
4) 诊断函数:用于内部错误检测。
5) 图形函数:用于屏幕管理和各种图形功能。
6) 输入输出函数:用于完成输入输出功能。
7) 接口函数:用于与 DOS,BIOS 和硬件的接口。
8) 字符串函数:用于字符串操作和处理。
9) 内存管理函数:用于内存管理。
10) 数学函数:用于数学函数计算。
11) 日期和时间函数:用于日期,时间转换操作。
12) 进程控制函数:用于进程管理和控制。
13) 其它函数:用于其它各种功能。
    以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需
要一个较长的学习过程。应首先掌握一些最基本、最常用的函数,再逐步深入。由于课时关
系,我们只介绍了很少一部分库函数,其余部分读者可根据需要查阅有关手册。
还应该指出的是,在C语言中,所有的函数定义,包括主函数 main 在内,都是平行的。
也就是说,在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之
间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自
己,称为递归调用。
main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此,C程序
的执行总是从 main 函数开始,完成对其它函数的调用后再返回到 main 函数,最后由 main
函数结束整个程序。一个C源程序必须有,也只能有一个主函数 main。
8.2 函数定义的一般形式
1. 无参函数的定义形式
类型标识符 函数名()
       {声明部分
      语句
   }
其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实
际上是函数返回值的类型。 该类型标识符与前面介绍的各种说明符相同。函数名是由用户
定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。
{}中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量的类型说
明。
    在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为 void。
我们可以改写一个函数定义:
void Hello()
    {
       printf ("Hello,world  ");
}
这里,只把 main 改为 Hello 作为函数名,其余不变。Hello 函数是一个无参函数,当
被其它函数调用时,输出 Hello world 字符串。
2. 有参函数定义的一般形式
谭浩强      C 语言程序设计               2001 年 5 月 1 日
类型标识符 函数名(形式参数表列)
       {声明部分
      语句
   }
有参函数比无参函数多了一个内容,即形式参数表列。在形参表中给出的参数称为形式
参数,它们可以是各种类型的变量,各参数之间用逗号间隔。

小说推荐
返回首页返回目录