打算重新學一遍C語言,並在這個部落格上分享每天的成果。看見一個說法,寫得比做的更靠譜;另外對於IT行業,部落格似乎總是顯得很重要,能夠衡量一個程式員的功底;我既不是程式員,也沒有紮實的功底。但我真的想堅持,今天是個開頭,看能堅持多久。根據基本的瞭解,歸納了下C的一些特點:豐富的資料類型及運算子;可移植性;能夠直接接觸底層硬體(可以對地址的訪問)。
第一題是說,輸出2000年到2500年之間的所有閏年。程式十分簡單,只有一點容易搞錯----何為閏年。百度百科給出了定義及設定閏年的原因四年一閏,百年不閏,四百年再閏。之所以設定閏年,是因為按每天24小時、每年365天計算的話,每四年會多出一天(比一天略小),因此四年一閏;而四年一閏的每四百年會多出三日,因此又規定百年不閏,四百年再閏。演算法流程圖如下:
對應的C程式過於簡單,不在贅述;
第二題;求m,n的最大公約數,同樣演算法是很重要的(我之前一直拿短除法之類的計算的,沒見過這種演算法,這種演算法的收斂速度更快)
(演算法叫歐幾裡得或輾轉相除法,具體的證明方法參見經典問題—歐幾裡得求最大公約數)原始碼也略去了;都是簡單的運算子的應用。另外補充一點;如何計算最小公倍數,例如給出的數是m,n,由上述演算法求得的最大公約數為p,則最小公倍數數為mn/p;
字元資料的輸入和輸出:putchar()和getchar()均只能輸出和輸入一個字元;如何輸入一個字串呢。利用迴圈
while((c=getchar())。=‘/n’).或者定義字串數組,用gets()實現;關於這點可以從題目“輸出給定的字串的所有子串(http://blog.csdn.net/ns_code/article/details/21043665#comments)”一題中得以應用。我關於此題寫的代碼如下:
#include<stdio.h>void main(){char a[100];int num,i,j,k;num=0;/*while((a[num]=getchar())!='\n'){num=num+1;}*/for(num=0;(a[num]=getchar())!='\n';num++)printf("aaa%d\n",num);for(i=0;i<num;i++)for(j=i;j<num;j++){k=i;while(k<=j){printf("%c",a[k]);k=k+1;}printf("\n");}}
格式輸入與輸出:7.2f%指七列二位小數;
運算子優先順序:賦值<關係<算術;
swith語句;一旦執行完一個case,自動進行下一個case,除非加了break;
在迴圈語句及cwith語句中用break跳出當前語句;
在迴圈語句中,continue跳出當前迴圈
fabs(t)指求t的絕對值;
字串處理函數:puts;gets;strcat(str1,str2)將字串2接到字串1後面;strcpy(str1,str2)將字串3複製到1中去,字串不能通過簡單的str1=str2賦值;與之對應的strncpy(str1,str2,n)將2中最前面的n個字元複製到1中去;strcmp(str1,str2),如str1>str2,函數值為一個正數;小於為負數;等於為零。strlen測試字串的長度;strlwr和strupr互相對應,分別將字串變成小寫或大寫;
函數的單向值傳遞形式,形參值的變化不能使實參的值發生改變;而用指標變數作為函數參數,可以很容易的完成多多個變數的修改;
指標的理解:指標好比是地址,通過地址能夠找到他所指的對象;我們可以應用指標修改指標所指的對象。指標和數組名有關聯之處,比如定義數組:int a【10】,則a代表數組元素的首地址;我們定義指標變數int*p,則p=&a【0】和p=a是等價的;也就是說a也是指標,但是是個常量指標,不能在程式裡繼續賦值了。另外,*(p+i)和a【i】是無條件等價的
多維陣列與指標的關係:對於a【i】【j】:
a 含義:0行首地址
a[0],*(a+0),*a 含義:0行0列地址
a+1,&a[1] ,*(a+1) 1行首地址;
a[1]+2,*(a+1)+2 1行2列元素的地址
*(a[1]+2),*(*(a+1)+2 ) 1行2列元素的值
sizeof()和strlen()的關係:
1、sizeof()是運演算法,strlen()是函數;
2、sizeof()求變數所佔的byte值;strlen一般求的是字串的長度(不包括結尾的’\0‘,但包'\n' 't'等,另外注意'\\' '\ddd' '\xhh'等字元的用法)
以下是幾個簡單的程式,可以看出他們之間的關係
#include #include int main(void){char s[]="010\010\\010\n";printf("%d\n%d",sizeof(s),strlen(s));//顯示的結果為10(’\101‘指的是ASICII碼//為101的字元;’\\‘代表反斜線字元,包括字串的結束標誌’\0‘)和9}//注意與上個程式間的區別//#include #include int main(void){char *s="010\010\\010\n";printf("%d\n%d",sizeof(s),strlen(s));//顯示的結果為4(包括字串的結束標誌’\0‘)和9}