C語言

在Linux操做系統下C語言程序開發的步驟

1.使用vi編寫C語言源文件
2.使用命令gcc <源文件名>獲得最終的可執行文件
3.使用命令./a.out執行獲得的可執行文件數組

#include <stdio.h> /*導入stdio.h文件(在/usr/include目錄下)*/
int main(){ /*int爲main函數的返回類型*/
    printf("hello world!\n");
    return 0;
}

說明:C語言中以#開頭的指令叫作預處理指令,#include用於把一個文件的內容加入到當前源文件中
        <>包括的文件名不會查找當前目錄,用""包括的文件名會查找當前目錄.只能使用#include包含.h文件而不該該包含.c文件函數

gcc編譯工具的介紹

gcc:GNU(開放源代碼組織) Copmiler(編譯器) Collection(一套)工具

gcc經常使用選項
 -v:顯示各類相關信息
 -E:只完成預處理指令的工做(#開頭的代碼)
 -std=c89/-std=c99:指定採用的C語言標準版本(用c89標準制做出來的的必定適用於c99,反之不行)
 -S:轉化成彙編語言源程序,hello.c ->hello.s
 -O:優化(1,2,3,三種不一樣的優化級別)
 -c:只對源程序進行編譯工做,不連接(hello.o)
 -o:用於指定結果執行文件的名字(默認爲a.out)
 -Wall:把全部的警告都打印出來 性能

C語言程序的處理過程:
 1.預處理,完成預處理指令要求的工做
 2.編譯,把C語言源程序翻譯成計算機認識的格式
 3.連接,把程序中各個部分連接起來優化

註釋

註釋用來在程序中加入文字信息,分單行註釋(//註釋內容)和多行註釋(/*註釋內容*/)>    兩種.註釋中的內容會被計算機忽略編碼

 變量

變量用來記錄數字,在使用變量以前必須聲明,聲明語法以下:
  變量類型 變量名,好比:int price
在未賦值以前變量內部有數據,可是具體數字不肯定.使用=(賦值操做符)對變量進行賦值,第一次給變量賦值叫作變量初始化.能夠在一行語句中聲明多個同類型的變量spa

變量與內存的關係:計算機內存由大量的字節構成,內存中的數字必須記錄在一個或多個相鄰的字節中.變量是這些字節的表明操作系統

經過&符號能夠得到變量的字節地址,經過*符號得到字節地址對應的變量開放源代碼

#include <stdio.h> 
int main(){ 
    int num = 0;
    printf("&num是%p\n", &num);
    *(&num) = 10;
    printf("num是%d\n", num);
    return 0;
}

如今有兩個變量,實現兩個變量之間的交換翻譯

#include <stdio.h>
int main(){
    int num1 = 7, num2 = 3, temp = 0;
    //使用臨時變量完成兩個變量內容的交換
    printf("num1:%d\nnum2:%d\n", num1, num2);
    /*temp = num1;
    num1 = num2;
    num2 = temp;*/

    //不使用臨時變量完成兩個變量內容的交換
    num1 = num1 + num2;
    num2 = num1 - num2;
    num1 = num1 - num2;
    printf("交換後num1:%d\nnum2:%d\n",num1,num2);
    return 0;
}

全局變量,局部變量和塊變量

  定義在函數以外的變量叫作全局變量,
  定義在函數內部的變量叫作局部變量,
  定義在函數內部的大括號裏邊的變量叫作塊變量
  生存週期表示一個變量在什麼時間範圍內是可使用的.
  做用域表示一個變量在什麼代碼範圍內是可使用的.
  全局變量的生存週期是整個程序的運行時期,局部變量的生存週期是所在函數的執行過程,塊變量的生存週期是所在塊的執行過程.
  全局變量的做用域是整個程序代碼範圍,局部變量的做用域是所在函數的執行體代碼,塊變量的做用域是所在塊的代碼.
  不一樣層次的變量能夠重名,在使用的時候變量名稱匹配的是全部做用域包括使用語句的變量中層次最深,而且在這條語句以前聲明的那個變量
  沒有被初始化的全局變量會被自動初始化成0.

#include <stdio.h>
int shu_zi = 0;
int main(){
    printf("shu_zi:%d\n", shu_zi);//0
    int shu_zi = 1;
    //int shu_zi = 2; // 錯誤,重複定義
    {
        {
      int shu_zi = 2;
      printf("shu_zi:%d\n", shu_zi);//2
      }
    printf("shu_zi:%d\n", shu_zi);//1
    }
    printf("shu_zi:%d\n", shu_zi);//1
    return 0;
}

使用全局變量實現一個棧

#include <stdio.h>
#include <stdbool.h> //用於導入bool類型的數據
int last = -1; //表示棧中最後一個數據所佔的位置
//定義一個全局數組用來表示一個大小爲20的棧
int stack[20];
//判斷棧是否爲空
bool empty(){
    if(last < 0){
        return true;
    }
    else{
        return false;
    }
}
//判斷棧是否滿了
bool full(){
    if(last == 19){
        return true;
    }
    else{
        return false;
    }
}
//向棧中添加數據,當棧滿的時候添加失敗
bool push(int num){
    if(!full()){
        stack[++last] = num;
    return true;
    }
    else{
        return false;
    }
}
//取出最後一個數據
bool pop(){
    if(!empty()){
        last--;
    return true;
    }
    else{
        return false;
    }
}
//獲取最後一個數據,並不取出
int peak(){
    return stack[last];
}
//使用四則運算2+3*5表達式,驗證結果是否正確
int main(){
    int num1 = 0, num2 = 0, operator=0;
    push(2);
    push('+');
    push(3);
    push('*');
    push(5);
    num2 = peak();
    pop();
    operator = peak();
    pop();
    num1 = peak();
    pop();
    num2 *= num1;
    operator = peak();
    pop();
    num1 = peak();
    pop();
    num2 += num1;
    printf("計算結果是%d\n", num2);
    if(empty()){
        printf("棧正常\n");
    }
    return 0;
}

標識符命名規則

1.必須以字母或下劃線開頭
2.後面的能夠是字母,數字或下劃線
3.大小寫不一樣的字母被認爲不一樣
4.不能和C語言關鍵字衝突
5.長度沒有限制,可是隻有前面的是有效的(c89取前31位,c99取前63位)

C語言的代碼規範

1.一條語句能夠放在多行內,可是多條語句不該該放在一行裏
2.在合適的地方添加空格,這有助於提升程序可讀性
3.不一樣層次的代碼要用縮進區分開
4.適當使用空行和註釋區分不一樣的邏輯單元
5.標識符名稱採用駝峯方式或下劃線方式

printf與scanf函數

使用C語言提供的printf函數實現把信息打印在屏幕上的功能,須要包含一個stdio.h文件.第一個參數是一個字符串,用來表示要打印的信息.
格式:
  %d:用不帶小數點的數字替換,%md表示數字佔用的寬度
  %c:用單個字符替換,單引號表示字符
  %s:用一個字符串替換
  %f:用一個帶小數點的數字替換
  %g:也能夠用一個帶小數點的數字替換,輸出是後面沒有多餘的0
  %p:用一個地址數據替換

#include <stdio.h>
int main(){
    printf("Hello World!\n");//\n表示換行
    printf("Hello \rWorld\n");//\r表示從行首開始,World
    printf("Hel\\lo World!\n");//\\表示單個斜槓
    printf("Hello Wor\"ld\n");
    int num;
    printf("整數是%d\n", num);//num表示隨機的整數
    printf("整數是%5d\n", 1);//表示整數佔用的寬度
    printf("字符是%c\n", 'a');//單引號表示字符
    printf("字符串是%s\n", "abc");
    printf("數字是%f\n", 3.5f);//3.500000
    printf("數字是%0.2f\n", 3.5f);//保留2位小數
    printf("數字是%lf\n", 3.5);
    printf("數字是%g\n", 3.5f);//3.5
    printf("地址是%p\n", &num);//0x7ffd9e933af4
    return 0; 
}

scanf函數用於從屏幕上讀取信息並記錄到變量中,格式字符串與printf函數相似,後面的參數必須是變量的地址,不然會致使段錯誤.格式串中的類型必須和後面給定地址的變量類型一致

練習:讓用戶從屏幕上輸入圓的半徑,而後打印圓的面積和周長

#include <stdio.h>
#include <math.h>
int main(){
    float r = 0.0f;
    printf("請輸入圓的半徑:");
    scanf("%f", &r);
    printf("圓的周長是%g\n", 2 * 3.14 * r);
    printf("圓的面積是%g\n", 3.14 * r * r);
    return 0;
}

 數據類型

ASCII碼錶記錄字符和編碼之間對應關係
char數據類型來表示字符編號數據,佔一個字節,表示範圍-128到127
unsiged char類型也佔有一個字節,表示範圍從0到255

short類型佔有兩個字節,使用%hd匹配,範圍在(-32768~32767)
unsigned short類型佔有兩個字節,使用%hu匹配,範圍在(0~66535)
long類型佔有4個字節使用%ld匹配,範圍在(-2**31~2**32-1)
unsigned long類型佔有4個字節,使用%lu匹配,範圍在(0~2**32-1)
int類型的大小取決於計算機的單次處理能力,在使用32位計算機上與long相同.
float(浮點類型)用來表示帶小數點的數字,因爲精度緣由計算中要考慮偏差,佔有4個字節使用%f或%g(省略後面的0)匹配,沒有取值範圍
double(雙精度浮點數)用來表示更高精度的浮點數,也存在偏差問題.佔有8個字節使用%lf匹配,沒有取值範圍

有符號數字的二進制表示形式中最高位是0則表示這個數必定是非負數,若是是1則必定是負數,咱們把這個最高位的二進制爲稱爲符號位

在printf和scanf函數中使用%hhd與char類型變量匹配,使用%hhu與unsigned char類型變量匹配
sizeof關鍵字能夠用來計算某個數據類型或某個變量所佔空間的大小,以字節爲單位.它不會計算小括號中的表達式.

#include <stdio.h>
#include <limits.h>
int main(){
    char aChar = 'a';
    unsigned char uChar = 0;
    printf("aChar是%c,aChar的編號是%d\n", aChar, aChar);
    aChar = 98;
    printf("aChar是%c,aChar的編號是%d\n", aChar, aChar);
    printf("sizeof(char)是%d字節,sizeof(aChar)是%d字節\n",sizeof(char),sizeof(aChar));
    printf("sizeof(aChar=99)是%d字節\n", sizeof(aChar=99));
    printf("aChar是%d\n", aChar);
    printf("最大字符編碼是%d,最小字符編號%d\n", CHAR_MAX, CHAR_MIN);
    printf("sizeof(unsigned char)是%d字節,size(uchar)是%d字節\n", sizeof(unsigned char),sizeof(uChar));
    printf("最大字符編碼是%d\n", UCHAR_MAX);
    aChar = 191;
    uChar = 191;
    printf("aCHar:%hhd\n", aChar);
    printf("uCHar:%hhu\n", uChar);
    return 0;
}
/*aChar是a,aChar的編號是97
aChar是b,aChar的編號是98
sizeof(char)是1字節,sizeof(aChar)是1字節
sizeof(aChar=99)是1字節
aChar是98
最大字符編碼是127,最小字符編號-128
sizeof(unsigned char)是1字節,size(uchar)是1字節
最大字符編碼是255
aCHar:-65
uCHar:191*/

小寫字母轉大寫

#include <stdio.h>
int main(){
    char letter;
    printf("請輸入一個小寫字母:");
    scanf("%c", &letter);
    printf("%c對應的大寫字母爲%c\n",letter,letter - 'a' + 'A');
    return 0;
}

運算符

+, -, *, /分別表示加減乘除.
%表示取餘操做,不能對浮點數進行取餘操做

#include <stdio.h>
int main(){
    unsigned short num = 0;
    printf("請輸入一個兩位數:");
    scanf("%hu", &num);
    //%運算符取餘數,/運算符取模
    printf("結果是:%d%d\n", num % 10, num / 10);
    return 0;
}

=表示賦值操做符,要求左邊的部分必定要是一個左值.賦值操做符從右向左計算.
符合操做運算符指的是在賦值操做符前面加上其餘的操做符並造成的,例如+=, *=
++表示自增運算,--表示自減運算,只能對左值進行計算
邏輯運算符計算結果只有兩個,一個真(對)用1表示,另一個是假(錯)用0表示.咱們也能夠在代碼中使用0表示錯誤,任何其餘數值表示真(對).
==(相等), !=(不相等), >(大於), <(小於), >=(大於等於), <=(小於等於), !(求反) 

#include <stdio.h>
int num = 10;
int main(){
    int num1 = 0, num2 = 0;
    num1 = 8, 3;//8
    printf("num1:%d\n", num1);//逗號也是運算符優先級比=還低
    num2 = (8, 3);//3
    printf("num2:%d\n", num2);//逗號操做符返回最後一個表達式的計算結果
    num2 *= 2 + 3;// num2 = num2 * (2 + 3) = 15
    printf("num2:%d\n", num2);
    num2 ++;//num2 = num2 +1
    printf("num2:%d\n", num2);//16
    ++ num2;
    printf("num2:%d\n", num2);//17
    num1 = num2++;//先將num2賦值給num1而後在自加,17
    printf("num1:%d\n", num1);
    num1 = ++num2;//先將num2自加再賦值給num1,19
    printf("num1:%d\n", num1);
    num2 = num1++ + ++num1;
    printf("num1:%d\n",num1);//21
    printf("num2:%d\n",num2);//40
    num2 = num++ + ++num;
    printf("num2:%d\n", num2);//22,不一樣的編譯器結果可能不一樣21
    printf("num:%d\n", num);//12
    return 0;
}

編寫一個時鐘程序

#include <stdio.h>
#include <time.h>
#include <unistd.h>//導入sleep函數
int main(){
    unsigned long total_seconds = 0;
    int hours = 0, minutes = 0, seconds = 0;
    while(1){
    total_seconds = time(0);
    seconds = total_seconds % 60;
    minutes= total_seconds % 3600 / 60;
    hours = total_seconds % (24 * 3600) / 3600;
    hours = (hours + 8) % 24;
        printf("%02d:%02d:%02d\r", hours, minutes, seconds);
    fflush(stdout);//強制把輸出緩衝區清空到屏幕上
    //while(time(0) == total_seconds);//一直佔用cpu影響計算機性能
        sleep(1);
    }
    return 0;
}

 數組

概念:程序中須要使用變量記錄數字,若是數字的數量不少就須要使用多個變量.能夠把多個同類型的變量合成一個總體,C語言裏使用數組表明這個合併後的總體

數組須要先聲明而後才能使用

數組一旦存在則麪包含的變量個數就不能夠改變

使用下標表示數組中每一個變量

可使用for循環依次處理數組中每一個變量

數組也應該先初始化而後在使用

#include <stdio.h>
#include <stdlib.h>
int main(){ 
    int arr[5] = {};//數組聲明語句,並初始化爲5個0
    //若是初始話的數組的長度小於5則用0補,不如大於5則截取
    arr[2] = 10;
    printf("arr[2]是%d\n", arr[2]);
    int num = 0;
    for(num = 0; num <=4; num++){
        arr[num] = num + 1;
    }
    for(num = 0;num <= 4;num++){
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}

示例:編寫程序產生一張彩票,彩票中包含7個1到36之間的隨機數(不能重複)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){ 
    int arr[7] = {}, cnt = 0, num = 0;
    srand(time(0)); 
    do {
        //將數組的第一個位置賦值
        arr[cnt] = rand() % 36 + 1;
    //將後面的數字分別與前面的比較直到與前面的全不相等爲止
        for(num=0; num <= cnt - 1; num++){
        if(arr[cnt] == arr[num]){
            break;
        }
    }
    //判斷上述循環是否爲正常結束
        if(num == cnt){
            cnt++;
        }
    }while(cnt < 7);
    for (num = 0; num <= 6; num++){
        printf("%02d ",arr[num]);
    }
    printf("\n");
    return 0;
}

數組的優缺點:

  優勢:數組支持隨機訪問,數組中每個變量均可以直接使用,不須要依賴其餘變量

  缺點:數組不適合進行插入刪除操做

編寫程序向一個有序數組中插入一個新數字,插入後整個數組仍然是有序的,而後再刪除一個數字

 

#include <stdio.h>
int main(){ 
    int arr[9] = {1, 3, 5, 7, 9, 11}, num = 0;
    for (num = 5; num >= 0; num--){
        if(arr[num] > 4){
        arr[num + 1] = arr[num];
    }
    else{
        break;
    }
    }
    arr[num + 1] = 4;
    for(num = 0; num <= 6; num++){
        if(arr[num] > 7){
        arr[num -1] = arr[num];
    }
    }
    for (num = 0; num < 6; num++){
        printf("%2d ",arr[num]);
    }
    printf("\n");
    return 0;
}

 流程控制語句

分支語句:if語句和switch語句

if語句格式:
if(條件1){//若是 每一個分之語句if只能出現1次
     //知足條件1時執行的語句
 }else if(條件2){//或者 出現0~n次
     //知足條件2時執行的語句                                                                                                                         
 }else{//不然 出現0~1次
     //以上條件否不知足是執行的語句
 }
switch語句格式:

switch(控制表達式){
     case 常量表達式:語句;
     ...
     default:語句;
 }
 控制表達式被當作整數處理,能夠是字符,但不能是浮點數
 常量表達式必須是常量,如3 'A' 2+5
 語句能夠是0到多條                                                                                                                                   
 不容許重複重複分支,default不必定在最後
 break用於退出switch,switch語句遇到break後或執行完最後一條語句才退出

#include <stdio.h>
int main(){ 
    int score = 0;
    printf("請輸入1~100的整數:");
    scanf("%d", &score);
    switch(score / 10){
        case 10:
    case 9:
        printf("A\n");
        break;
    case 8:
        printf("B\n");
        break;
        case 7:
        printf("C\n");
        break;
    case 6:
        printf("D\n");
        break;
    default:
        printf("E\n");
    }
    return 0;
}

循環語句
  for循環格式:
  for(表達式1;表達式2;表達式3){
      循環體語句;
  }
  執行順序:表達式1 -> 表達式2(爲假則退出循環) -> 循環體語句(遇到break可則退出循環) -> 表達式3
  示例:打印99乘法表

#include <stdio.h>
int main(){ 
    int i = 1, j = 1;
    for(i = 1; i < 10; i++){
        for(j = 1; j <= i; j++){
        printf("%d*%d=%2d ", j, i, i*j);
    }
    printf("\n");
    }
    return 0;
}

while循環格式
  while(表達式){
     語句;
  }
 do ... while循環格式                                                                                                                                                 
  do{
      語句;
  }while(表達式);
循環內部經常使用的關鍵字

  break用於退出循環,能夠到達循環的外部下一行語句

  continue用於終止本次循環,繼續下一次循環

相關文章
相關標籤/搜索