程序員考試筆記二:C語(yǔ)言數(shù)據(jù)類型(連載中)
 因?yàn)榍疤炖蠋熋轿覀兊牡椎年P(guān)系,所以今天要補(bǔ)一補(bǔ)前面的基礎(chǔ)部份。他先是列出一個(gè)數(shù)據(jù)類型的表,如下: 
 
  上面這個(gè)表,基本類型是我們平常用得最多的,包括整型、字符型、實(shí)型(浮點(diǎn)型),就從這里最常用的數(shù)據(jù)類型說(shuō)起吧。
  說(shuō)起C語(yǔ)言的數(shù)據(jù)內(nèi)容就要說(shuō)說(shuō)計(jì)算機(jī)里存放的數(shù)據(jù)是究竟怎么一回事,大家應(yīng)該都知道計(jì)算機(jī)只可以處理二進(jìn)制的數(shù)吧,因?yàn)槭怯布年P(guān)系(二態(tài)器件),這些只能有兩種表示的狀態(tài),所以運(yùn)用到計(jì)算機(jī)里就顯得特別有用了。從現(xiàn)在開(kāi)始我們要知道計(jì)算機(jī)處理的所有數(shù)據(jù)都是二進(jìn)制數(shù),那么他究竟是怎么運(yùn)算的呢?老師先給一些十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的幾道題我們做,這些小兒科當(dāng)然是沒(méi)問(wèn)題啦,很簡(jiǎn)單的就做了出來(lái)。老師當(dāng)然知道我們是會(huì)做的了,但是其實(shí)是想我們?cè)谧鲞@些題目的時(shí)候找出更簡(jiǎn)單的轉(zhuǎn)換方法。例:
10111012 =(93)10 很簡(jiǎn)單的就可以計(jì)算出來(lái)了,我的方法就是傳統(tǒng)的計(jì)算方法。它們都有自己的位權(quán),第一位就是20,第二位是21,跟著的都如些類推,將有1的地方乘上該位的數(shù)跟著相加起來(lái)就等于93了。這里說(shuō)說(shuō)其實(shí)二進(jìn)制的次方特別好算,就像我們的內(nèi)存一樣階梯上去的,
  不過(guò)老師在這里提出了一個(gè)更好的方法,起碼比一個(gè)一個(gè)加上去也快多了。就是將那個(gè)要轉(zhuǎn)換的數(shù)變?yōu)槿际?SPAN lang=EN-US>1111111,你知道這個(gè)數(shù)是多少嗎?其實(shí)就是有一技巧在里面,把它看成10000000 減 1吧!那么是不是很快就知道10000000是多少呢,沒(méi)錯(cuò)就是128嘛,再減1就是127了,在些基礎(chǔ)上試著將原來(lái)的那個(gè)二進(jìn)制數(shù)位為零的那兩個(gè)數(shù)求出來(lái),第一個(gè)零在第二位,所以是2,第二個(gè)零在第六位,所以是32,將其加起來(lái)被127減去就可以得出93了,是不是很簡(jiǎn)單方便呢(學(xué)到東西快交學(xué)費(fèi)啊,哈哈~?。?。你知道計(jì)算機(jī)里二進(jìn)制有什么幾種運(yùn)算嗎?我在這里告訴你,其實(shí)就只有這么的一種,就是加法運(yùn)算(你不要告訴我你連二進(jìn)制的加法也不會(huì)運(yùn)算,其實(shí)就是蓬二制一嘛)。為什么這樣說(shuō)呢?其實(shí)二進(jìn)制也有減法運(yùn)算和乘除,但是計(jì)算機(jī)里有一種叫補(bǔ)碼的方法,可以將減法運(yùn)算變?yōu)榧臃ㄟ\(yùn)算,至于怎么實(shí)現(xiàn)教師也沒(méi)有再深入講下去了(在些補(bǔ)充,乘法也是利用移位來(lái)實(shí)現(xiàn)轉(zhuǎn)為加法的)。 
  現(xiàn)在轉(zhuǎn)入到C語(yǔ)言的整型數(shù)據(jù)里,C語(yǔ)言的整型數(shù)據(jù)是2字節(jié)的,就是16位,最多可以存儲(chǔ)65536,他的范圍是 -32768 到 32767 。C語(yǔ)言里分有符號(hào)類型和無(wú)符號(hào)類型,如果是沒(méi)有符號(hào)的整數(shù)類型的范圍就是0 到 65535 了。關(guān)于字符型數(shù)據(jù),如果嚴(yán)格來(lái)說(shuō)C語(yǔ)言里根本沒(méi)有字符這種類型,因?yàn)樗鎯?chǔ)的是它的ASCII碼。直接可以用來(lái)和其它的數(shù)據(jù)類型運(yùn)算,比如:
main()
{
  char s='A';
  int i=2;
  s=s+i;
  printf("%d",s); /*這里可以直接輸出其ASCII碼*/
  printf("%c",s); /*這里的結(jié)果因?yàn)樯厦娴恼Z(yǔ)句改變了字符s的字符,輸出的是'C'*/
}
  那么更不要說(shuō)字符串了,所以字符串在C語(yǔ)言里也只是用數(shù)組來(lái)表示,和其它的高級(jí)語(yǔ)言不同,有其的字符串類型,而且還是字符和字符串結(jié)合在同一種類型里?,F(xiàn)在該說(shuō)一下實(shí)型數(shù)據(jù)了,字型類型通常用在有小數(shù)位的一些數(shù)據(jù)。就像這題一樣:
S=1/1+1/3-1/5+1/7……1/2n-1
這個(gè)程序是我寫的:
main()
{
  int n,i,s;
  int r=1;
  printf("please input: ";
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    s=s+r/(2*i-1);
    r=-1*r;
  }
  printf("%d",s);
}#p#
這個(gè)是考試?yán)锏模?/FONT>
void fun(float *sn, int n)
{
  float s=0.0,w,f=-1.0;
  int i=0;
  for(i=0;i
    f=___*f; /*這里填 -1 */
    w=f / (2*i+1);
    s+=w;
  }
  ____=s; /*這里填 *sn */
}
考試?yán)锏膬蓚€(gè)空我都做對(duì)了,可是自己寫的那個(gè)程序就有大問(wèn)題了,就是答案用了整型數(shù)據(jù),從答可知答案應(yīng)該是小數(shù)啊,真的一時(shí)的糊涂就可以至命??!我們幾乎所有人都是錯(cuò)了這點(diǎn),當(dāng)然也要另類的錯(cuò)法,就是用回來(lái)以前QB的一些運(yùn)算符,^ 這個(gè)是QB里的次方運(yùn)算符,這可真的鬧出笑話了。之后是要我們編一個(gè)主函數(shù)來(lái)調(diào)用這個(gè)函數(shù)。
我是我做的
main()
{
  float s;
  int n;
  printf("please input:";
  scanf("%d",&n);
  fun(&s,n);
  printf("%f",s);
}
這是這么幾條簡(jiǎn)單的語(yǔ)句,不過(guò)就難道了幾乎所有人(除了我)。你知道他們的答案嗎?讓我給大家展示出來(lái)吧
main()
{
  float *ss;
  int n;
  printf("Please input:";
  scanf("%d",&n);
  fun(*ss,n); /*這里出了問(wèn)題*/
  printf("%f",*ss);
}
他可以還沒(méi)有了解到C語(yǔ)言里的函數(shù)參數(shù)的問(wèn)題吧,既沒(méi)有定義一個(gè)可以存放結(jié)果的變量,參數(shù)方面也用錯(cuò)了,如果真的要用指針也得要指針指向一個(gè)存儲(chǔ)單元才行吧。而且還不是傳了地址,他而是試圖傳一個(gè)指針指向單元進(jìn)函數(shù)里,這是絕對(duì)錯(cuò)誤的。因?yàn)樵撜{(diào)用的函數(shù)是地址,好了,下面給他的程序更正一下。如下:
main()
{
  float *ss,s; /*這里多定義一個(gè)單精度的變量*/
  int n;
  ss=&s;
  printf("Please input:";
  scanf("%d",&n);
  fun(*ss,n); /*這里出了問(wèn)題*
  printf("%f",*ss);
}
【專題鏈接】















 
 
 


 
 
 
 