谭浩强C程序设计(第三版)-习题答案

第一章、C语言概述

习题

1.1、根据自己的认识写出C语言的主要特点

1. 简洁紧凑、灵活方便。2. 运算符丰富。3. 数据结构丰富。4. C语言是结构式语言。5. C语言语法限制不太严格、程序设计自由度大。6. C语言允许直接访问物理地址,可以直接对硬件进行操作(因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件)。7. C语言程序生成代码质量高,程序执行效率高(一般只比汇编程序生成的目标代码效率低10へ20%)。8. C语言适用范围大,可移植性好(C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型)。

1.2、C语言的主要用途是什么?它和其他高级语言有什么不同?

C语言适合作为系统语言,既可用来编写系统软件,也可以用来编写应用软件。和其他高级语言相比,C语言语法具有很高的灵活性,C语言是面向过程的语言,也是比较底层的语言,代码质量高,所以用C语言写的程序运行效率相对较高,可执行性好,其可移植性也很好,用它写的程序只需做很少的修改甚至不用修改就可以在LINUX、UNIX等操作系统上运行。

1.3、写出一个C程序的构成

C程序是由函数构成的。

函数由两部分组成:

1、 函数的首部

2、 函数体(声明部分、执行部分)

1.4、C语言以函数为程序的基本单位有什么好处?

在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。

1.5、编写一个C程序输出以下信息:

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

                 Very good!

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

 

#include <stdio.h>

void main()

{

       pt1();

       pt2();

       pt1();

}

pt1()

{

       int i;

       for(i=0;i<30;i++)

       {

              printf("%c",42);

       }

       printf("\n");

       return 0;

}

pt2()

{

       int i;

       for(i=0;i<12;i++)

              printf("  ");

    printf("Verygood!\n");

       return 0;

}

1.6、编写一个C程序,输入a、b、c三个值,输出其中最大者。

#include <stdio.h>

main()

{

       int a,b,c;

       printf("pleaseput in three numbers:\n");

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

       bj(a,b,c);

}

int bj(float x,float y,float z)

{

       float temp;

       if(x>=y)

       {

              if(x>=z)

              {

                     printf("thebiggest one is:%g\n",x);

                     returnx;

              }

              else

              {

                     printf("thebiggest one is:%g\n",z);

                     returnz;

              }

       }

       else

       {

              if(y>=z)

              {

                     printf("thebiggest one is:%g\n",y);

                     returny;

              }

              else

              {

                     printf("thebiggest one is:%g\n",z);

                     returnz;

              }

       }

}

已标记关键词 清除标记
相关推荐
图书目录编辑 第一章:程序设计和C语言   1.1什么是计算机程序   1.2什么是计算机语言   1.3C语言的发展及其特点   1.4最简单的C语言程序   1.4.1最简单的C语言程序举例   1.4.2C语言程序的结构   1.5运行C程序的步骤与方法   1.6程序设计的任务   习题 第2章:算法——程序的灵魂 2.1什么是算法 2.2简单的算法举例 2.3算法的特性   2.4怎样表示一个算法   2.4.1;用自然语言表示算法 2.4.2用流程图表示算法 2.4.3三种基本结构和改进的流程图   2.4.4用N-S流程图表示算法   2.4.5用伪代码表示算法   2.4.6用计算机语言表示算法   2.5结构化程序设计方法   习题 第3章:简单的C程序设计——顺序程序设计 3.1顺序程序设计举例   3.2数据的表现形式及其运算   3.2.1常量和变量   3.2.2数据类型   3.2.3整型数据   3.2.4字符型数据   3.2.5浮点型数据   3.2.6怎样确定常量的类型   3.2.7运算符和表达式   3.3C语句   3.3.1C语句的作用和分类   3.3.2最基本的语句——赋值语句   3.4数据的输入输出   3.4.1输入输出举例   3.4.2有关数据输入输出的概念   3.4.3用printf函数输出数据   3.4.4用scanf函数输入数据   3.4.5字符数据的输入输出   习题 第4章:选择结构程序设计 4.1选择结构和条件判断   4.2用if语句实现选择结构   4.2.1用if语句处理选择结构举例   4.2.2if语句的一般形式   4.3关系运算符和关系表达式   4.3.1关系运算符及其优先次序   4.3.2关系表达式   4.4逻辑运算符和逻辑表达式   4.4.1逻辑运算符及其优先次序   4.4.2逻辑表达式   4.4.3逻辑型变量   4.5条件运算符和条件表达式   4.6选择结构的嵌套   4.7用switch语句实现多分支选择结构   4.8选择结构程序综合举例   习题 第5章;循环结构程序设计 5.1为什么需要循环控制 5.2用while语句实现循环   5.3用do…while语句实现循环   5.4用for 语句实现循环   5.5循环的嵌套   5.6几种循环的比较   5.7改变循环执行的状态   5.7.1用break语句提前终止循环   5.7.2用continue语句提前结束本次循环   5.7.3break语句和continue语句的区别   5.8循环程序举例   习题 第6章;利用数组处理批量数据 6.1.怎样定义和引用一维数组   6.1.1怎样定义一维数组   6.1.2怎样引用一维数组元素   6.1.3一维数组的初始化   6.1.4一维数组程序举例   6.2.怎样定义和引用二维数组   6.2.1怎样定义二维数组   6.2.2怎样引用二维数组的元素   6.2.3二维数组的初始化   6.2.4二维数组程序举例   6.3.字符数组 6.3.1怎样定义字符数组   6.3.2字符数组的初始化   6.3.3怎样引用字符数组中的元素   6.3.4字符串和字符串结束标志   6.3.5字符数组的输入输出   6.3.6使用字符串处理函数   6.3.7字符数组应用举例   习题 第7章:用函数实现模块化程序设计 7.1为什么要用函数   7.2怎样定义函数   7.2.1为什么要定义函数   7.2.2定义函数的方法   7.3调用函数174   7.3.1函数调用的形式   7.3.2函数调用时的数据传递   7.3.3函数调用的过程   7.3.4函数的返回值   7.4对被调用函数的声明和函数原型   7.5函数的嵌套调用   7.6函数的递归调用   7.7数组作为函数参数   7.7.1数组元素作函数实参   7.7.2数组名作函数参数   7.7.3多维数组名作函数参数   7.8局部变量和全局变量   7.8.1局部变量   7.8.2全局变量   7.9变量的存储方式和生存期   7.9.1动态存储方式与静态存储方式   7.9.2局部变量的存储类别   7.9.3全局变量的存储类别   7.9.4存储类别小结   7.10关于变量的声明和定义   7.11内部函数和外部函数   7.11.1内部函数   7.11.2外部函数   习题 第8章;善于利用指针 8.1指针是什么   8.2指针变量 8.2.1使用指针变量的例子   8.2.2怎样定义指针变量   8.2.3怎样引用指针变量   8.2.4指针变量作为函数参数   8.3通过指针引用数组   8.3.1数组元素的指针   8.3.2在引用数组元素时指针的运算   8.3.3通过指针引用数组元素   8.3.4用数组名作函数参数   8.3.5通过指针引用多维数组   8.4通过指针引用字符串   8.4.1字符串的引用方式   8.4.2字符指针作函数参数   8.4.3使用字符指针变量和字符数组的比较   8.5指向函数的指针   8.5.1什么是函数指针   8.5.2用函数指针变量调用函数   8.5.3怎样定义和使用指向函数的指针变量   8.5.4用指向函数的指针作函数参数   8.6返回指针值的函数   8.7指针数组和多重指针   8.7.1什么是指针数组   8.7.2指向指针数据的指针   8.7.3指针数组作main函数的形参   8.8动态内存分配与指向它的指针变量   8.8.1什么是内存的动态分配   8.8.2怎样建立内存的动态分配   8.8.3void指针类型   8.9有关指针的小结   习题 第9章;用户自己建立数据类型 9.1定义和使用结构体变量   9.1.1自己建立结构体类型   9.1.2定义结构体类型变量   9.1.3结构体变量的初始化和引用   9.2使用结构体数组   9.2.1定义结构体数组   9.2.2结构体数组的应用举例   9.3结构体指针   9.3.1指向结构体变量的指针   9.3.2指向结构体数组的指针   9.3.3用结构体变量和结构体变量的指针作函数参数   9.4用指针处理链表   9.4.1什么是链表   9.4.2建立简单的静态链表   9.4.3建立动态链表   9.4.4输出链表   9.5共用体类型   9.5.1什么是共用体类型   9.5.2引用共用体变量的方式   9.5.3共用体类型数据的特点   9.6使用枚举类型   9.7用typedef声明新类型名   习题 第10章;对文件的输入输出 10.1C文件的有关基本知识   10.1.1什么是文件   10.1.2文件名   10.1.3文件的分类   10.1.4文件缓冲区   10.1.5文件类型指针   10.2打开与关闭文件   10.2.1用fopen函数打开数据文件   10.2.2用fclose函数关闭数据文件   10.3顺序读写数据文件   10.3.1怎样向文件读写字符   10.3.2怎样向文件读写一个字符串   10.3.3用格式化的方式读写文件   10.3.4用二进制方式向文件读写一组数据   10.4随机读写数据文件   10.4.1文件位置标记及其定位   10.4.2随机读写   10.5文件读写的出错检测   习题
1. 5请参照本章例题,编写一个C程序,输出以下信息: ************************** Very Good! ************************** 解: mian() {printf(“**************************”); printf(“\n”); printf(“Very Good!\n”); printf(“\n”); printf(“**************************”); } 1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。 解: mian() {int a,b,c,max; printf(“请输入三个数a,b,c:\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max<b) max=b; if(max<c) max=c; printf(“最大数为:“%d”,max); } 第三章 3.6写出以下程序运行的结果。 main() {char c1=’a’,c2=’b’,c3=’c’,c4=’\101’,c5=’\116’; printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3); printf(“\t\b%c %c”,c4,c5); } 解: aaㄩbbㄩㄩㄩccㄩㄩㄩㄩㄩㄩabc AㄩN 3.7 要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。 解: #include <stdio.h> main() { char c1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’; c1+=4; c2+=4; c3+=4; c4+=4; c5+=4; printf("密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5); } 运行结果: 密码是Glmre 3.9求下面算术表达式的值。 (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)2.5 (2)3.5 3.10写出程序运行的结果。 main() {int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(“%d,%d,%d,%d”,i,j,m,n); } 解: 9,11,9,10 3.12 写出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 (1)a+=a (2) a-=2 (3) a*=2+3 (4)a/=a+a (5) a%=(n%=2),n的值等于5 (6)a+=a-=a*=a 解: (1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0 第四章 4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 a=_3_ _b=_4_ _c=_5 x=1.200000,y=2.400000,z=-3.600000 x+y=_3.600_ _y+z=-1.20_ _z+x=-2.40 c1=ˊaˊ_or_97(ASCII) c2=ˊbˊ_or_98(ASCII) main() {int a=3,b=4,c=5; long int u=51274,n=128765; float x=1.2,y=2.4,z=3.6; char c1=’a’,c2=’b’; printf("a=%2d b=%2d c=%2d\n",a,b,c); printf("x=%f,y=%f,z=%f\n",x,y,z); printf("x+y=%5.2f y+z=%5.2f z+x=%5.2f\n",x+y,y+z,z+x); printf("u=%6ld n=%9ld\n",u,n); printf("%s %s %d%s\n","c1=’a’","or",c1,"(ASCII)"); printf("%s %s %d%s\n","c2=’a’","or",c2,"(ASCII)"); } 4.7用scanf下面的函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=ˊAˊ,c2=ˊaˊ,问在键盘上如何输入? main() { int a,b;float x,y;char c1c2; scanf("a=%d_b=%d",&a,&b); scanf("_x=%f_y=%e",&x,&y); scanf("_c1=%c_c2=%c",&c1,&c2); } a=3_b=7 _x=8.5_y=71.82 _c1=A_c2=a 4.8设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 main() {float r,h,C1,Sa,Sb,Va,Vb; scanf("%f,%f",&r,&h); C1=2*3.14*r; Sa=3.14*r*r; Sb=4*Sa; Va=4*3.14*r*r*r/3; Vb=Sa*h; printf("C1=%.2f\n",C1); printf("Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n",Sa,Sb,Va,Vb); } 4.9输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。 main() {float F,c; scanf("%f",&F); c=5*(F-32)/9; printf("c=%.2f",c); } 4.10编程序,用getchar函数读入两个字符给c1、c2,然后分别用函数和函数输出这两个字符。并思考以下问题:(1)变量c1、c2应定义为字符型或整形?抑二者皆可?(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?(3)整形变量与字符变量是否在任何情况下都可以互相代替?如: char c1,c2; 与 int c1,c2; 是否无条件的等价? #include"stdio.h" main() {char c1,c2; c1=getchar();c2=getchar(); putchar(c1);putchar(’\n’);putchar(c2);putchar(’\n’); } #include"stdio.h" main() {char c1,c2; c1=getchar();c2=getchar(); printf("c1=%d c2=%d\n",c1,c2); printf("c1=%c c2=%c\n",c1,c2); } 第五章 5.1 什么是算术运算?什么是关系运算?什么是逻辑运算? 解:略。 5.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 解:设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。例如3&&5的值为“真”,系统给出3&&5的值为1。 5.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 (1) a+b>c&&b==c (2) a||b+c&&b-c (3) !(a>b)&&!c||1 (4) !(x=a)&&(y=b)&&0 (5) !(a+b)+c-1&&b+c/2 解: (1) 0 (2) 1 (3) 1 (4) 0 (5) 1 5.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。 解: 方法一 #include <stdio.h> main() { int a,b,c; printf("请输入3个整数:"); scanf("%d,%d,%d",&a,&b,&c); if(a<b) if(b<c) printf("max=%d\n",c); else printf("max=%d\n",b); else if(a<c) printf("max=%d\n",c); else printf("max=%d\n",a); } 方法二:使用条件表达式,可以使程序更加简明、清晰。 程序如下: #include <stdio.h> main() { int a,b,c,temp,max; printf("请输入3个整数:"); scanf("%d,%d,%d",&a,&b,&c); temp=(a>b)?a:b; /* 将a和b中的大者存人temp中 */ max=(temp>c)?temp:c; /* 将a和b中的大者与c比较,取最大者*/ printf("3个整数的最大数是%d\n”,max); } 5.5 有一函数: 写一程序,输入x值,输出y值。 解: #include <stdio.h> main() {int x,y; printf("输入x:"); scanf("%d",&x); if(x<1) /* x<1 */ { y=x; printf("x=%3d, y=x=%d\n",x,y); } else if (x<10) /* 1≤x-10 */ { y=2*x-1; printf("x=%3d, y=2*x-1=%d\n",x,y); } else /* x≥10 */ { y=3*x-11; printf("x=%3d, y=3*x-11=%d\n",x,y); } } 5.6 给一个百分制成绩,要求输出等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~90分为’B’,70~79分为’C’,60分以下为’D’。 解: 程序如下: #include <stdio.h> main() { float score; char grade; printf("请输入学生成绩:"); scanf("%f",&score); while(score>100||(score<0) { printf("\n输入有误,请重新输入:"); scanf("%f",&score); } switch((int)(score/10)) { case 10: case 9: grade=’A’;break; case 8: grade=’B’;break; case 7: grade=’C’;break; case 6: grade=’D’;break; case 5: case 4: case 3: case 2: case 1: case 0: grade=’E’; } printf("成绩是%5.1f,相应的等级是%c。\n",score,grade); } 说明:对输入的数据进行检查,如小于0或大于100,要求重新输入。(int)(score/10)的作用是将 (score/10) 的值进行强制类型转换,得到一个整型值。 5.7 给定一个不多于5位的正整数,要求:① 求它是几位数;② 分别打印出每一位数字;③ 按逆序打印出各位数字。例如原数为321,应输出123。 解: #include <stdio.h> main() { long int num; int indiv,ten,hundred,thousand,ten_thousand,place; /*分别代表个位、十位、百位、千位、万位和位数*/ printf("请输入一个整数(0~99999):"); scanf("%ld",&num); if (num>9999) place=5; else if(num>999) place=4; else if(num>99) place=3; else if(num>9) place=2; else place=1; printf("place =%d\n", place); ten_thousand=num/10000; thousand=num/1000%10; hundred=num/100%10; ten=num%100/10; indiv=num%10; switch(place) { case 5: printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv); printf("\n反序数字为;"); printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand); break; case 4: printf("%d,%d,%d,%d",thousand,hundred,ten,indiv); printf("\n反序数字为:"); printf("%d%d%d%d\n",indiv,ten,hundred,thousand); break; case 3: printf("%d,%d,%d",hundred,ten,indiv); printf("\n反序数字为:"); printf("%d%d%d\n",indiv,ten,hundred); break; case 2: printf("%d,%d",ten,indiv); printf("\n反序数字为:"); printf("%d%d\n",indiv,ten); break; case 1: printf("%d",indiv); printf("\n反序数字为:"); printf("%d\n",indiv); break; } } 5.8 企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提成10% ;利润高于10万元,低于20万元(100000<I≤200000)时,其中10万元按10%提成,高于10万元的部分,可提成7.5% ;200000<I≤400000时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;600000〈I≤1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。要求:(1)用if语句编程序;(2)用switch语句编程序。 解:计算利润时,要特别注意不同利润的不同提成比例。例如,利润为15万元,其中有10万元按10%的比例提成,另外5万元则按7.5%提成。 (1) 用if语句编程序。 #include <stdio.h> main() { long i; float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; /*利润为10万元时的奖金*/ bon2=bon1+100000*0.075; /*利润为20万元时的奖金*/ bon4=bon2+200000*0.05; /*利润为40万元时的奖金*/ bon6=bon4+200000*0.03; /*利润为60万元时的奖金*/ bon10=bon6+400000*0.015; /*利润为100万元时的奖金*/ printf("请输入利润i:"); scanf("%ld",&i); if(i<=100000) bonus=i*0.1; /*利润在10万元以内按0.1提成奖金*/ else if(i<=200000) bonus=bon1+(i-100000)*0.075; /*利润在10万至20万元时的奖金*/ else if(i<=400000) bonus=bon2+(i-200000)*0.05; /*利润在20万至40万元时的奖金*/ else if(i<=600000) bonus=bon4+(i-400000)*0.03; /*利润在40万至60万元时的奖金*/ else if(i<=1000000) bonus=bon6+(i-600000)*0.015; /*利润在60万至100万元时的奖金*/ else bonus=bon10+(i-1000000)*0.01; /*利润在100万元以上时的奖金*/ printf(”奖金是%10.2f\n",bonus); } 此题的关键在于正确写出每一区间的奖金计算公式。例如利润在10万元至20万时,奖金应由两部分组成:①利润为10万元时应得的奖金。即100000ⅹ0.1;②10万元以上部分应得的奖金。即(num-100000)ⅹ0.075。同理,20万~40万这个区间的奖金也应由两部分组成:①利润为20万元时应得的奖金,即100000ⅹ0.1ⅹ10万ⅹ0.075;②20万元以上部分应得的奖金,即(num-200000)ⅹ0.05。程序中先把10万、20万、40万、60万、100万各关键点的奖金计算出来,即bon1、bon2、bon4、bon6、hon10;然后再加上各区间附加部分的奖金。 (2) 用switch语句编程序。 输入利润i,确定相应的提成等级branch 根据branch确定奖金值 0 奖金=i*0.1 1 奖金=bon1+(i-105)*0.075 2 奖金=bon2+(i-2*105)*0.05 3 4 奖金=bon4+(i-4*105)*0.03 5 6 奖金=bon6+(i-6*105)*0.015 7 8 9 10 奖金=bon10+(i-106)*0.01 输出奖金 #include <stdio.h> main() { long i; float bonus, bon1, bon2, bon4, bon6, bon10; int c; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf("请输入利润i:"); scanf("%ld",&i); c=i/100000; if(c>10) c=10; switch(c) { case 0: bonus=1*0.1;break; case 1: bonus=bon1+(i-100000)*0.075;break; case 2 : case 3: bonus=bon2+(i-200000)*0.05; break; case 4: case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015;break; case 10: bonus=bon10+(i-1000000)*0.01; } printf("奖金是%10.2f",bonus); } 5.9 输入4个整数,要求按由大到小的顺序输出。 解:此题采用依次比较的方法排出其大小顺序。在学习了循环和数组以后,可以有更多的排序方法。 #include <stdio.h> main() { int t,a,b,c,d; printf("请输入4个整数:"); scanf("%d,%d,%d,%d",&a,&b,&c,&d); printf("\n a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); if(a>b) {t=a; a=b; b=t;} if(a>c) {t=a; a=c; c=t;} if(a>d) {t=a; a=d; d=t;} if(b>c) {t=a; b=c; c=t;} if(b>d) {t=b; b=d; d=t;} if(c>d) {t=c; c=d; d=t;} printf("排序结果如下:\n"); printf("%d, %d, %d, %d\n",a,b,c,d); } 5.10 有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。 程序如下: #include <stdio.h> main() { int h=10; float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4; printf("请输入一个点(x,y):"); scanf("%f,%f",&x,&y); d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); /*求该点到各中心点的距离*/ d2=(x-x2)*(x-x2)+(y+y2)*(y+y2); d3=(x+x3)*(x+x3)+(y-y3)*(y-y3); d4=(x+x4)*(x-x4)*(y+y4)*(y+y4); if(d1>1&&d2>1&&d3>1&&d4>1) h=0; /*判断该点是否在塔外*/ printf("该点高度为%d\n",h); } 第六章 第六章 循环控制 6.1输入两个正整数m和n,求其最大公约数和最小公倍数。 main() {long m,n,i=1,j,s; scanf("%ld,%ld",&m,&n); for(;i<=m&&i<=n;i++) {if(m%i==0&&n%i==0) s=i;} if(m>=n) j=m; else j=n; for(;!(j%m==0&&j%n==0);j++); printf("s=%ld,j=%ld\n",s,j); } 6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 #include"stdio.h" main() {char c;int i=0,j=0,k=0,l=0; while((c=getchar())!=’\n’) {if(c>=65&&c<=90||c>=97&&c<=122) i++; else if(c>=48&&c<=57) j++; else if(c==32) k++; else l++;} printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l); } 6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。 #include"math.h" main() {int n,sum=0,i=1,s=2; scanf("%d",&n); while(i<=n) {sum=sum+s;s=s+2*pow(10,i); i++;} printf("sum=%d\n",sum); } 6.4 求 ,(即求1!+2!+3!+4!+5!+…+20!) main() {int n,i=1;long sum=0,s=1; scanf("%d",&n); while(i<=n) {s=s*i;sum=sum+s;i++;} printf("sum=%ld\n",sum); } 6.5 求 main() {double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum; for(;i<=100;i++) s1=s1+i; for(;j<=50;j++) s2=s2+j*j; for(;k<=10;k++) s3=s3+1/k; sum=s1+s2+s3; printf("sum=%f\n",sum); } 6.6打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 #include"math.h" main() {int x=100,a,b,c; while(x>=100&&x<1000) {a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b; if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf("%5d",x);x++;} } 6.7一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1、2、3 main() {int m,i,j,s; for(m=6;m<10000;m++) {s=1; for(i=2;i<m;i++) if(m%i==0) s=s+i; if(m-s==0) {printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0) printf("%d ",j);printf("\n");} } } 或 main() {int m,i,j,s; for(m=6;m<1000;m++) {s=m-1; for(i=2;i<m;i++) if(m%i==0) s=s-i; if(s==0) {printf("%5d its fastors are 1 ",m);for(j=2;j<m;j++) if(m%j==0) printf("%d ",j);printf("\n");} } } 6.8有一分数序列:    求出这个数列的前20项之和。 main() {int i=1,n;double t,x=1,y=2,s,sum=0; scanf("%ld",&n); while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;} printf("%f\n",sum); } 6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?  main() {int i,n;double h=100,s=100; scanf("%d",&n); for(i=1;i<=n;i++) {h*=0.5;if(i==1) continue;s=2*h+s;} printf("h=%f,s=%f\n",h,s); } 6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。 main() {int i=1,sum=0; for(;i<=10;sum=2*sum+1,i++); printf("sum=%d\n",sum); } 6.11用迭代法求 。求平方根的迭代公式为: 要求前后两次求出的得差的绝对值少于0.00001。 #include"math.h" main() {float x0,x1,a; scanf("%f",&a); x1=a/2; do {x0=x1;x1=(x0+a/x0)/2;} while(fabs(x0-x1)>=0.00001); printf("%.3f\n",x1); } 6.12 用牛顿迭代法求方程在1.5附近的根。 main() {double x,y;x=1.5; do{y=2*x*x*x-4*x*x+3*x-6; x=x-y/(6*x*x-8*x+3);} while(y!=0); printf("x=%.3f\n",x); } 6.13用二分法求方程在(-10,10)之间的根 main() {double x1,x2,y1,y2;x1=-10;x2=10; do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6; x1=x1-y1/(6*x1*x1-8*x1+3);} while(y1!=0); do {y2=2*x2*x2*x2-4*x2*x2+3*x2-6; x2=x2-y2/(6*x2*x2-8*x2+3);} while(y2!=0); printf("x1=%.3f,x2=%.3f\n",x1,x2); } 6.14打印以下图案 * * * * * * * * * * * * * * * * * * * * * * * * * #include"math.h" main() {int i,j,k; for(i=0;i<=3;i++) {for(j=0;j<=2-i;j++) printf(" "); for(k=0;k<=2*i;k++) printf("*"); printf("\n"); } for(i=0;i<=2;i++) {for(j=0;j<=i;j++) printf(" "); for(k=0;k<=4-2*i;k++) printf("*"); printf("\n"); } } 第七章 第七章 数组 7.1 用筛法求之内的素数。 main() { int i,j,a[100]; for(i=2;i<100;i++) { a[i]=i; for(j=2;j<=i;j++) {if(j<i) if(a[i]%j==0) break; if(a[i]-j==0) printf("%5d",a[i]); } } printf("\n"); } 或 #include"math.h" main() {static int i,j,k,a[98]; for(i=2;i<100;i++) {a[i]=i;k=sqrt(i); for(j=2;j<=a[i];j++) if(j<k) if(a[i]%j==0) break; if(j>=k+1) printf("%5d",a[i]); } printf("\n"); } 7.2用选择法对10个整数从小到大排序。 main() { int i,j,a[10],t; for(i=0;i<10;i++) scanf("%d",&a[i]); for(j=1;j<10;j++) for(i=0;i<=9-j;i++) if(a[i]>a[i+1]) {t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=0;i<10;i++) printf("%5d",a[i]); } 或 main() {static int a[10],i,j,k,t; for(i=1;i<11;i++) scanf("%d",&a[i]); for(j=1;j<10;j++) for(i=1;i<=10-j;j++) if (a[i]>a[i+1]) {t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=1;i<11;i++) printf("%d",a[i]); printf("\n"); } 7.3求一个3×3矩阵对角线元素之和。 main() {int i=0,j=0,a[3][3],s1,s2; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); s1=a[0][0]+a[1][1]+a[2][2]; s2=a[0][2]+a[1][1]+a[2][0]; printf("s1=%d,s2=%d\n",s1,s2); } 或 main() { static int i,j,s1,s2,a[3][3]; for(i=1;i<=3;i++) for(j=1;j<=3;j++) scanf("%d",&a[i][j]); s1=a[1][1]+a[2][2]+a[3][3]; s2=a[1][3]+a[2][2]+a[3][1]; printf("%d,%d\n",s1,s2); } 7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。 main() { static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t; scanf("%d",&a[9]); for(i=9;i>0;i--) if(a[i]<a[i-1]) {t=a[i-1];a[i-1]=a[i];a[i]=t;} for(i=0;i<10;i++) printf("%5d",a[i]);printf("\n"); } 或 main() { static int a[5]={1,4,5,6,7}; int i,t,b; scanf("%d",&b); for(i=0;i<5;i++) {if(b<=a[i]) {t=a[i];a[i]=b;b=t;} printf("%d ",a[i]);} printf("%d",b); } 7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 main() { int i,b[10]; for(i=0;i<10;i++) scanf("%d",&b[i]); for(i=9;i>-1;i--) printf("%5d",b[i]); printf("\n");} 7.6打印出以下杨辉三角形(要求打印出10行)。 1 1  1 1  2  1 1  3  3  1 1  4  6  4  1 1  5  10 10  5  1 ∶ ∶ main() { static int m,n,k,b[15][15]; b[0][1]=1; for(m=1;m<15;m++) {for(n=1;n<=m;n++) { b[m][n]=b[m-1][n-1]+b[m-1][n]; printf("%-5d",b[m][n]);}printf("\n"); } } } 或 main() { int i,j,n,k,a[10][10]; static a[][1]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}}; a[1][1]=1; for(k=2,k<11;k++) for(i=2;i<=k;i++) for(j=2;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(k=1;k<11;k++) for(i=1;i<=k;i++) for(j=1;j<=i;j++) printf("%d",a[i][j]); } 7.7 打印“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为 8 1 6 3 5 7 4 9 2 要求打印出由1~n2的自然数构成的魔方阵。 解: #include <stdio.h> main() { int a[16][16],i,i,k,p,m,n; p=1; while(p==1) /*要求阶数为1~15的商数*/ { printf("Enter n(n=1~15):"); scanf("%d",&n); if((n!=0)&&(n<=15)&&(n%2!=0)) p=0; } for(i=1;i<=n;i++) /*初始化*/ for(j=1;j<=n;j++) a[i][j]=0; j=n/2+1; /*建立魔方阵*/ a[1][j]=1; for(k=2;k<=n*n;k++) { i=i-1; j=j+1; if((i<1)&&(j>n)) { i=i+2; j=j-1; } else { if(i<1) i=n; if(j>n) j=1; } if(a[i][j]==0) a[i][j]=k; else { i=i+2; j=j-1; a[i][j]=k; } } for(i=1;i<=n;i++) /*输出魔方阵*/ { for(j=1;j<=n;j++) printf("%4d",a[i][j]); printf("\n"); } } 7.8找出一个二位数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,也可能没有鞍点。 main() {int a[5][5],b[5],c[5],d[5][5],k=0,l=0;int i,j; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf("%d",&d[i][j]); for(i=0;i<5;i++) for(j=0;j<5;j++,a[i][j]=d[i][j]); for(i=0,k=0;i<5;i++,k++) for(j=0;j<4;j++) {if(a[i][j]>=a[i][j+1]) b[k]=a[i][j+1]=a[i][j]; else b[k]=a[i][j+1]; } for(j=0,l=0;j<5;j++,l++) for(i=0;i<4;i++) {if(a[i][j]<=a[i+1][j]) c[l]=a[i+1][j]=a[i][j]; else c[l]=a[i+1][j]; } for(i=0,k=0;i<5;i++,k++) for(j=0,l=0;j<5;j++,l++) if(d[i][j]-b[k]==0) {if(d[i][j]-c[l]==0) printf("d[%d][%d]=%d\n",i,j,d[i][j]); else printf("d[%d][%d]=%d isnot andi\n",i,j,d[i][j]); } } 7.9有个15数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值。如果该数不在数组中,则打印出"无此数" #include"math.h" main() {static int i,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812}; scanf("%d",&m); for(j=0;j<15;j++) printf("%4d",a[j]); printf("\n"); i=7; while(fabs(i-7)<8) {if(m<a[7]) {if(a[i]-m==0) {printf("it is at (%d)\n",i+1);break;}i--;} else if(m>a[7]) {if(a[i]-m==0) {printf("it is at (%d)\n",i+1);break;}i++;} else printf("8\n"); } if(fabs(i-7)-8==0) printf("There is not\n"); } 7.10有一篇文章,共有3行文字,每行有个80字符。要求分别统计出其中英文大写字母、小写字母、空格以及其它字符的个数。 main() {int i,j=0,k=0,l=0,m=0,n=0;char str0[301],str1[100],str2[100],str3[100]; gets(str1);gets(str2);gets(str3); strcat(str0,str1);strcat(str0,str2);strcat(str0,str3); for(i=0;str0[i]!=’\0’;i++) {if(str0[i]>=65&&str0[i]<=90) j++; else if(str0[i]>=97&&str0[i]<=122) k++; else if(str0[i]>=48&&str0[i]<=57) l++; else if(str0[i]==32) m++; else n++;} printf("Daxie Xiaoxie Shuzi Kongge Qita\n"); printf("%5d %7d %5d %6d %4d\n",j,k,l,m,n); } 7.11打印以下图案 * * * * * * * * * * * * * * * * * * * * * * * * * main() {int i,j,k;char a[5][5]; for(i=0;i<5;i++) {for(j=0;j<5;j++) {a[i][j]=’*’;printf("%c",a[i][j]);} printf("\n"); for(k=1;k<=i+1;k++) printf("\40");} printf("\n"); } 7.12有一行电文译文下面规律译成密码: A->Z a->z B->Y b->y C->X c->x … 即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变,要求编程序将密码回原文,并打印出密码和原文。 main() { int i;char str1[100],str2[100]; gets(str1); for(i=0;str1[i]!=’\0’;i++) if(str1[i]>=65&&str1[i]<=90) str2[i]=155-str1[i]; else if(str1[i]>=97&&str1[i]<=122) str2[i]=219-str1[i]; else str2[i]=str1[i]; printf("%s\n%s\n",str1,str2); } 7.13编一程序,将两个字符串连接起来,不要strcat函数。 main() { int i,j;char str1[100],str2[100],str3[201]; gets(str1); gets(str2); for(i=0;str1[i]!=’\0’;i++) str3[i]=str1[i]; for(j=0;str2[j]!=’\0’;j++) str3[j+i]=str2[j]; printf("%s\n%s\n%s\n",str1,str2,str3); } 7.14编一个程序,将两个字符串S1和S2比较,如果S1>S2,输出一个正数;S1=S2,输出0;S1<S2,输出一个负数。不要用strcpy函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相对应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负数,由于’A’与’C’的码差值为2,因此应输出"-2"。同理:"And"和"Aid"比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出"5"。 #include <stdio.h> #include <string.h> main() { int i,resu; char s1[100],s2[100]; printf("\n input string1:"); gets(s1); printf("\n Input string2:"); gets(s2); i=0; while(s1[i]==s2[i]&&s1[i]!=’\0’) i++; if(s1[i]==’\0’&&s2[i]==’0’) resu=0; else resu=s1[i]-s2[i]; printf("\n result:%d\n",resu); } 7.15 编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中,不用strcpy函数。拷贝时,’\0’也要拷贝过去,’\0’后面的字符不拷贝。 解: #include "stdio.h" main() { char s1[80],s2[80]; int i; printf("Input s2:"); scanf("%s",s2); for(i=0;i<strlen(s2);i++) s1[i]=s2[i]; printf("s1:%s\n",s1); } 第八章 第八章 函数 1.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 maxyueshu(m,n) int m,n; { int i=1,t; for(;i<=m&&i<=n;i++) {if(m%i==0&&n%i==0) t=i; } return(t); } minbeishu(m,n) int m,n; {int j; if(m>=n) j=m; else j=n; for(;!(j%m==0&&j%n==0);j++); return j; } main() {int a,b,max,min; printf("enter two number is: "); scanf("%d,%d",&a,&b); max=maxyueshu(a,b); min=minbeishu(a,b); printf("max=%d,min=%d\n",max,min); } 8.2求方程 的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。 #include"math.h" float yishigen(m,n,k) float m,n,k; {float x1,x2; x1=(-n+sqrt(k))/(2*m); x2=(-n-sqrt(k))/(2*m); printf("two shigen is x1=%.3f and x2=%.3f\n",x1,x2); } float denggen(m,n) float m,n; {float x; x=-n/(2*m); printf("denggen is x=%.3f\n",x); } float xugen(m,n,k) float m,n,k; {float x,y; x=-n/(2*m); y=sqrt(-k)/(2*m); printf("two xugen is x1=%.3f+%.3fi and x2=%.3f-%.3fi\n",x,y,x,y); } main() {float a,b,c,q; printf("input a b c is "); scanf("%f,%f,%f",&a,&b,&c); printf("\n"); q=b*b-4*a*c; if(q>0) yishigen(a,b,q); else if(q==0) denggen(a,b); else xugen(a,b,q); } 8.2写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。 psushu(m) int m; {int i=2,t; for(;i<=m;i++) if(m%i==0&&i<m) break; if(m-i==0) t=1; else t=0; return m; } main() {int a,s; printf("enter sushu is \n"); scanf("%d",&a); s=psushu(a); if(s==1) printf("a is sushu\n"); else printf("s is not sushu\n"); } 8.4写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 int zhuangzhi(b) int b[3][3]; {int i,j,t; for(i=0;i<3;i++) for(j=0;j>=i&&j<3-i;j++) {t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;} } main() {int a[3][3];int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); for(i=0;i<3;i++) {for(j=0;j<3;j++) printf(" %d",a[i][j]); printf("\n");} zhuangzhi(a); for(i=0;i<3;i++) {for(j=0;j<3;j++) printf(" %d",a[i][j]); printf("\n");} } 8.5写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。 main() {char str0[100]; gets(str0); fanxu(str0); puts(str0); } fanxu(str1) char str1[100]; {int i,t,j; char str2[100];strcpy(str2,str1); t=strlen(str1); for(i=0,j=t-1;j>-1;i++,j--) str1[i]=str2[j]; } 8.6写一函数,将两个字符串连接。 lianjie(a,b) char a[100],b[100]; {strcat(a,b); } main() {char str1[100],str2[100]; gets(str1);gets(str2); lianjie(str1,str2); puts(str1); } 8.7写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。 fuzhi(a,b) char a[100],b[100]; {int i,j=0; for(i=0;a[i]!=’\0’;i++) if(a[i]==97||a[i]==101||a[i]==105||a[i]==111||a[i]==117||a[i]==65|| a[i]==69||a[i]==73||a[i]==85) {b[j]=a[i];j++;} } main() {char str1[100],str2[100]; gets(str1); fuzhi(str1,str2); puts(str2); } 8.8写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出"1_9_9_0"。 char f(b) char b[4]; {int i=0; for(;i<4;i++) {printf(" "); printf("%c",b[i]);} printf("\n"); } main() {int a,u,v,w,t;char c[4]; scanf("%4d",&a); u=a*0.001;v=0.01*(a-1000*u);w=(a-1000*u-100*v)*0.1;t=a-1000*u-100*v-10*w; c[0]=u+48; c[1]=v+48; c[2]=w+48; c[3]=t+48; f(c); } 8.9编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 char tongji(str0,b) char str0[100]; int b[4]; {int i; for(i=0;str0[i]!=’\0’;i++) {if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]<=122) b[0]++; else if(str0[i]>=48&&str0[i]<=57) b[1]++; else if(str0[i]==32) b[2]++; else b[3]++;} } main() {char str1[100];static int i,a[4]; gets(str1); tongji(str1,a); printf("zimu Shuzi Kongge Qita\n"); for(i=0;i<4;i++) printf("%-8d ",a[i]);printf("\n"); } 8.10写一函数,输入一行字符,将此字符串中最长的单词输出。 cechang(str1,word0) char str1[100],word0[15]; {int i=0,j=0,t=0; static char word1[15]; for(;str1[i]!=’\0’;i++) {if(!(str1[i]>=97&&str1[i]<=122||str1[i]>=65&&str1[i]<=90)) {t=j;j=0;continue;} word1[j]=str1[i];j++; if(j>=t) strcpy(word0,word1);} } main() {char str0[100],longword[15]; gets(str0); cechang(str0,longword); puts(longword); } 8.11写一函数用起泡法对输入的个字符按由小到大的顺序排列。 int paixu(x) int x[]; {int i,j,t; for(j=1;j<10;j++) for(i=0;i<=9-j;i++) if(x[i]>x[i+1]) {t=x[i+1];x[i+1]=x[i];x[i]=t;} } main() {int y[10];int i; for(i=0;i<10;i++) scanf("%d",&y[i]); paixu(y); for(i=0;i<10;i++) printf("%5d",y[i]); printf("\n"); } 8.12用牛顿迭代法求根。方程为: ,系数a,b,c,d由主函数输入。求X在1附近的一个实根。求出后由主函数输出。 double qigen(s,t,u,v) int s,t,u,v; {double x,y;x=1; do{y=s*x*x*x+t*x*x+u*x+v; x=x-y/(3*s*x*x+2*t*x+u);} while(y!=0); return x; } main() {int a,b,c,d;double x; scanf("%d,%d,%d,%d",&a,&b,&c,&d); x=qigen(a,b,c,d); printf("x=%.3f\n",x); } 8.13用递归方法求n阶勒让德多项式的值递归公式为 float p(x0,n) int n;float x0; {float y; if(n==0||n==1) if(n==1) y=x0;else y=1; else y=((2*n-1)*x0*p(x0,n-1)-(n-1)*p(x0,n-2))/n; return(y); } main() {float x,y0;int a,i; scanf("%f,%d",&x,&a); y0=p(x,a); printf("y0=%.3f\n",y0); } 8.14输入10个学生5门课的成绩,分别用函数求:①每个学生平均分;②每门课的平均分;③找出最高分所对应的学生和课程;④求平均分方差:δ=[SXi^2]/n-(SXi/n)^2,为一学生的平均分 float x1[10],x2[5]; float pp(),cc(),find(),xx(); main() {char name[10][20],class[5][20];float score[10][5],o,k=0,max[5];int a[5],i,j; for(i=0;i<10;i++) gets(name[i]); for(j=0;j<5;j++) gets(class[j]); for(i=0;i<10;i++) for(j=0;j<5;j++) scanf("%f",&score[i][j]); pp(score); cc(score); find(score,max,a); o=xx(k); for(i=0;i<10;i++) {puts(name[i]); printf("%.3f\n",x1[i]);} for(j=0;j<5;j++) {puts(class[j]);printf("%.3f\n",x2[j]);} for(j=0;j<5;j++) {printf("%.3f \n",max[j]); puts(name[a[j]]); puts(class[j]);} printf("o=%.3f\n",o); } float pp(f) float f[10][5]; {float sum=0;int i,j; for(i=0,sum=0;i<10;i++) {for(j=0;j<5;j++) sum=sum+f[i][j]; x1[i]=sum/5;} } float cc(y) float y[10][5]; {float sum=0;int i,j; for(j=0;j<5;j++) {for(i=0;i<10;i++) sum=sum+y[i][j]; x1[j]=sum/10;} } float find(z,s,t) float z[10][5],s[5];int t[5]; {int i,j; for(j=0,s[j]=z[0][j];j<5;j++) for(i=0;i<10;i++) if(s[j]<z[i][j]) {s[j]=z[i][j];t[j]=i;} } float xx(q) float q; {float f=0,e=0;int i; for(i=0;i<10;i++) {e=x1[i]*x1[i]+e; f=f+x1[i];} q=e/10-(f/10)*(f/10); return(q); } 8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。 #define N 10 find(a,b) int a[],b[]; {int i,j,s,t,c[N][2]; for(i=0;i<N;i++) {c[i][1]=a[i];c[i][1]=i;} for(i=0;i<N;i++) for(j=0;j<N-i-1;j++) if(c[i][0]>c[i+1][0]) {t=c[i][0];c[i][0]=c[i+1][0];c[i+1][0]=t; s=c[i][1];c[i][1]=c[i+1][1];c[i+1][1]=s;} for(i=0;i<N;i++) b[i]=c[i][1]; return; } lookfor(h,k) int h[],k; {int i,j; for(i=0;i<N;i++) if(h[i]-k==0) j=i; return j; } main() {int number[N],x[N],i,j,u,p;char name[N][20]; for(i=0;i<N;i++) {gets(name[i]); scanf("%d",&number[i]);} scanf("%d",&p); find(number,x); u=lookfor(number,p); for(i=0;i<N;i++) {printf("%d",number[i]); puts(name[x[i]]);} puts(name[x[u]]); } 8.16写一函数,输入一个十六进制数,输出相应的十进制数。 #include"math.h" int x; ff(shu) char shu[]; {int i=strlen(shu)-1,sum=0; for(;i>-1;i++) {if {if(48<=shu[i]<=57) sum=sum+(shu[i]-48)*pow(16,(i-1)); else if(65<=shu[i]<=90) sum=sum+(shu[i]-55)*pow(16,(i-1)); else if(97<=shu[i]<=102) sum=sum+(shu[i]-87)*pow(16,(i-1)); x=1;} else x=0; return x; } main() {char shufu[100];int s; gets(shufu);s=ff(shufu); if(x) printf("s(D)=%d\n",s); else printf("The number is not ox\n"); } 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串"486"。n的位数不确定,可以是任意位数的整数。 #include"math.h" int x[10]; pf(m,n) unsigned long m;int n; {int y; if(n==0) {y=(int)(m%10);x[0]=y;} else {y=(unsigned long)((m-pf(m,n-1))/pow(10,n))%10;x[n]=y;} return(y); } main() {unsigned long a,b;int i,j,k;char c[11]; scanf("%ld",&a); for(j=0,b=a;b>0.1;j++,b/=10); pf(a,j-1); for(i=0,k=j-1;i<j;i++,k--) c[i]=x[k]+48;c[10]=’\0’; puts(c);} 或 #include"math.h" char x[11]; pf(m,o) unsigned long m;int o; {int j,i; for(i=o-1,j=0;i>-1;i--,j++) x[i]=(int)((unsigned long)(m/pow(10,j))%10)+48; return; } main() {unsigned long a,b;int j,i; scanf("%ld",&a); for(j=0,b=a;b>0.1;j++,b/=10); pf(a,j); puts(x);printf("%d\n",j);} 或 #include"math.h" int x[10];unsigned long m; pf(n) int n; {int y; if(n==0) {y=m%10;x[0]=y;} else {y=(unsigned long)((m-pf(n-1))/pow(10,n))%10;x[n]=y;} return(y); } main() {unsigned long a;int i,j,k;char c[11]; scanf("%ld",&m); for(j=0,a=m;a>0.1;j++,a/=10); pf(j-1); for(i=0,k=j-1;i<j;i++,k--) c[i]=x[k]+48;c[10]=’\0’; puts(c);} 8.18给出年、月、日,计算该日是该年的第几天。 int find(x,y,z) int x,y,z; { int i,t,s,days=0; if(x%4==0) t=1; else t=0; for(i=1;i<y;i++) {if(i==2) s=2-t; else s=0; days=days+30+i%2-s; } days=days+z; return(days); } main() {int year,month,date,day; scanf("%d %d %d",&year,&month,&date); day=find(year,month,date); printf("THE DATE IS THE %dth DAYS\n",day); }   第九章 第九章 编译预处理 9.1定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 #define CHANGE(a,b,t) t=a;a=b;b=a main() {int c,d,s; scanf("%d,%d",&c,&d); CHANGE(c,d,s); printf("c=%d,d=%d\n",c,d); } 9.2输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。 #define Q(a,b) a%b main() {int c,d,t; scanf("%d %d",&c,&d); t=Q(c,d); printf("t=%d\n",t); } 9.3三角形面积为: 其中S=(a+b+c)/2,a、b、c为三角形的三边。定义两个带参的宏S,一个用来求area,另一个宏用来求。写程序,在程序中用带实参的宏名来求面积area。 #include"math.h" #define SSS(m,n,k) (m+n+k)/2 #define AQRT(m,n,k) sqrt(SSS(m,n,k)*(SSS(m,n,k)-m)*(SSS(m,n,k)-n)*(SSS(m,n,k)-k)) main() {float a,b,c,s,area; scanf("%f %f %f",&a,&b,&c); s=SSS(a,b,c); area=AQRT(a,b,c); printf("s=%.3f area=%.3f\n",s,area); } 或 #include"math.h" #define SSS(m,n,k) (m+n+k)*0.5 #define AQRT(m,n,k) sqrt(((m+n+k)/2)*((m+n+k)/2-m)*((m+n+k)/2-n)*((m+n+k)/2-k)) main() {float a,b,c,t,area; scanf("%f %f %f",&a,&b,&c); t=SSS(a,b,c); area=AQRT(a,b,c); printf("t=%.3f;area=%.3f\n",t,area); } 或 #include"math.h" #define SSS(m,n,k) ((m+n+k)/2) #define AQRT(m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k,m,n,k) sqrt(SSS*(SSS-m)*(SSS-n)*(SSS-k)) main() {float a,b,c,t,area; scanf("%f %f %f",&a,&b,&c); t=SSS(a,b,c); area=AQRT(a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c,a,b,c); printf("t=%.3f;area=%.3f\n",t,area); } 9.4给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串) 在程序中用以下语句输出结果: if (LEAP_YEAR(year)) printf("%d is a leap year",year); else printf ("%d is not a leap year",year); #define LEAPYEAR(y) y%4 main() {int y; scanf("%d",&y); if(LEAPYEAR(y)) printf("%d is a not leap year\n",y); else printf("%d is a lear year\n",y); } 9.6请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。 #define PR1(x) printf("%6.2f\n",x) #define PR2(x) printf("%6.2f\t%6.2f\n",x,x) #define PR3(x) printf("%6.2f\t%6.2f\t%6.2f\n",x,x,x) main() {float a;scanf("%f",&a); PR1(a);PR2(a);PR3(a); } 9.7设计所需的各种各样的输出格式(包括整数、实属、字符串等),用一个文件名"fornat.h",把信息都放到这个文件内,另编一个程序文件,用命令#include "fornat.h"以确保能使用这些格式。 分别用函数和带参的宏,从三个数中找出最大的数。 #define MAX(a,b,c) (a>((b>c)? b:c))? a:((b>c)? b:c) main() {float x,y,z,t; scanf("%f,%f,%f",&x,&y,&z); t=MAX(x,y,z); printf("%.4f\n",t); } 9.10用条件编译方法实现以下功能: 输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。用命令来控制是否要译成密码。例如: #define CHANGE 1 则输出密码。若: #define CHANGE 0 则不译为密码,按原码输出。 #define CHANGE 1 main() {char str[80],c;int i=0; gets(str); while(str[i]!=’\0’) { #if CHANGE if(str[i]==90||str[i]==122) str[i]=str[i]-25; else if(str[i]>=65&&str[i]<90||str[i]>=97&&str[i]<122) str[i]=str[i]+1; #endif i++; } puts(str); } 或 #define CHANGE 1 main() {char str[80],*c;int i=0; gets(str);c=str; while(*c!=’\0’) { #if CHANGE if(*c==90||*c==122) *c=*c-25; else if(*c>=65&&*c<90||*c>=97&&*c<122) *c=*c+1; #endif c++; } puts(str); } 第十章 第十章 指针 10.1输入三个整数,按由小到大的顺序输出。 main() { int a,b,c,*p1,*p2,*p3,t; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; if(*p1>*p2) {t=p1;p1=p2;p2=t;} if(*p1>*p3) {t=p1;p1=p3;p3=t;} if(*p2>*p3) {t=p2;p2=p3;p3=t;} printf("%d,%d,%d\n",*p1,*p2,*p3); } 或 main() {int a,b,c,*p1,*p2,*p3,t; scanf("%d,%d,%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; if(a>b) {t=*p1;*p1=*p2;*p2=t;} if(a>c) {t=*p1;*p1=*p3;*p3=t;} if(b>c) {t=*p2;*p2=*p3;*p3=t;} printf("%d,%d,%d\n",a,b,c); } 10.2输入三个字符串,按由小到大的顺序输出 #define N 3 #define M 20 main() {char str0[N][M],str1[M],*p,*q; int i,l,m,n; q=str0; for(;p<q+N;p++) gets(p); l=strcmp(q,q+1); if(l>0) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);} m=strcmp(q,q+2); if(m>0) {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);} n=strcmp(q+1,q+2); if(n>0) {strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);} for(p=q;p<q+N;p++) puts(p); } 10.3输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数;①输入10个数;②进行处理;③输出10个数。 f(x,n) int x[],n; {int *p0,*p1,i,j,t,y; i=j=x[0];p0=p1=x; for(y=0;y<n;y++) {if(x[y]>i) {i=x[y];p0=&x[y];} else if(x[y]<j) {j=x[y];p1=&x[y];}} t=*p0;*p0=x[n-1];x[n-1]=t; t=*p1;*p1=x[0];x[0]=t; return; } main() {int a[10],u,*r; for(u=0;u<10;u++) scanf("%d",&a[u]); f(a,10); for(u=0,r=a;u<10;u++,r++) printf(" %d",a[u]); printf("\n"); } 10.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。 #define N 10 void shift(p,x) float *p;int x; {float a[N],*q,*o;int i; o=a;q=p; for(i=0;i<x;i++) *(o+i)=*(q+N-x+i); for(p=p+N-1;p>=q;p--) *p=*(p-x); for(i=0;i<x;i++) *(q+i)=*(o+i); return;} main() {float shuzhu[N],*u,*v; int h,i;u=v=shuzhu; scanf("%f",&h); for(;u<v+N;u++) scanf("%f",u); shift(v,h); for(u=v;u<v+N;u++) printf("%.2f ",*u); printf("\n"); } 10.5有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 #define N 5 main() {int i,j,k,a[N+1],*p; for(i=0,p=a;p<=a+N;i++,p++) *p=i; p=a+1;k=N; for(i=0,j=1;k!=1;j++) {if(p>(a+N)) p=a+1; if(*p!=0) i++; if((i-3)==0) {*p=0;i=0;k--;} p++; } for(i=1;i<=N;i++) if(a[i]!=0) printf("The last number is %d\n",a[i]);} 10.7有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 #include"stdio.h" #define N 10 main() {char a[N+1],b[N+1],*p,*q; int m; gets(a); scanf("%d",&m); p=a+m;q=b; strcpy(q,p); puts(q); } 10.6写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。 第十一章 11.1定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:Struct {int year; int month; int day; }date; main() {int days; printf(“Input 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+31; 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%d/%d is the %dth day in%d.”,date.month,data.day,days,date,year); } 11.2写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日数传回主函数输出。 解:struct y_m_d {int year: int month; int day; }date; intdays(struct y_m_d date1) {int sum; switch(data.month) {case 1:sum=date1.day; break; case 2:sum=date1.day+31; break; case 3:sum=date1.day+59; break; case 4:sum=date1.day+90; break; case 5:sum=date1.day+120; break; case 6:sum=date1.day+151; break; case 7:sum=date1.day+181; break; case 8:sum=date1.day+212; break; case 9:sum=date1.day+243; break case 10:sum=date1.day+243; break case 11:sum=date1.day+243; break case 12:sum=date1.day+243; break } }; 11.3编写一个函数print,打印一个学生的成绩数,该数组中有5个学生的数据记录,每个记录包括num、name、sore[3],用主函数输入这些记录,用print函数输出这些记录。 解: #define N 5 struct student {char num[6]; char name[8]; int score[4]; }stu[N]; main() {int I,j ; for(I=0;I<N;I++) {printf(“\Input score of student %d:\n”,I+1); printf(“no.:”); scanf(“%s”,stu[i].num); printf(“name:”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) {printf(“score%d:”j+1); scanf(“%d”,&stu[i].score[j]); } printf(“\n”); } print(stu); } print(struct student stu[6]) {int I,j; printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); print(“\n”); } 11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 解: #define N 5 struct student {char num[6]; char name[8]; int score[4] }stu[N]; input(struct student stu[]) {int I,j; for(I=0;I<N;I++) {printf(“input scores of student %d:\n”,I+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”, stu[i].name); for(j=0;j<3;j++) {printf(“score%d:”,j++); scanf(“%d”, &stu[i].score[j]);} } printf(“\n”); } } 11.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 解:#define N 10 struct student {char num[6] char name[8] int score[4] float avr; }stu[N]; main() {int I,j,max,maxi,sum; float average; for(I=0;I<N;I++) {printf(“\nInput scores of student %d:\n”,I+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) {printf(“score %d:”,j+1); scanf(“%d”, &stu[i].score[j]); } } average=0; max=0; maxi=0; for(i=0;i<3;i++) {sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) {max=sum; maxi=I; } } average/=N; printf(“NO. name score1 score2 score3 average\n”); for(I=0;I<N;I++) {printf(“%5s%10s”,stu[i].num, stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“%8.2f\n”,stu[i].avr); } printf(“average=%6.2f\n”,average); printf(“The highest score is:%s,score total:%d.”stu[maxi].name,max); } 11.6 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。 解:new函数如下: #define NULL 0 #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; char *new(int n) {if (newp+n<=newbuf+ NEWSIZE) { newp= newp+n; return(newp-n); } else return(NULL); } 11.7写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。 解: #define Null o #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; free(char *p) {if((p>=newbuf)&&(p<newbuf+NEWSIZE)) newp=p; } 11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。 解: #include<stdio.h> #define NULL 0 #define LENsizeof(struct student) strut student {long num; int scor; struct student *next }; struct student listA,listB; int n,sum=0; main() {struct student *creat(void); struct student *insert(struct student *,struct student *); void print(struct student *); stuct student *ahead , *bhead,*abh; printf(“\ninput list a:\n”); ahead=creat(); sum=sum+|n; abh=insert(ahead,bhead); print(abh); } struct student *creat(void) {struct student *p1,*p2,*head; n=0; p1=p2=(struct student *)malloc(LEN); printf(“input number&scores of student:\n”); printf(“if number Is 0,stop inputing.\n”); scanf(“%ld,%d”,&p1->num,&p1->score); head=NULL; while(p1->num!=0) {n=n+1; if(n==1)head=p1; else p2->next =p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(“%ld,,%d”,&p1->num,&p1->score); } p2->next=NULL; return(head); } struct student *insert(struct student *ah,struct student *bh) {struct student *pa1 , *pa2,*pb1,*pb2; pa2=pa1=ah; pb2=pb1=bh; do {while((pb1->num>pa1->num)&&(pa1->next!=NULL)) {pa2=pa1; pa1=pa1->next; } if(pb->num<=pa1->num) {if(ah=pa1) ah=pb1; else pa2->next=pb1; pb1=pb1->next; pb2->next=pa1; pa2=pb2; pb2=pb1; } } while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL)); if((pb1->num>pa1->num)&&(pa1->next==NULl)) ap1->next=pb1; return(ah); } void print(struct student *head) {struct student *p; printf(“%ld%d\n”,p->num,p->score); p=p->next; while(p!=NULL); } 11.9 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。 解: #define N 13 struct person {int number; int nextop; }link[N+1]; main() {int I,count,h; for(I=1;I<=N;I++) {if(I==N) link[i].nextp=1; else link[i].nextp=I+1; link[i].number=I; } printf(“\n”); count=0; h=N; printf(“sequence that person2 leave the circle:\n”); while(count<N-1) {I=0; while(I!=3) {h=link[h].nextp; if(link[h].number) I++; } printf(“%4d”,link[h].number); link[h].number=0; count++; } printf(“\nThe last one is”); for(I=1;ii<=N;I++) if(link[i].number) printf(“%3d”,lin[i].number); } 11.10有两个链表a和b,设结点中包含学号、姓名。从1链表中删去与b链表中有相同学号的那些结点。 解: #define LA 4 #define LB 5 #define NULL 0 struct student {char nump[6]; char name[8]; struct student *next; }A[LA],b[LB]; main() {struct student a[LA]={{“101”,”Wang”},{“102”,”LI”},{“105”,”zhang”},{“106”,”Wei”}}; struct studentb[LB]={{“103”,”Zhang”},{“104”,”Ma”},{“105”,”Chen”},{“107”,”Guo”}, {“108”,”Lui”}}; int I,j; struct student *p, *p1,*p2,*pt,*head1,*head2; head1=a; head2=b; printf(“list a :\n”); for(p1=head1,i=1;p1<a=LA;i++) {p=p1; p1->next=a+I; printf(“%8s%8s\n”,p1->num,p1->name); p1=p1->next; } p->next=NULL; printf(“\n list b:\n”); for(p2=head2,I=1;p2<b+LB;I++) {p=p2; p2->next=b+I; printf(“%8s%8s\n”,p2->num,p2->name); p2=pa->next; } p->next=NULL; printf(“\n”); p1=head1; while(p1!=NULL) {p2=head2; while(p2!=NULL&&strcmp(p1->num,p2->num)!=0) p2=p2->next; if(strcmp(p1->num,p2->num==0)) if(p1==head1) head1=p1->next; else p->next=p1->next; p=p1; p1=p1->next; } p1=hedad1; printf{“\n result:\n”}; while(p1!=NULL) {printf(“%7s %7s\n”,p1->num,p1->name); p1=p1->next; } } 11.11建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。 解:#define NULL 0 #define LEN sizeof(struct student) struct student {char num[6]; char name[8]; char sex[2]; int age; stuct student *next; }stu[10]; main() {struct student *p,*pt,*head; int I,length,iage,flag=1; int find=0; while(flag==1) {printf(“input length of list(<10):”); scanf(“%d”,&length); if(length<10) flag=0; } for(I=0;I<lenth;I++) {p=(struct student *)malloc(LEN); if(I==0) head=pt=p; else pt->next=p; pt=p; ptintf(“NO:”); scanf(“%s”,p->num); prntf(“name:”); scanf(“%s”,p->name); printf(“sex:”); scanf(“%s”,p->sex); printf(“age:”); scanf(“%s”,p->age); } p->next=NULL; p=head; printf(“\n NO. name sex age\n”); while(p!=NULL) {printf(“%4s%8s%6s%6d\n”,p->num, p->name, p->sex, p->age); p=p->next; } printf(“Input age:”); scanf(“%d”,&iage); pt=head; p=pt; if(pt->age==iage) {p=pt->next; head=pt=p; find=1; } else pt=pt->next; while(pt!=NULL) {if(pt->age==iage) {p->next=pt->next; find=1; } else p=pt; pt=pt->next; } if(!find) printf(“Not found%d.”,iage); p=head; printf(“\n NO.name sex age\n”); while(p!=NULL) { printf(“%4s%8s”,p->num,p->name); printf(“%6s%6d”,p->sex,p->age); p=p->next; } } 11.12将一个链表按逆序排列,即将链头当链尾,链尾当链头。 解: # define NULL 0 struct stu {int num; struct stu *next; } main() {int len=1l struct stu *p1,*p2,*head,*new,*newhead; p1=p2=head=(struct stu * )malloc(sizeof(strct stu)); printf(“input number(0:list end):”); scanf(“%d”,&p1->num); while(p1->num!=o) {p1=(struct stu*)malloc(sizeof(struct stu)); printf(“input number(n:listend):”); scanf(“%d”,&p1->num); if(p1->num==0) p2->next=null; else {p2=>next=p1; p2=p1; len++; } } p1=head; pritnf(“\n the original list:\n”); do {printf(“%4d”,p1->num); if(p1->next!=NULL) p1=p1->next; } while(p1->next!=NULL) {p2=p1; p1=p1->next; } if(I==0) newhead=new=p1; else new=nes->next=p1; p2->next=NULL; } printf(\n\n The new listL\n); p1=newhead; for(I=0l;I<len;I++) {pritf(“4d,p1->num”); p1=p1->next, } printf(“\n”); 第12章 12.1编写一个函数getbits,从一个16位的 单元中取出某几位(即该几位保留原值,其余位为0)。函数调用形式为:getbits(value,n1,n2)其中value为该16位单元中的数据值,n1为欲取出的起始位,n2为欲取出的结束位。 解:main() {unsingned int a; int n1,n2; printf(“input an octal number:”); scanf(“%o”,&a); printf(“input n1,n2:”); scanf(“%d,%d”,&n1,&n2); printf(“result:%o\n”,getbits(a,n1-1,n2)); } getbits(unsigned value,int n1,n2) {unsigned int z; z=~0; z=(z>>n1)&(z<<(16-n2); return(z);; } 12.2写一个函数,对一个16位的二进制数驱除它的奇数位。 解:main() {unsigned getbits(unsigned); unsigne int a; printf(“\ninput an octal number:”); scanf(“%o”,&a); printf(“result:%o\n”,,getbits(a)); } unsigner getbits(unsigned value) {int I,j,m,n; unsigned int z,a q; z=0; for(I=1;I<=15;I+=2) {q=1; for(j=1;j<=(16-I-1)/2;j++) q=q*2; a=value>>(16-i); a=a<<15; a=a>>15; z=z+a*q; } return(z); } 12.3编一程序,检查一下年一所用的计算机系统的C编译在执行有移时是按照逻辑位移的原则,还有按照算术右移的原则。如果是逻辑右移,请编一函数实现算术右移。如果是算术右移,请编写一函数实现逻辑右移。 解: main() {int a,n,m; a=~0; if(a>>5)!=a {printf(“\nTurbo C,logical move!\n”); m=0; } else {printf(“\nTurbo C,arithmetic move!\n”); m=1; } printf(“input an octal number:”); scanf(“%o”,&a); printf(“how mang digit move thwards the right ::”); scanf(“%d”,&n); if(m==0) printf(“Arithmetic right move,result:%o\n”,getbits1(a,n)); else printf(“Logical ritht move,result:%o”, getbits2(a,n)); } getbits1(unsigned value,int n) {unsigned z; z=~0; z=z>>n; z=~z; z=z|(value>>n); return(z); } egtbit2(unsigned valud,int n ) {unsigned z; z=(~(1>>n)&(value>>n)); } 12.4编一函数用来实现左右循环移位。函数名为move,调用方法为: move(value,n) 其中value为要循环位移的数,n为位移的位数。 解: main() {unsigned moveright(unsigned,int); unsigned moveleft(unsigned,int); unsigned a; int n; printf(“\n input an octal number:”); scanf(“%o”,&a); printf(“input n:”); scanf(“%d”,&n); if(n>0) {moveright(a,n); printf(“result:%o\n”,moveright(a,n)); } else {n=-n; moveleft(a,n); printf(“result:%o\n”,moveleft(a,n)); } } unsigned moveright(unsigned value,int n) {unsigned z; z=(value>>n)|(value<<(16-n)); return(z); } unsigned moveleft(unsigned value,int n ) {unsigned z; z=(value>>(16-n))|(value<<n); return(z); } 12.5设计一个函数,使给出一个数的原码,能得到该数的补码。 解: main() {unsigned int a; unsigned int getbits(unsigned); pritf(“\nInput an octal number:”); scanf(“%o”,&a); printf(“result:%o\n”,getbits(a)); } unsigned int getbits(unsigned value) {unsigned int z; z=value&0100000; if(z==0100000) z=~value+1; else z=value; return(z); } 第十三章 13.4从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束。 解:#include <stdio.h> main() { File *fp; Char str[100]; Int I=0; If((fp=fopen(“test”,”w”)==NULL) {printf(“Can not open the file\n”); exit(0); } printf(“Input a string:\n”); gets(str); while(str[i]!=’!’) {if (str[i]>=’a’&&str[i]<=’z’) str[i]=str[I-32]; fputc(str[i],fp); I++; } fclose(fp); fp=fopen(“test”,”r”); fgets(str,strlen(str)+1,fp); printf(“%s\n”,str); fclose(fp); } 13.5有两个磁盘文件”A”和”B”,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件”C”中。 解:#include<stdio.h> main() { FILE *fp; Int I,j,n,i1; Char c[100],t ,ch; If((fp=fopen(“a1”,”r”))==NULL) {printf(“can not open the file\n”); exit(0); } printf(“\n file A:\n”); for(I=0;(ch=fgetc(fp)!=EOF;I++) {c[i]=ch; putchar(c[i]); } fclose(fp); i1=I; if((fp=fopen(“b1”,”r”))==NULL) {printf(“\n can not ipen the file”); exit(0); } printf(“\n file B:\n”); for(I=i1;(ch=fgenc(fp))!=EOF;I++) {c[i]=ch; putchar(c[i]); } fclose(fp); n=I; for(i=0;I<n;I++) for(j=I+1;j<n;j++) if(c[i]>c[j]) {t=c[i]; c[i]=c[j]; c[j]=t; printf(“\n file C:\n”); fp=fopen(“c1”,”w”); for(I=0;I<n;I++) {putc(c[i],fp); putchar(c[i]); } fclose(fp); } 13.6有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 解: #include<stdio.h> struct student {char num[10]; char name[8]; int score[3]; float ave; }stu[5]; main() {int I,j,sum; FILE *fp; For(I=0;I<5;I++) {printf(“\n input score of student%d:\n”,I+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name:”); scanf(“%s”,stu[i].name); sum=0; for(j=0;j<3;j++) {printf(“score %d :”j+1); scanf(“%d”,&stu[i].score[j]); sum+=stu[i].score[j]; } stu[i].ave=sum/3.0 } fp=fopen(“stud”,”w”); for(I=0;I<5;I++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf(“File write error\n”); fclose(fp); fp=fopen(“stud”,”r”); for(I=0;I<5;I++) {fread(&stu[i],sizeof(struct student),1,fp); printf(“%s,%s,%d,%d,%d,%6.2f\n”,stu[i].num,stu[i].name,stu[i].score[0], stu[i].score[1], stu[i].score[2] ,stu[i].ave); } } 13.7将上题stud文件中的学生数据按平均分进行排序处理,并将已排序的学生数据存入一个新文件stu-sort中。 解: #include <stdio.h> #define N 10 struct student {char num[10]; char name[8]; int score[3]; float ave; }st[N],temp; main() { FILE *fp; Int I,j,n; If((fp=fopen(“stud”,”r”))==NULL) {printf(“can not open the file”); exit(0); } printf(“\n file ‘stud’:”); for(I=0;fread(&st[i],sizef(struct student),1,fp)!=0;I++) {printf(“\n%8s%8s”,st[i].num,,st[i].name); for(j=0;j<3;j++) printf(“%8d”,st[i].score[j]); printf(“%10.f”,st[i].ave); fclose(fp); n=I; for(I=0;I<n;I++) for(j=I+1;j<n;j++) if(st[i].ave<st[j].ave) {temp=st[i]; st[i]=st[j]; st[j]=temp; } printf(“\nnow:”); fp=fopen(“stu-sort”,”w”); for(I=0;I<n;I++) {fwrite(&st[i],sizeof(struct student),1,fp); printf(“\n%8s%8s”,st[i].num,st[i].name); for(j=0;j<3;j++) printf(“%8d”,st[i].score[j]); printf(“%10.2f”,st[i].ave); fclose(fp); } 13.8将上题以排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。 解:#include <stdio.h> struct student {char num[10]; char name[8]; int score[3]; float ave; }st[10],s; main() {FILE *fp, * fp1 ; int I,j,t,n; printf(“\n NO.:”); scanf(“%s”,s.num); printf(“name:”); scanf(“%s”,s.name); printf(“score1,score2,score3:”); scanf(“%d,%d,%d”,&s. score[0], &s. score[1], &s. score[2]); s.ave=(s.score[0]+s.score[1]+s.score[2])/3.0; if((fp=fopen(“stu_sort”,”r”))==NULL) {printf(“can not open file.”); exit(0); } printf(“original data:\n”); for(I=0;fread(&st[i],sizeof(struct student),1,fp)!=0;I++) {printf(“\n%8s%8s”,st[i].num,st[i].name); for(j=0;j<3;j++) printf(“%8d”,st[i].score[j]); printf(“%10.2f”,st[i].ave); } n=I; for(t=0;st[t].ave>s.ave&&t<n;t++); printf(“\nnow:\n”); fp1=fopen(“sort1.dat”,”w”); for(I=p;j
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页