c语言程序设计第五版习题答案解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题解析与答案
第1 章C语言概述
一.简答题
1.概述C语言的主要特点。
【解答】。
活
(1)语言简洁、紧凑,使用方便、灵。
(2)数据类型丰富,表达能力强。
(3)运算符多样。
C语言中的运算符包含的范围非常广泛
如if ⋯else 语句、while 语句、do while 语句、switch (4)具有结构化的控制语句。
语句、for 语句。
行(5)允许直接访问物理地址。
C语言中含有的位和指针运算,能够直接对内存地址进。
访问操作。
(6)所生成的目标代码质量高,可移植性
好
2.构成C语言程序的基本单位是什么?它由哪几部分组成?
【解答】函数是构成C语言程序的基本单位。
一个完整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。
3.C语言程序的运行一般要经过哪几个步骤?
【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。
二.运行程序写结果
1.输入下面程序并运行。
main()
{
int a1 ,a2,x;
a1=100;
a2=50;
x=a1-a2;
printf (″x=%d n″,x);
}
【解答】运行结果为:x=50
2.输入下面程序并运行。
main()
{
int a1 ,a2,x;
a1=10;
a2=20;
x=a1*a2;
printf (″a1=%d,n″,a1,a2);
printf (″x=%d n″,x);
}
【解答】运行结果为:a1=10,a2=20
x=200
3.输入下面程序并运行。
#include <stdio.h>
main()
{
printf("******\n");
printf(" *****\n");
printf(" ****\n");
printf(" ***\n");
printf(" **\n");
printf(" *\n");
}
【解答】运行结果为:******
*****
****
***
**
*
思考:可以修改程序,使之输出平行四边形,等腰三角形等图形。
三.编程题
1.参照本章例题,编写一个C程序,用于显示如下信息:
*************************
I love C programs!
*************************
【分析与提示】
①要有文件包含语句#include <stdio.h> 。
C 语言中没有数据的输入、输出等功能,
数据的输入、输出都是通过调用系统提供的库函数scanf 和printf 等来实现的。
这些函数的说明都包括在stdio.h 文件中。
②main 是主函数的名称。
用{}括起来的内容是函数体,函数体由若干条语句组成,
这是计算机要执行的部分,每条语句以分号“; ”结束。
③注意显示的信息有三行,所以要用到换行符“n”。
参考代码:
#include <stdio.h>
main()
{
printf("************************\n");
printf(" I love C programs! \n");
printf("************************\n");
}
第2章数据类型及其运算
一.简答题
1.C语言中的数据类型主要有哪几类?
【解答】短整型(short int )
整型整型(int )
长整型(long int )
基本类型字符型(char) 单精度(float)
实型(浮点型)
双精度(double)
枚举类型(enum)
数组类型
构造类型结构体类型(struct)
共用体类型(union )
指针类型
空类型(void )
2.字符常量与字符串常量有什么区别?
【解答】字符常量用单括号括起,字符串常量用双括号括起;字符常量存储时占 1 个字节,字符串常量存储时除了n 个字符外,还有系统加上的字符串终止符\0 ,所以字符串常量存储时占n+1 个字节。
3.C语言中的常量包括哪几类?各自是如何构成的?
【解答】C语言中的常量是一些其值预先定的量,并且在程序执行过程中其值不再发生
变化。
常量的分类遵循基本数据类型分类原则,C语言编译系统自动将其存放在于类型相应
的内存单元中。
其类别包含整形常量、浮点常量、字符常量、字符串常量和枚举常量。
整形
常量又分为十进制整形常量、八进制整形常量、十六进制整形常量。
浮点常量分成十进制形式和指数形式。
C语言中的,字符常量是用单括号括起来的一个字符或是字符序列,而字符
串常量是用一对双括号括起来的零个或者多个字符组成的序列。
4.简述指针、变量的指针、变量的值、指针变量与指针变量的值的含义是什么?
【解答】C 语言中将地址又称为“指针”。
一个变量所分配的内存空间首字节地址,称
为该变量的指针( 地址), 变量的值就被放入所分配的地址单元中。
地址一旦被分配,就不会
再改变,所以,指针是一个常量。
既然是常量就可以把它赋给一个变量。
用来存放指针的变
量,被称为指针变量。
一个指针变量的值是变量的地址,一个指针变量可以被赋予不同的指
针值。
5.下面哪些是不合法的常量?说明不合法的理由。
123,3.1415926 ,0892,’M’,’n’,0xabc ,0.618E-6 ,”Morning”,3.8e-3.14 【解答】非法常量有:
0892——含有非八进制数字8 和9
3.8e-3.14 ——非法指数形式浮点常量:规定 e 后面的指数必须为整数。
6.下面对变量定义的语句哪些不正确?为什么?请改正。
(1)char c1,int a2; (2)INT a,b; FLOAT x,y; (3)a,b:char;
(4)char if; (5)int a,b (6)Int a:b:c;
(7)int a,x; float x,y;
【解答】
(1)char c1,int a2;
错误。
定义不同类型的变量时,应用分号彼此分开。
改正为:char c1; int a2;
(2)INT a,b; FLOAT x,y;
错误。
C语言中表示类型名的关键字必须小写。
改正为:int a,b; float x,y;
(3)a,b:char;
错误。
C语言中变量定义格式为:类型名变量名;
改正为:char a,b;
(4)char if;
错误。
变量名不能与C语言的关键字重名。
改正为:char f1;
(5)int a,b
错误。
变量定义以语句形式出现,应以分号结尾。
改正为:int a,b;
(6)Int a:b:c;
错误。
类型名不能有大写字母,相同类型名之间用逗号分隔。
改正为:int a,b,c;
(7)int a,x; float x,y;
错误。
在同一程序位置上,同一变量名不能重复定义充当两个不同的变量。
改正为:int a,x; float x1,y;
7.下述字符串常量的长度是多少?在内存中存储时各自占用的单元数又是多少?
(1)“Hello! ”(2)“ABC ?”(3)“765+123=?”
【解答】
(1)“Hello! ”字符串长度为6,占用内存字节数为7。
(2)“ABC ?”字符串长度为9,占用内存字节数为10。
因为其中\n \\ \064\? 各自只占一个字符的位置。
(3)“765+123=?”该字符串不是合法的,因为\765 表示的值太大,超出合法的ASCII 字符集的范围。
二.运行程序写结果
1.以下程序的执行结果是____。
main()
{
int i,j ;
i=15 ;
printf( “%d,%d”, i++,i --) ;
}
【解答】14,15
2.以下程序的执行结果是。
main()
{
int a=20,b=10,c,*p1,*p2;
p1=&a;
p2=&b;
c=(-*p1)/(*p2)+6;
printf("a=%d,b=%d\n",a,b);
printf("*p1=%d,*p2=%d\n",*p1,*p2);
printf("c=%d\n",c);
}
【分析与提示】
p1 a
a 20
P2 b`
b 10
【解答】a=20,b=10
*p1=20,*p2=10
c=4
3.以下程序的执行结果是。
#include <stdio.h>
main()
{
char a= ’G’,b= ’o’,c= ’o’,d= ’d’;
a=a+32;
b=b-6;
c=c+3;
d=d+8;
printf("%c%c%c%c\n",a,b,c,d);
}
【分析与提示】从ASCII 代码表可以看出,字符“G”、“o”、“o”、“d”的ASCII 代码值为71、111、101,因此,’G’+32、’o’-6 、’o’+3、’d’+8 的值分别是103、105、114、108,它们所对应的字符分别是“g”、“i ”、“r ”、“l ”。
常用结论:
(1)在C语言中,字符数据可以按其ASCII 代码值参加整数运算。
由于英文字母在ASCII 代码表中是按顺序排列的,所以在计算’o’+3 代表的字母时,可从字符’o’其顺序向后
取3 个字母,该字母是“r ”。
(2)从ASCII 代码表可以看出“小写字母”- “对应大写字母”的结果是32,因此可推算出如下等式:大写字母的ASCII 值+32=对应小写字母的ASCII 值;小写字母的ASCII 值-32= 对应大写字母的ASCII 值。
【解答】girl
4.以下程序的执行结果是。
#include <stdio.h>
main()
{
int x;
x=-3+4*5-6;
printf("x1=%d\n",x);
x=3+4%5-6;
printf("x2=%d\n",x);
x=-3*4%-6;
printf("x3=%d\n",x);
}
【分析与提示】x1=11(4*5 是20,-3+20 是17,17-6 等于11)
x2=1 (4%5等于4,3+4 等于7,7-6 等于1)
x3=0 (-3*4 等于-12 ,-12%-6 等于0)
【解答】x1=11
x2=1
x3=0
5.以下程序的执行结果是。
#include <stdio.h>
main()
{
printf("%d\n",NULL);
printf("%d,%c\n",49,49);
printf("%d,%c,%o\n",48+10,48+10,48+10);
}
【分析与提示】
0(NULL的ASCII 码值是0)
49,1(数字 1 的ASCII 码值是49)
58,:,72 (48+10 等于58,正好是“:”的ASCII 码值,八进制表示是72)
【解答】0
49,1
58,:,72
三、改错题
1.请修改下列程序,使其能够通过编译。
#include <stdio.h>
Void Main()
{
int a=6;b=8;
int c;
c=a*b;
printf( ‘%d’,c);
}
【答案】错误的地方有 3 处:(1)第2 行关键字应该小写;(2)定义 b 时前面应该用逗号;(3)打印语句的格式应该用双引号括起来。
正确的程序如下:
#include <stdio.h>
void main()
{
int a=6,b=8;
int c;
c=a*b;
printf("%d",c);
}
2.请修改下列程序,使其能够正确运行。
#include <stdio.h>
void main();
{
float f=7.12;
char c= ”c”;
printf( “%d n”,int(f%3));
printf( “%c”,c);
}
【答案】错误的地方有 3 处:(1)第 2 行main(); 不应该有分号;(2)定义char c=”c” ;
时,字符常量应该用单引号;(3)打印语句printf( “%d n”,int(f%3)); 的格式有
错,应该在 f 前的int 用括号括起来, 因为实型数据不能执行取余运算。
正确的程序如下:
#include <stdio.h>
void main()
{
float f=7.12;
char c='c';
printf("%d\n",((int)f %3));
printf("%c",c);
}
第3 章顺序结构程序设计
一.简答题
1.程序有哪三种基本结构?
【解答】程序的三种基本结构为:顺序结构、选择结构和循环结构。
2.C语言的语句有哪几类?表达式语句与表达式有什么不同?
【解答】C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句和
空语句。
其中表达式语句与表达式的区别在于表达式语句是表达式加上“;”组成。
二、填空题
1 .符号’&’是_______运算符,&a 是指_______。
2.C语言中的空语句就是_______。
3.Scanf 函数中的“格式字符”后面应该是_______,而不应该是______。
4.若想输出字符%,则应该在“格式字符”的字符串中用_____表示。
5.int x=7; 执行x+=x- =x+x; 后x 的值是_______。
6.int a=10,b=20;a+=b;b=a-b;a- =b; 的功能是_______。
答案:1.地址、变量 a 的内存地址。
2 .一个分号。
3.变量地址,变量名。
4.连续 2 个%号。
5.-14
6.交换变量a,b 的值,打印出a=20,b=10 。
三.运行程序写结果
1. 以下程序的执行结果是。
#include <math.h>
main()
{
double d=3.2;int x,y;
x=1.2;y=(x+3.8)/5.0;
printf("%d\n",d*y);
}
【解答】0
2.以下程序的执行结果是。
main()
{
double d;float f;long l;int i;
i=f=l=d=20/3;
printf("%d %ld %f %f\n",i,l,f,d);
}
【解答】6 6 6.000000 6.000000
3.以下程序的执行结果是。
main()
{
int k=17;
printf("%d,%o,%x\n",k,k,k);
}
【解答】17,21,11
4.以下程序的执行结果是。
#include <stdio.h>
main()
{
char a,b,c,d;
a='A',b='B',c='C',d='D';
printf("%1c\n",a);
printf("%2c\n",b);
printf("%3c\n",c);
printf("%4c\n",d);
}
【分析与提示】可以用%c格式输出的,也可以用%d格式输出,所以与%md近似,m指出了要输出数据的宽度。
若数据位数小于m,则左端补空格,若数据位数大于m,则按实际
位数输出。
【解答】A
B
C
D
5.以下程序的执行结果是。
#include <stdio.h>
main()
{
char c1,c2;
scanf("%c%c",&c1,&c2);
printf("c1=%c,c2=%c,c3=%d,c4=%d",c1++,--c2,c1,c2);
}
【解答】运行输入:AB<回车>
运行结果为:c1=A,c2=A,c3=65,c4=66
6.以下程序的执行结果是。
#include <stdio.h>
main()
{
char c1,c2;
scanf("%c,%c",&c1,&c2);
++c1;
--c2;
printf("c1=%c,c2=%c\n",c1,c2);
}
【分析与提示】例如当输入B,C<回车>,B,C 的ASCII 码值为66,67,执行++c1; --c2; 后,c1 为66+1 变成67 即C,c2 为67-1 变成66 即B。
【解答】运行输入:B,C<回车>,运行结果为:c1=C,c2=B
7.以下程序的执行结果是。
main()
{
char ch='a';int a=98;
unsigned b=1000;long c=123456789;float x=3.14;
double y=1.2345678;
printf("(1)a=%d,a=%c,ch=%d,ch=%c\n",a,a,ch,ch);
printf("(2)b=%u\n",b);
printf("(3)c=%ld\n",c);
printf("(4)x=%f,y=%f\n",x,y);
printf("(5)x=%e,y=%e\n",x,y);
printf("(6)y=%-10.2f\n",y);
}
【解答】(1)a=98,a=b,ch=97,ch=a
(2)b=1000
(3)c=123456789
(4)x=3.140000, y=1.234568
(5)x=3.14000e+00,y=1.23457e+00
(6)y=1.23
8.以下程序的执行结果是。
#include<stdio.h>
main()
{
int a,b;
float x;
scanf("%d,%d",&a,&b);
x=a/b;
printf("\nx=%f\n",x);
}
【解答】运行输入:2,2< 回车>,运行结果为: 1.000000
9.当输入12345,a 时,给出程序的运行结果,执行结果是。
#include<stdio.h>
main()
{
int a;char c;
scanf("%3d,%c",&a,&c);
printf("\n%d,%d\n",a,c);
}
【分析与提示】%md,m指出了要输出数据的宽度。
若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。
a 的ASCII 码值是97。
【解答】12345,97
10.分析下面程序,在键盘上输入数据才能使得变量a=10,b=20,c1=’A’,c2=’a’,x=1.5 ,y=-3.75 ,z=67.8 。
程序如下:
#include<stdio.h>
main()
{
int a,b;
float x,y,z;
char c1,c2;
scanf("%5d%5d%c%c%f%f%*f,%f",&a,&b,&c1,&c2,&x,&y,&z);
printf("a=%d,b=%d,c1=%c,c2=%c,x=%f,y=%f,z=%f",a,b,c1,c2,x,y,z);
}
【分析与提示】按%5d 格式输入 a 与b 的值时,要先键入三个空格,然后再键入10 与20。
%*f 是用来禁止赋值的。
在输入时,对应%*f 位置可以随意输入一个数(我们输入 1.5 ,该数不会赋值给任何变量的)。
【解答】运行输入:└┘└┘└┘10└┘└┘└┘20Aa1.5 └┘-3.75 └┘1.5,67.8 < 回车>
11 .一个程序中,使用了多个scanf 函数输入数据,用a=3,b=7,x=8.5,y=71.82,c1= ’A’,c2= ’a’输入到每个变量,应该如何输入数据?
main()
{
int a,b;
float x,y;
char c1,c2;
scanf("a=%d,b=%d",&a,&b);
scanf(" x= %f,y=%e",&x,&y);
scanf(" c1= %cc2=%c",&c1,&c2);
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b, x,y,c1,c2);
}
【分析与提示】在使用多个scanf 函数输入数据时,第一个输入行末尾输入的回车被
第二个scanf 函数吸收,因此在第二、三个scanf 函数的双引号后放置一个空格以抵消上行
输入的回车键。
若没有一个空格,则按上面输入的数据会出错。
【解答】运行输入:a=3, b=4< 回车>
X=8, y=71.82< 回车>
C1=AC2=a<回车>
运行结果:a=3,b=7,x=8.500000,y=71.820000,c1=A,c2=a
四.编程题
1.由键盘输入 1 个字母,输出其ASCII 码值。
【分析与提示】将一个字符常数赋给一个字符变量,并不是把该字符本身放到内存单元
中去,而是将该字符的ASCII 代码放到内存单元中,因此,字符型数据也可以像整型数据那
样使用,可以用来表示一些特定范围内的整数。
所以int 型与char 型变量的值可以互换,分别用%c和%d不同格式输出就行了。
但是注意这种转换是有条件的。
因为,char 变量在内存占一个字节,而int 整型变量占2 个字节。
当int 型高位字节是0 时,char 与int 可以互换;若不是0,则不可以互换。
例如,用%c格式输出时,取低位字节,高位字节被舍弃。
参考代码:
#include "stdio.h"
main()
{
char ch;
ch=getchar();
printf("%c,%d",ch,ch);
}
【解答】运行输入: B <回车>
运行结果:B,66
2.从键盘上输入一个大写字母,把它转换成小写字母,然后显示出来。
【分析与提示】大写字母转换小写时ASCII 码值+32,相反的,小写字母转换成大写字
母时ASCII 码值-32 。
参考代码:
#include <stdio.h>
main()
{
char x1,x2;
printf("x1=?\n");
scanf("%c",&x1);
x2=x1+32;
printf("%c,%c\n",x1,x2);
}
【解答】运行输入: A <回车>
运行结果:A,a
3.从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。
【提示】结果要求保留 2 位小数,所以输出的结果格式为%.2f 。
main()
{
float x,y,a,b,c;
printf("please input x,y:");
scanf("%f,%f",&x,&y);
a=x+y;
b=x-y;
c=x*y;
printf("x=%f,y=%f\n",x,y);
printf("x+y=%.2f\nx-y=%.2f\nx*y=%.2f\n",a,b,c);
}
【解答】
运行输入:please input x,y:10 ,20<回车>
运行结果:x=10.000000,y=20.000000
x+y=30.00
x-y=-10.00
x*y=200.00
4.编写一个程序,求出给定半径r 的圆以及内正n 边形的面积,并且输出计算结果。
r 和n 的值由用户输入。
【分析与提示】由数学知识得到:半径为r 圆的面积
2
s r , 半径为r 圆的内接正n
2
边形的面积sin / 2
A nr , 其中 2 /n
处理步骤:提示信息,接收参数值;计算圆的面积;计算正n 边形的面积;输出结果。
参考代码:
#include <stdio.h>
#include <math.h>
#define PI 3.14
main()
{
int n;
float r,s,area;
printf("Please input the radius and the N.:\n");
scanf("%f%d",&r,&n);
s=PI*r*r;
area=(n*r*r*sin(2*PI/n))/2.0;
printf("S=%.2f\tA=%.2f\n",s,area);
}
运行结果如下:
Please inout the radius and the N.;
1 5
S=3.14 A=2.38
5 .已知华氏温度与摄氏温度之间的转换公式是: c 5/9(F32) , 编写一个程序,
将用户输入的华氏温度转换成摄氏温度,并予以输出。
【分析与提示】首先要定义输入输出温度为浮点型,且5/9 两数相除结果为整数,5/9 的值为0,故不能写成5/9 ,而应写成(5.0/9.0)*(f-32) 。
结果要求保留 2 位小数,所以输出的结果格式为%5.2f 。
参考代码:
#include <stdio.h>
main()
{
int f;
float c;
printf("\nplease input the F:");
scanf("%d",&f);
c=5.0/9*(f-32); /* 不能写成5/9 ,两数相除结果为整数,5/9 的值为0*/
printf("the C.temperature is :%.2f",c);
return(0);
}
【解答】运行结果如下:
please input the F: 75< 回车>
the C.te,[erature is :23.89
6.由键盘输入 5 个学生的计算机成绩,计算他们的平均分并保留 2 位小数。
【分析与提示】方法与上题类似,同样是保留两位有效数字%6.2f 。
参考代码:
main()
{
int a,b,c,d,e;
float total,aver;
printf("Plese input 5 students ’scores :\n");
scanf("%d,%d,%d,%d,%d",&a,&b,&c,&d,&e);
total=a+b+c+d+e;
aver=total/5.0;
printf("Average :%6.2f\n",aver);
}
【解答】运行输入:80,93,75,68,87 < 回车>
运行结果:Average :80.60
7.编写将输入的英里转换为公里,每英里等于5380 英尺,每英尺等于12 英寸,每英寸等于 2. 54 厘米,每公里等于100 000 厘米。
{
double mile,k;
printf( “enter mile: ”);
scan f( “%lf ”,&mile);
k=mile*5380*12*2.54/100000;
printf( “%lf mile is %lf kilometer n”,mile,k);
}
【解答】运行:enter mile:2 ↙
2.0 mile is
3.279648 kilometer
第4 章选择结构程序设计
4.1 习题
一.填空题
1. 已知a=3,b=4,c=5。
则逻辑表达式a+b>c&&b= =c 的值为,!(a>b)&&c||1 的值为,!(a+b)+c-1&&b+c/2 的值为。
【分析与提示】本题考查运算符的优先级别。
【解答】0 ; 1 ;1
二、运行程序写结果
1. 下列程序运行的运行结果为。
#include <stdio.h>
main()
{
int a=3 ,b=8,c=9,d=2,e=4;
int min;
min= (a<b)? a:b;
min=(min<c)? min:c;
min= (min<d)? min:d;
min=(min<e)? min:e;
printf ("Min is%d\n" ,min);
}
【分析与提示】本题程序的功能为:找出a,b,c,d,e 中最小的值并输出。
【解答】Min is 2
2 .若输入3,4< 回车>,下列程序运行的运行结果为;若输入4,3< 回车>,下列程序运行的运行结果为。
#include<stdio.h>
main()
{
int a ,b,c;
printf ("Input a ,b: " );
scanf ("%d,%d",&a,&b) ;
if (a>=b)
{c=a*b; printf ("%d*%d=%d\n",a,b,c); }
else
{c=a/b; printf ("%d/%d=%d\n",a,b,c); }
}
【分析与提示】本题程序的功能为:从键盘输入变量a,b ,计算c 的值(若a>=b, 则c=a*b ,若a<b 则c=a/b ),并输出a,b,c 的值。
【解答】3/4=0 ;4*3=12
3.下列程序运行的运行结果为。
#include <stdio.h>
main()
{
int x=1 ,y=0,a=0,b=0;
switch (x)
{
case 1:
switch (y)
{case 0: a++; break;
case 1: b++; break;
}
case 2: a++; b++; break;
}
printf ("a=%d,b=%d\n",a,b) ;
}
【分析与提示】本题中case 1: 后面是一个switch 语句,执行完该语句后,直接执行
case 2: 后面的语句。
【解答】a=2,b=1
三.编程题
1.输入一个字母,若为小写,则把它变成大写输出。
【分析与提示】小写字母的ASCII 码值与其对应的大写字母的ASCII 码值相差32。
参考代码:
main( )
{
char c;
printf(" 请输入一个字母\n") ;
scanf("%c", &c);
if(c>= ’a’&&c<=’z’)
c=c-32;
printf("%c\n",c) ;
}
2.企业发放的奖金根据利润提成。
利润(I) 低于或等于10 万元时,奖金可提10%;利润高于10 万元,低于20 万元时,低于10 万元的部分按10%提成,高于10 万元的部分,可
可提成7.5%;20 万到40 万之间时,高于20 万元的部分,可提成5%;40 万到60 万之间时高于40 万元的部分,可提成3%;60 万到100 万之间时,高于60 万元的部分,可提成 1.5%,高于100 万元时,超过100 万元的部分按1%提成,从键盘输入当月利润I ,求应发放奖金总数?
【分析与提示】请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
参考代码:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("bonus=%d",bonus);
}
3.由键盘输入三个整数a、b、c,用条件运算符求出其中最大值和最小值。
【分析与提示】首先比较输入的a,b 的大小,并把大数装入max,小数装入min 中,然后再与c 比较,若max 小于c,则把c 赋予max;如果c 小于min,则把c 赋予min。
因此max 内总是最大数,而min 内总是最小数。
最后输出max 和min 的值即可。
参考代码:
main( )
{
int a,b,c,max,min;
scanf("%d,%d,%d", &a,&b,&c);
max=a>b?a:b ;
max=max>c?max:c;
min=a<b?a:b;
min=min<c?min:c;
printf(" 最大值为:%d, 最小值为:%d\n",max,min) ;
}
4.有一函数:
x (x<1)
y= 2x-1 (1≤x<10)
3x-11 (x≥10)
编一程序,输入一个x 值,输出y 值。
从最内层开始,
i f 与else 的配对关系。
【分析与提示】本题考查
i f 语句的嵌套,应当注意
else 总是与它上面最近的(未曾配对的)if 配对。
参考代码:
main( )
{
float x,y;
printf(" 请输入x 的值\n") ;
scanf("%f", &x);
if(x<1) y=x;
else
if(x>=10) y=3*x-11;
else y=2*x-1;
printf("x=%6.2f,y=%6.2f",x,y) ;
}
5.从键盘上输入星期号,并显示该日期的英文名字。
【分析与提示】本实例知识点:switch 语句。
switch 语句的控制流程是:首先计算表达式的值,然后依次与每一个case 中的常量值进行比较,一旦发现了某个能够匹配的值,就执行该case 后面的语句组,直到遇
到break
行default 后面的语句组。
语句为止。
如果表达式的值与所有case 中的常量都不匹配,则执
参考代码:
main( )
{
int xqh;
char ywm;
printf(" 请输入星期号(1~7):\n");
scanf("%d",&xqh);
switch(xqh)
{ case 1: printf("Monday"); break;
case 2: printf("Tuesday"); break;
case 3: printf("Wednesday"); break;
case 4: printf("Thursday"); break;
case 5: printf("Friday"); break;
case 6: printf("Saturday"); break;
case 7: printf("Sunday"); break;
default :printf("error");
}
}
6.某市不同车牌的出租车 3 公里的起步价和计费分别为:夏利7 元/ 公里,3 公里以外
3.9 元/ 公里;富康8 元/ 公里,3 公里以外 2.4 元/ 公里;桑塔纳9 元,3 公里以外 2.7 元/ 公里。
编程:从键盘输入乘车的车型及行车公里数,输出应付车资。
【分析与提示】可设三个变量,分别表示乘车的车型、行车公里数和应付车资,根据乘
车的车型和行车公里数,计算出应付的车资。
参考代码:
main( )
{
int cx; /* 定义乘车的车型变量cx */
float gl, cf; /* 定义行车公里数变量gl 、应付车资变量cf */
printf("\t1- 夏利\n \t2- 富康\n \t3- 桑塔纳\n");
printf("\t 请输入车型(1-3 ): ");
scanf("%d",&cx);
printf("\n\t 请输入行车公里数: ");
scanf("%f",&gl);
switch(cx)
{ case 1: if(gl<=3) cf=7.0;
else cf=7+(gl-3)*2.1 ;break;
case 2: if(gl<=3) cf=8.0;
else cf=8+(gl-3)*2.4 ;break;
case 3: if(gl<=3) cf=9.0;
else cf=9+(gl-3)*2.7 ;
}
printf(" 应付车资为%.1f\n",cf);
}
7 .给一个不多于 5 位的正整数,要求:①求出它是几位数; ②分别打印出每一位数字;
③按逆序打印出各位数字。
如原数为12345,则逆序为54321。
【分析与提示】本题的思路是:设 5 个变量,分别代表个位、十位、百位、千位和万
位。
从个位起,依次将各个位取出来,按取出的顺序组合成新的数据,并记录当前取出的数字的个数。
参考代码:
#include "stdio.h"
main( )
{
unsigned x,m,n=0,w=0;
unsigned ge=0,shi=0,bai=0,qian=0,wan=0;
printf(" 请输入一个正整数");
scanf("%u",&x);
m=x;
ge=m%10; m=m/10; w=1; n=ge;
if(m)
{shi=m%10; m=m/10; w=2; n=n*10+shi;
if(m)
{bai=m%10; m=m/10; w=3; n=n*10+bai;
if(m)
{qian=m%10; m=m/10; w=4; n=n*10+qian;
if(m)
{wan=m; w=5; n=n*10+wan;}
}
}
}
printf("\n%u 为%u位数",n,w);
printf("\n 正整数的原序为:%u",x);
printf("\n 正整数的逆序为:%u",n);
}
注:当该程序输入一个较大的 5 位数时,输出结果就不正确了,思考为什么?动手试一下怎样修改该程序。
第5 章循环结构程序设计
一、填空题
1.下面程序的功能是用“辗转相除法”求两个正整数的最大公约数。
请填空。
#include<stdio.h>
main ()
{
int r ,m,n;
scanf ("%d%d",&m,&n) ;
if (m<n)(1) ;
r=m%n;
while (r ){m=n;n=r; (2) ; }
printf ("%d\n" ,n);
}
【分析与提示】辗转相除法:两数相除,若不能整除,则以除数作为被除数,余数作为
除数,继续相除,直到余数为0 时,当前除数就是最大公约数。
【解答】(1)r=m;m=n;n=r; (2)r=m%n;
二.运行程序写结果
1.下列程序运行的运行结果为。
#include <stdio.h>
main()
{
int y=10;
do
{y--;
}while (--y );
printf ("%d",y-- );
}
【分析与提示】注意y-- 与y-- 的运算顺序。
【解答】0
2.下列程序运行的运行结果为。
main()
{
int x=3,y=6,z=2;
while(x++!=(y-=1))
{
z+=1;
if(y<x)
break;
printf( “%d,%d,%d n”,x,y,z);
}
}
【解答】4,5,3
3.下列程序运行的运行结果为。
main()
{
int a=1,b=0;
for( ;a<3 ;a++)
switch(a++)
{
case 1:b--;
case 2:b++;
case 3:b+=3;break;
}
printf( “n”,b);
}
【解答】3
4.下列程序运行的运行结果为。
main()
{
int x=10,y=10,i;
for(i=0;i<2 ;y=i++)
printf( “%4d%4”d ,x --,y);
}
【解答】10 10 9 0
三.编程题
1. 求s=1+2+4+8+⋯+64 的值。
第n 项的值为第【分析与提示】本题为数学项求和问题,数学项间的关
:
n-1 项
为
系
的值 2 倍。
参考代码:
main( )
{
int i,s=0,t=1;
while(t<=64)
{ s=s+t;
t=2*t;
}
printf("s=%d\n",s);
}
3.10 求s=1+1/2+1/3+ ⋯+1/100 的值。
果,分式中的【分析与提示】本题为分数数学项求和问题,要想得到每一项的正确结
分子、分母至少要有一个为实型数据。
参考代码:
main( )
{int i;
float s=0,t;
for(i=1;i<=100;i++)
{ t=1.0/i;
s=s+t;
}
printf("s=%.2f\n",s);
}
3.11 求T=1!+2!+3!+ ⋯+10! 的值。
第n 项的值为第
n-1 项
:
为
系
【分析与提示】本题为数学项求和问题,数学项间的关
的n 倍。
参考代码:
main( )
{
long int t=0,tn=1;
int i;
for(i=1;i<=10;i++)
{ tn=i*tn;
t=t+tn;
}
printf("t=%ld",t);
}
3.12 求s=2/1+3/2+4/3+5/4+ ⋯+22/21 的值。
【分析与提示】请抓住分子与分母的变化规律
参考代码:
main( )
{
int m;
float s=0,n=2.0;
for(m=1;m<=21;m++)
{ s=s+n/m;
n=n+1;
}
printf("s=%.2f\n",s);
}
3.13 输入一行字母,分别统计其中的英文字母、空格、数字和其他字符的个数。
【分析与提示】利用 while 语句 , 条件为输入的字符不为 '\n'. 参考代码: #include "stdio.h" main( ) {
char c;
int letters=0,space=0,digit=0,other=0; printf("
请输入一行字符 :\n");
while((c=getchar())!=
’\n ’)
{ if(c>= ’a ’&&c<=’ z ’||c>= ’A ’&&c<=’Z ’)
letters++; else if(c== ’ ’ )
space++; else if(c>= ’0’&&c<=’9’) digit++; else other++; } printf(" 字母数 =%d 空格数 = %d 数字数 =%d 其它字符数
=%d\n",letters,space,digit,other);
}
6. 求 100 以内能被 8 整除的数,并求它们的和。
【提示】判断一个数 m 能否被 n 整除的方法是:将 m 对 n 取余数,若余数为 0,则为 整除。
参考代码: main( ) {
int n,s=0; for(n=1;n<=100;n++) if(n%8==0) {s=s+n; printf("%4d",n); }
printf("\ns=%d\n",s); }
7. 打印出所有的“水仙花数” 。
所谓“水仙花数”是指一个三位数,其中各位数字的立
方和等于该数本身。
例如 153=1
3 +5
3 +5
3 +3 3 。
【分析与提示】利用 for 循环控制 100~999 个数,每个数分解出个位,十位,百位。
参考代码: main( ) {
int i,j,k,n; printf("
水仙花数是 : ");
for(n=100;n<1000;n++)
{i=n/100;
j=n/10-i*10;
k=n%10;
if(n= =i*i*i+j*j*j+k*k*k)
printf("%5d",n);
}
printf("\n");
}
3.14 以下面的格式,输出九九乘法表。
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
⋯⋯⋯
1*9=9 2*9=18 3*9=27 ⋯9*9=81
【提示】分行与列考虑,共9行9 列,利用双重for 循环,外循环i 控制行,内循环j 控制列。
参考代码:
main( )
{int i,j;
for(i=1;i<10;i++)
{ for(j=1;j<=i;j++)
printf("%d*%d=%-4d",j,i,j*i);
printf("\n");
}
}
9.用for 循环打印输出以下图案。
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
(图形
b)
a)(图形
a程序代码:
输出图形
#include "stdio.h"
main( )
{
int i,j,k;
for(i=0;i<4;i++) /* 控制打印行数*/
{
for(j=0;j<10+i;j++) /* 控制空格输出位置*/
printf(" ");
for(k=0;k<4;k++) /* 控制每行*的输出个数*/
printf("*");
printf("\n");
}
}
输出图形 b 序代码:
#include “stdio.h ”
main( )
{
int i,j,k;
for(i=0;i<4;i++) /* 控制打印行数*/
{
for(j=0;j<3-i;j++) /* 控制空格输出位置*/
printf( “”);
for(k=0;k<2*i+1;k++) /* 控制每行*的输出个数*/
printf( “*”);
printf( “n”);
}
}
10. 猴子吃桃子问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃
了一个。
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第十天早上再想吃时,见只剩一个桃子了。
求第一天共摘了多少个桃子。
【提示】采取逆向思维的方法,从后往前推断。
参考代码:
main( )
{ int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;
x2=x1;
day--;
}
printf(" 桃子总数=%d\n",x1);
}
11. 求出500 以内所有素数。
【提示】判断素数的方法:用一个数分别去除 2 到sqrt( 这个数) ,如果能被整除,则表明此数不是素数,反之是素数。
参考代码:
#include "math.h"
main( )
{int m,k,i,n=0;
for(m=2;m<=500;m++)
{
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>=k+1)
{ printf("%-5d",m);
n=n+1;
if(n%10==0)
printf("\n");
}
}
printf("\n");
}
3.15 输入一个整数(0~99999),判断它的位数,并重新组合成同样位数的最大值。
如,
输入1345,输出5431。
【提示】先求出该整数的位数;其次分解出每一位数(个位、十位、百位、千位、万位);接着将 5 个位数进行排序;最后根据整数的位数重新组合成同样位数的最大值。
参考代码:
main( )
{long int num, t,d1,d2,d3,d4,d5,n;/* 分别代表个位,十位,百位,千位,万位和
位数*/
printf(" 请输入一个整数(0~99999):") ;
scanf("%ld", &num);
if(num>9999) n=5;
else if(num>999) n=4;
else if(num>99) n=3;
else if(num>9) n=2;
else n=1;
printf("n=%ld\n",n) ;
d5=num/10000;
d4=(num-d5*10000)/1000;
d3=(num-d5*10000-d4*1000)/100;
d2=(num-d5*10000-d4*1000-d3*100)/10;
d1=num-d5*10000-d4*1000-d3*100-d2*10;
if(d5<d4)
{t=d5;d5=d4;d4=t;}
if(d5<d3)
{t=d5;d5=d3;d3=t;}
if(d5<d2)
{t=d5;d5=d2;d2=t;}
if(d5<d1)
{t=d5;d5=d1;d1=t;}
if(d4<d3)
{t=d4;d4=d3;d3=t;}
if(d4<d2)
{t=d4;d4=d2;d2=t;}
if(d4<d1)
{t=d4;d4=d1;d1=t;}
{t=d3;d3=d2;d2=t;}
if(d3<d1)
{t=d3;d3=d1;d1=t;}
if(d2<d1)
{t=d2;d2=d1;d1=t;}
switch(n)
{ case 5: num=d5*10000+d4*1000+d3*100+d2*10+d1; break;
case 4: num=d5*1000+d4*100+d3*10+d2; break;
case 3: num=d5*100+d4*10+d3; break;
case 2: num=d5*10+d4; break;
case 1: num=d5;
}
printf(" 重组后的数为:%ld\n",num);
}
13. 求证100 以内哥德巴赫猜想是成立的。
即:100 以内任何一个大的偶数(大于等于6)都可以表示成两个素数之和。
【分析与提示】我们先不考虑怎样判断一个数是否为素数,而从整体上对这个问题进
行考虑,可以这样做:读入一个偶数n,将它分成p 和q,使n=p+q。
怎样分呢?可以令p 从2 开始,每次加1,而令q=n-p ,如果p、q 均为素数,则正为所求,否则再试。
参考代码:
#include <math.h>
#include <stdio.h>
main( )
{
int j,n,p,q,flagp,flagq;
printf("please input n :\n");
scanf("%d",&n );
if (((n%2)!=0)||(n<=4))
printf("input data error!\n");
else
{ p = 1 ;
do {
p = p + 1 ;
q = n - p ;
flagp = 1 ;
for(j=2;j<=(int)(sqrt(p));j++) /* 判断p 是否为素数*/
{ if((p%j)==0)
{ flagp = 0 ;
break; /* 不是素数,退出循环*/
}
}
for(j=2;j<=(int)(sqrt(q));j++) /* 判断q 是否为素数*/
{ if ((q%j)==0)
{ flagq = 0 ;
break ; /* 不是素数,退出循环*/
}
}
} while(flagp*flagq==0);
printf("%d=%d+%d\n",n ,p,q) ;
}
}
第6 章数组与指针
一.简答题
1、什么是数组,为什么在C语言中引用数组?
【解答】数组是有序的、且具有相同性质类型的数据集合。
引用数组来实现成批地处理数据。
2、在C语言中如何表示一个字符串?
【解答】运用字符型数组来表示字符串。
3、指针是指什么?
【解答】指针就是地址。
二.运行程序写结果
1. 以下程序的执行结果是。
main()
{
int k,a[6]={1,2,3,4,5,6};
for(k=5;k>0;--k)
if(a[k]%2==0)
printf("%d ",a[k]);
}
【提示】从后向前把能被 2 整除的数组元素输出。
【解答】6 4 2
2. 以下程序的执行结果是。
#include <stdio.h>
main()
{
char str[]="SSSWLIA",c;
int k;
for(k=2;(c=str[k])!='\0';k++)
{
switch(c)。