C语言知识学习程序设计何钦铭颜晖第8章指针_第1页
C语言知识学习程序设计何钦铭颜晖第8章指针_第2页
C语言知识学习程序设计何钦铭颜晖第8章指针_第3页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章指针【练习8-1】如果有定义”intm,n=5,*p=&m;”与m=n等价的语句是B。A.m=*p;B.*p=*&n;C.m=&n;D.m=*p;解答:A:p是指向m的指针变量,所以*p等价丁m。即m=m。B:&n是n的地址,*&n是n的值,即把n的值赋给p指向的值m。即m=ncC:&n是n的地址。即把n的地址赋给m。D:*p是指p指向的指针所指向的值,在此无意义。故选Bo【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数sum_diff(floatop1,floatop2,float*psum,float

2、*pdiff),其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。解答:#include<stdio.h>voidsum_diff(floatop1,floatop2,float*psum,float*pdiff);intmain(void)floatop1,op2,sum,diff;printf("Inputop1andop2:");scanf("%f%f',&op1,&op2);sum_diff(op1,op2,&sum,&diff);printf("%f+%f=%f;%

3、f-%f=%fn",op1,op2,sum,op1,op2,diff);return0;voidsum_diff(floatop1,floatop2,float*psum,float*pdiff)*psum=op1+op2;*pdiff=op1-op2;【练习8-3】两个相同类型的指针变量能不能相加?为什么?解答:不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,因而在C语言中指针变量相加是非法的。【练习8-4】根据表8.2所示,这组数据的冒泡排序其实循环到第6遍(即n-2)时就已经排好序了,说明有时候并不一定需要

4、n-1次循环。请思考如何改进冒泡排序算法并编程实现(提示:当发现一遍循环后没有数据发生交换,说明已经排好序了)。解答:设置一个标志变量flag,进入一轮循环前设置为0,在循环中有发生数据交换就改写flag值为1。当该轮循环结束后检查flag值,如果变为1说明发生了数据交换,还没有排好序,如果为0说明没有发生交换,已经排好序。#include<stdio.h>voidbubble(inta,intn);intmain(void)intn,i,a8;printf("Entern(n<=8):");scanf("%d",&n);pri

5、ntf("Entera%d:",n);for(i=0;i<n;i+)scanf("%d",&ai);bubble(a,n);printf("Aftersorted,a%d=",n);for(i=0;i<n;i+)printf("%3d",ai);return0;voidbubble(inta,intn)for(i=1;i<n;i+)(flag=0;for(j=0;j<n-i;j+)if(aj>aj+1)(temp=aj;aj=aj+1;aj+1=temp;flag=1;if(f

6、lag=0)break;【练习8-5】重做例8-9,要求使用选择排序算法。解答:#include<stdio.h>voidbubble(inta,intn);intmain(void)inti,n,a8;printf("Entern(n<=8):");scanf("d”,&n);printf("Entera%d:",n);for(i=0;i<n;i+)scanf("%d",&ai);bubble(a,n);printf("Aftersorted,a%d=",n);f

7、or(i=0;i<n;i+)printf("%3d",ai);return0;voidbubble(inta,intn)(inti,j,temp,index;for(i=0;i<n-1;i+)index=i;for(j=i+1;j<n;j+)if(aj<aindex)index=j;temp=ai;ai=aindex;aindex=temp;8.4电码加密【练习8-6】在使用scanf()函数时,输入参数列表需要使用取地址操作符&,但当参数为字符数组名时并没有使用,为什么?如果在字符数组名前加上取地址操作符&,会发生什么?解答:因为字

8、符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要再使用取地址符来获取该数组的地址。如果在字符数组名str前加上取地址操作符&,那么对其取地址&str可以看做是这个数组的第一个元素的地址,由丁数组地址和数组第一个元素的地址相同,所以&str表示地址值和str表示的地址值是相等的。对scanf()的变长参数列表的话,编译器只负责参数传递,怎么解释后边的几个地址的含义,是由前边的字符申确定的。所以使用scanf("s”,str)和scanf(“s”,&str)都能通过编译且正常执行。【练习8-7】C语言不允许用赋值表达式直接对数组赋值,为什么

9、?解答:数组名可以看作是常量指针,因为不可以对一个常量进行赋值,所以不允许用赋值表达式直接对数组进行赋值。【练习8-8】输入一个字符申,把该字符申的前3个字母移到最后,输出变换后的字符申。比如输入“abcdef”,输出为“defabc”。解答:#include<stdio.h>#include<string.h>#defineMAXLINE100intmain(void)charlineMAXLINE,str4;inti;printf("Inputthestring:");gets(line);if(strlen(line)<3)printf(

10、"字符申长度小丁3,不符合要求!n");for(i=0;i<3;i+)stri=linei;stri='0'for(i=3;linei!='0'i+)linei-3=linei;linei-3='0'strcat(line,str);printf("%s%sn","Afterchanging:",line);return0;【练习8-9】使用动态内存分配的方法实现例8-9的冒泡排序。解答:#include<stdio.h>#include<stdlib.h>

11、voidbubble(inta,intn);intmain(void)intn,j,*a,i,temp;printf("Entern(n<=8):");scanf("%d",&n);if(a=(int*)calloc(n,sizeof(int)=NULL)printf("Notabletoallocatememory.n");exit(1);printf("Entea%d:",n);for(i=0;i<n;i+)scanf("%cT',a+i);bubble(a,n);prin

12、tf("Aftersorted,a%d=",n);for(i=0;i<n;i+)printf("%3d",*(a+i);free(a);return0;voidbubble(inta,intn)inti,j,temp;for(i=1;i<n;i+)for(j=0;j<n-i;j+)if(*(a+j)>*(a+j+1)temp=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=temp;习题8、选择题下歹0语句定义x为指向int类型变量a的指针,其中哪一个是正确的B。A.inta,*x=a;B.inta,*x=&

13、;a;C.int*x=&a,a;C.int*x=&a,a;C.int*x=&a,a;D.inta,x=a;以下选项中,对基本类型相同的指针变量不能进行运算的运算符是B.-C.D.若有以下说明,且0<=i<10,则对数组元素的错误引用是Cinta=0,1,2,3,4,5,6,7,8,9,*p=a,i;A.*(a+i)B.ap-a+iC.p+iD.*(&ai)4.下列程序的输出结果是B。intmain(void)inta10=0,1,2,3,4,5,6,7,8,9,*p=a+3;printf(“d”,*+p);return0;A.3B.4C.a4的地址D

14、.非法5.对丁下列程序,正确的是A。voidf(int*p)(*p=5;intmain(void)(inta,*p;a=10;p=&a;f(p);printf(“d”,(*p)+);return0;A.5B.6C.10D.11、填空题1.下列函数在一维数组a中将x插入到下标为i(i>=0)的元素前。如果i>=元素的个数,则x插入到末尾。原有的元素个数存放在指针n所指向的变量中,插入后元素个数加1。请填空。voidinsert(doublea,int*n,doublex,inti)(intj;if_(i<*n)_for(j=*n-1;_j>=i_;j-)_aj+1

15、_=aj;elsei=*n;ai=_x_;(*n)+;2.下列程序先消除输入字符申的前后空格,再判断是否是“回文”(即字符申正读和倒读都是一样),若是则输出YES,否则输出NO。请填空。#include<stdio.h>#include<string.h>intmain(void)(chars80,ch,*p,*q;inti,j,n;gets(s);p=_s_;while(*p=,)_p+_;n=strlen(s);q=_s+n-1_;while(*q=,)_q-_;while(_p<q_&&*p=*q)(p+;_q-_;if(p<q)pri

16、ntf("NOn”);elseprintf("YESn”);return0;3.下歹0程序在数组中同时查找最大元素和最小元素的下标,分别存放在main()函数的fmax和min变量中。请填空。voidfind(int*,int,int*,int*);intmain(void)intmax,min,a=5,3,7,9,2,0,4,1,6,8;find(_a,10,&max,&min_);printf(“d,%dn”,max,min);return0;voidfind(int*a,intn,int*max,int*min)inti;*max=*min=0;for

17、(i=1;i<n;i+)if(ai>a*max)_*max=i_;if(ai<a*min)_*min=i_;4.写出下列程序的执行结果0024002346#include<stdio.h>inta10,b10,*pa,*pb,i;pa=a;pb=b;for(i=0;i<3;i+,pa+,pb+)(*pa=i;*pb=2*i;printf(“dt%dn”,*pa,*pb);pa=&a0;pb=&b0;for(i=0;i<3;i+)(*pa=*pa+i;*pb=*pb+i;printf(“dt%dn”,*pa+,*pb+);return0;

18、三、程序设计题拆分实数的整数与小数部分:要求定义一个函数voidsplitfloat(floatx,int*intpart,float*fracpart),其中x是被拆分的实数,*intpart和*fracpart分别是将实数x拆分出来的整数部分与小数部分。编写主函数,并在其中调用函数splitfloat()。试编写相应程序。解答:#include<stdio.h>voidsplitfloat(floatx,int*intpart,float*fracpart);intmain(void)floatx,fracpart;intintpart;printf("Inputan

19、umber:");scanf("%f",&x);splitfloat(x,&intpart,&fracpart);printf("Theintpartis:%d",intpart);printf("Thefracpartis:%f",fracpart);return0;voidsplitfloat(floatx,int*intpart,float*fracpart)*intpart=(int)x;*fracpart=x-*intpart;在数组中查找指定元素:输入1个正整数n(1<n<=1

20、0),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,若找到则输出相应的下标,否则显示“Notfound”。要求定义和调用函数search(intlist,intn,intx),在数组list中查找元素x,若找到则返回相应下标,否则返回-1,参数n代表数组list中元素的数量。试编写相应程序。解答:#include<stdio.h>intsearch(intlist,intn,intx);intmain(void)(inti,n,res,x;inta10;printf("Inputn:");scanf("%d",&n

21、);for(i=0;i<n;i+)scanf("%d",&ai);printf("Inputx:");scanf("%d",&x);res=search(a,n,x);if(res>=0)printf("index=%dn",res);elseprintf("Notfoundn");return0;intsearch(intlist,intn,intx)inti;for(i=0;i<n;i+)if(listi=x)returni;return-1;循环后移:有n

22、个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。试编写相应程序。解答:#include<stdio.h>voidmove(int*x,intn,intm);inti,m,n;inta80;printf("Entern:");scanf("d”,&n);printf("Enterm:");scanf("%d",&m);for(i=0;i<n;i+)scanf("%d",&ai);mov

23、e(a,n,m);printf("Aftermove:");for(i=0;i<n;i+)printf("%d",ai);return0;voidmove(int*p,intn,intm)(inti,j,k=0,a80;for(i=0;i<n;i+)if(i<n-m)ai+m=pi;elseak+=pi;for(i=0;i<n;i+)pi=ai;报数:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子,下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。编写程序,输入

24、整数n和m,并按退出顺序输出退出圈子的人的编号。试编写相应程序。解答:#include<stdio.h>intmain(void)intcount,i,j,m,n;intnum80=0;printf("Inputn:");scanf("%d",&n);printf("Inputm:");scanf("%d",&m);i=j=count=0;while(count<n-1)(if(numi=0)j+;if(j%m=0&&j)count+;numi=-1;j=0;/报数

25、报到m后,j重归0,开始下次报数i+;/读取下一个元素i%=n;/一次n个跟报完数,开始下一次(除余n是因为i是下标,从0开始,n是具体数/从1开始/i为n时下次a0报数)for(i=0;i<n;i+)if(numi=0)printf("LastNois:%dn",i+1);return0;使用函数实现字符申复制:输入一个字符申t和一个正整数m,将字符申中从第m个字符开始的全部字符复制到字符申s中,再输出字符申s。要求自定义并调用函数voidstrmcpy(char*s,char*t,intm)。试编写相应程序。解答:#include<stdio.h>#i

26、nclude<string.h>voidstrmcpy(char*s,char*t,intm);intmain(void)chars80,t80;intm;printf("Inputthestring:");gets(t);printf("Enterm:");scanf("%d",&m);if(strlen(t)<m)printf("ErrorInput");return0;elsestrmcpy(s,t,m);puts(s);return0;voidstrmcpy(char*s,char

27、*t,intm)(t=t+m-1;while(*t!='0')*s=*t;s+;t+;*s='0'删除字符:输入一个字符申,再输入一个字符ch,将字符申中所有的ch字符删除后输出该字符申。要求定义和调用函数delchar(s,c),该函数将字符申s中出现的所有c字符删除。试编写相应程序。解答:#include<stdio.h>voiddelchar(char*s,charc);intmain(void)charc;chars80;printf("Inputthestring:");gets(s);printf("Inpu

28、tach:");scanf("%c”,&c);delchar(s,c);printf("result:");puts(s);return0;voiddelchar(char*s,charc)inti,j;i=j=0;while(si!='0')if(si!=c)sj=si;j+;i+;sj='0'字符申排序:输入5个字符申,按由小到大的顺序输出。试编写相应程序解答:#include<stdio.h>#include<string.h>intmain(void)intn,i,j,index;c

29、harsx8080,stemp80;printf("Entern:");scanf("%d",&n);printf("Input%dstrings:",n);for(i=0;i<n;i+)scanf("%s”,sxi);/每行的基地址for(i=0;i<n-1;i+)index=i;for(j=i+1;j<n;j+)if(strcmp(sxj,sxindex)<0)index=j;strcpy(stemp,sxi);strcpy(sxi,sxindex);strcpy(sxindex,stem

30、p);printf("aftersorted:n");for(i=0;i<5;i+)printf("%st",sxi);return0;判断回文:判断输入的一申字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符申。如“XYZYX”和“xyzzyx”都是回文。试编写相应程序。解答:#include<stdio.h>intmirror(char*p);intmain(void)chars80;printf("Inputthestring:");gets(s);if(mirror(s)=1)printf("

31、;Yes!nH);elseprintf("No!n");return0;intmirror(char*p)char*q;q=p;while(*q!='0')q+;q-;while(p<q)if(*p!=*q)return0;p+;q-;return1;或#include<stdio.h>intmirror(char*p);intmain(void)chars80;printf("Inputthestring:");gets(s);if(mirror(s)=1)printf("Yes!n");elseprintf("No!n");return0;intmirror(char*p)char*q;q=p;while(*q!='0')q+;while(p<=q)(if(*p=*(q-1)(return1;p+;q-;elsereturn0;分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。试编写相应程序。解答:#include<stdio.h>intmain(void)(chars80,*p;intbl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论