红皮书 - 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
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
Kernighan风格:
#include
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
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 x = 10; if(x >= 0){ if(x>0){ printf(\ } else{ printf(\ }
} else{ printf(\ }
return 0; } 4. 30。
5.BAAA 6.
#include
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
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
printf(\输入三角形的三个边,用空格或回车分隔:\ scanf(\ if(a else{ printf(\不能构成三角形\ }
return 0; } 9.
#include
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 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
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
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
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
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 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 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 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
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;i } int scoreMin(int a[],int N){ //输出最低成绩的函数 int i,min=a[0]; for(i=1;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 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 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 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 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 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 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 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 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 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 people s[3]={{101,\ p=s; for(;p<=s+2;p++) { printf(\ %s:%f\\n\ } return 0; } 9. #include 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 int main(){ FILE *p; char str[]=\ int i=0,length; length = strlen(str); p=fopen(\ for(i=0;i #include 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 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 //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 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 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 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 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 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 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;i 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; }
正在阅读:
小升初数学复习专题6:分数、百分数应用题专题训练(打印版)03-13
《亮剑》经典台词05-16
2017新婚姻法房产分配规定02-15
DW中css设置06-22
智慧园地(公因数和公倍数)09-26
全套IECQ QC080000-2017 有害物质过程管理体系文件(HSPM)06-08
二年级语文教学反思08-18
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 红皮书
- 程序设计
- 答案
- 语言
- 参考
- 实用
- 教程