资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章指针习题,补充题,1,:输入,3,个字符串,按由小到大的顺序输出。,#include,#include,int main(),char*str1=fotran,*str2=computer,*str3=basic;,char*tmp;,if(strcmp(str1,str2)0),tmp=str1;,str1=str2;,str2=tmp;,if(strcmp(str1,str3)0),tmp=str1;,str1=str3;,str3=tmp;,if(strcmp(str2,str3)0),tmp=str2;,str2=str3;,str3=tmp;,puts(str1);puts(str2);puts(str3);,return 0;,补充题,2,:,输入,10,个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求写三个函数,输入,10,个数(用指针法),进行处理(用指针操作),输出,10,个数(用指针法),#include,enum N=10;,void get(int*a,int n);,void action(int*a,int n);,void put(int*a,int n);,int main(),int aN;,get(a,N);,action(a,N);,put(a,N);,return 0;,void get(int*a,int n),printf(,输入数组的值,:n);,int*p=a;,for(;pa+n;p+),scanf(%d,p);,void action(int*a,int n),int*q=a,*m=a,min,max;,for(int i=1;iai),q=a+i;,if(*mai),m=a+i;,min=*a;*a=*q;*q=min;,max=*(a+n-1);*(a+n-1)=*m;*m=max;,void put(int*a,int n),int*t=a;,for(;ta+n;t+),printf(%4d,*t);,putchar(n);,补充题,3,:从键盘输入若干(如,10,)个数,写一个函数对这组数从第,begin,(如,3),个数到第,end,(如,7,)个数之间的数进行排序,要求形参用指针,实参用指针或数组,。,#include,enum N=10;,void selectsort(int*a,int begin,int end);,int main(),int aN,*p;,for(p=a;p-aN;p+),scanf(%d,p);,selectsort(a,3,7);,printf(,排序后:,n);,for(p=a;p-aN;p+),printf(%4d,*p);,return 0;,void selectsort(int*a,int begin,int end),int*p,*t,*k,tmp;,for(p=a+begin;pa+end;p+),k=p;,for(t=p+1;t=a+end;t+),if(*t*k)k=t;,tmp=*k;,*k=*p;,*p=tmp;,补充题,4,:有一个包含,n,个字符的字符串,写一个函数将这个字符串中从第,m,个字符开始的全部字符复制成为另一个字符。并在主程序中调用该函数进行测试。,void fun(char*s,char c,int m,int n),char*p=s+m-1;,for(;ps+n;p+),*p=c;,4,:,1),字一个函数,它检查两个字符串是否由同一字符组成,.,#include,enum LEN=20;,int issame(const char*,const char*);,int main(),char str1LEN,str2LEN;,scanf(%s,str1);,scanf(%s,str2);,if(issame(str1,str2)&issame(str2,str1),printf(Yesn);,else,printf(Notn);,return 0;,int issame(const char*s1,const char*s2),int i,j,flag;,for(i=0;s1i!=0;i+),flag=0;,for(j=0;s2j!=0;j+),if(s1i=s2j),flag=1;,if(!flag)return 0;,return 1;,4,:,2),写一个函数,它判断一个字符串是否可以通过另一个字符串重排得到。,#include,#include,enum LEN=20;,void selectsort(char*a,int end);,int issame(char*s1,char*s2);,int main(),char str1LEN,str2LEN;,scanf(%s,str1);,scanf(%s,str2);,if(issame(str1,str2),printf(Yesn);,else,printf(Notn);,return 0;,int issame(char*s1,char*s2),int len1,len2;,len1=strlen(s1);,len2=strlen(s2);,if(len1!=len2),return 0;,selectsort(s1,len1);,selectsort(s2,len2);,if(strcmp(s1,s2)!=0),return 0;,else,return 1;,void selectsort(char a,int n),int i,j,t,k;,for(i=0;in-1;i+),k=i;,for(j=i+1;jak)k=j;,t=ak;,ak=ai;,ai=t;,4,:,1),字一个函数,它检查两个字符串是否由同一字符组成,.2),写一个函数,它判断一个字符串是否可以通过另一个字符串重排得到。,int fun1(char*s1,char*s2),int m=0,n=0,f=1;,int c1M=0,c2M=0;,while(s1m!=0),m+;,while(s2n!=0),n+;,for(int i=0;im;i+),c1s1i=1;,for(int j=0;jn;j+),c2s2j=1;,for(int t=0;tM;t+),if(c1t!=c2t)f=0;,return f;,const int M=128;,int fun2(char*s1,char*s2),int m=0,n=0,f=1;,int c1M=0,c2M=0;,while(s1m!=0),m+;,while(s2n!=0),n+;,if(m!=n)f=0;return f;,for(int i=0;im;i+),c1s1i+;,for(int j=0;jn;j+),c2s2j+;,for(int t=0;tM;t+),if(c1t!=c2t)f=0;,return f;,3,:写一个程序,其命令行包括一个字符参数,s,,运行中由标准输入读入一系列正文,该程序把所有行依次输出,并在那些依次字符串,s,的行前面标一个星号。,int getline(),int c,i=0;,while(i 0),if(strstr(line,argv1)!=NULL),putchar(*);,puts(line);,else,puts(line);,return 0;,5,:修改第,5,章猜数程序,通过命令行参数为它提供数的范围。,int main(int argc,char*argv),int m,unknown,guess;,if(argc=2)m=s2int(argv1);,else,printf(input errorn);,return 0;,if(m=0)return 1;,+m;/*,取模的数应比最大的数大一*,/,do,unknown=rand()%m;,while(1),if(guess=getnumber(m)unknown)printf(Too big!n);,else if(guess 1E-6;m*=2),res0=res;,h=(b-a)/(2*m);,for(res=fp(a)+fp(b),i=1;i2*m;i+=2),res+=4*fp(a+i*h);,for(i=2;i2*m;i+=2),res+=2*fp(a+i*h);,res=res*h/3;,dif=res-res0;,return res;,13,:写程序输入并保存至多,100,个长度不超过,80,个字符的字符行。读完所有输入后,先输出长度不超过,40,个字符的行,再输出其它行。考虑用两种方式实现:,1,)两维字符数组,int getline(),int c,i=0;,while(i MAXLEN-2&,(c=getchar()!=EOF&c!=n),linei=c;,+i;,/*,if(c=n),linei=c;+i;*/,linei=0;,return i;,#include,#include,int getline();,char line80;,char mline10080;,int main(),int i,n,row=0;,while(n=getline()=80&n!=0&row100),strcpy(*(mline+row),line);,row+;,for(i=0;irow;i+),puts(*(mline+i);,return 0;,13,:,2,)用字符指针数组,将字符行保存在动态分配的存储块里。,int getline(),int c,i=0;,while(i MAXLEN-2&,(c=getchar()!=EOF&c!=n),linei=c;,+i;,/*,if(c=n),linei=c;+i;*/,linei=0;,return i;,#include,#include,#include,int getline();,char line80;,char*mline100;,int main(),int i,n,row=0;,char(*p)80;,p=(char(*)80)malloc(100*80);,for(i=0;i100;i+,p+),mlinei=(char*)p;,while(n=getline()=80&n!=0&row100),strcpy(mlinerow,line);,row+;,for(i=0;irow;i+),puts(mlinei);,return 0;,17,:实现一个一元多项式计算系统。多项式的项数和系数保存在数组中,数组通过动态内存分配创建。,int main(),int*p,*q,n;,double x,value;,printf(Input xiangshi:n);,scanf(%d,p=(int*)malloc(n+2)*sizeof(int);,if(p=NULL),return 0;,*p=n;,printf(Input xishi:n);,for(q=p+1;q=0;i-),sum=sum*x+ai;,return sum;,double poly2(int*p,int n,double x),int*pn=p+n;,double sum=0;,for(;pn=p;pn-),sum=sum*x+*pn;,return sum;,第八章文件及第九章结构习题答案,2.,写一个程序,其命令行有三个参数,将前两个文件的内容联接起来写入第三个文件。,#include,#include,int main(int argc,char*argv),FILE*ifp1,*ifp2,*ofp;,char*line;,line=(char*)malloc(100*sizeof(char);,if(argc=3),printf(input error!n);,exit(0);,if(ifp1=fopen(argv1,r)=NULL|(ifp2=fopen(argv2,r)=NULL,|(ofp=fopen(argv3,w)=NULL),printf(cant open file.n);,exit(0);,while(!feof(ifp1),if(fgets(line,100,ifp1)!=NULL),fputs(line,ofp);,fprintf(ofp,n);,while(!feof(ifp2),if(fgets(line,100,ifp2)!=NULL),fputs(line,ofp);,fclose(ifp1);,fclose(ifp2);,fclose(ofp);,return 0;,2.,写一个程序,其命令行有三个参数,将前两个文件的内容联接起来写入第三个文件。,#include,#include,int main(int argc,char*argv),FILE*ifp1,*ifp2,*ofp;,char*line;,line=(char*)malloc(100*sizeof(char);,if(argc=3),printf(input error!n);,exit(0);,if(ifp1=fopen(argv1,r)=NULL|(ifp2=fopen(argv2,r)=NULL,|(ofp=fopen(argv3,w)=NULL),printf(cant open file.n);,exit(0);,while(!feof(ifp1),if(fgets(line,100,ifp1)!=NULL),fputs(line,ofp);,fprintf(ofp,n);,while(!feof(ifp2),if(fgets(line,100,ifp2)!=NULL),fputs(line,ofp);,fclose(ifp1);,fclose(ifp2);,fclose(ofp);,return 0;,补充题,1.,调试书中,P279,页,8.4.1,求文件中数据的平均值的程序。假设文件中的数据形式:,23.518.799.021.873.6,文件名为:,data.txt,从命令行参数获取文件名,#include,double nextentry(FILE*fp);,int main(int argc,char*argv),double total=0.0,x;,int count=0;,FILE*ifp;,if(argc=1)/*,缺参数,产生错误信息*,/,printf(Missing file name.Stop!n);,return 1;,if(ifp=fopen(argv1,r)=NULL),printf(Cant open:%s.Stop!n,argv1);,return 2;,while(x=nextentry(ifp)!=0.0),count+;,total+=x;,printf(Average:%fn,total/count);,fclose(ifp);,return 0;,double nextentry(FILE*fp),double num;,int n=fscanf(fp,%lf,return n=EOF?0.0:num;,补充题,2,:统计,C,程序里的关键字,完成实现相关程序,,C,程序从文件读,int main(),int n;,char wordM;,KEYC*p;,FILE*fp;,fp=fopen(f:/test.cpp,r);,if(fp=NULL),printf(cant open filen);,return 0;,while(getident(fp,M,word)!=-1),for(p=keywords,n=0;n key)=0),p-count+;,break;,for(p=keywords,n=0;n key,p-count);,return 0;,#include,#include,int getident(FILE*fp,int limit,char word);,enum M=20;,typedef struct,char*key;,int count;,KEYC;,KEYC keywords32=,auto,0,break,0,case,0,char,0,const,0,continue,0,default,0,do,0,double,0,else,0,enum,0,extern,0,float,0,for,0,goto,0,if,0,int,0,long,0,register,0,return,0,short,0,signed,0,sizeof,0,static,0,struct,0,switch,0,typedef,0,union,0,unsigned,0,void,0,volatile,0,while,0,;,int getident(FILE*fp,int limit,char word),int c,i=0;,while(ilimit-1&(c=fgetc(fp)!=EOF&c!=n&c!=&c!=t&,c!=;&c!=(&c!=)&c!=&c!=&c!=&c!=,),wordi=c;+i;,wordi=0;,if(c=EOF)return-1;,else return i;,设有学生成绩处理系统,用链表表示一个班级中所有学生的成绩,每个链表点中包括学生姓名、程序设计和数学课的成绩,设链表结构如下:,struct LinkNode,char Name20;,double Programming;,double Mathematics;,struct LinkNode*pNext;,;,请设计一个函数,该函数能输出,Programming,的值处于,Min,Max,之中的学生的姓名和二门课的成绩,函数原型要求如下:,void RangeQuery(struct LinkNode*pHead,,,double Min,double Max);,其中,pHead,为链表的第一个结点指针,Min,为成绩下界,,Max,为成绩上界。,07,年考题,链表实现,#include,#include,#include,#include,enum MAXNUM=3;,typedef struct node NODE,*LINK;,struct node/,定义链接结构,char name20;,double programming;,double math;,LINK next;,;,LINK addwordL(LINK list,char name,double prog,double mathe);,void printlink(LINK l,double min,double max);,LINK list=NULL;,int main(),double prog=0,mathe=0;,int i=0;,do,scanf(%s%lf%lf,name,list=addwordL(list,name,prog,mathe);,i+;,while(iname,name);,p-programming=prog;,p-math=mathe;,p-next=NULL;,return p;,LINK addwordL(LINK list,char name,double prog,double mathe),/,将新创建的结点加下链表中,LINK p;,if(list=NULL)return mknode(name,prog,mathe);,for(p=list;p=p-next),if(strcmp(p-name,name)=0),printf(has been created noden);,break;,if(p-next=NULL),p-next=mknode(name,prog,mathe);,break;,return list;,void printlink(LINK p,double min,double max),/,遍历打印链表结点,for(;p!=NULL;p=p-next),if(p-programmingmin&p-programming name,p-programming,p-math);,Q&A!,
展开阅读全文