C语言程序设计何钦铭 颜 晖 第8章 指针

上传人:daj****de 文档编号:183704584 上传时间:2023-01-31 格式:DOCX 页数:17 大小:20.42KB
收藏 版权申诉 举报 下载
C语言程序设计何钦铭 颜 晖 第8章 指针_第1页
第1页 / 共17页
C语言程序设计何钦铭 颜 晖 第8章 指针_第2页
第2页 / 共17页
C语言程序设计何钦铭 颜 晖 第8章 指针_第3页
第3页 / 共17页
资源描述:

《C语言程序设计何钦铭 颜 晖 第8章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计何钦铭 颜 晖 第8章 指针(17页珍藏版)》请在装配图网上搜索。

1、第8章指针【练习8-1】如果有定义” int m, 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=n。C:&n是n的地址。即把n的地址赋给m。D:*p是指p指向的指针所指向的值,在此无意义。故选B。【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自 定义一个函数 sum_diff(float op1,float op2, float *p

2、sum, float *pdiff), 其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。解答:#includevoid sum_diff(float op1,float op2,float *psum,float *pdiff);int main(void)(float op1,op2,sum,diff;printf(Input op1 and op2:);scanf(f%f,&op1,&op2);sum_diff(op1,op2,&sum,&diff);printf(%f+%f=%f;%f-%f=%f n,op1,op2,sum,op1,op2,diff);re

3、turn 0;void sum_diff(float op1,float op2,float *psum,float *pdiff)(*psum=op1+op2;*pdiff=op1-op2;【练习8-3】两个相同类型的指针变量能不能相加?为什么?解答:不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地 址,两个地址相加并不能保证结果为一个有效的地址值,因而在C语言中指针 变量相加是非法的。【练习8-4】根据表8.2所示,这组数据的冒泡排序其实循环到第6遍(即n-2) 时就已经排好序了,说明有时候并不一定需要n-1次循环。请思考如何改进冒 泡排序算法并编程实现(提示:当发现

4、一遍循环后没有数据发生交换,说明已经 排好序了)。解答:设置一个标志变量flag,进入一轮循环前设置为0,在循环中有发生数据交换 就改写flag值为1。当该轮循环结束后检查flag值,如果变为1说明发生 了数据交换,还没有排好序,如果为0说明没有发生交换,已经排好序。#includevoid bubble (int a,int n);int main(void)(int n,i,a8;printf(Enter n (n=8):);scanf(%d,&n);printf(Enter a%d : ,n);for(i=0;in;i+)scanf(%d,&ai);bubble(a,n);printf(

5、After sorted, a%d=, n);for(i=0;in;i+)printf(%3d,ai);return 0;void bubble(int a, int n)(int i,j,temp,flag;for(i=1;in;i+ )(flag=0;for(j=0;jaj+1)temp=aj;aj=aj+1;aj+1=temp;flag=1;if(flag=0)break;【练习8-5】重做例8-9,要求使用选择排序算法。解答:#includevoid bubble(int a, int n);int main(void)(int i,n,a8;printf(Enter n (n=8):

6、);scanf(%d,&n);printf(Enter a%d :,n);for(i=0;in;i+)scanf(%d,&ai);bubble(a,n);printf(After sorted, a%d=,n);for(i=0;in;i+)printf(%3d,ai);return 0;void bubble(int a,int n)(int i,j,temp,index;for(i=0;in-1;i+)index=i;for(j=i+1;jn;j+)if(ajaindex) index=j;temp=ai;ai=aindex;aindex=temp;8.4电码加密【练习8-6】在使用scan

7、f()函数时,输入参数列表需要使用取地址操作符&, 但当参数为字符数组名时并没有使用,为什么?如果在字符数组名前加上取地址 操作符&,会发生什么?解答:因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要 再使用取地址符来获取该数组的地址。如果在字符数组名str前加上取地址操 作符&,那么对其取地址&str可以看做是这个数组的第一个元素的地址,由于数 组地址和数组第一个元素的地址相同,所以&str表示地址值和str表示的地址 值是相等的。对scanf()的变长参数列表的话,编译器只负责参数传递,怎么解 释后边的几个地址的含义,是由前边的字符串确定的。所以使用 scanf(s”

8、,str)和scanf(s”,&str)都能通过编译且正常执行。【练习8-7】C语言不允许用赋值表达式直接对数组赋值,为什么? 解答:数组名可以看作是常量指针,因为不可以对一个常量进行赋值,所以不允许用赋 值表达式直接对数组进行赋值。【练习8-8】输入一个字符串,把该字符串的前3个字母移到最后,输出变换 后的字符串。比如输入abcdef”,输出为“defabc”。解答:#include#include#define MAXLINE 100int main(void)(char lineMAXLINE,str4;int i;printf(Input the string:);gets(line)

9、;if(strlen(line)3)(printf (-字符串长度小于3,不符合要求! n);for(i=0;i3;i+)stri=linei;stri=0;for(i=3;linei!=0;i+)linei-3=linei;linei-3=0;strcat(line,str);printf(%s%sn”,After changing: ,line);return 0;【练习8-9】使用动态内存分配的方法实现例8-9的冒泡排序。解答:#include#includevoid bubble(int a,int n);int main(void)(int n,j,*a,i,temp;printf(

10、Enter n(n=8):);scanf(%d”,&n);if(a=(int*)calloc(n,sizeof(int)=NULL)printf(Not able to allocate memory.n);exit(1);printf(Ente a%d:,n);for(i=0;in;i+)scanf(%d,a+i);bubble(a,n);printf(After sorted,a%d=,n);for(i=0;in;i+)printf(3d,*(a+i);free(a);return 0;void bubble(int a,int n)(int i,j,temp;for(i=1;in;i+)

11、for(j=0;j*(a+j+1)(temp=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=temp;习题8一、选择题1. 下列语句定义x为指向int类型变量a的指针,其中哪一个是正确的 B 。A. int a, *x = a;B. int a, *x = &a;C. int *x = &a,a;D. int a, x = a;2. 以下选项中,对基本类型相同的指针变量不能进行运算的运算符是A 。A.+B.-C.=D.=3. 若有以下说明,且0=i=0)的元素前。如果i= 元素的个数,则x插入到末尾。原有的元素个数存放在指针n所指向的变量中, 插入后元素个数加1。请填空。vo

12、id insert(double a , int *n, double x, int i)(int j;if _ (i=i_; j-)_aj+1_ = aj;elsei = *n;ai=_x_;(*n)+;2. 下列程序先消除输入字符串的前后空格,再判断是否是“回文”(即字符串 正读和倒读都是一样),若是则输出YES,否则输出NO。请填空。#include #include int main(void)(char s80, ch, *p, *q; int i, j, n;gets(s);p = _s_;while ( *p = ) _p+_;n = strlen(s);q = _s+n-1_;

13、while ( *q = ) _q-_;while ( _pq_ & *p =*q)(p+;_q-_;if ( pq )printf(NOn”);elseprintf(YESn”); return 0;3. 下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在main() 函数的fmax和min变量中。请填空。void find(int *, int, int *, int *);int main(void)(int max, min, a = 5,3,7,9,2,0,4,1,6,8;find(_a, 10, &max, &min_);printf(d,%dn”,max, min);

14、return 0;void find(int *a, int n, int *max, int *min)(int i;*max=*min=0;for (i = 1; i a *max) _*max=i_;if (ai a *min) _ *min=i_;4 .写出下列程序的执行结果001 22 4002346#include int main(void)(int a10, b10, *pa, *pb, i;pa = a;pb = b;for( i=0; i3; i+, pa+, pb+)(*pa = i;*pb = 2*i;printf(dt%dn”,*pa, *pb);pa = &a0;p

15、b = &b0;for ( i=0; i3; i+)(*pa = *pa + i;*pb = *pb + i;printf(dt%dn”, *pa+, *pb+);return 0;三、程序设计题1. 拆分实数的整数与小数部分:要求定义一个函数 void splitfloat(float x,int *intpart,float *fracpart),其中 x 是被拆分的实数, *intpart 和 *fracpart分别是将实数x拆分出来的整数部分与小数部分。编写主函数,并在 其中调用函数splitfloat()。试编写相应程序。解答:#includevoid splitfloat(floa

16、t x,int *intpart,float *fracpart);int main(void)(float x,fracpart;int intpart;printf(Input a number:);scanf(%f,&x);splitfloat(x,&intpart,&fracpart);printf(The intpart is: %d”,intpart);printf(The fracpart is: %f”,fracpart);return 0;void splitfloat(float x,int *intpart,float *fracpart)(*intpart=(int)x

17、;*fracpart二x-*intpart;2. 在数组中查找指定元素:输入1个正整数n(1n=10),然后输An6整数存 入数组a中,再输入一个整数x,在数组a中查找x,若找到则输出相应的下 标,否则显示“Not found”。要求定义和调用函数search(int list , int n, int x),在数组list中查找元素x,若找到则返回相应下标,否则返回-1,参 数n代表数组list中元素的数量。试编写相应程序。解答:#includeint search(int list,int n,int x);int main(void)(int i,n,res,x;int a10;prin

18、tf(Input n:);scanf(%d,&n);for(i=0;i=0)printf(index=%dn,res);elseprintf(Not foundn);return 0;int search(int list,int n,int x)(int i;for(i=0;in;i+)if(listi=x) return i;return -1;3. 循环后移:有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头 移入。编写一个函数实现以上功能,在主函数中输An个整数并输出调整后的n 个数。试编写相应程序。解答:#includevoid move(int *x,int n,int m

19、);int main(void)(int i,m,n;int a80;printf(Enter n:);scanf(%d,&n);printf(Enter m:);scanf(%d”,&m);for(i=0;in;i+)scanf(%d, &ai);move(a,n,m);printf(After move:);for(i=0;in;i+)printf(%d ,ai);return 0;void move(int *p,int n,int m)(int i,j,k=0,a80;for(i=0;in;i+)if(in-m)ai+m=pi;elseak+=pi;for(i=0;in;i+)pi=a

20、i;4. 报数:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数, 报到m(mn)的人退出圈子,下一个人从1开始报数,报到m的人退出圈子。 如此下去,直到留下最后一个人。编写程序,输入整数n和m,并按退出顺序 输出退出圈子的人的编号。试编写相应程序。解答:#includeint main(void)(int count,i,j,m,n;int num80 = 0;printf(Input n:);scanf(%d,&n);printf(Input m:);scanf(d,&m);i=j=count=0;while(countn-1)if(numi=0)j+;if(j%m=0&j)(c

21、ount+;numi=-1;j=0;/报数报到m后,j重归0,开始下次报数i+;/读取下一个元素i%=n;/一次n个跟报完数,开始下一次(除余n是因为i是下标,从0 开始,n是具体 数从1开始/i为n时下次a0报数)for(i=0;in;i+)if(numi=0)printf(Last No is: %dn”,i+1);return 0;5. 使用函数实现字符串复制:输入一个字符串t和一个正整数m,将字符串中从 第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求自定义并 调用函数void strmcpy(char *s, char *t, int m)。试编写相应程序。解答:#in

22、clude#includevoid strmcpy(char *s,char *t,int m);int main(void)(char s80,t80;int m;printf(Input the string:);gets(t);printf(Enter m:);scanf(%d”,&m);if(strlen(t)m)(printf(Error Input);return 0;else(strmcpy(s,t,m);puts(s);return 0;void strmcpy(char *s,char *t,int m)(t=t+m-1;while(*t!=0)*s=*t;s+;t+;*s=

23、0;6. 删除字符:输入一个字符串,再输入一个字符ch,将字符串中所有的ch字 符删除后输出该字符串。要求定义和调用函数delchar(s,c),该函数将字符串s 中出现的所有c字符删除。试编写相应程序。解答:#includevoid delchar(char *s,char c);int main(void)(char c;char s80;printf(Input the string:);gets(s);printf(Input a ch:);scanf(%c”,&c);delchar(s,c);printf(result:);puts(s);return 0;void delchar(

24、char *s,char c)(int i,j;i=j=0;while(si!=0)if(si!=c)(sj=si;j+;i+;sj=0;7. 字符串排序:输入5个字符串,按由小到大的顺序输出。试编写相应程序。 解答:#include#includeint main(void)(int n,i,j,index;char sx8080,stemp80;printf(Enter n:);scanf(%d,&n);printf(Input %d strings:,n);for(i=0;in;i+)scanf(%s”,sxi);/每行的基地址for(i=0;in-1;i+)index=i;for(j=

25、i+1;jn;j+)if(strcmp(sxj,sxindex)0)index=j;strcpy(stemp,sxi);strcpy(sxi,sxindex);strcpy(sxindex,stemp);printf(after sorted: n);for(i=0;i5;i+)printf(%st”,sxi);return 0;8. 判断回文:判断输入的一串字符是否为“回文”。所谓“回文”是指顺读和 倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。试编写相应程序。解答:#include int mirror(char *p);int main(void)(char s80;p

26、rintf(Input the string:);gets(s);if(mirror(s)=1)printf(Yes!n);elseprintf(No!n);return 0;int mirror(char *p)(char *q;q=p;while(*q!=0)q+;q-;while(pq)(if(*p!=*q)return 0;p+;q-;return 1;或#include int mirror(char *p);int main(void)(char s80;printf(Input the string:);gets(s);if(mirror(s)=1)printf(Yes!n);e

27、lseprintf(No!n);return 0;int mirror(char *p)(char *q;q=p;while(*q!=0)q+;while(p=q)(if(*p=*(q-1)return 1;p+;q-;elsereturn 0;9. 分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。试编写相应程序。解答:#includeint main(void)(char s80,*p;int blank,digit,lower,other,upper;printf(Input the string:);gets(s);upper=lower二b

28、lank二digit=other=0;for(p=s;*p!=,0,;p+)if(*p=A&*p=,a,&*p=,0,&*p=,9,)digit+;else if(*p=,)blank+;elseother+;printf(upper: %dnlower: %dnblank: %dndigit: %dnother: %dn”,uppe r,lower,blank,digit,other);return 0;10. (选做)输出学生成绩(动态分布):输入学生人数后输入每个学生的成绩, 最后输出学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。试编写相应程序。解答:#include#

29、includeint main(void)(int n,i;float *p,sum,max,min,avg;printf(Input students number n:);scanf(%d,&n);if(p=(float *)calloc(n,sizeof(float)=NULL) printf(Not able to allocate memory. n); exit(1);sum=0.0;max=-1;min=1000;printf(Input %d students scores: , n);for(i=0;i*(p+i)min=*(p+i);if(max*(p+i) max=*(p+i);avg=sum/n;printf(The avg is %f,max is %f,min is %fn”,avg,max,min); free(p);return 0;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!