软件工程师笔试编程题
1. 已知strcpy的函數(shù)原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不調(diào)用C++/C 的字符串庫函數(shù),請編寫函數(shù) strcpy。
char *strcpy(char *strDest, const char *strSrc) { if ( strDest == NULL || strSrc == NULL) return NULL ; if ( strDest == strSrc) return strDest ; char *tempptr = strDest ; while( (*strDest++ = *strSrc++) != ‘\0’); return tempptr ; }2.寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù) (microsoft)
const int MINNUMBER = -32767 ; int find_sec_max( int data[] , int count) { int maxnumber = data[0] ; int sec_max = MINNUMBER ; for ( int i = 1 ; i < count ; i++) { if ( data[i] > maxnumber ) { sec_max = maxnumber ; maxnumber = data[i] ; } else { if ( data[i] > sec_max ) sec_max = data[i] ; } } return sec_max ; }3.回文字符串—遞歸法
#include<stdio.h> #include<string.h> int main() { int i=0,n,k=0;char a[20],*p,*q;scanf("%s",a);n=strlen(a);p=a; q=p+n-1;while(i<(n/2+1)&&q>p)if(*p==*q) { k++;i++; p++; q--; } if(k==n/2) printf("Yes\n"); else printf("No\n");system("pause");return 0; }4.用指針判斷回文字符的程序
#include <stdio.h> #include <stdlib.h> #include <conio.h> #define MAX 50 int cycle(char *s) { char *h,*t; for(h=s,t=s+strlen(s)-1;t>h;h++,t--) if(*h!=*t) break; return t<=h; } main() { char s[MAX]; clrscr(); while(1) { puts("Please input the string you want to judge (input ^ to quit):"); scanf("%s",s); /*當(dāng)輸入的字符串的第一個字符是^時,退出*/ if(s[0]=='^') break; if(cycle(s)) printf(" %s is a cycle string.\n",s); else printf(" %s is not a cycle string.\n",s); } getch(); }判斷一個字符串是不是回文
int IsReverseStr(char *aStr) { int i,j; int found=1; if(aStr==NULL) return -1; j=strlen(aStr); for(i=0;i<j/2;i++) if(*(aStr+i)!=*(aStr+j-i-1)) { found=0;break; } return found; }b)請編寫一個 C 函數(shù),該函數(shù)將給定的一個字符串轉(zhuǎn)換成整數(shù)。
int Invert(char *str) { int num=0; while(*str!='\0') { int digital=*str-48; num=num*10+digital; str=str+1; } return num; }一個字符串中最大重復(fù)子串
#include <stdio.h> #include <string.h> void find(const char *str) { int len= (int)strlen(str); int x;int c;char *result = new char[len - 1] ; for (int i = len / 2 ; i >= 1 ; i--) { for ( x = 0 ; x < len - i ; x++) result[x] = (str[x + i] == str[x]) ; for ( x = 0, c = 0 ; x < len - i ; x++) { if (result[x]) c++ ; else c = 0 ; if (c == i) { for (int y = 0 ; y < i ; y++) printf("%c", str[x - i + y + 1]) ; delete[ ] result ; return ; } } } delete[ ] result ; printf("No match!") ; } void main( ) { find("ababc") ; }遞歸求階乘
#include <stdio.h> float fac(int n) {float f;if(n<0){ printf("n<0,data error!");return -1;}else if(n==0 ||n==1)f=1;else f=n*fac(n-1);return f; } main() { int n=10;float f;f=fac(n);printf("10!=%10.0f\n",f);}讓你在100000000個浮點數(shù)中找出最大的10000個,要求時間復(fù)雜度優(yōu)。
//本算法使用快排,O(n*lg(n)) //最低可以找到線性算法,使用預(yù)先區(qū)域統(tǒng)計劃分!類試于構(gòu)造Quad Trees! 寫起來代碼會長些! #include <stdio.h> #include <stdlib.h> #define Max 100000000 int a[Max+10]; int cmp( const void *a, const void *b) { int *x = ( int *) a; int *y = ( int *) b; return *x-*y; } int main() { int n=0; while (scanf("%d",&a[n])==1) n++; qsort(a,n,4,cmp); for ( int i=0;i<3;i++) printf("%d",a[ i ]); return 1; }請編寫一個 C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回該字符所在位置索引值。
int search(char *cpSource, int n, char ch) { int i; for(i=0; i<n && *(cpSource+i) != ch; ++i); return i; }3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。遞歸的方法,記錄當(dāng)前最大的,并且判斷當(dāng)前的是否比這個還大,大則繼續(xù),否則返回false結(jié)束:
bool fun( int a[], int n ) { if( n= =1 ) return true; if( n= =2 ) return a[n-1] >= a[n-2]; return fun( a,n-1) && ( a[n-1] >= a[n-2] ); }11.編寫my_memcpy函數(shù),實現(xiàn)與庫函數(shù)memcpy類似的功能,不能使用任何庫函數(shù);
void* mymemcpy(void* pvTo, const char* pvFrom, size_t size){ assert((dest != NULL) && (src != NULL));byte* psTo = (byte*)pvTo;byte* psFrom = (byte*)pvFrom;while (size-- > 0) {*psTo++ = *psFrom++;}return pvTo;}12.編寫my_strcpy函數(shù),實現(xiàn)與庫函數(shù)strcpy類似的功能,不能使用任何庫函數(shù);
答:char* my_strcpy(char* strdest, const char* strsrc){ assert((strdest != NULL) && (strsrc != NULL))char* address = strdest;while((*strdest++ = *strsrc++) != NULL)return address;}編寫一個 C 函數(shù),該函數(shù)在一個字符串中找到可能的最長的子字符串,且該字符串是由同一字符組成的。
char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, 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; } return cpDest; }1、用指針的方法,將字符串“ABCD1234efgh”前后對調(diào)顯示
#include <stdio.h> #include <string.h> #include <dos.h> int main() { char str[] = "ABCD1234efgh"; int length = strlen(str); char * p1 = str; char * p2 = str + length - 1; while(p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } printf("str now is %s\n",str); system("pause"); return 0; }3. 編程實現(xiàn):把十進(jìn)制數(shù)(long型)分別以二進(jìn)制和十六進(jìn)制形式輸出,不能使用printf系列庫函數(shù)
char* test3(long num) { char* buffer = (char*)malloc(11); buffer[0] = '0'; buffer[1] = 'x'; buffer[10] = '\0';char* temp = buffer + 2; for (int i=0; i < 8; i++) { temp[i] = (char)(num<<4*i>>28); temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16; temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55; } return buffer; }12.文件中有一組整數(shù),要求排序后輸出到另一個文件中 答案:
void Order(vector<int> &data) //起泡排序 { int count = data.size() ; int tag = false ; for ( int i = 0 ; i < count ; i++) { for ( int j = 0 ; j < count - i - 1 ; j++) { if ( data[j] > data[j+1]) { tag = true ; int temp = data[j] ; data[j] = data[j+1] ; data[j+1] = temp ; } } if ( !tag ) break ; } } void main( void ) { vector<int>data; ifstream in("c:\\data.txt"); if ( !in) { cout<<"file error!"; exit(1); } int temp; while (!in.eof()) { in>>temp; data.push_back(temp); } in.close(); Order(data); ofstream out("c:\\result.txt"); if ( !out) { cout<<"file error!"; exit(1); } for ( i = 0 ; i < data.size() ; i++) out<<data[i]<<" "; out.close(); }.用遞歸方式,非遞歸方式寫函數(shù)將一個字符串反轉(zhuǎn)
非遞歸方式:
char *reverse(char *str) {int len = strlen(str); char temp;for(int i=0; i<len/2; i++){temp = *(str+i);*(str+i) = *(str+len-1-i);*(str+len-1-i) = temp;}return str; }遞歸方式:
 函數(shù)原型:char *reverse(char *str);
 實現(xiàn):
2. 編程實現(xiàn):找出兩個字符串中最大公共子字符串,如"abccade",“dgcadde"的最大子串為"cad”
int GetCommon(char *s1, char *s2, char **r1, char **r2) { int len1 = strlen(s1); int len2 = strlen(s2); int maxlen = 0; for(int i = 0; i < len1; i++) {for(int j = 0; j < len2; j++){if(s1[i] == s2[j]){int as = i, bs = j, count = 1;while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])count++;if(count > maxlen){maxlen = count;*r1 = s1 + i;*r2 = s2 + j;}}} }11.寫一個函數(shù)比較兩個字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1
int strcmp ( const char * src,const char * dst) { int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) { ++src; ++dst; } if ( ret < 0 ) ret = -1 ; else if ( ret > 0 ) ret = 1 ; return( ret ); }給定字符串A和B,輸出A和B中的最大公共子串。
比如A=“aocdfe” B=“pmcdfa” 則輸出"cdf"
 */
輸出結(jié)果為:
int main(void) { char a[30];char *b = (char *)malloc(20 * sizeof(char));printf("%d\n", sizeof(a));printf("%d\n", sizeof(b));printf("%d\n", sizeof(a[3]));printf("%d\n", sizeof(b+3));printf("%d\n", sizeof(*(b+4)));return 0 ; }30 4 1 4 1
求1000!的未尾有幾個0(用素數(shù)相乘的方法來做,如72=22233);
求出1->1000里,能被5整除的數(shù)的個數(shù)n1,能被25整除的數(shù)的個數(shù)n2,能被125整除的數(shù)的個數(shù)n3,
 能被625整除的數(shù)的個數(shù)n4.
 1000!末尾的零的個數(shù)=n1+n2+n3+n4;
d)請編寫一個 C 函數(shù),該函數(shù)將一個字符串逆序。
#include <string.h> #include <stdio.h> void exchange(char *str) { char tmp; int len, i, j; len = strlen(str); for(i = 0, j = len-1; i != len/2; i++, j--) { tmp = str[i]; str[i] = str[j]; str[j] = tmp; } return; } main() { char str[100]; scanf("%s", str); exchange(str); printf("%s\n", str); return; }e)請編寫一個 C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回該字符所在位置索引值。
int search(char *cpSource, int n, char ch) //起始地址,搜索長度,目標(biāo)字符 { int i; for(i=0; i<n && *(cpSource+i) != ch; ++i); return i; }f)請編寫一個 C 函數(shù),該函數(shù)在一個字符串中找到可能的最長的子字符串,該字符串是由同一字符組成的。
int ChildString(char*p) //自己寫{ Char *q=p; int stringlen=0, i=0,j=1,len=0,maxlen=1; while(*q!=’\0’) //不能用strlen,求得長度stringlen {Stringlen++; q++; }while( i< Stringlen ) { if(*(p+i)==*(p+j)&&j< Stringlen) { len++; //統(tǒng)計子串長度i++;j++; } else { if(len>maxlen) //統(tǒng)計最大子串長度{ maxlen=len+1; len=0;} else {len=0;} i++;j++;} } return maxlen; }用宏定義寫出swap(x,y)
#define SWAP(A,B) {A=AB;B=AB;A=A^B;}//注意是{}不是()
 #define swap(a,b) a=a+b;b=a-b;a=a-b
4、字符串函數(shù)
(1).strcpy
char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) printf"Invalid arguments"; char * strDestCopy=strDest; while (*strSrc!='"0') *strDest++=*strSrc++; return strDestCopy; }(2).strlen
int strlen(const char* src) { if (src==NULL) printf"Invalid arguments"; int len = 0;while(*src++ != '"0')len++;return len; }(3).遞歸實現(xiàn)字符反轉(zhuǎn)函數(shù)reverse
#include<iostream> #include<string> void reverse(char *str, int len) { if(len==1) return;else{ char temp;temp=*str;*str=*(str+len);*(str+len)=temp;reverse((str+1),(len-2));return;} }(4).實現(xiàn)英語單詞反轉(zhuǎn)函數(shù)
int main() { string strIn; strIn="I am a student"; int end; end=strlen(strIn)-1; for(int i=strIn.length()-1;i>=0;i--) { if(strIn[i]==' ') { for(int j=i+1;j<=end;j++) cout<<strIn[j]; cout<<' '; end=i-1; }(5).實現(xiàn)strstr(): 找出字符串sub在字符串src的什么位置,如"34"在"12345"的3位置。
char *strstr(char *str,char *sub_str) { int i=0,j=0;while(str[i]!='"0'){ if(str[i]==sub_str[j]) {break;}else { i++; }}if(sub_str[i]!='"0')return (char *)(str+i);else return NULL;}3)寫出在母串中查找子串出現(xiàn)次數(shù)的代碼.
int count1(char* str,char* s) { char* s1;char* s2;int count = 0;while(*str!='\0'){ s1 = str;s2 = s;while(*s2 == *s1&&(*s2!='\0')&&(*s1!='0')){ s2++;s1++;}if(*s2 == '\0')count++;str++;}return count; }4)寫出快速排序或者某種排序算法代碼
 快速排序:
冒泡排序:
void buble(int *a,int n) {for(int i=0;i<n;i++){for(int j=1;j<n-i;j++){if(a[j]<a[j-1]){int temp=a[j];a[j] = a[j-1];a[j-1] = temp;}}} }插入排序:
void insertsort(int* a,int n) {int key;for(int j=1;j<n;j++){key = a[j];for(int i=j-1;i>=0&&a[i]>key;i--){a[i+1] = a[i];}a[i+1] = key;} }1.什么是中斷?中斷發(fā)生時CPU做什么工作?
所謂中斷是指系統(tǒng)發(fā)生某一事件后,CPU暫停正在執(zhí)行的程序轉(zhuǎn)去執(zhí)行處理該事件的程序過程,處理中斷事件的程序稱為中斷處理程序,產(chǎn)生中斷信號的那個部件稱為中斷源。硬件的中斷機(jī)構(gòu)與處理這些中斷的程序統(tǒng)稱為中斷系統(tǒng)。
 當(dāng)中斷發(fā)生時,硬件機(jī)構(gòu)自動地進(jìn)入響應(yīng)中斷過程,由操作系統(tǒng)的中斷處理程序?qū)χ袛嗍录M(jìn)行處理,具體過程如下:
 ①?保存現(xiàn)場
 系統(tǒng)開辟現(xiàn)場區(qū),并將現(xiàn)場區(qū)組織成"棧"結(jié)構(gòu),當(dāng)中斷響應(yīng)時,(1)硬件結(jié)構(gòu)自動將PS和PC寄存器的內(nèi)容壓人棧中作為現(xiàn)場信息保存起來。(2)根據(jù)發(fā)生的中斷,硬件從指定的中斷向量單元中取出PS和PC內(nèi)容,分別裝人PS和PC寄存器,同時正確填人路寄存器的"當(dāng)前狀態(tài)"和"先前狀態(tài)"字段。
 ②?分析原因,轉(zhuǎn)中斷處理程序
 不同原因產(chǎn)生的中斷事件要進(jìn)行不同的處理,根據(jù)中斷的路寄存器內(nèi)容得出發(fā)生該種中斷的具體原因。轉(zhuǎn)人相對應(yīng)的申斷處理程序運(yùn)行。
 ③?恢復(fù)現(xiàn)場
 在多級中斷系統(tǒng)中,考慮退回當(dāng)前中斷時,必須依據(jù)原先被中斷的程序,完成不同的工作,中斷處理結(jié)柬后,軟件必須退出中斷。如果此次是高級中斷,并且被中斷的程序是一個低級中斷處理程序,則此次中斷應(yīng)返回到該低級中斷處理程序。如果原來被中斷的是用戶程序,則退出中斷前應(yīng)先考慮進(jìn)行一次調(diào)度選擇,以挑選出更適合在當(dāng)前情況下運(yùn)行的新程序。
2.CPU在上電后,進(jìn)入操作系統(tǒng)的main()之前必須做什么工作?
整個系統(tǒng)對開發(fā)環(huán)境以及各種變量的初始化,包括了變量空間的分配,cpu內(nèi)部寄存器的初始化,總線的初始化等等,總之,只有等系統(tǒng)初始化完成以后,我們的c語言的main才能被識別和執(zhí)行下來
char *p;
char *q[20];
char *m[20][20];
int (*n)[10];
struct MyStruct{
char dda;
double dda1;
int type ;
};
MyStruct k;
printf("%d %d %d %d",sizeof§,sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:4,80,1600,4,24 n是指向一維數(shù)組的指針變量;k中不要忘了考慮對齊問題,這里dda為4個字節(jié)。
1. 進(jìn)程和線程的區(qū)別
主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個線程死掉就等于整個進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時,耗費(fèi)資源較大,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。 ①進(jìn)程:一個程序?qū)σ粋€數(shù)據(jù)集的動態(tài)執(zhí)行過程,是分配資源的基本單位。 線程:一個進(jìn)程內(nèi)的基本調(diào)度單位。 ②進(jìn)程:擁有獨(dú)立的內(nèi)存單元,而多線程共享內(nèi)存,從而提高了應(yīng)用程序的運(yùn)行效率。 線程:每一個獨(dú)立的線程,都有一個程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口,但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制③多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但是操作系統(tǒng)并沒有將多個線程看作多個獨(dú)立的應(yīng)用來實現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。
2.解釋局部變量、全局變量和靜態(tài)變量的含義。
局部變量包括函數(shù)的形參,包含在函數(shù)體或者語句塊內(nèi)的變量,局部變量的生存期在退出函數(shù)或語句塊后結(jié)束。
 全局變量是指在所有函數(shù)和語句塊之外的變量,它對于整個程序均可見,全局變量的生存期與程序的生存期相同.
 靜態(tài)變量指由關(guān)鍵字static聲明的變量,它的作用域和其他變量一樣,由它所在的位置決定,如在函數(shù)體或語句塊中聲明,則只在函數(shù)體或語句塊可見,其他地方均不可見.它的生存期與程序相同.
3.Windows程序的入口是哪里?寫出Windows消息機(jī)制的流程。
Windows程序的入口是WinMain函數(shù).消息機(jī)制:系統(tǒng)將會維護(hù)一個或多個消息隊列,所有產(chǎn)生的消息都會被放入或是插入隊列中。系統(tǒng)會在隊列中取出每一條消息,根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。每一個運(yùn)行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過程。而在沒有消息時消息循環(huán)就將控制權(quán)交給系統(tǒng)。
6.C++里面如何聲明const void f(void)函數(shù)為C程序中的庫函數(shù)?
在該函數(shù)前添加extern “C”聲明
 extern修飾符可用于指示C或者C++函數(shù)的調(diào)用規(guī)范。比如在C++中調(diào)用C庫函數(shù),就需要在C++程序中用extern “C”聲明要引用的函數(shù)(只有C++才有extern “C”的用法,在C中這樣用會報錯)。這是給鏈接器用的,告訴鏈接器在鏈接的時候用C函數(shù)規(guī)范來鏈接。主要原因是C++和C程序編譯完成后在目標(biāo)代碼中命名規(guī)則不同。
7.下列哪兩個是等同的
int b;
   A const int* a = &b;
   B const* int a = &b;
   C const int* const a = &b;
   D int const* const a = &b;
 各式表示的意思分別為:
 A const int* a = &b; //a是const,但指針a可變
 B const int a = &b; //a是const,但a可變
 C const int const a = &b; //a和a都是const,常量和指針的值都不能改變
 D int const const a = &b; //a和*a都是const,常量和指針的值都不能改變
 因此C,D兩者是相同的。
 總結(jié)個技巧:如果const位于星號的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞?#xff0c;即指針指向為常量;如果const位于星號的右側(cè),const就是修飾指針本身,即指針本身是常量。
下述三個有什么區(qū)別?
 char * const p;
 char const * p
 const char *p
 char * const p; //常量指針,p的值不可以修改
 char const * p;//指向常量的指針,指向的常量值不可以改
 const char *p; //同char const *p
1.請問以下代碼有什么問題:
int main()
 { char a;
 char *str=&a;
 strcpy(str,“hello”);
 printf(str);
 return 0;
 }
 沒有為str分配內(nèi)存空間,將會發(fā)生異常。問題出在將一個字符串復(fù)制進(jìn)一個字符變量指針?biāo)傅刂贰km然可以正確輸出結(jié)果,但因為越界進(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。
int (*s[10])(int) 表示的是什么
 int (*s[10])(int) 函數(shù)指針數(shù)組,每個指針指向一個int func(int param)的函數(shù)。
1:(void )ptr 和 ((void**))ptr的結(jié)果是否相同?其中ptr為同一個指針.(void )ptr 和 ((void**))ptr值是相同的
char* s=“AAA”;
 printf("%s",s);
 s[0]=‘B’;
 printf("%s",s);
 有什么錯?
 "AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。
 cosnt char* s=“AAA”;然后又因為是常量,所以對是s[0]的賦值操作是不合法的。
2,已知一個數(shù)組table,用一個宏定義,求出數(shù)據(jù)的元素個數(shù)
#define NTBL
 #define NTBL (sizeof(table)/sizeof(table[0]))
1、找錯
Void test1() { char string[10]; char* str1="0123456789"; strcpy(string, str1);// 溢出,應(yīng)該包括一個存放'\0'的字符string[11] }Void test2() { char string[10], str1[10]; for(I=0; I<10;I++) { str1[i] ='a'; } strcpy(string, str1);// I,i沒有聲明。 }Void test3(char* str1) { char string[10]; if(strlen(str1)<=10)// 改成<10,字符溢出,將strlen改為sizeof也可以 { strcpy(string, str1); } }2.
void g(int**); int main() { int line[10],i; int *p=line; //p是地址的地址 for (i=0;i<10;i++) { *p=i; g(&p);//數(shù)組對應(yīng)的值加1 } for(i=0;i<10;i++) printf("%d\n",line[i]); return 0; }void g(int**p) { (**p)++; (*p)++;// 無效 }輸出:1 2 3 4 5 6 7 8 9 10
3. 寫出程序運(yùn)行結(jié)果
int sum(int a) { auto int c=0;static int b=3;c+=1;b+=2;return(a+b+c); } void main() { int I;int a=2;for(I=0;I<5;I++){printf("%d,", sum(a));} }// 考察static會保存上次結(jié)果輸出:8,10,12,14,16,
4.
int func(int a) { int b;switch(a){case 1: 30;case 2: 20;case 3: 16;default: 0}return b; }則func(1)=?
 // b定義后就沒有賦值。
5:
int a[3]; a[0]=0; a[1]=1; a[2]=2; int *p, *q; p=a; q=&a[2];則a[q-p]=a[2]=2
 解釋:指針一次移動一個int但計數(shù)為1
試題8:請說出static和const關(guān)鍵字盡可能多的作用
解答:
   static關(guān)鍵字至少有下列n個作用:
   (1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值;
   (2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問;
   (3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明它的模塊內(nèi);
   (4)在類中的static成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
   (5)在類中的static成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收this指針,因而只能訪問類的static成員變量。
   const關(guān)鍵字至少有下列n個作用:
   (1)欲阻止一個變量被改變,可以使用const關(guān)鍵字。在定義該const變量時,通常需要對它進(jìn)行初始化,因為以后就沒有機(jī)會再去改變它了;
   (2)對指針來說,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時指定為const;
  (3)在一個函數(shù)聲明中const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
14.函數(shù)assert的用法?
答:斷言assert是僅在debug版本起作用的宏,用于檢查“不應(yīng)該“發(fā)生的情況。程序員可以把a(bǔ)ssert看成一個在任何系統(tǒng)狀態(tài)下都可以安全使用的無害測試手段。assert()宏是用于保證滿足某個特定條件,用法是:assert(表達(dá)式); 如果表達(dá)式的值為假,整個程序?qū)⑼顺?#xff0c;并輸出一條錯誤信息。如果表達(dá)式的值為真則繼續(xù)執(zhí)行后面的語句。使用這個宏前需要包含頭文件assert.h
15.為什么在頭文件的最前面都會看到這樣的代碼:
#ifndef STDIO_H
 #define STDIO_H
 頭文件中的#ifndef一般格式是這樣的#ifndef <標(biāo)識> ,#define <標(biāo)識>;<標(biāo)識>在理論上來說可以是自由命名的,但每個頭文件的這個“標(biāo)識”都應(yīng)該是唯一的。標(biāo)識的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h
 #ifndef STDIO_H
 #define STDIO_H
16.為什么數(shù)組名作為參數(shù),會改變數(shù)組的內(nèi)容,而其它類型如int卻不會改變變量的值?
答:當(dāng)數(shù)組名作為參數(shù)時,傳遞的實際上是地址。而其他類型如int作為參數(shù)時,由于函數(shù)參數(shù)值實質(zhì)上是實參的一份拷貝,被調(diào)函數(shù)內(nèi)部對形參的改變并不影響實參的值。
7)實現(xiàn)strcmp函數(shù)
int strcmp11(char* l,char* r) { assert(l!=0&&r!=0);while(*l == *r &&*l != '\0') l++,r++;if(*l > *r)return 1;else if(*l == *r)return 0;return -1; }//實現(xiàn)字符串翻轉(zhuǎn)
void reserve(char* str) { assert(str != NULL);char * p1 = str;char * p2 = str-1;while(*++p2); //一般要求不能使用strlenp2 -= 1;while(p1<p2){ char c = *p1;*p1++ = *p2;*p2-- = c;} }10)將一個數(shù)字字符串轉(zhuǎn)換為數(shù)字.“1234” -->1234
int atoii(char* s) { assert(s!=NULL);int num = 0;int temp;while(*s>'0' && *s<'9'){ num *= 10;num += *s-'0';s++;}return num; }11)實現(xiàn)任意長度的整數(shù)相加或者相乘功能。
void bigadd(char* num,char* str,int len) { for(int i=len;i>0;i--){ num[i] += str[i];int j = i;while(num[j]>=10){ num[j--] -= 10;num[j] += 1;}} }12)寫函數(shù)完成內(nèi)存的拷貝
void* memcpy( void *dst, const void *src, unsigned int len ) { register char *d;register char *s;if (len == 0)return dst;if ( dst > src ) //考慮覆蓋情況{d = (char *)dst + len - 1;s = (char *)src + len - 1;while ( len >= 4 ) //循環(huán)展開,提高執(zhí)行效率{*d-- = *s--;*d-- = *s--;*d-- = *s--;*d-- = *s--;len -= 4;}while ( len-- ) {*d-- = *s--;}} else if ( dst < src ) {d = (char *)dst;s = (char *)src;while ( len >= 4 ){*d++ = *s++;*d++ = *s++;*d++ = *s++;*d++ = *s++;len -= 4;}while ( len-- ){*d++ = *s++;}}return dst; }21、用指針的方法,將字符串“ABCD1234efgh”前后對調(diào)顯示
char str123[] = "ABCD1234efgh";char * p1 = str123;char * p2 = str123-1;while(*++p2);p2 -= 1;while(p1<p2){char c = *p1;*p1++ = *p2;*p2-- = c; }總結(jié)
以上是生活随笔為你收集整理的软件工程师笔试编程题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 什么是 LOW-CODE ?
- 下一篇: Hi3520d uboot uImage
