當前位置:編程學習大全網 - 編程語言 - c語言編程問題!

c語言編程問題!

1.編程在壹個已知字符串中查找最長單詞,假定字符串中只含有字母和空格,空格用來分割不同單詞!

方法壹:

//VC++ 6.0 編譯通過

#include<stdio.h>

void main()

{

char str[]="hello world my name is xun yi cao !!";

char*p=str,*p1;

int max=0,count=0,i;

while(*p)

{

count=0;

while(*p==' ')p++;

while(*p!=' '&&*p)

{//壹定要註意這裏的判斷 *p!=0 也要判斷,不然到了最後壹個單詞時,它壹直向後面加,直到碰見空格,所以會超界。

p++;

count++;

}

if(max<count)

{

max=count;

p1=p-count;

}

}

printf("the largest number is :%d \n",max);

printf("the largest word is : ");

while(*p1!=' '&&*p1) //這裏也要判斷*p1!='\0',因為如果最長的單詞在字符串的末尾的話,如果不判斷*p1!='\0',也會過界。

{

putchar(*p1);

p1++;

}

putchar('\n');

}

/*

求字符串中最長的單詞。要註意的是:如果在壹個循環A 裏面還有循環B 的話。那麽不僅在循環B裏面要保證,數組不過界。

而且要要保證在循環A裏面數組也不過界。就像上面的例子壹樣。現給出壹個更容易理解的例子。

while(*p)

{

while(*p!=' '&&*p)

{

p++;

}

}

雖然外循環和內循環在循環條件上沒有什麽必然的聯系,但是對於壹個數組的指針而言(如果以變量下標的

形式來訪問數組的話,下標的加減也要引起註意),它的加減也要引起註意,必須要保證不能過界。

*/

方法二:

//VC++ 6.0 編譯通過。

#include<stdio.h>

#include<string.h>

void main()

{

char str[]=" I am a student";

char*p=str,Array[10][20]={0};

int i=0,j=0,max=0;

while(*p)

{

while(*p==' ')*p++;

while(*p&&*p!=' ')

{

Array[i][j++]=*p;

p++;

}

i++;j=0;

}

i=0;

max=strlen(Array[i]);

p=Array[i];

while(strlen(Array[i]))

{

if(max<strlen(Array[i]))

{

max=strlen(Array[i]);

p=Array[i];

}

i++;

}

printf("%d\n%s\n",max,p);

}

/*

求字符串中最長的單詞(不能分辨含非字母字符的單詞),采用的是二維數組的形式判斷的。

定義了壹個二維數組,它的每壹個元素用來存放壹個字符串(每個被分離後的單詞)。

再判斷最長的那個。

這中方法對比第壹種方法來說,思路更清晰壹些。但是缺點就是要分配壹個二維的數組來存放被分離後的每個

單詞,占用存儲空間。

*/

2.編寫實現任意十進制數,轉換成r進制數(r在2到16之間)

轉換為二進制:

//VC++ 6.0編譯通過

#include<stdio.h>

#include<string.h>

void main()

{

int a,b[30],i;

scanf("%d",&a);

for(i=0;a!=0;i++)

{

b[i]=a%2;

a=a/2;

}

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

{

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

}

putchar('\n');

}

//關於二進制的轉換,還可以用位移運算符。通過和某壹個數如1相按位與,就得到它的二進

制最低位,在位移,再得到二進制最低位,依此類推。

轉換為8進制:

/VC++ 6.0編譯通過。

#include<stdio.h>

#include<string.h>

void main()

{

int a,b[20],i;

scanf("%d",&a);

for(i=0;a!=0;i++)

{

b[i]=a%8;

a=a/8;

}

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

{

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

}

putchar('\n');

}

/*

轉換為8進制就沒有16進制那麽麻煩了,它不需要另外定義壹個字符數組用來存放,進制的

所有基數了,而是直接輸出來就可以了。而對與16進制還要存放他的基數。從0到F

*/

轉換為16進制:

//VC++ 6.0 下編譯通過

#include<stdio.h>

#include<string.h>

void main()

{

int a,b[20],i,base=16;

char X[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

scanf("%d",&a);

for(i=0;a!=0;i++)

{

b[i]=a%base;

a=a/base;

}

for(--i;i>=0;i--) //開始有壹個 --i

{

int j=b[i];

printf("%c",X[j]);

}

printf("\n");

}

/*

壹般把其它進制的數轉換為十進制的數較容易,有壹個現成的乘法公式供我們使用。

但把十進制的數轉換為其它進制的數,則要用到除法。這題的思路是比較清晰的,應該是

解決這類問題的典型算法了。

而對於把十進制的數轉換為二進制的數來說,除了用到除法外,還可用位運算。

這個問題主要是這兩句話值得理解:

b[i]=a%base;

a=a/base;

我們壹般是用這兩句循環使用來得到壹個整數的各位的數字,這也恰巧說明了,我們得到

壹個整數的各個位數所用到的方法,正是把壹個十進制的數轉換為壹個 "十進制" 數的算法

也就是我們得到壹個十進制數的各個位的數字的過程,實際上就是求把他轉換為壹個十進制

的數字的過程(雖然這裏本身沒必要在轉換,因為本身它就已經是壹個十進制數了)。用同樣

的道理可以推算把十進制數轉換為其他進制數的過程,和這個是類似的。

然後將後得到的結果先輸出,而先取余數得到的結果則在數字的最後面,在低位。

*/

通用解決方案:

#include<stdio.h>

#include<string.h>

void main()

{

int a[10]={0,1,2,9,10,5,12,7,8,15};

for(int i=9;i>=0;i--)

{

if(a[i]>=10)

switch(a[i])

{

case 10: printf("%c",'A');break;

case 11: printf("%c",'B');break;

case 12: printf("%c",'C');break;

case 13: printf("%c",'D');break;

case 14: printf("%c",'E');break;

case 15: printf("%c",'F');break;

}

else

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

}

}

/*

其實進制轉換的算法我們都知道,就是用我們要轉換的那個數,對進制的基數(如果是16進制)

進行取余,把取余的結果保存在壹個數組裏面,再對他取整重新賦值,也就是丟掉余數部分,

相當於取上壹步的商,再取余,再取整。如此循環,直到為0。

其實上面的算法,只要我們想起把壹個十進制的數轉換為二進制的數的計算方法,就不難理解,

因為都是相通的。

現在關鍵是,如果我的這些事情都做好了,也就是余數都放在壹個數組裏了,現在要做的就是

把數組逆序輸出就ok了。那麽如果是二進制或八進制,我們只要直接輸出就可以了,但是如果是

壹個十六進制的話,就不能這樣了,也就是如果數組裏面有壹個元素是14,那麽我就不能原樣輸出

了,此時必須輸出E,因為E就是十六進制裏面的基數,而且也是與十進制的14相對應的。但是如果

是壹個二進制或者是壹個八進制的話,就可以直接輸出,因為數組裏面的數都是0,1(對二進制)

或者(0....8),這些數就是二進制和八進制的基數。

所以這裏要面臨的問題就是,在輸出壹個整數的時候,如果這個整數滿足某壹條件,就輸出什麽字

符的問題,例如:如果這個整數等於14則輸出'E'字符。

當然我們可以用 if..else 語句來判斷,對於十六進制的數特殊的字符也就只有A,B,C,D,E,F六個

用 if...else 來判斷也不算太煩瑣。當然我們還可以用 switch 來判斷,這樣更加有條理。代碼

也更清晰。

當然這是對於16進制的數來說的,我們可以這樣判斷,但是如果實際生活中遇到的問題和這個有點

類似,而且字母有多的話,用條件判斷或switch就太煩瑣了,代碼也不直觀,還容易出錯。

那麽這時我們可以在定義壹個字符數組,分別放我們要輸出的字符,如果有以下對應的關系:

10 A

11 B

12 C

13 D

14 E

15 F

16 G

17 H

18 I

19 J

也就是說在數組a裏面放的是數字,在數組b裏面放的是字符,要求數組a裏面的數字是10的時候,輸

出'A',而不是輸出10,依次類推(看上面的對應關系),當然我上面的對應關系都是順序的,其實也

可以不是順序的,對於數字和字符都可以是亂的,當然這要看實際遇到的問題是什麽樣的了。如果

對上面的問題還用if...else來判斷的話,那未免太煩瑣。所以我們定義壹個字符數組來專門存放

字符。那麽怎麽讓數字和字符聯系起來呢,怎麽讓a[i]的值是10的時候就輸出'A'而是14的時候就輸

出'E'呢,在這裏我們可以這樣定義b數組:

char b[30]={0};

b[10]='A';

b[11]='B';

b[12]='C';

b[13]='D';

b[14]='E';

...

b[19]='J';

這樣也就是說當a[i]元素的值是10時,就輸出b[10],是11就輸出b[11];這樣就和數字對應起來

了。我們可以這樣用:

int t=a[i];

printf("%c",b[t]); a[i]的值是多少,我們就輸出b[多少]

但對於上面舉的例子來說,可以這樣:

if(a[i]>=10&&a[i]<=19) //對應關系是連續的,才可以這樣判斷

{

int t=a[i];

printf("%c",b[t]);

}

else

{

printf("%d",a[i]);//如果不屬於定義的對應的特殊字符,就原樣輸出。

}

當然了,上面的是對應的連續的情況,對與10進制與二進制,8進制,16進制之間的轉換,都是連續的情況。

如果對應的是不連續的情況,那有該怎麽辦呢:

20 'A'

25 'B'

30 'D'

50 'G'

53 'H'

58 'C'

100 'Z'

200 'W'

對於上面的情況,是壹點規律性也沒有的,而且如果為了這幾個數就去定義壹個200個元素的數組,實在是

有點劃不來。所以如果是上面這種情況,就沒有比較好的辦法了。只用用判斷語句了,當然如果有20多個

字符的對應關系的話,判斷語句也是不合適的,那麽就沒有比較好的辦法了。還要進壹步探索....

*/

這些都是我在考計算機等級考試碰到過的題目哦,算法都是相當典型的,有的是書上看到的,有的是自己擴展的。還是要自己認真哦。。。

由於文字太多第三題提交不上來了哦。。不好意思。。。

  • 上一篇:眼科工作計劃三篇
  • 下一篇:2018安徽合肥小升初戰役已經打響:劃片入學特長生及擇校考
  • copyright 2024編程學習大全網