z+=1 ; } 因此答案是B。
4(答案:B。这里考察的是if语句的嵌套。根据else子句总是与之前最近的if语句配对。
5(答案:B。由于B项:if(x=y) &&(x!=0) x+=y ; if 后的条件表达式没有用圆括号括起来。正确的是 :if((x=y) &&(x!=0)) x+=y ; 二、根据要求完成程序填空
1、 z > y z > x y > x 2、 ch >= „A? && ch<=?Z? ch=ch-32
3、 x < 0 x / 10 y!=2 三、编程题
1、 编写一个程序,要求用户从终端键入两个整数数值。检测这两个数,判定第一个数是否能被第二数整除,并在终端上显示相应的信息。 解:程序如下
7
#include “stdio.h”
main( )
{
int a , b ; /* a为第一个数 , b为第二个数 */
printf(“Please input two numbers: n”) ;
scanf(“%d%d” , &a ,&b) ;
if( a%b = = 0 )
printf(“%d能被%d整除。n” , a , b) ;
else
printf(“%d不能被%d整除。n” , a , b) ;
}
2、 有3个整数a , b , c , 由键盘输入,输出其中最大的数。
解:程序如下
#include “stdio.h”
main( )
{
int a , b , c , max ;
printf(“ Please input three numbers : n”) ;
scanf(“%d%d%d” , &a ,&b , &c) ;
if(a>b) max = a ;
else max = b ;
if(max < c ) max = c ;
printf( “The max is %d n”, max ) ;
8
}
3、 给出一百分制成绩,要求输出成绩等级A、B、C、D、E。其中90分以上为A,80~89分为B,70~79为C,60~69为D,60分以下为E。 解:程序如下
#include “stdio.h”
main( )
{
float score ;
int grade ;
printf(“Please input a score :n”);
scanf(“%f “ ,&score) ;
grade=(int ) score /10 ;
switch(grade)
{ case 10:
case 9: printf(“grade is An”) ; break ;
case 8: printf(“grade is Bn”) ; break ;
case 7: printf(“grade is Cn”) ; break ;
case 6: printf(“grade is Dn”) ; break ;
default: printf(“grade is En”) ;
}
}
4、新世纪百货进行打折促销活动,消费金额(P)越高,折扣(d)越大,标准如下:
9
消费金额 折扣
P < 100 0,
100 ? P < 200 5,
200 ? P < 500 10,
500 ? P < 1000 15,
P ? 1000 20,
编程实现从键盘输入消费金额,输出折扣率和实付金额(f)。要求分别用 if语句和switch语句实现。
解:(1) 用if语句编程实现如下
#include “stdio.h”
main( )
{
float P , d , f;
printf(“输入消费金额:n”);
scanf(“%f”,&P);
if( P<100 ) d=0 ;
if( P,=100 && P<200 ) d=0.05 ;
if( P,=200 && P<500 ) d=0.10 ;
if( P,=500 && P<1000) d=0.15 ;
if( P,=1000 ) d=0.20 ;
f = P * (1-d) ;
printf(“折扣是%f,则实付金额为%fn”,d ,f) ;
}
10
(2) 用switch语句编程实现如下
#include “stdio.h”
main( )
{
float P , d , f ;
int c ;
printf(“输入消费金额:n”);
scanf(“%f”,&P);
c = (int)P/100 ;
switch( c )
{ case 0 : d = 0 ; break ;
case 1 : d = 0.05 ; break ;
case 2 :
case 3 :
case 4 : d = 0.10 ; break ;
case 5 :
case 6 :
case 7 :
case 8 :
case 9 : d = 0.15 ; break ;
default : d = 0.20 ;
}
f = P * (1-d) ;
11
printf(“折扣是%f,则实付金额为%fn”,d ,f) ;
}
第4章 循环结构程序设计 一、单项选择
1、 A 2、 D 3、 C 4、 D 5、 B
6、 D 7、 B 8、 B
二、按要求完成程序填空
1、 c != ?n? c,=?0? && c <=?9?
2、 i%3= =2 && i%5= =3 && i%7= =2 j%5= =0
3、 i < 10 j%3 != 0
三、编程题
1、编程求n的阶乘(n由键盘输入)。
解:程序如下
#include “stdio.h”
main( )
{
int n , i ;
long fac ;
fac = 1 ;
printf(“ Input a number: ”) ;
scanf(“%d” , &n) ;
i = 1 ;
while( i <= n )
12
{ fac = fac * i ;
i++ ;
}
printf(“ %d! is %ld n” , n , fac) ;
}
2、计算1~+2~+3~+„+10~的值。
解:方法一
#include “stdio.h”
main( )
{
int i=1 , j;
double fac ,sum=0 ;
while( i <=10 )
{ j=1 ;
fac=1;
while( j<=i )
{ fac = fac * j ;
j++ ;
}
sum = sum + fac ;
i++ ;
}
printf(“1~+2~+3~+„+10~=%.0fn”,sum);
13
}
方法二:
#include “stdio.h”
main( )
{
int i , j ;
double fac , sum=0 ;
for(i=1;i<=10 ; i++)
{
for(j=1,fac=1; j<=i ;j++)
fac = fac * j ;
sum = sum + fac ;
}
printf(“1~+2~+3~+„+10~=%.0fn”,sum);
}
方法三:
#include “stdio.h”
main( )
{
int i ;
double fac , sum ;
sum=0 ;
fac=1 ;
14
for( i=1 ; i<10 ; i++ )
{
fac = fac * i ;
sum = sum + fac ;
}
printf(“1~+2~+3~+„+10~=%.0fn”,sum);
}
3、求Sn = a + aa + aaa + „ + aaa„a(n个a)的值 ,其中a是一个数字。例如:3+33+333+3333(此时n=4),n由键盘输入。
解:程序如下
#include “stdio.h”
main( )
{
int a , n , i ;
long Sn , t ;
Sn = 0 ;
printf(“Please input a:n”);
scanf(“%d”,&a);
printf(“Please input n:n”);
scanf(“%d”,&n) ;
t=a ;
for(i=1;i<= n ;i++)
{ Sn = Sn +t ;
15
t= t*10 +a;
}
printf(“Sn=%ldn”,Sn);
}
4、打印出所有的“水花仙数”,所谓“水花仙数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个水花仙数。 解:程序如下
#include “stdio.h”
main( )
{
int t , a , b , c , n ; /*变量n为统计水花仙数的个数*/
n=0 ;
for(t=100 ; t<1000 ; t++)
{ a = t /100 ;
b = ( t – a*100)/10 ;
c = t%10 ;
if( a*a*a + b*b*b +c*c*c = = t )
{ n++ ;
if( n%6 = = 0 )
printf(“n”) ;
printf(“%5d” , t ) ;
}
}
16
}
6、每个苹果0.8元 ,第一天买2个苹果,第二天开始,每天买前一个的2倍,直至购买的苹果个数达到不超过100的最大值。编写程序求每天平均花多少钱,
解: 程序如下
#include “stdio.h”
main( )
{
int day , num , sum ;
float money , every ;
sum = 0 ;
num = 2;
for(day=1 ; num<100 ; )
{ sum = sum + num ;
day++ ;
num = num *2 ;
}
money = sum * 0.8 ;
every = money/day ;
printf(“ every = %f n” , every ) ;
}
7、变成完成用一元人民币换成一分、二分、五分的所有兑换方案,即输出所有满足搭配要求的1分币个数,2分币个数,5分币个数。
17
解:程序如下:
#include “stdio.h”
main( )
{
int one ,two , five ;
for(one=0 ; one<=100 ; one++)
for(two=0 ; two<=50 ; two++)
for(five=0 ; five<=20 ; five++)
if( one + two*2 + five *5 = =100)
printf(“one=%d , two=%d , five=%dn”,one , two , five);
}
第5章 模块化程序设计---函数
一、单选题
1、 B 2、 B 3、 A 4、 A 5、 D
6、 D 7、 B 8、 B 9、 B 10、A
二、编程题
1、已知三角形的三边长,编一实现求三角形面积的功能函数。说明:
用海伦公式来求面积,但要注意输入的三边长要符合构成三角形的条
件。海伦公式为:
S= (其中:s=(a+b+c)/2) s.(s,a).(s,b).(s,c)Δ
解:程序如下
#include “stdio.h”
#include “math.h”
18
float Area( int a , int b , int c)
{
float s , area ;
s = (float)( a+ b+ c)/2 ; if( (a+b>c)&&(a-b)area=sqrt(s*(s-a)*(s-b)*(s-c)); else
area=0;
return area ;
}
main( )
{
int a , b , c ;
float area ;
float Area(int , int , int );
printf(“请输入三角形的三边长n”);
scanf(“%d%d%d”, &a , &b, &c);
area = Area( a , b , c) ;
if(area!=0)
printf(“ area=%fn”, area);
eles
printf( “ error!n ”) ;
19
}
2、写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
解:程序如下
#include “stdio.h”
int prime( int n ) {
int t , a=1 ;
for(t =2 ; t <= n/2 ; t++)
if( n%t = =0)
{
a= 0 ; break ;
}
return a ;
}
main( )
{
int n ;
printf(“ input a number:n”) ;
scanf(“%d”, &n ) ;
if(prime(n)==1)
printf(“ %d is primen” , n );
eles
printf(“%d is not primen” , n) ;
20
}
3、编写函数,求1~+2~+3~+ „ +K!的和。 解:程序如下
#include “stdio.h”
double SUM( int k)
{ int i , j ;
double fac , sum ;
sum=0 ;
for( i=1 ; i <=k ; i++)
{
for(j=1 , fac=1 ; j<=i ; j++)
fac=fac*j ;
sum = sum +fac ;
}
return sum ;
}
main( )
{ int k ;
double sum ;
scanf(“%d” ,&k);
sum=SUM(k) ;
printf(“1~+2~+3~+ „ +K!=%.0fn”,sum); }
21
224、求方程ax+bx+c=0的根,用2个函数分别求当b-4ac大于0和等于0的根并输出结果,从主函数中输入a、b、c的值。
#include “stdio.h”
#include “math.h”
void f1(float a , float b , float c) {
float t1 ,t2 ;
t1=(-b + sqrt(b*b-4*a*c))/(2*a);
t2=(-b - sqrt(b*b-4*a*c))/(2*a);
printf(“t1=%f , t2=%fn”, t1,t2) ;
}
void f2(float a , float b , float c) {
float t1 ;
t2=-b /(2*a);
printf(“t1=%fn”,t1);
}
main( )
{
float a , b ,c;
printf(“input a , b , cn”);
scanf(“%f%f%f”,&a ,&b,&c);
if(b*b – 4*a*c>0)
22
f1(a,b,c);
eles if(b*b-4*a*c ==0)
f2(a,b,c);
else
printf(“ no jie !n”);
}
第6章 数组
一、单项选择题
1、C 2、D 3、D 4、C 5、C 6、D 7、B 8、C 9、D 10、B 11、B 12、B(原题数组改为a[][3]) 13、D 14、B 15、 D 16、B 17、D 18、D 19、B 20、 D
二、按要求完成程序的空缺
1( 下面程序以每行4个数据的形式输出a数组,请填空。
&a[I] i%4 = =0 printf(“n”) ;
2( 下面程序将二维数组a的行和列元素互换后存到另一个二维数组b中,请
填空。
j<=2 b[j][i] = a[i][j] i<=2
三、读程序段分析程序运行结果
1( 下面程序运行结果是 600 。 2。下面程序运行结果是 he 。 3( 下面程序的运行结果是 The result is:
1
6 7
23
11 12 13
16 17 18 19
21 21 23 24 25 四、编程题
1、从键盘输入若干整数(个数应少于50),其值在0到4的范围内,用-1作为输入结束的标志。统计每个整数的个数。试编程序完成。 解:程序如下
#include “stdio.h”
main( )
{
int h[50], a , b , c, d , e , n , t , i ;
a=b=c=d=e=0 ;
n=0 ;
scanf(“%d”,&t);
while( t!=-1 )
{ h[n++]= t ;
scanf(“%d”,&t) ;
}
for(i=0 ; iswitch( h[i])
{ case 0 : a++ ; break ;
case 1 : b++ ; break ;
case 2 : c++ ; break ;
24
case 3 : d++ ; break ;
case 4 : e++ ;
}
printf(“ 0 : %d , 1: %d , 2: %d , 3: %d , 4: %dn”, a , b ,c ,d ,
e);
}
、将一个数组中的值按逆序重新存放。例如,原来顺序为 8,6,5,4,2。要2
求改为2,4,5,6,8。
解:程序如下
#include “stdio.h”
main( )
{
int a[50] , i , n , temp, t ;
n=0 ;
scanf(“%d” , &t) ;
while( t!=-1 )
{ a[n++]= t ;
scanf(“%d” ,&t) ;
}
for(i=0 ; i< n/2 ; i++)
temp=a[i] , a[i]= a[n-1-i] , a[n-1-i]= temp ;
for(i=0 ;i< n ; i++)
printf( “ %5d”, a[i]) ;
}
25
3、 已有一个排好序的数组,有键盘输入一个数,要求按原来的排序规律将其
插入到数组中。
解:程序如下
#include “stdio.h”
main( )
{
int a[50] , n , t , i ;
n=0 ;
scanf(“%d”,&t);
while( t!=-1)
{ a[n++] = t ;
scanf(“%d” , &t) ;
}
printf(“ input a number :n” ) ;
scanf(“ %d” , &t) ;
for(i=n-1 ; a[i]> t ; i--)
a[i+1]=a[i] ;
a[i+1]=t ;
for(i=0 ;i< n+1 ; i++)
printf(“%5d”,a[i]);
}
4、写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
解:程序如下
26
#include “stdio.h”
#include “string.h”
void fanxu( char a[ ] , int n )
{ int i;
char temp ;
for(i=0 ; itemp=a[i] , a[i]=a[n-1-i] , a[n-1-i]= temp ;
}
main( )
{
char a[50] , n ;
printf(“ input string :n”);
gets( a ) ;
n= strlen( a) ;
fanxu( a , n) ;
printf( “ output string:n”) ;
puts( a) ;
}
5、编一程序,将两个字符串连接起来,不要用strcat 函数。#include “stdio.h”
#include “string.h”
void lianjie( char a[50] , char b[30])
27
{
int n1 , n2 , i ;
n1= strlen(a) ;
解:程序如下
n2 =strlen(b);
for(i= n1 ; i<=n1+n2 ; i++)
a[i]=b[i-n1] ;
}
main( )
{
char a[50] , b[30] ;
printf(“input string a:n”) ;
gets(a) ;
printf(“input string b:n”) ;
gets(b) ;
lianjie(a , b) ;
printf(“output string:n”) ;
puts(a) ;
}
6、写一程序,使给定的一个二维数组(3×2)转置,即行列互换。解:程序如下
#include “stdio.h”
main( )
{
28
int a[3][2] , b[2][3] , i , j ;
printf(“ input array a :n”) ;
for(i=0 ; i<3 ; i++) for(j=0 ; j<2 ; j++) scanf(“%d” , &a[i][j]) ;
for(i=0 ; i<2 ; i++) for(j=0 ; j<3 ; j++) b[i][j]= a[j][i] ;
printf(“input array a:n”) ;
for(i=0 ; i<3 ; i++) { for(j=0 ; j<2 ; j++)
printf(“%5d” , a[i][j]) ;
printf(“n”) ;
}
printf(“ output array b :n”) ;
for(i=0 ; i<2 ; i++) { for(j=0 ; j<3 ; j++)
printf(“%5d” , b[i][j]) ;
printf(“n”) ;
}
}
第7章 指针
一、单选题
29
1、B 2、B 3、B 4、D 5、B 6、D 7、C 8、 C 9、 B 10、B 11、C 12、B
13、 D 14 、B 15、 D 16、D
二、分析程序或程序段,写出运行结果
1(运行结果是 C51 。 2(运行结果是 dl 。 3(运行结果是 aabcabc 。 4(运行结果是 *ptr1=7,*ptr2=5
a=7,b=5 5. 运行结果是 hELLO! 。 6. 运行结果是 bcdABCD 三、编程题
7.1、输入3个整数,按由小到大的顺序输出。(书中没该题) 解:程序如下
#include “stdio.h”
main( )
{
int a , b , c , *pa , *pb,*pc , temp ;
pa=&a ; pb=&b ; pc=&c ;
b、 c:n”) ; printf(“input a、
scanf(“%d%d%d” , &a,&b,&c) ;
if(*pa>*pb)
temp=*pa, *pa=*pb , *pb=temp ;
if(*pa>*pc)
temp=*pa, *pa=*pc , *pc=temp ;
30
if(*pb>*pc)
temp=*pb, *pb=*pc , *pc=temp ;
printf(“从小到大的顺序是:n”) ;
printf(“%d , %d , %dn” , a , b , c ) ;
}
7.2、输入3个字符串,按由小到大的顺序输出。(书中没该题) 解:程序如下
#include “stdio.h”
#include “string.h”
main( )
{
char a[50] , b[50] , c[50] , *pa ,*pb , *pc , *ch ;
pa = a ; pb = b ; pc = c ;
gets(pa) ; gets(pb) ; gets(pc ) ;
if(strcmp(pa , pb ) >0 )
ch=pa , pa = pb , pb = ch ;
if(strcmp(pa , pc ) >0 )
ch=pa , pa = pc , pc = ch ;
if(strcmp(pb , pc ) >0)
ch=pb , pb = pc , pc = ch ;
puts(pa) ; puts(pb ) ; puts(pc) ;
}
2、输入10个整数,将其中最小的数与第一个对换,把最大的数与最后一个数
31
对换。写出3个函数:? 输入10个整数;?进行处理;?输出10个数。 解:程序如下
#include “stdio.h”
void input( int *a)
{
int n ;
for(n=0 ; n<10 ; n++)
scanf(“%d” , a+n) ;
}
void process( int *a)
{
int min , temp , max , n1 , n2 , i ;
min=max=*a ; n1=n2=0 ;
for(i=1 ; i<10 ; i++)
{ if( *(a+i) < min )
{min=*(a+i) ; n1= i ; }
if( *(a+i) > max )
{max=*(a+i) ; n2= i ; }
}
temp=a[0] , a[0] = a[n1] , a[n1] = temp ;
temp=a[9] , a[9] = a[n2] , a[n2]= temp ;
}
void output( int *a)
32
{
int n ;
for(n=0 ; n<10 ; n++)
printf(“%5d” , *(a+n));
}
main( )
{
int a[10] , *pa ;
pa=a ;
input(pa) ;
process(pa) ;
output( pa ) ;
}
7.6 写一函数,将一个3×3的矩阵转值。(书中没该题) 解:程序如下
#include “stdio.h”
void zhuanzhi( int *a)
{ int i , j , temp ;
for(i=0 ; i<3; i++)
for(j=0 ; j<=i; j++)
temp=*(a+i*3+j) , *(a+i*3 +j) = *(a +j*3 +i) , *(a +j*3 +i)=temp ;
}
33
main( )
{
int a[3][3] , *pa ,i ,j;
pa=a ;
for(i=0 ; i<3 ; i++)
for(j=0 ; j<3 ; j++)
scanf(“%d”,pa+i*3+j) ;
zhuanzhi(pa) ;
printf(“output array a:n”);
for(i=0 ; i<3 ; i++)
{ for(j=0 ; j<3 ; j++)
printf(“%5d” , *(pa+i*3+j));
printf(“n”) ;
}
}
5、输入一行文字,找出其中大写字母、小写字母、空格、数字、以及其它字符
各有多少,
解:程序如下
#include “stdio.h”
#include “string.h”
main( )
{ char ch[50] , *p , n , a , b , c , d , e ,i;
a=b=c=d=e=0 ;
34
p = ch ;
printf(“input string:n”) ;
gets(p) ;
n=strlen(p) ;
for( i=0 ;iA’&& *(p+i)<=‘Z’) { if( *(p+i)>=‘
a++ ;
else if(*(p+i) >=‘a’&& *(p+i)<=‘z’)
b++ ;
else if(*(p+i)==‘ ’)
c++ ;
else if(*(p+i)>=‘0’&& *(p+i)<=‘9’)
d++ ;
else e++ ;
}
printf(“大写字母:%d , 小写字母:%d ,空格:%d , 数字:%d,其他
字符:%dn”,a , b, c, d ,e);
}
第8章 结构体与共用体
一、 单选题
1、A 2、C 3、A 4、D 5、D 6、D 7、D 8、C 9、C 10、B 11、B
35
二、判断分析题(对的打“?”;错的打“×”并分析原因)
1(× 分析:因为结构体中是可包含多种不同数据类型的变量一种构造 类型。
2(?
3(× 分析:因为face是char类型的指针,所以语句
printf(“%sn”,*cPtr->face) ;是错误的。改为printf(“%cn”,*cPtr->face) ;
4(× 分析:共用体变量的各个成员共享同一块内存区域,这里所谓的 共享不是指把多个成员同时装入一个共用体变量内,而是指该共用体变量可被 赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
5(?
三、编程题
1、 定义一个结构体变量,其成员包括:职工号、职工名、性别、年龄、工
资、地址。
程序如下:
struct employee
{ int code ;
char name[20] ;
char sex ;
int age ;
float money ;
char address[30] ;
} emp ;
2、 针对上述定义,从键盘输入所需的具体数据,然后用printf函数打印出来。
36
程序如下:
struct employee
{ int code ;
char name[20] ;
char sex ;
int age ;
float money ;
char address[30] ;
} emp ;
main( )
{ scanf(“%d ,%s , %c”, , , ) ;
scanf(“%d ,%f , %s ”, , , s) ;
printf(“输出职员信息:n”) ;
printf(“职工号是:%dn” , ) ;
printf(“职工名是:%sn” , ) ;
printf(“职工性别:%cn” , ) ;
printf(“职工年龄:%dn” ,) ;
printf(“职工工资:%fn” ,) ;
printf(“职工地址:%sn” ,s) ; }
3、 有10个学生,每个学生的数据包括学号、姓名及3门课的成绩,从键盘
输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数
据
37
(包括学号、姓名、3门课的成绩,平均成绩)。
程序如下:
struct student
{ int num ;
char name[10] ;
float score[3] ;
} stu[10] ;
main( )
{ int I , j ;
float avg[10] , sum , max;
printf(“输入10个学生数据:n” ) ;
for(I=0 ; I<10 ; I++)
{ scanf(“ %d” , stu[I].num) ;
scanf(“%s” , stu[I].name) ;
for(j=0 ; j<3 ; j++)
scanf(“%f ” , stu[I].score[j]) ;
}
for(I=0 ; I<10 ; I++) { sum=0 ;
for(j=0 ; j<3 ; j++)
sum=sum+stu[I].score[j] ;
avg[I]=sum/3 ;
printf(“avg[%d] = %fn” , I , avg[I]) ;
38
}
max=avg[0] ;
for(j=1 ; j<10 ; j++)
if(maxstu[I].num , stu[I].name) ;
printf(“ score[0]=%f , score[1]=%f , score[2]=%fn” ,
stu[I].score[0],stu[I].score[1],
stu[I].score[2]) ;
printf(“avg=%fn” , avg[I]) ;
}
39
40
发表评论