經(jīng)典c語(yǔ)言筆試題和面試題答案(一)

思而思學(xué)網(wǎng)

編程區(qū):《《《《冒泡排序,二分查找,篩選法,的考察》》》》

100、

有兩個(gè)磁盤(pán)文件A和B,各存放一行字母,要求把這兩個(gè)文件中的信息合并(按字母順序排列),輸出到一個(gè)新文件C中.

#include

#include

int main(int argc,char argv[])

{

FILE fp;

int i,j,k,num,NUM;

char c[50],t,ch;

if((fp=fopen("A","r"))==NULL)

/can be replaced by open

int fd=open("A",O_RDONLY|O_CREAT);/

{

printf("fileA cannot be opened\n");

exit(0);

}

printf("\nA contents are:\n");

for(i=0;(ch=fgetc(fp))!=EOF;i++)/一個(gè)字符一個(gè)字符讀/

{

c[i]=ch;

putchar(c[i]);

}

num=i+1;

fclose(fp);

if((fp=fopen("B","r"))==NULL)

{

printf("fileB cannot be opened\n");

exit(0);

}

printf("\nB contents are :\n");

for(i=0;(ch=fgetc(fp))!=EOF;i++)

{

c[num+i]=ch;

putchar(c[num+i]);

}

fclose(fp);

NUM=num+i+1;

for(k=0;k

{

for(j=0;j

{

if(c[j]>c[j+1])

{

t=c[j];

c[j]=c[j+1];

c[j+1]=t;

}

}

}

printf("\nC fileis:\n");

fp=fopen("C","w");

for(i=0;i

{

putc(c[i],fp);/將字符一個(gè)個(gè)寫(xiě)入文件中/

putchar(c[i]);/一個(gè)個(gè)輸出字符/

}

fclose(fp);

return 1;

}

86.有一浮點(diǎn)型數(shù)組A,用C語(yǔ)言寫(xiě)一函數(shù)實(shí)現(xiàn)對(duì)浮點(diǎn)數(shù)組A進(jìn)行降序排序,并輸出結(jié)果,要求要以數(shù)組A作為函數(shù)的入口.(建議用冒泡排序法)

#include

#include

void BubbleSort(int arr[], int n)

{

int i,j;

int exchange = 1;//交換標(biāo)志,提高算法效率;

int temp;

for(i=0;i

{

exchange=0;//本趟排序開(kāi)始前,交換標(biāo)志應(yīng)為假

for(j=0;j

{

if(arr[j+1] > arr[j])

{

temp=arr[j+1];

arr[j+1]=arr[j];

arr[j]=temp;

exchange=1; //發(fā)生了交換,故將交換標(biāo)志置為真

}

}

if(!exchange) //本趟排序未發(fā)生交換,提前終止算法

return;

}

}

int main(int argc,char argv[])

{

int arr[5]={1,4,2,6,5};

int i;

BubbleSort(arr, 5);

printf("after sort,arr is :\n");

for(i=0;i<5;i++)

{

printf("%3d",arr[i]);

}

return 1;

}

77.寫(xiě)出二分查找的代碼:

Int binary_search(int arr,int key,int size)

{

Intmid;

Intlow=0;

Int high=size-1;

While(low<=high)

{

Mid=(low+high)/2;

If(arr[mid]>key)

High=mid-1;

ElseIf(arr[mid]

Low=mid+1;

Else

Return mid;

}

Return -1;

}

補(bǔ)充1:用帥選法查找100之內(nèi)的質(zhì)數(shù)

#include

using namespace std;

#define N 100

int main()

{

/0~100共101個(gè)數(shù)/

int sieve[N + 1];

int i;

//step 1:初始化(sieve[i] = 0 表示不在篩中,即不是質(zhì)數(shù);1表示在篩中)

sieve[0]=sieve[1]=0;

for(int i = 2; i <= N; i++)

{

sieve[i] = 1;

}

//step 2:偶數(shù)(2的倍數(shù))肯定不是質(zhì)數(shù),所以應(yīng)該先篩除

for(i = 2; i <= N / 2; i++)

{

sieve[i 2] = 0;

}

int p = 2; //第一個(gè)質(zhì)數(shù)是2

//step 3:從sieve中刪去P的倍數(shù)

while(p p <= N)

{

p = p + 1; //選下一個(gè)p

while(sieve[p] == 0)

{

p++;

}

int t = p p;

int s = 2 p;/質(zhì)數(shù)與質(zhì)數(shù)之和包含合數(shù),但質(zhì)數(shù)于合數(shù)之和必為質(zhì)數(shù),提高算法效率/

while(t <= N)

{

sieve[t] = 0; //刪除

t = t + s;

}

}

//step 4: 輸出結(jié)果

for(i = 2; i <= N; i++)

{

if(sieve[i] != 0)

{

cout<

內(nèi)存復(fù)制:

void memcpy(void pvTo, constvoid pvFrom, size_tsize)

{

assert((pvTo!= NULL) &&(pvFrom!= NULL));

byte pbTo= pvTo;

byte pbFrom= pbFrom;

while (size--> 0)

{

pbTo++ = pbFrom++;

}

return pvTo;

}

注意:內(nèi)存拷貝時(shí)要避免內(nèi)存空間重疊的問(wèn)題,(即pvfrom與pvto所指向的內(nèi)存不能重疊)

為了防止內(nèi)存空間重疊,若是目標(biāo)地址高于源地址,從后往前復(fù)制;

若是源地址高于目標(biāo)地址,從前往后復(fù)制;

《《《《查找字符串中的子串》》》》

84、請(qǐng)編寫(xiě)一個(gè)C 函數(shù),該函數(shù)在一個(gè)字符串中找到可能的最長(zhǎng)的子字符串,該字符串是由同一字符組成的。

#include

#include

#include

int ChildString(charp)

{

char q=p;

int stringlen=0, i=0,j=1,len=0,maxlen=1;

//stringlen=strlen(p);

while(q!='\0') //不能用strlen,求得長(zhǎng)stringlen

{

stringlen++;

q++;

}

while( i< stringlen)

{

if((p+i)==(p+j)&&j< stringlen)

{

len++; //統(tǒng)計(jì)子串長(zhǎng)度

i++;

j++;

}

else

{

if(len>=maxlen) //統(tǒng)計(jì)最大子串長(zhǎng)度

{

maxlen=len+1;

len=0;

}

else

len=0;

i++;

j++;

}

}

return maxlen;

}

int main(int argc,char argv[])

{

char arr[11];

int len;

printf("please input chararr(10):\n");

scanf("%s",arr);

len=ChildString(arr);

printf("the len of childarr is:%d\n",len);

return 1;

}

99. 計(jì)算字符串中子串出現(xiàn)的次數(shù)

方法1;

int main(int argc,char argv[])

{

char str1[20],str2[20],p1,p2;

int sum=0;

printf("pleaseinput two strings\n");

scanf("%s%s",str1,str2);

p1=str1;

p2=str2;

while(p1!='\0')

{

if(p1==p2)

{

while((p1++==p2++) && p2!='\0'); /不斷比較字符串1與2,至字符串2到達(dá)‘\0’/

}

else

p1++; /如果,字符串2一次匹配已結(jié)束,或者 此刻p1與p2不等;/

if(p2=='\0') /如果是字符串2結(jié)束,則成功找到一次,sum++/

sum++;

p2=str2; /p2始終指向str2;/

}

printf("%d",sum);

return 1;

}

方法2:

#include

#include

#include

//判斷兩字符串是否相等,相等返回1,不等返回0

int Judge(char movePt,char tempPt)

#if 1

{

int ret=0 ;

while( !(movePt-tempPt) && tempPt)

{

movePt++;

tempPt++;

}

if(tempPt=='\0')

{

ret=1;

}

return ret;

}

#endif

#if 0

{

int i;

for(i=0; i

{

if(movePt != tempPt[i])

return 0;

return 1;

}

}

#endif

//計(jì)算子串出現(xiàn)的次數(shù),str為原字符串,sub為子串

int StrCount(char str,char sub)

{

int count = 0;

char move = str;

if( strlen(str) < strlen(sub) )

{

return 0;

}

else

{

while( strlen(move) >= strlen(sub) )

{

printf("%s\n",move);

if(Judge(move,sub))

{

count++;

printf("count++");

}

move++;

}

}

return count;

}

int main(int argc,char argv[])

{

char arr1[20];

char arr2[20];

int num;

printf("please input two arrs:");

scanf("%s%s",arr1,arr2);

num=StrCount(arr1,arr2);

printf("the num is :%d\n",num);

return 1;

}

90、輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞。

int main(int argc,char argv[])

{

char string[81];

int i,num=0;//word=0;

char c;

gets(string); /不能用scanf,視空格為終結(jié)/

for(i=0;(c=string[i])!='\0';i++)

{

if(c==' ')

num++;

}

num++;

printf("Thereare %d words in theline\n",num);

return 1;

}

83、請(qǐng)編寫(xiě)一個(gè)C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回該字符所在位置索引值。

intsearch(char cpSource, int n, char ch) //起始地址,搜索長(zhǎng)度,目標(biāo)字符

{

int i;

for(i=0; i

return i;

}

《《《《數(shù)字問(wèn)題,水仙花數(shù),/和%的用法》》》》

98某個(gè)公司采用公用電話傳遞數(shù)據(jù),數(shù)據(jù)是四位的整數(shù),在傳遞過(guò)程中是加密的,加密規(guī)則如下:每位數(shù)字都加上5,然后用和除以10的余數(shù)代替該數(shù)字,再將第一位和第四位交換,第二位和第三位交換。

#include

#include

int main(int argc,char argv[])

{

int a,i,aa[4],t;

scanf("%d",&a);

aa[0]=a%10;

aa[1]=a%100/10;

aa[2]=a%1000/100;

aa[3]=a/1000;

for(i=0;i<=3;i++)

{

aa[i]+=5;

aa[i]%=10;

}

for(i=0;i<=3/2;i++)

{

t=aa[i];

aa[i]=aa[3-i];

aa[3-i]=t;

}

for(i=3;i>=0;i--)

printf("%d",aa[i]);

return 1;

}

97、809??=800??+9??+1其中??代表的兩位數(shù),8??的結(jié)果為兩位數(shù),9??的結(jié)果為3位數(shù)。求??代表的兩位數(shù),及809??后的結(jié)果。

output(longb,long i)

{

printf("\n%ld/%ld=809%ld+%ld",b,i,i,b%i);

}

int main()

{

long int a,b,i;

a=809;

for(i=10;i<100;i++)

{

b=ia+1;

if(b>=1000&&b<=10000&&8i<100&&9i>=100)

output(b,i);

}

}

92、有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)?都是多少?

#include "stdio.h"

Int main()

{

inti,j,k;

printf("\n");

for(i=1;i<5;i++) /以下為三重循環(huán)/

for(j=1;j<5;j++)

for (k=1;k<5;k++)

{

if (i!=k&&i!=j&&j!=k) /確保i、j、k三位互不相同/

printf("%d,%d,%d\n",i,j,k);

}

}

水仙花束問(wèn)題:

#include

int main()

{

int i;

int num=0;

for(i=100;i<=999;i++)

{

int H,T,G,A;

H =i/100;

T=i/10%10;

G =i%10;

A =HHH +TTT + GGG;

if(A==i )

{

printf("%5d",i);

num++;

}

}

printf("thenum is %d\n",num);

return 1;

}

《《《《有關(guān)位操作的問(wèn)題》》》》

93.取一個(gè)整數(shù)a從右端開(kāi)始的4~7位。

Int main()

{

unsigned a,b,c,d;

scanf("%o",&a); /scanf("%x",&a);16進(jìn)制/

b=a>>4;

c=~(~0<<4);// ~的優(yōu)先級(jí)大于<<;

/~0,11111111->11110000->括號(hào)外面00001111,保證低4位為1111/

d=b&c;

printf("%o\n%o\n",a,d);

}

運(yùn)行結(jié)果:輸入:1234

輸出:

1234

11(8進(jìn)制)

78、請(qǐng)編寫(xiě)一個(gè)C 函數(shù),該函數(shù)給出一個(gè)字節(jié)中被置1 的位的個(gè)數(shù)。

#include

#include

unsigned char CheckSetBitNum(unsigned char ucNumber)

{

unsigned char i;

unsigned char iResult=0;

for(i=0;i<8;i++)

{

iResult+= (ucNumber>>i) & 0x01; //第i位是1則加1,否則加0,位移動(dòng)操作不改變?cè)?/p>

printf("ucNumber>>%d=%d\n",i,ucNumber>>i);

printf("iResult=%d\n",iResult);

}

return iResult;

}

int main(int argc,char argv[])

{

unsigned char a;

int num;

scanf("%c",&a);

num=CheckSetBitNum(a);

printf("%d",num);

return 1;

}

方法2:

int count(int x)

{

int i,y,sum=0;

for (i=0;i<8;i++)

{

y=x%2; /這是移出去的值/

x=x/2; /對(duì)于整數(shù)右移一次后x的值相當(dāng)于右移前的值除以2/

if (y==1) sum+=1;

}

return sum;

}

int main(int argc,char argv[])

{

int x;

scanf("%d",&x);

printf("%d",count(x));

return 0;

}

《《《《字符串與整數(shù)互換》》》》

79、請(qǐng)編寫(xiě)一個(gè)C 函數(shù),該函數(shù)將給定的一個(gè)字符串轉(zhuǎn)換成整數(shù)。

int main(int argc,char argv[])

{

char arr[20];

char str=arr;

int num=0;

int digital;

printf("please input a string");

scanf("%s",arr);

while(str!='\0')

{

digital=str-48;

num=num10+digital;

str=str+1;

}

printf("the result is %d",num);

return 1;

}

字符串倒置

int main(int argc,charargv[])

{

char str="hello world";

char des=NULL;

int len=strlen(str);

des=(char)malloc(len+1);//結(jié)尾封口添0;

char d=des;

char s=&str[len-1];//指向最后一個(gè)字符;

while(len--!=0)

d++=s--;

d='\0';//封口

printf("%s\n",des);

free(des);

return 1;

《《《《數(shù)組》》》》

94. 打印出楊輝三角形

int main()

{

int i,j,arr[11][11];

for(i=1;i<=10;i++)

for(j=1;j<=i;j++)

{

if(j==1||i==j)

arr[i][j]=1;

else

arr[i][j]=arr[i-1][j-1]+arr[i-1][j];

}

for(i=1;i<=10;i++)

for(j=1;j<=i;j++)

{

printf("%5d",arr[i][j]);

if(i==j)

printf("\n");

} return 1;

}

71.一語(yǔ)句實(shí)現(xiàn)x是否為2的若干次冪的判斷。

void main()

{

int a;

scanf(“%d”,&a); printf(“%c”,(a)&(a-1)?’n’:’y’);

// 若是打印y,否則n

2的n次冪用2進(jìn)制表示一定是10,100,1000,10000......

對(duì)應(yīng)的i-1就是1,11,111,1111....

i &(i-1)為false(也就是0)時(shí)就是返回true

程序分析題

class A

{

public:

A(int a)

{

printf("%d ",a);

}

};

A a(1);

int main(void)

{

printf("main ");

A c(2);

static A b(3);

return 0;

}

答案:、1 main 2 3

【函數(shù)體外】

只能存在聲明語(yǔ)句或定義語(yǔ)句(實(shí)際上函數(shù)體外的聲明語(yǔ)句都是定義語(yǔ)句,如果沒(méi)有初始化,會(huì)隱式的初始化,對(duì)于基本類型初始化為零,對(duì)于類類型則調(diào)用相應(yīng)的構(gòu)造函數(shù)),

不能存在表達(dá)式語(yǔ)句,包括函數(shù)調(diào)用語(yǔ)句。

2.

struct Test

{

unsigned short int a:5;

unsigned short int b:5;

unsigned short int c:6;

};

int main(intargc,char argv[])

{

struct Test test;

test.a=16;

test.b=4;

test.c=0;

int j=sizeof(test);

int i=(short)&test;

printf("%d\n",i);

printf("sizeof %d\n",j);

return 0;

}

0000 0000 1001 0000

小端機(jī)器結(jié)果將是:16+128=144,選B

60.main()

{

Int a[5]={1,2,3,4,5};

intptr=(int)(&a+1);

int ptr2=(int)((int)a+1);

printf(“%d,%d,%d”,(a+1),(ptr-1),ptr2); 結(jié)果:2,5,2

}

地址 0-3 4-7 8-11 12-15 16-19 20-23

數(shù)值 1 2 3 4 5

&a+1 就是地址為20的地方

ptr1[-1]就是20-4=16這個(gè)地方 一個(gè)Int 占用4個(gè)地址

(int)a+1 跟(int)a+1不一樣 前者地址為1 后者為4,

所以,int ptr2=(int)((int)a+1);ptr2表示的是指向地址為1的指針地址

要點(diǎn):指針進(jìn)行運(yùn)算,加數(shù)與指針類型相關(guān),一般(char),一個(gè)字節(jié);(int),4個(gè)字節(jié);

若是指向結(jié)構(gòu)體,或者是數(shù)組的指針,由具體(sizeof)長(zhǎng)度決定;

詳見(jiàn):點(diǎn)擊打開(kāi)鏈接

#include

#include

int main()

{

int a[4]={1,2,3,4};

int ptr1=(int )(&a+1);

int ptr2=(int )((int)a+1);

printf("%x,%x",ptr1[-1],ptr2);

return 0;

}

小端字節(jié):ptr2=0x2000000;

大端字節(jié):ptr2=0x100;

62

#define SQUARE(a)((a)(a))

int a=5;

int b;

b=SQUARE(a++);

在同一個(gè)式子中有兩次以上修改變量?jī)?nèi)容的副作用時(shí),是未定義行為。

C語(yǔ)言規(guī)定a++的自增副作用應(yīng)該發(fā)生在下一個(gè)序列點(diǎn)之前,但是乘法、括號(hào)和賦值都不是序列點(diǎn),只有整個(gè)表達(dá)式結(jié)束時(shí)才是。在此之前a自增副作用發(fā)生的時(shí)機(jī)是未定義的。 每個(gè)編譯器的結(jié)果不同,結(jié)果是25或者36(不提倡在一個(gè)表達(dá)式中對(duì)變量進(jìn)行兩次后自增操作)

63、#define Max_CB500

void LmiQueryCSmd(StructMSgCB pmsg)

{

unsigned char ucCmdNum;

......

for(ucCmdNum=0;ucCmdNum

{

......;

}

}這段代碼執(zhí)行有什么問(wèn)題?

【標(biāo)準(zhǔn)答案】死循環(huán)

unsigned char //無(wú)符號(hào)字符型表示范圍0~255

char //有符號(hào)字符型表示范圍-128~127

熱門(mén)推薦

最新文章