A.4 B.3 C.2 D.1
7.执行下列程序段后,变量a,b,c的值分别是( )。
int x=10,y=9,a,b,c;
a=(--x= =y++)?--x:++y;b=x++;c=y;
A.a=9,b=9,c=9 B.a=8,b=8,c=10
C.a=9,b=10,c=9 D.a=1,b=11,c=10
8.有定义int a=9;,语句“a+=a– =a+a;”执行后,变量的值是( )。
A.18 B.9 C.–18 D.–9
9.设x和y均为int型变量,则语句“x+=y;y=x–y;x– =y;”的功能是( )。
A.把x和y按从小到大排列 B.把x和y按从大到小排列
C.无确定结果 D.交换x和y中的值
10.有定义double x=1,y;,表达式“y=x+3/2”的值是( )。
A.1 B.2 C.2.0 D.2.5
11.设有定义int x;double y;,则下列表达式中结果为整型的是( )。
A.
(int)y+x B.(int)x+y C.int(y+x) D.(double)x+y
12.设有整型变量x,下列说法中,错误的是( )。
A.“5.0”不是表达式 B.“x”是表达式
C.“!x”是表达式 D.“sqrt(x)”是表达式
解:(1)D (2)B (3)B (4)D (5)B (6)D (7)B (8)C (9)D (10)C (11)A (12)A
四、填空题。
1.设float x=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 值为 。
解:2.5
2.设int x=2,y=3;,执行语句“x*=x+y”后x的值为 。
解:10
3.设int x=17,y=5;,执行语句“x%=x–y”后x的值为 。
解:5
6
4.设 int a=6,b=4,c=2;,表达式 !(a-b)+c-1&&b-c/2 的值为 。
解:1
5.设 int a=2,b=4,x,y;,表达式!(x=a)||(y=b)&&!(2-3.5) 的值为 。
解:0
6.判断变量a、b是否绝对值相等而符号相反的逻辑表达式为 。
解:a==-b
7.判断变量a、b中必有且只有一个为0的逻辑表达式为 。
解:a*b==0&&a+b!=0
8.设int m=2,n=2,a=1,b=2,c=3;执行语句d=(m=a==b)&&(n=b>c);后,m和n的值分别为 。
解:m为0,n为2
9.设int a=2;,表达式“a%2!=0”的值为 。
解:0
10.设char c='y';,表达式“c>='a'&&c<='z'|| c>='A'&&c<='Z'”的值为 。
解:1
x+211.写出与代数式 (x+2)e 对应的C表达式 。
解:(x+2)*exp(x+2)
12.设int a=2;执行语句a=3*5,a*4;后a的值为 。
解:15
五、写出下列程序的输出结果。
1.
#include
void main()
{
unsigned k,n;
scanf("%u",&n); //输入数据为:69
k=n%10*10+n/10;
printf("n=%d k=%dn",n,k);
}
解:n=69 k=96
2.
#include
void main()
{
int x=2,y=3;
x*=y+4;
printf("%d,%dn",x,y);
x/=y=5;
printf("%d,%dn",x,y);
x-=y%2;
printf("%d,%dn",x,y);
}
解:14,3
7
2,5
1,5
3.
#include
void main()
{
int a, b;
a=8;
b=7;
a=(a-- ==b++)? a%3 : a/3;
printf("a=%d b=%dn",a,b);
}
解:a=2 b=8
六、程序填空题。
1.以下程序输入三个整数值给a,b,c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。例如输入1 2 3,输出a=2 b=3 c=1。
#include
void main()
{ int a,b,c, ① ;
printf(“Enter a,b,c:”);
scanf(“%d%d%d”, ② );
③ ; a=b; b=c; ④ ;
printf(“a=%d b=%d c=%dn”,a,b,c);
}
解:① t ② &a,&b,&c ③ t=a ④ c=t
2.以下程序不借助任何变量把a、b中的值进行交换。
#include
void main()
{ int a,b;
printf(“Input a,b:”);
scanf(“%d%d”, ① );
a+= ② ; b=a- ③ ; a- = ④ ;
printf(“a=%d b=%dn”,a,b);
}
解:① &a,&b ② b ③ b ④ b
七、编程题。
1.输入3个字符后,按各字符ASCII码从小到大的顺序输出这些字符。
解:#include
void main()
{ char c1,c2,c3,t,min,mid,max;
c1=getchar(); c2=getchar(); c3=getchar();
min=(t=c18
max=(t=c1>c2?c1:c2)>c3?t:c3;
mid=c1+c2+c3-min-max;
putchar(min);
putchar(mid);
putchar(max);
}
2.输入两点坐标(x1,y1)、(x2,y2),计算并输出两点间的距离。
解:#include
#include
void main()
{
double x1,y1,x2,y2,d;
printf(“请输入两点坐标 (x1,y1),(x2,y2)n”);
scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2);
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
printf(“两点间距离=%fn”,d);
}
3.编写程序,计算球体积并输出它的值。要求输入半径值,计算结果保留三位小数。
解:#include
#include
#define PI 3.1415926
void main()
{ double r,gv;
printf(“请输入半径值:n”);
scanf(“%lf”,&r);
gv=4.0/3*PI*pow(r,3);
printf(“半径为%f的球的体积为:%.3fn”,r,gv);
}
4.输入三角形的底和高,求三角形面积。
解:#include
#define PI 3.14159
void main()
{
double a,h,s;
printf(“请输入三角形的底,高n”);
scanf(“%lf,%lf”,&a,&h);
s=a*h/2;
printf(“三角形面积=%fn”,s);
}
5.编写程序,输入一个实数后输出该数的绝对值。
解:#include
void main()
{
double x,y;
9
printf(“请输入一个实数n”);
scanf(“%lf”,&x);
y=x>=0?x:-x;
printf(“|%g|=%gn”,x,y);
}
6.输入梯形的上底、下底和高,求梯形面积。
解:#include
void main()
{
double a,b,h,s;
printf(“请输入梯形的上底,下底,高n”);
scanf(“%lf,%lf,%lf”,&a,&b,&h);
s=(a+b)*h/2;
printf(“ 梯形面积=%fn”,s);
}
7. 输入矩形的边长,求矩形面积。
解:#include
void main()
{
double a,b,s;
printf(“请输入矩形的长,宽n”);
scanf(“%lf,%lf”,&a,&b);
s=a*b;
printf(“ 矩形面积=%fn”,s);
}
8. 已知等差数列的第一项为a,公差为d,求前n项之和,a、d、n由键盘输入。
解:#include
void main()
{
int a,d,n,sum;
printf(“请输入等差数列的首项 公差 项数n”);
scanf(“%d%d%d”,&a,&d,&n);
sum=a*n+n*(n-1)*d/2;
printf(“ sum=%dn”,sum);
}
9. 编写程序,将d天h小时m分钟换算成分钟,输入d、h、m,输出换算结果。
解:#include
void main()
{
int d,h,m,t;
printf(“请输入天 小时 分钟n”);
scanf(“%d%d%d”,&d,&h,&m);
t=d*24*60+h*60+m;
printf(“%d天%d小时%d分钟=%d分钟n”,d,h,m,t);
}
10
10. 编写程序,求出给定半径r的圆以及内接正n边形的面积,输出计算结果。r和n的值由键盘输入。
解:#include
#include
#define PI 3.14159
void main()
{
double r,s1,s2;
int n;
printf(“Input r nn”);
scanf(“%lf%d”,&r,&n);
s1=PI*r*r;
s2=n/2.0*r*r*sin(2*PI/n);
printf(“圆面积=%f,正内接%d边形面积=%fn”,s1,s2);
}
习 题 4
一、单项选择题
1.下列语句将小写字母转换为大写字母,其中正确的是( )。
A.if(ch>='a'&ch<='z')ch=ch-32; B.if(ch>='a'&&ch<='z')ch=ch-32;
C.ch=(ch>='a'&&ch<='z')?ch-32:' '; D.ch=(ch>'a'&&ch<'z')?ch-32:ch;
2.下列各语句中,能够将变量u、s中最大值赋给变量t的是( )。
A.if(u>s)t=u;t=s; B.t=s;if(u>s)t=u;
C.if(u>s)t=s;else t=u D.t=u;if(u>s)t=s;
3.假设变量x、k都已定义,下列语句片段中,无语法错误的是( )。
A. switch(x){
case x>=90: putchar('A');
case x<60: putchar('E');
}
B. switch(x) {
case 1+2: k='A';
defualt: k='E';
case 2*4: k='B';
}
C. switch(x){
case 2+x: k=x-2;
case 3*x: k=x+3;
default: k=0;
}
D. switch(x){
case 3.5: k=0.5*x;
case 7.8: k=8*x;
default: k=0;
}
*4.与语句while(!s )中的条件等价的是( )。
11
A.s==0 B.s!=0 C.s==1 D.s=0
5.下列语句中,哪一个可以输出26个大写英文字母( )。
A.for(a='A';a<='Z';printf("%c",++a));
B.for(a='A';a<'Z';a++)printf("%c",a);
C.for(a='A';a<='Z';printf("%c",a++));
D.for(a='A';a<'Z';printf("%c",++a));
6.判断下面的while循环体的执行次数( )。
i=0;
k=10;
while( i=8 ) i=k––;
A.8次 B.10次 C.2次 D.无数次
解:(1) B (2) B (3) B (4) A (5) C (6) D
二、写出下列程序的输出结果
1.#include
void main()
{
char x;
int n=0,k=0;
while((x=getchar())!='#'){ //运行时输入:a the ftheth e
there#
switch(x){
case 't': k++; break;
case 'h': if(k==1) k++; break;
case 'e': if(k==2) k++; break;
default: k=0;
}
if(k==3) n++; }
printf("%dn",n);
}
解:3
*2.
#include
void main( )
{
int k=0;
char c='A';
do {
switch (c++) {
case 'A': k++; break;
case 'B': k--;
case 'C': k+=2; break;
case 'D': k=k%2; break;
case 'E': k=k*10; break;
default: k=k/3;
12
}
k++;
}while(c<'G');
printf("k=%dn", k);
}
解:k=8
*3.
#include
#include
void main()
{
char a,b,x; int i;
do
x=getchar(); //运行时输入:2abcD
while (isupper(x)==0);
for(a='A'; a<=x; a++){
for(b='A'; b<'A'+x-a; b++)
putchar(' ');
for(i=1;i<=2*(a-'A')+1;i++)
putchar(a);
putchar('n');
}
}
注:isupper(x)是判断x是否大写字母的函数,如果x是大写字母函数值为1否则为0。
解: A
BBB
CCCCC
DDDDDDD
4.
#include
void main()
{
int i,n;
scanf("%d",&n); //输入2520
i=2;
while(n>1)
if(n%i==0){
printf("%dt",i);
n/=i;
}
else i++;
printf("n");
}
13
解: 2 2 2 3 3 5 7
三、填空题
1.求1~10的乘积,写作:
for( , i=1; i<=10; ++i) s*=i;
解: s=1
2.下面程序段执行后,x、y的值分别为 。
y=1;
x=5;
while(x) {
x--;
y++;
}
解: x、y分别为0和6
*3.输入若干个以问号结束的字符,同时输出这串字符(不包括问号);
while( !='?') putchar(ch);
解: (ch=getchar()) //注意外面的这对括号不能少
*4.有以下程序片段:
s=1.0;
for(k=1;k<=n; k++)
s+=1.0/(k*(k+1));
printf("%fn",s);
填空,使下程序段与上程序段功能完全相同。
s=0.0;
;
k=0;
do
{ s+=d;
;
d=1.0/(k*(k+1));
}
while( );
printf("%fn",s);
解: d=1 k++ k<=n
5.下列程序输出6~10000之间的亲密数对,填空将程序补充完整。若a、b是亲密数对,则a的因子和等于b,b的因子和等于a,且a不等于b。
#include
void main()
{ int a,b,c,i;
for(a=6;a<=10000;a++) {
b=1;
for(i=2;i<=a/2;i++)
if( ) b+=i;
for(i=2;i<=b/2;i++)
if(b%i==0) c+=i;
14
if( &&a!=b)
printf("%d %dn",a,b);
}
}
解:a%i==0 c=1; c==a
6.计算2+22+222+2222+…+22+…+2的和。
n
#include
n
void main()
{ int s=1,t=1,a,n;
scanf("%d"&n);
for(int i=2;i<=n;i++) {
t=t*10+1;
}
printf("SUM=%dn",s);
}
解:a=2; s+=t; s*=a;
四、编程题
1.输入一个实数,输出它的平方根值,如果输入数小于0,则输出“The number is error!”的提示。
解:#include
#include
void main()
{
double a,x;
printf(“Input data:n”);
scanf(“%lf”,&a);
if(a>=0){
x=sqrt(a);
printf(“%g的平方根值为%gn”,a,x);
}
else
printf(“The number is error!n”);
}
2.用if语句编程序,输入x后按下式计算y值,并输出结果。
x+2*x2 +10 0≤x≤8
y=
x-3*x3-9 x<0 或 x>8
解:#include
void main()
{
15
double x,y;
printf(“Input x:n”);
scanf(“%lf”,&x);
if(x>=0&&x<=8)
y=x+2*x*x+10;
else
y=x-3*x*x*x-10;
printf(“x=%f,y=%fn”,x,y);
}
3.输入一个百分制的成绩t后,按下式输出它的等级,要求分别写成if结构和switch结构。等级为:90~100为“A”,80~89为“B”,70~79为“C”,60~69为“D”,59~0为“E”。
if结构
解:#include
void main()
{
double t;
printf(“Input score:n”);
scanf(“%lf”,&t);
if(t>=90&&t<=100)
putchar(‘A’);
else if(t>=80&&t<90)
putchar(‘B’);
else if(t>=70&&t<80)
putchar(‘C’);
else if(t>=60&&t<70)
putchar(‘D’);
else if(t>=0&&t<60)
putchar(‘E’);
else
printf(“error!n”);
}
switch结构
解:#include
void main()
{
double t;
printf(“Input score:n”);
scanf(“%lf”,&t);
switch((int)(t/10)){
case 10:
case 9:putchar(‘A’);break;
case 8:putchar(‘B’);break;
case 7:putchar(‘C’);break;
case 6:putchar(‘D’);break;
case 5:
16
}
}
case 4:
case 3:
case 2:
case 1:
case 0:putchar(‘E’);break;
default:printf(“error!n”);
4.输入x、y,计算f(x,y)的函数值。 f(x,y)定义如下:
xyx2y2f(x,y)xyxy22x0y0x0y0x0y0x0y0解:#include
void main()
{
double x,y,f;
printf(“Input x y:n”);
scanf(“%lf%lf”,&x,&y);
if(x>=0&&y>=0)
f=x*x+y*y;
else if(x<0&&y<0)
f=x*x-y*y;
else if(x>=0&&y<0)
f=x+y;
else if(x<0&&y>=0)
f=x-y;
printf(“f(%f,%f)=%fn”,x,y,f);
}
5.输入三角形的三条边长a、b、c,计算并输出三角形的面积。要求判断输入的三条边a、b、c三个数是否能构成三角,如果不能构成三角形,则输出提示信息告诉用户。
根据三条边的边长,计算三角形面积的公式如下:
sxyz面积s(sx)(sy)(sz)
2
解:#include
#include
void main()
{
double a,b,c,s,area;
printf(“Input a b c:n”);
scanf(“%lf%lf%lf”,&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a){
s=(a+b+c)/2;
17
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“area=%.3fn”,area);
}
else
}
6.输入1~7,输出对应的星期一~星期天。
解:#include
void main()
{
int s;
printf(“Input s(1~7):n”);
scanf(“%d”,&s);
switch(s){
case 1:printf(“星期一n”);break;
case 2:printf(“星期二n”);break;
case 3:printf(“星期三n”);break;
case 4:printf(“星期四n”);break;
case 5:printf(“星期五n”);break;
case 6:printf(“星期六n”);break;
}
}
7.输入年、月、日,输出是该年的第几天。
解:#include
void main()
{
int y,m,d,days;
printf(“Input 年 月 日:n”);
scanf(“%d%d%d”,&y,&m,&d);
days=d;
switch(m){
case 12:days+=30;
case 11:days+=31;
case 10:days+=30;
case 9:days+=31;
case 8:days+=31;
case 7:days+=30;
case 6:days+=31;
case 5:days+=30;
case 4:days+=31;
case 3:
if(y%4==0&&y%100!=0||y%400==0)
18
printf(“线段%f,%f,%f不能构成三角形n”,a,b,c);
case 7:printf(“星期天n”);break;
default:printf(“The s is error!n”);
}
days+=29;
else days+=28;
case 2:days+=31;
}
printf(“%d月%d日是%d年的第%d天n”,m,d,y,days);
8.输入n和相应的n个数,输出它们中所有奇数的乘积。
解:#include
void main()
{
int n,i,t,x;
printf(“请输入 n:n”);
scanf(“%d”,&n);
printf(“请输入%d个数:n”,n);
for(i=1,t=1;i<=n;i++){
scanf(“%d”,&x);
if(x%2==1)
t*=x;
}
printf(“%dn”,t);
}
9.输入一个正整数,求它们所有数字之和。
解:#include
void main()
{
int a,sum=0;
printf(“请输入一个正整数:n”);
scanf(“%d”,&a);
a=a>=0?a:-a;
while(a!=0){
sum+=a%10;
a/=10;
}
printf(“%dn”,sum);
}
10.输入n和相应的n个数,统计输入的数中负数、零及正数的个数。
解:#include
void main()
{
int n,i,t,s,k;
double x;
19
t=s=k=0;
printf(“请输入 n:n”);
scanf(“%d”,&n);
printf(“请输入%d个数:n”,n);
for(i=1;i<=n;i++){
scanf(“%lf”,&x);
if(x>0)
t++;
else if(x<0)
s++;
else k++;
}
printf(“负数:%dt零:%dt正数:%dn”, s, k, t);
}
11.输入10个学生的成绩,输出最低分数。
解:#include
void main()
{
int i;
double score,min;
printf(“请输入 10个学生成绩:n”);
scanf(“%lf”,&score);
min=score; // 给min赋初值
for(i=1;i<10;i++){
}
}
printf(“min=%gn”, min);
scanf(“%lf”,&score);
if(min>score)
min=score;
或
解:#include
void main()
{
int i;
double score,min;
printf(“请输入 10个学生成绩:n”);
for(i=1;i<=10;i++){
}
20
scanf(“%lf”,&score);
if(i==1)
min=score;
min=score;
if(min>score)
}
printf(“min=%gn”, min);
12.青年歌手大奖赛中,10个评委给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分。计算并输出选手张三的得分。(注:如果最高分或最低分有多个相同时,去掉其中一个)
解:#include
void main()
{
int i;
double score,min,max,sum,aver;
printf(“请输入 10个评委给张三的评分:n”);
scanf(“%lf”,&score);
min=max=sum=score;
for(i=1;i<10;i++){
}
}
aver=(sum-max-min)/8;
printf(“张三得分:%gn”, aver);
scanf(“%lf”,&score);
if(min>score)
min=score;
max=score;
if(maxsum+=score;
或
解:#include
void main()
{
int i;
double score,min,max,sum=0,aver;
printf(“请输入 10个评委给张三的评分:n”);
for(i=1;i<=10;i++){
}
aver=(sum-max-min)/8;
printf(“张三得分:%gn”, aver);
scanf(“%lf”,&score);
if(i==1)
max=min=score;
min=score;
max=score;
if(min>score)
if(maxsum+=score;
21
}
13.用循环语句输出26个大写字母及它们的ASCII码值。
解:#include
void main()
{
char c;
for(c=’A’;c<=’Z’;c++)
printf(“%ct%dn”,c,c);
}
或
解:#include
void main()
{ char ch='A';
while( ch<='Z'){
printf("(%c,%d)n",ch,ch);
ch++;
}
}
14.输出所有的“水仙花数”,水仙花数是指一个三位数,其各位数字的立方和等于其本身,如:153=13+53+33。
解:#include
void main()
{
int x,a,b,c;
}
printf(“水仙花数:n”);
for(x=100;x<1000;x++){
}
printf(“n”);
a=x/100;
b=x%100/10;
c=x%10;
if(x==a*a*a+b*b*b+c*c*c)
printf(“%dt”, x);
11111n前40项的和。
23456解:#include
void main()
{
int i;
double sum=0,flag=1;
for(i=1;i<=40;i++){
15.求算式1 sum+=flag/i;
22
}
}
flag=-1*flag; // 或flag=-flag
printf(“sum=%gn”,sum);
16.输出一张华氏与摄氏温度对照表,将华氏温度从30°~40°F之间的每度转换对应的摄氏温度输出。张华氏转化为摄氏温公式:c=5/9(F-32)
解:#include
void main()
{
double f,c;
for(f=30;f<=40;f++){
}
}
c=5.0/9*(f-32);
printf(“%gt%gn”,f,c);
*17.求数列的和。设数列的首项为81,以后各项为前一项的平方根(如81,9,3,1.732,…),求前20项和。
解:#include
#include
void main()
{
int i;
double sum=0,a=81;
for(i=1;i<=20;i++){
}
}
printf(“sum=%gn”,sum);
sum+=a;
a=sqrt(a); // 下一项为前一项的平方根
18.输出一个如下的乘法口诀表。
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
解:#include
void main()
{
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++)
23
}
}
printf(“%d*%d=%dt”,j,i,i*j);
printf(“n”);
*19.猴子吃桃子。第1天猴子吃掉桃子总数一半多一个,第2天又将剩余的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第十天准备吃的时候只剩下一个桃子。请问第1天开始吃的时候桃子的总数。
//递推公式 x=2*(x+1)
解:#include
void main()
{
int n,x;
x=1; //第10天的挑子数
for(n=9; n>=1; n--)
{ x=2*(x+1); //计算第n天的桃子数
}
printf("第1天吃前挑子总数=%dn",x);
}
*20.用循环体编程序,分别输出如下两个图形,如图4.15所示。*
*
*
* * *
* * *
* * * * *
* * * * *
* * * * * *
* * * * * * *
* * * * *
* * *
*
左图
解:#include
void main()
{
int i,j;
for(i=1;i<=4;i++)
{
for(j=1;j<=8-2*i;j++)
putchar(' ');
for(j=1;j<=2*i-1;j++)
printf("%c ",'*');
putchar('n');
}
}
右图
解:#include
void main()
24
*
{
int i,j;
for(i=1;i<=4;i++) //图上半部分
{
for(j=1;j<=8-2*i;j++)
putchar(' ');
for(j=1;j<=2*i-1;j++)
printf("%c ",'*');
putchar('n');
}
for(i=3;i>=0;i--) //图下半部分
{
for(j=1;j<=8-2*i;j++)
putchar(' ');
for(j=1;j<=2*i-1;j++)
printf("%c ",'*');
putchar('n');
}
}
21.输入正整数a、b,输出a、b之间所有素数之和。
解:#include
void main()
{
int i,j,a,b,sum=0;
printf(“请输入a b (a≤b)n”);
scanf(“%d%d”,&a,&b);
for(i=a;i<=b;i++)
{
for(j=2;j<=i/2;j++)
if(i%j==0)break; // 此时可判定i不是素数
if(j>i/2&&i!=1)
sum+=i;// 满足此条件表示除1和自身外,其它数均不能整除i
}
printf(“%d至%d之间的素数和=%dn”,a,b,sum);
}
或
解:#include
void main()
{
int i,j,a,b,sum=0,flag;
printf(“请输入a b (a≤b)n”);
scanf(“%d%d”,&a,&b);
for(i=a;i<=b;i++)
25
{ flag=1; // 要判别当前i是否素数,先将标志变量赋值为1
for(j=2;j<=i/2;j++)
if(i%j==0){
flag=0;break; }// 此时可判定i不是素数,退出循环
if(flag==1&&i!=1)
sum+=i;//满足此条件表示除1和自身外,其它数均不能整除i
}
printf(“%d至%d之间的素数和=%dn”,a,b,sum);
}
*22.当x为–2,–1.5,–1,…,1.5,2时,求函数f(x)=x2–3.14x–6的解所取的最大值、最小值。
解:#include
void main()
{
double x,y,max,min;
max=min=(-2)*(-2)-3.14*(-2)-6;
//f(-2)作为max、min的初始值
for(x=-1.5;x<=2;x+=0.5)
{
y=x*x-3.14159*x-6;
if(y>max) max=y;
else if(y}
printf("max=%f,min=%fn",max,min);
}
*23.当n取值在–39~40范围内时,判断表达式n2+n+41的值是否都是素数。
解:#include
#include
void main()
{
int i,j,y,count=0;
for(i=-39;i<=40;i++)
{ y=i*i+i+41;
for(j=2;j<=sqrt(y);j++)
if(y%j==0)
{ printf("当i为%d时,y=%d,结论不成立!n",i,y);
count++;
break;
}
}
if (count!=0) printf("共有%d个i值,使结论不成立!n",count);
else printf("结论成立,都是素数!n");
}
26
*24.用区间对分法求x2+xsinx–5=0在区间[0,5]内的一个实根(设ε=10–5)。
【说明】 在[a,b]区间连续的函数f(x),若满足条件f(a)·f(b)<0,则必有a<ξ
(1)c=(a+b)/2。
(2)若|f(c)|<ε或|b-a|<ε,则输出c作为近似解,并终止程序执行。
(3)如果f(a)·f(c)<0,则b=c;否则a=c,再次执行第(1)步。
解:#include
#include
void main()
{
float a,b,c;
a=0; b=5; //初始化区间a、b值
do {
c=(a+b)/2; //计算a、b区间的中值
if((a*a+a*sin(a)-5)*(c*c+c*sin(c)-5)<0 )
b=c; //以c代替区间b值
else a=c; //以c代替区间a值
}while(fabs(c*c+c*sin(c)-5)>=1e-5&&fabs(b-a)>=1e-5);
printf("%fn",c);
}
习 题 5
一、单项选择题
1.下列叙述中,正确的叙述项是( )。
A.定义函数时,必须要有形参
B.函数中可以没有return语句,也可以有多条return语句
C.函数f可以用f(f(x))形式调用,这种调用形式是递归调用
D.函数必须有返回值
2.下列叙述中,不正确的叙述项是( )。
A.函数调用时,形参变量只有在被调用时才被创建(分配存储单元)
B.函数调用时,实参可以是常量、变量或表达式
C.定义变量时,省略对变量的存储类别定义,则变量是自动型变量
D.语句return(a,b);则函数可以返回两个值
3.传值调用的特点是( )。
A.实参传给形参变量的数据是地址
B.在函数中形参变量值改变后,不改变实参变量的值
C.在函数中形参变量值改变后,实参变量的值随之也改变
D.实参必须是变量
4.如果在函数中定义一个变量,有关该变量作用域正确的是( )。
A.只在该函数中有效 B.在该文件中有效
C.在本程序中有效 D.为非法变量
5.根据下面函数print的定义,选出调用函数print(5378)的值是( )。
void print(long n)
27
{
if (n==0) return ;
else{
print(n/10);
printf("% d", n%10);
return ;
}
}
A.5 3 7 8 B.8 7 3 5
C.3 5 7 8 D.8 7 5 3
*6.根据下面函数f,选出f(f(3))的值是( )。
int f(int x)
{
static int k=0;
x=x+k;
k--;
return x;
}
A.5 B.3 C.2
解:(1)B (2)D (3)B (4)A (5)A
二、写出下列程序的输出结果
*1.
#include
int f1(int,int),f11(int);
void f2(int);
void main()
{
int i,j;
for(i=0;i<5;i++)
{ f2((5-i)*3);
for(j=0;j<=i;j++)
printf("%3d",f1(i,j));
putchar('n');
}
}
int f1(int m,int n)
{
return f11(m)/f11(n)/f11(m-n);
}
int f11(int k)
{
if(k<=1)
return 1;
return k*f11(k-1);
}
void f2(int n)
{
for(int i=1;i<=n;i++)
putchar(' ');
}
解: 1
1 1
1 2 1
28
D.4
(6)C
1 3 3 1
1 4 6 4 1
*2.
#include
int f(int m,int n)
{
if(m%n==0) return n;
else return f(n,m%n);
}
void main()
{
printf("%dn",f(840,48));
}
解:24
3.
#include
void fun(int a,int b,int c,int add,int mult)
{
add=a+b+c;
mult=a*b*c;
printf("add=%d mult=%dn",add,mult);
}
void main()
{
int x,y;
x=y=0;
fun(9,12,-4,x,y);
printf("add=%d mult=%dn",x,y);
}
解:add=17 mult=-432
add=0 mult=0
4.
#include
int add, mult;
void fun(int a,int b,int c,)
{
add=a+b+c;
mult=a*b*c;
printf("add=%d mult=%dn",add,mult);
}
void main()
{
fun(9,12,-4);
printf("add=%d mult=%dn", add, mult);
}
解:add=17 mult=-432
add=17 mult=-432
5.
#include
int a;
void main()
{
int i;
void fun();
29
for(i=1;i<=4;i++){
a++;
printf("In main: a=%4d",a);
fun();
}
}
void fun()
{
int a=0;
a++;
printf("In fun:a=%dn",a);
}
解:In main: a= 1In fun:a=1
In main: a= 2In fun:a=1
In main: a= 3In fun:a=1
In main: a= 4In fun:a=1
6.
#include
void main()
{
int x=2,i;
int f(int x);
for(i=0;i<3; i++)
printf("%4d",f(x));
}
int f(int x)
{
int y=0;
static z=0;
y++;
z++;
return(x+y+z);
}
解: 4 5 6
三、程序填空题
1.输入若干个正整数,判断每个数从高位到低位各位数字是否按值从小到大排列。其中input()返回输入的数据,且保证输入的数据是一个正整数。fun1()函数是判断正整数n是否按数字从小到大排列。
#include
int input();
int fun1(int m);
void main()
{
int n;
if(fun1(n)==1)
printf("%d中各位数字按是从小到大排列n",n);
}
int input()
30
{
int n;
printf("请输入n:n");
scanf("%d",&n);
if (n>0) ;
do{
printf("n必须正整数,请重新输入 n:n");
scanf("%d",&n);
}while(n<0);
return n;
}
int fun1( )
{
int k;
k=m%10;
while(m!=0)
if( m/10%10>k) return 0;
else {
k=m%10;
}
return 1;
}
解:n=input(); return n int m m=m/10
2.输入一个末尾数非0的正整数,输出它的逆序数。其中,input是数据输入函数,reverse是数据逆序函数。
#include
long input();
long reverse(long n);
void main()
{
int n;
n=input();
printf("逆序数是:%dn", );
}
long input()
{
long n;
printf("请输入n:n");
scanf("%d",&n);
if ( ) return n ;
do{
printf("n必须正整数,且末尾数非0,请重新输入 n:n");
}while(n<0||n%10==0);
return n;
}
long reverse(long n)
{
long k=0;
while(n){
n/=10;
}
31
return k;
}
解:reverse(n) n>0&&n%10!=0 scanf(“%d”,&n) k=k*10+n%10
五、编程题
1.输入一个x,输出下面分段函数f(x)的值。要求将分段函数的计算定义成函数。
1
f(x)01x0x0
x0解:#include
int f(double x) // 函数定义
{
int y=0;
if(x>0)
y=1;
else if(x==0)
y=0;
else
y=-1;
return y;
}
void main()
{
double x;
int y;
scanf(“%lf”,&x);
y=f(x); // 函数调用
printf("f(%g)=%dn",x,y);
}
2.输入一个正整数,输出该数的各个数字之和。要求编写函数,计算整数的各个数字之和。
解:#include
int sum(int a)
{
int s=0;
while(a!=0){
s+=a%10;
a=a/10;
}
return s;
}
void main()
{
int x;
scanf(“%d”,&x);
printf("%dn",sum(x));
}
3.编写函数,判断一个正整数a是否为完数,如果是完数,函数返回值为1;否则为0。(完数:一个数的所有因子之和等于该本身,如6、28都是完数;6=1+2+3;28=1+2+4+7+14。)
32
解:#include
int wanshu(int n)
{
int i,a=0;
for(i=1;i<=n/2;i++)
if(n%i==0)
a+=i;
if(a==n) return 1;
else return 0;
}
void main()
{
int n;
scanf(“%d”,&n);
if(wanshu(n)==1)
printf("%d是完数n",n);
else
printf("%d不是完数n",n);
}
4.输入三个数,输出它们的最小值。要求定义一个函数,返回两个数的最小值。
解:#include
double min(double x,double y)
{ if(x else return y;
}
void main()
{ double a,b,c,m;
printf("Input a b cn");
scanf(“%lf%lf%lf”,&a,&b,&c);
m=min(min(a,b),c);
printf(“最小数:%fn",m);
}
5.在主函数中输入字符c和m,调用函数prn,连续将字符c输出m次。定义函数prn,完成连续将某个字符c输出m次后换行。
解:#include
void prn(char,int); // 函数声明
void main()
{
char c;
int m;
printf(“Input c m:n”);
scanf(“%c%d”,&c,&m);
prn(c,m);
}
void prn(char c,int m)
{
int i;
for(i=1;i<=m;i++)
putchar(c);
printf(“n”);
33
}
6.输入一个年、月、日输出它是这年的第几天。要求定义函数,根据年月日计算是第几天的函数。
解:#include
int days(int year,int month,int date)
{ int d=date;
switch(month-1)
{ case 11: d+=30;
case 10: d+=31;
case 9: d+=30;
case 8: d+=31;
case 7: d+=31;
case 6: d+=30;
case 5: d+=31;
case 4: d+=30;
case 3: d+=31;
case 2:
if((year%4==0&&year%100!=0)||(year%400==0))
d+=29;
else d+=28;
case 1: d+=31;
}
return d;
}
void main()
{ int year,month,date;
int d;
printf(“请输入 年 月 日:n”);
scanf("%d%d%d",&year,&month,&date);
d=days(year,month,date);
printf("%d月%d日是%d年的第%d天!", month,date,year,d);
}
7.定义一个函数将正整数n转换成文字形式输出星期几(n值0~6分别转换成星期天,星期一,…,星期六)。
解:#include
void week(int n)
{ switch(n)
{ case 0: printf(“星期天”); break;
case 1: printf(“星期一”); break;
case 2: printf(“星期二”); break;
case 3: printf(“星期三”); break;
case 4: printf(“星期四”); break;
case 5: printf(“星期五”); break;
case 6: printf(“星期六”); break;
}
}
void main()
{ int num;
printf(“请输入一个整数0~6:n”);
scanf("%d",&num);
week(num);
}
7.输入一个整数n,计算3.2n的值。要求定义函数计算xn 值。
解:#include
34
double fact(double x,int n);
void main()
{
double x,y;
int n;
printf(“Input x n:n”);
scanf(“%lf%d”,&x,&n);
y=fact(x,n);
printf(“%fn”,y);
}
double fact(double x,int n)
{
int i;
double t=1;
for(i=1;i<=n;i++)
t=t*x;
return t;
}
8.输入平面上p1(x1,x2)、p2(x2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数计算平面上两点间的距离。
解:#include
#include
double f(double,double,double,double);
void main()
{
double x1,x2,y1,y2,d;
printf(“Input (x1,y1),(x2,y2):n”);
scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2);
d=f(x1,y1,x2,y2);
printf(“%fn”,d);
}
double f(double x1,double y1,double x2,double y2)
{
double d;
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return d;
}
9.在主函数中输出1!+2!+3!+…+10!的值。要求将计算阶乘的运算写成函数。
解:#include
int fact(int k)
{
int i,res=1;
for(i=1; i<=k; i++)
res=res*i;
return res ;
}
void main( )
{
int n,sum=0;
for(n=1;n<=10;n++)
35
sum+=fact(n);
printf(“1!+2!+3!+…+10!=%dn”,sum);
}
10.编写函数int digit(int n,int k),函数返回n中从右边开始的第k位数字的值。如:digit(231456,3)=4;digit(1456,5)=0。
解:#include
#include
int digit(int n,int k)
{ long s;
if (log10(n)+1 else s=n/(int)pow(10,k-1)%10;
return s;
}
void main()
{
int n,k;
printf("输入整数n和k:n");
scanf("%d%d",&n,&k);
printf("%d",digit(n,k));
}
*11.输入正整数a、b,输出a、b之间所有回文数。要求定义一个函数判断正整数n是否是回文数。回文数是指正整数n的逆序数与原数相等。如121、2332、55等都是回文数。
解:#include
int huiwen(int n)
{ int k=0,m=n;
while(m!=0) // 将n的逆序数放入k中
{ k=k*10+m%10;
m=m/10;
}
if(n==k) return 1; // n与k相同则n是回文数
else return 0;
}
void main()
{ int a,b,i;
printf("输入整数a和b:n");
scanf("%d%d",&a,&b);
printf(“%d、%d之间所有回文数:n”,a,b);
for(i=a;i<=b;i++)
if(huiwen(i)==1) printf("%dt",i);
printf(“n”);
}
-3-n-1-212.定义函数main(),输入正整数n,当精度e分别取值为10、10、10、……、10时,分别计算并输出下列算式的值,直到最后一项的绝对值小于精度e,以比较不同精度下算出的结果。要求调用函数cal(e)计算下列算式的值。
111s1.....2!3!4!
解:#include
#include
double jiecheng(int a)
{ double f;
36
if(a==1) f=1;
else f=a*jiecheng(a-1);
return f;
}
double cal(double e)
{ double s=0,t;
int i=1;
t=1/jiecheng(i);
while(t>=e)
{ t=1/jiecheng(i);
s=s+t;
i++;
}
return s;
}
void main()
{ int n,e;
double p;
printf("输入正整数n:n");
scanf("%d",&n);
for(e=10;e<=pow(10,n);e=e*10)
{ p=cal(1.0/e);
printf("%fn",p);
}
}
*13.年份信息查询程序,输入年份,查询相应的信息。采用菜单选择功能,输入1或2其功能分别是:闰年信息查询、元旦是星期几信息查询,输入3程序结束。
要求根据结构化程序设计方法,把问题分解成四个子问题(1)输入年份,判断输入数据的合法性。(2)判断是否闰年。(3)计算元旦是星期几。(4)输出文字形式的星期几。然后再把这些子问题组合起来,完成整个大问题的求解 (仿照书上例6.7) 。
其中元旦是星期几的计算公式:
w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7; w值0~6,分别表示星期天、星期1,…星期六。
解:#include
int legal(int y);
void leapyear(int y);
int judgeweeknumber(int y);
void judgeweekchinese(int y);
void main()
{
int number,week,year;
printf(“功能菜单:”);
printf(“1.闰年信息查询 2.元旦是星期几信息查 3. 程序结束n”);
printf(“请输入年份:n”);
scanf(“%d”,&year);
printf(“请选择功能:n”);
scanf(“%d”,&number);
if(number==1)
{ year=legal(year);
leapyear(year);
}
if(number==2)
{ week=judgeweeknumber(year);
37
judgeweekchinese(week);
}
if(number==3)
return;
}
int legal(int y)
{ if(y<0)
do {
printf(“请重新输入一个年份:”);
scanf(“%d”,&y);
} while(y<0);
return y;
}
void leapyear(int y)
{
if(y%4==0&&y%100!=0||y%400==0)
printf(“%d是闰年n”,y);
else
printf(“%d不是闰年n”,y);
}
int judgeweeknumber(int y)
{ int week;
week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;
return week;
}
void judgeweekchinese(int week)
{ switch(week)
{ case 0: printf(“星期天”); break;
case 1: printf(“星期一”); break;
case 2: printf(“星期二”); break;
case 3: printf(“星期三”); break;
case 4: printf(“星期四”); break;
case 5: printf(“星期五”); break;
case 6: printf(“星期六”); break;
}
}
*14.输入n、x,计算xn 输出。要求定义一个递归函数计算xn 。
解:#include
double mypow(double x,int n)
{
double y=1;
if (n>0)
return(x*mypow(x,n-1));
else
if (n<0) return(1/x*mypow(x,n+1));
else return 1;
}
void main()
{ double x;
int n;
printf(“请输入x n:n”);
scanf("%lf%d",&x,&n);
printf("%fn",mypow(x,n));
}
*15.数列的第1、2项为1,此后各项为前两项之和。编制求数列中任何一项值的递归38
函数。
解:此数列为1、1、2、3、5、8、13 ……。
#include
int f(int n)
{ if (n==1||n==2)
return (1);
else
return (f(n-1)+f(n-2));
}
void main()
{ int n;
while(scanf("%d",&n),n<0);
printf("数列第%d项为:%d",n,f(n));
}
习 题 5
一、单项选择题
1.下列能正确定义一维数组a的语句是( )。
A.int a(10); B.int n=10,a[n];
C.int n;scanf("%d",&n); D.#define n 10
int a[n]; int a[n];
2.若有定义语句“int a[10];”则下列对a中数组元素正确引用的是( )。
A.a[10/2–5] B.a[10] C.a[4.5] D.a(1)
3.能对一维数组正确初始化的语句是( )。
A.int a[6]={6*1}; B.int a[6]={1,,,3};
C.int a[6]={}; D.int a[6]=(0,0,0);
4.以下能正确定义二维数组的语句为( )。
A.int a[][]; B.int a[][4]; C.int a[3][]; D.int a[3][4];
5.若有数组定义语句“int a[4][5];”,则对a中数组元素的正确引用是( )。
A.a[4][1] B.a[2,1] C.a[4][5] D.a[4–1][5–5]
6.以下能对二维数组a进行正确初始化的语句为( )。
A.int a[2][]={{1},{4,5}}; B.int a[2][3]={1,2,3,4,5,6,7};
C.int a[][]={1,2,3,4,5,6}; D.int a[][3]={1,2,3,4,5};
7.下列对字符数组s的初始化不正确的是( )。
A.char s[5]="abc"; B.char s[5]={'a','b','c','d','e'};
C.char s[5]="abcde"; D.char s[]="abcde";
8. 下列程序段的运行结果为( )。
char s[]="ab0cd"; printf("%s",s);
A.ab0 B.ab C.Abcd
9.下列数组s中所存放字符串的长度为( )。
char s[]="a128btcdxdgn";
D.ab cd
A.9 B.10 C.11 D.18
10.有数组定义语句“char a[20];”,则正确的输入语句为( )。
A.scanf("%s",&a); B.scanf("%s",a[]);
C.gets(a[20]); D.gets(a);
11.下面程序执行后的正确输出项是( )。
39
#include
void swap1(int a[ ])
{ int t;
t=a[0]; a[0]=a[1]; a[1]=t;
}
void swap2(int a,int b)
{ int t;
t=a; a=b; b=t;
}
void main()
{ int x[2]={1,5};
int y[2]={1,5};
swap1(x);
swap2(y[0],y[1]);
printf("x: %d %dn", x[0],x[1]);
printf("y: %d %dn", y[0],y[1]);
}
A. x:5 1 B. x:1 5
y:1 5 y:5 1
12.执行下列程序后的输出结果是( )。
#include
char f(char s[],int n)
{ return (s[n]); }
main()
{ char a[]="ABCD";
printf("%c",f(a,2)+1);
}
C. x:1 5
y:1 5
D. x:5 1
y:5 1
A.D B.C
13.执行下列程序后的输出结果是( )。
#include
int f(int a[],int n)
{ if(n==0) return a[0];
else return f(a,n-1)+a[n];
}
main()
{ int x[]={1,3,5,7,9};
printf("%dn",f(x,3));
}
C.B D.A
A.1 B.4 C.9 D.16
解:1.D 2.A 3.A 4.D 5.D 6.D 7.C 8.B 9.C 10.D 11.A 12.A 13.D
二、填空题
1.构成数组的各个元素必须具有相同的 。
解:数据类型
40
2.若有定义“int a[10]={1,2};”,则数组元素a[2]的值为 。
解:0
3.若有定义“int a[3][4];”,则数组a行下标的上限为 ,列下标的下限为 。
解:2 0
4.C语言程序在执行过程中,不检查数组下标是否 。
解:越界
5.C语言中,二维数组元素在内存中的存放顺序是 。
解:按行存放
6.若有定义“int a[3][4];”,则在数组元素a[2][2]前有 个元素。
解:10
7.若用数组名作为函数调用的实参,传递给形参的是 。
解:数组第一个元素的地址
8.若有定义语句“char s1[ ]="abc",s2[ ]={'a','b','c'};”,则数组s1有 个元素,数组s2有 个元素。
解:4 3
三、写出下列程序的输出结果
1.#include
void main()
{
int a[6]={2,3,7,1,9,6},i,j,k,m;
for(i=5;i>=0;i--){
k=a[5];
for(j=4;j>=0;j--)
a[j+1]=a[j];
a[0]=k;
for(m=0;m<6;m++)
printf("%2d",a[m]);
putchar('n');
}
}
解:6 2 3 7 1 9
9 6 2 3 7 1
1 9 6 2 3 7
7 1 9 6 2 3
3 7 1 9 6 2
2 3 7 1 9 6
2.#include
void main()
{
int n[3],i,j,k;
for(i=0;i<3;i++)
n[i]=0;
41
k=3;
for(i=0;ifor(j=0;jn[j]+=n[i]+1;
for(i=0;i<3;i++)
printf("%5d",n[i]);
}
解: 13 14 17
3.#include
void main()
{
int a[6][6],i,j;
for(i=1;i<6;i++)
for(j=1;j<6;j++)
a[i][j]=(i/j)*(j/i);
for(i=1;i<6;i++){
for(j=1;j<6;j++)
printf("%3d",a[i][j]);
printf("n");
}
}
解:1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
4.#include
void main()
{
int x[10];
int i,m=1;
void sort(int a[],int n);
for(i=0;i<10;i++){
m=-m;
x[i]=m*i;
}
sort(x,10);
for(i=0;i<10;i++) printf("%3d",x[i]);
}
void sort(int a[],int n)
{
int i,j,t;
42
for(i=1;i<10;i++){
t=a[i];
for(j=i-1; j>=0; j--)
if(t>a[j]) break;
else a[j+1]=a[j];
a[j+1]=t;
}
}
解: -8 -6 -4 -2 0 1 3 5 7 9
5.#include
void main()
{
char s1[]="aex",s2[]="dpsy",s[10];
int i1,i2,i,flag;
i1=i2=i=flag=0;
while(1){
if(s1[i1]=='0'){
flag=1;
break;
}
if(s2[i2]=='0'){
flag=2;
break;
}
if(s1[i1]s[i++]=s1[i1++];
else
s[i++]=s2[i2++];
}
if(flag==1)
while(s2[i2]!='0')
s[i++]=s2[i2++];
else
while(s1[i1]!='0')
s[i++]=s1[i1++];
s[i]='0';
puts(s);
}
解:adepsxy
6.
#include
void main()
{
char h[11];
int d[10];
43
int i,n=0,x=1;
gets(h); //输入FF
for(i=0;h[i]!='0';i++)
if(h[i]>='0'&&h[i]<='9')
d[i]=h[i]-'0';
else if(h[i]>='a'&&h[i]<='f')
d[i]=h[i]-'a'+10;
else if(h[i]>='A'&&h[i]<='F')
d[i]=h[i]-'A'+10;
for(i--;i>=0;i--){
n+=d[i]*x;
x=x*16;
}
printf("%sH=%dDn",h,n);
}
解:FFH=255D
四、程序填空题
1.假设数组a中的数按从小到大的顺序存放,以下程序把a数组中相同的数删得只剩一个,然后以每行5个数的形式输出a数组中的数。
#include
#define N 20
void main()
{
int a[N],i,j,n;
for(i=0;iscanf("%d",&a[i]);
n=i=N-1;
while( ){
if(a[i]==a[i-1]) {
for(j= ;j<=n;j++)
a[ ]=a[j];
n= ;
}
i= ;
}
for(i=0;i<=n;i++){
if( )printf("n");
printf("%3d",a[i]);
}
}
解:① i>0 ② i ③ j-1 ④ n-1 ⑤ i-1 ⑥ i%5==0
2.输入一个6行、6列的数组,将每一行的所有元素都除以该行的主对角线元素,然后以行列对齐格式输出该数组。
#include
void main()
44
{
int a[6][6],t,i,j;
for(i=0; i<6;i++)
for(j=0;j<6;j++)
;
for(i=0; i<6;i++){
t= ;
for(j=0;j<6;j++)
a[i][j]= ;
}
for(i=0; i<6;i++){
for(j=0;j<6;j++)
printf("%3d",a[i][j]);
;
}
}
解:① scanf(“%d”,&a[i][j]) ② a[i][i] ③ a[i][j]/t
④printf(“n”)或putchar(‘n’)
3.以下程序的功能是将字符串a中下标值为偶数的元素由小到大排序,其他元素不变。
#include
#include
void main()
{
char a[81],t;
int i,j,n;
gets(a);
for(n=0; ; n++);
for(i=0; ;i+=2)
for(j=i+2;j if( ){
t=a[i];
;
a[j]=t;
}
puts(a);
}
解:① a[n]!= ‘0’ ② ia[j] ⑤ a[i]=a[j]
4.输入一个整数,输出它的二进制序列。
#include
void main()
{
int a[32],x,i,m;
int change(int x,int a[]);
scanf("%d",&x);
m=change(x,a);
for(i=0;i printf("%d",a[i]);
45
}
int change( )
{
int n=0,t,k;
do { a[n]=x%2;
;
n++;
}while(x!=0);
for(k=0;k t=a[k];
;
a[n-k-1]=t;
}
return n;
}
解:① int x,int a[] ② x=x/2 ③ a[k]=a[n-k-1]
5.程序能够按以下形式输出一个杨辉三角形,请对函数yahuei在下划线处将程序补充完整。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include
#define N 6
yahuei(int a[ ][N])
{
int i, j;
a[0][0]=1;
for(i=0; i a[i][0]=1;
a[i][i]=1;
}
for( ; i for(j=1; ; j++)
a[i][j]= a[i-1][j-1]+ ;
}
void main()
{
int x[N][N],i,j;
yahuei( );
for( i=0 ; i for(j=0; j<=i ; j++)
printf(" %d ", x[i][j]);
printf("n");
}
}
解:① i=2 ② j
6. 统计在一个字符串中各元音字母(a、e、i、o、u)出现的次数。
#include
46
void main()
{
char s[80];
int i, ;
printf("input a string:n");
gets(s);
for(i=0; ;i++)
if( )
a[0]++;
else if(s[i]=='e'||s[i]=='E')
a[1]++;
else if(s[i]=='i'||s[i]=='I')
a[2]++;
else if(s[i]=='o'||s[i]=='O')
a[3]++;
else if(s[i]=='u'||s[i]=='U')
a[4]++;
printf(" A E I O Un");
for(i=0;i<5;i++)
}
解:① a[5] ②s[i]!= '0' ③s[i]== 'a'|| s[i]== 'A' ④ printf(“%5d”,i)
五、编程题
1.在数组x的10个数中求平均值v,找出与v相差最小的数组元素。
解:#include
#include
void main()
{ double x[10],v,d;
int i;
for(i=0,v=0;i<10;i++)
{ scanf("%lf",&x[i]);
v+=x[i]; }
v=v/10;
d=x[0];
for(i=1;i<10;i++)
if(fabs(d-v)>fabs(x[i]-v))
d=x[i];
printf("平均值:%-8.2f,与平均值最近元素:%-8.2fn",v,d);
}
2.输入n(n≤20)个数放在一维数组中,找出其中最小的数,将它与数组最前面的元素交换后输出这些数。
解:#include
void main()
47
{ int i,k,temp,n,a[20];
printf("Input n:n");
scanf("%d",&n);
for(i=0;i scanf("%d",&a[i]);
for(k=0,i=1;i if(a[i] temp=a[0];a[0]=a[k];a[k]=temp;
for(i=0;i}
3.输入一个字符串,统计其中数字字符出现的次数。
解:#include
void main()
{ char s[80];
int i,n=0;
gets(s);
for(i=0;s[i]!='0';i++)
if(s[i]>='0'&&s[i]<='9')
n++;
printf("%s中包含%d个字符n",s,n);
}
4.设有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。问在第20年时,共有多少头牛?分别输出从第1年至第20年每年的母牛数。
解:#include
#define N 20
void main()
{ int x[N+1]={1},i; // x[0]存放初始母牛头数,即1头母牛
// x[i]存放第i年的母牛头数,其中1≤i≤20
for(i=1;i { if(i<4) x[i]=x[i-1]+1; // 头3年,每年只增加1头母牛
else x[i]=x[i-1]+x[i-3]; // 从第4年开始
// 每年的母牛数=去年的头数+今年新生的
// 说明:3年前母牛的数量即为今年新生的小牛数
printf("第%d年,有%d头母牛n",i,x[i]);
}
}
5.有n(n≤20)个数,已按从小到大顺序排列好,要求输入一个数,把它插到数列中,使数列仍有序,并输出新的数列。
解:#include
void main()
{ int i,n,a[21],x;
48
发表评论