2. 3. 4. 5. 6. 7. 8. 在C语言中,函数可以嵌套定义。
函数是C程序的主体,任何C程序必须有且只有一个main函数。
c语言本身没有输入输出语句,其输入、输出是通过函数调用来完成的。 c程序可由若干个源程序文件组成。
实参变量对形参变量的数据传递是“值传递”,即单向传递。
在C语言中,函数中的任何变量都可以赋初值,每调用一次该函数,就赋一次初值。 c语言中函数定义不允许嵌套,但调用可嵌套。
四. 阅读程序
1. #include
{ int b=0; static int c=2; b++; c++; return a+b+c; }
main()
{ int i;
for (i=0; i<4; i++) printf(\
}
2. #include
{ if (a%b==0) return b;
else return fun(b,a%b); }
main()
{ int a=20,b=24;
printf(\} 3.
#include
void fun(int n,char a,char b,char c) { if (n>0)
{
fun(n-1,a,c,b); printf(\}
} main() {
fun(3,'1','2','3'); }
五. 程序判断题
1. 下面add函数求两个参数的和;判断下面程序的正误,如果错误请改正过来。
void add(int a,int b) { int c ; c = a + b; return (c) ; }
2. 下面函数fun的功能是:统计字符串s中各元音字母(即A,E,I,O,U)的个数,注意:字母不分大,
小写;判断下面程序的正误,如果错误请改正过来。 fun (char s[ ], int num[5]) { int k; i=5;
for (k=0; k
switch ( s ) {
case ?a?: case ?A?: i=0; case ?e?: case ?E?: i=1; case ?i? : case ?I? : i=2; case ?o?: case ?O?: i=3; case ?u?: case ?U?: i=4; }
if (i >= 0) num[i]++; } }
3. 下面函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串;判
断下面程序的正误,如果错误请改正过来。 void fun (char s[ ]) { int i,j;
for (i=0,j=0; s[i]!=?\\0?; i++) if (s[i]>=?0? && s[i]<=?9?) s[j]=s[i]; s[j]=”\\0”; }
六. 程序填空
1. 下面程序是求100~200间的全部素数(每10个素数输出在一行上)。
int prime( int m) { int n;
for (n=2; n main() { int m,n=0; /* n用来统计素数的个数*/ for (m=100; m<=200; m++) if (prime(m) ) printf(“M%c”,m , _______________ ); return 0; } 2. 下面程序的功能是把十进制正整数转换成2到16进制中任一数制的程序。 如:输入 10 2 则输出 1010。 输入 10 8 则输出 12。 #include void fun(int num, int base) { char s[]=\int p[20],n=0; do { p[n++]=numose; } while ( ______________ ); for ( ______________ ; n>=0; --n) printf(\ ] ); printf(\ } main() { int num,base; scanf(\ fun(num,base); } 3. 下面函数的作用是通过递归的方法将字符串倒置,请填空使程序完整。 void fun(char s[ ],int l,int h) { if ( ) return ; else { char t ; fun ( ) ; t = s[l] , s[l]=s[h] , s[h]=t ; } } 4. 设数组a中的n个整数已按从小到大的顺序排列,函数bin_search用折半法找出整数x是否在数组中, 找到则返回对应元素的下标,否则返回-1。 int bin_search(int a[],int x,int n) { int left,right,mid; left=0; right=n-1; while (left<=right) { mid=(left+right)/2; if (______________ ) return mid; else if (______________ ) right=mid-1; else ______________; } ______________ ; } 七. 程序编写 1. 编写一函数,由实参传来字符串,统计其中字母、数字、空格的个数,在主函数中输入串,并输出 统计结果。 2. 编一个函数sort,使10个整数按从大到小的顺序排列,在main函数中输入这10个数,并输出排好 序的数。 3. 写一个函数,使给定的一个二维数组(N×N)转置,即行列互换。(N是不大于10的数,由输入决 定)。 4. 用递归法将一个整数转换成字符串。例如,输入12345,应输出字符串“54321”。n的位数不确定, 可以是任意的整数。 5. 编写一个fun函数void fun(char s1[],char s2[]),将两个字符串s1和s2连接起来存放在s1中。 6. 编写一个fun函数:int fun(int a[], int n),删去一维数组中所有相同的数,使之只剩一个。数组中的数 已按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,一维数组中的数据是:2 2 2 3 4 4 5 6 6 6 7 7 8 9 9 10 10 10,删除后,数组中的内容应该是:2 3 4 5 6 7 8 9 10 7. 设计一个程序,统计一个班(最多有35人)的学生成绩,要求能实现如下四个功能:(1)由键盘输 入每个学生的四门课程的成绩;(2)计算每个学生的平均分和总分,这个功能模块由自定义函数实现;(3)计算每个学生的总分与平均分。同样用自定义函数实现;(4)根据用户的要求输出某门课程不及格的学生。 第 9 章 一. 选择题 编译预处理 1. 以下叙述不正确的是( )。 A. 预处理命令行都必须以#开始 B. 在程序中凡是以#开始的语句行都是预处理命令行 C. C程序在执行过程中对预处理命令行进行处理 D. 预处理命令行可以出现在C程序中任意一行上 2. 以下叙述中正确的是( )。 A. 在程序的一行上可以出现多个有效的预处理命令行 B. 使用带参数的宏时,参数的类型应与宏定义时的一致 C. 宏替换不占用运行时间,只占用编译时间 D. C语言的编译预处理就是对源程序进行初步的语法检查 3. 以下有关宏替换的叙述不正确的是( )。 A. 宏替换不占用运行时间 B. 宏名无类型 C. 宏替换只是字符替换 D. 宏名必须用大写字母表示 4. 在“文件包含”预处理命令形式中,当#include后面的文件名用\(双引号)括起时,寻找被包含 文件的方式是( )。 A. 直接按系统设定的标准方式搜索目录 B. 先在源程序所在目录中搜索,再按系统设定的标准方式搜索 5. 6. 7. 8. C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 在宏定义 #define PI 3.1415926 中,用宏名PI代替一个( )。 A.单精度数 B.双精度数 C.常量 D.字符串 以下程序的运行结果是( )。 A.9 B.10 C.12 D.18 #define ADD(x) x+x main ( ) { int m=1,n=2,k=3,sum ; sum = ADD(m+n)*k ; printf(“%d\\n”,sum) ; } 以下程序的运行结果是( )。 A.10 B.15 C.100 D.150 #define MIN(x,y) (x)>(y) ? (x) : (y) main ( ) { int i=10, j=15 , k; k = 10*MIN(i,j); printf(“%d\\n”,k); } 在任何情况下计算平方数都不会引起二义性的宏定义是( )。 A. #define POWER(x) x*x B. #define POWER(x) (x)*(x) C. #define POWER(x) (x*x) D. #define POWER(x) ((x)*(x)) 二. 判断题 1. 宏替换时先求出实参表达式的值,然后代入形参运算求值。 2. 宏替换不存在类型问题,它的参数也是无类型。 3. #include 5. 凡是c源程序中行首以\标识的控制行都是预处理命令。 6. #include ?>命令中的文件名是不能包括路径的。 7. 可以使用条件编译命令来选择某部分程序是否被编译。 8. 在软件开发中,常用条件编译命令来形成程序的调试版本或正式版本。 三. 阅读程序 1. #define S x=y #define P2(x,y) printf(\ main() { int x,y; S=1; ++x || ++y; P2(x,y); S=1; ++x && ++y; P2(x,y); S=-1; ++x || ++y; P2(x,y); } 2. #define M(x,y,z) x*y+z main() { int a=1,b=2, c=3; printf(\} 四. 程序编写 1. 定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交 换后的两个值。说明:在程序主函数使用宏时只能用两个实参,如SWAP(a,B.,不能用三个实参。 1s?(a?b?c)area?s(s?a)(s?b)(s?c)22. 三角形的面积为,其中,a,b,c为三角形的三边。定 义两个带参数的宏,一个用来求s,另一个用来求area。写程序,在程序中用带实参的宏名来求面积area。 第 10 章 一. 选择题 指针 1. 变量的指针,其含义是指该变量的( )。 A.值 B.地址 C.名 D.一个标志 2. 已有定义int k=2,*ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 ( )。 A.k=*ptr1+*ptr2 B.ptr2=k C.ptr1=ptr2 D.k=*ptr1*(*ptr2) 3. 若有说明:int *p,m=5,n; 以下程序段正确的是( )。 A.p=&n; scanf(“%d”,&p); B.p = &n ; scanf(“%d”,*p); C.scanf(“%d”,&n); *p=n ; D.p = &n ; *p = m ; 4. 若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是( )。 A.p1=&m; p2=&p1 ; B.p1=&m; p2=&n; *p1=*p2 ; C.p1=&m; p2=p1 ; D.p1=&m; *p1=*p2 ; 5. 若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是( )。 A.a, p, *&a B.&*a,&a,*p C.*&p,*p,&a D.&a,&*p,p 6. 下面程序段中,for循环的执行次数是( )。 A.9 B.7 C.6 D.5 char *s=”\\ta\\018bc” ; for ( ; *s!=?\\0? ; s++) printf(“*”) ; 7. 下面能正确进行字符串赋值操作的是( )。 A.char s[5]={“ABCDE”}; B.char s[5]={?A?,?B?,?C?,?D?,?E?}; C.char *s ; s=”ABCDE” ; D.char *s; scanf(“%s”,s) ; 8. 下面程序段的运行结果是( )。 char *s=”abcde” ; s+=2 ; printf(“%d”,s); A.cde B.字符?c? C.字符?c?的地址 D.不确定 9. p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是 ( )。 A.c=*p1+*p2 B.p2=c C.p1=p2 D.c=*p1*(*p2) 10. 以下说明不正确的是( )。 A.char a[10]=”china” ; B.char a[10],*p=a; p=”china”; C.char *a; a=”china” ; D.char a[10],*p; p=a=”china”; 11. 若有定义:int a[5];则a数组中首元素的地址可以表示为( )。 A.&a B.a+1 C.a D.&a[1] 12. 已有函数max(a,b),为了让函数指针变量p指向max,正确的方法是( )。 A.p=max; B.p=max(a,b); C.*p=max; D.*p=max(a,b); 13. 对于类型相同的指针变量,不能进行哪种运算? A. + B. - C. = D. == 14. 若有以下说明和语句,则p1-p2的值为多少? int a[10], *p1, *p2; p1=a; p2=&a[5]; A. 5 B. 6 C. 10 D. 非法 15. main()函数可以带两个形参,一般分为argc和argv,其中argv可以定义为( )。 A. int argv; B. char * argv[]; C. char argv[]; D.char ** argv[]; 16. 若有定义:int (*p)[4];则标识符p( )。 A.是一个指向整型变量的指针 B.是一个指针数组名 C.是一个指针,它指向一个含有四个整型元素的一维数组 D.定义不合法