C語言初步;簡單的演算法及程式;

來源:互聯網
上載者:User


    打算重新學一遍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}
















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.