flag=0; /*标志变量赋初值*/
clrscr(); /*清屏,以下是显示功能菜单*/
printf("************************\n");
printf("*Please select the function(03):*\n");
printf("*1 Dispiay the calendar of one year.*\n");
printf("*2 Dispiay the calendar of one month.*\n");
printf("*3 Display the weekday of one day.*\n");
printf("*0.Exit*\n”);
printf("* ***********************\n");
scanf("%d",&choice);
switch(choice) {
case 0:
clrscr ();
printf ("Thank you for use this software.\n"); /*显示信息*/
printf("Welcome to use it again\n");
flag=1;break;
case 1:oneyear();break; /*显示全年*/
case 2:onemonth();break; /*显示某个月*/
case 3:oneday();break; /*确定某一天的星期数*/
default:printf("Your choice wrong,please input again.");
getch();
} /*结束 switch */
if(flag) break;
} /*结束 while*/
} /*结束 main */
程序说明:
(1)该程序包含所有子函数的源文件,根据用户选择的功能调用相应的自定义子函数。
(2)在主程序中,菜单循环显示,用户可以一直使用,直到选择功能键“0” ,退出程序。
习 题
一、选择题
1.以下说法中正确的是( ) 。
A.C 语言程序总是从第一个函数开始执行
B.在 C 语言程序中,要调用的函数必须在 main()函数中定义 C.C 语言程序总是从 main()函数开始执行
D.C 语言程序中的 main()函数必须放在程序的开始部分
2.某文件中定义的静态全局变量(或称静态外部变量)其作用域是( ) 。 A.只限某个函数 B.本文件
C.跨文件 D.不限制作用域
3.下列叙述中正确的是( ) 。
A.函数定义不能嵌套,但函数调用可以嵌套
B.函数定义可以嵌套,但函数调用不可以嵌套 C.函数定义和函数调用都不能嵌套
D.函数定义与函数调用都可以嵌套 4.以下说法中正确的是( ) 。
A.#define 和 printf 都是 C 语句 B.#define 是 C 语句,而 printf 不是 C.printf 是 C 语句,但#define 不是 D.#define 和 printf 都不是 C 语句 5.有以下函数:
char *fun(char *p) { return p; }
该函数的返回值是( ) 。
A.无确切的值 B.形参 p 中存放的地址值 C.一个临时存储单元的地址 D.形参 p 自身的地址值 6.以下是一个自定义函数的头部,其中正确的是( ) 。
A.int fun(int a[ ],b) B.int fun(int a[ ],int a) C.int fun(int *a,int b) D.int fun(char a[ ][ ],int b) 7.以下关于函数的叙述中,正确的是( ) 。
A.在函数体中可以直接引用另一个函数中声明为 static 类别的局部变量的值 B.在函数体中至少必须有一个 return 语句
C.在函数体中可以定义另一个函数 D.在函数体中可以调用函数自身
8.在 C 语言中,若对函数类型未加显式说明,则函数的隐含类型是( ) 。 A.void B.double C.int D.char 9.下面不正确的描述为( ) 。
A.调用函数时,实参可以是表达式
B.调用函数时,实参与形参可以共用内存单元 C.调用函数时,将为形参分配内存单元 D.调用函数时,实参与形参的类型必须一致 10.有关宏定义的正确说明是( ) 。
A.可出现在一行中的任何位置
B.只能放在程序的开头,且每一个宏定义单独占一行 C.可出现在程序的任何位置
D.以#开头的行,可出现在程序的任何位置,通常每一个宏定义只能单独占一行,使 用字符“\”可实现一个宏定义占用若干行
11.若程序中有宏定义行:
#define N 100
则以下叙述中正确的是( ) 。
A.宏定义行中定义了标识符 N 的值为整数 100
B.在编译程序时对 C 源程序进行预处理时用 100 替换标识符 N C.对 C 源程序进行编译时用 100 替换标识符 N
D.在运行时用 100 替换标识符
12.若调用函数的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )
A.函数的实参和其对应的形参共占同一存储单元 B.形参只是形式上的存在,不占用具体存储单元 C.同名的实参和形参占同一存储单元
D.函数的形参和实参分别占用不同的存储单元 13.C 语言规定,函数返回值的类型是由( ) 。
A.return 语句中的表达式类型所决定 B.调用该函数时的主调函数类型所决定 C.调用该函数时系统临时决定
D.在定义该函数时所指定的函数类型所决定
14.关于函数的定义和调用,以下说法正确的是( ) 。 A.用户若需调用标准库函数,调用前必须重新定义 B.用户可以重新定义标准库函数,该函数将失去原有含义 C.系统根本不允许用户重新定义标准库函数
D.用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到 用户源文件中,系统自动去调用
15.C 语言关于实参类型的规定,以下说法不正确的是( ) 。 A.实参可以是常量、变量或表达式
B.形参可以是常量、变量或表达式 C.实参可以为任何类型
D.形参应与其对应的实参类型一致
16.C 语言规定:简单变量做实参时,它和对应形参之间的数据传递方式是( ) 。 A.由用户指定的传递方式
B.单向值传递
C.由实参传给形参,再由形参传回给实参 D.地址传递
17.以下关于实参和形参所占存储单元的叙述中说法正确的是( ) 。 A.在 C 语言中实参和与其对应的形参各占用独立的存储单元 B.在 C 语言中实参和与其对应的形参共占用一个存储单元
C.在 C 语言中只有当实参和与其对应的形参同名时才共占用存储单元 D.在 C 语言中形参是虚拟的,不占用存储单元
18.以下对 C 语言函数的有关描述中,正确的是( ) 。
A.调用函数时,只能将实参的值传送给形参,形参的值不能传送给实参 B.C 函数既可以嵌套定义又可以递归调用
C.函数必须有返回值,否则不能使用函数
D.C 程序中有调用关系的所有函数必须放在同一个源程序文件中 19.若调用一个函数,且此函数中没有 return 语句,则该函数( ) 。
A.没有返回值 B.返回若干个系统默认值 C.能返回一个用户所希望的值 D.返回一个不确定的值
20.若己定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( ) 。 A.函数调用可以作为独立的语句存在
B.函数调用可以作为另一个函数的实参
C.函数调用可以出现在表达式中 D.函数调用可以作为另一个函数的形参 21.以下函数调用语句的实参个数为( ) 。
fun((ex1,exp2),(exp3,exp4,exp5));
A.1 B.2 C.4 D.5
22.以下函数值的类型是( ) 。 fun(float x)
{ float y;
y=3*x4;
return y;
}
A.int B.不确定 C.void D.float 23.若有以下程序,则以下叙述中不正确的是( )
#include<stdio.h>
void f(int n) void main() void f(int n);
f(5);
}
void f(int n) {printf("%d\n",n);}
A.若只在主函数中对函数 f 进行说明,则只能在主函数中正确调用函数 f
B.若在主函数前对函数 f 进行说明,则在主函数和其后的其他函数中都可以正确 调用函数 f
C.对于以上程序,编译时系统会提示出错信息,提示对函数 f 重复说明 D.函数 f 无返回值,所以可用 void 将其类型定义为无值型
24.一个 C 语言源程序文件中所定义的全局变量的作用域为( ) 。 A.所在文件的全部范围
B.所在程序的全部范围 C.所在函数的全部范围
D.由具体定义位置和 exlern 说明来决定范围
25.在 C 语言中,存储类型为( )的变量只有在使用它们时才占存储空间。
A.static 和 auto B.register 和 auto C.static 和 register D.register 和 extern
26.若一个外部变量的定义形式为 static int x;则 static 的作用应当是( ) 。 A.将变量存放在静态存储区 B.使变量 X 可以由系统初始化 C.使变量 X 只能在本文件内使用 D.使 X 的值可以永久保留 二、填空题
1.编译预处理的三种形式除宏定义外,还有__________和__________。
2.C 语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是__________。
3.C 语言变量按其作用域可分为__________和__________,按其生存期可分为__________
和__________。
4.C 语言变量的存储类别有__________、__________、__________和__________。
三、阅读程序,写出执行结果
1.以下程序的运行结果是( ) 。 int w=0;
void fun() {
printf("%d,",w);
}
void main() {
int w=5;
printf("%d,",w);
fun();
printf("%d,",w);
}
2.以下程序的运行结果是( ) 。 int k=1;
void fun(int n) {
m+=k;
k+=m;
printf("%d,5d",m,k);
}
int j=2;
main() {
int i=3;
fun(i);
printf("%d,%d,%d\n",i,j,k);
}
3.以下程序的运行结果是( ) 。
#define F(x) 4*x*x+1 main()
{ int i=1,j=3;
printf("%d,%d",F(5)*2,F(i+j)*2);
}
4.以下程序的运行结果是( ) 。
#include<stdio.h>
fun(int x,int ,y,int z) { z=x*x+y*y;
returnz;
}
void main() { int a=31;
fun(5,2,a);
printf("%d",a);
}
5.以下程序的运行结果是( )。
#include<stdio.h>
float fun(int x,int y) { return(x+y); }
void main()
{ int a=2,b=3,c=8;
printf("%3.0f\n",fun((int)fun(a+c,b),ac));
}
6.以下程序的运行结果是( )。
#include<stdio.h>
int f(int n)
{ if(n==1) return 1;
else return f(n1)+1;
}
void main() { int i,j=0;
for(i=1;i<3;i++) j+=f(i);
printf("%d\n",j);
}
7.以下程序的运行结果是( )。
void main() {
int i,j,x,y,n,g;
void fun(int i,int j);
i=2;j=3;g=x=5;y=9;n=7;
fun(n,6);
printf("g=%d;i=%d;j=%d\n",g,i,j);
printf("x=%d;y=%d\n",x,y);
fun(n,6);
}
void fun(int i,int j) {
int x,y,g;
g=8;x=7;y=2;
printf("g=%d;i=%d;j=%d\n",g,i,j);
printf("x=%d;y=%d\n",x,y);
x=8;y=6;
}
8.以下程序的运行结果是( )。 void main()
{
int i,j;
int ran();
int rand();
for(i=0;i<3;i++) {
for(j=0;j<2;j++)
printf("%3d",ran());
printf("\n");
}
for(i=0;i<3;i++) {
for(j=0;j<2;j++)
printf("%3d",rand());
printf("\n");
} }
int ran() {
static int see=1234,n;
printf("(see=%4d)”,see);
see=(see+25543)%7415;
n=(see%1000)/10;
return(n);
}
int rand() {
int see=1234,n;
printf("(see=%4d) ",see);
see=(see+25543)%7415;
n=(see%1000)/10;
return(n);
}
9.以下程序的运行结果是( )。
#include"stdio.h"
#define LOW 0
#define HIGH 5
#define CHANGE 2 int i=LOW;
void main() {
int workover(int i);
int reset(int i);
int i=HIGH;
reset(i/2);
printf("i=%d\n",i);
reset(i=i/2);
printf("i=%d\n",i);
reset(i/2);
printf("i=%d\n",i);
workover(i);
printf("i=%d\n",i);
}
int workover(int i) {
i=(i%i)*((i*i)/(2*i)+4);;
printf("i=%d\n",i);
return(i);
}
int reset(int i) {
i=i<=CHANGE?HIGH:LOW;
return(i);
}
四、编程题
1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,
并输出结果,两个整数由键盘输入。
2.采用函数的调用,编写程序求三个数中的最大数。
3.设计一个求 100~200 间所有素数之和的程序,其中素数的判定用函数实现。
4.采用函数调用的方法,编程求梯形的面积(上底、下底和高的值从键盘输入)。 5.利用递归函数调用方式,将所输入的 5 个字符以相反顺序打印出来。