admin 管理员组

文章数量: 887019


2024年2月21日发(作者:html动态表单)

c语言《程序设计基础》课后习题参考答案与解析

《程序设计基础》习题参考答案与部分解析

第1章 C 语言概述

一、填空

a) C源程序的基本单位是 函数 。

b) 一个C程序中至少应包括一个 main函数 。

c) 在C语言中,输出操作是有库函数 printf( )函数 完成。 二、单选题

1、A 2、C 3、B

解析:

第1题 答案:A 。因为一个C程序总是从main函数开始执行的,

而不论main函数在程序中的位置。且到main函数结束。

第2题 答案:C 。因为 main函数没有限制必须位于程序的最前

面。C程序书写自由,一行内可写几个语句。在对一个C 程序进行编

译的过程中,无法检查注释当中的拼写错误。不过C语言本身并没有

输入输出语句,输入输出是由函数完成的。

第3题 答案:B。因为一个C语言程序是由若干个函数组成的。

但至少包含一个main 函数,且main函数的位置不限。 三、编程题

1、编写一个输出“Welcome to C!”信息的小程序。

解:程序如下

#include “stdio.h”

main( )

{

1

printf(“Welcome to C!”) ;

}

2、 已知三角形的三边长分别为3,4,5,试用海轮公式编程求其面积。

海伦公式为:S?= ,其中s= (a+b+s)/2 ;

解:程序如下

#include “math.h”

#include “stdio.h”

main( )

{

int a , b , c ; /* a ,b,c 3个整型变量表示三角形

的3条边。*/

float s ,s1 ; /* s1作为面积变量,s 作为中间变

量是都应该是实形*/

a=3 ; b= 4; c=5 ;

s= (a+b+c)/2.0 ;

s1= sqrt(s*(s-a)*(s-b)*(s-c)); /* sqrt函数完成开

平方根功能。*/

printf(“area=%fn”,s1);

}

2

第2章 程序设计基础知识

一、单选题

1、C 2、A 3、C 4、A 5、C 6、C 7、D 8、C 9、D 10、A 11、D 12、A 13、C

14、C 15、B A 16、B 17 D

解析:

1. 答案:C。这里考察的是用户标识符的定义。用户标识符由字母、数字、下划线组成。且必须以字母或下划线开头,区分大小写,且不能与C语言已有的32个关键字同名。由于选择不合法的用户标识符, A项的 A 、 P_0、 Do都是合法的用户标识符;B项的 _A是合法的;D项的 _123、 temp、INT 也都是合法的。只有C 选项的标识符都是错误的用户标识符。

2. 答案:A。这里考察的是整型常量的概念。B项当中01a不正确,C 项当中的0668不是正确的八进制常量,D项当中的2e5是float型常量。

3(答案:C。这里考察的是字符常量的定义。字符常量是用单撇号括起来的单个字符或转义字符。所以答案是C。

4(答案:A。字符变量只能包含一个字符。

5(答案:C。这里考察的是转义字符的正确表示。C项的?074?是错误的转义字符,正确表示方法是?074?。

6(答案:C。字符变量只能包含一个字符,而C项的c=?yes?是错误的。

7(答案:D。这里考察的是输入格式的控制。输入格式要与scanf语句中字符串格式相对应。

3

8(答案:C。这里考察的是输出格式和字符对应的ASCII码值。?A?的ASCII码值是65,?Y?字符的ASCII码值是89。

9(答案:D。这里考察输入格式和输出结果形式。由于输入格式不正确,所以输出的是不确定值。

10(答案:A。这里考察的是标识符的特点区分大小写,变量sum和变量sUM是两个不同的变量,sum并没有参加运算,所以它的值不边仍然是7。

11(答案:D。%运算符要求两边的运算数必须是整型。 12(答案:A。这里考察的是复合赋值运算。a%=b+1;等价与a=a%(b+1); 由于a=10,b=4;所以运算后a的值是0。

13(答案:C。这里考察的是在变量定义类型是进行赋值操作。要求 a,b,c都赋值为5,且为int 类型。只有C正确。

14(答案:C。这里考察的是类型的自动转换,只要有单精度类型或双精度类型参加运算,结果都是double(双精度)类型。 15(答案:B, A。这里考察的是逻辑表达式的运算过程。 表达式1&表达式2 ,若表达式1的值是0的话,结果就是0,表达式2就不参加运算。要注意:赋值表达式的值是左边赋值变量的值。所以答案为B ,A。

16(答案:B。这里考察的是逗号表达式运算过程是从第1个表达式开始运算,然后依次运行到最后一个表达式。逗号表达式的值是最后表达式的值,且注意逗号运算符优先级低于赋值运算符。所以表达式 (a=2,b=5,b++,a+b)运算过程a=2 —>

b=5 —> b++ —> a+b=8;结果是8。

4

17(答案:D。这里考察的是条件表达式的结合性是从右向左。所以

k

是1,然后计算k

二、填空题

1、-32768,32767 2、字母 , 数字 , 下划线 3、分号(;)

4、30 ,15 5、 18 6、 0

7、-264 8、 7 9、 0

10、 1 11、 y%2= = 1 12、 x

13、 0 14、 (x>2&&x<3) | | x < -10 15、 1 三、编程题

1、编写程序,输入一个长方形的二边长,输出其面积。

解:程序如下

#include “stdio.h”

main( )

{

int a , b , s ; /* a , b 作为长方形的两个边长,s为面积。*/

printf(“请输入两个边长n”) ;

scanf(“%d%d” , & a , & b) ;

s = a * b ;

printf(“ The area : %d n “ , s ) ;

}

2、 设置半径为r = 2.9 ,编程求圆周长和圆面积

5

解:程序如下

#include “stdio.h”

#define PI 3.14

main( )

{

float r , L , S ;

L = 2*PI*r ;

S = PI * r *r ;

printf( “ L = %f , S = %f n “ , L , S ) ; }

3、 输入一个华氏温度,输出相应的摄氏温度。二者的换算公式是: c =

5/9(F – 32) , 其中F表示华氏温度,c表示摄氏温度。 解:程序如下

#include “stdio.h”

main( )

{

float c , F ;

printf(“请输入一个华氏温度:n”) ;

scanf(“%f” , &F);

c = (float) 5/9 *(F-32) ;

printf(“ F=%f , c=%f n” , F , c) ;

}

6

第3章 程序设计初步

一、单选题

1、 C 2、 C 3、 B 4、 B 5、 B 解析:1. 答案:C。这里考察的是if-else 语句和表达式中有增量和减量的执行过程。if(m++>5) printf(“%dn”, m) ; else

printf(“%dn”,m++) ; 先执行m>5 的值是0,然后执行m=m+1; 得到m=6;由于m>5 的值是0所以执行else语句,应先输出m的值是6,然后m再自增一个单位变成7。

2(答案:C。这里考察的是if语句的嵌套。根据else子句总是与之前最近的if语句配对来进行选择满足条件的答案。

3(答案:B。这里也考察的是if语句的嵌套。同理:if(x

if(y<0) z=0 ; else z+=1 ; 等价与 if(x

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 ; i

switch( 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 ; i

temp=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 ;i

A’&& *(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(max

stu[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


本文标签: 输出 函数 输入 变量 要求