华为笔试.docx
《华为笔试.docx》由会员分享,可在线阅读,更多相关《华为笔试.docx(17页珍藏版)》请在冰豆网上搜索。
华为笔试
写一个程序,要求功能:
求出用1,2,5这三个数不同个数组合的和为100的组合个数。
如:
100个1是一个组合,5个1加19个5是一个组合。
。
请用C++语言写。
答案:
最容易想到的算法是:
设x是1的个数,y是2的个数,z是5的个数,number是组合数
注意到0<=x<=100,0<=y<=50,0<=z=20,所以可以编程为:
number=0;
for(x=0;x<=100;x++)
for(y=0;y<=50;y++)
for(z=0;z<=20;z++)
if((x+2*y+5*z)==100)
number++;
cout<上面这个程序一共要循环100*50*20次,效率实在是太低了事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:因为x+2y+5z=100所以x+2y=100-5z,且z<=20x<=100y<=50所以(x+2y)<=100,且(x+5z)是偶数对z作循环,求x的可能值如下:z=0,x=100,98,96,...0z=1,x=95,93,...,1z=2,x=90,88,...,0z=3,x=85,83,...,1z=4,x=80,78,...,0......z=19,x=5,3,1z=20,x=0因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,即为:(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2某个奇数m以内的奇数个数也可以表示为(m+2)/2所以,求总的组合次数可以编程为:number=0;for(intm=0;m<=100;m+=5){number+=(m+2)/2;}cout<这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多倍----只是因为作了一些简单的数学分析这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事——这不是一个专业的研发人员的行为。那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。可以举例表示为:#ifdefDEBUGintsimple();#endifintoptimize();......inafunction:{result=optimize();ASSERT(result==simple());}这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程序的发布版本,却不会包含笨重的simple()函数。——任何大型工程软件都需要预先设计良好的调试手段,而这里提到的就是一种有用的方法。一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。#include"stdio.h"#include"conio.h"structstu{charname[20];charsex;intno;intage;structstu*next;}*linklist;structstu*creatlist(intn){inti;//h为头结点,p为前一结点,s为当前结点structstu*h,*p,*s;h=(structstu*)malloc(sizeof(structstu));h->next=NULL;p=h;for(i=0;i{s=(structstu*)malloc(sizeof(structstu));p->next=s;printf("Pleaseinputtheinformationofthestudent:namesexnoage\n");scanf("%s%c%d%d",s->name,&s->sex,&s->no,&s->age);s->next=NULL;p=s;}printf("Createsuccessful!");return(h);}voiddeletelist(structstu*s,inta){structstu*p;while(s->age!=a){p=s;s=s->next;}if(s==NULL)printf("Therecordisnotexist.");else{p->next=s->next;printf("Deletesuccessful!");}}voiddisplay(structstu*s){s=s->next;while(s!=NULL){printf("%s%c%d%d\n",s->name,s->sex,s->no,s->age);s=s->next;}}intmain(){structstu*s;intn,age;printf("Pleaseinputthelengthofseqlist:\n");scanf("%d",&n);s=creatlist(n);display(s);printf("Pleaseinputtheage:\n");scanf("%d",&age);deletelist(s,age);display(s);return0;}2、实现一个函数,把一个字符串中的字符从小写转为大写。#include"stdio.h"#include"conio.h"voiduppers(char*s,char*us){for(;*s!='\0';s++,us++){if(*s>='a'&&*s<='z')*us=*s-32;else*us=*s;}*us='\0';}intmain(){char*s,*us;charss[20];printf("Pleaseinputastring:\n");scanf("%s",ss);s=ss;uppers(s,us);printf("Theresultis:\n%s\n",us);getch();}随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数/***************************************************************1.函数名称:Symmetry功能:判断一个数时候为回文数(121,35653)输入:长整型的数输出:若为回文数返回值为1esle0******************************************************************/unsignedcharSymmetry(longn){longi,temp;i=n;temp=0;while(i)//不用出现长度问题,将数按高低位掉换{temp=temp*10+i%10;i/=10;}return(temp==n);}方法一/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字;4:待判断的字符串溢出----------------------------------------------------------------------------*/unsignedIsSymmetry(char*s){char*p=s;longnNumber=0;longn=0;longnTemp=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*将字符串转换为正整数*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;/*判断正整数是否溢出*/if((*p-\'0\')>(4294967295-(nNumber*10)))return4;nNumber=(*p-\'0\')+(nNumber*10);p++;}/*将数字逆序组合,直接抄楼上高手的代码,莫怪,呵呵*/n=nNumber;while(n){/*判断正整数是否溢出*/if((n%10)>(4294967295-(nTemp*10)))return3;nTemp=nTemp*10+n%10;n/=10;}/*比较逆序数和原序数是否相等*/if(nNumber!=nTemp)return3;return0;}方法二/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先得到字符串的长度,再依次比较字符串的对应位字符是否相同输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字----------------------------------------------------------------------------*/unsignedIsSymmetry_2(char*s){char*p=s;intnLen=0;inti=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*得到字符串长度*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;nLen++;p++;}/*长度不为奇数,不为回文数字*/if(nLen%2==0)return4;/*长度为1,即为回文数字*/if(nLen==1)return0;/*依次比较对应字符是否相同*/p=s;i=nLen/2-1;while(i){if(*(p+i)!=*(p+nLen-i-1))return3;i--;}return0;}求2~2000的所有素数.有足够的内存,要求尽量快答案:intfindvalue[2000]={2};staticintfind=1;booladjust(intvalue){assert(value>=2);if(value==2)returntrue;for(inti=0;i<=find;i++){if(value%findvalue[i]==0)returnfalse;}findvalue[find++];returntrue;}一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)1、有数组定义inta[2][2]={,{2,3}};则a[0][1]的值为0。()2、int(*ptr)(),则ptr是一维数组的名字。()3、指针在任何情况下都可进行>,<,>=,<=,==运算。()4、switch(c)语句中c可以是int,long,char,float,unsignedint类型。()5、#defineprint(x)printf("theno,"#x",is")二、填空题(共30分)1、在windows下,写出运行结果,每空2分,共10分。charstr[]="Hello";char*p=str;intn=10;sizeof(str)=()sizeof(p)=()sizeof(n)=()voidfunc(charstr[100]){}sizeof(str)=()2、voidsetmemory(char**p,intnum){*p=(char*)malloc(num);}voidtest(void){char*str=NULL;getmemory(&str,100);strcpy(str,"hello");printf(str);}运行test函数有什么结果?()10分3、设intarr[]={6,7,8,9,10};int*ptr=arr;*(ptr++)+=123;printf("%d,%d",*ptr,*(++ptr));()10分二、编程题(第一小题20,第二小题30分)1、不使用库函数,编写函数intstrcmp(char*source,char*dest)相等返回0,不等返回-1;2、写一函数intfun(char*p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1boolCircleInList(Link*pHead){if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环return(false);if(pHead->next==pHead)//自环return(true);Link*pTemp1=pHead;//step1Link*pTemp=pHead->next;//step2while(pTemp!=pTemp1&&pTemp!=NULL&&pTemp->next!=NULL){pTemp1=pTemp1->next;pTemp=pTemp->next->next;}if(pTemp==pTemp1)return(true);return(false);}两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串voidinsert(char*s,char*t,inti){memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);memcpy(&s[i],t,strlen(t));s[strlen(s)+strlen(t)]='\0';}1。编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。char*search(char*cpSource,charch){char*cpTemp=NULL,*cpDest=NULL;intiTemp,iCount=0;while(*cpSource){if(*cpSource==ch){iTemp=0;cpTemp=cpSource;while(*cpSource==ch)++iTemp,++cpSource;if(iTemp>iCount)iCount=iTemp,cpDest=cpTemp;if(!*cpSource)break;}++cpSource;}returncpDest;}2。请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char*cpSource,intn,charch){inti;for(i=0;i=ch;++i);returni;}一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。#includevoidfoo(intm,intn){printf("m=%d,n=%d\n",m,n);}intmain(){intb=3;foo(b+=3,++b);printf("b=%d\n",b);return0;}输出:m=7,n=4,b=7(VC6.0)这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。最后是看编译器优化。2.写一函数,实现删除字符串str1中含有的字符串str2.第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
上面这个程序一共要循环100*50*20次,效率实在是太低了
事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。
我的解法如下:
因为x+2y+5z=100
所以x+2y=100-5z,且z<=20x<=100y<=50
所以(x+2y)<=100,且(x+5z)是偶数
对z作循环,求x的可能值如下:
z=0,x=100,98,96,...0
z=1,x=95,93,...,1
z=2,x=90,88,...,0
z=3,x=85,83,...,1
z=4,x=80,78,...,0
......
z=19,x=5,3,1
z=20,x=0
因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,
即为:
(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1
某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2
某个奇数m以内的奇数个数也可以表示为(m+2)/2
所以,求总的组合次数可以编程为:
for(intm=0;m<=100;m+=5)
{
number+=(m+2)/2;
}
cout<这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多倍----只是因为作了一些简单的数学分析这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事——这不是一个专业的研发人员的行为。那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保证是正确的),那么说明优化的算法出了问题,需要修改。可以举例表示为:#ifdefDEBUGintsimple();#endifintoptimize();......inafunction:{result=optimize();ASSERT(result==simple());}这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程序的发布版本,却不会包含笨重的simple()函数。——任何大型工程软件都需要预先设计良好的调试手段,而这里提到的就是一种有用的方法。一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。#include"stdio.h"#include"conio.h"structstu{charname[20];charsex;intno;intage;structstu*next;}*linklist;structstu*creatlist(intn){inti;//h为头结点,p为前一结点,s为当前结点structstu*h,*p,*s;h=(structstu*)malloc(sizeof(structstu));h->next=NULL;p=h;for(i=0;i{s=(structstu*)malloc(sizeof(structstu));p->next=s;printf("Pleaseinputtheinformationofthestudent:namesexnoage\n");scanf("%s%c%d%d",s->name,&s->sex,&s->no,&s->age);s->next=NULL;p=s;}printf("Createsuccessful!");return(h);}voiddeletelist(structstu*s,inta){structstu*p;while(s->age!=a){p=s;s=s->next;}if(s==NULL)printf("Therecordisnotexist.");else{p->next=s->next;printf("Deletesuccessful!");}}voiddisplay(structstu*s){s=s->next;while(s!=NULL){printf("%s%c%d%d\n",s->name,s->sex,s->no,s->age);s=s->next;}}intmain(){structstu*s;intn,age;printf("Pleaseinputthelengthofseqlist:\n");scanf("%d",&n);s=creatlist(n);display(s);printf("Pleaseinputtheage:\n");scanf("%d",&age);deletelist(s,age);display(s);return0;}2、实现一个函数,把一个字符串中的字符从小写转为大写。#include"stdio.h"#include"conio.h"voiduppers(char*s,char*us){for(;*s!='\0';s++,us++){if(*s>='a'&&*s<='z')*us=*s-32;else*us=*s;}*us='\0';}intmain(){char*s,*us;charss[20];printf("Pleaseinputastring:\n");scanf("%s",ss);s=ss;uppers(s,us);printf("Theresultis:\n%s\n",us);getch();}随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数/***************************************************************1.函数名称:Symmetry功能:判断一个数时候为回文数(121,35653)输入:长整型的数输出:若为回文数返回值为1esle0******************************************************************/unsignedcharSymmetry(longn){longi,temp;i=n;temp=0;while(i)//不用出现长度问题,将数按高低位掉换{temp=temp*10+i%10;i/=10;}return(temp==n);}方法一/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字;4:待判断的字符串溢出----------------------------------------------------------------------------*/unsignedIsSymmetry(char*s){char*p=s;longnNumber=0;longn=0;longnTemp=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*将字符串转换为正整数*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;/*判断正整数是否溢出*/if((*p-\'0\')>(4294967295-(nNumber*10)))return4;nNumber=(*p-\'0\')+(nNumber*10);p++;}/*将数字逆序组合,直接抄楼上高手的代码,莫怪,呵呵*/n=nNumber;while(n){/*判断正整数是否溢出*/if((n%10)>(4294967295-(nTemp*10)))return3;nTemp=nTemp*10+n%10;n/=10;}/*比较逆序数和原序数是否相等*/if(nNumber!=nTemp)return3;return0;}方法二/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先得到字符串的长度,再依次比较字符串的对应位字符是否相同输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字----------------------------------------------------------------------------*/unsignedIsSymmetry_2(char*s){char*p=s;intnLen=0;inti=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*得到字符串长度*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;nLen++;p++;}/*长度不为奇数,不为回文数字*/if(nLen%2==0)return4;/*长度为1,即为回文数字*/if(nLen==1)return0;/*依次比较对应字符是否相同*/p=s;i=nLen/2-1;while(i){if(*(p+i)!=*(p+nLen-i-1))return3;i--;}return0;}求2~2000的所有素数.有足够的内存,要求尽量快答案:intfindvalue[2000]={2};staticintfind=1;booladjust(intvalue){assert(value>=2);if(value==2)returntrue;for(inti=0;i<=find;i++){if(value%findvalue[i]==0)returnfalse;}findvalue[find++];returntrue;}一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)1、有数组定义inta[2][2]={,{2,3}};则a[0][1]的值为0。()2、int(*ptr)(),则ptr是一维数组的名字。()3、指针在任何情况下都可进行>,<,>=,<=,==运算。()4、switch(c)语句中c可以是int,long,char,float,unsignedint类型。()5、#defineprint(x)printf("theno,"#x",is")二、填空题(共30分)1、在windows下,写出运行结果,每空2分,共10分。charstr[]="Hello";char*p=str;intn=10;sizeof(str)=()sizeof(p)=()sizeof(n)=()voidfunc(charstr[100]){}sizeof(str)=()2、voidsetmemory(char**p,intnum){*p=(char*)malloc(num);}voidtest(void){char*str=NULL;getmemory(&str,100);strcpy(str,"hello");printf(str);}运行test函数有什么结果?()10分3、设intarr[]={6,7,8,9,10};int*ptr=arr;*(ptr++)+=123;printf("%d,%d",*ptr,*(++ptr));()10分二、编程题(第一小题20,第二小题30分)1、不使用库函数,编写函数intstrcmp(char*source,char*dest)相等返回0,不等返回-1;2、写一函数intfun(char*p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1boolCircleInList(Link*pHead){if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环return(false);if(pHead->next==pHead)//自环return(true);Link*pTemp1=pHead;//step1Link*pTemp=pHead->next;//step2while(pTemp!=pTemp1&&pTemp!=NULL&&pTemp->next!=NULL){pTemp1=pTemp1->next;pTemp=pTemp->next->next;}if(pTemp==pTemp1)return(true);return(false);}两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串voidinsert(char*s,char*t,inti){memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);memcpy(&s[i],t,strlen(t));s[strlen(s)+strlen(t)]='\0';}1。编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。char*search(char*cpSource,charch){char*cpTemp=NULL,*cpDest=NULL;intiTemp,iCount=0;while(*cpSource){if(*cpSource==ch){iTemp=0;cpTemp=cpSource;while(*cpSource==ch)++iTemp,++cpSource;if(iTemp>iCount)iCount=iTemp,cpDest=cpTemp;if(!*cpSource)break;}++cpSource;}returncpDest;}2。请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char*cpSource,intn,charch){inti;for(i=0;i=ch;++i);returni;}一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。#includevoidfoo(intm,intn){printf("m=%d,n=%d\n",m,n);}intmain(){intb=3;foo(b+=3,++b);printf("b=%d\n",b);return0;}输出:m=7,n=4,b=7(VC6.0)这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。最后是看编译器优化。2.写一函数,实现删除字符串str1中含有的字符串str2.第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多
倍----只是因为作了一些简单的数学分析
这再一次证明了:
计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问
题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种
种限制条件下的最优算法。
而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了
事——这不是一个专业的研发人员的行为。
那么,那种最容易想到的算法就完全没有用吗?
不,这种算法正好可以用来验证新算法
的正确性,在调试阶段,这非常有用。
在很多大公司,例如微软,都采用了这种方法:
在调
试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用
容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保
证是正确的),那么说明优化的算法出了问题,需要修改。
可以举例表示为:
#ifdefDEBUG
intsimple();
#endif
intoptimize();
inafunction:
result=optimize();
ASSERT(result==simple());
这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。
同时,在程
序的发布版本,却不会包含笨重的simple()函数。
——任何大型工程软件都需要预先设计良
好的调试手段,而这里提到的就是一种有用的方法。
一个学生的信息是:
姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。
#include"stdio.h"
#include"conio.h"
structstu{
charname[20];
charsex;
intno;
intage;
structstu*next;
}*linklist;
structstu*creatlist(intn)
inti;
//h为头结点,p为前一结点,s为当前结点
structstu*h,*p,*s;
h=(structstu*)malloc(sizeof(structstu));
h->next=NULL;
p=h;
for(i=0;i{s=(structstu*)malloc(sizeof(structstu));p->next=s;printf("Pleaseinputtheinformationofthestudent:namesexnoage\n");scanf("%s%c%d%d",s->name,&s->sex,&s->no,&s->age);s->next=NULL;p=s;}printf("Createsuccessful!");return(h);}voiddeletelist(structstu*s,inta){structstu*p;while(s->age!=a){p=s;s=s->next;}if(s==NULL)printf("Therecordisnotexist.");else{p->next=s->next;printf("Deletesuccessful!");}}voiddisplay(structstu*s){s=s->next;while(s!=NULL){printf("%s%c%d%d\n",s->name,s->sex,s->no,s->age);s=s->next;}}intmain(){structstu*s;intn,age;printf("Pleaseinputthelengthofseqlist:\n");scanf("%d",&n);s=creatlist(n);display(s);printf("Pleaseinputtheage:\n");scanf("%d",&age);deletelist(s,age);display(s);return0;}2、实现一个函数,把一个字符串中的字符从小写转为大写。#include"stdio.h"#include"conio.h"voiduppers(char*s,char*us){for(;*s!='\0';s++,us++){if(*s>='a'&&*s<='z')*us=*s-32;else*us=*s;}*us='\0';}intmain(){char*s,*us;charss[20];printf("Pleaseinputastring:\n");scanf("%s",ss);s=ss;uppers(s,us);printf("Theresultis:\n%s\n",us);getch();}随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数/***************************************************************1.函数名称:Symmetry功能:判断一个数时候为回文数(121,35653)输入:长整型的数输出:若为回文数返回值为1esle0******************************************************************/unsignedcharSymmetry(longn){longi,temp;i=n;temp=0;while(i)//不用出现长度问题,将数按高低位掉换{temp=temp*10+i%10;i/=10;}return(temp==n);}方法一/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字;4:待判断的字符串溢出----------------------------------------------------------------------------*/unsignedIsSymmetry(char*s){char*p=s;longnNumber=0;longn=0;longnTemp=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*将字符串转换为正整数*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;/*判断正整数是否溢出*/if((*p-\'0\')>(4294967295-(nNumber*10)))return4;nNumber=(*p-\'0\')+(nNumber*10);p++;}/*将数字逆序组合,直接抄楼上高手的代码,莫怪,呵呵*/n=nNumber;while(n){/*判断正整数是否溢出*/if((n%10)>(4294967295-(nTemp*10)))return3;nTemp=nTemp*10+n%10;n/=10;}/*比较逆序数和原序数是否相等*/if(nNumber!=nTemp)return3;return0;}方法二/*---------------------------------------------------------------------------功能:判断字符串是否为回文数字实现:先得到字符串的长度,再依次比较字符串的对应位字符是否相同输入:char*s:待判断的字符串输出:无返回:0:正确;1:待判断的字符串为空;2:待判断的字符串不为数字;3:字符串不为回文数字----------------------------------------------------------------------------*/unsignedIsSymmetry_2(char*s){char*p=s;intnLen=0;inti=0;/*判断输入是否为空*/if(*s==\'\\0\')return1;/*得到字符串长度*/while(*p!=\'\\0\'){/*判断字符是否为数字*/if(*p<\'0\'||*p>\'9\')return2;nLen++;p++;}/*长度不为奇数,不为回文数字*/if(nLen%2==0)return4;/*长度为1,即为回文数字*/if(nLen==1)return0;/*依次比较对应字符是否相同*/p=s;i=nLen/2-1;while(i){if(*(p+i)!=*(p+nLen-i-1))return3;i--;}return0;}求2~2000的所有素数.有足够的内存,要求尽量快答案:intfindvalue[2000]={2};staticintfind=1;booladjust(intvalue){assert(value>=2);if(value==2)returntrue;for(inti=0;i<=find;i++){if(value%findvalue[i]==0)returnfalse;}findvalue[find++];returntrue;}一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)1、有数组定义inta[2][2]={,{2,3}};则a[0][1]的值为0。()2、int(*ptr)(),则ptr是一维数组的名字。()3、指针在任何情况下都可进行>,<,>=,<=,==运算。()4、switch(c)语句中c可以是int,long,char,float,unsignedint类型。()5、#defineprint(x)printf("theno,"#x",is")二、填空题(共30分)1、在windows下,写出运行结果,每空2分,共10分。charstr[]="Hello";char*p=str;intn=10;sizeof(str)=()sizeof(p)=()sizeof(n)=()voidfunc(charstr[100]){}sizeof(str)=()2、voidsetmemory(char**p,intnum){*p=(char*)malloc(num);}voidtest(void){char*str=NULL;getmemory(&str,100);strcpy(str,"hello");printf(str);}运行test函数有什么结果?()10分3、设intarr[]={6,7,8,9,10};int*ptr=arr;*(ptr++)+=123;printf("%d,%d",*ptr,*(++ptr));()10分二、编程题(第一小题20,第二小题30分)1、不使用库函数,编写函数intstrcmp(char*source,char*dest)相等返回0,不等返回-1;2、写一函数intfun(char*p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1boolCircleInList(Link*pHead){if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环return(false);if(pHead->next==pHead)//自环return(true);Link*pTemp1=pHead;//step1Link*pTemp=pHead->next;//step2while(pTemp!=pTemp1&&pTemp!=NULL&&pTemp->next!=NULL){pTemp1=pTemp1->next;pTemp=pTemp->next->next;}if(pTemp==pTemp1)return(true);return(false);}两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串voidinsert(char*s,char*t,inti){memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);memcpy(&s[i],t,strlen(t));s[strlen(s)+strlen(t)]='\0';}1。编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。char*search(char*cpSource,charch){char*cpTemp=NULL,*cpDest=NULL;intiTemp,iCount=0;while(*cpSource){if(*cpSource==ch){iTemp=0;cpTemp=cpSource;while(*cpSource==ch)++iTemp,++cpSource;if(iTemp>iCount)iCount=iTemp,cpDest=cpTemp;if(!*cpSource)break;}++cpSource;}returncpDest;}2。请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。intsearch(char*cpSource,intn,charch){inti;for(i=0;i=ch;++i);returni;}一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。#includevoidfoo(intm,intn){printf("m=%d,n=%d\n",m,n);}intmain(){intb=3;foo(b+=3,++b);printf("b=%d\n",b);return0;}输出:m=7,n=4,b=7(VC6.0)这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。最后是看编译器优化。2.写一函数,实现删除字符串str1中含有的字符串str2.第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
s=(structstu*)malloc(sizeof(structstu));
p->next=s;
printf("Pleaseinputtheinformationofthestudent:
namesexnoage\n");
scanf("%s%c%d%d",s->name,&s->sex,&s->no,&s->age);
s->next=NULL;
p=s;
printf("Createsuccessful!
");
return(h);
voiddeletelist(structstu*s,inta)
structstu*p;
while(s->age!
=a)
s=s->next;
if(s==NULL)
printf("Therecordisnotexist.");
else
p->next=s->next;
printf("Deletesuccessful!
voiddisplay(structstu*s)
while(s!
=NULL)
printf("%s%c%d%d\n",s->name,s->sex,s->no,s->age);
intmain()
structstu*s;
intn,age;
printf("Pleaseinputthelengthofseqlist:
\n");
scanf("%d",&n);
s=creatlist(n);
display(s);
printf("Pleaseinputtheage:
scanf("%d",&age);
deletelist(s,age);
return0;
2、实现一个函数,把一个字符串中的字符从小写转为大写。
voiduppers(char*s,char*us)
for(;*s!
='\0';s++,us++)
if(*s>='a'&&*s<='z')
*us=*s-32;
*us=*s;
*us='\0';
char*s,*us;
charss[20];
printf("Pleaseinputastring:
scanf("%s",ss);
s=ss;
uppers(s,us);
printf("Theresultis:
\n%s\n",us);
getch();
随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。
不能用字符串库函数
/***************************************************************
1.
函数名称:
Symmetry
功能:
判断一个数时候为回文数(121,35653)
输入:
长整型的数
输出:
若为回文数返回值为1esle0
******************************************************************/
unsignedcharSymmetry(longn)
longi,temp;
i=n;temp=0;
while(i)//不用出现长度问题,将数按高低位掉换
temp=temp*10+i%10;
i/=10;
return(temp==n);
方法一
/*---------------------------------------------------------------------------
判断字符串是否为回文数字
实现:
先将字符串转换为正整数,再将正整数逆序组合为新的正整数,两数相同则为回文数字
char*s:
待判断的字符串
无
返回:
0:
正确;1:
待判断的字符串为空;2:
待判断的字符串不为数字;
3:
字符串不为回文数字;4:
待判断的字符串溢出
----------------------------------------------------------------------------*/
unsignedIsSymmetry(char*s)
char*p=s;
longnNumber=0;
longn=0;
longnTemp=0;
/*判断输入是否为空*/
if(*s==\'\\0\')
return1;
/*将字符串转换为正整数*/
while(*p!
=\'\\0\')
/*判断字符是否为数字*/
if(*p<\'0\'||*p>\'9\')
return2;
/*判断正整数是否溢出*/
if((*p-\'0\')>(4294967295-(nNumber*10)))
return4;
nNumber=(*p-\'0\')+(nNumber*10);
p++;
/*将数字逆序组合,直接抄楼上高手的代码,莫怪,呵呵*/
n=nNumber;
while(n)
if((n%10)>(4294967295-(nTemp*10)))
return3;
nTemp=nTemp*10+n%10;
n/=10;
/*比较逆序数和原序数是否相等*/
if(nNumber!
=nTemp)
方法二
先得到字符串的长度,再依次比较字符串的对应位字符是否相同
字符串不为回文数字
unsignedIsSymmetry_2(char*s)
intnLen=0;
inti=0;
/*得到字符串长度*/
nLen++;
/*长度不为奇数,不为回文数字*/
if(nLen%2==0)
/*长度为1,即为回文数字*/
if(nLen==1)
/*依次比较对应字符是否相同*/
i=nLen/2-1;
while(i)
if(*(p+i)!
=*(p+nLen-i-1))
i--;
求2~2000的所有素数.有足够的内存,要求尽量快
intfindvalue[2000]={2};
staticintfind=1;
booladjust(intvalue)
assert(value>=2);
if(value==2)returntrue;
for(inti=0;i<=find;i++)
if(value%findvalue[i]==0)
returnfalse;
findvalue[find++];
returntrue;
一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)
1、有数组定义inta[2][2]={,{2,3}};则a[0][1]的值为0。
()
2、int(*ptr)(),则ptr是一维数组的名字。
3、指针在任何情况下都可进行>,<,>=,<=,==运算。
4、switch(c)语句中c可以是int,long,char,float,unsignedint类型。
5、#defineprint(x)printf("theno,"#x",is")
二、填空题(共30分)
1、在windows下,写出运行结果,每空2分,共10分。
charstr[]="Hello";
char*p=str;
intn=10;
sizeof(str)=()
sizeof(p)=()
sizeof(n)=()
voidfunc(charstr[100])
{}
2、voidsetmemory(char**p,intnum)
{*p=(char*)malloc(num);}
voidtest(void)
{char*str=NULL;
getmemory(&str,100);
strcpy(str,"hello");
printf(str);
运行test函数有什么结果?
()10分
3、设intarr[]={6,7,8,9,10};
int*ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
二、编程题(第一小题20,第二小题30分)
1、不使用库函数,编写函数intstrcmp(char*source,char*dest)
相等返回0,不等返回-1;
2、写一函数intfun(char*p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1
boolCircleInList(Link*pHead)
if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环
return(false);
if(pHead->next==pHead)//自环
return(true);
Link*pTemp1=pHead;//step1
Link*pTemp=pHead->next;//step2
while(pTemp!
=pTemp1&&pTemp!
=NULL&&pTemp->next!
pTemp1=pTemp1->next;
pTemp=pTemp->next->next;
if(pTemp==pTemp1)
两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串
voidinsert(char*s,char*t,inti)
memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);
memcpy(&s[i],t,strlen(t));
s[strlen(s)+strlen(t)]='\0';
1。
编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char*search(char*cpSource,charch)
char*cpTemp=NULL,*cpDest=NULL;
intiTemp,iCount=0;
while(*cpSource)
if(*cpSource==ch)
iTemp=0;
cpTemp=cpSource;
while(*cpSource==ch)
++iTemp,++cpSource;
if(iTemp>iCount)
iCount=iTemp,cpDest=cpTemp;
if(!
*cpSource)
break;
++cpSource;
returncpDest;
2。
请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
intsearch(char*cpSource,intn,charch)
for(i=0;i=ch;++i);returni;}一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。#includevoidfoo(intm,intn){printf("m=%d,n=%d\n",m,n);}intmain(){intb=3;foo(b+=3,++b);printf("b=%d\n",b);return0;}输出:m=7,n=4,b=7(VC6.0)这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。最后是看编译器优化。2.写一函数,实现删除字符串str1中含有的字符串str2.第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
=ch;++i);
returni;
一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。
#include
voidfoo(intm,intn)
printf("m=%d,n=%d\n",m,n);
intb=3;
foo(b+=3,++b);
printf("b=%d\n",b);
m=7,n=4,b=7(VC6.0)
这种方式和编译器中得函数调用关系相关即先后入栈顺序。
不过不同
编译器得处理不同。
也是因为C标准中对这种方式说明为未定义,所以
各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。
因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理
这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得
结果。
最后是看编译器优化。
2.写一函数,实现删除字符串str1中含有的字符串str2.
第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1