c语言程序设计第五版习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题解析与答案
第1章C语言概述
一.简答题
1.概述C语言的主要特点。
【解答】
(1)语言简洁、紧凑,使用方便、灵活。
(2)数据类型丰富,表达能力强。
(3)运算符多样。
C语言中的运算符包含的范围非常广泛。
(4)具有结构化的控制语句。
如if…else语句、while语句、do while语句、switch 语句、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,a2=%d\n″,a1,a2);
printf(″x=%d\n″,x);
}
【解答】运行结果为:a1=10,a2=20
x=200
三.编程题
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\n\\TH\064\?” (3)“\xAB*\765+123=?”
【解答】
(1)“Hello!” 字符串长度为6,占用内存字节数为7。
(2)“ABC\n\\TH\064\?” 字符串长度为9,占用内存字节数为10。
因为其中\n \\ \064\?各自只占一个字符的位置。
(3)“\xAB*\765+123=?” 该字符串不是合法的,因为\765表示的值太大,超出合法的ASCII字符集的范围。
二.运行程序写结果
1.以下程序的执行结果是____。
main()
{
int i,j;
i=15;
p rintf(“%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
P2 b`
【解答】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;
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);
}
【分析与提示】按%5 d格式输入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 圆的面积2r s π=,半径为r 圆的内接正n
边形的面积2/sin 2αnr A =,其中n /2πα=
处理步骤:提示信息,接收参数值;计算圆的面积; 计算正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);
return(0);
}
运行结果如下:
Please inout the radius and the N.;
1 5
S=3.14 A=2.38
5.已知华氏温度与摄氏温度之间的转换公式是:)32(9/5-⨯=F c , 编写一个程序,将用户输入的华氏温度转换成摄氏温度,并予以输出。
【分析与提示】首先要定义输入输出温度为浮点型,且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厘米。
main()
{
double mile,k;
printf(“enter mile:”);
scanf(“%lf”,&mile);
k=mile*5380*12*2.54/100000;
printf(“ %lf mile is %lf kilo meter\n”,mile,k);
}
【解答】运行:enter mile:2↙
2.000000 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值。
【分析与提示】本题考查if语句的嵌套,应当注意if与else的配对关系。
从最内层开始,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 语句为止。
如果表达式的值与所有case中的常量都不匹配,则执行default后面的语句组。
参考代码:
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公里以外2.1元/公里;富康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(“%d\n”,b);
}
【解答】3
4.下列程序运行的运行结果为。
main()
{
int x=10,y=10,i;
for(i=0;i<2 ;y=i++)
printf(“%4d%4d”,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);
}
2.求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.求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);
}
4.求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);
}
5.输入一行字母,分别统计其中的英文字母、空格、数字和其他字符的个数。
【分析与提示】利用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=13 +53 +33。
【分析与提示】利用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");
}
8.以下面的格式,输出九九乘法表。
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循环打印输出以下图案。
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
(图形a)(图形b)
输出图形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");
}
12.输入一个整数(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;}
if(d3<d2)
{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; /*不是素数,退出循环*/
}
}
flagq=1 ;
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)
{
case 'I':++k;break;
case 'L':continue;
default:putchar(c);continue;
}
putchar('*');
}
}
【提示】从字符串中第3个字符开始,把符合要求的字符运用输出字符函数putchar()输出;最后在其后输出一个"*"。
【解答】SW*
3.以下程序的执行结果是。
main()
{
char ss[10]="12345";
strcat(ss,"6789");
gets(ss);
printf("%s",ss);
}。