C语言程序设计(1-6章)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计
第1章概论
1.1 C语言有哪些主要特点?其主要用途是什么?
1.2 程序设计语言的主要构成要素有哪些?
1.3 程序设计语言的实现都有哪些方法?
1.4 程序设计语言按照实现方法可分为哪几种类型?
1.5 为什么要学习程序设计语言?
1.6 将C语言和你所掌握的高级语言做一比较。
1.7 C程序的主要构成单位是什么?
1.8 C语言的保留字和特定字有何区别?
1.9 下面哪些是合法的C语言一般标识符?
std-sex, Std-num, 2.13, _2.13, name, int, Int, var-num, yes_or_no, select, File_name, _DATA, define, a+c, new, ok?
1.10 C程序从编辑到执行要经过哪些步骤?
1.11 C函数主要由哪几部分构成?复合语句在C语言中是用什么标界的?又称为什么?
1.12 填空。
1 . 一个C程序是由若干个函数构成的,其中必须有一个函数。
2 . 一个C语句最少应包含一个。
1.13 单项选择。
1. C语言程序的基本单位是( )。
(1) 子程序 (2) 程序 (3) 过程 (4) 函数
2. 合法的C语言标识符是( )。
(1) _a1 (2) a+b (3) 3abc (4) AB,CD
答案:
1.1C语言主要用于编写系统软件,其主要特点如下:
①语言简洁,紧凑,使用灵活
②运算符丰富
③具有数据类型构造和流控结构能力
④语言生成的代码质量高
⑤可移植性好
⑥语言语法限制不严格,程序设计自由度大
1.2程序设计语言的主要构成要素有:
①数据。
②运算(操作)
③控制结构
④存储答理
⑤固运算环境。
1.3 程序设计语言的实现方法主要有:
1. 翻译或编译。
2. 软件模拟(软件解释)。
1.4 程序设计语言的按照实现方法有编译型和解释型两种。
1.5略 1.6 略
1.7 C程序的主要构成单位是函数。
1.8 C程序的保留字和特定字的区别是,保留字不能用来表示用户自定义的对
象,而特定字却不受此限(尽管不提倡这样做)。
1.9 合法的一般标识符如下:
name, int, yes_or_no, select, File_name,_DATA, new
1.10 要经过编辑程序一C 预处理程序一C 编译程序一汇编程序一连接程序一执行。
1.11函数主要由返回值类型, 函数名及参数列表构成。
复合语句是用{}来标界的,又称为作用域。
1.12 1.main
2.;
1.13 1. (4)
2. (1)
第2章 C语言的基本数据类型和变量的存储类
2.1 填空
1.‘a’占_______字节。
2.“a”占_______字节。
3.字符串“ab\072cdef”的长度_______。
4.字符串“\”33abcdef”的长度_______。
5.字符串“abc\0defgh”的长度_______。
6.字符串“\\033abceL”的长度_______。
7.字符串“\\\n33abcd”的长度_______。
8.字符串“\033abcdef”的长度_______。
9.格式字符%d表示输出_________型数据。
10.格式字符%f表示输出_________型数据。
2.2 何为常量?何为变量?变量的命名规则是什么?
2.3 指出下列变量定义的错误所在。
1.character a1,a2,a3;
2. char a1,int i;
3.a1,a2,a3:char;
4. integer i1,i2,i3;
5. real r1,r2;
6. double int a1,a2;
7. double float f1,f2;
8. float if;
2.4 指出下列符号,数字串所属的数据类型:
0,0.0,012,102,0x123,0XABC,2E-6,6.02e23,‘a’,-128,+1,3.1415926536 2.5 C语言中的八进制和十六进制常数为什么不以字母‘O’和‘H’为前缀而要以‘O’和‘Ox’为前缀呢
2.6 既然变量名不管是什么,在编译之后都变成了地址,那么为什么要限制其不能为保留字呢?
2.7 用作变量名的标识符的长度是由操作系统决定的还是由C编译程序决定的?
2.8 任何类型的数据在计算机内部都是采用什么形式存储的?为什么要说明变量的类型?
2.9 C语言为什么要规定“先定义,后使用”,这样有什么好处。
2.10 将下面的十进制常数分别表示为C语言中的八进制和十六进制常数:32,75,-617,10,-128,1024,-1234,256
2.11 字符常量以字符串常量有什么区别?如何区分普通整型常量和长整型常量?C中实型常量有无float和double之分?
2.12 填空
1.在________定义的变量的作用域局部于该函数。
2.某函数内定义的变量的作用域是____________
3.一个函数内部定义的变量是 ___________.
4. C语言中的存储类别包含________,_________,____________和
_____________.
2.13 单项选择
一个文件中定义的全局变量的作用域为()
(1)本程序的全部范围(2)本文件的全部范围
(3)函数内全部范围(4)从定义该变量的位置开始开始到本文件结束
2.14 变量都具有哪些属性?如何确定一个变量的属性?
2.15 变量的存储类有哪几种?试指出各种变量的作用域。
2.16 采用静态存储分配的变量有哪些?采用动态存储分配的变量有哪些?2.17 变量的“定义”和“说明”是否是同一种概念?如不同,试指出他们之间的区别?
2.18 判断下列说法是否正确:
1.一个函数中定义的变量对其他函数都是可见的。
2.一个函数中定义的变量对其他函数都是不可见的。
3.一个函数中说明的变量对其他函数都是可见的。
4.一个函数中说明的变量对其他函数都是不可见的。
5.main函数中定义的auto变量对其他函数来说都是可见的。
6.main函数中定义的auto变量对其他函数来说都是不可见的。
7.main函数中定义的static变量对其他函数来说都是可见的。
8.main函数中定义的static变量对其他函数来说都是不可见的。
9.在一个函数中可以通过保留字extern来定义外部变量。
10.同一个函数中的变量不能重名。
2.19 在程序中用一条赋值语句对变量赋初值和在定义该变量时对其初始化有何不同?
答案:
2.1
1.1
2.2
3.8
4.10
5.10
6.10
7.9
8.8
9.十进制整 10.十进制实
2.2 略,
2.3 将有错误的纠正如下:
1.char al,a2,a3;
2. char al; int 1;
3. char a1,a2,a3;
4. int
il,i2,i3; 5. float rl,r2; 6. double al,a2;或int al,a2;
7. double fl,f2;或float f1, f2; 8. if 为保留字,不能用作
变量名.
2.4 略。
2.5 避免和变量名发生混淆。
2.6 便于C编译程序在对源程序编译时正确地区分保留字和变量。
2.7 由C 编译程序决定。
2.8 采用二进制形式存储,说明变量的类型是为了对变量进行存储分配和合法的
操作。
2.9 便于C 编译程序在对源程序的编译时进行语法检查。
2.10
(32)10 = (40)8 = (20)16
(75)10 = (113)8 = (4b)16
(-617)10 = (37777776627)8 = (fffffd97)16
(10)10 = (12)8 = (a)16
(-128)10 = (37777777600)8 = (ffffff80)16
(1024)10 = (2000)8= (400)l6
(-1234)10= (37777775456)8= (fffffb2e)16
(256)10 = (400)8 = (100)16
提示:用户可以在MS VC+t-6.0 的环境下使用printf(”%o\n”,X) ;
printf(”%x\n”,X);实际验证一下,同学们可能觉得,负数的结果有些不可
思议,原因就在于负数在计算机中使用补码存储的。
2.11 字符串常量没有特定的词来定义,需要用数组来定义,字符常量用“char”
来定义。
字符串常量用“双引号”,而且字符串使用‘\0'作为结束符。
字符常量
用“单引号”。
字符串是由字符常量组成的。
在MS VC++6.0 环境下,普通整型和长整型的长度是一样的。
2.12 . 1. 函数内 2. 定义该变量的语句所在的“块”
3. 局部变量
4. Auto,register.,static 和 extern
2.13 (1) 2.14略 2.15略
2.16 采用静态存储分配的变量有static 和extem 变量,采用动态存储分配的
变量有auto 和register 变量。
2.17 变量的“定义”和“说明”是有区别的,变量只能被“定义”一次,但却
能被“说明”多次。
变量的“定义”决定了变量真正的类型和存储分配。
2.18 1.错 2.对
3.对
4.错
5.错
6.对
7.错
8.对
9.错 10.错
2.19 变量的“初始化”总是在对变量存储分配后紧跟着进行的。
如果变量采用“静态存储分配”,则其“初始化”是在编译时完成;如果变量采用“动态存储
分配”,则其“初始化”是在运行时完成。
而用赋值语句对变量“赋值”则总是
在运行时完成。
第 3 章运算和表达式
3.1 写出下列表达式运算之后a的值(设开始时a=5)
1.a+=a
2.a=(a--)+3
3. a++
4.a%=a
5.a=a+=2*3
6.a+=a-=a*=a=6
3.2 写出下面程序的执行结果
Main()
{ int m,n,k;
k=0;
n=k+1;
m=k*=2;
printf(“m=%d,n=%d,k%=d\n”,m,n,k);
}
3.3 求下列表达的值(设a=5,b=3;float x=2.5,y=3.7)
1.(x*a++)-y)/
2.0+a%b 2.(x+y)/2-a%2
3.(int)(x+y)*(a+b)/3+‘a’-‘d’
4. (a+b)- (int)(x+y)+51
5.++a*b--/x-y 6.++a,b*=2,x+y,x-y,x+y+a+b
3.4 C语言在有了+,-,*,/,=运算符之后,为什么还要提供++,--,+=,-=,*=和/=运算符?
3.5 单项选择
1. 表达式求值()
x+a%3*(int)(x+y)%2/4 其中x=2.5,a=7,y=4.7
(1)2.5 (2)2.75 (3)3 (4)3.5
2. 表达式求值()
a/b?a+b:b-a 其中a=2,b=4
(1)0.5 (2)6 (3)2 (4)0
3. 表达式求值()
(a+b)/2+(int)x%(int)y 其中a=2,b=3,x=3.5,y=2.5
(1)3 (2)3.5 (3)4.25 (4)2.5
4.表达式求值()
2+(x++>y?3.0:5.0)/2 其中x=3,y=3
(1)3.5 (2)3 (3)4 (4)4.5
5.表达式求值()
1/2*x+20%3*(x=y)/16 其中x=3.0,y=4
(1)0.5 (2)2.0 (3)0.0 (4)1.5
6.表达式求值()
a++-c+b++ 其中a=3,b=-4,c=5
(1)-3 (2)-4 (3)-5 (4)-6
7.表达式求值()
++a-c+b++ 其中a=3,b=-4,c=5
(1)-3 (2)-4 (3)-5 (4)-6
8.表达式求值()
a+b,b*5,a=b+4 其中a=3,b=-4
(1)-1 (2)-20 (3)0 (4)-4
3.6
给出例3.7和例3.8的执行结果,并对结果进行合理的解释
答案:
3.1 1.10 2.7 3.6
4.0
5.11
6.0
3.2 m=0;n=1;k=0
3.3 1. 12.65 2. 2.1 3. 13
4. 53
5.3.5
6. 18.2
3.4 简化程序书写,提高代码生成质量
3.5 1.(1) 2.(3) 3.(1)
4.(4)
5.(1)
6.(4)
7.(2)
8.(3)
3.6 例3.7 x=66,i=4,j=5 例3.8 x=116,i=4,j=5
第 4 章语句及控制结构
4.1填空
1.程序的三种控制结构是___________,____________和_________
2.一个赋值表达式最后加一个________就成了_________语句4.2单项选择
1.求标有/**/语句的执行次数()
int x=10;
while(x++<20)
x+=2; /**/
(1)10 (2)11 (3)4 (4)3
2.求标有/**/语句的执行次数()
Int y=0,x=2;
do{
y=x*x; /**/
}while(++y<5);
(1)5 (2)4 (3)2 (4)1
3.求标有/**/语句的执行次数()
Int y,I;
For(i=0;i<20;i++){
If(i%2==0) continue;
y+=I; /**/
}
(1)20 (2)19 (3)10 (4)9
4.求标有/**/语句的执行次数()
Int y,I;
For(i=0;i<20;i+=2){
If(i%5!=0) break;
y+=I; /**/
}
(1)20 (2)19 (3)5 (4)1
5.求标有/**/语句的执行次数()
Int x,y;
For(x=0,y=10;x++<y;y++)
X*=2; /**/
(1)10 (2)4 (3)17 (4)3
6.求标有/**/语句的执行次数()
Int x=5,y=-5;
While(x*y)
y++;/**/
(1)10 (2)9 (3)5 (4)6
7.求标有/**/语句的执行次数()
Int x=1;
While(x++<20)
x+=3; /**/
(1)4 (2)5 (3)6 (4)7
4.3 C语言主要有哪几种控制结构?
4.4 简答题
1.用while语句构造一个for语句。
2.用for语句构造一个while语句。
3.写出for语句的工作流程。
4.简述break和continue语句的作用。
5.用if和goto语句构成do-while语句。
6.简述switch语句的功能。
7.试比较while和do-while语句的异同。
4.5 打印出1900-2000年中所有的闰年。
4.6 编写一个求两个正整数a,b最高公因数的程序。
4.7 编写一个求两个正整数a,b最小公因数的程序。
4.8 编写一个程序,其反复从键盘上读入字符,如果读入的是英文,则将其大小写互换,然后输出。
否则,按原样输出。
输入空格符时,程序结束。
4.9 今有物,不知其数;三三数之剩二,五五数之剩二。
问至少物几何?
4.10 编写一个程序,验证4-100的每一个偶数都可以表示为两个素数之和。
4.11 甲,乙,丙三人分一堆西瓜。
这堆西瓜中的一半又半个分给甲,剩下的再一半又半个分给乙,剩下的分给丙,但每次分时并没有切开西瓜,问甲乙丙各得几个西瓜。
4.12求1-1/2+1/3-1/4+…+1/99-1/100,怎样写程序才能减少误差?
4.13 小鸡每只0.5元,母鸡每只2元,公鸡每只3元,100元钱要买100只鸡,问共有几种买法?
4.14 编写程序,求一个求菲波那奇数列1,1,2,3,5,8,13,21,…第20项的结果并将结果输出。
4.15 读入一行字符,对其中的元音字符‘a’‘o’‘e’‘i’‘u’进行计数,并输出结果。
4.16 编写程序,从键盘上读入10个整数,然后求出它们之间的最大者并输出(读入整形变量x可调用scanf库函数,形式为scanf(“%d,&x”))。
4.17 设计一个C程序,输出序列中前n个数,该序列满足:
(1)数1在序列中。
(2)若x在序列中,则2x,3x,5x也在序列中。
(3)序列中无其他数。
4.18 阅读程序,写出运行结果
1. main()
{ Int i,s=0;
i=1;
do{
if(i%3==0) s+=i; i++;
}while(i<20);
Pri ntf(“s=%d\n”,s);
}
2. main()
{ Int i,s=0;
i=0;
lp:if(i%4==0) s+=i;
i++;
if(i<30) goto lp;
printf(“s=%d\n”,s);
}
3. main()
{ Int i,n,s=0;
For(i=0;i<20;i++)
If(i%2==0) s+=i;
Printf(“s=%d\n”,s);
}
4.main()
{ Int i,n,s=0;
i=1;
while(i<20) {
s+=i;
i+=2;
}
Printf(“s=%d\n”,s);
}
答案:
4.1 1.顺序,分支,循环2.分号,表达式语句
4.2 1.(3) 2.(4) 3.(3) 4.(4)
5.(4)
6.(3)
7.(2)
4.3 顺序,分支,循环
4.4
1.For(e1;e2;e3)s;可表示为:
e1;
while (e2){
s;
e3;
}
2.While(e)s; 可表示为:
For( ;e; ) s;
3.For(e1;e2;e3)s;的流程是:
(1)求解表达式e1.
(2)如果表达式e2为“假”,则结束;否则转(3)
(3)执行语句s
(4)求解表达式e3,转(2)
4. break是结束循环,即跳出循环语句;continue则是结束本次循环,继续执行下一次循环。
5.Do s;while(e);可表示为:
Loop:
S;
If(e) goto loop;
6.并逐个与其后的常量表达式值比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后
的语句。
如果表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
7.While是“先判断,后执行”,而do while 是“先执行,后判断”4.5
#include “stdio.h”
Void main()
{
Int year=1990;
While(year<=2000)
{
If((year%4==0&&year%100)||year%400==0)
Printf(“%d\n”,year);
year++;
}
}
4.6
#include “stdio.h”
#include “stdlib.h”
Void main()
{int a,b,r;
Printf(“input integer a :”);
Scanf(“%d”,&a);
Printf(“input integer b :”);
Scanf(“%d”,&b);
If(!(a>0&&b>0)){
Printf(“a and b must be positive !\n”);
exit(1);
}
While(r=a%b){
a=b;
b=r;
}
Printf(“result=%d\n”,b);
}
4.7 设正整数a,b的最高公因数和最小公倍数分别为d,t,则有ab=dt,即有t=(ab)/b,程序如下:
#include “stdio.h”
#include “stdlib.h”
Void main()
{int a,b,r;
Printf(“input integer a :”);
Scanf(“%d”,&a);
Printf(“input integer b :”);
Scanf(“%d”,&b);
If(!(a>0&&b>0)){
Printf(“a and b must be positive !\n”);
exit(1);
}
p=a*b;
While(r=a%b){
a=b;
b=r;
}
Printf(“result=%d\n”,p/b);
}
4.8
#include “stdio.h”
#include<conio.h>
Void main()
{char ch;
While((ch=getch())!=‘’)
If(ch>=‘a’&& ch<=‘z’)
Putchar(ch-‘a’+‘A’);
Else if(ch>=‘A’&& ch<=‘Z’)
Putchar(ch-‘A’+‘a’);
Else
Putchar(ch)
}
将上面程序中的getch()用getchar()替换后,看看结果有什么不同。
4.9
#include “stdio.h”
Void main()
{int n=2;
While(!(n%3==2 && n%5==3 && n%7==2)) n++;
Printf(“result=%d\n”,n);
}
4.10
#include “stdio.h”
is_prime(int n)
{int I;
For(i=2;n%i;) i++;
If(i==n)
Return(1);
Else
Return(0);
}
Void main()
{int i,j,n;
Printf(“4=2+2\n”);
For(n=6;n<=100;n+=2) {
i=3;
j=n-i;
while(!is_prime(i)||! is_prime(j)) {
i+=2;
j=n-i
}
Printf(“%d=%d+%d\n”,n,i,j);
}
}
4.11
#include “stdio.h”
#include “stdlib.h”
Void main()
{int a,b,c,n;
Printf(“input totle number of the water-melon :”);
Scanf(“%d”,&n);
If(n%2==0) goto err;
a=n/2+1;
n=n-a;
If(n%2==0) goto err;
b=n/2+1;
c=n-b;
printf(“A=%d,B=%d,C=%d\n”,a,b,c);
exit(0);
err:
printf(“cannot divide the water-melons to A,B&C without cutting!\n”);
}
4.12 为了减少误差,应尽量避免两个相近的数相减。
为此编程如下:
#include “stdio.h”
#include “stdlib.h”
Void main()
{float i,s1=0,s2=0;
For(i=1;i<=100;i+=2){
s1+=1/i;
s2+=1/(i+1);
}
Printf(“result=%f\n”,s1-s2);
}
由于
1-1/2+1/3+1/4+…+1/99-1/100
=(1+1/2+…+1/99-1/100)-2(1/2+1/4+…+1/98-1/100)
=1/51+1/52+1/53+…+1/99+1/100
故也可编程如下:
#include “stdio.h”
Void main()
{float i,s=0;
For(i=51;i<=100;i++)
s+=1/i;
Printf(“result=%f\n”,s);
}
4.13
#include “stdio.h”
Void main()
{int i,j,k;
For(i=0;i<=33;i++)
For(j=0;j<=33;j++){
k=100-i-j;
if(i*3+j*2+k*0.5==100)
printf(“cock=%d,hen=%d,chick=%d\n”,i,j,k); }
}
4.14
#include “stdio.h”
Void main()
{int i,j,r,n=20;
For(i=1;j=1;n>2;--n){
r=i+j;
i=j;
j=r;
}
Printf(“%d\n”,r);
}
4.15
#include “stdio.h”
#include<conio.h>
Void main()
{char ch;
Int a,o,e,i,u;
a=o=e=i=u=0;
while((ch=getch())!=‘\r’)
switch(ch)
{
Case‘a’:
a++;break;
Case‘o’:
o++;break;
Case‘e’:
e++;break;
Case‘i’:
i++;break;
Case‘u’:
u++;
}
Printf(“then number of ‘a’=%d\n”,a);
Printf(“then number of ‘o’=%d\n”,o);
Printf(“then number of ‘e’=%d\n”,e);
Printf(“then number of ‘i’=%d\n”,i);
Printf(“then number of ‘u’=%d\n”,u); }
4.16
#include “stdio.h”
Void main()
{int i,x,max;
Scanf(“%d”,&max);
For(i=0;i<10;i++) {
Scanf(“%d”,&x);
If(x>max) max=x;
}
Pri ntf(“Max one=%d\n”,max);
}
4.17
#include “stdio.h”
#include “stdlib.h”
Void main()
{int i,j,n;
Printf(“input the number n:”);
Scanf(“%d”,&n);
If(n<=0){
Printf(“n must be a positive integer !\n”); Exit(1);
}
i=0;
while(n){
j=++i;
while(j%2==0) j/=2;
while(j%3==0) j/=3;
while(j%5==0) j/=5;
if(j==1){
printf(“%d\n”,i);
}
}
}
4.18
1.s=63
2.s=112
3.s=90
4.s=100
第五章数组
5.1 填空
标准C可以对_______或________数组在定义时赋初值。
5.2 选择题
1.设有数组定义:C har array[]=“China”;则数组array所占的空间为______
(1)4字节(2)5字节(3)6字节(4)7字节
2.下列定义数组的语句中不正确的是_______
(1)static int a[2][3]={1,2,3,4,5,6};
(2)static int a[2][3]={{1},{4,5}};
(3)static int a[][3]={{1},{4}};
(4)static int a[][]={{1,2,3}{4,5,6}};
3.以下能正确定义数组并正确赋初值的语句是_________
(1)int N=5,b[N][N];
(2)int a[1][2]={{1},{3}};
(3)int c[2][]={{1,2},{3,4}};
(4)int d[3][2]={{1,2},{34}};
4.以下为一维整型数组a的正确说明是_______
(1)int a(10) (2)int n=10,a[n]
(3)int n; (4)#define SIZE 10;
Scanf(“%d”,&n); int a[SIZE];
Int a[n];
5.以下为二维整型数组a的正确说明是_______
(1)int a[3][] (2)float a(3,4)
(3)double a[1][4] (4)float a(3)(4)
6.若二维数组a有m列,则计算任一元素a[i][j]在数组中位置的公式为_______(假设a[0][0]位于数组的第一个位置上)
(1)i*m+j (2)j*m+1 (3)i*m+j-1 (4)i*m+j+1
7. 若二维数组a有m列,则在a[i][j]前的元素个数为_______
(1)j*m+i (2)i*m+1 (3)i*m+j-1 (4)i*m+j+1
8.用数组名作为函数调用时的实参,实际上传递给形参色是_______
(1)实参数组全部元素的值(2) 实参数组第一个元素的值
(3) 实参数组的首地址(3)实参数组元素的个数
5.3已知a是一个二维数组,问a[2]的含义是什么?
5.4填上适当的语句或表达式,使其能完成相应的功能。
1.从键盘上输入一个字符串,然后将其反序,最后输出
Main()
{int n;char a[60];
Int i,j;char ch;
n=______;
for(i=0,j=n-1;i<j;_______)
{
Ch=a[i]; a[i]=a[j]; a[j]=ch;
}
Puts(a);
}
2.输入9个实数给一个3*3的矩阵,然后求出此矩阵两条对角线元素值的和
Main()
{float a[3][3],sum=0;
Int i,j;
For(i=0;i<3;i++)
for(j=0;j<3;j++) scanf(“%f”,______);
For(i=0;i<3;i++) sum+=_______;
Printf(“Sum=%f\n”,sum);
}
3.求某天(年月日)是星期几的函数
Void main()
{int n; /*年*/
int y; /*月*/
int r; /*日*/
int first; /*该年1月1日是星期几*/
int I,leap,s;
scanf(“%d,%d,%d,%d”,&n,&y,&r,&first);
static int mon[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31};
______________;
s=________________;
for(i=1;i<y;i++) s+=mon[leap][i];
s+=_______;
printf(“%d”,s);
}
5.5用筛法求100以内的素数。
5.6 13个小孩围成圈玩游戏。
从第3个人开始循环报数,报数为”5”者出圈,接着从下一个人开始重新报数,报数为”5”者再出圈….,直到所有人都出圈为止。
求他们的出圈顺序。
5.7 编写程序实现strcpy()函数的功能
5.8 输入一个字符串,输出其反序
5.9 输入一个字符串,然后判定它是否为一个palindrome。
所谓palindrome,是指其从正反两个方向看都是一样的(不分大小写),如”madam“
5.10 15个教徒和15个非教徒在海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:30人围成一圈,从第一个人开始依次报数,当数到第13人就将他扔入大海,接着从下一个人开始重新报数,当再数到第13
人时将其又扔下海,如此循环进行直到仅剩15个人为止。
问怎样排法才能使每次投入大海的都是非教徒。
5.11 阅读程序,写出运行结果
Main()
{int a[11],i,j,t;
For(i=1;i<11;i++) scanf(“%d”,&a*i+);
For(j=1;j<=9;j++)
For(i=1;i<=10-j;i++)
If(a[i]>a[i+1]){
t=a[i];a[i]=a[i+1]; a[i+1]=t;
}
For(i=1;i<11;i+=2) printf(“%d”,a*i+);
}
输入:1 0 4 11 5 -1 10 -10 -11 100
5.12 从键盘输入100个整数,然后将它们从小到大排序并输出。
答案:
5.1 静态,外部
5.2 1.(3) 2.(4) 3.(4) 4.(4) 5.(3)
6.(4)
7.(2)
8.(3)
5.3 a[2]是数组a第三行的首地址。
5.4
1.
Strlen(a)
i++,j—
2.
&a[i][]j
(i==1 ? a[i][j] : a[i][0]+a[i][2-i])
3.
Leap=(n%4==0 && n%100) || n%400==0
R
((first+(s-1)%7)>7 ? first+(s-1)%7-7 : first+(s-1)%7)
5.5
#include”stdio.h”
#include”math.h”
Is_prime(int n)
{int k,i=1;
K=sqrt((double)n);
While(++I <=k)
If(n%i==0) return(0);
Return 1;
}
Void main ()
{int n;
For(n=2;n<=100;n++)
If(is_prime(n)) printf(“%d\n”,n);}
5.6
#include”stdio.h”
Void main()
{ char name[14][10];
Int flag[14],I,j,n;
Printf(“Input the names of the people:\n”);
For(i=1;i<=13;i++){
Scanf(“%s”,&name*i+);
Flag[i]=1;
}
N=0;i=3;j=1;
While(1)
While(j<5){
I=(i+1 > 13 ? 1 : i+1 );
J+=flag[i];
}
Puts(name[i]);
Flag[i]=0;
N++;
If(n==13) break;
J=0;
}
}
5.7
Char *strcpy(char *s1,char *s2)
{ char *p;
P=s1;
While(*p++=*s2++);
Return(s1);
}
5.8
#include”stdio.h”
Void main()
{char s[51],*I;
Printf(“Input a sring less than 50 characters:\n”);
Gets(s);
I=s;
While(*I,) i++;
While(--i>=s) putchar(*I);
Putchar(‘\n’);
}
5.9
#include”stdio.h”
#incude”string.h”
Is_pal(char *s)
{ char *p,*q;
P=s;
Q=s+strlen(s)-1;
While(p<q) if(*p++) !=(*q--)) return(0);
Return(1);
}
Void main()
{char s[51],*i=0;
Printf(“Input a string less than 50 characters:\n”);
Gets(s);
If(is_pal(s))
Puts(“is a Palidrome!”);
Else
Puts(“is not a Palindrome!”);
}
5.10 参见习题 5.7
5.11 -11 -1 1 5 11
5.12
#include”stdio.h”
Void main()
{
Int a[100],I,j,t;
Printf(“Input 10 integers:\n”);
For(i=0;i<100;i++)
Scanf(“%d”,&a*i+);
For(i=0;i<99;i++)
For(j=99;j>I;j--)
If(a[j-1]>a[j])
{
T=a[j];
A[j]=a[j-1];
A[j-1]=t;
}
Printf(“The sort of them is:\n”);
For(i=0;i<100;i++)
Printf(“%d”,a*i+);
Printf(“\n”);
}
第六章函数
6.1 填空
1.在定义一个函数时如果不加类型说明,则它的隐含类型为________ 2. 为了明确表示函数没有返回值,可用________来进行函数类型定义。
3.函数的返回值是通过______语句返回到调用函数中的。
4.C语言规定下述情况下可以不在调用函数前对被调函数作类型说明:若函数值是整型或字符型;或者_____.
5.调用函数只可得到一个______。
6.在定义函数时,如果冠以关键字void,表示此函数__________。
6.2 单项选择。
1.一个函数返回值的类型是由()决定的。
(1)return语句中表达式类型(2)定义函数时所指定的函数类型(3)调用该函数的主调函数的类型(如果被4)在调用函数时临时指定2.如果被调用函数(非void类型)中没有return,则其()。
(1)不带回值(2)带回一个不确定的值
(3)只带回零值(4)带回全部数值
3.下面叙述中,不正确的是()
(1)函数可以有参数,也可以没有参数
(2)调用函数时,只能使之出现在表达式中
(3)函数中可以没有return
(4)main()也是一个函数
4.以下正确的函数声明形式是()
(1)double fun(int x,int y)
(2)double fun(int x;int y)
(3double fun(int x,int y)
(4))double fun(int x,y)
5.以下正确的函数形式是()
(1)double fun(int x,int y ) {z=x+y;return z;}
(2)fun(int x,y){int z;return z;}
(3)dun(x,y){int x,y;double z;z=x+y;return z;}
(4)double fun(int x,int y){double z;z=x+y;return z}
6.下面函数调用语句含有实参的个数为()
Func((exp1,exp2),(exp3,exp4,exp5));
(1)1 (2) 2 (3)4 (4)5
7.求标有/**/语句执行后X的值()
Main()
{ static int x=5;
F(x);
If(x>0){
Int x;x=20;
}
X++;/**/
}
F(x);
Int x;
{ x++;}
(1)5 (2) 6 (3) 25 (4) 26
8.求标有/**/语句执行后X的值()
Main()
{static int x=-5;
F(x);
If(x<0){Int x;x=10;}
++x;/**/
}
F(x);
Int x;
{x--;}
(1)-4 (2) -5 (3) 10 (4)11
9.求标有/**/语句执行后X的值()
Int x;
Main()
{ int x=20;
If(x>0){int x;x=30}
F();
Printf(“%d\n”,x);/**/}
(1)20 (2) 21 (3) 30 (4) 5
10.求标有/**/语句执行后X的值()
Int x=5;
Main()
{ int x=20;
If(x>0){int x=30;}
Fun();}
F();
{x++;/**/}
(1)5 (2) 6 (3) 20 (4) 21
6.3 C函数可以分为哪几种?各函数之间的关系如何?C语言以函数为程序的
基本单位有什么好处?
6.4 C函数有哪儿种调用方式?
6.5 C函数由哪儿部分构成?何为形参?何为实参?形实结合有哪儿种方式?
6.6 编写完成如下功能的函数:
1.求两个整数之和,结果也为整型。
2.求两个浮点数之和,结果也为浮点型。
3.求两个整数之积,结果为长整型。
4.求两个浮点数之积,结果为双精度型。
5.求三个整数的最大者。
6.求三个整数的最小者
7.已知三边长,求三角形的面积,
8.判断一个数是否素数,如果是返回1,否则返回0。
6.7 编写一个程序,它从键盘上读人一个整数,然后将该整数的所有正因子输出6.8编写一个求n!的递归函数。
6.9 编写一个求菲波那奇数列中第n项f n的函数,已知:f1=1,f2=1,f n=f n-1+f n-2 (n>=3)
6.10 编写一个程序,它从键盘分别读人一个学生的五科考试成绩,然后计算、输出该学生的总成绩、平均成绩、最高成绩和最低成绩。
要求用函数调用来完成所要求的计算。
6.11 写出下面程序的运行结果
1.int k=0;
Main()
{int i=4;
Func(i);
Pr intf(“%d,%d\n”I,k) ;
}
Func(m)
Int m;
{
M+=k;
K+=m;
{char k=’B’;
Printf(“%d\n”,k-‘A’);
}
Printf(“%d,%d\n”,m,k);
2.main()
{int n;
For(n=1;n<=5;++n) printf(“\n%d”,ss(n));
}
ss(n)
Int n;
{ int I;,sum=0;
For(i=1;i<=n;sum+=i*i);
Return(sum);
3.int sum(int n)
{int I,s=0;
I=1;
While(i<=n)
{s+=I;i++;}
Return(s);
Main()
{printf(“%d\n”,sum(5));}
4.若输入的值是-125,写出下面程序的运行结果
#include”stdio.h”
#include”math.h”
Void fun(int n)
{ int k,r;
For(k=2;k<=sqrt(n);k++)
{r=n%k;
While(r==0)
{ printf(“%d”,k);
N=n/k;
If(n>1) printf(“*”);
R=n%k; }
}
If(n!=1) printf(“%d\n”,n);
}
Void main()
{ int n;
Scanf(“%d”,&n);
Printf(“%d=”,n);
If(n<0) printf(“-”);
N=fabs(n);
fun();
}
5.写出下面程序的运行结果。
Int i=0;
Fun1 (int 1)
{ i=(i%i)*(i*i)/(2*i)+4;
Printf(“i=%d\n”,i);
Return(i);
}
Fun1 (int 1)
{ i=i<=2?5:0;
Return(i);
}
Main()
{ int i=5;
Fun2(i/2);printf(“i=%d\n”,i);
Fun2(i=i/2);printf(“i=%d\n”,i);
Fun2(i/2);printf(“i=%d\n”,i);
Fun1(i/2);printf(“i=%d\n”,i);
}
6.写出下面程序的功能。
Func(int n)
{ int i,j,k;
i=n/100;j=n/10-i*10;k=n%10;
if((i*100+j*10+k)==i*i*i+j*j*j+k*k*k) return n;
return 0;
}
Main()
{ int n,k;
For(n=100;n<1000;n++)
If(k=func(n)) printf(“%d”,k);
}
6.12 写一个函数,以字符的形式读入一个十六进制数(它以字符‘h’或‘H’结尾,如1ABH),并输出相应的十进制数。
6.13 阿克曼函数A(m,n)的定义如下:
n+1 若m=0
A(m,n)={A(m-1,1) 若n=0
A(m-1,A(m,n-1)) 其他
试编写一个求A(m,n)的函数。
6.14 编写一个程序,它从键盘读入4个字符,然后将这4个字符的所有可能排列输出。
6.15 改错。
1.下面的程序或者有语法错误,或者完不成特定的功能,请改正(只允许改变一个语句)。
Auto int max(int a,int b)
{ register int temp;
If(a>b)temp=a;
Else temp=b;
Return(temp);
}
2.下面add函数的功能是求两个参数的和,并将和值返回调用函数。
函数中错误的部分是________.
Void add(float a,float b)
{ float c;
c=a+b;
return c;
}
3.下面add函数的功能是求两个参数的和。
判断下面程序的正误,如果错误请改正过来。
Void add(int a,int b)
{ int c;
c=a+b;
return (c);
}
4.下面函数fun的功能是:将长整型数中偶数位置上的数依次取出,构成一个新数返回,如当s中的数为:87653142时,则返回的数为:8642;判断下面程序的正误,如果错误请改正过来。
Long fun(long s)
{ long t,sl=1;
Int d;
t=0;
while(s>0) {
d=s%10;
if(d%2=0) }
t=d*sl+t;
sl*=10;
}
s/=10;
}
Return(t);
}
6.16 填空。
1.填上适当的语句或表达式,使其能完成相应的功能。
判断year是否为闰年的函数,若是则返回1,否则返回0。
Leap(________)
Int year;
{ ______________________;
}
2.以下程序将选出能被3整除且至少有一位是5的两位数,打印出所有这样的数及其个数。
请选择填空。
Sub(int k,int n)
{ int a1,a2;
a2=_____________;
a1=k-____________;
if((k%3==0&&a2==5)|| (k%3==0&&a1==5))
{ printf(“%d”,k);
n++;
Return n;
}
Else return -1;
}
Void main()
{ int n=0,k,m;
For(k=10;k<=99;k++)
{ m=sub(k,n);
If(m!=-1) n=m;
}
Printf(“\nn=%d”,n);
}
6.17 有20级楼梯,一次可以迈一级或二级,则爬完次楼梯有几种方法。
6.18 编写程序或函数。
1.用递归函数求
1 n=0
p(n,x)={x n=1
((2n-1)*x-p(n-1,x)-(n-1)*p(n-2,x))/n n>1 2. 用递归函数求以下函数f(n)的前十项和。
f(n)=f(n-1)+2*f(n-2) n>2
f(1)=f(2)=1
3. 用递归函数求以下函数f(n)的前十项和。
f(n)=n*f(n-1)+3 n>1
f(1)=2
4. 用递归函数求以下函数f(n)的前十项和。
f(n)=2n-1+f(n-1) n>1
f(1)=0
5. 用递归函数求以下函数f(n)的前十项和。
f(n)=2*f(n-1) n>1
f(1)=1
6.19 将数轴上的点1,2,3,…,n涂成白色或黑色,但不允许相邻的两个点都是黑色,共有多少中着色方法?
6.20 在开始时电梯里共有n个人,共有k个楼层可停。
设k<=n,且在每层都有人下电梯,问共有多少种可能的下法(只考虑每层所下的人数,而不必关心具体下的是何人)?试编写程序求n=8,k=5时的下法总数。
6.21 编写代码实现把字符串s1插入到字符串s的第i个位置上。
6.22 编写代码在有序数组a中折半查找数x(n是数组a中元素的个数)。
答案:
6.1
1.int
2.void
3.return
4.被调函数在调用函数之前定义
5. 返回值
6. 不返回值,只能以过程方式调用
6.2
1.(2)
2.(2)
3.(2)
4.(1)
5.(4)
6.(2)
7.(2)
8.(1)
9.(1) 10.(2)
6.3 C函数可分为库函数和用户自定义函数两种。
各函数之间的关系是平等的,无主次之分。
以函数作为程序的基本单位可以将大的程序分解为一个个小的函数,便于程序的编写阅读和维护。
6.4 C函数可有“过程调用”和“函数调用”两种方式.
6.5 C函数由”函数头”和“函数体”构成。
定义函数时函数名后圆括号中的参数为“形参”,调用函数时函数名后圆括号中的参数为“实参”。
形实结合主要有“值传递”和“地址传递”两种方式,但C语言只用到“值传递”,而“地址传递”在C语言中是利用“指针”来间接实现的。
6.6
1.f(int x,int y)
{
Return (x+y);
}
2.Float f(float x,float y)
{
Return (x+y);
}
3.long f(int x,int y)
{
Return (x*y);
}
4.double f(int x,int y)
{
Return (x*y);
}
5.Max(int x,int y, int z)
{
If(y>x) x=y;
If(z<x) Return (z);
Return (x);
}
6.Min(int x,int y, int z)
{
If(y>x) x=y;
If(z<x) Return (z);
Return (x);
}
7.Double tri_area(float a,float b, float c)
{ float s;
s=(a+b+c)/2;
return(sqrt(s*(s-a)*(s-b)*(s-c)));
}
8.Is_prime(int n)
{ int i;
For(i=2;n%i;) i++;
If(i==n)
Return(1);
Else
Return(0);
}
6.7
#include “stdio.h”
#include “stdlib.h”
Void main()
{int n,d;
Printf(“input integer n:”);
Scanf(“%d”,&n);
If(n<=0){
Printf(“n must be a positive integer !\n”); Exit(1);
}
For(d=1;d<=n;d++)
If(n%d==0)
Printf(“%d\n”,d);
}
6.8
Long fact(int n)
{
If(n==1) return(1);
Return(n*fact(n-1));
}
6.9
Fab(int n)
{
If(n<=1) return(1);
Return(fab(n-1)+ fab(n-2));
}
6.10
#include “stdio.h”
Totle(int s1,int s2,int s3,int s4,int s5)
{
Return(s1 + s2+ s3 + s4 + s5);
}
Float average(int s1,int s2,int s3,int s4,int s5)
{
Return(Totle (s1,s2,s3,s4,s5)/5.0);
}
highest(int s1,int s2,int s3,int s4,int s5)
{
If(s2>s1) s1=s2;
If(s3>s1) s1=s3;
If(s4>s1) s1=s4;
If(s5>s1) Return(s5);
Return(s1);
}
lowest(int s1,int s2,int s3,int s4,int s5)
{
If(s2<s1) s1=s2;
If(s3<s1) s1=s3;
If(s4<s1) s1=s4;
If(s5<s1) Return(s5);
Return(s1);
}
Void main()
{int s1,s2,s3,s4,s5;
Printf(“input scores of the subject_1 to subject_5:”);
Scanf(“%d %d %d %d %d”,&s1,&s2,&s3,&s4,&s5);
Printf(“totle=%d\n”,totle(s1,s2,s3,s4,s5));
Printf(“average=%f\n”, average(s1,s2,s3,s4,s5));
Printf(“highest=%d\n”, highest(s1,s2,s3,s4,s5));
Printf(“lowest=%d\n”, lowest(s1,s2,s3,s4,s5));
}
6.11
1. 1 5,6 4,6
2. 1 5 14 30 55
3. 15
4. -125=5*5*5
5. i=5 i=2 i=2 i=4 i=2
6. 153 370 371 407
6.12 考虑到目前还没有介绍字符串变量,故本题未用字符串来解。
#include “stdio.h”
#include “stdlib.h”
#include “conio.h”
hex_sec(char ch)
{
If(ch >= ‘0’&& ch <= ‘9’) return(ch-‘0’);
If(ch >= ‘a’&& ch <= ‘f’) return(ch-‘a’+10);
If(ch >= ‘A’&& ch <= ‘F’) return(ch-‘A’+10);
Printf(“\ninput is invalid !\n”);
Getchar;
Exit(1);
}
Read_hex()
{
Char ch;static int val=0;
ch=getch();
putchar(ch);
if(val==’h’||ch==’H’) return(val);
if(val==0)
val=hex_dec(ch);
else
val=val*16+hec(ch);
read_hex();
}
Void main()
{
Printf(“please input a hex integer ending with ‘h’or ‘H’\n”);
Printf(“=%d\n”,read_hex());
Getchar();
}
6.13
a(int m,int n)
{ if(m==0) return(n+1);
if(n==0) return(a(m-1,1));
return(a(m-1,a(m,n-1)));
}
6.14
#include”stdio.h”
s1(char a,char b,char c,char d)
{ pri ntf(“%c%c%c%c\n”,a,b,c,d);
}
s2(char a,char b,char c,char d)
{s1(a,b,c,d);
s1(a,b,d,c);
}
s3(char a,char b,char c,char d) {s2(a,b,c,d);
S2(a,c,b,d);
s2(a,b,d,c);
}
s4(char a,char b,char c,char d) {s3(a,b,c,d);
s3(b,a,c,d);
s3(c,a,b,d);
s3(d,a,b,c);
}
Void main()
{char c1,c2,c3,c4;
Printf(“Input 4 characters:”); c1=getchar();
c2=getchar();
c3=getchar();
c4=getchar();
s4(c1,c2,c3,c4);
}。