无机化学实验教案1

《C 语言程序设计能力教程(第二版)》课后作业及实训题

参考答案

第1章 进入C 语言程序世界

二、

1. I love China!

printf("we are students.\n")

2. 6

项目实训题参考答案

1.编写一个C 程序,输出以下信息:

* * * * * * * * * * * * * * * * * * * *

I am a student!

* * * * * * * * * * * * * * * * * * * *

main()

{ printf("********************\n");

printf(" I am a student!\n ");

printf("********************\n");

}

2.已知立方体的长、宽、高分别是10cm 、20cm 、15cm ,编写程序,求立方体体积。 解:

main()

{

int a,b,c,v;

a=10;

b=20;

c=15;

v=a*b*c;

printf("v=%d",v);

}

本程序运行结果为:

v=3000

第2章 编制C 程序的基础知识

一 选择题

C B A B A C C

二 操作题

,2,-8,2

3.000000,2.500000,-8.000000

2. ABC DE

FGH

why is 21+35 equal 52

3.

3

4

2

1

4. aa

A

项目实训题

1.定义一个符号常量M 为5和一个变量n 值为2,把它们的乘积输出。

#define M 5

main()

{ int n,c;

n=2; c=M*n;

printf("%d\n",c); }

2.编程求下面算术表达式的值。

(1)x+a%3*(int)(x+y)%2/4,设x=2.5,a=7,y=4.7;

(2)(float)(a+b)/2+(int)x%(int)y,设a=2,b=3,x=3.5,y=2.5。

(1)main()

{ int a=7;

float x=2.5,y=4.7;

printf("%f\n",x+a%3*(int)(x+y)%2/4); }

(2)main()

{ int a=2,b=3;

float x=3.5,y=2.5;

printf("%f\n",(float)(a+b)/2+(int)x%(int)y); }

第三章 顺序结构程序设计

一 选择题

A C D C C

二 操作题

1. x=3,a=2,b=3

2. z=12.700000

2 1 3 3 2 bb cc abc N

3. 1 2 1

a

2 1 2

三.编程题

编程题

1. 某工种按小时计算工资,每月劳动时间(小时)×每小时工资=总工资,总工资中扣除10%公积金,剩余的为应发工资。编写一个程序从键盘输入劳动时间和每小时工资,打印出应发工资。

解:

#include

main()

{

float sj,gz,yfgz;

printf("time,salary:");

scanf("%f,%f",&sj,&gz);

yfgz=sj*gz*0.9;

printf("total salary:%f\n",yfgz);

}

本程序运行结果为:

time,salary:4,3

total salary:10.800000

2.编写一个程序求出任意一个输入字符的ASCII 码

解:

#include

main()

{

char c;

printf("Input a string:");

scanf("%c",&c);

printf("%c ASCII is %d\n",c,c);

}

本程序运行结果为:

Input a string:a

a ASCII is 97

3、编写一个程序用于水果店售货员算帐:已知苹果每斤2.50元,鸭梨每斤1.80元,香蕉每斤2元,橘子每斤1.6元,要求输入各类水果的重量,打印出应付

3

解:

main()

{

float p,y,x,j,ys,g,fk;

printf("apple,pear,banana,orange(weight)=");

scanf("%f,%f,%f,%f",&p,&y,&x,&j);

ys=2.5*p+1.8*y+2*x+1.6*j;

printf("fu kuan=");

scanf("%f",&g);

fk=g-ys;

printf("result:\n");

printf("fukuan=%6.2fyuan\nshoukuan=%6.2fyuan\nzhaohui=%6.2fyuan\n",g,ys,fk);

}

本程序运行结果为:

apple,pear,banana,orange(weight)=1,2,3,4

fu kuan=100

result:

fukuan=100.00yuan

shoukuan= 18.50yuan

zhaohui= 81.50yuan

项目实训

1.假设银行定期存款的年利率rate 为2.25%,并已知存款期为n 年,存款本金为capital 元,试编程计算n 年后可得到本利之和deposit 。

#include

main()

{ int n;

float rate=0.0225,capital,deposit;

scanf("%d,%f",&n,&capital);

deposit=capital*pow(1+rate,n);

printf("deposit=%f\n",deposit); }

2.将一个三位数整数,正确分离出它的个位、十位和百位数字,并分别在屏幕上输出。

main()

{ int n,a,b,c;

scanf("%3d",&n);

a=n/100;

4

b=n%100/10;

c=n%100%10/1;

printf("a=%d,b=%d,c=%d\n",a,b,c); }

第四章 选择结构程序设计

一、略

二、B B A B C B A

三、1. 1 0

2. 2 3 2 2

3. 10 20 0

4. ch>=’A ’&&ch=’a ’&&ch

ch>=’0’&&ch

ch==’ ’

5. -1

四、上机操作

1. 从键盘输入一个英文字母,如果是大写字母,则将它变为小写字母输出;如果是小写字母,则将其变为大写字母输出。

#include

main()

{char ch;

ch=getchar();

if(ch>='A'&&ch

else if(ch>='a'&&ch

putchar(ch);

putchar('\n'); }

2. 根据输入的x 值依据下列表达式,计算y 的值。 4+x (x

解:

main()

{

float x,y;

scanf("%f",&x);

5

y=2*x;

else if(x==1)

y=3;

else y=4+x;

printf("y=%f",y);

}

本程序运行结果为:

-2

y=2.000000

3.编写程序,输入一个整数,判断它是奇数还是偶数,若是奇数,输出“Is Odd “; 若是偶数,输出“Is Even“。

main()

{ int x;

scanf("%d",&x);

if(x%2==0) printf("Is Even\n");

else printf("Is Odd\n"); }

4.设计应用程序,求二次方程ax +bx+c=0的解。

#include

main()

{ float a,b,c,disc,x1,x2,p,q;

scanf("%f,%f,%f",&a,&b,&c);

if(fabs(a)

{ disc=b*b-4*a*c;

if(fabs(disc)

else if(disc>1e-6)

{x1=(-b+sqrt(disc)/(2*a));

x2=(-b-sqrt(disc)/(2*a));

printf("x1=%8.4f,x2=%8.4f\n",x1,x2); }

else

{ p=-b/(2*a);

q=sqrt(-disc/(2*a));

printf("%8.4f+%x8.4fi\n",p,q);

printf("%8.4f-%8.4fi\n",p,q);} } }

5.按托运规则,行李不超过50公斤时,运费为0.15元/公斤,如超过50公斤,超

过部分的运费为0.22元/公斤,现有行李w 公斤,编写一个程序计算运费。 6 2

解:

#include

main()

{

float w,f,x;

printf("weight:");

scanf("%f",&w);

if(w

x=0.15*w;

else

x=0.15*50+0.22*(w-50);

printf("money:%6.2f yuan\n",x);

}

本程序运行结果为:

weight:20

money:3.00 yuan

weight:60

money:9.70 yuan

6. 某商场给与顾客购物的折扣率如下:

购物金额

500元>购物金额>=200元 9折

1000元>购物金额>=500元 8折

购物金额>=1000元 7.5折

输入一个购物金额,输出打折率、购物实际付款金额。

#include

main()

{ float x,y,realx;

scanf("%f",&x);

if(x

{ if(x

else if(x

else if(x

else y=0.75;}

if(y!=0)

{realx=x*y;

printf("y=%f, the realx=%5.2f\n", y,realx);} }

7

项目实训

某托儿所收2岁到6岁的孩子,2岁、3岁孩子进小班(Lower class );4岁孩子进中班(Middle class);5岁、6岁孩子进大班(Higher class)。编写程序(用if 语句和switch 语句),输入孩子年龄,输出年龄及进入的班号。如:输入:3,输出:age :3,enter Lower class。

#include

main()

{ int age;

printf("Please input your baby's age:");

scanf("%d",&age);

if(age>6||age

else switch(age);

{case 2:

case 3: printf("age:%d,enter Lower class\n",age); break;

case 4: printf("age:%d,enter Middle class\n",age);break;

case 5:

case 6: printf("age:%d,enter Higher class",age);break; } }

第五章 循环结构程序设计

一、选择题

C C A A D D

三、操作题

1.求s=1+3+5+7+„100的值。

#include "stdio.h"

main()

{

int i,sum=0;

for(i=1;i

sum=sum+i;

printf("sum=%d",sum);

}

2. 输入班级学生考试成绩,求考试平均成绩。约定当输入负数时,表示输入结束。 main()

{ float sum=0,score,ave;

int n=0;

scanf("%f",&score);

while(score>0)

{ n++;

8

sum=sum+score;

scanf("%f",&score); }

ave=sum/n;

printf("\nThe average score is%.2f",ave); }

3.输入一行字符以@作结束标志,分别统计其中英文字母、空格、数字和其它字符的个数。

#include "stdio.h"

main()

{ char ch;

int cha=0,space=0,digit=0,other=0;

while((ch=getchar())!='@')

{ if (ch>='a'&&ch='A'&&ch

else if (ch==' ') space++;

else if (ch>='0'&&ch

else other++; }

printf("\ncha=%d,space=%d,digit=%d,other=%d",cha,space,digit,other); }

4.一张纸的厚度为0.1毫米,珠穆琅玛峰的高度为8848.13米,假如纸张有足够大,将纸对折多少次后可以超过珠峰的高度?

main()

{ float h=8848.13,h0=0.0001,h1;

int m=0;

h1=h0;

while(h0

{ h0=2*h0;

printf("\n m=%d,high=%f",m,h0);

m++; }

printf("\n m=%d\n",m-1);}

5、 编写一个程序求出满足下列条件的四位数,该数是一个完全平方数;第一、三位

上数之和为10,第二、四位上数之积为12。

解:

#include

main()

{

int i,j,a,b,c,d;

for(i=32;i

{

j=i*i;

a=j/1000;

9

b=j/100-a*10;

c=j/10-a*100-b*10;

d=j-a*1000-b*100-c*10;

if(a+c==10&&b*d==12)

printf("%d ",j);

}

}

本程序运行结果为:

1296 9216

6、 一个正数与3的和是5的倍数,与3的差是6的倍数,编写一个程序求符合条件

的最小数。

解:

#include

main()

{

int n;

n=1;

while(1)

{

n=n+1;

if((n+3)%5==0&&(n-3)%6==0)break;

}

printf("n=%d",n);

}

本程序运行结果为:

n=27

7、 已知xyz+yzz=532,其中x 、y 、z 都是数字,编写一个程序求出x 、y 、z 分别是多

少。

解:

#include

main()

{

int x,y,z,i;

for(x=1;x

for(y=1;y

for(z=0;z

{

i=100*x+10*y+z+100*y+10*z+z;

10

if(i==532) printf("x=%d,y=%d,z=%d\n",x,y,z); }

}

本程序运行结果为: x=3,y=2,z=1

8、学校有近千名学生排队,5人一行余2人,7人一行余3人,3人一行余1人,求学生人数。

解:

#include main() {

int n;

for(n=1000;n>=10;n--)

if(n%5==2&&n%7==3&&n%3==1)break; printf("n=%d\n",n); }

本程序运行结果为: n=997

9.验证歌德巴赫猜想:任意一个大于6的偶数均可表示为两个质数的和。 #include main() { int i,x; int p,q,k1,k2;

printf("Please input an odd data(>=6):"); scanf("%d",&x); for(p=3;p

q=x-p; if(p>2)

for(i=2;i

if(k1==1&&k2==1) printf("%d=%d+%d\n",x,p,q); }}

10.一个数恰好等于它的平方数的右端,这个数称为同构数 。如 :5的平方是25,25的平方是625。找出1~1000之间的全部同构数 。 #include "math.h"

main()

{ int i,j,k=0;

for (i=2;i

{ if (i/10==0) j=1; /*因为i 是整型,所以是整除*/ else if (i/100==0) j=2;

else if (i/1000==0) j=3; { k++;

/* 计数器*/

if ((long int)i*i%(int)pow(10,j)==i) /*同构数的定义*/

printf("%10d",i);

if (k%5==0) printf("\n"); } } printf("\nk=%d",k); }

项目实训

1. 编写程序求1-1/2+1/3-1/4+„+1/99-1/100的值

#include "stdio.h" main() {

int i, s=-1; float sum=1.0;

for(i=2;i

2.曾有一位印度国王要奖赏他的聪明能干的宰相达依尔。达依尔只要求在国际象棋的棋盘格上放置小麦粒,第一格放1粒,第二格放两粒,第三格放4粒,第四格放8粒,„„, 最后能有多少小麦粒呢? main()

{ float i ,s=1,t=1; for (i=1;i

printf("s=%f\n",s);}

3.打印水仙花数,即一个三位数各位上的数字之和等于它本身,如:153=13+53+33 。 main()

{int k1,k2,k3,i; for (k1=1;k1

{ i=k1*k1*k1+k2*k2*k2+k3*k3*k3;

if (i==k1*100+k2*10+k3)

printf("\n%d=%d^3+%d^3+%d^3",i,k1,k2,k3); }}

4.编制电视歌手大奖赛评分程序,要求评委人数和每位评委的打分从键盘输入,去掉一个最高分,再去掉一个最低分,求评委给出的最后得分。 main()/* TV大奖赛 */ {int n,i=1;

float x,max,min,sum=0;

printf("\nPlease input the number of score:"); scanf("%d",&n);

printf("\nInput score:"); scanf("%f",&x); max=x;min=x;sum=x; while (i

scanf("%f",&x); sum+=x;

if (max

printf("The last score is%8.2f\n",sum);}

5.打印下列图形。

* * * * *

* * * * * * * * * * * * * * * * * * * * main() { int i,j;

for (i=1;i

第六章 数组

printf ( " "); printf (" *"); printf("\n"); }}

for (j=1;j

D A D A A C C A D

二、程序阅读题

13 13 13 13 13 13 三、上机实训题

1、分别用冒泡法和选择排序法对十个随机整数进行排序。 参考教材

2、编写一个程序计算字符串中值为x (x 由键盘输入)的字符个数。 #include "stdio.h" #include "string.h" main()

{ char a[20],x; int n=0,i=0;

printf("\nPlease input string,end of enter key: "); gets(a);

printf("\nPlease input x:"); x=getchar(); while(a[i]!='\0') {if (a[i]==x) n++; i++; }

printf("\n%d",n); }

if(x[i]>ave) printf("%f ",x[i]); }

3、编写一个程序判定用户输入的正数是否为“回文数”,所谓回文数是指数正读反读都相同。

#include main()

{ int buffer[10],i,k,b; long number,n;

printf("input a positive number:"); scanf("%ld",&number); k=0; n=number; do

{ buffer[k]=n%10; k=k+1;

n=n/10; } while(n!=0); b=1;

for(i=0;i

if(buffer[i]!=buffer[k-1-i]) b=0; if(b) printf("%ld is huiwenshu\n",number);

else printf("%ld is not huiwenshu\n",number); } 4、求二维数组的周边元素之和 #include main() {

int a[3][3]={{3,-2,1,2},{0,1,3,-2},{3,1,0,4}}; int i,j,sum=0; for(i=0;i

if (i==0||j==0||j==2||i==2) sum=sum+a[i][i]; printf("%d",sum); }

5、编写程序找出一个二维数组的鞍点。即该位置上的元素在该行最大,但是在该列最小。 main()

{ int i,j,k,max,maxi,maxj,flag1,flag2; int a[2][3]={{1,2,3},{4,5,6}}; flag2=0;

for (i=0;i

if (a[i][j]>max) { max=a[i][j]; maxj=j;} if (a[k][maxj]

(flag1)

{printf("\n

%d

is

answer,locate:line

%d

for (k=0,flag1=1;k

项目实训:

1、评定奥运会某参赛选手的成绩。设某参赛选手的某项目有8位评委,要求去掉一个最高分和一个最低分,给出其最后得分。

#include

colum %d\n",max,i,maxj);

flag2=1; } }

if (!flag2) printf("\n no answer!"); }

*/ main() {

int x[N],i,max,min,score=0;

printf("Please input %d integers:\n",N); /*输入N 个数,存入数组中*/ for(i=0;i

{ scanf("%d",&x[i]); score+=x[i];} /*赋初值*/

max=min=x[0]; 默认为最大或最小值*/ for(i=1;i

if(maxx[i]) min=x[i]; }

printf("The last score is : %d\n",(score-max-min)/(N-2); }

/*求最大值*/ /*求最小值*/

/*将第一个数

/*定义字

2、

打印出以下杨辉三角形(要求打印出10行)。

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 „ „ „ „ #define N 11 main()

{ int i,j,a[N][N]; for (i=1;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for (i=1;i

#define N 11 main() {

int i,j,a[N][N]; for(i=1;i

a[i][i]=1; a[i][1]=1; }

for(i=3;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;i

for(j=1;j

printf("\n"); }

本程序的运行结果为:

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1

3、一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不用strcpy 函数。拷贝时,‘\0’也要拷贝过去。‘\0’后面的字符不拷贝。

解:

#include "stdio.h" main() {

char from[80],to[80];

int i;

printf("Input string:"); scanf("%s",from);

for(i=0;i

printf("the result: %s\n",to); }

本程序的运行结果为:

the result:Input string:student

第七章 函数 一、选择题

B D C B B D A A D 三、编程题

1、写一个判定偶数的函数,在主函数中输入一个整数,输出是否是偶数的信息。 int even(x) int x ;

{ if (x%2==0) return(1); else return(0); } main() { int x;

scanf("%d",&x);

if (even(x)) printf("x is even."); else printf("x is not even.");}

2、统计 400~499 这些数中 4 这个数字出现的次数,要求判断一个数有几位4这个数字用函数实现。 main()

{ int i,k=0;

for(i=400;i

printf ("number=%d\n",k); } num(x) int x; { int y,k=0; while(x!=0) if(y= = 4) k++;

{ y=x%10;

x=x/10; } return(k);} main()

项目实训:

1、已有变量定义和函数调用语句:int x=57;isprime (x);函数isprime ( )用来判断一个整型数a 是否为素数,若是素数,函数返回1,否则返回0。请编写isprime 函数。

isprime (int a) { } 解: main() { int x=57; int isprime(int);

if (isprime(x)) printf(“%d is prime.”,x); else printf(“%d is not prime.”,x); }

isprime (int a)

{int i;

for(i=2;i

return 1;}

2、

3、找出1000之内的所有“完数”,要求判断一个数是否为完数用函数实现。

{ int i;

for (i=1;i

if (wan(i)) printf ("%5d",i); printf ("\n"); } wan(x) int x; { int i,k; k=0;

for (i=1;i

输入10个学生的成绩,分别用函数实现: (1)求平均成绩; (2)按分数高低进行排序并输出。 解:main( )

{float average(float b[]); void sort(float b[]); float a[10],j,aver; printf("input 10:"); for(j=0;j

printf("aver=%.2f\n",aver); sort(a);

for(j=0;j

float average(float b[ ]) {int j; float sum=0,aver; for(j=0;j

void sort(float b[ ]) {int i,j,max,k; for(i=0;i

本程序运行结果为:

input 10:45 12 86 85 79 84 85 96 45 89 (输入) aver=70.60

96.00 89.00 86.00 85.00 79.00 45.00 45.00 12.00

85.00 84.00

第8章 指针

一、选择题

D A C C(D) D C D

二、填空题 1. m 2. 指针数组名 3. ABCDCD 4.49 5. 25

三、程序设计题

(1)main()

{

int a,b,c,*p1,*p2,*p3;

scanf("%d,%d,%d",&a,&b,&c);

p1=&a;

p2=&b;

p3=&c;

if(*p1

if(*p3

printf("\nmax=%d\n",max);

}

程序结果:

9,0,10

max=10

(2)#include

main()

{int a[10],*p,i,t;

p=a;

for(i=0;i

scanf("%d",p+i);

for(i=0;i

{t=*(p+i);*(p+i)=*(p+9-i);*(p+9-i)=t;}

for(i=0;i

printf("%5d",*(p+i));

printf("\n");

}

(3)#include

main()

{ char str[80],*p,i,len=0;

p=str;

gets(p);

for(i=0;*(p+i)!='\0';i++)

len++;

21

printf("len=%d\n",len);

}

项目实训题目:

#include

char *link(char *p1,int M,char *p2,int N)

{ int i,j;

for(i=0;i

if(*(p1+i)=='\0')

break;

for(j=0;j

if(*(p2+j)!='\0')

*(p1+(i++))=*(p2+j);

else

break;

*(p1+i)='\0';

return(p1);

}

main()

{

char str1[80],str2[20],*p;

gets(str1);

gets(str2);

p=link(str1,80,str2,20);

puts(p);

}

第9章 结构体共同体和枚举类型

程序设计题

1.定义一个结构体变量来表示日期(包括年、月、日),并编程来计算某一日期是本年的第几天,注意考虑闰年的问题。

解:struct

{ int year;

int month;

int day;

}date;

main()

{ int days;

22

printf("Please input date:(year,month,day)");

scanf("%d,%d,%d",&date.year,&date.month,&date.day);

switch(date.month)

{ case 1:days=date.day; break;

case 2:days=date.day+31; break;

case 3:days=date.day+59; break;

case 4:days=date.day+90; break;

case 5:days=date.day+120; break;

case 6:days=date.day+151; break;

case 7:days=date.day+181; break;

case 8:days=date.day+212; break;

case 9:days=date.day+243; break;

case 10:days=date.day+273; break;

case 11:days=date.day+304; break;

case 12:days=date.day+334; break;

}

if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3)

days+=1;

printf("\n%dmonth

}

本程序运行结果为:

Please input date:(year,month,day)2000,3,1

3month 1day is 61 day of 2000.

2、有10名学生,每个学生包括学号、姓名、3科成绩,编程序求每个学生的平均成绩,并打印最高分学生的信息。

#define N 4

main( )

{struct student

{int num; char name[15]; float c[3]; float ave; %dday is %d day of %d.",date.month,date.day,days,date.year); };

struct student stu[N];

struct student *p[N],*t;

23

int i,j,k; float x1,x2,x3;

for(i=0;i

{scanf("%d%s%f%f",&stu[i].num,stu[i].name,&x1,&x2,&x3);

stu[i].c[0]=x1; stu[i].c[1]=x2; stu[i].c[2]=x3;

k=0;

for(j=0;j

k=k+stu[i].c[j];

stu[i].ave=k/3.0;

p[i]=&stu[i];

}

/*排序-由大到小*/

for(i=0;i

for(j=i+1;j

if(p[j]->ave

ave)

{t=p[j];p[j]=p[i];p[i]=t;}

printf(“%5d%15s%3d%3d%6.1f\n”, p[0]->num,p[i]->name,

p[0]->c[1],p[0]->c[2]);

}

3、建立一个3名学生数据的单链表。

解:#define NULL 0

#define LEN sizeof(struct student)

struct student

{ int no;

struct student *next;

};

struct student *head;

struct student *creat()

{ struct student *p,*q;

int n,i;

printf("how many:");

scanf("%d",&n);

for(i=0;i

{ p=( struct student *)malloc(LEN);

printf("NO:"); scanf("%d",&p->no);

if(i==0) head=p;

else q->next=p;

q=p;

}

24 p[0]->c[0],

p->next=NULL;

return(head);

}

print (struct student * head )

{ struct student *p;

p=head;

while(p!=NULL)

{ printf("%6d ",p->no);

p=p->next;

}

}

main()

{ struct student * head;

head= creat();

print(head);

}

本程序运行结果为:

how many:5

NO:12

NO:78

NO:98

NO:45

NO:75 (以上为输入)

12 78 98 45 75

实训题

(1)图书馆的图书检索上包括:书名、作者姓名、出版日期、登录号、书价等内容。试根据上述五项内容定义一个结构体类型,声明结构体变量book ,再从键盘为变量book 输入数据,并从屏幕输出数据。

(2)构体数组(可以使用链表),将5名考生数据输入计算机,并列表从屏幕输

出。编写函数,通过调用函数实现:

a . 找出成绩最高的考生的有关信息,并在屏幕上输出。

b . 按考生准考证号码由大到小排序。

考生数据包括:准考证号码、姓名、性别、年龄、成绩。

解:(1) struct

{ char name[20];

25

char author[20];

char date[10];

int loadno;

float price;

}book;

main()

{printf("enter bookname author date loadno price:\n");

scanf("%s %s %s %d %f",&book.name,&book.author,\

&book.date,&book.loadno,&book.price);

printf("bookname author date loadno price:\n");

printf("%-10s %-10s %-10s %-6d %-6.2f",book.name,book.author,\

book.date,book.loadno,book.price);

}

本程序结果是:

enter bookname author date loadno price:

c tanhaoqiang 1982.6 119 30.00

bookname author date loadno price:

C tanhaoqiang 1982.6 119 30.00

(2)

struct student

{int number;

char name[10];

char sex;

int age;

float score;

}st[5];

input_sc(s)

struct student s[];

{ int i,j;

float h;

for(i=0;i

{

printf("Please input number, sex ,age, score ,name:\n");

scanf("%d,%c,%d,%f,%s",&s[i].number,&s[i].sex,&s[i].age,&h,s[i].name); s[i].score=h;

26

}

}

output_sc(s)

struct student s[];

{int i;

printf("number name sex age score:\n"); for(i=0;i

{

printf("%-8d",s[i].number);

printf("%-4s",s[i].name);

printf("%-5c",s[i].sex);

printf("%-5d",s[i].age);

printf("%-7f",s[i].score);

printf("\n");

}

}

max_st(s)

struct student s[];

{ int i,max=0,k=0;

for(i=0;i

if(max

max=s[i].score;

printf("max is :\n");

for(i=0;i

if(s[i].score==max)

{

printf("%-8d",s[i].number);

printf("%-4s",s[i].name);

printf("%-5c",s[i].sex);

printf("%-5d",s[i].age);

printf("%-7f",s[i].score);

printf("\n");

}

}

sort(s)

struct student s[];

{ int i,j,n,m;

char a[10],c;

27

float t;

for(i=0;i

for(j=0;j

if(s[j].score>s[j+1].score)

{n=s[j].number;

strcpy(a,s[j].name);

c=s[j].sex;

m=s[j].age;

t=s[j].score;

s[j].number=s[j+1].number;

strcpy(s[j].name,s[j+1].name);

s[j].sex=s[j+1].sex;

s[j].age=s[j+1].age;

s[j].score=s[j+1].score;

s[j+1].number=n;

strcpy(s[j+1].name,a);

s[j+1].sex=c;

s[j+1].age=m;

s[j+1].score=t;

}

}

main()

{ int i;

struct student st[5];

clrscr();

input_sc(st);

output_sc(st);

max_st(st);

sort(st);

printf("form big to small:\n");

output_sc(st);

}

本程序结果是:

Please input number, sex ,age, score ,name:

1,m,23,90,li

Please input number, sex ,age, score ,name:

2,n,22,89,liu

Please input number, sex ,age, score ,name:

28

3,m,23,99,wu

Please input number, sex ,age, score ,name:

4,m,22,99,guo

Please input number, sex ,age, score ,name:

5,n,22,78,zhu

number name sex age score:

1 li m 23 90.000000

2 liu n 22 89.000000

3 wu m 23 99.000000

4 guo m 22 99.000000

5 zhu n 22 78.000000

max is :

3 wu m 23 99.000000

4 guo m 22 99.000000

form big to small:

number name sex age score:

5 zhu n 22 78.000000

2 liu n 22 89.000000

1 li m 23 90.000000

3 wu m 23 99.000000

4 guo m 22 99.000000

(3) type test.txt

第10章 文件

程序设计题

1.写一个程序,建立一个abc 文本文件,向其中写入“spring summer fall winter ”字符串,然后显示该文件的内容。

解:#include

#include

main( )

{FILE *fp;

char msg[ ]=" spring summer fall winter ";

char buf[30];

if((fp=fopen("abc.txt","w+"))==NULL)

{printf("can not creat abc file\n");

exit(1);

}

29

fwrite(msg,strlen(msg)+1,1,fp);

fseek(fp,SEEK_SET,0);

fread(buf,strlen(msg)+1,1,fp);

printf("%s\n",buf);

fclose(fp);

}

2. 编写一个程序对打开文件test.txt ,统计该文件中字符的个数。

解:#include "stdio.h"

#define NULL 0

void main()

{FILE *fp1;

int total=0;

if((fp1=fopen(“test.txt”,"r"))==NULL)

{printf("Cannot open test.txt.\n”);

exit(1); }

else

{ while((c=fgetc(fp1))!=EOF)

if(c>='0'&&c

total++;

printf("\nThere are %d character .\n",total);

fclose(fp1);

} }

项目实训题

编写一个程序对ASCII 文件test.txt 中得字符做一个统计,统计该文件中字母、

数字和其他字符的个数。输出统计结果分别到屏幕和文件result.txt 。test.txt 文件名由命令行参数输入。例如,假设C 源程序的可执行文

件名为count.exe , 则命令行count test.txt表示对文件test.txt

进行统计。

解:#include "stdio.h"

#define NULL 0

#include "process.h"

void main(int argc,char *argv[])

{FILE *fp1,*fp2;

int digital,character,other;

char c;

digital=0;character=0;other=0;

if(argc!=2)

30

exit(1);

}

else

if((fp1=fopen(argv[1],"r"))==NULL)

{printf("Cannot open %s\n",argv[1]);

exit(1);

}

else

{while((c=fgetc(fp1))!=EOF)

{if(c>='0'&&c

digital++;

else if(c>='a'&&c='A'&&c

character++;

else

other++; }

if((fp2=fopen("result.txt","w"))==NULL)

{printf("file %s open error\n","result.txt"); exit(1);

}

fputs("There are ",fp2);

fprintf(fp2,"%d ",digital);

fputs("digital ",fp2);

fprintf(fp2,"%d ",character);

fputs("character and ",fp2);

fprintf(fp2,"%d ",other);

fputs("other.\n",fp2);

printf("\nThere are %d digital %d character and %d other.\n",\ digital,character,other);

fclose(fp1);

fclose(fp2);

}

}

在DOS 下使用命令:

count test.txt

屏幕显示:

There are 4 digital 5 character and 4 other.

result.txt 文件中显示与屏幕一致!

31

《C 语言程序设计能力教程(第二版)》课后作业及实训题

参考答案

第1章 进入C 语言程序世界

二、

1. I love China!

printf("we are students.\n")

2. 6

项目实训题参考答案

1.编写一个C 程序,输出以下信息:

* * * * * * * * * * * * * * * * * * * *

I am a student!

* * * * * * * * * * * * * * * * * * * *

main()

{ printf("********************\n");

printf(" I am a student!\n ");

printf("********************\n");

}

2.已知立方体的长、宽、高分别是10cm 、20cm 、15cm ,编写程序,求立方体体积。 解:

main()

{

int a,b,c,v;

a=10;

b=20;

c=15;

v=a*b*c;

printf("v=%d",v);

}

本程序运行结果为:

v=3000

第2章 编制C 程序的基础知识

一 选择题

C B A B A C C

二 操作题

,2,-8,2

3.000000,2.500000,-8.000000

2. ABC DE

FGH

why is 21+35 equal 52

3.

3

4

2

1

4. aa

A

项目实训题

1.定义一个符号常量M 为5和一个变量n 值为2,把它们的乘积输出。

#define M 5

main()

{ int n,c;

n=2; c=M*n;

printf("%d\n",c); }

2.编程求下面算术表达式的值。

(1)x+a%3*(int)(x+y)%2/4,设x=2.5,a=7,y=4.7;

(2)(float)(a+b)/2+(int)x%(int)y,设a=2,b=3,x=3.5,y=2.5。

(1)main()

{ int a=7;

float x=2.5,y=4.7;

printf("%f\n",x+a%3*(int)(x+y)%2/4); }

(2)main()

{ int a=2,b=3;

float x=3.5,y=2.5;

printf("%f\n",(float)(a+b)/2+(int)x%(int)y); }

第三章 顺序结构程序设计

一 选择题

A C D C C

二 操作题

1. x=3,a=2,b=3

2. z=12.700000

2 1 3 3 2 bb cc abc N

3. 1 2 1

a

2 1 2

三.编程题

编程题

1. 某工种按小时计算工资,每月劳动时间(小时)×每小时工资=总工资,总工资中扣除10%公积金,剩余的为应发工资。编写一个程序从键盘输入劳动时间和每小时工资,打印出应发工资。

解:

#include

main()

{

float sj,gz,yfgz;

printf("time,salary:");

scanf("%f,%f",&sj,&gz);

yfgz=sj*gz*0.9;

printf("total salary:%f\n",yfgz);

}

本程序运行结果为:

time,salary:4,3

total salary:10.800000

2.编写一个程序求出任意一个输入字符的ASCII 码

解:

#include

main()

{

char c;

printf("Input a string:");

scanf("%c",&c);

printf("%c ASCII is %d\n",c,c);

}

本程序运行结果为:

Input a string:a

a ASCII is 97

3、编写一个程序用于水果店售货员算帐:已知苹果每斤2.50元,鸭梨每斤1.80元,香蕉每斤2元,橘子每斤1.6元,要求输入各类水果的重量,打印出应付

3

解:

main()

{

float p,y,x,j,ys,g,fk;

printf("apple,pear,banana,orange(weight)=");

scanf("%f,%f,%f,%f",&p,&y,&x,&j);

ys=2.5*p+1.8*y+2*x+1.6*j;

printf("fu kuan=");

scanf("%f",&g);

fk=g-ys;

printf("result:\n");

printf("fukuan=%6.2fyuan\nshoukuan=%6.2fyuan\nzhaohui=%6.2fyuan\n",g,ys,fk);

}

本程序运行结果为:

apple,pear,banana,orange(weight)=1,2,3,4

fu kuan=100

result:

fukuan=100.00yuan

shoukuan= 18.50yuan

zhaohui= 81.50yuan

项目实训

1.假设银行定期存款的年利率rate 为2.25%,并已知存款期为n 年,存款本金为capital 元,试编程计算n 年后可得到本利之和deposit 。

#include

main()

{ int n;

float rate=0.0225,capital,deposit;

scanf("%d,%f",&n,&capital);

deposit=capital*pow(1+rate,n);

printf("deposit=%f\n",deposit); }

2.将一个三位数整数,正确分离出它的个位、十位和百位数字,并分别在屏幕上输出。

main()

{ int n,a,b,c;

scanf("%3d",&n);

a=n/100;

4

b=n%100/10;

c=n%100%10/1;

printf("a=%d,b=%d,c=%d\n",a,b,c); }

第四章 选择结构程序设计

一、略

二、B B A B C B A

三、1. 1 0

2. 2 3 2 2

3. 10 20 0

4. ch>=’A ’&&ch=’a ’&&ch

ch>=’0’&&ch

ch==’ ’

5. -1

四、上机操作

1. 从键盘输入一个英文字母,如果是大写字母,则将它变为小写字母输出;如果是小写字母,则将其变为大写字母输出。

#include

main()

{char ch;

ch=getchar();

if(ch>='A'&&ch

else if(ch>='a'&&ch

putchar(ch);

putchar('\n'); }

2. 根据输入的x 值依据下列表达式,计算y 的值。 4+x (x

解:

main()

{

float x,y;

scanf("%f",&x);

5

y=2*x;

else if(x==1)

y=3;

else y=4+x;

printf("y=%f",y);

}

本程序运行结果为:

-2

y=2.000000

3.编写程序,输入一个整数,判断它是奇数还是偶数,若是奇数,输出“Is Odd “; 若是偶数,输出“Is Even“。

main()

{ int x;

scanf("%d",&x);

if(x%2==0) printf("Is Even\n");

else printf("Is Odd\n"); }

4.设计应用程序,求二次方程ax +bx+c=0的解。

#include

main()

{ float a,b,c,disc,x1,x2,p,q;

scanf("%f,%f,%f",&a,&b,&c);

if(fabs(a)

{ disc=b*b-4*a*c;

if(fabs(disc)

else if(disc>1e-6)

{x1=(-b+sqrt(disc)/(2*a));

x2=(-b-sqrt(disc)/(2*a));

printf("x1=%8.4f,x2=%8.4f\n",x1,x2); }

else

{ p=-b/(2*a);

q=sqrt(-disc/(2*a));

printf("%8.4f+%x8.4fi\n",p,q);

printf("%8.4f-%8.4fi\n",p,q);} } }

5.按托运规则,行李不超过50公斤时,运费为0.15元/公斤,如超过50公斤,超

过部分的运费为0.22元/公斤,现有行李w 公斤,编写一个程序计算运费。 6 2

解:

#include

main()

{

float w,f,x;

printf("weight:");

scanf("%f",&w);

if(w

x=0.15*w;

else

x=0.15*50+0.22*(w-50);

printf("money:%6.2f yuan\n",x);

}

本程序运行结果为:

weight:20

money:3.00 yuan

weight:60

money:9.70 yuan

6. 某商场给与顾客购物的折扣率如下:

购物金额

500元>购物金额>=200元 9折

1000元>购物金额>=500元 8折

购物金额>=1000元 7.5折

输入一个购物金额,输出打折率、购物实际付款金额。

#include

main()

{ float x,y,realx;

scanf("%f",&x);

if(x

{ if(x

else if(x

else if(x

else y=0.75;}

if(y!=0)

{realx=x*y;

printf("y=%f, the realx=%5.2f\n", y,realx);} }

7

项目实训

某托儿所收2岁到6岁的孩子,2岁、3岁孩子进小班(Lower class );4岁孩子进中班(Middle class);5岁、6岁孩子进大班(Higher class)。编写程序(用if 语句和switch 语句),输入孩子年龄,输出年龄及进入的班号。如:输入:3,输出:age :3,enter Lower class。

#include

main()

{ int age;

printf("Please input your baby's age:");

scanf("%d",&age);

if(age>6||age

else switch(age);

{case 2:

case 3: printf("age:%d,enter Lower class\n",age); break;

case 4: printf("age:%d,enter Middle class\n",age);break;

case 5:

case 6: printf("age:%d,enter Higher class",age);break; } }

第五章 循环结构程序设计

一、选择题

C C A A D D

三、操作题

1.求s=1+3+5+7+„100的值。

#include "stdio.h"

main()

{

int i,sum=0;

for(i=1;i

sum=sum+i;

printf("sum=%d",sum);

}

2. 输入班级学生考试成绩,求考试平均成绩。约定当输入负数时,表示输入结束。 main()

{ float sum=0,score,ave;

int n=0;

scanf("%f",&score);

while(score>0)

{ n++;

8

sum=sum+score;

scanf("%f",&score); }

ave=sum/n;

printf("\nThe average score is%.2f",ave); }

3.输入一行字符以@作结束标志,分别统计其中英文字母、空格、数字和其它字符的个数。

#include "stdio.h"

main()

{ char ch;

int cha=0,space=0,digit=0,other=0;

while((ch=getchar())!='@')

{ if (ch>='a'&&ch='A'&&ch

else if (ch==' ') space++;

else if (ch>='0'&&ch

else other++; }

printf("\ncha=%d,space=%d,digit=%d,other=%d",cha,space,digit,other); }

4.一张纸的厚度为0.1毫米,珠穆琅玛峰的高度为8848.13米,假如纸张有足够大,将纸对折多少次后可以超过珠峰的高度?

main()

{ float h=8848.13,h0=0.0001,h1;

int m=0;

h1=h0;

while(h0

{ h0=2*h0;

printf("\n m=%d,high=%f",m,h0);

m++; }

printf("\n m=%d\n",m-1);}

5、 编写一个程序求出满足下列条件的四位数,该数是一个完全平方数;第一、三位

上数之和为10,第二、四位上数之积为12。

解:

#include

main()

{

int i,j,a,b,c,d;

for(i=32;i

{

j=i*i;

a=j/1000;

9

b=j/100-a*10;

c=j/10-a*100-b*10;

d=j-a*1000-b*100-c*10;

if(a+c==10&&b*d==12)

printf("%d ",j);

}

}

本程序运行结果为:

1296 9216

6、 一个正数与3的和是5的倍数,与3的差是6的倍数,编写一个程序求符合条件

的最小数。

解:

#include

main()

{

int n;

n=1;

while(1)

{

n=n+1;

if((n+3)%5==0&&(n-3)%6==0)break;

}

printf("n=%d",n);

}

本程序运行结果为:

n=27

7、 已知xyz+yzz=532,其中x 、y 、z 都是数字,编写一个程序求出x 、y 、z 分别是多

少。

解:

#include

main()

{

int x,y,z,i;

for(x=1;x

for(y=1;y

for(z=0;z

{

i=100*x+10*y+z+100*y+10*z+z;

10

if(i==532) printf("x=%d,y=%d,z=%d\n",x,y,z); }

}

本程序运行结果为: x=3,y=2,z=1

8、学校有近千名学生排队,5人一行余2人,7人一行余3人,3人一行余1人,求学生人数。

解:

#include main() {

int n;

for(n=1000;n>=10;n--)

if(n%5==2&&n%7==3&&n%3==1)break; printf("n=%d\n",n); }

本程序运行结果为: n=997

9.验证歌德巴赫猜想:任意一个大于6的偶数均可表示为两个质数的和。 #include main() { int i,x; int p,q,k1,k2;

printf("Please input an odd data(>=6):"); scanf("%d",&x); for(p=3;p

q=x-p; if(p>2)

for(i=2;i

if(k1==1&&k2==1) printf("%d=%d+%d\n",x,p,q); }}

10.一个数恰好等于它的平方数的右端,这个数称为同构数 。如 :5的平方是25,25的平方是625。找出1~1000之间的全部同构数 。 #include "math.h"

main()

{ int i,j,k=0;

for (i=2;i

{ if (i/10==0) j=1; /*因为i 是整型,所以是整除*/ else if (i/100==0) j=2;

else if (i/1000==0) j=3; { k++;

/* 计数器*/

if ((long int)i*i%(int)pow(10,j)==i) /*同构数的定义*/

printf("%10d",i);

if (k%5==0) printf("\n"); } } printf("\nk=%d",k); }

项目实训

1. 编写程序求1-1/2+1/3-1/4+„+1/99-1/100的值

#include "stdio.h" main() {

int i, s=-1; float sum=1.0;

for(i=2;i

2.曾有一位印度国王要奖赏他的聪明能干的宰相达依尔。达依尔只要求在国际象棋的棋盘格上放置小麦粒,第一格放1粒,第二格放两粒,第三格放4粒,第四格放8粒,„„, 最后能有多少小麦粒呢? main()

{ float i ,s=1,t=1; for (i=1;i

printf("s=%f\n",s);}

3.打印水仙花数,即一个三位数各位上的数字之和等于它本身,如:153=13+53+33 。 main()

{int k1,k2,k3,i; for (k1=1;k1

{ i=k1*k1*k1+k2*k2*k2+k3*k3*k3;

if (i==k1*100+k2*10+k3)

printf("\n%d=%d^3+%d^3+%d^3",i,k1,k2,k3); }}

4.编制电视歌手大奖赛评分程序,要求评委人数和每位评委的打分从键盘输入,去掉一个最高分,再去掉一个最低分,求评委给出的最后得分。 main()/* TV大奖赛 */ {int n,i=1;

float x,max,min,sum=0;

printf("\nPlease input the number of score:"); scanf("%d",&n);

printf("\nInput score:"); scanf("%f",&x); max=x;min=x;sum=x; while (i

scanf("%f",&x); sum+=x;

if (max

printf("The last score is%8.2f\n",sum);}

5.打印下列图形。

* * * * *

* * * * * * * * * * * * * * * * * * * * main() { int i,j;

for (i=1;i

第六章 数组

printf ( " "); printf (" *"); printf("\n"); }}

for (j=1;j

D A D A A C C A D

二、程序阅读题

13 13 13 13 13 13 三、上机实训题

1、分别用冒泡法和选择排序法对十个随机整数进行排序。 参考教材

2、编写一个程序计算字符串中值为x (x 由键盘输入)的字符个数。 #include "stdio.h" #include "string.h" main()

{ char a[20],x; int n=0,i=0;

printf("\nPlease input string,end of enter key: "); gets(a);

printf("\nPlease input x:"); x=getchar(); while(a[i]!='\0') {if (a[i]==x) n++; i++; }

printf("\n%d",n); }

if(x[i]>ave) printf("%f ",x[i]); }

3、编写一个程序判定用户输入的正数是否为“回文数”,所谓回文数是指数正读反读都相同。

#include main()

{ int buffer[10],i,k,b; long number,n;

printf("input a positive number:"); scanf("%ld",&number); k=0; n=number; do

{ buffer[k]=n%10; k=k+1;

n=n/10; } while(n!=0); b=1;

for(i=0;i

if(buffer[i]!=buffer[k-1-i]) b=0; if(b) printf("%ld is huiwenshu\n",number);

else printf("%ld is not huiwenshu\n",number); } 4、求二维数组的周边元素之和 #include main() {

int a[3][3]={{3,-2,1,2},{0,1,3,-2},{3,1,0,4}}; int i,j,sum=0; for(i=0;i

if (i==0||j==0||j==2||i==2) sum=sum+a[i][i]; printf("%d",sum); }

5、编写程序找出一个二维数组的鞍点。即该位置上的元素在该行最大,但是在该列最小。 main()

{ int i,j,k,max,maxi,maxj,flag1,flag2; int a[2][3]={{1,2,3},{4,5,6}}; flag2=0;

for (i=0;i

if (a[i][j]>max) { max=a[i][j]; maxj=j;} if (a[k][maxj]

(flag1)

{printf("\n

%d

is

answer,locate:line

%d

for (k=0,flag1=1;k

项目实训:

1、评定奥运会某参赛选手的成绩。设某参赛选手的某项目有8位评委,要求去掉一个最高分和一个最低分,给出其最后得分。

#include

colum %d\n",max,i,maxj);

flag2=1; } }

if (!flag2) printf("\n no answer!"); }

*/ main() {

int x[N],i,max,min,score=0;

printf("Please input %d integers:\n",N); /*输入N 个数,存入数组中*/ for(i=0;i

{ scanf("%d",&x[i]); score+=x[i];} /*赋初值*/

max=min=x[0]; 默认为最大或最小值*/ for(i=1;i

if(maxx[i]) min=x[i]; }

printf("The last score is : %d\n",(score-max-min)/(N-2); }

/*求最大值*/ /*求最小值*/

/*将第一个数

/*定义字

2、

打印出以下杨辉三角形(要求打印出10行)。

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 „ „ „ „ #define N 11 main()

{ int i,j,a[N][N]; for (i=1;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for (i=1;i

#define N 11 main() {

int i,j,a[N][N]; for(i=1;i

a[i][i]=1; a[i][1]=1; }

for(i=3;i

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;i

for(j=1;j

printf("\n"); }

本程序的运行结果为:

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1

3、一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不用strcpy 函数。拷贝时,‘\0’也要拷贝过去。‘\0’后面的字符不拷贝。

解:

#include "stdio.h" main() {

char from[80],to[80];

int i;

printf("Input string:"); scanf("%s",from);

for(i=0;i

printf("the result: %s\n",to); }

本程序的运行结果为:

the result:Input string:student

第七章 函数 一、选择题

B D C B B D A A D 三、编程题

1、写一个判定偶数的函数,在主函数中输入一个整数,输出是否是偶数的信息。 int even(x) int x ;

{ if (x%2==0) return(1); else return(0); } main() { int x;

scanf("%d",&x);

if (even(x)) printf("x is even."); else printf("x is not even.");}

2、统计 400~499 这些数中 4 这个数字出现的次数,要求判断一个数有几位4这个数字用函数实现。 main()

{ int i,k=0;

for(i=400;i

printf ("number=%d\n",k); } num(x) int x; { int y,k=0; while(x!=0) if(y= = 4) k++;

{ y=x%10;

x=x/10; } return(k);} main()

项目实训:

1、已有变量定义和函数调用语句:int x=57;isprime (x);函数isprime ( )用来判断一个整型数a 是否为素数,若是素数,函数返回1,否则返回0。请编写isprime 函数。

isprime (int a) { } 解: main() { int x=57; int isprime(int);

if (isprime(x)) printf(“%d is prime.”,x); else printf(“%d is not prime.”,x); }

isprime (int a)

{int i;

for(i=2;i

return 1;}

2、

3、找出1000之内的所有“完数”,要求判断一个数是否为完数用函数实现。

{ int i;

for (i=1;i

if (wan(i)) printf ("%5d",i); printf ("\n"); } wan(x) int x; { int i,k; k=0;

for (i=1;i

输入10个学生的成绩,分别用函数实现: (1)求平均成绩; (2)按分数高低进行排序并输出。 解:main( )

{float average(float b[]); void sort(float b[]); float a[10],j,aver; printf("input 10:"); for(j=0;j

printf("aver=%.2f\n",aver); sort(a);

for(j=0;j

float average(float b[ ]) {int j; float sum=0,aver; for(j=0;j

void sort(float b[ ]) {int i,j,max,k; for(i=0;i

本程序运行结果为:

input 10:45 12 86 85 79 84 85 96 45 89 (输入) aver=70.60

96.00 89.00 86.00 85.00 79.00 45.00 45.00 12.00

85.00 84.00

第8章 指针

一、选择题

D A C C(D) D C D

二、填空题 1. m 2. 指针数组名 3. ABCDCD 4.49 5. 25

三、程序设计题

(1)main()

{

int a,b,c,*p1,*p2,*p3;

scanf("%d,%d,%d",&a,&b,&c);

p1=&a;

p2=&b;

p3=&c;

if(*p1

if(*p3

printf("\nmax=%d\n",max);

}

程序结果:

9,0,10

max=10

(2)#include

main()

{int a[10],*p,i,t;

p=a;

for(i=0;i

scanf("%d",p+i);

for(i=0;i

{t=*(p+i);*(p+i)=*(p+9-i);*(p+9-i)=t;}

for(i=0;i

printf("%5d",*(p+i));

printf("\n");

}

(3)#include

main()

{ char str[80],*p,i,len=0;

p=str;

gets(p);

for(i=0;*(p+i)!='\0';i++)

len++;

21

printf("len=%d\n",len);

}

项目实训题目:

#include

char *link(char *p1,int M,char *p2,int N)

{ int i,j;

for(i=0;i

if(*(p1+i)=='\0')

break;

for(j=0;j

if(*(p2+j)!='\0')

*(p1+(i++))=*(p2+j);

else

break;

*(p1+i)='\0';

return(p1);

}

main()

{

char str1[80],str2[20],*p;

gets(str1);

gets(str2);

p=link(str1,80,str2,20);

puts(p);

}

第9章 结构体共同体和枚举类型

程序设计题

1.定义一个结构体变量来表示日期(包括年、月、日),并编程来计算某一日期是本年的第几天,注意考虑闰年的问题。

解:struct

{ int year;

int month;

int day;

}date;

main()

{ int days;

22

printf("Please input date:(year,month,day)");

scanf("%d,%d,%d",&date.year,&date.month,&date.day);

switch(date.month)

{ case 1:days=date.day; break;

case 2:days=date.day+31; break;

case 3:days=date.day+59; break;

case 4:days=date.day+90; break;

case 5:days=date.day+120; break;

case 6:days=date.day+151; break;

case 7:days=date.day+181; break;

case 8:days=date.day+212; break;

case 9:days=date.day+243; break;

case 10:days=date.day+273; break;

case 11:days=date.day+304; break;

case 12:days=date.day+334; break;

}

if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3)

days+=1;

printf("\n%dmonth

}

本程序运行结果为:

Please input date:(year,month,day)2000,3,1

3month 1day is 61 day of 2000.

2、有10名学生,每个学生包括学号、姓名、3科成绩,编程序求每个学生的平均成绩,并打印最高分学生的信息。

#define N 4

main( )

{struct student

{int num; char name[15]; float c[3]; float ave; %dday is %d day of %d.",date.month,date.day,days,date.year); };

struct student stu[N];

struct student *p[N],*t;

23

int i,j,k; float x1,x2,x3;

for(i=0;i

{scanf("%d%s%f%f",&stu[i].num,stu[i].name,&x1,&x2,&x3);

stu[i].c[0]=x1; stu[i].c[1]=x2; stu[i].c[2]=x3;

k=0;

for(j=0;j

k=k+stu[i].c[j];

stu[i].ave=k/3.0;

p[i]=&stu[i];

}

/*排序-由大到小*/

for(i=0;i

for(j=i+1;j

if(p[j]->ave

ave)

{t=p[j];p[j]=p[i];p[i]=t;}

printf(“%5d%15s%3d%3d%6.1f\n”, p[0]->num,p[i]->name,

p[0]->c[1],p[0]->c[2]);

}

3、建立一个3名学生数据的单链表。

解:#define NULL 0

#define LEN sizeof(struct student)

struct student

{ int no;

struct student *next;

};

struct student *head;

struct student *creat()

{ struct student *p,*q;

int n,i;

printf("how many:");

scanf("%d",&n);

for(i=0;i

{ p=( struct student *)malloc(LEN);

printf("NO:"); scanf("%d",&p->no);

if(i==0) head=p;

else q->next=p;

q=p;

}

24 p[0]->c[0],

p->next=NULL;

return(head);

}

print (struct student * head )

{ struct student *p;

p=head;

while(p!=NULL)

{ printf("%6d ",p->no);

p=p->next;

}

}

main()

{ struct student * head;

head= creat();

print(head);

}

本程序运行结果为:

how many:5

NO:12

NO:78

NO:98

NO:45

NO:75 (以上为输入)

12 78 98 45 75

实训题

(1)图书馆的图书检索上包括:书名、作者姓名、出版日期、登录号、书价等内容。试根据上述五项内容定义一个结构体类型,声明结构体变量book ,再从键盘为变量book 输入数据,并从屏幕输出数据。

(2)构体数组(可以使用链表),将5名考生数据输入计算机,并列表从屏幕输

出。编写函数,通过调用函数实现:

a . 找出成绩最高的考生的有关信息,并在屏幕上输出。

b . 按考生准考证号码由大到小排序。

考生数据包括:准考证号码、姓名、性别、年龄、成绩。

解:(1) struct

{ char name[20];

25

char author[20];

char date[10];

int loadno;

float price;

}book;

main()

{printf("enter bookname author date loadno price:\n");

scanf("%s %s %s %d %f",&book.name,&book.author,\

&book.date,&book.loadno,&book.price);

printf("bookname author date loadno price:\n");

printf("%-10s %-10s %-10s %-6d %-6.2f",book.name,book.author,\

book.date,book.loadno,book.price);

}

本程序结果是:

enter bookname author date loadno price:

c tanhaoqiang 1982.6 119 30.00

bookname author date loadno price:

C tanhaoqiang 1982.6 119 30.00

(2)

struct student

{int number;

char name[10];

char sex;

int age;

float score;

}st[5];

input_sc(s)

struct student s[];

{ int i,j;

float h;

for(i=0;i

{

printf("Please input number, sex ,age, score ,name:\n");

scanf("%d,%c,%d,%f,%s",&s[i].number,&s[i].sex,&s[i].age,&h,s[i].name); s[i].score=h;

26

}

}

output_sc(s)

struct student s[];

{int i;

printf("number name sex age score:\n"); for(i=0;i

{

printf("%-8d",s[i].number);

printf("%-4s",s[i].name);

printf("%-5c",s[i].sex);

printf("%-5d",s[i].age);

printf("%-7f",s[i].score);

printf("\n");

}

}

max_st(s)

struct student s[];

{ int i,max=0,k=0;

for(i=0;i

if(max

max=s[i].score;

printf("max is :\n");

for(i=0;i

if(s[i].score==max)

{

printf("%-8d",s[i].number);

printf("%-4s",s[i].name);

printf("%-5c",s[i].sex);

printf("%-5d",s[i].age);

printf("%-7f",s[i].score);

printf("\n");

}

}

sort(s)

struct student s[];

{ int i,j,n,m;

char a[10],c;

27

float t;

for(i=0;i

for(j=0;j

if(s[j].score>s[j+1].score)

{n=s[j].number;

strcpy(a,s[j].name);

c=s[j].sex;

m=s[j].age;

t=s[j].score;

s[j].number=s[j+1].number;

strcpy(s[j].name,s[j+1].name);

s[j].sex=s[j+1].sex;

s[j].age=s[j+1].age;

s[j].score=s[j+1].score;

s[j+1].number=n;

strcpy(s[j+1].name,a);

s[j+1].sex=c;

s[j+1].age=m;

s[j+1].score=t;

}

}

main()

{ int i;

struct student st[5];

clrscr();

input_sc(st);

output_sc(st);

max_st(st);

sort(st);

printf("form big to small:\n");

output_sc(st);

}

本程序结果是:

Please input number, sex ,age, score ,name:

1,m,23,90,li

Please input number, sex ,age, score ,name:

2,n,22,89,liu

Please input number, sex ,age, score ,name:

28

3,m,23,99,wu

Please input number, sex ,age, score ,name:

4,m,22,99,guo

Please input number, sex ,age, score ,name:

5,n,22,78,zhu

number name sex age score:

1 li m 23 90.000000

2 liu n 22 89.000000

3 wu m 23 99.000000

4 guo m 22 99.000000

5 zhu n 22 78.000000

max is :

3 wu m 23 99.000000

4 guo m 22 99.000000

form big to small:

number name sex age score:

5 zhu n 22 78.000000

2 liu n 22 89.000000

1 li m 23 90.000000

3 wu m 23 99.000000

4 guo m 22 99.000000

(3) type test.txt

第10章 文件

程序设计题

1.写一个程序,建立一个abc 文本文件,向其中写入“spring summer fall winter ”字符串,然后显示该文件的内容。

解:#include

#include

main( )

{FILE *fp;

char msg[ ]=" spring summer fall winter ";

char buf[30];

if((fp=fopen("abc.txt","w+"))==NULL)

{printf("can not creat abc file\n");

exit(1);

}

29

fwrite(msg,strlen(msg)+1,1,fp);

fseek(fp,SEEK_SET,0);

fread(buf,strlen(msg)+1,1,fp);

printf("%s\n",buf);

fclose(fp);

}

2. 编写一个程序对打开文件test.txt ,统计该文件中字符的个数。

解:#include "stdio.h"

#define NULL 0

void main()

{FILE *fp1;

int total=0;

if((fp1=fopen(“test.txt”,"r"))==NULL)

{printf("Cannot open test.txt.\n”);

exit(1); }

else

{ while((c=fgetc(fp1))!=EOF)

if(c>='0'&&c

total++;

printf("\nThere are %d character .\n",total);

fclose(fp1);

} }

项目实训题

编写一个程序对ASCII 文件test.txt 中得字符做一个统计,统计该文件中字母、

数字和其他字符的个数。输出统计结果分别到屏幕和文件result.txt 。test.txt 文件名由命令行参数输入。例如,假设C 源程序的可执行文

件名为count.exe , 则命令行count test.txt表示对文件test.txt

进行统计。

解:#include "stdio.h"

#define NULL 0

#include "process.h"

void main(int argc,char *argv[])

{FILE *fp1,*fp2;

int digital,character,other;

char c;

digital=0;character=0;other=0;

if(argc!=2)

30

exit(1);

}

else

if((fp1=fopen(argv[1],"r"))==NULL)

{printf("Cannot open %s\n",argv[1]);

exit(1);

}

else

{while((c=fgetc(fp1))!=EOF)

{if(c>='0'&&c

digital++;

else if(c>='a'&&c='A'&&c

character++;

else

other++; }

if((fp2=fopen("result.txt","w"))==NULL)

{printf("file %s open error\n","result.txt"); exit(1);

}

fputs("There are ",fp2);

fprintf(fp2,"%d ",digital);

fputs("digital ",fp2);

fprintf(fp2,"%d ",character);

fputs("character and ",fp2);

fprintf(fp2,"%d ",other);

fputs("other.\n",fp2);

printf("\nThere are %d digital %d character and %d other.\n",\ digital,character,other);

fclose(fp1);

fclose(fp2);

}

}

在DOS 下使用命令:

count test.txt

屏幕显示:

There are 4 digital 5 character and 4 other.

result.txt 文件中显示与屏幕一致!

31


相关文章

  • 钠与水的教案
  • 合肥师范学院 <钠与水反应>教案 院系: 化学与化学工程学院 专业: 化学师范 姓名: 吴晶晶 学号: 1409410009 化学一第三章第1节金属的化学性质--<钠与水反应>教案 一.教材分析 金属与水的反应属于人 ...查看


  • 化学实验基本方法(教案)
  • 第一章 第一节 化学实验基本方法(第一课时) [教学目标] 知识与技能 ⑴ 树立安全意识,能识别化学品安全使用标识,初步形成良好的实验工作习惯. ⑵ 知道现实生活中常见的一些混合物分离和提纯的方法,用已有的生活经验使学生加 深对混合物分离. ...查看


  • 初三化学第一单元课题3[走进化学实验室]教案
  • 初三化学第一单元课题3<走进化学实验室>教案 第1课时 一.学习目标 1.知道化学实验室的规则和实验室药品取用规则. 2.熟悉初中化学实验常用仪器的名称.用途和掌握使用方法. 重点难点:化学实验室的规则和常用仪器的名称.用途和使 ...查看


  • 七年级生物教案根对无机盐的吸收
  • 七年级生物教案根对无机盐的吸收 来源:考试大 2007/2/10 [考试大:中国教育考试第一门户] 模拟考场 视频课程 字号:T T 教学目标 知识目标 1.通过根吸收无机盐的演示实验,使学生明白植物在生活过程中不仅需要水,而且还需要无机盐 ...查看


  • 九年级化学氧气的制法教案
  • 初三化学教案:氧气的制法教案 教学目的 知识:掌握实验制取氧气的反应原理:理解分解反应及其化合反应的区别:了解氧气的工业制法:了解催化剂和催化作用的概念. 能力:初步培养学生的实验操作能力.观察能力和思维能力.初步培养学生分析.对比和迁移知 ...查看


  • [化学实验室之旅]教案 (2)
  • 化学实验室之旅 教案 教学课题:1.2化学实验室之旅 教材分析: 化学是以实验为基础的一门自然科学,本节课从内容上看,本课题共由两部分组成:认识常见仪器和化学实验基 本操作.在知识展现然后引导学生进行药品的取用.加热和洗涤仪器等基本操作训练 ...查看


  • 电解水的实验教案初中化学
  • 电解水的实验教案一.教学目标1,由已有知识让学生掌握水的化学性质.电解水的实验原理和基本的实验操作.2,让学生了解电解水的实验操作过程和现象,并学会分析实验结果.3,让学生加强理解水的组成部分及其比例,氢气和氧气的性质.二.导入新课(提问) ...查看


  • 1.1.1物质的变化教案
  • 第一单元 走进化学世界 §1.1.1 物质的变化 一.教学内容:物质的变化(化学变化和物理变化) 二.单元知识架构图 走 进 化 学 世 界 物 质 的 变 化 四.学习目标 1.; 2.能运用物理变化和化学变化的概念判断一些易分辨的物理变 ...查看


  • 中学化学教师实验创新大赛教案2013
  • 氧气的化学性质的实验装置的创新 大树坳中学 参赛教师: 薛辉 执教时间:9月26日 1.实验在教材中所处的地位与作用: 本课题是人教版上册第二单元课题二,教材介绍了氧气的性质和一类重要的化学反应-化合反应,通过氧气所发生的一些具体的化学反应 ...查看


  • [化学反应的限度]参考教案
  • 第三节 化学反应的速率和限度 第二课时 三维目标 知识与技能 1. 理解可逆反应.化学反应平衡的概念,化学反应限度的本质原因及外部特征. 2. 学习实验研究的方法,能设计并完成一些化学实验,通过实验探究形成化学平衡的概念机化学反应限度的概念 ...查看


热门内容