第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章结构体与共用体1.以下叙述中错误的是()。
A) 可以通过typedef增加新的类型B) 可以用typedef将已存在的类型用一个新的名字来代表C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:A【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。
2.以下关于typedef的叙述错误的是A) 用typedef可以增加新类型B) typedef只是将已存在的类型用一个新的名字来代表C) 用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D) 用typedef为类型说明一个新名,通常可以增加程序的可读性参考答案:A【解析】typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个新名,使用typedef可以增强移植性。
所以A选项错误。
3.若有以下语句typedef struct S{ int g; char h; } T;以下叙述中正确的是A) 可用S定义结构体变量B) 可用T定义结构体变量C) S是struct 类型的变量D) T是struct S类型的变量参考答案:B【解析】本题考查typedef重新声明一种结构体类型,那么T为结构体类型,而不是结构体变量,所以B选项正确。
4.设有以下语句typedef struct TT{ char c; int a[4]; } CIN;则下面叙述中正确的是A) CIN是struct TT类型的变量B) TT是struct类型的变量C) 可以用TT定义结构体变量D) 可以用CIN定义结构体变量参考答案:D【解析】本题考查typedef重新声明一种结构体类型,其中CIN为结构体类型名,而不是结构体变量,所以D 选项正确。
5.以下叙述中错误的是A) 可以用typedef将已存在的类型用一个新的名字来代表B) 可以通过typedef增加新的类型C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:B【解析】本题考查typedef的用法,typedef并不是增加一种新的类型,而是对已存在的类型用一个新的名字来代表,所以B选项错误。
人教物理八年级下册第10章浮力习题有答案第10章浮力一、选择题。
1、如图所示是“探究浮力的大小跟哪些因素有关”的几个实验情景实验甲、丙和丁中,弹簧测力计的示数分别为4.0N、2.8N和2.5N.若盐水的密度为1.2×103kg/m3,则下列结论正确的是()A.实验丙中,弹簧测力计的示数比乙中小0.5NB.物体A的密度为3.2×103kg/m3C.实验丁中,容器底部受到的压力等于0.3ND.实验乙中,物体A受到的拉力为3N2、如图所示,两只相同的气球,分别充入氢气和空气,充气后体积相同,放飞气球时只有氢气气球升上空中.若它们在空气中受到的浮力分别为F氢和F空,则下列说法中正确的是A.F 氢>F 空B.F 氢=F 空C.F 氢<F 空D.条件不足,无法比较3、将一空心铁球投入CuSO4溶液中,恰好悬浮,过一段时间后铁块将发生变化(液体进入空心部分前),下列判断正确的是()A 开始是球的重力和所受浮力平衡B 铁球与溶液发生反应,液体密度变大,铁球重力减小,球体上浮C铁球与溶液发生反应,液体密度变小,铁球重力增大,球体下沉D 铁球与溶液不发生反应,球仍然保持悬浮4、下列关于浮力的说法正确的是()A.轮船从长江驶入大海,所受的浮力变大B.浸在液体中的物体受到浮力是因为液体对物体上、下表面有压力差C.阿基米德原理说明物体所受的浮力大小等于物体的重力D.鸡蛋放入清水中沉在杯子底部是因为鸡蛋在清水中不受浮力5、关于图中所示实验,下列说法正确的是()A.可以探究浮力的大小是否跟物体的密度有关B.可以探究浮力的大小是否跟液体的密度有关C.可以探究浮力的大小是否跟物体浸没的深度有关D.可以探究浮力的大小是否跟物体浸在液体中的体积有关6、如图所示,将盛有适量水的容器放在水平桌面上,然后把系在弹簧测力计下的铁块慢慢地浸入水中(水未溢出),观察铁块从刚开始浸入水中到完全浸在水中的实验现象,并对一些物理量做出了如下判断,其中正确的是()A.铁块受到的浮力变小B.弹簧测力计的示数变大C.水对容器底部的压强变小D.桌面受到的压力变大7、汤圆刚放入水中时,会沉入锅底(如图甲),煮熟时则会浮出水面(如图乙),对此下列解释中正确的是()A.煮熟时,汤圆排开水的体积增大,导致汤圆受到水的浮力大于汤圆重力而上浮B.煮熟时,水的密度变大,导致汤圆受到水的浮力大于汤圆重力而上浮C.煮熟时,汤圆受到水的浮力不变,但汤圆的重力变小,导致浮力大于重力而上浮D.煮熟时,汤圆受到水的浮力和汤圆的重力都变小,但是浮力仍大于重力而上浮8、如图所示,放在同一水平面上的甲、乙两个相同容器内盛有不同液体,现将同一物块分别放入两个容器中,处于静止时,两容器中的液面恰好相平。
第10章补充习题及答案习题10.1 选择题(1)当已存在一个abc.txt文件时,执行函数fopen("abc.txt","r+")的功能是。
A.打开abc.txt文件,清除原有的内容B.打开abc.txt文件,只能写入新的内容C.打开abc.txt文件,只能读取原有内容D.打开abc.txt文件,可以读取和写入新的内容(2)若用fopen()函数打开一个已存在的文本文件,保留该文件原有内容,且可以读,可以写。
则文件打开模式是。
A."ab+" B."w+" C."a+" D."a"(3)以下不能将文件指针重新移到文件开头位置的函数是。
A.rewind(fp); B.fseek(fp,0,SEEK_SET);C.fseek(fp,-(long)ftell(fp),SEEK_CUR); D.fseek(fp,0,SEEK_END);(4)若用fopen()函数打开一个新二进制文件,该文件可以读也可以写,则文件的打开模式为 B 。
A."ab+" B."wb+" C."rb+" D."a+"(5)fread(buffer,64,2,fp)的功能是。
A.从fp所指的文件中读取64并存入buffer中B.从fp所指的文件中读取64和2并存入buffer中C.从fp所指的文件中读取64个字节的数据并存入buffer中D.从fp所指的文件中读取2个64字节的数据并存入buffer中(6)以下程序的功能是。
提示:PRN是打印设备。
#include <stdio.h>void main(){ FILE * fp;char chStr[]="HELLO";fp=fopen("PRN","w");fputs(chStr,fp);fclose(fp);}A.在屏幕显示HELLO B.把HELLO存入PRN文件中C.在打印机上打印出HELLO D.以上都不对10.2 填空题(1)使用fopen("abc","r+")打开文件时,若"abc"文件不存在,则返回。
第10章 浮力一、单选题1.(2023·广东深圳·中考真题)如图,亮亮同学将盛水的烧杯放在电子台秤上,台秤的示数如图甲所示;将一个物块投入水中,漂浮时台秤示数为375g (如图乙),物体上表面始终保持水平,用力将物块压入全部浸没在水中,此时台秤示数为425g (如图丙);将物块继续下压,从丙到丁物块下表面受到水的压力增加了0.8N ,整个过程水始终未溢出,请问说法正确的是( )A .木块的质量为125gB .木块的密度为30.5g /cmC .从图丙到图丁,瓶底水的压强逐渐增大D .从图丙到图丁,物体上表面受到水的压力增加了0.8N2.(2023·广东广州·三模)小飞同学把一枚鸡蛋放在一个透明玻璃杯中,加入清水后发现鸡蛋沉在杯底(见图甲)。
他向水里加盐并缓慢搅拌发现鸡蛋悬浮在液体中(见图乙);他继续加盐并缓慢搅拌,最后发现鸡蛋漂浮在液面上(图丙)。
下列说法正确的是( )A .鸡蛋所受到的浮力F F F <=甲乙甲B .鸡蛋排开液体的体积V V =排乙排丙C .鸡蛋排开液体的重力G G <排甲排乙D .丙图中鸡蛋受到的浮力大于鸡蛋的重力3.(2023·广东惠州·一模)线上教学期间,居家学习的小明进行实验探究:将水平桌面上的甲、乙两只相同的塑料杯中分别装满水,把两个体积相同的小球分别放入两杯中,两小球静止时如图所示,则( )。
A.甲杯中小球的密度大B.乙杯中小球所受浮力小C.甲杯底部受到水的压强小D.两杯对桌面的压强一样大4.(2023·广东惠州·一模)水平桌面上,甲、乙两相同的杯中盛有不同浓度的盐水,现将两相同的物块分别放入杯中,待物块静止时,两杯中液面恰好相平,如图所示,则()A.甲杯中物块受到浮力较大B.甲杯中物块所受到的浮力大于物块所受重力C.乙杯中物块所受到的浮力等于物块所受重力D.乙杯底部受到液体的压强较小5.(2023·广东广州·二模)如图,将一支用自制的简易密度计,先后放入盛有不同液体的两个烧杯中,静止后竖直立在液体中,两液面相平,下列判断不正确的是()A.密度计上a处的刻度数值比b处小B.密度计底部所受液体的压强相等C.密度计在两种液体中受到的浮力大小相等D.甲液体对容器底部的压强比乙液体对容器底部的压强小6.(2023·广东深圳·模拟预测)将同一实心物体分别投入足量的水和酒精(ρ酒精=0.8×103kg/m3)中,物体静止时,所受的浮力分别是6N和5N,则物体在水和酒精中的浮沉状态可能是()A.在水中漂浮,在酒精中沉底B.在水中悬浮,在酒精中漂浮C.在水中漂浮,在酒精中漂浮D.在水中沉底,在酒精中沉底7.(2023·广东江门·一模)如图为海产店里摆放的一个底部养有川岛沙贝的鱼缸,水面浮着一个空盆,此时鱼缸中水面高度为0h。
第10章排序习题答案一、填空题1. 大多数排序算法都有两个基本的操作:比较(两个关键字的大小)和移动(记录或改变指向记录的指针)。
2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较 3次。
(可约定为,从后向前比较)3. 在插入和选择排序中,若初始数据基本正序,则选用插入排序(到尾部);若初始数据基本反序,则选用选择排序。
4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用堆排序;若初始记录基本无序,则最好选用快速排序。
5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是O(n2) 。
若对其进行快速排序,在最坏的情况下所需要的时间是O(n2) 。
6. 对于n个记录的集合进行归并排序,所需要的平均时间是 O(nlog2n) ,所需要的附加空间是O(n) 。
7.【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行 log2n 趟(遍),共计移动 n log2n次记录。
(即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素)8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则:冒泡排序一趟扫描的结果是 H, C, Q, P, A, M, S, R, D, F, X ,Y;初始步长为4的希尔(shell)排序一趟的结果是P, A, C, S, Q, D, F, X , R, H,M, Y;二路归并排序一趟扫描的结果是H, Q, C, Y,A, P, M, S, D, R, F, X ;快速排序一趟扫描的结果是F, H, C, D, P, A, M, Q, R, S, Y,X;堆排序初始建堆的结果是A, D, C, R, F, Q, M, S, Y,P, H, X。
9. 在堆排序、快速排序和归并排序中,若只从存储空间考虑,则应首先选取堆排序方法,其次选取快速排序方法,最后选取归并排序方法;若只从排序结果的稳定性考虑,则应选取归并排序方法;若只从平均情况下最快考虑,则应选取快速排序方法;若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。
第十章指针类型习题及其答案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 应用指针编写程序,判断空间中的一个点是否在一立方体内。