x:
y):
z;
mid0=x+y+z-max0-min0;
3.20 输入一个平面上的点坐标,判断它是否落在圆心(0,0),半径为1的圆内,如果在圆内,输出“Yes”,否则输出“No”。
提示:
分别用x,y代表平面上一个点。
printf("%s",x*x+y*y<=0?
"Yes":
"No");
【习题4】
以下的编程题目要求首先画出程序的传统流程图或N-S流程图,再编写程序代码。
上机实验时再输入到计算机中进行调试,并将调试过程中出现的问题和测试情况记录下来。
(流程图请读者自己参考课本自己画,略)
4.1 编程实现,输入一个整数,判断它是否为偶数,并显示相应的信息。
提示:
x代表输入的整数,if(x%2==0)printf("\neven");elseprintf("\nodd");
4.2编程实现,输入一个平面上的点,判断它是否落在单位圆上,并显示相应的信息。
提示:
x,y代表平面坐标,if(x*x+y*y==1)printf("\nYes");elseprintf("\nNo");
4.3编程实现,输入一个成绩等级(A-E),显示相应的百分制成绩段。
A:
90-100
B:
80-89
C:
70-79
D:
60-69
E:
<60
提示:
chargrade;
if(grade=='A')printf("\n90-100");
elseif(grade=='B')printf("\n80-89");
....
4.4写出下面程序的运行结果:
#include
main()
{
inta=-1,b=1,c=5;
switch(a>0){
case1:
switch(b-2<0){
case1:
printf("&");break;
case2:
printf("*");break;
}
case0:
switch(c==5){
case0:
printf("!
");break;
case1:
printf("#");break;
default:
printf("%%");
}
default:
printf("@");
}
}
运行结果:
@
4.5将以下语句改写成switch语句。
if((t>0)&&(t<=10))
if((t>=3)&&(t<=6))x=2;
elseif((t>1)||(t>8))x=3;
elsex=1;
elsex=0;
提示:
intt;
if(t<=0||t>10)c=0;
elsec=t;
switch(t)
{case0:
x=0;break;
case1:
case2:
x=3;
case3:
case4:
case5:
case6:
x=2;
case7:
case8:
case9:
x=3;
case10:
x=2;
}
4.7编程实现一个具有简单四则运算功能的计算器。
提示:
参照例4.18,随机产生3个数,其中一个数用来判断是哪种运算。
4.8编程实现,输入一行字符,将其中的数字字符对应的整数值加起来并输出结果。
如:
a45b8&*3则是4+5+8+3,结果为20。
提示:
charc;intsum=0;
while((c=getchar())!
='\n')if(c>='0'&&c<='9')sum=sum+c-'0';
4.9编程实现,求
的值。
提示:
先计算n!
,再在计算阶乘的外面套上一层循环。
注意:
20!
是一个很大的值,floats=1;inti;例如:
计算6!
:
for(i=1;i<=6;i++)s=s*i;
4.10编程实现,找出1000之内的所有完数,并按下面格式输出其因子:
6itsfactorsare1,2,3,
所谓“完数”是指一个数如果恰好等于它的因子之和,因子是指能够整除该数的数。
提示:
先判断数是否为完数,如果是再考虑输出因子。
以6为例输出因子:
for(i=1;i<6;i++)if(6%i==0)printf("%d,",i);
4.11编程实现,计算序列的前20项之和,
,
,
,
,
,
,...
提示:
这是一个累加式,每项是一个分式,用a、b分别表示分子、分母。
注意:
如果a、b都是整数,则是整除。
floatsum=0,a=2,b=1;inti;
for(i-1;i<=20;i++){sum=sum+a/b;a=a+b;b=a-b;}
4.12编程实现,求Sn=a+aa+aaa+...+
aa...a之值,其中a是一个数字。
如:
2+22+222+2222+22222(此时n=5),n,a由键盘输入。
提示:
这是一个累加式,后1项可以由前一项表示,譬如:
第2项可以由第1项表示:
第1项t=a;第2项:
t=t*10+a;
4.13编程实现,把从键盘输入的金额数(以圆为单位)按人民币面额划分,然后显示支付该金额的各种面额人民币的数量。
提示:
譬如:
123.58元可以表示100元:
1张;20元:
1张;2元:
1张;1元:
1张;5角:
1张;5分:
1枚;2分:
1枚;1分:
1枚。
为了简单可以只完成整数部分转换,即输入的金额数为整数。
4.14编程实现,使用循环结构打印以下图案。
*
***
*****
*******
*****
***
*
提示:
输出时,本图案要按向上三角形和向下三角形进行输出。
每行输出中包括空格输出,‘*’号输出。
输出空格和‘*’号个数要与行循环控制变量关联起来。
4.15编程实现,以菜单方式实现猜数游戏系统。
(功能自己设定)
提示:
模仿例4.14和例4.18完成。
功能可以包括猜数范围,人数等设置。
4.16编程实现,以菜单方式实现四则运算辅助教学系统。
提示:
随机产生两个操作数和运算符+、-、*、/,由使用者输入一个数,判断计算结果与输入的数是否相等,如果相等,表示正确,否则是错误的。
【习题5】
一、填空题
5.1若有定义inta[3][5];则排列在数组中的第9个元素是(a[1][3])。
5.2strlen("Howareyou\n")的值是(12)。
5.3C语言中字符串结束的标志是('\0')。
5.4写出一个名为s的单精度实型一维数组,长度是6,所有元素初值均为0,其数组定义语句是(floats[6]={0};)。
5.5strcmp("how","How")的值是(32或>0)。
二、选择题
5.6若有ints[4]={1,2,3,4};,则s[s[0]+2*s[2]-s[3]]的值是(D)
A.1B.2C.3D.4
5.7对数组的描述正确的是(B)。
A.数组一旦定义其大小是固定的,但数组元素的类型可以不同。
B.数组一旦定义其大小是固定的,但数组元素的类型必须相同。
C.数组一旦定义其大小是可变的,但数组元素的类型可以不同。
D.数组一旦定义其大小是可变的,但数组元素的类型必须相同。
5.8对字符串"Boy"进行完整赋值的操作是(B)。
A.chars[3]={'B','o','y'};B.chars[]="Boy";
C.chars[3]={"Boy"};D.chars[3];s="Boy";
5.9在c语言中引用数组元素时,其数组下标的数据类型允许是(C)。
A.整型常量B.整型表达式
C.整型常量或整型表达式D.任何类型的表达式
5.10对以下说明语句的正确理解是(B)。
inta[10]={6,7,8,9,10};
A.将5个初值依次赋给a[1]至a[5]
B.将5个初值依次赋给a[0]至a[4]
C.将5个初值依次赋给a[6]至a[10]
D.因为数组长度与初值的个数不相同,所以此语句不正确
三、看程序写结果
5.11
main()
{inta[3][3]={{1,0,2},{2,2},{0,2}},c[3][3],i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c[i][j]=a[a[i][j]][a[j][i]];
printf("%5d",c[i][j]);
}
}
printf("\n");
}
运行结果为:
220002201
5.12当运行以下程序时,从键盘输入:
Ah2MAA3ha,请写出输出结果。
main()
{chars[80],c='a';
inti=0;
scanf("%s",s);
while(s[i++]!
='\0')
if(s[i]==c)s[i]=s[i]-32;
elseif(s[i]==c-32)s[i]=s[i]+32;
puts(s);
}
运行结果为:
AH2Ma
四、编程题
5.13用数组方法定义一个矩阵,求其转置矩阵。
提示:
已知a[3][2],转置后的结果存放在b[2][3];则b[j][i]=a[i][j];
5.15从键盘输入9个不同的整数,组成三行三列的二元数组,找出每一列中的最大元素,并输出其行、列下标。
提示:
已知a[3][3],max,row,col分别用来存放一列的最大值,行下标和列下标。
5.15利用一个二维数组,打印出以下杨辉三角形,要求打印出10行。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
∶
∶
提示:
定义一个10行10列的二维数组,并且通过两重循环对第1列所有元素赋值1,主对角线也赋值。
根据a[i][j]=a[i-1][j]+a[i-1][j-1]求出其它元素的值。
5.16从键盘上输入一串字符(长度小于50个字符),找出其中最前面的一个X和最后面的一个X之间的子串,并输出子串的长度。
提示:
定义一个长度为81的字符数组,从左边查找第一字符'X'的下标,从右边查找第一个字符'X'的下标。
5.17矩阵A是一个3×3的矩阵,B是一个3×2的矩阵,编程求C=A⨯B。
提示:
定义一个3X2的数组c[3][2],该数组的元素值由A数组的一行元素分别与B的一列元素相乘得到。
譬如:
c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]。
5.18把30个学生的学号和两门课程的成绩输入到一个二维数组中,求出的每个学生的两门课程的总成绩也放于此数组中,请按学生总分的高低打印出成绩单(包括学号、两门课程成绩和总分)。
提示:
定义一个30行4列的数组。
为了先快速测试算法是否正确?
可以定义一个3行4列的数组,并且通过赋初始值,减少调试程序时反复输入数据的麻烦,算法调试成功后在加上输入数据部分。
实现从高到低打印出成绩可以通过排序(降序);也可以通过另外定义1个一维数组作为索引,再通过索引打印成绩。
5.19不用现有的函数求计算字符串长度的程序。
提示:
通过循环从前到后计算字符个数,遇到字符串结束标志'\0'结束。
5.20从键盘上输入一串字符,将其逆向显示。
提示:
首先计算字符串的长度,在从右边逐一显示字符,直到下标等于0为止。
5.21找出一个二位数组中的鞍点的位置,即该位置上的元素在该行上最大,在该列上最小。
如果有,输出其所在的行、列号,如果没有,则输出提示信息。
提示:
先找出行的最大元素,根据列下标找出列的最大元素。
5.22从键盘上输入一串字符,将字符串中的所有A去掉后组成新的字符串,并将两字符串输出。
提示:
简单的方法是通过定义两个一维数组,逐个读出原字符串的字符,如果不为'A',则存入目的数组。
当然也可以只用一个一维数组实现,通过两个下标指示来实现。
【习题6】
一、填空题
6.1C语言程序执行的开始处是main函数。
6.2C程序中的一个函数由两部分组成,即声明部分和执行部分。
6.3为了保证被调用函数不返回任何值,其函数定义的类型应为void。
6.4若一个局部变量的存储类型是static,则该变量的值在程序执行完成时被释放。
6.5预处理命令#include的作用是文件包含。
6.6定义一个宏,功能是判断两个数是否相等,相等为1,不等为0。
#defineEQU(a,b)(a)==(b)?
1:
0
6.7变量的存储类别有自动型、静态型、寄存器型、和外部类型共4种,它们分别用auto、static、register、extern标识。
二、选择题
6.8下述函数定义形式正确的是(C)。
A.intf(intx;inty)B.intf(intx,y)
C.intf(intx,inty)D.intf(x,y:
int)
6.9关于函数参数,说法正确的是(A)。
A.实参与其对应的形参各自占用独立的内存单元
B.实参与其对应的形参共同占用一个内存单元
C.只有当实参和形参同名时才占用同一个内存单元
D.形参是虚拟的,不占用内存单元
6.10用数组名作为函数的实参时,传递给形参的是(A)。
A.数组的首地址B.数组的第1个元素
C.数组中的全部元素D.数组的元素个数
6.11复合语句中定义的变量的作用范围是(D)。
A.整个源文件B.整个函数
C.整个程序D.所定义的复合语句
6.12一个函数的返回值由(D)确定。
A.return语句中的表达式B.调用函数的类型
C.系统默认的类型D.被调用函数的类型
6.13在一个C源文件中,若要定义一个只允许本源文件所有函数使用的全局变量,其他文件中不允许使用,则该变量需要使用的存储类别是(D)。
A.autoB.registerC.externD.static
三、判断题
6.14若定义的函数没有参数,则函数名后的圆括号可以省略。
(⨯)
6.15函数的函数体可以是空语句(√)。
6.16只有main函数才能调用其他函数。
(√)
6.17return语句中表达式的类型必须与函数定义的类型一致。
(⨯)
6.18函数的实参和形参可以是相同的名字。
(√)
6.19函数调用中,形参与实参的类型和个数必须保持一致。
(√)
6.20外部类型的变量只能定义一次,但可在不同地方声明多次。
(√)
6.21外部类型的变量作用范围大,编程中应多用外部变量。
(⨯)
6.22预处理命令行必须以#开头,且最后要用分号结尾。
(⨯)
6.23宏命令的处理占用编译时间,而不占用运行时间。
(√)
四、看程序写结果
6.24
intfun(intn)
{intf=1;
f=f*n*2;
return(f);
}
main()
{inti,j;
for(i=1;i<=5;i++)
printf("%d\t",fun(i));
}
程序运行结果:
246810
6.25
intx1=30,x2=40;
main()
{intx3=10,x4=20;
sub(x3,x4);
sub(x2,x1);
printf("x1=%d,x2=%d,x3=%d,x4=%d",x1,x2,x3,x4);
}
sub(intx,inty)
{