华为 自己C语言总结.docx
- 文档编号:26250744
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:26
- 大小:63.25KB
华为 自己C语言总结.docx
《华为 自己C语言总结.docx》由会员分享,可在线阅读,更多相关《华为 自己C语言总结.docx(26页珍藏版)》请在冰豆网上搜索。
华为自己C语言总结
一,字符转化为数字
在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串。
字符串是以“\0”作为结束符。
C/C++提供了丰富的字符串处理函数,下面列出了几个最常用的函数。
●字符串输出函数puts。
●字符串输出函数gets。
●字符串连接函数strcat。
●字符串复制函数strcpy。
●测字符串长度函数strlen。
字符串是面试的重点考查部分的相关知识,通过考查字符串的相关知识可以考察程序员的编程规范以及编程习惯。
并且其中包括了许多知识点,例如内存越界、指针与数组操作等。
许多公司在面试时会要求应聘者写一段复制字符串或字符串子串操作的程序。
本章列举了一些与字符串相关的面试题,有些题目要求较高的编程技巧。
6.1数字与字符串的转化
应聘时经常出现数字与字符串之间转化的问题,面试官通过这类题目来考察应聘者能力,例如是否熟悉常用的库函数,是否了解ASCII码以及是否了解字符串的存储格式等。
6.1.1数字转化为字符串
面试例题1:
使用库函数将数字转换为字符串。
考点:
C库函数中数字转换为字符串的使用。
出现频率:
★★★
解析
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。
●itoa():
将整型值转换为字符串。
●ltoa():
将长整型值转换为字符串。
●ultoa():
将无符号长整型值转换为字符串。
●gcvt():
将浮点型数转换为字符串,取四舍五入。
●ecvt():
将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
●fcvt():
指定位数为转换精度,其余同ecvt()。
还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢。
下列程序演示了如何使用itoa()函数和gcvt()函数:
1#include
2#include
3
4intmain()
5{
6intnum_int=435;
7doublenum_double=435.10f;
8charstr_int[30];
9charstr_double[30];
10
11itoa(num_int,str_int,10);//把整数num_int转成字符串str_int
12gcvt(num_double,8,str_double);//把浮点数num_double转成字符串str_double
13
14printf("str_int:
%s\n",str_int);
15printf("str_double:
%s\n",str_double);
16
17return0;
18}
程序输出结果:
1str_int:
435
2str_double:
435.10001
●代码第11行中的参数10表示按十进制类型进行转换,转换后的结果是“435”,如果按二进制类型进行转换,则结果为“1101110011”。
●代码第12行中的参数8表示精确位数,这里得到的结果是“435.10001”。
答案
可以使用atoi系列函数把数字转换成字符串。
面试例题2:
不使用库函数将整数转换为字符串。
考点:
数字转换为字符串,理解相关ASCII码。
出现频率:
★★★★
解析
如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加“0”转换成char类型并存到字符数组中。
但是要注意,需要采用字符串逆序的方法。
如以下程序所示:
1#include
2usingnamespacestd;
3
4voidint2str(intn,char*str)
5{
6charbuf[10]="";
7inti=0;
8intlen=0;
9inttemp=n<0?
-n:
n;//temp为n的绝对值
10
11if(str==NULL)
12{
13return;
14}
15while(temp)
16{
17buf[i++]=(temp%10)+'0';//把temp的每一位上的数存入buf
18temp=temp/10;
19}
20
21len=n<0?
++i:
i;//如果n是负数,则多需要一位来存储负号
22str[i]=0;//末尾是结束符0
23while
(1)
24{
25i--;
26if(buf[len-i-1]==0)
27{
28break;
29}
30str[i]=buf[len-i-1];//把buf数组里的字符拷到字符串
31}
32if(i==0)
33{
34str[i]='-';//如果是负数,添加一个负号
35}
36}
37
38intmain()
39{
40intnNum;
41charp[10];
42
43cout<<"Pleaseinputaninteger:
";
44cin>>nNum;
45cout<<"output:
";
46int2str(nNum,p);//整型转换成字符串
47cout<
48
49return0;
50}
程序中的int2str函数完成了int类型到字符串类型的转换。
在代码第46行对int2str函数做了测试。
程序的执行结果如下所示:
Pleaseinputaninteger:
1234
Output:
1234
如果输入的是个负数,程序执行结果如下所示:
Pleaseinputaninteger:
-1234
Output:
-1234
接下来对int2str函数的实现进行分析。
●代码第9行,把参数n的绝对值赋给temp,以后在计算各个位的整数时用temp,这样保证在负数情况下取余不会出现问题。
●代码第11~第14行判断str的有效性,str不为NULL。
●代码第15~第19行的while循环中,将n的各个位存放到局部数组buf中,存放的顺序与整数顺序相反。
例如n为整数123456,while循环结束后buf应为“654321”。
●代码第21行计算转换后字符串的长度len,如果是负数,长度应该再加1。
●代码第22~第31行把数组buf中的非0元素逆向复制到参数str指向的内存中,如果n是负数,则str指向的第一个内存存放负号。
6.1.2字符串转化为数字
面试例题3:
使用库函数将字符串转换为数字。
考点:
C库函数中字符串转换为数字的使用。
出现频率:
★★★★
解析
与上节数字转换为字符串类似,C/C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。
以下列举了各函数的方法及其说明。
●atof():
将字符串转换为双精度浮点型值。
●atoi():
将字符串转换为整型值。
●atol():
将字符串转换为长整型值。
●strtod():
将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。
●strtol():
将字符串转换为长整值,并报告不能被转换的所有剩余数字。
●strtoul():
将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。
以下程序演示如何使用atoi()函数和atof()函数。
1#include
2#include
3
4intmain()
5{
6intnum_int;
7doublenum_double;
8charstr_int[30]="435";//将要被转换为整型的字符串
9charstr_double[30]="436.55";//将要被转换为浮点型的字符串
10
11num_int=atoi(str_int);//转换为整型值
12num_double=atof(str_double);//转换为浮点型值
13
14printf("num_int:
%d\n",num_int);
15printf("num_double:
%lf\n",num_double);
16
17return0;
18}
输出结果:
num_int:
435
num_double:
436.550000
面试例题4:
不使用库函数将字符串转换为数字。
考点:
字符串转换为数字时,对相关ASCII码的理解。
出现频率:
★★★★
解析
程序代码如下:
1#include
2usingnamespacestd;
3
4intstr2int(constchar*str)
5{
6inttemp=0;
7constchar*ptr=str;//ptr保存str字符串开头
8
9if(*str=='-'||*str=='+')//如果第一个字符是正负号,
10{//则移到下一个字符
11str++;
12}
13while(*str!
=0)
14{
15if((*str<'0')||(*str>'9'))//如果当前字符不是数字
16{//则退出循环
17break;
18}
19temp=temp*10+(*str-'0');//如果当前字符是数字则计算数值
20str++;//移到下一个字符
21}
22if(*ptr=='-')//如果字符串是以“-”开头,则转换成其相反数
23{
24temp=-temp;
25}
26
27returntemp;
28}
29
30intmain()
31{
32intn=0;
33charp[10]="";
34
35cin.getline(p,20);//从终端获取一个字符串
36n=str2int(p);//把字符串转换成整型数
37
38cout< 39 40return0; 41} 程序执行结果: 输入: 1234 输出: 1234 输入: -1234 输出: -1234 输入: +1234 输出: 1234 程序中的str2int函数作用是将字符串转换成整数。 这个函数的转换过程与例题2中的int2str函数相比更加简单,它只需要做一次while循环(代码第13行)就能把数值大小计算出来,如果结果是负数,就加一个负号。 二.C语言sort函数 C语言中没有预置的sort函数。 如果在C语言中,遇到有调用sort函数,就是自定义的一个函数,功能一般用于排序。 一、可以编写自己的sort函数。 如下函数为将整型数组从小到大排序。 void sort(int *a, int l)//a为数组地址,l为数组长度。 { int i, j; int v; //排序主体 for(i = 0; i < l - 1; i ++) for(j = i+1; j < l; j ++) { if(a[i] > a[j])//如前面的比后面的大,则交换。 { v = a[i]; a[i] = a[j]; a[j] = v; } } } 对于这样的自定义sort函数,可以按照定义的规范来调用。 二、C语言有自有的qsort函数。 功能: 使用快速排序例程进行排序 头文件: stdlib.h 原型: voidqsort(void*base,intnelem,intwidth,int(*fcmp)(constvoid*,constvoid*)); 参数: 1待排序数组首地址 2数组中待排序元素数量 3各元素的占用空间大小 4指向函数的指针,用于确定排序的顺序 这个函数必须要自己写比较函数,即使要排序的元素是int,float一类的C语言基础类型。 以下是qsort的一个例子: #include #include int comp(const void*a,const void*b)//用来做比较的函数。 { return *(int*)a-*(int*)b; } int main() { int a[10] = {2,4,1,5,5,3,7,4,1,5};//乱序的数组。 int i; qsort(a,n,sizeof(int),comp);//调用qsort排序 for(i=0;i<10;i++)//输出排序后的数组 { printf("%d\t",array[i]); } return 0; } 三.判断是整数还是小数 #include doublex; if(floor(x)==x)puts("是一个整数"); elseputs("是一个小数"); 五,十进制转二进制 #include #include #defineNUM2 #defineZERO0.000001 //整数部分的转换 voidinteger(intn) { if(n>0) { integer(n/NUM); printf("%d",n%NUM); } } //小数部分的转换 voiddecimal(doublem) { if(m>ZERO) { m=m*NUM; printf("%d",(long)m); decimal(m-(long)m); } } intmain() { doublef; longn; printf("请输入一个10进制的小数: "); scanf("%lf",&f); if(f<0) { printf("-"); f=-f; } n=(long)f;//整数部分 printf("转换成%d进制的小数为: ",NUM); integer(n); printf("."); decimal(f-n);//小数部分的转换 printf("\n"); system("pause"); return0; } 4.一段有趣的代码 main() { char *a="12345.111111"; double ad=0.0; int ai=0; int i; int j=0; for(i=0;i { if(a[i]=='.') { printf("%f\n",atof(a)); j++; break; } } if(j==0) { printf("%d\n",atoi(a)); } } 6.一个数据结构 #include #include #define OFFSET_LEN sizeof(StackNode) typedef int ElemType; typedef struct StackNode { ElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; int InitialStack(LinkStack *LS){// 构造空栈 LS->top=(LinkStackPtr)malloc(OFFSET_LEN); if(! LS->top) return 0; LS->top=NULL; LS->count=0; return 1; } void print(ElemType e){ printf("%d",e); } bool IsEmptyStack(LinkStack LS){ // 判断栈是否为空 if(LS.count==0) return true; else return false; } int Pop(LinkStack *LS,ElemType *e){ // 出栈 LinkStackPtr p; if(IsEmptyStack(*LS)) return 0; *e=LS->top->data; p=LS->top; LS->top=LS->top->next; free(p); LS->count--; return 1; } int Push(LinkStack *LS,ElemType e){// 进栈 LinkStackPtr s=(LinkStackPtr)malloc(OFFSET_LEN); s->data=e; s->next=LS->top; LS->top=s; LS->count++; return 1; } int OuputStackE(LinkStack s){ LinkStackPtr p; p=s.top; while(p){ print(p->data); p=p->next; } printf("\n"); return 1; } 2015.华为机试题 第一题(60分): 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。 例如: 输入2,8,“abc”,“123456789”,则输出为“abc00000”,“12345678“,”90000000” [cpp] viewplaincopy 1.转载请标明出处,原文地址: 2.#include 3.#include 4.using namespace std; 5. 6.void solve(char *str , int n , int len) 7.{ 8. int i , j , k , quotient , remainder; 9. quotient = len / n; //原字符串被分解的个数 10. remainder = len - n * quotient; //剩余的字符串的个数 11. 12. for(i = 0 ; i < len ; i += n) 13. { 14. if(len - i < n) 15. { 16. k = n - len + i; 17. for(j = i ; j < len ; ++j) 18. printf("%c" , str[j]); 19. for(j = 0 ; j < k ; ++j) 20. putchar('0'); 21. } 22. else 23. { 24. for(j = i ; j < i + n ; ++j) 25. printf("%c" , str[j]); 26. } 27. putchar(' '); 28. } 29. printf("\n"); 30.} 31. 32.int main(void) 33.{ 34. int i , m , n , len; 35. char str[1000]; 36. 37. while(scanf("%d %d", &m , &n) ! = EOF) 38. { 39. for(i = 0 ; i < m ; ++i) 40. { 41. scanf("%s" , str); 42. len = strlen(str); 43. solve(str , n , len); 44. } 45. } 46. return 0; 47.} 第一题: 拼音转数字 输入是一个只包含拼音的字符串,请输出对应的数字序列。 转换关系如下: 描述: 拼音 yi er san si wu liu qi ba jiu 阿拉伯数字 1 2 3 4 5 6 7 8 9 输入字符只包含小写字母,所有字符都可以正好匹配 运行时间限制: 无限制 内存限制: 无限制 输入: 一行字符串,长度小于1000 输出: 一行字符(数字)串 样例输入: yiersansi 样例输出: 1234 [cpp] viewplaincopy 1.转载请标明出处,原文地址: 2.#include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 自己C语言总结 自己 语言 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)