C课后习题参考答案

更新时间:2024-05-31 14:00:01 阅读量: 综合文库 文档下载

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

习题参考答案

习 题 参 考 答 案

习 题 1

一、选择题

1、B 2、C 3、B 4、D 5、A 6、B 7、C 二、填空题

1、源程序文件 c 2、obj 3、可执行文件 exe 4、机器语言 汇编语言 高级语言 三、解答题 略 四、编程题 1、 main() {

printf(“Hello! Welcome to China!”);

} 2、 main() {int x;

scanf(“%d”,&x);

if(x>=20&&x<1000) printf(“x=%d”,x); else printf(“Input error!”); }

习 题 2

一、选择题

1、C 2、A 3、B 4、D 5、 A 6、D 7、B 8、B 9、B 10、D 11、D 12、B 13、A 14、B 15、C 二、填空题

1、整型、实型、字符型 2、用户标识符、关键字标识符 3、存储单元、符号地址、内存地址 4、十、十六、八 5、double(双精度型) 6、 8 7、5.500000 8、a=-32768

295

习题参考答案

9、+0017,021,0x11 三、写程序运行结果

3257 32 57

7.88, -345.12,7.8765,-345.1230 7.87654e+00, -3.5e+02 a,97,141,61 1234,2322,4d2 CHINESE, CHI 四、scanf函数的使用

a=3 b=7 8.5 71.82 A a

五、用scanf函数输入数据

10

20Aa1.5-3.75 123.45,67.8

注意,其中123.45可以是任意实数,因为该值将被跳过,不用于赋值。

习 题 3

一、选择题 1. C 2. B 3. D 4. D 二、填空题 基本概念题 1. 2 2. 2 3. 1

阅读程序写出运行结果题 4. 1.00 5. 1,0,1

6. 9,11,9,10

三、写出下面表达式运算后a的值,设原来a=12。 (1)24 (2)10 (3)60 (4)0

(5)0 (6)0

习 题 4

一、选择题

1、B 2、D 3、B 4、D 5、A 6、C 二、填空题

1、1,0,1 2、1,2,3

3、ch1>=′A′&&ch1<=′Z′ ch1=ch1-32; 三、编程题

296

习题参考答案

1、从键盘输入三个数,然后按照由小到大的顺序输出。要求,设三个数放在变量a、b、中,最后仍然按照a、b、c的顺序输出。

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

scanf(“%d,%d,%d”,&a,&b,&c); if(a>b) {t=a; a=b; b=t;} if(a>c) {t=a; a=c; c=t;} if(b>c) {t=b; b=c; c=t;} printf(“%d,%d,%d\\n”,a,b,c); }

2、编写程序根据以下的函数关系,对输入的x值输出相应的y值。

x y 2

#include main() {float x,y; scanf(“%f”,&x); if(x<=-1) y=x-1; else if(x<=2) y=2*x; else if(x<=10) y=x*(x+2); else printf(“Error!\\n”); printf(“y=%f\\n”,y); }

3、求一元二次方程ax2

+bx+c=0的解。 #include main()

{float a,b,c,d,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,&a,&b,&c); if(fabs(a)<=1e-6)

Printf(is not a quadratic); else

297

c习题参考答案

{disc=b*b-4*a*c; if(fabs(disc)<=1e-6)

printf(“has two equal roots:%8.4\\n”,-b/(2*a)); else if(disc>1e-6)

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

printf(“has distinct real roots:%8.4f and %8.4f\\n”,x1,x2); } else

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

imagpart=sqrt(-disc)/(2*a); printf(“has complex roots:\\n”);

printf(“%8.4f+%8.4fi\\n”, realpart,imagpart); printf(“%8.4f-%8.4fi\\n”, realpart,imagpart); } } }

4、假设工资税率如下,其中s代表工资,r代表税率:

s<500 r=0% 500<=s<1000 r=5% 1000<=s<2000 r=8% 2000<=s<3000 r=10% 3000<=s r=15%

编一程序实现从键盘输入一个工资数,输出实发工资数。要求使用switch语句。

main()

{int salarly,r,g; scanf(“%d”,&salarly); if(salary>=3000) r=0.15; g=salary/500; switch(g) {case 1: r=0.05; case 2: case 3: r=0.08; case 4: case 5: r=0.10; }

salary=salary*(1-r); printf(“%d\\n”,salary);

298

习题参考答案

习 题 5

一、选择题

1、A 2、C 3、C 4、D 5、A 6、A 7、A 8、B 9、C 10、B 11、B 12、D 二、填空题 1、continue

2、[1]n<=999或n<1000 [2]n

3、[1]x>=0或x>=0.0 [2]x

6、[1]n [2]flag=1 [3]n— 7、[1]j

#include main()

{int m,n,p,r,temp;

printf(“Please input m,n:”); do

{scanf(“%d%d”,&m,&n); }while(m<=0||n<=0); if(n

{ temp=n; n=m; m=temp; } /*确保大数放到n中*/

p=n*m; /*保留n和m的乘积到p中,以便求最小公倍数*/ while(m!=0) /*求n和m的最大公约数*/ {r=n%m; n=m; m=r; }

printf(“最大公约数为:%d\\n”,n); printf(“最小公倍数为:%d\\n”,p/n); } 2、

#include main() {char c;

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

printf(“Please input a line character:”); while((c=getchar())!=’\\n’)

{if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’) letter++; else if(c==‘ ’) space++;

else if(c>=’0’&&c<=’9’) digit++; else other++; }

printf(“Letter is %d,Space is %d,Digit is %d,Other

299

{ char str1[20], str2[10];

int i=0,j=0; gets(str1); gets(str2)?

while(str1[i]!=?\\0?) i++;

while(str2[j]!=?\\0?) str1[i++]=str2[j++]; str1[i]=?\\0?; puts(str1);

}

2. # define M 3

# define N 4

# include main() { int i, j, m; int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12}, pp[N]; for (j=0; j

3. # include void find (int a[5][5]) { int i, j, row, col, sum1, sum2; for (i=0;i<5;i++) for (j=0;j<5;j++) { sum1=sum2=0; for (col=0;col<5;col++) sum1+=a[i][col]; for (row=0;row<5;row++) sum2+=a[row][j]; if (sum1= =sum2) printf(“a[%d][%d]:%d\\n”, i, j, a[i][j]); } } main()

习题参考答案

305

习题参考答案

{ int i, j, a[5][5]={{2,8,1,9,4},{5,7,1,3,0},{7,1,7,5,2},{3,2,2,1,5},{0,2,1,6,8}}; for (i=0;i<5;i++) { for (j=0;j<5;j++) printf(“M”, a[i][j]); printf(“\\n”); find(a); } 4.

#include #include main()

{ int a[3][5],x,y,i,j,k,flag=0; int max,min; for(i=0;i<3;i++)

for(j=0;j<5;j++) scanf(\ /**/ for(i=0;i<3;i++) { max=a[i][0];y=0;

for(k=1;k<5;k++) if(max

for(k=0;k<3;k++) if(min>a[k][y]) {x=k;min=a[k][y];}

if(i==x) {printf(\}

if(flag==0) printf(\}

5. # include # define N 10 void crl (int a[ ]) { int i, j, max=0, min=0, temp; for (i=1; ia[i]) min=i; temp=a[min]; j=min; while (j>0) { a[j]=a[j-1]; j--; } a[0]=temp; for (i=1; i306

{ a[j]=a[j+1]; j++; } a[N-1]=temp; }

main()

{ int a[N]={8,5,6,9,4,1,-1,7,3,2}; int i; crl(a); for (i=0; i

6. # include

# include

int Replace_string(char line[ ], char str1[ ], char str2[ ]) { int i=0, j, loc; char temp[80]; while(i<=strlen(line)-strlen(str2)) { j=0; loc=i; while(str1[j]= =line[loc]&&str1[j]!=?\\0?) { loc++; j++; } if (str1[j]= =?\\0?) { strcpy(temp, &line[loc]); strcpy(&line[i], str2); i+=strlen(str2); strcpy(&line[i], temp); return 1; } else i++; } return 0; }

习 题 7

一、选择题

1.A 2.A 3. D 4.C 5. A 6.C 7.B 8.C 9.B 10.D 二、填空题 1.a=0,b=7 2.110 3.20

习题参考答案

307

习题参考答案

4.abc,ABC,bc,BC,c,C, 5.1 4 6. len++ p++ 三、编程题

1、编写一个程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该字符串,请用指针完成。

main()

{char ch[20]=\ int i;

for(i=0;i

2、输入3个字符串,按由小到大的顺序输出。 main()

{char str1[20],str2[20],str3[20]; char char p[20],*p1,*p2;

printf(\ gets(str1); gets(str2); gets(str3); p1=str1;p2=str2; if(strcmp(str1,str2)>0)

{ strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); } p1=str1;p2=str3; if(strcmp(str1,str3)>0)

{ strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); } p1=str2;p2=str3; if(strcmp(str2,str3)>0)

{ strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); } printf(\ printf(\}

3、求一个3×3矩阵主对角线元素之和。 main()

{int a[3][3],*p,i,s=0; for(i=0;i<3;i++)

scanf(\ p=&a[0][0]; for(i=0;i<3;i++) s=s+*(p+3*i+i);

308

习题参考答案

printf(\}

4、将一个3×3矩阵转置。 main()

{int a[3][3],*p; int i,j,t;

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

scanf(\ p=&a[0][0]; for(i=0;i<3;i++) for(j=i;j<3;j++) {t=*(p+3*i+j);

*(p+3*i+j)=*(p+3*j+i); *(p+3*j+i)=t; }

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

printf(\}

5、输出给定的字符串中某一个字符前面的一串字符。如指定字符'a',则对字符串\,输出\。若无指定字符,则输出相应的提示信息。

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

char *ptr,str[10],ch; printf(\ scanf(\ ptr=str; getchar();

printf(\ scanf(\ while(ch=='\\n')

{printf(\ scanf(\ }

while(*ptr!=ch) {ptr++;n++;}

309

习题参考答案

for(i=0;i

注意:本题中getchar()的作用是吸收键入给第一个scanf函数的字符串尾部的回车符,如果无getchar(),则将无法正确输入字符给变量ch。

6、输入一行字符,计算其中大写字母、小写字母、数字、空格及其他字符的数目。 #include main()

{int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s[20];

printf(\ while((s[i]=getchar())!='\\n') i++;

p=s; /*使p指向数组s的首地址*/ while(*p!='\\n')

{ if(('A'<=*p)&&(*p<='Z')) ++upper;

else if(('a'<=*p)&&(*p<='z')) ++lower; else if(*p==' ') ++space;

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

printf(\ printf(\}

7、从一个给定的字符串中找出某一子字符串的位置(从1开始)。例如子串“efg”在字符串“abcdefghijk”中位置为5。若字符串中没有指定的子串,则标记为0。

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

char str1[20],str2[20],str3[20]; char *p1=str1,*p3=str3,*p=str1; printf(\ gets(str1);

310

习题参考答案

printf(\ gets(str2); n=strlen(str2); while(*p1!='\\0')

{ for(i=0;i

}

*p3='\\0'; /* 在新生成的字符串尾添加结束符 */

if(strcmp(str3,str2)==0) /*新生成的字符串存放在str3中*/ { printf(\ p1='\\0'; } else

{ p1++; /*使p指向字符串str1的下一字符*/ p=p1;

p3=str3; /*使p3重新指向数组str3首地址*/ } }

if(*p1=='\\0') printf(\}

注意:由于gets函数可以接收带有空格的字符串,所以本题中采用gets而未采用不可接收带空格字符串的函数scanf。

8、编程删除字符串中的所有空白字符。 main()

{char str1[20],str2[20]; char *p1,*p2;

printf(\

gets(str1); /* str1用于存放原始字符串 */ p1=str1;

p2=str2; /* str2用于存放去掉空格后的字符串,使p2指向str2 */ while(*p1!='\\0') { if(*p1!=' ')

{ *p2=*p1++; /* 将原始字符串中的字符依次赋值给str2 */

p2++; } else

p1++; /* 遇空格符,只移动指针p1,而不把空格符赋值给str2 */

p3++;

311

习题参考答案

}

printf(\}

9、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 main()

{ int i,num[20],*p,n=0,m,k;

printf(\ scanf(\ for(i=0;i

num[i]=i+1; /* 以1至n为序给每个人编号 */ p=num;

m=0; /* m为退出人数 */

i=0; /* i为每次循环时的计数变量 */ k=0; /* k为按1,2,3报数时的计数变量 */

while(m

if(k==3) /* 本if分支对退出的人的编号赋值为0 */ { *(p+i)=0; k=0; /* 重新从1到3报数 */ m++; /* 退出人数加1 */ } i++;

if(i==n) i=0; /*报数到一圈人的尾部时,i恢复为0,也即使人围成一圈*/ }

while(*p==0) p++;

printf(\}

10、有一个字符串,包含n个字符。编程实现:将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 main()

{ char str1[20],str2[20]; char *p=str1; int n,m,i;

printf(\ gets(str1); n=strlen(str1);

printf(\ scanf(\ if(n

printf(\ else

{ for(i=0;i

312

习题参考答案

*(str2+i)=*(p+m-1+i); *(str2+i)='\\0'; }

printf(\}

习 题 8

一、选择题

1、C 2、A 3、D 4、D 5、A 6、A 7、A 8、C 9、A 10、B 11、B 12、C 13、B 14、C 15、B 16、C 17、B 18、D 19、B 20、B 二、填空题

1、main 2、scanf gets 3、2 4、auto 5、1,2 6、3235

7、5,25 8、15 9、3 10、6,720 11、9 12、[1] x [2] x-f(x)/f1(x) 三、改错题

1、参考答案与分析: 分析:

第1处错误:题目中已经告诉我们“函数void dbubble(int *f,int n)的功能是”,但在程序的第2行定义函数时头部就与题目要求不一致,因此,第1处错误就在第2 行,只要将第2行改成“void dbubble(int *f,int n)”即可。

第2处错误:在函数dbubble()中的第二个内循环(反向冒泡),题目要求很清楚:“从f[n-2]开始(i=n-2),比较f[i]与f[i+1],若f[i]小于f[i-1],则交换f[i]和f[i-1]两个元素的值,”,所以,其中的“if(f[j]>f[j-1])”应改成“if(f[j]

第3处错误:在主函数中定义数组时使用了“int a[n]={4,7,-3,2,10,17,1,6,9,-4};”这样的形式,其中n是变量,而根据数组的定义我们知道,在定义数组时[]中表示的是数组元素的个数,必须由“常量表达式”组成,而不能是变量。因此,只要将n改成10即可。

第4处错误:在主函数中,调用函数dbubble()时调用方式不对。原调用方式是“void dbubble(n,a);”,此处有两个错误,一是以语句方式调用函数时,其前面不能有“void”,应去掉;二是实参的顺序与函数dbubble()定义时的顺序不一致。因此,本错误应改成“dbubble(a,n);”。

2、参考答案与分析: 分析:

第1处错误:在函数find()的头部定义出错。函数头部定义为“void find(int a[5][])”,在二维数组的名字作为形参时,必须明确第二维的大小,第一维可以省略;但不能省略第二维中的每行的元素个数。因此,可以改成“void find(int a[][5])”或“void find(int a[5][5])”。

第2处错误: 这处错误应在计算列元素之和的语句“for(row=0;row<5;row++) sum2+=a[j][row];”中。由于要求的是列元素之和,则列下标不应该变,而变化的是行下标。因此,可以将本处错误改成“for(row=0;row<5;row++) sum2+=a[row][j];”。

第3处错误: 在C语言中,判断两个整数是否相等用的运算符是“==”,而“=”是赋值运算符,所以这处错误在“if(sum1=sum2) printf(\”语句中。应该改成“if(sum1==sum2) printf(\”。

第4处错误:这处错误出现在主函数中,在调用find()函数时,由于定义find()函数时形参只有一个,即二维数组的数组名,但在调用时却有两个实参,显然是错误的。应将语句“find(a,5);”改成“find(a);”

313

习题参考答案

四、编程题 1、参考答案: #include #define M 10 main() { int k;

int jiec(int k); /*声明函数*/ float s=0;

printf(“ 计算代数式的值\\n\\n”); for(k=1;k<=M;k++)

s+= 1.0/jiec(k); /*函数以表达式方式调用*/ printf(“计算结果为:s=%f\\n”,s); }

int jiec(k) /*计算阶乘值的函数,函数名前的int表示返回值的类型*/ int k; { int s,i; s=1;

for(i=1;i<=k;i++) s*=i; /*计算1*2*3*?*k,并将计算结果赋值给变量s*/ return(s); /*将计算得的阶乘值返回调用函数(这里是主函数)*/ }

2、参考答案: #include #include int shushu(int n)

{ int j,k=0; /*计数变量k清零*/ for(j=2;j<=sqrt(n);j++) if(n%j==0) k++; if(k!=0) return(0); else return(1); }

main() { int n,k;

printf(“Please input n:”); scanf(“%d”,&n); k=shushu(n);

if(k==0) printf(“\\nNO!”); else printf(“\\nYes!”); }

3、参考答案:

int str_len(char *str) {int k=0;

while(*str!=?\\0?) {k++; str++; }

314

return(k); }

main()

{ char s[80];

printf(“Please input a string:”); gets(s);

printf(“\\nThe string length is : %d”,str_len(s)); }

4、参考答案: #include #include void ex(int k,char str[]) {int a,b,c,d;

a=k/1000; b=k/100; c=k/10; d=k; str[0]='0'+a; str[1]='0'+b; str[2]='0'+c; str[3]='0'+d; }

main() {int i,k;

char s[4]; do{

printf(\请输入一个4位整数:\

scanf(\ ex(k,s);

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

5、参考答案: #include

void zhuanzhi(int a[][3]) {int i,j,t;

for(i=0;i<3;i++) for(j=i+1;j<3;j++) {t=a[i][j];

a[i][j]=a[j][i]; a[j][i]=t; } }

main()

{int b[3][3],i,j; for(i=0;i<3;i++) for(j=0;j<3;j++)

scanf(\ zhuanzhi(b);

习题参考答案

315

习题参考答案

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

printf(\ printf(\ } }

6、参考答案:

#include void duihuan(int a[]) {int max,min,i,j,k,temp; max=min=a[0]; j=k=0; for(i=0;i<10;i++)

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

if(j!=0) {temp=a[j]; a[j]=a[9]; a[9]=temp; } if(k!=9) {temp=a[0]; a[0]=a[k]; a[k]=temp; } }

void input(int a[]) {int i;

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

void output(int a[]) {int i;

printf(\

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

main()

{int b[10]; input(b); duihuan(b); output(b); }

7、参考答案: #include #define N 10 void sort(char s[]) {int i,j; char t;

for(i=1;i

for(j=0; (js[j+1])

{t=s[j]; s[j]=s[j+1]; s[j+1]=t; }

316

习题参考答案

}

main()

{char str[80];

printf(\请输入一个字符串:\ gets(str); sort(str);

printf(\排序后的字符串是: %s\ }

8、参考答案: #include

int letter,digit,space,other; void func(char s[]) {int i;

for(i=0;s[i]!='\\0';i++)

{if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z') letter++; else if(s[i]==' ') space++;

else if(s[i]>='0'&&s[i]<='9') digit++; else other++; } }

main()

{char str[80];

printf(\ gets(str);

letter=0; digit=0; space=0; other=0; func(str);

printf(\,Space is %d,Digit is %d,Other is %d,\ }

9、参考答案: #include void convert(int n) {int i;

if((i=n/10)!=0) convert(i); putchar(n+'0'); }

main()

{ int number;

printf(\ scanf(\ printf(\ if(number<0) { putchar('-');

number=-number;

317

习题参考答案

}

convert(number); }

习 题 9

一、选择题

1、D 2、C 3、A 4、B 二、阅读程序题 1、575

2、第一行是 1104 ,第二行是 3380 ,第三行是 0550 三、完善程序题

1、 typedef i pu[k].grade< pu[j].grade 2、 pk->next pj->d pn!=head return k 四、改错题

注:错误的地方加上了下划线,正确的作为注释写在同一行 1、

#include #include struct T{

char name[20], num[20]; };

struct T stu[5]={”cai”,”2106”,”li”,”4512”,”wang”,”6723”,”zhang”,”5129”};

int search(struct T items[], char name[], int n) { int low=0,high=n-1,mid;

while(low

if(items[mid].name=name) /* strcmp(items[mid].name,name)= =0 */

return mid;

else if(items[mid].name

low=mid+1; else high=mid-1; } return -1; }

int main(void) { char name[30];int i;

318

习题参考答案

printf(“input the name:”);scanf(“%s”,name);

i=search(stu[],name,4); /* stu */ if(i!=-1) printf(“name:%s num:%s\\n”,sut[i].name,stu[i].num); else printf(“\\nNot found! \\n”); } 2、

#include #include

struct T{ char name[20], num[20]; struct T * next; }; struct T stu[5]={”cang”,”6723”,NULL,”cai”,”2106”,NULL,

”zhang”,”5129”,NULL,”zhang”,”4512”,NULL,”an”,”6868”,NULL}; void MakeChain(struct T items[], int n) { int k;

for(k=0;k

items[k]->next=&items[k+1]; /* items[k].next */ }

stuct T *Search(struct T items[], char who[20])

{ struct T *temp=items[0]; /* items */ while(temp)

if(strcmp(temp->name, who)==0) break;

else temp=temp->next;

return items; /* temp */ }

void main(void)

{ char name[20]; struct T *loc; scanf(“%s”, name); MakeChain(stu,5);

loc=Search(name,stu); /* Search(stu,name) */ if(loc) printf(“name:%s num:%s\\n”, loc->name, loc->num); else printf(“Not found! \\n”); }

五、编程题 1、

struct {int num; float emid;

319

习题参考答案

float efinal; }stu; main()

{ float escore;

scanf(“%d,%f,%f”,&stu.num,&stu.emid,&stu.efinal); escore=stu.emid*0.3+stu.efinal*0.7; printf(“%f\\n”,escore); } 2、

已知结构体类型如下:

struct user { char name[20]; char num[10]; }; main

{struct user sp[5],temp; int i,j,k; for(i=0;i<5;i++)

{ gets(sp[i].name); gets(sp[i].num);} for(i=0;i<4;i++) { k=I;

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

if(strcmp(sp[k].name,sp[j].name)>0) k=j;

temp=sp[k]; sp[k]= sp[i]; sp[i]= temp; }

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

printf(“%s,%s\\n”,sp[i].name,sp[i].num); } 3、

struct result { char name[20]; float score[6]; float aver; }; main()

{ struct result player,*p; int i;

320

习题参考答案

float max,min,sum=0; p=&player; gets(p->name); for(i=0;i<6;i++)

scanf(“%f”,&player.score[i]); sum=max=min=player.score[0]; for(i=1;i<6;i++) {sum+=p->score[i];

if(p->score[i]>max) max=p->score[i]; else min=p->score[i];} =(sum-max-min)/4;

printf(“%s:%f\\n”,p->name,p->aver); } 4、

struct node { int x;

struct node *next; };

struct node *find_del(struct node *head,struct node **pm) {struct node *p1,*p2,*pmax,*pre; if(head==NULL) return NULL; pmax=head; p2=p1=pmax; while(p1)

{ if(p1->x>pmax->x) { pre=p2;pmax=p1;} p2=p1;p1=p1->next; }

if(pmax==head) head=pmax->next; else pre->next=pmax->next; *pm=pmax; return head; }

习 题 10

一、选择题

1、D 2、C 3、C 4、D 5、B 6、C 7、A 8、D 9、D 11、D 12、C 13、C 14、D 15、A 16、A 17、B 18、B 19、D 二、填空题

10、B 20、C 321

习题参考答案

1、16 8 2、stdio.h 3、”a+” 4、fread 5、0或NULL

6、缓冲文件系统 非缓冲文件系统 7、fseek(fp,32,0);或fseek(fp,32,SEEK_SET); 8、”abc.dat” “r” 不能打开abc.dat文件 打开abc.dat文件成功 9、fgetc(fp) ch!=EOF fgetc(fp) 10、10,11 30,31 50,51

三、编程题 1、

#include main() {FILE *fp;

char ch, fname[10];

printf(“Input the name of file.\\n”); gets(fname);

if((fp=fopen(fname,”w”))==NULL)

{printf(“Cannot open file!\\n”); exit(1); } printf(“Input data:\\n”); while((ch=getchar()!=?#?) fputc(ch,fp); fclose(fp); } 2、

#include #include main()

{FILE *fp; int letter=0,digit=0,space=0; char c;

if((fp=fopen(\ {printf(\ while((c=fgetc(fp))!=EOF) {if(isalpha(c)) letter++; if(isdigit(c)) digit++; if(c==? ?) space++; }

printf(“Letter=%d,Digit=%d,Space=%d\\n”,letter,digit,space); fclose(fp); } 3、

#include main() {FILE *fp; char c;

if((fp=fopen(\ {printf(\ c=fgetc(fp);

322

while(c!=EOF) {if(c>='a'&&c<='z') { c=c-32;

fseek(fp,-1,SEEK_CUR); fputc(c,fp);

fseek(fp,0,SEEK_CUR); }

c=fgetc(fp); }

fclose(fp); } 4、

#include main() {FILE *fp;

char str[][11]= {\\char s[8][11]; int i;

if((fp=fopen(\

{printf(\ exit(1); } for(i=0;i<8;i++) /*将字符串数组写入文件中*/ { fputs(str[i],fp); fputs(\ }

rewind(fp); /*将文件指针复位到文件开头*/ printf(\

for(i=0;i<8;i++) /*从文件中读出字符串输出到屏幕上*/ { fgets(s[i],11,fp); puts(s[i]); } fclose(fp); } 5、

#include #include struct employee {char num[6]; char name[10]; char sex[2]; int age;

char addr[20]; int salary; char health[8]; char class[10]; }em[10]; struct emp

{char name[10];

习题参考答案

323

习题参考答案

int salary; }em_new[10];

void creat() {FILE *fp; int i,j;

printf(\ for(i=0;i<4;i++) /*输入数据*/

scanf(\m[i].salary,em[i].health,em[i].class);

/*将数据写入文件*/

if((fp=fopen(\ { printf(\ exit(0); } for(i=0;i<4;i++)

if(fwrite(&em[i],sizeof(struct employee),1,fp)!=1) printf(\ fclose(fp); }

main()

{FILE *fp1,*fp2; int i,j; creat();

if((fp1=fopen(\ { printf(\ exit(0); }

printf(\ NO. name sex age address salary health clasee\\n\ for(i=0;fread(&em[i],sizeof(struct employee),1,fp1)!=0;i++)

{printf(\ em[i].sex,em[i].age,em[i].addr,em[i].salary,em[i].health,em[i].class); strcpy(em_new[i].name,em[i].name); em_new[i].salary=em[i].salary; }

printf(\

if((fp2=fopen(\

{ printf(\ exit(0); } printf(\ Name Salary\\n\ for(j=0;j

{if(fwrite(&em_new[j],sizeof(struct emp),1,fp2)!=1) printf(\

printf(\ s ?\ }

324

习题参考答案

printf(\

fclose(fp1); fclose(fp2); }

习 题 11

一、填空题

1、文本模式 图形模式 2、字符 像素

3、80 25 0 0 79 24

4、图形系统初始化 关闭图形系统 5、BGI

二、程序设计题 1、参考程序

#include #include

/* 将屏幕初始化成自测试图形方式 */ void init() {

int gd=DETECT,gm,err; initgraph(&gd,&gm,\ err=graphresult(); if(err!=0)

{printf(\ printf(\ getch(); exit(1); }

cleardevice(); }

main()

{char str[30]=\ int i,j,maxx,maxy,k; init();

maxx=getmaxx(); maxy=getmaxy(); k=1;

while(k<20)

{ i=rand()%maxx; /*产生不小于最大屏幕x值的随机数*/ j=rand()%maxy; /*产生不小于最大屏幕y值的随机数*/ setcolor(WHITE+k); outtextxy(i,j,str);

325

习题参考答案

delay(100000); k++; }

getch();

closegraph(); }

2、参考程序

#include #include

/* 将屏幕初始化成自测试图形方式 */ void init() {

int gd=DETECT,gm,err; initgraph(&gd,&gm,\ err=graphresult(); if(err!=0)

{printf(\ printf(\ getch(); exit(1); }

cleardevice(); }

/*函数large()将显示放大的字符*/

void large(int x,int y,unsigned char *str,int space,int color) {void readcclib(); unsigned char buf[72]; unsigned int upattern; int i,ci;

char ascstr[2]; setcolor(color); ci=0;

while(ci

ascstr[0]=str[ci];ascstr[1]='\\0';

settextstyle(SMALL_FONT,HORIZ_DIR,9);

outtextxy(x,y-3,ascstr);x=x+textwidth(\ ci+=strlen(ascstr); } }

main()

{int i; char str[30]=\ init();

326

for(i=100;i<110; i++)

large(50+i,50+i,str,5,WHITE+i); getch();

closegraph(); }

3、参考程序

#include

/* 将屏幕初始化成自测试图形方式 */ void init() {

int gd=DETECT,gm,err; initgraph(&gd,&gm,\ err=graphresult(); if(err!=0)

{printf(\ printf(\ getch(); exit(1); } }

main() {int i; init();

setbkcolor(BLUE); for(i=10;i<130; i+=10) {setcolor(WHITE+i/10); circle(250,250,i); }

getch(); }

4、参考程序

#include #include #include

/* 将屏幕初始化成自测试图形方式 */ void init() {

int gd=DETECT,gm,err; initgraph(&gd,&gm,\ err=graphresult(); if(err!=0)

{printf(\ printf(\ getch();

习题参考答案

327

习题参考答案

exit(1); }

cleardevice(); }

/* 画一个四边形填充框

(left,top) : 左上角坐标 ; (right,bottom) : 右下角坐标 ; color : 填充颜色 */ void draw_window(int left,int top,int right,int bottom,int color) { setwritemode(0);

setfillstyle(SOLID_FILL,color); bar(left,top,right,bottom); }

/* 画一个带凸凹的四边形填充框

(left,top) 左上角坐标; (right,bottom) :右下角坐标; width : 凸或凹的宽度; color1 : 下边框颜色;

color2 : 上边框颜色; color3 : 内框填充颜色 */ void draw3d(int left,int top,int right,int bottom, int width,int color1,int color2,int color3) {

int shape[6]; setwritemode(0);

setfillstyle(SOLID_FILL,color1);

bar(left+width,bottom-width,right-width,bottom); bar(right-width,top+width,right,bottom); setfillstyle(SOLID_FILL,color1); setcolor(color1);

shape[0]=right; shape[1]=top+width; shape[2]=right; shape[3]=top; shape[4]=right-width; shape[5]=top+width; fillpoly(3,shape);

shape[0]=left+width; shape[1]=bottom; shape[2]=left+width; shape[3]=bottom-width; shape[4]=left; shape[5]=bottom; fillpoly(3,shape);

setfillstyle(SOLID_FILL,color2); bar(left,top,right-width,top+width);

bar(left,top+width,left+width,bottom-width); setfillstyle(SOLID_FILL,color2); setcolor(color2);

shape[0]=right-width; shape[1]=top; shape[2]=right;

shape[3]=top; shape[4]=right-width; shape[5]=top+width; fillpoly(3,shape);

shape[0]=left; shape[1]=bottom-width; shape[2]=left+width; shape[3]=bottom-width; shape[4]=left; shape[5]=bottom; fillpoly(3,shape);

setfillstyle(SOLID_FILL,color3);

bar(left+width,top+width,right-width,bottom-width);

328

习题参考答案

}

/* 画按钮

color1,color2,color3 : 见 draw3d() 函数的说明 */ void draw_bar(int left,int top,int right,int bottom, int color1,int color2,int color3,char s[])

{ draw3d(left+5,top+3,right-5,bottom-3,2,color2,color1,color3); setcolor(BLACK);

outtextxy(left+16,top+12,s); }

main() {

init();

setfillstyle(SOLID_FILL,LIGHTGRAY); bar(100,100,200,210);

draw_window(105,105,195,205,WHITE);

draw_window(108,108,192,202,LIGHTGRAY);

draw_bar(120,110,180,140,WHITE,BLACK,LIGHTGRAY,\ draw_bar(120,140,180,170,WHITE,BLACK,LIGHTGRAY,\ draw_bar(120,170,180,200,WHITE,BLACK,LIGHTGRAY,\ getch();

closegraph(); }

329

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

Top