您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页C语言程序设计(第2版)-- 课后题答案.

C语言程序设计(第2版)-- 课后题答案.

来源:筏尚旅游网


《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=3000

第2章 编制C程序的基础知识 一 选择题 C B A B A C C 二 操作题

2 1. 3,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\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\(2)main()

{ int a=2,b=3; float x=3.5,y=2.5;

printf(\"%f\\n\

第三章 顺序结构程序设计 一 选择题 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\ yfgz=sj*gz*0.9;

printf(\"total salary:%f\\n\}

本程序运行结果为:

time,salary:4,3 total salary:10.800000

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

#include main() { char c;

printf(\"Input a string:\"); scanf(\"%c\

printf(\"%c ASCII is %d\\n\}

本程序运行结果为:

Input a string:a a ASCII is 97

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

3

3

4 钱数,再输入顾客付款数,打印出应找的钱数。 解: main() {

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

printf(\"apple,pear,banana,orange(weight)=\"); scanf(\"%f,%f,%f,%f\ys=2.5*p+1.8*y+2*x+1.6*j; printf(\"fu kuan=\"); scanf(\"%f\fk=g-ys;

printf(\"result:\\n\");

printf(\"fukuan=%6.2fyuan\\nshoukuan=%6.2fyuan\\nzhaohui=%6.2fyuan\\n\

,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\ deposit=capital*pow(1+rate,n); printf(\"deposit=%f\\n\

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

main() { int n,a,b,c; scanf(\"%3d\ a=n/100;

4

b=n%100/10; c=n%100%10/1;

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

第四章 选择结构程序设计 一、略

二、B B A B C B A 三、1. 1 0

2. 2 3 2 2 3. 10 20 0

4. ch>=’A’&&ch<=’Z’||ch>=’a’&&ch<=’z’ ch>=’0’&&ch<=’9’ ch==’ ’ 5. -1 四、上机操作

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

#include main() {char ch; ch=getchar();

if(ch>='A'&&ch<='Z') ch+=32; else if(ch>='a'&&ch<='z') ch-=32; putchar(ch); putchar('\\n'); }

2. 根据输入的x值依据下列表达式,计算y的值。 2x (x>-1) y = 3 (x=-1) 4+x (x<-1) 解: main() {

float x,y; scanf(\"%f\

5

5

6 if(x>-1) y=2*x; else if(x==1) y=3;

else y=4+x; printf(\"y=%f\}

本程序运行结果为: -2 y=2.000000

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

若是偶数,输出“Is Even“。

main() { int x; scanf(\"%d\

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\

if(fabs(a)<=1e-6) printf(\" The equation is not a quadratic\\n\"); else

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

if(fabs(disc)< 1e-6) printf(\"x1=x2=%8.4f\\n\ 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\ else { p=-b/(2*a);

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

printf(\"%8.4f+%x8.4fi\\n\ printf(\"%8.4f-%8.4fi\\n\

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

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

6

2

解:

#include main() {

float w,f,x; printf(\"weight:\"); scanf(\"%f\ if(w<=50) x=0.15*w; else

x=0.15*50+0.22*(w-50); printf(\"money:%6.2f yuan\\n\}

本程序运行结果为: weight:20 money:3.00 yuan weight:60 money:9.70 yuan

6. 某商场给与顾客购物的折扣率如下: 购物金额<200元 不打折 500元>购物金额>=200元 9折 1000元>购物金额>=500元 8折 购物金额>=1000元 7.5折

输入一个购物金额,输出打折率、购物实际付款金额。 #include main()

{ float x,y,realx; scanf(\"%f\

if(x<=0) { printf(\"Error! You input a worry number!\\n\"); y=0;} else

{ if(x<200) y=1.0; else if(x<500) y=0.9; else if(x<1000) y=0.8; else y=0.75;} if(y!=0) {realx=x*y;

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

7

7

8 项目实训

某托儿所收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\

if(age>6||age<2) printf(\"Sorry,your baby can't enter!\"); else switch(age); {case 2:

case 3: printf(\"age:%d,enter Lower class\\n\ case 4: printf(\"age:%d,enter Middle class\\n\ case 5:

case 6: printf(\"age:%d,enter Higher class\

第五章 循环结构程序设计 一、选择题 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<=100;i+=2) sum=sum+i;

printf(\"sum=%d\}

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

{ float sum=0,score,ave; int n=0;

scanf(\"%f\ while(score>0) { n++;

8

sum=sum+score; scanf(\"%f\ ave=sum/n;

printf(\"\\nThe average score is%.2f\

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

#include \"stdio.h\" main() { char ch;

int cha=0,space=0,digit=0,other=0; while((ch=getchar())!='@')

{ if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') cha++; else if (ch==' ') space++;

else if (ch>='0'&&ch<='9') digit++; else other++; }

printf(\"\\ncha=%d,space=%d,digit=%d,other=%d\4.一张纸的厚度为0.1毫米,珠穆琅玛峰的高度为8848.13米,假如纸张有足够大,将纸对折多少次后可以超过珠峰的高度? main()

{ float h=8848.13,h0=0.0001,h1; int m=0; h1=h0; while(h0<=h) { h0=2*h0;

printf(\"\\n m=%d,high=%f\ m++; }

printf(\"\\n m=%d\\n\

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

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

解:

#include main() {

int i,j,a,b,c,d; for(i=32;i<=99;i++) { j=i*i; a=j/1000;

9

9

10 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 \ } }

本程序运行结果为: 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=27

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

少。 解:

#include main() {

int x,y,z,i; for(x=1;x<=9;x++) for(y=1;y<=9;y++) for(z=0;z<=9;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=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=997

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

printf(\"Please input an odd data(>=6):\"); scanf(\"%d\ for(p=3;p<=x/2;p+=2) {k1=k2=1;

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

for(i=2;iif(k1==1&&k2==1) printf(\"%d=%d+%d\\n\

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

11 main()

11

12 { int i,j,k=0;

for (i=2;i<1000;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\

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

项目实训

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<=100;i++) sum=sum+1.0*s/i; printf(\"sum=%f\}

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

{ float i ,s=1,t=1; for (i=1;i<=63;i++) { t*=2; s+=t; }

printf(\"s=%f\\n\

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

{int k1,k2,k3,i; for (k1=1;k1<=9;k1++) for (k2=0;k2<=9;k2++) for (k3=0;k3<=9;k3++)

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

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

12

printf(\"\\n%d=%d^3+%d^3+%d^3\

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

float x,max,min,sum=0;

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

printf(\"\\nInput score:\"); scanf(\"%f\max=x;min=x;sum=x; while (iscanf(\"%f\ sum+=x;

if (maxprintf(\"The last score is%8.2f\\n\

5.打印下列图形。

* * * * *

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

for (i=1;i<=5;i++) { for (j=1;j<=5-i;j++)

第六章 数组

13

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

for (j=1;j<=5;j++)

14 一、选择题 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\

if(x[i]>ave) printf(\"%f \

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

#include main()

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

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

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

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

14

for(i=0;i<=(k-1)/2;i++)

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

else printf(\"%ld is not huiwenshu\\n\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<3;i++) for(j=0;j<3;j++) for(i=0;i<3;i++)

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

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<2;i++) { max=a[i][0]; for (j=0;j<3;j++)

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<2 && flag1;k++) if

项目实训:

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

#include

15

15 colum %d\\n\

flag2=1; } }

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

#define N 10 16 符常量*/

main() {

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

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

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

printf(\"The last score is : %d\\n\ }

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

/*将第一个数

/*定义字

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;ia[i][j]=a[i-1][j-1]+a[i-1][j]; for (i=1;i16

#define N 11 main() {

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

for(i=3;ia[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;ifor(j=1;j<=i;j++) printf(\"%6d\ printf(\"\\n\"); }

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

17

17

18 int i;

printf(\"Input string:\"); scanf(\"%s\

for(i=0;i<=strlen(from);i++) to[i]=from[i];

printf(\"the result: %s\\n\}

本程序的运行结果为:

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\

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<=499;i++) k=k+num(i);

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

18

{ 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;ireturn 1;}

2、

19

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

{ int i;

for (i=1;i<1000;i++)

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

for (i=1;i<=x/2;i++) if (x%i= =0) k=k+i; if (k= =x) return (1); else return (0); }

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

{float average(float b[]); void sort(float b[]); float a[10],j,aver; printf(\"input 10:\"); for(j=0;j<10;j++) scanf(\"%f\ aver=average(a);

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

for(j=0;j<10;j++) printf(\"%10.2f\ }

float average(float b[ ]) {int j; float sum=0,aver; for(j=0;j<10;j++) sum=sum+b[j]; aver=sum/10.0; return(aver); }

void sort(float b[ ]) {int i,j,max,k; for(i=0;i<10;i++) {max=b[i]; k=i; for(j=i+1;j<10;j++) if(max本程序运行结果为:

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

96.00 .00 86.00 85.00 79.00 45.00 45.00 12.00

20

85.00 84.00

第8章 指针 一、选择题

D A C C(D) D C D

二、填空题 21 1. m 2. 指针数组名 3. ABCDCD 4.49 5. 25 三、程序设计题 (1)main()

{

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

scanf(\"%d,%d,%d\ p1=&a; p2=&b; p3=&c;

if(*p1<*p2) max=*p1 else max=*p2; if(*p3printf(\"\\nmax=%d\\n\}

程序结果:

9,0,10<回车> max=10

(2)#include main()

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

for(i=0;i<10;i++) scanf(\"%d\ for(i=0;i<5;i++)

{t=*(p+i);*(p+i)=*(p+9-i);*(p+9-i)=t;} for(i=0;i<10;i++) printf(\"%5d\ 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

22 printf(\"len=%d\\n\ }

项目实训题目: #include

char *link(char *p1,int M,char *p2,int N) { int i,j; for(i=0;ichar 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\ 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.\

23 };

struct student stu[N]; struct student *p[N],*t;

23

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

for(i=0;i{scanf(\"%d%s%f%f\ stu[i].c[0]=x1; stu[i].c[1]=x2; stu[i].c[2]=x3; k=0;

for(j=0;j<=2;j++) k=k+stu[i].c[j]; stu[i].ave=k/3.0; p[i]=&stu[i]; }

/*排序-由大到小*/ for(i=0;iaveave) {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\ for(i=0;i{ p=( struct student *)malloc(LEN); printf(\"NO:\"); scanf(\"%d\ 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=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

25

26 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.date,&book.loadno,&book.price);

printf(\"bookname author date loadno

price:\\n\");

printf(\"%-10s %-10s %-10s %-6d %-6.2f\

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<5;i++) {

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

scanf(\"%d,%c,%d,%f,%s\ s[i].score=h;

26

} }

output_sc(s) struct student s[]; {int i;

printf(\"number name sex age score:\\n\"); 27 for(i=0;i<5;i++) {

printf(\"%-8d\ printf(\"%-4s\ printf(\"%-5c\ printf(\"%-5d\ printf(\"%-7f\ printf(\"\\n\"); } } max_st(s)

struct student s[]; { int i,max=0,k=0; for(i=0;i<5;i++) if(maxprintf(\"%-8d\ printf(\"%-4s\ printf(\"%-5c\ printf(\"%-5d\ printf(\"%-7f\ printf(\"\\n\"); } } sort(s)

struct student s[]; { int i,j,n,m; char a[10],c;

27

28 float t;

for(i=0;i<5;i++) for(j=0;j<4;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,,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 .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 .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\ {printf(\"can not creat abc file\\n\"); exit(1); }

29

29

30 fwrite(msg,strlen(msg)+1,1,fp); fseek(fp,SEEK_SET,0);

fread(buf,strlen(msg)+1,1,fp); printf(\"%s\\n\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<='9') total++;

printf(\"\\nThere are %d character .\\n\ 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

{printf(\"Command error!You would enter like count test.txt!\"); exit(1); } else

if((fp1=fopen(argv[1],\"r\"))==NULL) {printf(\"Cannot open %s\\n\ exit(1); } else

{while((c=fgetc(fp1))!=EOF) {if(c>='0'&&c<='9') digital++;

else if(c>='a'&&c<='z'||c>='A'&&c<='Z') character++; else other++; }

if((fp2=fopen(\"result.txt\

{printf(\"file %s open error\\n\ exit(1); }

fputs(\"There are \ fprintf(fp2,\"%d \ fputs(\"digital \ fprintf(fp2,\"%d \ fputs(\"character and \ fprintf(fp2,\"%d \ fputs(\"other.\\n\

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

31

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务