红皮书 - C语言程序设计实用教程参考答案

更新时间:2024-02-27 01:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题解答

习题1

1.Dennis Ritchie

2.源代码文件:所谓源代码文件就是按着C语言的语法规则,使用文本编辑器编写的扩展名为.c的文本文件。目标文件:编译器对源文件进行编译后,编译器将源文件转化为一个二进制文件,该二进制文件被称作源文件的目标文件。目标文件的名字与源文件的名字相同,但扩展名为.obj。可执行文件:供链接器将目标文件需要链接的函数链接在一起、形成一个完整的可执行的代码并向可执行文件加入操作系统的启 动代码。可执行文件

可以脱离开发环境独立运行。 3.不是。

4.目标文件中。

5.在工程Sun中添加earth.c源文件,见左图1,earth.c代码如下:

#include int multiply(int,int); int main(){ int result=0;

result=multiply(20,10); printf(\ getchar(); }

int multiply(int x,int y){ return x*y; }

左图1 工程Sun 源文件:earth.c 工程: Sun

6. 在工程City中添加student.c、school.c等源文件,见左图2,代码如下: 源文件: sudent.c

int add(int x,int y){ return x+y; }

工程: City 源文件: teacher.c

int sub(int x,int y){ return x-y; }

左图2 工程City

sudent.c teacher.c school.c

源文件: school.c

#include \int add(int,int); int sub(int,int); int main(){

int result1=0,result2=0; result1=add(5,3); result2=sub(5,3);

printf(\ return 0; }

习题2

1.以下(A)~(B)中哪个叙述是正确的。

(D) 一个C 程序可以由多个函数构成,这些函数可以分别写在多个源文件中。

2.需要。

3.

(1)函数封装代码便于程序的模块化管理

让C程序由若干个函数所构成,每个函数负责完成一定的任务,而且一个C程序可以将它使用的各个函数存放在一个源文件中,也可以将它使用的各个函数分别存放在不同的源文件中,当程序需要修改某个函数时,只需要重新编译该函数所在的源文件即可,不必重新编译其他函数所在的源文件,因此,用函数封装解决某一问题的过程便于程序的模块化管理、有利于系统的维护。

(2)函数封装代码便于在程序设计过程中代码复用,提高效率

由于一个源文件中的函数可以被多个C程序链接使用,这非常有利于代码的复用,比如,如果某个程序员想计算圆和梯形的面积,那么这个程序员无需知道计算圆面积的算法和计算梯形面积的算法,只要在他编写的main函数中调用(链接)circle.c 和lader.c中的函数即可,也就是说circle.c 和lader.c中的函数就是可复用的代码。 4.

可以编译、链接、运行成功 Allmans风格:

#include int main() { int a,b,c;a=12;b=100,c=-23; printf(\ printf(\printf(\}

Kernighan风格:

#include int main(){ int a,b,c;a=12;b=100,c=-23; printf(\ printf(\

printf(\}

习题3

1.B D

2.不能通过编译

3.下列程序的输出结果不是10,而是一个随机数。y没有初值。 4.B C 5.B

6.(A) &x

7.(D) 56Tiger198 8.(C) Ta

e 9.

#include

#define PI 3.1415926 //定义符号常量 int main() {

double radius; //圆半径 double circleArea; //圆面积 double circleLength; //圆周长

radius = 100.12;

circleArea = PI*radius*radius; //使用const常量

circleLength = 2*PI*radius; //使用const常量

printf(\半径是%0.8f圆的面积:%0.8f\\n\ printf(\半径是%0.8f圆的周长:%0.8f\\n\ getchar(); return 0; }

10.

#include #include

int main(){ int highTemperature; //最高气温

int lowTemperature; //最低气温

int highSubLow; //最高气温与最低气温的差

printf(\现在输出的最高气温是不可预测的垃圾值:%d\\n\scanf(\printf(\最高气温:%d\\n\printf(\最低气温:%d\\n\highSubLow = highTemperature - lowTemperature;

printf(\请输入最高气温和最低气温(用空格或回车分隔两个整数): \

printf(\最高气温与最低气温的差:%d\\n\system(\return 0;

} 11.

#include

int main() { double elephantWeight; //存储大象重量

double antOne,antTwo; //存储两只蚂蚁的重量 double weightSum; //存放重量和 printf(\请输入大象和两只蚂蚁的重量:\

scanf(\printf(\两只蚂蚁的重量分别是:\\n\

printf(\和%0.20f\\n\

weightSum = antOne+antTwo; printf(\两只蚂蚁的重量和:\

printf(\printf(\printf(\大象的重量是:\\n\printf(\

weightSum =elephantWeight+antOne+antTwo; printf(\大象与两只蚂蚁的重量和:\

printf(\printf(\return 0;

}

12.

#include

int main() { char letter1,letter2,letter3,letter4,letter5,end; printf(\请连续输入5个大写字母(然后按Enter):\

letter1 = getchar(); letter2 = getchar();

letter3 = getchar(); letter4 = getchar();

letter5 = getchar();

end = getchar(); //得到用户输入5个字母之后按的回车字符

putchar(letter1+32); putchar(letter2+32);

}

putchar(letter3+32); putchar(letter4+32); putchar(letter5+32); putchar('\\n'); return 0;

习题4

1.(A) 76 (B) 7 (C) 22 (D) 3.5

2.(A) 9 (B) 8 (C) 7 (D) 6 3.B

4. (A) 12 (B) 13 (C) 12.08 (D) 20.0 5. (B) 3 6. (A) 72

7. (D) 2*x, x += 2 8. (C) c<'Z' && c >= 65 9.

3,1 3,1 0,3,1 1,3,1 10.c,c,c 99,99,99 11.x=7,y=3 z=18 12.T

0 1 1

13.一共4条语句 14.

#include

int main(){

int a,b,c;

double result;

printf(\请从键盘输入a,b,c的值,数之间用空格或回车分隔:\\n\ scanf(\ result =2.0/3*a+5.0/6*b+6.0/7*c; printf(\ printf(\ return 0;

} 15.

#include

int main(){

int number; short position1,position2,position3,position4 ; printf(\请从键盘输入number的值:\

scanf(\position4 =number/1000; position2 =number0/10;

position3 =number00/100;

position1 =number; printf(\中个位上的数字是%d\\n\ }

printf(\中十位上的数字是%d\\n\printf(\中百位上的数字是%d\\n\printf(\中千位上的数字是%d\\n\return 0;

习题5

1.y = 100;;处多了一个分号。

2.(A)_10,129___(B)2,-129__(C)__55,129___(D)_2,0_ 3. Tiger

#include int main() {

int x = 10; if(x >= 0){ if(x>0){ printf(\ } else{ printf(\ }

} else{ printf(\ }

return 0; } 4. 30。

5.BAAA 6.

#include int main(){ int a,b,c,d; int temp; int count = 0; printf(\输入a,b,c,d的值,用空格或回车分隔:\ scanf(\ if(a>b) { temp = a; a = b; b = temp; count++; printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ }

if(a>c) { temp = a; a = c; c = temp; count++;

printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ }

if(a>d) { temp = a; a = d; d = temp; count++; printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ } if(b>c) { temp = b; b = c; c = temp; count++; printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ } if(b>d) { temp = b; b = d; d = temp; count++; printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ } if(c>d) { temp = c; c = d; d = temp; count++; printf(\第%d次排序结果:a=%d,b=%d,c=%d,d=%d\\n\ } if(count == 0) { printf(\ } return 0; } 7.

#include int main(){ int score; printf(\输入学生成绩的值(1~100之间),用空格或回车分隔:\ scanf(\ if(score>=90) {

printf(\优\\n\ } else if(score>=80) { printf(\良\\n\ } else if(score>=70) { printf(\中\\n\ }

else if(score>=60) { printf(\及格\\n\ } else { printf(\不及格\\n\ } return 0; } 8.

#include int main(){ int a,b,c;

printf(\输入三角形的三个边,用空格或回车分隔:\ scanf(\ if(a else{ printf(\不能构成三角形\ }

return 0; } 9.

#include int main() {

int number;

printf(\输入一个正整数:\ scanf(\

if(number%3==0){ printf(\ }

else if(number%3==1){ printf(\ }

else if(number%3==2){ printf(\ }

return 0; }

10.(也可以参考5.3节用if-else if -else 条件分支语句解决此问题) #include int main() {

int number; double cost;

printf(\输入用水量(正整数):\ scanf(\ switch(number){ case 1: case 2: case 3: case 4: case 5: cost=number*2.3; break; case 6: case 7: case 8: case 9: case 10: case 11: case 12: cost=number*5; break; default:

cost=number*6; }

printf(\水费为%.2f元\\n\ return 0; }

习题6

1.下列程序的输出结果是_sum=25,i=11_。 2.下列程序的输出结果是_1,2,0_____。 1. 下列程序的输出结果是__15____。 2. 下列程序的输出结果是__2____。

3. 下列程序的输出结果是_123_。 4. 下列程序的输出结果是__25__。

5. 下列程序的输出结果是__ sum=321____。 6. 下列程序的输出结果是___ sum=88888___。 7. 下列程序的输出结果是__123____。

8. 下列程序运行时,从键盘输入shoping<回车>,程序输出的结果是__shop___。 9. 下列程序运行时,从键盘输入girl<回车>,程序输出的结果是__ giir$___。 10. while循环中的【表达式】应当是_(A). number!=0 ______。 11.

#include \int main(){ char c; int n=0;

c=getchar();

while(c!='\\n'){

if((c<='z'&& c>='a')||(c<='Z'&&c>='A'))

n++;

c=getchar(); }

printf(\一共有=%d个字母\ return 0; } 14.

方法之一 #include \

int main(){ int i=0,item1=-4,item2=1;

double item3=1;

double item4=0; int sum1=0;

int sum2=0; double sum3=0;

double sum4=0;

//求第一个数列的前100项之和

for(i=1;i<=100;i++){

sum1=sum1+item1; item1=item1+2;

}

printf(\前100项之和为 %d\\n\

//求第二个数列的前100项之和 for(i=1;i<=100;i++){ sum2=sum2+item2;

item2=item2+4;

}

printf(\?前100项之和为 %d\\n\ //求第三个数列的前100项之和 for(i=1;i<=100;i++){

sum3=sum3+item3; item3=item3*3;

}

printf(\?前100项之和为 %E\\n\ //求第四个数列的前100项之和

for(i=1;i<=100;i++){

item4=item4+i; sum4=sum4+item4;

}

printf(\?前100项之和为 %E\\n\ return 0;

}

方法之二(只在求第四个数列的前100项之和处与方法一有差异) #include \int main(){

int i=0,j=0,item1=-4,item2=1; double item3=1;

double item4=0;

int sum1=0; int sum2=0;

double sum3=0; double sum4=0;

//求第一个数列的前100项之和 for(i=1;i<=100;i++){

sum1=sum1+item1;

item1=item1+2; }

printf(\前100项之和为 %d\\n\

//求第二个数列的前100项之和 for(i=1;i<=100;i++){ sum2=sum2+item2;

item2=item2+4;

}

printf(\?前100项之和为 %d\\n\

//求第三个数列的前100项之和 for(i=1;i<=100;i++){ sum3=sum3+item3;

item3=item3*3;

}

printf(\?前100项之和为 %E\\n\

//求第四个数列的前100项之和

for(i=1;i<=100;i++){

for(j=1,item4=0;j<=i;j++){ item4=item4+j; }

sum4=sum4+item4; }

printf(\?前100项之和为 %E\\n\ return 0;

}

15.编程输出等差数列的前n项和,其中等差数列的首项、公差和求和项数n的值从键盘输入。

#include \int main(){ int i=0; int a1=0; //首项 int t=0; //公差

int n=0; //求和项数

double sum=0;//数列的前n项之和

int item=0;

printf(\请输入首项、公差和求和项数n,用空格或回车分隔:\ scanf(\ item=a1; for(i=1;i<=n;i++){

sum=sum+item; item=item+t; }

printf(\首项为%d,公差为%d的等差数列前%d项之和为%E\\n\ return 0; }

16.编程输出1!+2!+3!...的前10项和。 方法之一

#include \int main(){

int i=0,n=1;

double fact=1;//求和的每一项(阶乘)

double sum=0;//前10项之和 while(n<=10){ sum=sum+ fact;

n++;

fact=fact*n;

}

printf(\的前10项和为%E\\n\ return 0; }

方法之二(利用循环嵌套)

#include \int main(){

int i=0,n=1;

double fact=1;//求和的每一项(阶乘)

double sum=0;//前10项之和

while(n<=10){ fact=1;

i=1;

while(i<=n){ // n的阶乘

fact=fact*i; } i++;

sum=sum+ fact; n++;

}

printf(\的前10项和为%E\\n\ return 0;

}

17.编写程序输出1~100之间不能被2除尽或不能被3除尽的数,并计算输出它们的和。

#include \int main(){

int i=0;

double sum=0,t=0; //满足条件的各项之和 for(i=0;i<=100;i++){ if( (i%2!=0) ||(i%3!=0)){

}

printf(\ \sum=sum+i;

}

printf(\满足条件的各项之和为%E\\n\

return 0;

}

18.编写程序输出如下排列格式的字符。

A BB CCC DDDD EEEEE

#include \int main(){

int i=0,j=0;

char ch='A';

for(i=1;i<=5;i++){ for(j=1;j<=i;j++){ printf(\ }

printf(\ ch=ch+1; }

return 0; }

19.改进例子6的猜数字游戏,使得具有如下功能:

? 当猜测次数操作10次时,禁止用户继续猜测(用break结束循环),并输出“你要好好想一想呀,要动脑呀!” ? 当猜测次数少于5次时,程序输出“你好聪明呀!”

#include #include #include int main(){

int randomNumber; //随机数 int guess; //用户的猜测

int count = 0; //记录用户的猜测次数 int ok = 0;

srand(time(NULL)); //用当前时间做随机种子

printf(\给你一个1至100之间的数,请猜测:\\n\ randomNumber = rand()0+1; ok = scanf(\ if(ok==0){ printf(\发生输入错误,程序退出\ exit(0); }

count++;

while(guess != randomNumber) { count++; if(guess > randomNumber){ printf(\猜大了,请再猜:\\n\ } else if(guess < randomNumber){ printf(\猜小了,请再猜:\\n\ }

if(count>10){ //判断是否超过10次 break; } ok =scanf(\ if(ok==0){ printf(\发生输入错误,程序退出\ exit(0); } }

//判断次数,决定如何输出 if(count<5){

printf(\您猜对了,共猜了%d次,这个数就是:%d\\n\ printf(\你好聪明呀!\ }

else if(count<=10)

printf(\您猜对了,共猜了%d次,这个数就是:%d\\n\ else printf(\你要好好想一想呀,要动脑呀!\ return 0; }

20.数学上有一个计算?的公式:

?1111?1?????

43579编写程序,计算并输出?的近似值,小数点保留12位。 #include #include

int main(){ double sum=0,fenzi=1,fenmu=1,dx=1;

while(fabs(dx)>1E-6){ //更换为1E-10可提高精度,但作者的机器稍有延迟出结果 sum=sum+dx; fenzi=-fenzi; fenmu=fenmu+2; dx= fenzi/fenmu; }

printf(\

return 0;

}

21.编写程序,输出100内具有10个以上(含10个)因子的整数,并输出它的全部因子(例如,60一共有1,2,3,4,5,6,10,12,15,20,30,60十二个因子)。

#include #include int main(){ int i=0,j=0;

int count=0;//因子个数 for(j=10;j<=100;j++){ count=0; for(i=1;i<=j;i++){ if(j%i==0){ count++; } } if(count>=10){

printf(\有\ for(i=1;i<=j;i++){ if (j%i==0) printf(\ } printf(\共%d个因子 \\n\ } }

return 0; }

习题7

1. (B) void f(int,int,int); 2. (C) void add(int x,int y){

}

3. 37 4. 10 5.A 6. 9,6 7. 7 8. 6,12 9. 6,6

10. 290 11.

#include #include

float tringle(float,float,float); int main(){ float a,b,c,tringle_area; printf(\请输入三角形的三边的值: \ scanf(\ tringle_area=tringle(a,b,c); printf(\三角形的面积是: %.2f\\n\ return 0; }

float tringle(float a,float b,float c){ float s,p; p=(a+b+c)/2.0f; s=(float)sqrt(p*(p-a)*(p-b)*(p-c)); return s; } 12.

#include void f(int n); int main(){ int n=200; printf(\以下输出1至200之间的全部素数\\n\ f(n); return 0;

}

void f(int n){ int i,j; int isPrimNumber =1; //记录i是否是素数的变量 int count =0; //存放数素的个数 for(i=1;i<=n;i++){ for(j=2,isPrimNumber=1;j<=i/2;j++){//该循环语句负责寻找i的因子 if(i%j==0){ isPrimNumber = 0; //一旦找到因子,就记录i不是素数 break; //结束内循环(没必要找到多个因子) } } if(isPrimNumber){ count++; printf(\ if(count%6==0) //打印6个素数之后输出一个回行 printf(\ } } } 13.

#include void g(int n); int main(){ int n=9000; printf(\以下输出1至9000之间的全部完数\\n\ g(n); return 0; }

void g(int n){ int sum,i,j; for(i=1;i<=n;i++){ for(j=1,sum=0;j<=i/2;j++){ //该循环语句负责计算i的因子之和 if(i%j==0){ sum=sum+j; } } if(sum==i){ //判断i的因子之和是否等于i printf(\是一个完数\\n\ }

} 14.

}

#include double pi(int n); int main(){ double p1=0,p2=0; p1=pi(200); p2=pi(10000); printf(\ printf(\ return 0; }

double pi(int n){ int a=1,t=1; double item=1.0/a,sum=0; while(a<=n) { sum=sum+t*item; t=-t; a=a+2; item=1.0/a; }

return 4*sum; } 15.

#include long f(int n); int main(){ long number=f(100);

printf(\数列的第100项为%ld\\n\ return 0; }

long f(int n){ long result; if(n==1) result = 10; else if(n >=2) result = 3*f(n-1)+1; //调用自身 return result; }

习题8

1.(B)

2.2,0

3. a[0] 的元素值是 {1,2,0},a[1] 的元素值是{3,1,0},a[2]的元素值是{0,0,0} 4.破坏了先定义后使用的原则,非法使用内存,蕴含着破坏性的危险。 5.(C) 程序输出的结果无法确定。 6. 2 7 9 5 3 1

7. 9 7 5 3 2 1 8. 1 88 5 99 8

9. 11 21 31 41 51 61

10. 10 9 3 4 5 6 7 8 2 1

11.

#include

void sortQipao(int [],int); //起泡排序函数的原型 int main(){ int a[10],i;

for(i=0;i<10;i++){ scanf(\ }

sortQipao(a,10); for(i=0;i<10;i++){ printf(\ } return 0; }

void sortQipao(int a[],int N){ int m,i,t;

for(m = N-1; m>=0;m--) { for(i = 0;i < m;i++){ if(a[i]

#include

double scoreAverage(int a[],int N); //程序输出平均成绩的函数的原型。

void sortQipao(int [],int); //起泡排序函数的原型,用于学生成绩排序 int scoreMax(int a[],int N); //输出最高成绩的函数的原型 int scoreMin(int a[],int N); //输出最低成绩的函数的原型 int main(){

int score[10],i; for(i=0;i<10;i++){ scanf(\ }

printf(\平均成绩为: %f\\n\verage(score,10)); sortQipao(score,10);

printf(\排序后的成绩为:\ for(i=0;i<10;i++){ printf(\ }

printf(\

printf(\最高成绩为: %d\\n\ printf(\最低成绩为: %d\\n\ return 0; }

void sortQipao(int a[],int N){ //起泡排序函数,用于学生成绩排序 int m,i,t;

for(m = N-1; m>=0;m--) { for(i = 0;i < m;i++){ if(a[i]

double scoreAverage(int a[],int N){ //输出平均成绩的函数 int i,sum=0; double result; for(i=0;i

}

result=sum*1.0/N; return result; }

int scoreMax(int a[],int N){ //输出最高成绩的函数 int i,max=a[0];

for(i=1;ireturn max;

}

int scoreMin(int a[],int N){ //输出最低成绩的函数 int i,min=a[0]; for(i=1;ia[i]) min=a[i]; }

return min; } 13.

#include

float otherSum(float a[3][3]); //计算3×3矩阵的反对角线之和函数的原型 int main(){

float a[3][3] = {{1.12f,2.97f,0.3f},{4.76f,0.05f,1.6f},{7.88f,1.81f,2.9f}}; printf(\矩阵A的反对角线元素之和:%f\\n\ return 0; }

float otherSum(float a[3][3]){ float sum = 0;

int i,j; //控制循环的变量 for(i=0;i<3;i++){ for(j=0;j<3;j++){ if(i==(2-j)){ sum = sum +a[i][j]; } } }

return sum; } 14.

#include int main(){

int i=0,j=0,k=0;

float a[3][3] = {{1.12f,2.97f,0.3f},{4.76f,0.05f,1.6f},{7.88f,1.81f,2.9f}}; float b[3][3] = {{1.0f,2.0f,3.0f},{4.0f,5.0f,6.0f},{7.0f,8.0f,9.0f}}; float c[3][3]={0}; for(i=0;i<3;i++){

} 15.

for(j=0;j<3;j++){ for(k=0;k<3;k++){ c[i][j] = c[i][j]+a[i][k]*b[k][j]; } } }

for(i=0;i<3;i++){ for(j=0;j<3;j++){ printf(\ \ }

printf(\}

return 0;

#include

void rowQipao(int a[],int N); int main(){

int i=0,j=0;

int a[3][4] = {{7,2,0,4},{4,2,6,7},{7,8,9,1}}; for(i=0;i<3;i++){ rowQipao(a[i],4); }

for(i=0;i<3;i++){ for(j=0;j<4;j++){ printf(\ \ } printf(\ }

return 0; }

void rowQipao(int a[],int N){ //起泡排序函数,用于数组的每行绩排序 int m,i,t;

for(m = N-1; m>=0;m--) { for(i = 0;i < m;i++){ if(a[i]>a[i+1]){ t = a[i+1]; a[i+1] = a[i]; a[i] = t; } } } }

习题9

1. (C)

2.能通过编译。但为地址值是12的内存赋值,运行有危险,发生系统异常. 3. p+1值是1005,p-2的值是993。 4. 10,8 10,8,80 5. 3,2 2,3 6. 30,-20 7. -20,30 8. 12,16,40 9.

#include #define N 100

int get(int,int *); //函数原型 int main(){ int count = 0; }

int sum;

sum = get(N,&count); //将count的地址传递给函数,并得到函数的返回值 printf(\之间能被3和7同时除尽的整数的个数是%d\\n\printf(\之间能被3和7同时除尽的整数和是 %d\\n\return 0;

int get(int n,int *p){ int i,sum = 0; } 10.

for(i=1;i<=n;i++){ if((i%3==0 ) && (i%7==0)){ (*p)++; //p间接访问main 函数中的count

sum = sum+i;

} }

return sum;

#include #define M 100 #define N 200

void getPrimNmber (int,int ,int *) ;//函数原型 int main(){ int count = 0;

getPrimNmber(M,N,&count); //将count的地址传递给函数,并得到函数的返回值 printf(\之间的素数的个数是%d\\n\

return 0; }

void getPrimNmber (int m,int n,int *p){ int i,j;

int isPrimNumber =1; //记录i是否是素数的变量 for(i=m;i<=n;i++){ for(j=2,isPrimNumber=1;j<=i/2;j++){//该循环语句负责寻找i的因子 if(i%j==0){ isPrimNumber = 0; //一旦找到因子,就记录i不是素数 break; //结束内循环(没必要找到多个因子) } } if(isPrimNumber){ (*p)++; //p间接访问main 函数中的count //k++; printf(\ if((*p)%6==0) //打印6个素数之后输出一个回行 printf(\ } } }

习题10

1. (C)

2. 能通过编译,运行有危险,p=p+1;将指针指向数组a最后一个元素的后面,*p = -111;这种赋值就很危险。 3. 500 4.600 5. 5 6. 6

6 100 7.100,300 8. 300

102 9. 5,17 10.

#include int main(){

int a[4][3] = {{88,78,77},{69,98,80},{90,88,90},{66,97,95}}; int *p[4]; int i,j;

p[0] =&a[0][0]; p[1] =&a[1][0];

p[2] =&a[2][0]; p[3] =&a[3][0];

for(i=0;i<4;i++){ //排序数组p }

for(j=i+1;j<4;j++){ if(p[j][1]>p[i][1]){ }

}

int * t; t=p[i]; p[i]=p[j]; p[j]=t;

for(i=0;i<4;i++){

for(j=0;j<3;j++){ }

printf(\

} 11.

printf(\

}

return 0;

#include

void rotateToRight(int *,int);//负责旋转数组的函数原型 int main(){ }

int a[5] = {1,2,3,4,5}; int size =5,i,k;

for(k=1;k<=5;k++){ printf(\旋转%d次后:\ } return 0;

rotateToRight(a,5); //向右旋转数组a for(i=0;i

printf(\

void rotateToRight(int *p,int size){

int *q; }

int * min =p; p=p+size-1; q = p-1; }

int t = 0; t = *p; *p = *q; *q = t; p--; q--;

while(q>=min){

习题11

1. (C)

2.17

3 . 1 2 3 4 5 A B C D E 4.

2 4 11

13

5.能通过编译,有警告,运行有危险,将500赋值给没有声明使用的内存空间. 6.只修改源文件board.c 中的void showAdvertisement(void (*)())函数即可 board.c

#include

void showAdvertisement(void (*)()); void showAdvertisement(void (*p)()){ printf(\广告$$$$$$$$$\\n\ }

(*p)();

printf(\明亮广告制作有限公司----\\n\

习题12

1(C)

2. D会发生运行错误 3. AABC 4. 12

12

5.ABCD 6. ABCD123456 7. EDCBA 8.

#include int main(){ char str[3][60];

int i =0,j=0,cap[3]={0},low[3]={0},bla[3]={0}; int sum1=0,sum2=0,sum3=0; printf(\输入3行文本:\\n\ for(i=0;i<3;i++){

gets(str[i]);

}

for(i=0;i<3;i++){ for(j=0;j<60;j++){ if( str[i][j]!='\\0'){

if(str[i][j]<='Z' && str[i][j]>='A')

cap[i]++;

else if(str[i][j]<='z' && str[i][j]>='a') low[i]++; else if(str[i][j]==' ')

bla[i]++;

}

else break;

}

}

for(i=0;i<3;i++){

printf(\第%d行大写字母%d个,小写字母%d\\n\

sum1=sum1+cap[i];

个,空格%d个

sum2=sum2+low[i];

sum3=sum3+bla[i]; }

printf(\三行中大写字母%d个,小写字母%d个,空格%d个\\n\

return 0; } 9.

#include int main(){ char str[80];

int i =0;

printf(\请输入一行文本:\\n\gets(str); while(1){ if(str[i]=='\\0'){

}

if(str[i]<='Z' && str[i]>='A') str[i]=(26-(str[i]-64)+1)+64; //对应密码的ASCII码值 else if(str[i]<='z' && str[i]>='a')

break;

str[i]=(26-(str[i]-96)+1)+96;

else str[i]=str[i]; } 10.

i++; } return 0;

puts(str);

#include #include int main(){

char a[20]=\int i,length_b;

length_b=strlen(b);

for(i=0;i<=length_b;i++){ //将字符串b全部复制到a,包括结束标志

}

a[i]=b[i];

puts(a); }

return 0;

11.

include #include int main(){

char a[20]=\ int i,length_a,length_b; length_a=strlen(a);

length_b=strlen(b);

for(i=0;i<=length_b;i++){ //将字符串b全部尾加到a,包括结束标志 a[length_a+i]=b[i]; }

puts(a);

return 0; } 12.

#include #include int main(){ char str[100];

char * p,*c;

int position =0,count =0; printf(\输入一行文本:\gets(str);

p = str;

while(*p!='\\0'){ c = strpbrk(p,\ //检索分隔符

if(c!=NULL){ position = c-p; //position存储一个单词的长度 }

if(position>0){ count++; p = p+position; //p指向一个单词之后 }

else{ p++; //遇到连续的分隔符 }

else { if((*p!=' ')&&(*p!='#')&&(*p!=',')){ //如果当前字符不是分隔符,这就是最后一个单 }

}

count++; break;

}

}

printf(\共有%d个单词\\n\return 0;

习题13

1. (A)

2. room = {\最后一行赋值号之后加大括号 3. B和D是错误的。 4. 20 5. 12 6. wqng:100 li:200 zhao:300

7.3.28 8.

#include typedef struct { int number; char * name; double score; } people; int main(){

people s[3]={{101,\ p=s;

for(;p<=s+2;p++) { printf(\ %s:%f\\n\ }

return 0; } 9.

#include #include #include typedef struct { short number; char *name; } Student;

void sort(Student [],int);//负责排序的函数原型 int main(){ Student grageOne[] = {{19,\ {2,\ int start,end,middle; char name[80]; //保存学生姓名

int N = sizeof(grageOne)/sizeof(Student); int count=0; printf(\输入一个学生姓名:\ gets(name); if(strcmp(name,\ printf(\非法输入,退出程序\ exit(0); } sort(grageOne,N); //排序数组 while(1){ start=0; end=N; middle=(start+end)/2; count=0; while(strcmp(name,grageOne[middle].name)!=0){ if(strcmp(name,grageOne[middle].name)>0) start=middle; else if(strcmp(name,grageOne[middle].name)<0) end=middle; middle=(start+end)/2; count++; if(count>N/2) break; } if(count>N/2) printf(\同学不在该班级组中.\\n\ else printf(\号,%s在该班级中.\\n\

grageOne[middle].number,grageOne[middle].name); printf(\再输入学生姓名(输入符号#号结束程序):\ gets(name); if(strcmp(name,\ printf(\非法输入,退出程序\ exit(0); } } return 0; }

void sort(Student a[],int N){ int m,i; for(m = N-1; m>=0;m--) { for(i = 0;i < m;i++){ if(strcmp(a[i].name,a[i+1].name)>0){

}

}

}

}

Student t = a[i]; a[i] = a[i+1]; a[i+1] = t;

习题14

1. 简单叙述打开文件的步骤。

打开文件的步骤如下:

(1)声明指针变量:使用FILE声明指针变量,File p;

(2)打开文件:通过调用fopen函数打开文件:p=fopen(文件名字,打开方式); 2.应当是二进制文件 3.文件应当是文本文件

4.按文本方式读取一个已存在的文本文件,使用fopen函数打开文本时,参数“打开方式”应当取\

5.读写文本文件和二进制文件的步骤 读写文本文的步骤:

1) 按文本方式打开要读写的文件。使用FILE声明指针变量,File p;

2) 调用fopen函数打开文件p=fopen(文件名字,打开方式);其中“打开方式”根据需要设

置参数“r”、“r+”、“w”、“w+”、“a” 或“a+”。 3) 可以使用fgetc()或fgets()函数读取打开的文件或者使用fputc()或fputs()函数向打开的文件写入文本。 读写二进制文件的步骤 1)

按二进制方式打开要读写的文件。使用FILE声明指针变量,FILE * p;

2) 调用fopen函数打开文件:p = fopen(文件名字,打开方式);,其中“打开方式”根据需要设置参数“wb”、“wb+”、“rb”或“rb+”。 3) 件。

以使用fwrite()函数向打开的文件写入数据或使用fread()函数读取打开的文

6.使用fseek(FILE *p,long offset,int origin)函数将读写位置定位到离当前读取位置之前的8个字节处,参数offset和origin应当取怎样的值?将读写位置定位到文件的开头,参数offset和origin应当取怎样的值?定位到离当前读取位置之后的3个字节处,参数offset和origin应当取怎样的值? fseek(p,-8,1) fseek(p,0,0) fseek(p,3,1) 7.ABCD 8. x=39,y=12 9.123123 10.CB 11.

#include #include

int main(){ FILE *p;

char str[]=\ int i=0,length;

length = strlen(str);

p=fopen(\ for(i=0;i

#include int main(){ FILE *p; char ch;

p=fopen(\ if(p!=NULL){ ch=fgetc(p); while(ch!=EOF){ printf(\ ch=fgetc(p); } fclose(p); } else{ printf(\文件不存在\ }

getchar(); return 0; } 13

#include

int main(){

double x=1.2,y=3.4;

int size=sizeof(double); FILE *p; int m=0;

p=fopen(\ m=fwrite(&x,size,1,p);

if(m==1){

printf(\成功将数据%lf写入二进制文件.\\n\

}

m=fwrite(&y,size,1,p);

if(m==1){

printf(\成功将数据%lf写入二进制文件.\\n\ } 12.

#include int main(){ FILE *p; double x,y; int m;

int size=sizeof(double);

p=fopen(\ m=fread(&x,size,1,p); if(m==1){ printf(\读入的一个double型数据存放在x中:\\n\ printf(\ }

m=fread(&y,size,1,p); if(m==1){ printf(\读入的一个double型数据存放在y中:\\n\ printf(\ }

fclose(p); return 0; } 13.

#include

#define N 3 //学生数量是3 typedef struct {

char name[20]; float math; float eng; float chi; float aver; } GOODS;

void saveGoods(GOODS [],char *);

} return 0;

fclose(p);

void outputGoods(char *); int main(){ int i;

GOODS goods[N];

char fileName[]=\ for(i=0;i

printf(\输入第%d个学生的语文分数:\ scanf(\ getchar();//消耗回车

goods[i].aver=(goods[i].math+goods[i].eng+goods[i].chi)/3; }

saveGoods(goods,fileName);

printf(\文件%s中保存的学生信息:\\n\ outputGoods(fileName); return 0; }

void saveGoods(GOODS goods[],char *fileName){ FILE *p; int i;

p=fopen(fileName,\ for(i=0;i

fclose(p); }

void outputGoods(char * fileName){ FILE *p; int i;

GOODS goods[N];

p=fopen(fileName,\ for(i=0;i

for(i=0;i

goods[i].name,goods[i].math,goods[i].eng,goods[i].chi,goods[i].aver); }

fclose(p); } 16.

#include

#define N 3 //学生数量是3 typedef struct {

char name[20]; float math; float eng; float chi; float aver; } GOODS;

void outputGoods(char *); int main(){

char fileName[]=\

printf(\文件%s中保存的学生信息:\\n\ outputGoods(fileName); return 0; }

void outputGoods(char * fileName){ FILE *p; int i;

GOODS goods[N];

p=fopen(fileName,\ for(i=0;i

for(i=0;i

fclose(p); }

17. 请预先在c:\\\\1000\\\\中准备两个文本文件ok1.txt和ok2.txt。

#include int main(){ FILE *p1,*p2; char ch;

//long position =0;

printf(\开始合并文件\\n\

p1=fopen(\ p2=fopen(\ ch=fgetc(p2);

while(!feof(p2)){ fputc(ch,p1); ch=fgetc(p2); }

fclose(p2);

rewind(p1); //将读写位置定位到文件的开头 printf(\读取到合并后的文件:\\n\ ch=fgetc(p1);

while(ch != EOF){ printf(\ ch=fgetc(p1); }

fclose(p1);

getchar(); return 0; }

18.请预先在c:\\\\1000\\\\中准备两个文本文件ok1.txt和ok2.txt。

#include int main(){

FILE *p1,*p2,*p3; char ch;

printf(\开始合并文件\\n\

p1=fopen(\ p2=fopen(\ p3=fopen(\ ch=fgetc(p1);

while(!feof(p1)){ fputc(ch,p3); ch=fgetc(p1); }

fclose(p1);

while(!feof(p2)){ fputc(ch,p3); ch=fgetc(p2); }

fclose(p2);

rewind(p3); //将读写位置定位到文件的开头

printf(\读取合并后的新文件:\\n\ //ch=fgetc(p3); while(!feof(p3)){ printf(\ ch=fgetc(p3); }

fclose(p3); getchar(); return 0; }

19.请预先在c:\\\\1000\\\\中准备文本文件ok1.txt。

#include int main(){ FILE *p1,*p2; char ch;

p1=fopen(\ p2=fopen(\ printf(\读取原文件: \ ch=fgetc(p1); while(!feof(p1)){

printf(\ ch=fgetc(p1); }

putchar('\\n');

rewind(p1); //将读写位置定位到文件的开头 while(!feof(p1)){

putc(ch^'a',p2); //用字母a与ok1中的字符进行异或运算加密文件,将密文送入文件ok2 ch=fgetc(p1); }

fclose(p1);

rewind(p2); //将读写位置定位到文件的开头 printf(\读取加密后的新文件:\\n\ while(!feof(p2)){ printf(\ ch=fgetc(p2); }

fclose(p2);

getchar(); return 0; }

习题15

1.D

2.本题使用尾插法

#include #include #include typedef

struct node { char ch;

struct node * next; } NODE; int main(){ int i = 0;

NODE * head = NULL; //空链表 NODE * newNode ;

NODE * foundEndNode;

printf(\请输入10个字符,用回车分隔: \\n\ for(i=0;i<10;i++){ newNode = malloc(sizeof(NODE)); //创建新节点 newNode->ch = getchar(); //设置新节点中包含的字符数据 getchar();//吃掉回车符 if(head == NULL){ newNode->next = head; //设置新节点是尾节点 head = newNode; //将头节点指向新节点 } else{ foundEndNode = head; while((foundEndNode->next) != NULL){ //寻找最后的节点 foundEndNode = foundEndNode->next; } foundEndNode->next = newNode ; //将最后一个节点的中的next指针指向新节点 newNode->next = NULL; //新节点设置成尾节点 } }

printf(\节点中的字符依次是:\\n\ while(head!=NULL){ printf(\ head = head->next; }

return 0; }

3.

#include #include #include typedef

struct node { int ch;

struct node * next; } NODE; int main(){ int i = 0;

NODE * head = NULL; //空链表

printf(\请输入10个整数,用回车分隔: \\n\ for(i=0;i<10;i++){ NODE * newNode = malloc(sizeof(NODE)); //创建新节点 scanf(\ //设置新节点中的数据 getchar(); //消耗掉回车符 newNode->next = head; //设置新节点指向的后继节点 head = newNode; //将新节点设置为链表的头节点 }

printf(\节点中的整数依次是:\\n\ while(head!=NULL){ printf(\ head = head->next; }

return 0; } 4.

#include #include #include typedef

struct node { int ch;

struct node * next; } NODE; int main(){ int i = 0;

NODE * head = NULL; //空链表 NODE * newNode ;

NODE * foundEndNode;

printf(\请输入10个整数,用回车分隔: \\n\ for(i=0;i<10;i++){

} 5.

newNode = malloc(sizeof(NODE)); //创建新节点 scanf(\ //设置新节点中包含的字符数据 getchar();//吃掉回车符 if(head == NULL){ newNode->next = head; //设置新节点是尾节点 head = newNode; //将头节点指向新节点 } else{ foundEndNode = head; while((foundEndNode->next) != NULL){ //寻找最后的节点 foundEndNode = foundEndNode->next; } foundEndNode->next = newNode ;//节点中的next指针指向新节点 newNode->next = NULL; //新节点设置成尾节点 } }

printf(\节点中的整数依次是:\\n\while(head!=NULL){ printf(\ head = head->next; }

return 0;

#include #include #include typedef

struct node { int number; struct node * next; } NODE; int main(){ int a[] ={12,34,22,15,36,66}; int i = 0,n=0; NODE * head = NULL; //空链表 NODE * newNode ; NODE * foundEndNode; int N = sizeof(a)/sizeof(int); for(i=0;inumber = a[i]; //设置新节点中包含的字符数据 if(head == NULL){

newNode->next = head; //设置新节点是尾节点 head = newNode; //将头节点指向新节点 } else{ foundEndNode = head; while((foundEndNode->next) != NULL){ //寻找最后的节点 foundEndNode = foundEndNode->next; } foundEndNode->next = newNode ; //节点中的next指针指向新节点 newNode->next = NULL; //新节点设置成尾节点 } } printf(\请输入一个学号: \\n\ scanf(\ getchar();

foundEndNode = head; while(1){ if( foundEndNode->number==n ){ printf(\这个学号在此链表中.\\n\ break; } if( foundEndNode->next==NULL){ printf(\这个学号不在此链表中.\\n\ break; }

foundEndNode = foundEndNode->next; } return 0; }

本文来源:https://www.bwwdw.com/article/ylla.html

Top