第10章指针类型习题及答案
- 格式:doc
- 大小:60.00 KB
- 文档页数:13
c程序设计教程与实验课后答案【篇一:c程序设计教程与实验第10章习题参考答案】题1.二进制文本2.rewind()3.字节流式4.”abc.dat” “rb”5.06.将文件位置指针从文本末尾处向文件头的方向移动10个字节7.将文件file1.txt的内容输出到屏幕8.将f1的字符保存到f2中9.rfetc(fp)num++10.fopen(“file.dat”,”wb”)dt,1,9,fp三、程序分析题1. 242.复制f1到f23.1.14.1177995. 65a 66b 67c 68d 69e 70f 71g 72h 75k 76l 77m 78n 79o 80p 81q 82r 85u 86v 87w 88x 89y 90z四、编程题1.#includestdio.h#includestdlib.hint main(){char file[10],file1[10],ch;file *in,*out;scanf(%s,file);scanf(%s,file1);if((in=fopen(file,r))==null){printf(cant open file\n);exit(0);}if((out=fopen(file1,w))==null) 73i 74j 83s 84t {printf(cant open file1\n);exit(0);}while(!feof(in)){ch=fgetc(in);fputc(ch,out);putchar(ch);}fclose(in);fclose(out);return 0;}2.#include stdio.h#includestring.h#include errno.hint main(void){file *fp;char ch;if (null == (fp = fopen(g3, r))){printf(fopen g3 error: %s\n, strerror(errno)); return 0;}while ((ch = fgetc(fp))!=eof){printf(%c, ch); }fclose(fp);printf(\n);return 0;}3.#includestdio.hvoid main(){file *fp; /*定义一个文件指针*/int i;double a[10];if((fp=fopen(data.txt,wb+))==null){printf(file can not open,press any key to exit!\n); getch(); /*从键盘上任意输入一字符,结束程序*/exit(1);}for(i=0;i10;i++)scanf(%lf,a[i]);for(i=0;i10;i++)fwrite(a+i,sizeof(double),1,fp);printf(\n);rewind(fp);fread(a,sizeof(double),10,fp);for(i=0;i10;i++)printf(%f\n,a[i]);printf(\n);fclose(fp);}4.#includestdio.hvoid main(){file *fp;int a[80],i,j;int a,b,c;a=b=c=0;if(fp=fopen(g4.dat,r))==null)printf(读取失败\n);for(i=0;i80;i++){fscanf(fp,%d,a[i]);if(fp==eof)break;}for(j=0;j=i;j++){if(a[i]0) a++;if(a[i]0) b++;if(a[i]==0) c++;}printf(正=%d,负=%d,零=%d\n,a,b,c);5.#includestdio.hstruct student{char num[10];char name[8];int score[2];float ave;} stu[3];void main(){int i,j,sum;file *fp;for(i=0;i3;i++){printf(\ninput 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;j2;j++){printf(score %d:,j+1);scanf(%d,stu[i].score[j]);sum+=stu[i].score[j];}stu[i].ave=sum/2.0;}fp=fopen(stud,w);for(i=0;i3;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;i3;i++){fread(stu[i],sizeof(struct student),1,fp);printf(\n%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);}}【篇二:c语言程序设计实训教程习题和实验解答】ss=txt>2.1 c语言概述【习题解答】1结构化程序有三大基本结构:顺序、分支和循环.2..算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。
1.若有说明:int i,j=7, *p=&i;,则与i=j;等价的语句是(B )。
(A)i= *p; (B)*p=*&j; (C)i=&j; (D)i=* *p;2.若有以下说明:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为6的表达式是( C)。
(A)*p+6 (B)*(p+6) (C)*p+=5 (D)p+53.若有以下定义和语句:char *s1="12345",*s2="1234";printf("%d\n",strlen(strcpy(s1,s2)));则输出结果是( A)。
(A)4 (B)5 (C)9 (D)104.以下不能正确进行字符串赋初值的语句是(A )。
(A) char str[5]="good!"; (B) char str[]="good!";(C) char *str="good!"; (D) char str[5]={‘g',‘o',‘o',‘d'};5.若定义:int a=511,*b=&a;, 则printf("%d\n",*b);的输出结果为( D )。
(A) 无确定值 (B) a的地址 (C) 512 (D) 5116.下面程序的输出是( A )。
(A) 3 (B) 4 (C) 1 (D) 2main(){ int a[10]={ 1,2,3,4,5,6,7,8,9,10},*p=a;printf("%d\n",*(p+2));}7.若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是(D )。
(A) p=q; (B) *p=*q; (C) n=*q; (D) p=n;8.有如下说明int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是( B )。
第十章指针一、选择题1.以下程序的运行结果是【C】。
sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。
以下正确的说法是【 D】。
main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。
(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。
第10章文件一、选择题1.设fp是指向某个文件的指针,且已读到文件尾,则库函数feof(fp)的返回值是___ __。
A) EOF B) -1 C) 非零值 D) NULL2.若要指定打开C盘上子目录myfile下的二进制文件test.bin,在调用函数fopen时,第一个参数的正确格式是___________。
A) “c:myfile\test.bin” B)“c:\myfile\\test.bin”C) “c:\\myfile\\test.bin” D)“c:\myfile\test.bin”3.若执行fopen函数时发生错误,则函数的返回值是_____________________。
A) 地址值 B) 0 C)1 D) EOF4.若要用fopen函数打开一个新建立的二进制文件,该文件既要能读也要能写,则文件方式字符串应是_________________。
A) “ab+” B) “wb+” C)“rb+” D) “ab”5.若以”a+”方式打开一个已存在的文件,则以下叙述正确的是_______________。
A) 文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可做添加和读操作B) 文件打开时,原有文件内容不被删除,位置指针移到文件开头,可做添加和读操作C) 文件打开时,原有文件内容被删除,只可作写操作D) 以上各种说法皆不正确6.正常执行文件关闭操作时,fclose函数的返回值是____________________。
A) -1 B) TRUE C)0 D) 17.已知函数的调用形式是: fread(buffer,size,count,fp); 其中buffer代表的是_________。
A) 一个整形变量,代表要读入的数据项总数B) 一个文件指针,指向要读的文件C) 一个指针,指向要读入数据的存放地址D) 一个存储区,存放要读的数据项8.fscanf函数的正确调用形式是________________________。
第十章指针类型习题及其答案10-2 定义指针变量p,q,r,让它们指向变量a,b,c,在指向d,e,f,最后指向变量x,y,z,然后输出p,q,r与*p,*q,*r.解:int a,b,c,d,e,f,x,y,z ;int *p,*q,*r ;p=&a;q=&b;r=&c ;p=&d;q=&e;r=&f ;p=&x;q=&y;r=&z ;printf(“%l,%l,%l”,p,q,r) ;printf(“%d,%d,%d”,*p,*q,*r) ;思考:指针也是一种数据类型吗?他可以不依赖其它数据类型而独立存在吗?10-3 应用指针,实现10个整数从打到小的排序输出。
解:#include "stdio.h"void main(){int i,j,a[10],*p,t;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++){p=&a[i] ;for(j=i+1;j<10;j++)if(a[j]>*p) p=&a[j] ;t=*p;*p=a[i];a[i]=t;}printf("排序后的数组为:\n");for(i=0;i<10;i++)printf("%d,",a[i]) ;}思考:指针变量的值可以由键盘输入确定吗?它与其所指类型的变量值之间的关系如何?10-4 应用指针,求n个数的最小值和最大值。
解:#include "stdio.h"#define L 100void main(){int i,n,a[L],*max,*min;printf("请确定欲输入数据的个数(<100):");scanf("%d",&n);printf("下面请依次输入%d的个数\n",n);for(i=0;i<n;i++){printf("第%d的个数:",i+1);scanf("%d",&a[i]);}max=min=&a[0] ;for(i=0;i<n;i++){if(a[i]>*max) max=&a[i];if(a[i]<*min) min=&a[i];}printf("最大值=%4d,最小值=%4d\n",*max,*min);}思考:指针也可以指向相同类型的数组元素,此题如用指针来表示来表示数组的各元素的值,程序应如何设计?10-5 应用指针,编写下列字符串处理函数:(1) 字符串的复制函数。
(2) 字符串的连接函数。
解:#include "stdio.h"void copy_string(char *from ,char *to){for(;*from!='\0';from++,to++)*to=*from ;*to='\0';}void link_string(char *from,char *to){for(;*to!='\0';to++);for(;*from!='\0';from++,to++)*to=*from ;*to='\0';}void main(){char a[16]="I am a teacher.";char b[40]="you are a student.";printf("复制与连接之前:\nstring_a=%s\nstring_b=%s\n",a,b); copy_string(a,b);printf("复制之后:\nstring_a=%s\nstring_b=%s\n",a,b);link_string(a,b) ;printf("连接之后:\nstring_a=%s\nstring_b=%s\n",a,b);}思考:字符指针与字符数组的主要区别是什么?字符数组名代表什么?它与字符指针有何本质的区别?此程序连接之后的输出结果是什么?10-6 应用指针,求一矩阵中行为最大,列为最小的元素。
解:#include "stdio.h"#define N 5void main(){int i,j,a[N][N],*p,(*q)[N],max_min,k,n,flag=0;printf("请输入数组的个元素的值:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);for(i=0;i<N;i++) //输出数组元素的值{printf("\n");for(j=0;j<N;j++)printf("%d",a[i][j]) ;}for(i=0;i<N;i++){k=0;p=&a[i][0];max_min=*p;for(j=0;p=a[i]+N;p++,j++);if(max_min<*p){max_min=*p;k=j;}q=a;n=0;for(;q<a+N;q++,n++)if(max_min>*(*q+k)) break ;if(n==N){flag=1;printf("\n满足条件的元素为第%d行第%d列的:%d\n",i+1,k+1,max_min) ;}}if(flag!=1) printf("\n没有满足条件的元素!") ;}思考:此题与习题8-13类似,请比较这两种不同方式表示的程序,它们各有何特点?10-7 应用指针,完成复数的加,减运算。
解:(略,参见习题9-13。
)10-8 应用指针,求n个数的最大公约数和最小公倍数。
解:#include "stdio.h"#define N 50int gys(int x,int y) //求两个数的最大公约数{int t;if(y>x) {t=x;x=y;y=t;}while(y!=0){t=x%y;x=y;y=t;}return x ;}int gbs(int x,int y) //求两个数的最小公倍数{int t;t=gys(x,y);return x*y/t ;}void main(){int n,i,a[N],*p=a;int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数printf("请确定数据的个数n(<50):");scanf("%d",&n);printf("请输入%d个数据的值:\n",n);for(i=0;i<n;i++)scanf("%d",&a[i]);//int t1=*p, t2=*p ; //用t1记最大公约数,t2记最小公倍数for(i=0;i<n-1;i++){t1=gys(t1,*(p+i+1));t2=gbs(t2,*(p+i+1)) ;}printf("最大公约数为%d,最小公倍数为%d:\n",t1,t2);}思考:“t1=gys(t1,*(p+i+1))”语句的功能是什么?能否用数组小标元素直接处理?试比较之。
10-9 有N个人围成一圈,顺序编号,从第一个人开始按1、2、3顺序报数,凡报到3的人退出圈子,然后从出圈的下一个人开始重复此过程。
应用指针,输出出圈序列。
解:#include "stdio.h"#define N 100void main(){int a[N],i,k,n,m,*p;printf("请输入人数(<100):");scanf("%d",&n);for(i=0;i<n;i++)a[i]=i+1 ; //为每个人编号p=a ;i=0; //小标计数标量k=0 ; //1,2,3报数时的计数变量m=0 ; //退出人数的计数器的变量while(m<n){if(*(p+i)!=0) k++ ;if(k==3){printf("%d,",*(p+i));*(p+i)=0 ; //将退出的编号置为0k=0;m++ ;}i++ ;if(i==n) i=0 ; //报数到尾后,i应恢复为0}}思考:此题不用指针也可以完成,应做哪些修改?此题不用数组是否也可以实现其计算过程?10-10 应用指针,完成数组的关系运算。
对于数组a、b,a>b成立定义为a数组中大于b数组中的分量个数大于b数组中大于a数组中的分量个数,a<b、a=b类似定义。
解:#include "stdio.h"#define N 2void main(){int a[2][N],t[2]={0,0};int i,j,*p1,*p2;for(i=0;i<2;i++){printf("请输入第%d个数组的元素\n",i+1);for(j=0;j<N;j++)scanf("%d",&a[i][j]);}for(i=0;i<2;i++){if(i==0) p1=a[0],p2=a[1];else p1=a[1] ,p2=a[0] ;for(j=0;j<N;j++){if(*(p1+j)>*(p2+j))t[i]++;}}if(t[0]>t[1])printf("第一个数组大于第二个数组\n");else if(t[0]==t[1])printf("第一个数组等于第二个数组\n");elseprintf("第一个数组小于第二个数组\n");}思考:程序中t数组起什么作用/若两个数组的元素个数不相等,应如何处理?在程序中使用了一个二维数组来表示数组a,b,如果使用两个一位数组,应该如何设计程序?10-11 应用指针编写程序,判断空间中的一个点是否在一立方体内。