華為自己C語言總結_第1頁
華為自己C語言總結_第2頁
華為自己C語言總結_第3頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一,字符轉化為數字在 C/C+ 語言中沒有專門的字符串變量,通常用字符數組來存放字符串。字符串是以“0 ”作為結束符。 C/C+ 提供了豐富的字符串處理函數,下面列出了幾個最常用的函數。 字符串輸出函數 puts。 字符串輸出函數 gets。 字符串連接函數 strcat 。 字符串復制函數 strcpy 。 測字符串長度函數 strlen 。字符串是面試的重點考查部分的相關知識, 通過考查字符串的相關知識可以考察程序員的編 程規(guī)范以及編程習慣。并且其中包括了許多知識點,例如內存越界、指針與數組操作等。許 多公司在面試時會要求應聘者寫一段復制字符串或字符串子串操作的程序。 本章列舉了一些 與字

2、符串相關的面試題,有些題目要求較高的編程技巧。6.1 數字與字符串的轉化應聘時經常出現數字與字符串之間轉化的問題, 面試官通過這類題目來考察應聘者能力, 例 如是否熟悉常用的庫函數,是否了解 ASCII 碼以及是否了解字符串的存儲格式等。6.1.1 數字轉化為字符串面試例題 1:使用庫函數將數字轉換為字符串。考點: C 庫函數中數字轉換為字符串的使用。出現頻率:解析C 語言提供了幾個標準庫函數,可以將任意類型(整型、長整型、浮點型等 ) 的數字轉換為字符串,下面列舉了各函數的方法及其說明。 itoa() :將整型值轉換為字符串。 ltoa() :將長整型值轉換為字符串。 ultoa() :將無

3、符號長整型值轉換為字符串。 gcvt() :將浮點型數轉換為字符串,取四舍五入。 ecvt() :將雙精度浮點型值轉換為字符串,轉換結果中不包含十進制小數點。 fcvt() :指定位數為轉換精度,其余同ecvt() 。還可以使用 sprintf 系列函數把數字轉換成字符串,其比 itoa() 系列函數運行速度慢。下列程序演示了如何使用itoa()函數和gcvt()函數:1 # include <stdio.h>2 # include <stdlib.h>33 int main ()4 5 int num_int = 435;6 double num_double = 4

4、35.10f;7 char str_int30;8 char str_double30;109 itoa(num_int, str_int, 10);/把整數 num_int 轉成字符串 str_int10 gcvt(num_double, 8, str_double); / 把浮點數 num_double 轉成字符串 str_double1314printf("str_int: %sn", str_int);15printf("str_double: %sn", str_double);1617return 0;18 程序輸出結果:1 str_int:

5、 4352 str_double: 435.10001 代碼第 11 行中的參數 10 表示按十進制類型進行轉換,轉換后的結果是“435 ”,如果按二進制類型進行轉換,則結果為“ 1101110011”。 代碼第 12 行中的參數 8 表示精確位數,這里得到的結果是“ 435.10001”。 答案 可以使用 atoi 系列函數把數字轉換成字符串。面試例題 2:不使用庫函數將整數轉換為字符串。 考點:數字轉換為字符串,理解相關 ASCII 碼。出現頻率:解析如果不使用 atoi 或 sprintf 等庫函數,可以通過把整數的各位上的數字加“0”轉換成 char 類型并存到字符數組中。但是要注意,

6、需要采用字符串逆序的方法。如以下程序所示:1 #include <iostream>2 using namespace std;34 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 的絕對值1011if (str = NULL)1211 return;12 13 while(temp)14 15 bufi+ = (temp % 10) + '0' / 把 temp

7、 的每一位上的數存入 buf16 temp = temp / 10;17 2021 len = n < 0 ? +i: i; /如果 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 3738 int main()39 40 int nNum;41 ch

8、ar p10;4243 cout << "Please input an integer:"44 cin >> nNum;45 cout << "output: " ;46 int2str(nNum, p); /整型轉換成字符串47 cout<< p << endl;4849return 0;50 程序中的 int2str 函數完成了 int 類型到字符串類型的轉換。在代碼第 46 行對 int2str 函數做 了測試。程序的執(zhí)行結果如下所示:Please input an integer: 1

9、234Output: 1234 如果輸入的是個負數,程序執(zhí)行結果如下所示: Please input an integer: -1234Output: -1234接下來對 int2str 函數的實現進行分析。代碼第9行,把參數n的絕對值賦給temp,以后在計算各個位的整數時用temp,這樣保證在負數情況下取余不會出現問題。 代碼第11第14行判斷str的有效性,str不為NULL。代碼第15第19行的while循環(huán)中,將n的各個位存放到局部數組 buf中,存放的順 序與整數順序相反。例如 n 為整數 123 456, while 循環(huán)結束后 buf 應為“ 654 321 ”。代碼第21行計算

10、轉換后字符串的長度len,如果是負數,長度應該再加1。代碼第22第31行把數組buf中的非0元素逆向復制到參數str指向的內存中,如果n 是負數,則 str 指向的第一個內存存放負號。6.1.2 字符串轉化為數字 面試例題 3:使用庫函數將字符串轉換為數字。 考點: C 庫函數中字符串轉換為數字的使用。出現頻率:解析與上節(jié)數字轉換為字符串類似, C/C+ 語言提供了幾個標準庫函數,可以將字符串轉換為任 意類型 (整型、長整型、浮點型等 )。以下列舉了各函數的方法及其說明。 atof() :將字符串轉換為雙精度浮點型值。 atoi() :將字符串轉換為整型值。 atol() :將字符串轉換為長整

11、型值。 strtod() :將字符串轉換為雙精度浮點型值,并報告不能被轉換的所有剩余數字。 strtol() :將字符串轉換為長整值,并報告不能被轉換的所有剩余數字。 strtoul() :將字符串轉換為無符號長整型值,并報告不能被轉換的所有剩余數字。 以下程序演示如何使用 atoi ()函數和 atof ()函數。1 # include <stdio.h>2 # include <stdlib.h>34 int main ()5 6 int num_int;7 double num_double;8 char str_int30 = "435"/

12、將要被轉換為整型的字符串9 char str_double30 = "436.55"/ 將要被轉換為浮點型的字符串1011 num_int = atoi(str_int);/ 轉換為整型值12num_double = atof(str_double); /轉換為浮點型值1314printf("num_int: %dn", num_int);15printf("num_double: %lfn", num_double);1617return 0;18 輸出結果: num_int: 435 num_double: 436.550000

13、面試例題 4:不使用庫函數將字符串轉換為數字。 考點:字符串轉換為數字時,對相關 ASCII 碼的理解。出現頻率:解析 程序代碼如下:1 #include <iostream>2 using namespace std;34 int str2int(const char *str)5 6int temp = 0;7const char *ptr = str; /ptr 保存 str 字符串開頭89if (*str = '-' | *str ='+') / 如果第一個字符是正負號,10/則移到下一個字符11str+;1213while(*str !=

14、0)1415if (*str < '0') | (*str > '9') / 如果當前字符不是數字16/則退出循環(huán)17break;1819temp = temp *10 + (*str - '0'); / 如果當前字符是數字則計算數值20str+;/ 移到下一個字符2122if (*ptr = '-')/如果字符串是以“ -”開頭,則轉換成其相反數2324temp = -temp;252627return temp;282930int main()3132int n = 0;33char p10 = "&qu

15、ot;3435cin.getline(p, 20);/從終端獲取一個字符串36n = str2int(p);/把字符串轉換成整型數3738cout << n << endl;3940return 0;41程序執(zhí)行結果:輸入: 1234輸出: 1234輸入: -1234輸出: -1234輸入: +1234輸出: 1234程序中的str2int函數作用是將字符串轉換成整數。這個函數的轉換過程與例題2中的int2str函數相比更加簡單,它只需要做一次while循環(huán)(代碼第13行)就能把數值大小計算出來,如果結果是負數,就加一個負號。二. C語言sort函數C語言中沒有預置的

16、sort函數。如果在 C語言中,遇到有調用 sort函數,就是自定義的一 個函數,功能一般用于排序。一、 可以編寫自己的sort函數。如下函數為將整型數組從小到大排序。void sort(int *a, int l)/a為數組地址,I為數組長度。int i, j;in t v;/排序主體for(i = 0; i < l - 1; i +)for(j = i+1; j < l; j +)if(ai > aj)/如前面的比后面的大,則交換。v = ai;ai = aj;aj = v;對于這樣的自定義 sort函數,可以按照定義的規(guī)范來調用。二、C語言有自有的qsort函數。功能:

17、使用快速排序例程進行排序頭文件:stdlib.h原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *);參數:1待排序數組首地址2數組中待排序元素數量3各元素的占用空間大小4指向函數的指針,用于確定排序的順序這個函數必須要自己寫比較函數,即使要排序的元素是int,float 一類的C語言基礎類型。以下是qsort的一個例子:#in clude<stdio.h> #in clude<stdlib.h>in t comp(co nst void*a,co nst

18、 void*b)用來做比較的函數。return *(i nt*)a-*( in t*)b;int mai n()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+)輸出排序后的數組prin tf("%dt",arrayi);return 0;三. 判斷是整數還是小數#in clude <math.h> double x;if (floor(x)=x) puts(” 是一個整數"); else puts(&

19、quot;是一個小數");五,十進制轉二進制#in clude<stdio.h>#i nclude<stdlib.h>|#defi ne NUM 2#defi ne ZERO 0.000001整數部分的轉換void in teger(i nt n)if(n >0)in teger( n/NUM);prin tf("%d", n%NUM);小數部分的轉換void decimal(double m)if(m>ZERO)m=m*NUM;prin tf("%d",(lo ng)m);decimal(m-(lo ng)

20、m);int mai n()double f;long n;printf("請輸入一個10進制的小數:”); sca nf("%lf', &f);if(f<0)prin tf("-");f=-f;n=(long)f;整數部分printf("轉換成%d進制的小數為:",NUM);in teger( n);prin tf(".");decimal(f-n);小數部分的轉換 prin tf("n");system("pause"); _|return 0;四.

21、 一段有趣的代碼main ()char *a="12345.111111"double ad=0.0;int ai=0;int i;int j=0;for(i=0;i<strle n( a);i+)if(ai='.')prin tf("%fn",atof(a);j+;break;if(j=0)prin tf("%dn",atoi(a);六.一個數據結構#i nclude <stdio.h>#i nclude <stdlib.h>#defi ne OFFSET_LEN sizeof(Stac

22、kNode) typedef int ElemType;typedef struct StackNodeElemType data;struct StackNode *n ext;StackNode,*Li nkStackPtr;typedef structLi nkStackPtr top;int cou nt;Lin kStack;/構造空棧(OFFSET_LEN);intIni tialStack(Li nkStack *LS)LS->top=(Li nkStackPtr)mallocif (!LS->top) return 0;LS->top=NULL;LS->

23、cou nt=0;return 1;void prin t(ElemType e)printf ("%d" ,e);boollsEmptyStack(L in kStack LS)if (LS.count=O)returntrueelse return false ;int Pop(Li nkStack *LS,ElemType *e)Li nkStackPtr p;if (IsEmptyStack(*LS)return*e=LS->top->data;p=LS->top;LS->top=LS->top->n ext;free (p);L

24、S->cou nt-;return 1;int Push(Li nkStack *LS,ElemType e)Lin kStackPtr s=(L in kStackPtr)s->data=e;s->n ext=LS->top;LS->top=s;LS->cou nt+;return 1;int OuputStackE(Li nkStack s)Li nkStackPtr p;p=s.top;while (p)prin t(p->data);p=p->n ext;printf("n");return 1;/判斷棧是否為空/ 出

25、棧0;/ 進棧malloc (OFFSET_LEN);ItincLud <tdio_ti>KincLud? *'stack1 _h" void main()"剛剛寫好,役莉尋及測試,怕你下課擔課你時間。Linkstack Is;l»itialStack(&L£>"構造空棧int diu;£nt u-2;iftt b=9;/Z商int m-0;"余數PintF(-請任意輸入一個非負十進制勉正整數)沖; scanfrd" tdiv);tidiv/v;n-divv;/ 取余數uiab;&

26、quot;繼續(xù)令數PU5tl( &15, PI);"余數進棧Mtiile (to上建商不為U<b=diu/u;閘余數di片t>"纟矗辣令B為義陳數Push(ej.sTn);" 余數曲棧upntStackE(Ls>:2015.華為機試題第一題(60分):M串字符2,8 ,按要求分解字符串,輸入兩個數M , N ; M代表輸入的 串,N代表輸出的每串字符串的位數,不夠補 0。例如:輸入“ abc ”,“ 123456789 ” 則輸出為“abc00000 ” , “ 12345678“ , ” 90000000 ”cpp view pla i

27、n copy1. 轉載請標明岀處,原文地址:http: 2. #include<iostream>3. #include<cstdio>4. using namespace std;5.5. void solve( char *str , int n , int len)6. 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)1

28、3.14.if (len - i < n)15.16.k =n - len + i;17.for (j = i ; j < len ; +j)18.printf("%c" , strj);19.for (j = 0 ; j < k ; +j)20.putchar('O');21.22.else23.24.for (j = i ; j < i + n ; +j)25.printf("%c" , strj);26.27.putchar('');28.29.printf("n");30

29、. 31.32. int main(void )33. 34.int i,m , n , len;35.charstr1000;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. 第一題:拼音轉數字輸入是一個只包含拼音的字符串, 請輸出對應的數字序列。轉換關系如

30、下:jiu89描述:拼音yi er san si wu liu qi ba阿拉伯數字1234567輸入字符只包含小寫字母,所有字符都可以正好匹配運行時間限制:無限制內存限制:無限制輸入:一行字符串,長度小于1000輸出:一行字符(數字)串樣例輸入:yiersa nsi樣例輸出:1234cpp view pla in copy1. 轉載請標明岀處,原文地址:http:2.#include<iostream>3.#include<cstdio>4.using namespace std;5.6.voidsolve( char *str ,int len)7.8.int i;

31、9.10.for (i = 0 ; i < len ;)11.12.switch (stri)13.14.case 'y'15.putchar('1');16.i += 2;17.break ;18.case 'e':19.putchar('2');20.i += 2;21.break ;22.case 's'23.if (stri+ 1='a')24.25.putchar('3':);26.i += 3;27.28.else29.30.putchar('4':

32、);31.i += 2;32.33.break ;34.case 'w':35.putchar('5');36.i += 2;37.break ;38.case T39.putchar('6');40.i += 3;41.break ;42.case 'q':43.putchar('7');44.i += 2;45.break ;46.case 'b':47.putchar('8');48.i += 2;49.break ;50.case 'j':51.putchar

33、('9');52.i += 3;53.break ;54.55.56.printf("n");57. 58.59. int main( void )60. 61.int len;62.char str1OOO;63.64. while (scanf( "%s" , str) != EOF)65. 66. len = strlen(str);67. solve(str , len);68. 69. return 0;70. 第二題:去除重復字符并排序運行時間限制:無限制內容限制:無限制輸入:字符串輸出:去除重復字符并排序的字符串樣例輸入:a

34、abcdefff樣例輸出:abcdefcpp view pla in copy1.轉載請標明岀處,原文地址:http: 2. #include<iostream>3. #include<cstdio>4. #include<memory>5. using namespace std;6.6. void solve( char *str , int len)7. 8. int i , hash256;9. memset(hash , 0 ,sizeof (hash);11.10. for (i = 0 ; i < len ; +i)11. 12. if

35、(0 = hashstri)13. hashstri = 1;14. 15. for (i = 0 ; i < 256 ; +i)16. 17. if (0 != hashi)18. putchar(i);21. 22. printf( "n");23. 24.24. int main( void )25. 26. int len;27. char str1OOO;29.28. while (scanf("%s" , str) != EOF)29. 30. len = strlen(str);31. solve(str , len);32. 33. return 0;34. 第三題:等式變換輸入一個正整數X,在下面的等式左邊的數字之間添加+號或者-號,使得等式成立。1 2 3 4 5 6 7 8 9

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論