本文將對計算機程式設計的入門語言——c語言中的基本語法,包括判斷,迴圈,函式,結構體,陣列等概念進行介紹講解。在生活中我們經常要做出選擇,程式也是如此。購物時的標準,優惠券的折扣條件等,在**中都需要if語句來進行判斷。假如我們要判斷乙個正整數是偶數還是奇數,可以這樣子寫:
其中if後面括號中的 x%2 == 0 是乙個判斷語句,當x%2的值等於0的時候,x%2==0成立,這個表示式會返回1給if語句,表示條件成立。而我們知道,正整數x如果模2等於0,就說明它是偶數。除了a==b可以判斷a和b是否相等之外,也可以用a!=b來判斷a和b是否不相等。這個多敲點**就明白了。
接下來我們來學習迴圈的概念。如果我們要計算1+2,可以簡單的定義兩個變數i=1和j=2,然後讓answer=i+j,就得到了我們想要的結果。但是,如果我們要計算1+2+3+...+100呢?難道我們要定義100個變數嗎?理論上是可以這樣做,但是這樣的**寫起來就很沒有效率。我們將要學習的迴圈可以很好的解決這個問題。
以這個**中的for迴圈為例,i=0表示初始化的內容,i<=100表示迴圈繼續執行的條件。i++表示在每次迴圈體執行完之後執行的內容。19-21行的中括號{}表示迴圈體的部分,這裡我們迴圈執行ans = ans + i。在第一次迴圈時,i=1,執行完迴圈體後ans的值為1。之後執行i++後i=2,符合i<=100的條件,因此進入下一次的迴圈……以此類推,直到i=101的時候,跳出迴圈。
while迴圈,是for迴圈的另一種寫法。它的基本語法如下:
while(迴圈條件)
同樣是計算1+2+…+100,使用while迴圈的寫法如下:
配套迴圈還有兩個語句,分別是continue和break。continue讓**跳過當前迴圈,進入下一次迴圈。break則是跳出整個迴圈。假設我們現在要計算前100個正奇數的和,**可以這樣寫:
**解析:
51行:while(1)代表乙個條件判斷永遠為1的迴圈,也就是無限迴圈。
52-55行:判斷當前的i是否為偶數,是偶數則continue跳過當前迴圈。
56-58行:判斷是否已經計算了100個奇數,如果是則跳出迴圈。
當我們使用for迴圈或者while迴圈時,條件判斷永遠成立,使得迴圈體一直迴圈反覆地執行的情況,就是死迴圈。死迴圈可以說是新手最常犯的乙個錯誤。例如,使用while迴圈的時候,忘記使用break,或者是自變數忘了自增,都可能導致死迴圈。
假如我們有一組學生的成績,在程式中要如何儲存這組資料呢?我們可以使用很多的變數,但是更合理的方式是用陣列來進行儲存。所謂的陣列,其實就是按順序排列好的一組變數。比如int a[5];對第乙個位置的變數賦值為10可以用a[0]=10進行賦值。要取出第乙個位置的值,只需要取a[0]即可。
ps:a[i]中的i稱之為下標,需要注意的是,大部分程式語言中,下標都是從0開始,而不是從1開始,這與現實世界有些違背。
其中68-70行代表迴圈讀取n個數,並依次放在陣列a中。我們已經學習了printf函式用於顯示資料,而scanf是與之相對的,用來讀取資料。它的格式跟printf類似,但是需要注意後面的變數前面需要加上&,表示變數對應的位址。
在計算1+2+…+100後,可能我們會想著計算1+2+…+1000,或者是2+3+…+101等不同範圍的求和,這樣我們需要不停地改動**。如果能夠把計算這個部分抽取出來,單獨作為乙個部分,想要計算的時候,只要輸入範圍,就可以幫我們計算這個範圍求和之後的值。函式就是這樣乙個工具,它把乙個特定的過程抽取出來,作為乙個模組,可以重複呼叫。
**解析:
圖中的3-9行就是乙個函式,其中的
int calculate_sum(int start,int end)
第乙個int表示的是返回值的型別。代表當這個函式被呼叫時,會返回乙個int型別的值。後面的calculate_sum是函式名,使用函式時主要是根據函式名來指定函式。而後面括號中的start,end是兩個int型別的引數,引數的多少是根據我們的需要自己設定的。
在定義的時候,我們並不知道引數start和end具體的值,進行函式呼叫時,需要指定引數的值。比如13行中,int ans1 = calculate_sum(1,100);把1傳給了start,100傳給了end。由於函式的返回型別為int,所以定義的ans1也是int型別。
在函式的幫助下,當我們有了新的計算需求後,並不用修改原有的**,只需要增加新的**即可,**的可維護性大大提高。
乙個學生,有學號,有成績,如何在c語言中表示「學生」這個概念呢?結構體就可以實現。結構體的關鍵字是struct,定義完之後,就可以用結構體來代表乙個學生。
**解析:
12-15定義了乙個結構體student,它包含了int型別的學號number,以及int型別的成績score
18-20定義了學生a,學號為1,成績為100.
21-23定義了學生b,學號為2,成績為90
24-26定義了長度為10的結構體陣列x,並把a,b放在陣列的開頭。
我們定義的變數,無論是int變數,float變數,在執行時最終都會對應到記憶體裡的某個位置。而指標就是指向變數和物件的位址。就像桌面的快捷方式,它指向乙個真實的檔案。
指標的用途非常廣泛,比如如果你想通過函式改變乙個變數的值,就得用指標而不能用值傳遞。還有在很多時候變數,特別是物件的資料量實在太大,程式設計師就會用指標來做形參,只需要傳遞乙個位址就行,大大提高了效率。
在c語言中,我們可以通過int* p 的方式來定義乙個int型別的指標。在上面**第6行中,我們定義了指標p,並把變數i在記憶體中的位址通過&i的方式獲取並賦給p。在第8行中,我們通過 *p 的方式取到了 指標p對應的記憶體中的值。
然而,指標的知識點比較複雜,一開始不理解也沒關係,並且也不建議初學者去深究指標知識點,知道有這個概念即可。等以後有需要用到了,再深入學習。
C語言數列求和
problem description 數列求和是一類常見的問題,本題有一定的代表性 求s a aa aaa aaaa aa aa n位 其中,a的值由鍵盤輸入,位數n也由鍵盤輸入。input 第一行輸入a的值 第二行輸入位數n。output 輸出對n個數完成求和運算後的結果。比如a 3,n 6時,...
(C語言)練習2 數列求和
數列的定義如下 數列的第一項為n,以後各項為前一項的平方根,求數列的前m項的和。input 輸入資料有多組,每組佔一行,由兩個整數n n 10000 和m m 1000 組成,n和m的含義如前所述。output 對於每組輸入資料,輸出該數列的和,每個測試例項佔一行,要求精度保留2位小數。exampl...
c語言數數
描述 我們平時數數都是喜歡從左向右數的,但是我們的小白同學最近聽說德國人數數和我們有些不同,他們正好和我們相反,是從右向左數的。因此當他看到123時會說 321 現在有一位德國來的教授在鄭州大學進行關於acm的講座。現在他聘請你來擔任他的助理,他給你一些資料讓你找到這些資料在書中的頁數。現在你已經找...