




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
100、有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中.#include#includeint main(int argc,char* argv) FILE* fp; int i,j,k,num,NUM; char c50,t,ch;if(fp=fopen(A,r)=NULL) /*can be replaced by open * int fd=open(A,O_RDONLY|O_CREAT);*/ printf(fileA cannot be openedn); exit(0); printf(nA contents are:n);for(i=0;(ch=fgetc(fp)!=EOF;i+)/*一个字符一个字符读*/ ci=ch; putchar(ci); num=i+1;fclose(fp);if(fp=fopen(B,r)=NULL) printf(fileB cannot be openedn); exit(0); printf(nB contents are :n);for(i=0;(ch=fgetc(fp)!=EOF;i+) cnum+i=ch; putchar(cnum+i); fclose(fp);NUM=num+i+1;for(k=0;kNUM-1;k+)/*冒泡排序*/ for(j=0;jcj+1) t=cj; cj=cj+1; cj+1=t; printf(nC fileis:n);fp=fopen(C,w);for(i=0;iNUM;i+) putc(ci,fp);/*将字符一个个写入文件中*/ putchar(ci);/*一个个输出字符*/fclose(fp);return 1; 86.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)#include#includevoid BubbleSort(int arr, int n) int i,j; int exchange = 1;/交换标志,提高算法效率; int temp; for(i=0;in-1;i+) exchange=0;/本趟排序开始前,交换标志应为假 for(j=0;j arrj) temp=arrj+1; arrj+1=arrj; arrj=temp; exchange=1; /发生了交换,故将交换标志置为真 if(!exchange) /本趟排序未发生交换,提前终止算法 return; int main(int argc,char* argv) int arr5=1,4,2,6,5; int i; BubbleSort(arr, 5); printf(after sort,arr is :n); for(i=0;i5;i+) printf(%3d,arri); return 1; 77.写出二分查找的代码:Int binary_search(int* arr,int key,int size) Intmid; Intlow=0;Int high=size-1;While(lowkey) High=mid-1; ElseIf(arrmidkey) Low=mid+1; Else Return mid;Return -1;补充1:用帅选法查找100之内的质数#include using namespace std;#define N 100int main() /*0100共101个数*/ int sieveN + 1; int i; /step 1:初始化(sievei = 0 表示不在筛中,即不是质数;1表示在筛中) sieve0=sieve1=0; for(int i = 2; i = N; i+) sievei = 1; /step 2:偶数(2的倍数)肯定不是质数,所以应该先筛除 for(i = 2; i = N / 2; i+) sievei * 2 = 0; int p = 2; /第一个质数是2 /step 3:从sieve中删去P的倍数 while(p * p = N) p = p + 1; /选下一个p while(sievep = 0) p+; int t = p * p; int s = 2 * p;/*质数与质数之和包含合数,但质数于合数之和必为质数,提高算法效率*/ while(t = N) sievet = 0; /删除 t = t + s; /step 4:输出结果for(i = 2; i = N; i+) if(sievei != 0) coutidata;p-prior-next=p-next;p-next-prior=p-pror;free(p);p=NULL;/勿忘,否则内存泄露return OK;/插入操作StatusListInsert_DuL(DuLinkList&L,inti,ElemType&e)if(!(p=GetElemP_DuL(L,i)return ERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode)return ERROR; /*assert(s=(DuLinkList)malloc(sizeof(DuLNode)!=NULL)*/s-data=e;s-prior=p;p- next - prior =s;p-next=s;s-next=p-next-next;return OK;88、把一个链表反向。/链表头插法;intre_Link(Linklist H) Linklist p=H-next,q; H-next=NULL; while(p!=NULL) q=p; p=p-next;q-next=H-next; H-next=q; return 0; strcpy 和memcpy 76.已知strcpy函数的原型是char *strcpy(char*strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。(1)不调用C+/C 的字符串库函数,请编写函数strcpy。char* stringcpy(char* Des,const char* Src)assert(Des!=NULL) & (Src!=NULL);char* address=Des;while(*Des+=*Src+)!=0);return address;断言assert是一个宏,该宏在assert中,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。我们一般可以用在判断某件操作是否成功上。详见高质量c&c+编程,林锐,6.5章(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?为了实现链式表达式: int len= strlen(stringcpy(Des,hello);内存复制:void* memcpy(void* pvTo, constvoid* pvFrom, size_tsize)assert(pvTo!= NULL) &(pvFrom!= NULL);byte* pbTo= pvTo;byte* pbFrom= pbFrom;while (size- 0)*pbTo+ = *pbFrom+;return pvTo;注意:内存拷贝时要避免内存空间重叠的问题,(即pvfrom与pvto所指向的内存不能重叠)为了防止内存空间重叠,若是目标地址高于源地址,从后往前复制;若是源地址高于目标地址,从前往后复制;查找字符串中的子串84、请编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。#include#include#includeint ChildString(char*p) char* q=p; int stringlen=0, i=0,j=1,len=0,maxlen=1; /stringlen=strlen(p); while(*q!=0) /不能用strlen,求得长stringlen stringlen+; q+; while( i stringlen) if(*(p+i)=*(p+j)&j=maxlen) /统计最大子串长度 maxlen=len+1; len=0; else len=0; i+; j+; return maxlen;int main(int argc,char* argv) char arr11; int len; printf(please input chararr(10):n); scanf(%s,arr); len=ChildString(arr); printf(the len of childarr is:%dn,len); return 1;99. 计算字符串中子串出现的次数方法1;int main(int argc,char* argv) char str120,str220,*p1,*p2; int sum=0; printf(pleaseinput two stringsn); scanf(%s%s,str1,str2); p1=str1; p2=str2; while(*p1!=0) if(*p1=*p2) while(*p1+=*p2+) & *p2!=0); /*不断比较字符串1与2,至字符串2到达0*/ else p1+; /*如果,字符串2一次匹配已结束,或者 此刻*p1与*p2不等;*/ if(*p2=0) /*如果是字符串2结束,则成功找到一次,sum+*/ sum+; p2=str2; /*p2始终指向str2;*/ printf(%d,sum); return 1; 方法2:#include#include#include/判断两字符串是否相等,相等返回1,不等返回0int Judge(char *movePt,char *tempPt)#if 1 int ret=0 ; while( !(*movePt-*tempPt) & *tempPt) movePt+; tempPt+; if(*tempPt=0) ret=1; return ret;#endif#if 0 int i; for(i=0; istrlen(tempPt); i+,movePt+) if(*movePt != tempPti) return 0; return 1; #endif/计算子串出现的次数,str为原字符串,sub为子串int StrCount(char *str,char *sub) int count = 0; char *move = str; if( strlen(str) = strlen(sub) ) printf(%sn,move); if(Judge(move,sub) count+; printf(count+); move+; return count;int main(int argc,char* argv) char arr120; char arr220; int num; printf(please input two arrs:); scanf(%s%s,arr1,arr2); num=StrCount(arr1,arr2); printf(the num is :%dn,num); return 1;90、输入一行字符,统计其中有多少个单词。int main(int argc,char* argv) char string81; int i,num=0;/word=0; char c; gets(string); /*不能用scanf,视空格为终结*/ for(i=0;(c=stringi)!=0;i+) if(c= ) num+; num+;printf(Thereare %d words in thelinen,num);return 1;83、请编写一个C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char* cpSource, int n, char ch) /起始地址,搜索长度,目标字符 int i; for(i=0; in & *(cpSource+i) != ch; +i); return i; 数字问题,水仙花数,/和%的用法98某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。#include#includeint main(int argc,char* argv) int a,i,aa4,t;scanf(%d,&a);aa0=a%10;aa1=a%100/10;aa2=a%1000/100;aa3=a/1000;for(i=0;i=3;i+) aai+=5; aai%=10; for(i=0;i=0;i-)printf(%d,aai);return 1;97、809*?=800*?+9*?+1其中?代表的两位数,8*?的结果为两位数,9*?的结果为3位数。求?代表的两位数,及809*?后的结果。output(longb,long i) printf(n%ld/%ld=809*%ld+%ld,b,i,i,b%i);int main() long int a,b,i; a=809; for(i=10;i=1000&b=10000&8*i=100) output(b,i); 92、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?#include stdio.hInt main()inti,j,k;printf(n);for(i=1;i5;i+) /*以下为三重循环*/ for(j=1;j5;j+) for (k=1;k5;k+) if (i!=k&i!=j&j!=k) /*确保i、j、k三位互不相同*/ printf(%d,%d,%dn,i,j,k); 水仙花束问题:#include int main() int i; int num=0;for(i=100;i4;c=(04);/ 的优先级大于11110000-括号外面00001111,保证低4位为1111*/d=b&c;printf(%on%on,a,d);运行结果:输入:1234输出:123411(8进制)78、请编写一个C 函数,该函数给出一个字节中被置1 的位的个数。#include#includeunsigned char CheckSetBitNum(unsigned char ucNumber) unsigned char i; unsigned char iResult=0; for(i=0;ii) & 0x01; /第i位是1则加1,否则加0,位移动操作不改变原值 printf(ucNumber%d=%dn,i,ucNumberi); printf(iResult=%dn,iResult); return iResult;int main(int argc,char* argv) unsigned char a; int num; scanf(%c,&a); num=CheckSetBitNum(a); printf(%d,num); return 1;方法2:int count(int x) int i,y,sum=0; for (i=0;i8;i+) y=x%2; /*这是移出去的值*/ x=x/2; /*对于整数右移一次后x的值相当于右移前的值除以2*/ if (y=1) sum+=1;return sum;int main(int argc,char* argv) int x; scanf(%d,&x); printf(%d,count(x); return 0; 字符串与整数互换79、请编写一个C 函数,该函数将给定的一个字符串转换成整数。int main(int argc,char* argv) char arr20; char* str=arr; int num=0; int digital; printf(please input a string); scanf(%s,arr);while(*str!=0) digital=*str-48; num=num*10+digital; str=str+1; printf(the result is %d,num); return 1;字符串倒置int main(int argc,char*argv) char* str=hello world; char* des=NULL; int len=strlen(str); des=(char*)malloc(len+1);/结尾封口添0; char* d=des; char* s=&strlen-1;/指向最后一个字符; while(len-!=0) *d+=*s-; *d=0;/封口 printf(%sn,des); free(des);return 1; 数组94. 打印出杨辉三角形int main()int i,j,arr1111; for(i=1;i=10;i+) for(j=1;j=i;j+) if(j=1|i=j) arrij=1; else arrij=arri-1j-1+arri-1j; for(i=1;i=10;i+) for(j=1;j=i;j+) printf(%5d,arrij); if(i=j) printf(n); return 1; 71.一语句实现x是否为2的若干次幂的判断。void main() int a;scanf(“%d”,&a); printf(“%c”,(a)&(a-1)?n:y); / 若是打印y,否则n*2的n次幂用2进制表示一定是10,100,1000,10000.对应的i-1就是1,11,111,1111.i &(i-1)为false(也就是0)时就是返回true* 程序分析题class Apublic: A(int a) printf(%d ,a); ;A a(1);int main(void) printf(main ); A c(2); static A b(3); return 0;答案:、1 main 2 3【函数体外】只能存在声明语句或定义语句(实际上函数体外的声明语句都是定义语句,如果没有初始化,会隐式的初始化,对于基本类型初始化为零,对于类类型则调用相应的构造函数),不能存在表达式语句,包括函数调用语句。2.struct Test unsigned short int a:5; unsigned short int b:5; unsigned short int c:6;int main(intargc,char* argv) struct Test test; test.a=16; test.b=4; test.c=0; int j=sizeof(test); int i=*(short*)&test; printf(%dn,i); printf(sizeof %dn,j); return 0;0000 0000 1001 0000小端机器结果将是:16+128=144,选B60.main()Int a5=1,2,3,4,5;int*ptr=(int*)(&a+1);int* ptr2=(int*)(int*)a+1);printf(“%d,%d,%d”,*(a+1),*(ptr-1),*ptr2); 结果:2,5,2地址 0-3 4-7 8-11 12-15 16-19 20-23数值 1 2 3 4 5 &a+1 就是地址为20的地方*ptr1-1就是20-4=16这个地方 一个Int 占用4个地址(int)a+1 跟(int*)a+1不一样 前者地址为1 后者为4,所以,int *ptr2=(int*)(int)a+1);*ptr2表示的是指向地址为1的指针地址要点:指针进行运算,加数与指针类型相关,一般(char*),一个字节;(int*),4个字节; 若是指向结构体,或者是数组的指针,由具体(sizeof)长度决定;详见:点击打开链接#include #include int main()int a4=1,2,3,4;int *ptr1=(int *)(&a+1);int *ptr2=(int *)(int)a+1);printf(%x,%x,ptr1-1,*ptr2);return 0;小端字节:*ptr2=0x2000000;大端字节:*ptr2=0x100;62#define SQUARE(a)(a)*(a)int a=5;int b;b=SQUARE(a+);在同一个式子中有两次以上修改变量内容的副作用时,是未定义行为。C语言规定a+的自增副作用应该发生在下一个序列点之前,但是乘法、括号和赋值都不是序列点,只有整个表达式结束时才是。在此之前a自增副作用发生的时机是未定义的。 每个编译器的结果不同,结果是25或者36(不提倡在一个表达式中对变量进行两次后自增操作)63、#define Max_CB500void LmiQueryCSmd(StructMSgCB* pmsg)unsigned char ucCmdNum;. for(ucCmdNum=0;ucCmdNumMax_CB;ucCmdNum+).; 这段代码执行有什么问题?【标准答案】死循环unsigned char /无符号字符型表示范围0255char /有符号字符型表示范围-12812767.#include#includeint modifyvalue() int x; return(x+=10);int changevalue(int x) x+=1; return(x);int main(int argc,char*argv)int x=10;x+;x=changevalue(x);printf(changevalue:%dn,x);/12x+;modifyvalue();printf(Firstoutput:%dn,x);/13x+;x=changevalue(x);/15printf(Secondoutput:%dn,x);modifyvalue();printf(Thirdoutput:%dn,x);/15return 1;int modifyvalue()int x; return(x+=10);int changevalue(int x) x+=1; return(x);int main(int argc,char*argv)int x=10;x+;changevalue(x);/变量没有接受返回值printf(changevalue:%dn,x);/11x+;modifyvalue(); /无形参printf(Firstoutput:%dn,x);/12x+;changevalue(x);/15printf(Secondoutput:%dn,x);/13modifyvalue();printf(Thirdoutput:%dn,x);/13return 1;考查临时变量(返回值为栈中变量)的生存期:仅仅在于 紧跟着的一条语句;73、下面的代码输出是什么,为什么?void foo(void)unsigned inta = 6;int b = -20;(a+b 6)? puts( 6) : puts(6”。原因是当表达式中存在有符号类型和无符号类型时所有的数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的74、评价下面的代码片断:unsigned intzero = 0;unsigned intcompzero= 0xFFFF;/*1s complement of zero */【参考答案】对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned intcompzero= 0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。75.char *ptr;if (ptr= (char *)malloc(0) =NULL)puts(Gota nullpointer);elseputs(Gota validpointer);如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。为什么 new T0 和 malloc(0) 不返回空指针首先需要说明的是,按照C+标准,成功的 new T0 是不能返回空指针的。而 malloc(0),C 语言标准则指出,成功的时候可以返回空指针,也可以返回非空指针,多数库一般也选择了返回非空指针这种行为。76.int main(int argc,char* argv) char a=a,b=b; int p,c,d; p=a; p=(p8; printf(a=%dnb=%dnc=%dnd=%dn,a,b,c,d); return 1;运行结果:97,98,97,9877.int main(int argc,char* argv) unsigned a,b; printf(please input a number:); scanf(%d,&a); b=a5; b=b&15; printf(a=%dtb=%dn,a,b); return 1;【运行结果】:输入 64,输出2* 概念区别指针数组:存放指针的数组;Int* ptr4; (等同于二级指针 int* ptr) 一级指针是指向定义类型的内存地址,二级指针就是指向定义类型的内存地址所指向的新的内存地址应用:指向若干字符串,整形数据等,使得元素处理更加方便;其中元素存放各对应地址; 此时,一级指针只能寻址到字符串所在的位置,并不能将其输出,因为没有其首地址,而*p则完成二级寻址,找到了位置,也找到了它的首地址,所以能输出数组指针:指向一个数组的指针; Int (*ptr)4 应用:可以应用在二维数组中;指针函数:返回指针值得函数 Int* search(int num);函数指针:指向函数的指针 Int (*ptr)(int num);/*申明一个函数指针*/ Ptr=fun();/*将fun函数地址付给指针ptr*/ Int a=fun(6).等价于,int a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 3.2.1人体与外界气体交换(第二课时)教学设计-2023-2024学年济南版生物七年级下册
- 第一节 城市空间形态及其变化说课稿-2025-2026学年高中地理中图版2007选修4城乡规划-中图版2004
- 社交K歌点歌盛典创新创业项目商业计划书
- 2025年气候变化对水资源管理的影响与对策
- 第2节 卷积神经网络及其应用教学设计初中信息科技清华大学版2024八年级下册-清华大学版2024A版
- 三年级下册道德与法治教学设计-5学习智慧树 第二课时 粤教版
- 1.1.1生物具有基本的生命特征说课稿-2024-2025学年济南版七年级生物上册
- 2025年金融货币学考试题及答案
- 网络咨询营销方案设计
- 贵州策划活动方案
- 中职生就业指导课件
- 2025年大队委笔试题目及答案
- 收费站复工复产安全培训课件
- 2025年重庆市两江新区小升初语文试卷
- 新版《煤矿安全规程》考试题库及答案
- 中药煎煮法课件
- WST524-2025医院感染暴发控制标准解读培训
- 人工智能项目落地实施方案
- 2025年sca感官考试题库
- 静电安全培训课件
- 审核评估线上评估专家联络员培训
评论
0/150
提交评论