华为 自己C语言总结_第1页
华为 自己C语言总结_第2页
华为 自己C语言总结_第3页
华为 自己C语言总结_第4页
华为 自己C语言总结_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一,字符转化为数字在C/C+语言中没有专门的字符串变量,通常用字符数组来存放字符串。字符串是以“0”作为结束符。C/C+提供了丰富的字符串处理函数,下面列出了几个最常用的函数。 字符串输出函数puts。 字符串输出函数gets。 字符串连接函数strcat。 字符串复制函数strcpy。 测字符串长度函数strlen。字符串是面试的重点考查部分的相关知识,通过考查字符串的相关知识可以考察程序员的编程规范以及编程习惯。并且其中包括了许多知识点,例如内存越界、指针与数组操作等。许多公司在面试时会要求应聘者写一段复制字符串或字符串子串操作的程序。本章列举了一些与字符串相关的面试题,有些题目要求较高的

2、编程技巧。6.1 数字与字符串的转化应聘时经常出现数字与字符串之间转化的问题,面试官通过这类题目来考察应聘者能力,例如是否熟悉常用的库函数,是否了解ASCII码以及是否了解字符串的存储格式等。6.1.1 数字转化为字符串面试例题1:使用库函数将数字转换为字符串。考点:C库函数中数字转换为字符串的使用。出现频率:解析C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。 itoa():将整型值转换为字符串。 ltoa():将长整型值转换为字符串。 ultoa():将无符号长整型值转换为字符串。 gcvt():将浮点型数转换为字符串

3、,取四舍五入。 ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 fcvt():指定位数为转换精度,其余同ecvt()。还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢。下列程序演示了如何使用itoa()函数和gcvt()函数:1 # include <stdio.h>2 # include <stdlib.h>3 4 int main ()5 6 int num_int = 435;7 double num_double = 435.10f;8 char str_int30;9 char str_doub

4、le30;10 11 itoa(num_int, str_int, 10); /把整数num_int转成字符串str_int12 gcvt(num_double, 8, str_double); /把浮点数num_double转成字符串str_double13 14 printf("str_int: %sn", str_int);15 printf("str_double: %sn", str_double);16 17 return 0;18 程序输出结果:1 str_int: 4352 str_double: 435.10001 代码第11行中的参数

5、10表示按十进制类型进行转换,转换后的结果是“435”,如果按二进制类型进行转换,则结果为“1101110011”。 代码第12行中的参数8表示精确位数,这里得到的结果是“435.10001”。答案可以使用atoi系列函数把数字转换成字符串。面试例题2:不使用库函数将整数转换为字符串。考点:数字转换为字符串,理解相关ASCII码。出现频率:解析如果不使用atoi或sprintf等库函数,可以通过把整数的各位上的数字加“0”转换成char类型并存到字符数组中。但是要注意,需要采用字符串逆序的方法。如以下程序所示:1 #include <iostream>2 using namespa

6、ce std;3 4 void int2str(int n, char *str)5 6 char buf10 = ""7 int i = 0;8 int len = 0;9 int temp = n < 0 ? -n: n; / temp为n的绝对值10 11 if (str = NULL)12 13 return;14 15 while(temp)16 17 bufi+ = (temp % 10) + '0' /把temp的每一位上的数存入buf18 temp = temp / 10;19 20 21 len = n < 0 ? +i: i;

7、 /如果n是负数,则多需要一位来存储负号22 stri = 0; /末尾是结束符023 while(1)24 25 i-;26 if (buflen-i-1 =0)27 28 break;29 30 stri = buflen-i-1; /把buf数组里的字符拷到字符串31 32 if (i = 0 )33 34 stri = '-' /如果是负数,添加一个负号35 36 37 38 int main()39 40 int nNum;41 char p10;42 43 cout << "Please input an integer:"44 ci

8、n >> nNum;45 cout << "output: " ;46 int2str(nNum, p); /整型转换成字符串47 cout<< p << endl;48 49 return 0;50 程序中的int2str函数完成了int类型到字符串类型的转换。在代码第46行对int2str函数做了测试。程序的执行结果如下所示:Please input an integer: 1234Output: 1234如果输入的是个负数,程序执行结果如下所示:Please input an integer: -1234Output:

9、-1234接下来对int2str函数的实现进行分析。 代码第9行,把参数n的绝对值赋给temp,以后在计算各个位的整数时用temp,这样保证在负数情况下取余不会出现问题。 代码第11第14行判断str的有效性,str不为NULL。 代码第15第19行的while循环中,将n的各个位存放到局部数组buf中,存放的顺序与整数顺序相反。例如n为整数123 456,while循环结束后buf应为“654 321”。 代码第21行计算转换后字符串的长度len,如果是负数,长度应该再加1。 代码第22第31行把数组buf中的非0元素逆向复制到参数str指向的内存中,如果n是负数,则str指向的第一个内存存

10、放负号。6.1.2 字符串转化为数字面试例题3:使用库函数将字符串转换为数字。考点:C库函数中字符串转换为数字的使用。出现频率:解析与上节数字转换为字符串类似,C/C+语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。以下列举了各函数的方法及其说明。 atof():将字符串转换为双精度浮点型值。 atoi():将字符串转换为整型值。 atol():将字符串转换为长整型值。 strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。 strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 strtoul():将字符串转换为无符

11、号长整型值,并报告不能被转换的所有剩余数字。以下程序演示如何使用atoi ()函数和atof ()函数。1 # include <stdio.h>2 # include <stdlib.h>3 4 int main ()5 6 int num_int;7 double num_double;8 char str_int30 = "435" /将要被转换为整型的字符串9 char str_double30 = "436.55" /将要被转换为浮点型的字符串10 11 num_int = atoi(str_int); /转换为整型值1

12、2 num_double = atof(str_double); /转换为浮点型值13 14 printf("num_int: %dn", num_int);15 printf("num_double: %lfn", num_double);16 17 return 0;18 输出结果:num_int: 435num_double: 436.550000面试例题4:不使用库函数将字符串转换为数字。考点:字符串转换为数字时,对相关ASCII码的理解。出现频率:解析程序代码如下:1 #include <iostream>2 using names

13、pace std;3 4 int str2int(const char *str)5 6 int temp = 0;7 const char *ptr = str; /ptr保存str字符串开头8 9 if (*str = '-' | *str = '+') /如果第一个字符是正负号,10 /则移到下一个字符11 str+;12 13 while(*str != 0)14 15 if (*str < '0') | (*str > '9') /如果当前字符不是数字16 /则退出循环17 break;18 19 temp

14、= temp * 10 + (*str - '0'); /如果当前字符是数字则计算数值20 str+; /移到下一个字符21 22 if (*ptr = '-') /如果字符串是以“-”开头,则转换成其相反数23 24 temp = -temp;25 26 27 return temp;28 29 30 int main()31 32 int n = 0; 33 char p10 = ""34 35 cin.getline(p, 20); /从终端获取一个字符串36 n = str2int(p); /把字符串转换成整型数37 38 cout

15、<< n << endl;39 40 return 0;41 程序执行结果:输入:1234输出:1234输入:-1234输出:-1234输入:+1234输出:1234程序中的str2int函数作用是将字符串转换成整数。这个函数的转换过程与例题2中的int2str函数相比更加简单,它只需要做一次while循环(代码第13行)就能把数值大小计算出来,如果结果是负数,就加一个负号。二C语言sort函数C语言中没有预置的sort函数。如果在C语言中,遇到有调用sort函数,就是自定义的一个函数,功能一般用于排序。一、可以编写自己的sort函数。如下函数为将整型数组从小到大排序。

16、void sort(int *a, int l)/a为数组地址,l为数组长度。    int i, j;    int v;    /排序主体    for(i = 0; i < l - 1; i +)      

17、  for(j = i+1; j < l; j +)                    if(ai > aj)/如前面的比后面的大,则交换。           &

18、#160;                v = ai;                ai = aj;           &#

19、160;    aj = v;                    对于这样的自定义sort函数,可以按照定义的规范来调用。二、C语言有自有的qsort函数。功 能: 使用快速排序例程进行排序头文件:stdlib.h原型: void qsort(void *base,int nelem,int width,int (*fcmp)(con

20、st void *,const void *);参数:1 待排序数组首地址2 数组中待排序元素数量3 各元素的占用空间大小4 指向函数的指针,用于确定排序的顺序这个函数必须要自己写比较函数,即使要排序的元素是int,float一类的C语言基础类型。以下是qsort的一个例子:#include<stdio.h>#include<stdlib.h>int comp(const void*a,const void*b)/用来做比较的函数。    return *(int*)a-*(int*)b;i

21、nt main()    int a10 = 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+)/输出排序后的数组          &

22、#160; printf("%dt",arrayi);        return 0;三判断是整数还是小数#include <math.h>double x;if (floor(x)=x) puts("是一个整数");else puts("是一个小数");五,十进制转二进制#include<stdio.h>#include<stdlib.h>#define NUM 2#define ZERO 0.0

23、00001/整数部分的转换 void integer(int n)if(n>0)integer(n/NUM);printf("%d",n%NUM);/小数部分的转换 void decimal(double m)if(m>ZERO)m=m*NUM;printf("%d",(long)m);decimal(m-(long)m);int main()double f;long n;printf("请输入一个10进制的小数:");scanf("%lf",&f);if(f<0)printf(&quo

24、t;-");f=-f;n=(long)f;/整数部分 printf("转换成%d进制的小数为:",NUM);integer(n);printf(".");decimal(f-n);/小数部分的转换 printf("n");system("pause"); return 0;4 一段有趣的代码main()    char *a="12345.111111"    double ad=0.0

25、;    int    ai=0;    int i;    int j=0;        for(i=0;i<strlen(a);i+)           if(ai='.')  &

26、#160;              printf("%fn",atof(a);          j+;          break;        

27、60;           if(j=0)              printf("%dn",atoi(a);    6 一个数据结构#include <stdio.h>#include <stdlib.h>#define  

28、;OFFSET_LEN sizeof(StackNode)typedef int ElemType; typedef struct StackNode    ElemType data;    struct StackNode *next;StackNode,*LinkStackPtr; typedef struct    LinkStackPtr top;

29、  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 

30、;1;void print(ElemType e)    printf("%d",e);bool IsEmptyStack(LinkStack LS) / 判断栈是否为空       if(LS.count=0) return true;      else return false;int Pop

31、(LinkStack *LS,ElemType *e) / 出栈    LinkStackPtr p;    if(IsEmptyStack(*LS) return 0;    *e=LS->top->data;    p=LS->top;    LS->top=LS->top->next;&

32、#160;   free(p);    LS->count-;    return 1;int Push(LinkStack *LS,ElemType e)/ 进栈     LinkStackPtr s=(LinkStackPtr)malloc(OFFSET_LEN);     s->data=e; 

33、60;   s->next=LS->top;     LS->top=s;     LS->count+;     return 1;int OuputStackE(LinkStack s)    LinkStackPtr p;    p=s.top;  

34、  while(p)        print(p->data);        p=p->next;        printf("n");    return 1;2015. 华为机试题第一题(60分):      

35、0;按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”cpp view plaincopy1. 转载请标明出处,原文地址:2. #include<iostream>  3. #include<cstdio>  4. using namespace std;  5.   6. void&

36、#160;solve(char *str , int n , int len)  7.   8.     int i , j , k , quotient , remainder;  9.     quotient = len / n;  

37、              /原字符串被分解的个数  10.     remainder = len - n * quotient;    /剩余的字符串的个数  11.   12.     for(i =&#

38、160;0  i < len  i += n)  13.       14.         if(len - i < n)  15.           16.   

39、           k = n - len + i;  17.              for(j = i  j < len  +j)  18.   

40、               printf("%c" , strj);  19.              for(j = 0  j < k  +j)  

41、20.                  putchar('0');  21.           22.         else  23.     &

42、#160;     24.             for(j = i  j < i + n  +j)  25.                 

43、;printf("%c" , strj);  26.           27.         putchar(' ');  28.       29.     printf("n");

44、60; 30.   31.   32. int main(void)  33.   34.     int i , m , n , len;  35.     char str1000;  36.   37.     while(scanf

45、("%d %d", &m , &n) != EOF)  38.       39.         for(i = 0  i < m  +i)  40.        

46、   41.             scanf("%s" , str);  42.             len = strlen(str);  43.       

47、      solve(str , n , len);  44.           45.       46.     return 0;  47.   第一题:拼音转数字输入是一个只包含拼音的字符串,请输出对应的数字序列。转换

48、关系如下:描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu      阿拉伯数字        1   2   3      4   5    6    7   8   9输入字符只包含小写字母,

49、所有字符都可以正好匹配运行时间限制:无限制内存限制:       无限制输入:              一行字符串,长度小于1000输出:              一行字符(数字)串样例输入:       yiersansi样例输出:       1234cpp view plaincopy1. 转载请标明出处,原文地址:2. #include<i

50、ostream>  3. #include<cstdio>  4. using namespace std;  5.   6. void solve(char *str , int len)  7.   8.     int i;  9.   10.     f

51、or(i = 0  i < len  )  11.       12.         switch(stri)  13.           14.        

52、; case 'y':  15.             putchar('1');  16.             i += 2;  17.        

53、;     break;  18.         case 'e':  19.             putchar('2');  20.         

54、0;   i += 2;  21.             break;  22.         case 's':  23.            &

55、#160;if(stri + 1 = 'a')  24.               25.                 putchar('3');  26.   

56、              i += 3;  27.               28.             else  29. 

57、60;             30.                 putchar('4');  31.              

58、0;  i += 2;  32.               33.             break;  34.         case 'w':&

59、#160; 35.             putchar('5');  36.             i += 2;  37.             

60、;break;  38.         case 'l':  39.             putchar('6');  40.             i +=&

61、#160;3;  41.             break;  42.         case 'q':  43.             putchar('7');

62、0; 44.             i += 2;  45.             break;  46.         case 'b':  47. 

63、60;           putchar('8');  48.             i += 2;  49.             break;  

64、;50.         case 'j':  51.             putchar('9');  52.             i += 3;  

65、;53.             break;  54.           55.       56.     printf("n");  57.   58.   59. int

66、 main(void)  60.   61.     int len;  62.     char str1000;  63.   64.     while(scanf("%s" , str) != EOF)  65.     

67、  66.         len = strlen(str);  67.         solve(str , len);  68.       69.     return 0;  70.  &

68、#160;第二题:去除重复字符并排序运行时间限制:无限制内容限制:       无限制输入:              字符串输出:              去除重复字符并排序的字符串样例输入:       aabcdefff样例输出:       abcdefcpp view plaincopy1. 转载请标明出处,原文地址:2. #include<

69、;iostream>  3. #include<cstdio>  4. #include<memory>  5. using namespace std;  6.   7. void solve(char *str , int len)  8.   9.     int i , hash2

70、56;  10.     memset(hash , 0 , sizeof(hash);  11.   12.     for(i = 0  i < len  +i)  13.       14.     

71、0;   if(0 = hashstri)  15.             hashstri = 1;  16.       17.     for(i = 0  i < 256  

72、+i)  18.       19.         if(0 != hashi)  20.             putchar(i);  21.       22.   &#

73、160; printf("n");  23.   24.   25. int main(void)  26.   27.     int len;  28.     char str1000;  29.   30.     while(scanf("

74、%s" , str) != EOF)  31.       32.         len = strlen(str);  33.         solve(str , len);  34.    

75、   35.     return 0;  36.   第三题:等式变换输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。1 2 3 4 5 6 7 8 9 = X比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = 5请编写程序,统计满足输入整数的所有整数个数。输入:       正整数,等式右边的数字输出:       使该等式成立的个数样例输入:5样例输出:21

76、cpp view plaincopy1. 转载请标明出处,原文地址:2. #include<iostream>  3. #include<cstdio>  4. using namespace std;  5.   6. int ops21;  7. const char sym3 = '+' , '-' , '&

77、#160;'  8. int result , num;  9.   10. void dfs(int layer, int currentResult, int lastOp, int lastSum)  11.   12.     lastSum *= (layer > 9) ?&

78、#160;100 : 10;  13.     lastSum += layer;  14.     if(layer = 9)  15.       16.         currentResult += (lastOp) ?

79、 (-1 * lastSum) : lastSum;  17.         if(currentResult = result)  18.           19.             +num; 

温馨提示

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

评论

0/150

提交评论