主頁 > 軟體設計 > 【期末復習】考試月來臨!??C語言復習,這一篇帶你逃離掛科區!(上)??

【期末復習】考試月來臨!??C語言復習,這一篇帶你逃離掛科區!(上)??

2021-06-12 08:48:55 軟體設計

考試月來臨,劃水劃了大半學期,想起來我已經幾個月沒有打過C的代碼了,C語言是剛開學的時候自學的,學院下學期才開設C語言課程,上課的時候都在干自己的事情,現在快考試了,來整理順便復習一下C語言的相關內容吧~🍰

小丞

1. 程式設計和C語言

1.1 Hello world

#include <stdio.h>                  //預處理指令
int main() {                        //定義主函式    
    printf("這是一篇復習博客");      //輸出陳述句
    return 0;                      //函式執行完畢
}

1.2 程式的結構

  1. 一個程式由一個或多個原程式檔案組成
  2. 函式是C程式的主要組成部分,函式是程式的基本單位
  3. 一個函式包括兩個部分,函式首部(int max(int a, int b))和函式體(花括號中的部分)
  4. 程式總是main函式開始執行,無論main函式在什么位置
  5. 程式中要求計算機的操作是由函式中的C陳述句完成的
  6. 在每個資料宣告和陳述句的最后必須有一個分號
  7. C語言本身不提供輸入輸出陳述句,是通過庫函式scanfprintf提供的
  8. 程式應當包含注釋,注釋能大大的提升代碼的可讀性

對于長期打js代碼的來說,分號真的是它容易忘記了!!

注意: 手寫代碼的時候一定要注意分號,以及注意雙引號

1.3 運行 C 語言的步驟

編輯-編譯-連接-執行

1.4 練習題

答案在習題后面噢~

第一題:

一個C程式的組成部分可以是(  ),

A) 一個主函式和一至若干個其他函式 B) 一至若干個主函式

C) 一個主程式和一至若干個其他函式 D) 一個主程式和一至若干個子程式

第二題:

一個C程式的執行是從(  ),

(A) 本程式的main函式開始,到main函式結束

(B) 本程式檔案的第一個函式開始,到本程式檔案的最后一個函式結束

? 本程式的main函式開始,到本程式檔案的最后一個函式結束

(D) 本程式檔案的第一個函式開始,到本程式main函式結束

第一題: A,第二題:A

2. 順序、選擇、回圈結構

2.1 識別符號

識別符號的命名規則是:

  1. 只能由字母、數字和下劃線組成,字母區分大小寫,
  2. 第一個字符必須是字母或下劃線,不能為數字

C語言中識別符號有以下3類

  1. 關鍵字,它們在程式中有固定的含義,不能另作他用,如intforswitch等,
  2. 預定義識別符號,預先定義并具有特定含義的識別符號,如defineinclude等,
  3. 用戶識別符號,用戶自定義識別符號,符合命名規則且不能與關鍵字沖突,

2.2 常量與變數

2.2.1 常量

常量是指在程式運行程序中,其值不能改變的量稱為常量,常見的常量有以下幾類:

  1. 整形常量:如1000,12345,0,-345
  2. 實型常量:兩種形式,小數和指數(123.456和12.34e3)
  3. 字符常量:可以是一個普通的字符( 如x)、一個轉義序列(例 \t),或一個通用的字符(如 \u02C0
  4. 字串常量:如"boy""123"等,用雙撇號把若干字符括起來,字串常量是雙撇號里的全部字符
  5. 符號常量:用define指令,指定用一個符號名稱代表一個常量,如#define PI 3.14結尾沒有分號
轉義序列含義
\\ 字符
’ 字符
"" 字符
?? 字符
\a警告
\b退格鍵
\f換頁符
\n換行符
\r回車
\t水平制表符
\v垂直制表符
\o或\oo或\ooo其中o表示一個八進制數字一到三位的八進制數
\xh[h…]一個或多個數字的十六進制數

\ooo 是對用三位八進制數轉義表示任意字符的形象化描述,

例如 char ch = '\111'; 等價于 char ch = 0111; (以0開頭的表示八進制)

2.2.2 變數

int a = 3;

小丞

注意:變數必須先定義后使用,在變數取值時,實際上是通過變數名找到相應的記憶體地址,從該存盤單元中讀取資料

2.2.3 練習題

第一題:

下列定義變數的陳述句中錯誤的是______,

A、int int B、double int

C、char For D、float US$

答案:D

第二題:

以下不合法的用戶識別符號是______,

A、j2_KEY B、Double

C、4d D、_8_

答案:C

2.3 資料型別

小丞

2.3.1 整數型別

在這里插入圖片描述

注意

  1. int short int long int是根據編譯環境的不同,所取范圍不同

  2. int的取值范圍在于他占用的位元組數 ,不同的編譯器,規定是不一樣,

2.3.2 浮點型

浮點資料根據精度的不同分為3種

在這里插入圖片描述

注意:C語言中不存在字串變數,字串只能存在字符陣列中

2.3.3 型別轉換

1. 自動型別轉換

自動轉換發生在不同資料型別運算時,在編譯的時候自動完成

注意

只有位元組小的可以向位元組大的自動轉換,不可逆

#include <stdio.h>
int main()
{
    char c1, c2;
    c1 = 'A';
    c2 = c1 + 32;
    printf("%c\n", c2); // a
    printf("%d\n", c2); // 97
}

如上,自動的將c1轉化為ASCII碼再進行加法運算

2. 強制型別轉化

強制型別轉換是通過定義型別轉換運算來實作的,其一般形式為:

//(轉化型別)值
(double) a  // 將a轉化成double型別
(int) (x + y) //將x+y轉化成int型別 

%運算子要求其兩側均為整型量,若xfloat型,則x % 3不合法,則這時候就需要強制型別轉化了,(int)x % 3,因為強制型別轉換運算子優先于%運算,所以會先進行(int)x運算再進行取余運算

3. tips
  1. 轉換型別和運算式都必須加括號, 如把(int)(x / 3 + y)寫成(int)x / 3 + y則成了把x轉換成int型之后再除3再與y相加了,

  2. 強制轉換不存在四舍五入

  3. 強制型別轉換時,得到一個所需型別的中間資料,而原來變數的型別未發生變化

2.4 運算子和運算式

2.4.1 基本算術運算子

假定A = 10, B = 20

運算子描述實體
+把兩個運算元相加A + B 將得到 30
-從第一個運算元中減去第二個運算元A - B 將得到 -10
*把兩個運算元相乘A * B 將得到 200
/分子除以分母B / A 將得到 2
%取模運算子,整除后的余數B % A 將得到 0
++自增運算子,整數值增加 1A++ 將得到 11
自減運算子,整數值減少 1A-- 將得到 9

2.4.2 自增和自減運算子

自加運算子++與自減運算子--是單目運算子,運算的物件是變數,自增自減運算有兩種一種前綴,一種后綴,兩種運算式的值是有區別的,前綴是:先運算再取值,后綴是:先取值后運算

如:

#include<stdio.h>
int main() {
    int i = 3;
    printf("%d",++i); // 4
}

又如:可以很清楚的理解!

#include<stdio.h>
int main() {
    int i = 3;
    printf("%d",i++); // 3
}

2.4.3 邏輯運算子

假設變數 A 的值為 1,變數 B 的值為 0

運算子描述實體
&&稱為邏輯與運算子,如果兩個運算元都非零,則條件為真,(A && B) 為假,
||稱為邏輯或運算子,如果兩個運算元中有任意一個非零,則條件為真,(A || B) 為真,
!稱為邏輯非運算子,用來逆轉運算元的邏輯狀態,如果條件為真則邏輯非運算子將使其為假,!(A && B) 為真,

也就是說a并b有假則假,a或b有真則真

2.4.4 賦值運算子

簡單賦值運算子為=

int a = 3;// 給a賦值為3

復合賦值運算子就是在簡單賦值符之前加上其它運算子構成

例如+=-=*=/=

a += 3;等價于 a = a + 3

注意:復合運算子中運算子和等號之間不存在空格,

2.4.5 關系運算子

假設變數 A 的值為 10,變數 B 的值為 20

運算子描述實體
==檢查兩個運算元的值是否相等,如果相等則條件為真,(A == B) 為假,
!=檢查兩個運算元的值是否相等,如果不相等則條件為真,(A != B) 為真,
>檢查左運算元的值是否大于右運算元的值,如果是則條件為真,(A > B) 為假,
<檢查左運算元的值是否小于右運算元的值,如果是則條件為真,(A < B) 為真,
>=檢查左運算元的值是否大于或等于右運算元的值,如果是則條件為真,(A >= B) 為假,
<=檢查左運算元的值是否小于或等于右運算元的值,如果是則條件為真,(A <= B) 為真,

2.4.6 三目運算子

三目運算子的格式為:

運算式1 ? 運算式2 : 運算式3; 

如果運算式1為真則值為運算式2,否則為運算式3

如:

#include <stdio.h>
int main()
{
    int a = 10;
    int b;
    b = (a == 4) ? 1 : 2;
    printf("b 的值是 %d\n", b); // b 的值是 2
}

2.4.7 運算子優先級

初等運算子的優先級別最高,然后是單目運算子算術運算子關系運算子邏輯運算子(除邏輯非!)條件運算子賦值運算子逗號運算子,大多數都是自左向右結合,而單目運算子、條件運算子和賦值運算子自右向左結合

運算子優先級及結合性匯總自上向下優先級降低

類別運算子結合性
后綴() [] -> . ++ - -從左到右
一元+ - ! ~ ++ - - (type)* & sizeof從右到左
乘除* / %從左到右
加減+ -從左到右
移位<< >>從左到右
關系< <= > >=從左到右
相等== !=從左到右
位與 AND&從左到右
位異或 XOR^從左到右
位或 OR|從左到右
邏輯與 AND&&從左到右
邏輯或 OR||從左到右
條件?:從右到左
賦值= += -= *= /= %=>>= <<= &= ^= |=從右到左
逗號,從左到右

菜鳥教程中的運算子優先級

2.4.8 練習題

復習了這么多關于運算子的知識,來練幾道題吧

第一題:
#include <stdio.h>
int main()
{
    int a = 1, b = 2, c = 4, d = 8;
    int e;
    e = (a + b) * c / d;
    printf("e的值是 %d\n", e); 
}
//輸出 :e的值是 1
第二題:

這題要好好思考噢

int main()
{
    int x = 12, n = 5;
    x %= (n % 2);
    printf("%d", x);
}
// 輸出: 0

n % 2余數是1,12對1取余為0

第三題:

在C語言中,字符型資料在記憶體中的存盤形式是

A)原碼 B)補碼 C)反碼 D)ASCII碼

答案: D

第四題:

若執下面程式時從鍵盤上輸入5,

#include <stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    if(x++ > 5) {
        printf("%d", x);
    }else {
        printf("%d", x--);
    }
}

則輸出是______,

A、7 B、6 C、5 D、4

答案:B

第五題:

做對這題才算真真掌握噢~

設有陳述句int a = 3;則執行陳述句a += a -= a * a后,變數a的值是(  ),

(A) 3   (B) 0   ? 9    (D) -12

答案:D

上面的陳述句可以轉換成:

int a = 3;
a -= (a * a);//*優先級高,先計算a*a為9,此時a -= 9;即 a = a - 9; a = -6
a += a // a = a + a; a = -6 + (-6),a = -12

2.5 C陳述句

在這里插入圖片描述

2.5.1 if陳述句

if(運算式) { 執行內容 }

如果運算式為真,則執行{}里的內容,否則將跳過不執行該code

2.5.2 if…else 陳述句

if(運算式) {
	代碼塊1;
}else {
	代碼塊2;
}

如果運算式的值為真,則執行代碼塊1,否則執行代碼塊2

注意ifelse后面都沒有分號噢~

2.5.3 switch陳述句

switch (運算式)
{
case 情況1:
    執行體1;
    break;
case 情況2:
    執行體2;
    break;
default:
    執行體3;
}

簡單解釋一下就是判斷運算式的幾種情況執行不一樣的代碼

注意

  1. case后的情況不能相同
  2. 每個case都需要有一個break陳述句
  3. switch運算式只能是整型或者字符型別

重點switch陳述句最大的好處是它能夠簡化if陳述句

2.5.4 while回圈

while(運算式) {
	回圈體代碼
}

當運算式為真時會執行回圈體代碼,執行體代碼結束后,會再次判斷運算式是否為真,回圈往復,直至運算式為假

注意:回圈體代碼內應該改變回圈變數的值,否則會出現死回圈

2.5.5 do … while 回圈

do{
	回圈體代碼
}while(回圈條件);

它先執行一次回圈體代碼,然后判斷while中的回圈條件是否為真,如果為真則繼續回圈;如果為假,則終止回圈,所以很重要的一點就是,do-while回圈至少會執行一次回圈體代碼

注意:while括號后必須有分號

2.5.6 for回圈

for(運算式1;運算式2;運算式3) {
	執行體代碼;
}

for回圈是最最最最重要的一個內容了,在考試中常常會要用到!

  1. 執行運算式1,對變數進行初始化
  2. 判斷運算式2,若為真,則執行for回圈體中執行體代碼,代碼執行完畢
  3. 執行運算式3,對回圈變數進行操作
  4. 再進行第二步,直至判斷運算式為假
  5. 回圈結束,程式繼續向下執行,
#include <stdio.h>
int main ()
{
   for( int a = 10; a < 20; a = a + 1 )
   {
      printf("a 的值: %d\n", a);
   }
 
   return 0;
}
/*輸出:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
*/

2.5.7 break陳述句

  1. break 陳述句出現在一個回圈內時,回圈會立即終止,且程式流將繼續執行緊接著回圈的下一條陳述句,
  2. 它可用于終止 switch 陳述句中的一個 case
#include <stdio.h>
int main()
{
    int a = 5;
    while (a < 10)
    {
        printf("a的值%d\n", a);
        a++;
        if (a == 7)
        {
            break;
        }
    }
    return 0;
}
/*
a的值5
a的值6  */

正如上面的代碼中當a == 7時執行了break陳述句跳出了while回圈,因此使得輸出陳述句只有兩條

2.5.8 continue陳述句

continue會跳過當前回圈中的代碼,強迫開始下一次回圈,

#include <stdio.h>
int main()
{
    int a = 5;
    while (a < 10)
    {
        a++;
        if (a == 7)
        {
            continue;
        }
        printf("a的值%d\n", a);
    }
    return 0;
}
/* a的值6
a的值8
a的值9
a的值10 */

從上面的代碼可以看出,在a==7時遇到了continue則后面的代碼就不會再執行了,而是重新開始下一輪回圈

區別:break會終止整個回圈,而continue只是提前結束本輪回圈,

2.5.9 goto陳述句

goto陳述句可以將代碼執行跳轉到標記的位置,雖然這看起來很方便,但會使得程式得控制難以跟蹤,所以不推薦使用goto陳述句,僅作了解

goto here;
...
here:

2.5.10 練習題

答案在習題結束噢~

第一題:

若i為整型變數,則以下回圈的次數是

for (i = 2; i == 0;) {printf("%d", i–); }

A) 無限次 B) 0次 C) 1次 D) 2次

第二題:

下面這段程式運行后i的值是( )

A)11  B)13  C)12  D)14

#include <stdio.h>
int main()
{
    int i = 10;
    switch (i + 1)
    {
    case 10:
        i++;
        break;

    case 11:
        ++i;

    case 12:
        ++i;
        break;
    default:
        i = i + 1;
    }
}

第三題:

C陳述句for(;😉{…}是指(  ),

(A)無意義    (B)無限回圈    ?回圈執行1次   (D)回圈執行0次

第四題:

#include <stdio.h>
int main()
{
    int y = 10;
    while(y--);
    printf("y=%d",y);
}

以上程式執行后的輸出結果是

A、y=0 B、y=-1 C、y=1 D、while構成無限回圈

答案:B C B B

要點:第一題要注意for回圈的程序,要先判斷是否滿足條件才會執行回圈體,第二題要理解++ii++的區別,同時也要注意case后面沒有break的后果,

2.6 資料的輸入輸出

2.6.1 printf函式輸出

格式為:printf(格式控制,輸出串列),輸出控制是用一對雙引號括起來的,包含格式宣告和普通字符,輸出串列是程式需要在輸出時原樣輸出的字符,

在這里插入圖片描述

2.6.2 scanf函式輸入

從鍵盤獲得用戶輸入,格式為:scanf(格式控制,地址表列)

#include <stdio.h>
int main()
{
    int a;
    scanf("%d",&a); // 輸入:23
    printf("%d",a); // 輸出:23
}

printf非常相似,但注意點有很多

注意

  1. scanf 的變數前要帶一個&符號,&叫做取地址符,也就是獲取變數在記憶體中的地址,
  2. 如果除了格式宣告還寫了其他東西,則在輸入資料時在對應位置上輸入與這些相同的字符,如:
scanf("a=%d,b=%d",&a,&b);
//輸入格式:a=1,b=2

2.6.3 putchar函式輸出

這個函式一次只會輸出一個單一的字符,但是可以在回圈內使用這個方法,以便輸出多個字符,

#include <stdio.h>
int main()
{
    char a = 'B';
    putchar(a);
}

注意:一次只能輸出一個字符,putchar()括號中可以填寫字符以及在ASCII內的整型

2.6.4 getchar函式輸入

這個函式一次只會讀取一個單一的字符

#include <stdio.h>
int main()
{
    char a,b;
    a = getchar();
    b = getchar();
    putchar(a);
    putchar(b);
}

輸入jc 輸出jc

注意:在鍵入資訊時,字符會暫存在快取區中,只有在按下回車時,才會將輸入的字符送往計算機,按順序賦值

2.6.5 puts函式輸出

用來輸出字串并換行

#include <stdio.h>
int main(){
	char str[]="i am ljc";
	puts(str); // i am ljc
	return 0;
} 

注意

  1. 只能輸出字串,不能輸出數值或格式轉換,
  2. 會自動輸出一個回車符
  3. 將字串結束符\0轉換成\n

2.6.6 gets函式輸入

gets() 也存在緩沖區概念,當按下回車鍵時,就代表輸入結束了,gets() 開始從緩沖區中讀取內容,gets()scanf()主要區別是:

  • scanf() 讀取字串時以空格為分隔,遇到空格就認為當前字串結束了,所以無法讀取含有空格的字串,
  • gets()中空格也是字串中的一部分,只有遇到回車鍵時才會認定字串輸入結束,所以,不管輸入了多少空格,只要沒有回車,對 gets() 來說就是一個完整的字串,

2.7 練習題

第一題:

有以下程式

#include <stdio.h>
int main()
{
    char c1 = '1', c2 = '2';
    c1 = getchar();
    c2 = getchar();
    putchar(c1);
    putchar(c2);
}

當運行時輸入:a <回車> 后,以下敘述正確的是______,

A、變數C1 被賦予字符a,c2被賦予回車符

B、程式將等待用戶輸入第2個字符

C、變數c1被賦予字符a,,c2中仍是原有字符2

D、變數c1 被賦予字符a,c2中將無確定值

答案:A

第二題:

執行下列程式時輸入:123<空格>456<空格>789<回車>,輸出結果是______,

#include <stdio.h>
int main()
{
    char s[100];
    int c, i;
    scanf("%c", &c);
    scanf("%d", &i);
    scanf("%s", s);
    printf("%c,%d,%s \n", c, i, s);
}

A、123,456,789 B、1,456,789

C、1,23,456,789 D、1,23,456

答案:D

2.7 格式字符

2.7.1. d格式符

用來輸出一個有符號的十進制整數

注意:可以在格式宣告中指定輸出資料的域寬"%5d",指定輸出資料占5列,輸出的資料顯示在此5列區域右側

printf("%5d\n%5d\n",12, -345);

輸出結果:

   12(前3個空格)
 -345(前1格空格)

2.7.2. c格式符

用來輸出一個字符

char ch = 'a';
printf("%c",ch);// 輸出a

同樣的可以指定域寬printf("%5c",ch)輸出a前有4個空格

注意:在0-127的整數也可以用%c輸出,在輸出之前會轉換成對應的ASCII碼,如果整數比較大則輸出第一個位元組的資訊對應的字符

short a = 121;
printf("%c", a); // y

當數比較大時

int a = 377;
printf("%c", a); // y

因為以%c格式輸出,所以只考慮第一個位元組,a在記憶體中的存放方式是這樣的,第一個位元組所對應的十進制為121,對應y

在這里插入圖片描述

2.7.3. s格式符

用來輸出一個字串

printf("%s","china");// 輸出: china

2.7.4. f格式符

用來輸出實數,以小數形式輸出

  1. 基本型,%f

不指定輸出資料長度,由系統來決定資料所占的列數,一般是小數輸出6位

double a = 1.0;
printf("%f",a/3);// 輸出: 0.333333

輸出了6個3

  1. 指定資料的寬度和小數位數,用%m.nf

這里的意思是指定域寬為m,小數點后保留n位數字

double a = 1.0;
printf("%7.2f",a/3);// 輸出:   0.33(前面有3個空格噢)

注意

  • 如果n為0,則不僅不輸出小數,也不輸出小數點

  • 如果n的值過大,也不能保證全部輸出,原因之一是double型別資料只能保證15位有效數字

  1. 輸出的資料向左對齊,用%-m.nf

當資料長度不超過m時,資料向左靠齊,右邊補空格

2.7.5. e格式符

以指數形式輸出

printf("%e",123.456);// 輸出:1.234560e+002

如果不指定輸出的寬度和數字部分的小數位數,將以小數部分6位,指數部分5位來定

在這里插入圖片描述

2.7.6. 格式字符匯總

格式字符說明
d,i以帶符號的十進制形式輸出整數(正數無符號)
o以八進制無符號形式輸出整數(不輸出前導符0)
x,X以十六進制無符號形式輸出整數(不輸出0x)
u以無符號十進制形式輸出整數
c字符形式輸出,只輸出一個字符
s輸出字串
f以小數形式輸出單,雙精度,默認6位小數
e,E以指數形式輸出實數,用e則出e,用E則顯示E
g,G選用%f或%e格式中輸出寬度較短的一種格式,不輸出無意義的0,用G時,若以指數形式輸出,則指數以大寫顯示

2.7.7 練習題

第一題:

以下程式的輸出結果是()

int a = 1234;
printf("%2d",a)

A) 12 B) 34 C)1234 D) 提示錯誤,無結果

答案:C

第二題:

已知字母A的ASCII碼為十進制的65,下面程式的輸出是______,

#include <stdio.h>
int main()
{
    char ch1, ch2;
    ch1 = 'A' + '5' - '3';
    ch2 = 'A' + '6' - '3';
    printf("%d,%c\n", ch1, ch2);
}

A、67,D B、B,C C、C,D D、不確定的值

答案:A

2.8 程式設計題目

第一題:

撰寫列印如下圖形的程式(要求實作讀取用戶輸入,列印幾行圖形,用回圈實作),示例:輸入4

在這里插入圖片描述

輸入5

在這里插入圖片描述

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

第二題:

經典題目:輸入一個年份判斷是閏年還是平年

#include <stdio.h>
int main()
{
    int i;
    printf("請輸入一個年份:");
    scanf("%d", &i);
    if (i % 100 == 0)
    {
        if (i % 400 == 0)
        {
            printf("%d是閏年\n", i);
        }
        else
        {
            printf("%d是平年\n", i);
        }
    }
    else if (i % 4 == 0)
    {
        printf("%d是閏年\n", i);
    }
    else
    {
        printf("%d年是平年", i);
    }
    return 0;
}

第三題:

撰寫程式:計算20到30的每個整數立方根之和(保留小數點后兩位)

#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    double s = 0;
    for (i = 20; i <= 30; i++)
    {
        s = s + pow(i, 1.0 / 3); //如果平方根改為s=s+sqrt(i);
    }
    printf("%.2f\n", s);
    return 0;
}

3. 陣列

陣列是一組具有相同型別的資料的集合,這些資料稱為陣列元素

3.1 一維陣列

格式為:型別符 陣列名[常量運算式],陣列的所占位元組數為元素個數與基型別所占位元組數的乘積,

3.1.1 一維陣列的初始化

三種方式

  1. int array[5] = {1,2,3,4,5}
  2. int array[] = {1,2}
  3. int array[2]; a[0] = 1;a[1]=2;

注意:

  1. 下標從0開始
  2. 陣列內元素的個數不能大于宣告的陣列長度
  3. 當元素個數小于陣列的長度時,多余的陣列元素初始化為0

3.1.2 參考一維陣列元素

陣列元素可以通過陣列名稱加索引進行訪問,格式為:陣列名[下標]

int a = b[1];

3.1.3 遍歷一維陣列

通過回圈的方式可以寫入和訪問陣列元素,而不用人為的每次獲取指定某個位置上的元素

#include <stdio.h>
int main()
{
    int i, a[10];
    for (i = 0; i <= 9; i++)
    {
        a[i] = i;
    }
    for (i = 9; i >= 0; i--)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

上面的程式實作了給陣列a賦值0-9,再按照下標大到小輸出這10個元素

注意

  1. 避免陣列越界訪問,回圈變數i不要超過陣列的長度
  2. C語言中不存在length方法😢,需要通過sizeof來計算陣列長度
int length = sizeof(arr) / sizeof(arr[0])

3.1.4 利用陣列輸出斐波那契數列

輸出斐波那契數列的前20項,每5個換行

#include <stdio.h>
int main()
{
    int i;
    int f[20] = {1, 1}; //斐波那契數列前兩位賦初值
    for (i = 2; i < 20; i++)
    {
        f[i] = f[i - 2] + f[i - 1];
    }
    for (i = 0; i < 20; i++)
    {
        if (i % 5 == 0)
        {
            printf("\n");
        }
        printf("%d ", f[i]);
    }
    return 0;
}

輸出:

在這里插入圖片描述

3.2 二維陣列

多維陣列中最簡單的就是二維陣列,二維陣列有兩個下標,用來確定它在陣列中的位置,二維陣列可以被認定為是一個由行列組成的方陣,但是在記憶體中是線性的,按行依次來進行存放

格式為:型別說明符 陣列名[常量運算式] [常量運算式]

3.2.1 二維陣列的初始化

第一種

int num[2][3] = {{1,2,3},{4,5,6}};

在這里插入圖片描述

第二種

int num[2][3];
num[1][1] = 2;

第三種

int a[2][3] = {1,2,3,4,5,6}

注意:

  1. 由于系統會根據陣列中元素的總個數來分配空間,所以當知道元素總個數以及列的維數后,會計算出行的維數
  2. 二維陣列定義時可以不指定行,但是一定要指定列

3.2.2 參考二維陣列元素

格式為:陣列名[下標] [下標]

如:a[1][2]

注意:

  1. 陣列元素可以出現在運算式中,可以被賦值b[1][2] = a[2][3]/2
  2. 在參考陣列元素時,下標應在已經定義的陣列大小的范圍內int a[3][4],但是不存在a[3][4]元素噢~

3.2.3 遍歷二維陣列

遍歷二維陣列采用的方式是雙重for回圈,變數i用來遍歷行,j用來遍歷列

#include <stdio.h>
int main()
{
    int num[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%d", num[i][j]);
        }
    }
}

3.2.3 練習題

第一題
#include <stdio.h>
int main()
{
    int i;
    int x[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    for(i = 0;i<3;i++) {
        printf("%d ",x[i][2-i]);
    }
}

上面程式的輸出結果是

A、1 5 9 B、1 47 C、3 5 7 D、3 6 9

答案:C

第二題

以下能正確定義陣列并正確賦初值的陳述句是______,

A、int N=5,b[N][N];

B、int a[1][2]={{1},{3}};

C、int c[2][]={{1,2},{3,4}};

D、int d[3][2]={{1,2},{3,4}};

答案:D

3.3 字符陣列

在C語言中沒有字串型別,也沒有字串變數,字串是存放在字符型陣列中的,

我們把用來存放字符資料的陣列稱為字符陣列,陣列中的每一個元素記憶體放著一個字符

3.3.1 字符陣列初始化

  1. char 字串名稱[長度] = "字串"
  2. char 字串名稱[長度]= {'字符','字符'}

注意

  1. []中的長度可以省略不寫
  2. 采用第二種方式定義陣列,最后一個元素必須為\0
  3. 如果初值個數小于陣列長度,則后面自動補為\0\0為字串結束的標志

3.3.2 遍歷輸出字符陣列中的元素

#include <stdio.h>
int main()
{
    char c[] = "I am ljc";
    for (int i = 0; i < sizeof(c) / sizeof(c[0]); i++)
    {
        printf("%c", c[i]);
    }
    return 0;
}

先定義一個字符陣列,然后通過for回圈來訪問輸出字符陣列中的字符

3.3.3 字串的結束符

  • 在存盤字串時,系統會自動在其尾部加上一個空值\0,同時要占用一個位元組,因此字串ljc需要占四個位元組,

  • 因此字符陣列的大小要比它將要實際存放的字串多一個元素,用來存放\0

char c[] = "i am\0  ljc";
printf("%s\n",c);

由于\0為字串的結束標志,在輸出字串陣列時遇到\0就會停止輸出,因此只會輸出i am

3.3.4 字串的輸入輸出

  1. 逐個字符輸入輸出,采用格式符%c輸入或輸出一個字符
  2. 將整個字串輸入輸出,采用%s格式符,如printf("%s\n",c);

注意

  1. 輸出的字符中不包括\0
  2. 通過%s輸出時,輸出表列填寫的是陣列名稱,而不是陣列元素
  3. 遇到第一個\0就結束
  4. 在采用scanf輸入字串時,直接使用陣列名稱,不需要采用取地址符,因為陣列名代表了陣列的起始地址

特別注意

char str[13];
scanf("%s",str);

對于上面的代碼,當輸入i am ljc時,只會把i存入陣列當中,這是因為系統把空格當作了字串之間的分隔符

3.3.5 練習題

若有定義和陳述句:

則結果是(以下u代表空格) ______,

A、輸出abcd B、輸出a

C、輸出abcduuuuu D、編譯不通過

char s[10];
s = "abcd";
printf("%s\n",s);

答案:D

3.4 字串處理函式

在使用之前需要引入頭檔案string.h

序號作用
strcpy(s1, s2);復制字串 s2 到字串 s1,
strcat(s1, s2);連接字串 s2 到字串 s1 的末尾,
strlen(s1);回傳字串 s1 的長度,
strcmp(s1, s2);如果 s1 和 s2 是相同的,則回傳 0;如果 s1<s2 則回傳小于 0;如果 s1>s2 則回傳大于 0,
strchr(s1, ch);回傳一個指標,指向字串 s1 中字符 ch 的第一次出現的位置,
strstr(s1, s2);回傳一個指標,指向字串 s1 中字串 s2 的第一次出現的位置,

3.4.1. strcat函式

字串連接函式,它的作用是把兩個字符陣列中的字串連接起來

使用方法

strcat(字符陣列1,字符陣列2)

下面程式輸出i am ljc i am 18

#include<stdio.h>
#include <string.h>
int main() {
    char str1[] = "i am ljc ";
    char str2[] = "i am 18";
    printf("%s",strcat(str1,str2));
}

3.4.2. strcpy函式

字串復制函式,作用是將字串2復制到字符陣列1中

使用方法

strcpy(字符陣列1,字符陣列2)

輸出:china

#include<stdio.h>
#include <string.h>
int main() {
    char str1[] = "ljc";
    char str2[] = "china";
    printf("%s",strcpy(str1,str2));
}

該方法會覆寫原來的字串,并且不能拷貝字串常量

注意:可以使用strncpy函式來指定復制字串的字符數,例如strncpy(str1,str2,2),作用是將str2中的前2個字符復制到str1中原有的前兩個字符,

輸出:chinajc

#include<stdio.h>
#include <string.h>
int main() {
    char str1[] = "nameljc";
    char str2[] = "china";
    printf("%s",strncpy(str1,str2,5));
}

3.4.3. strcmp函式

字串比較函式,作用是比較字串1和字串2

比較的規則:將兩個字串自左向右逐個字符按照ASCII碼值大小比較,直到出現不同的字符或者遇到\0結束

  1. 如果全部字符相同則認為兩個字串相等
  2. 若出現不相同的字符,則以第一對不相同的字符的比較結果為準

比較結果由函式值帶回

  1. 如果字串1和字串2相同,則函式值為0
  2. 如果字串1大于字串2,則函式值為1個正整數
  3. 如果字串1小于字串2,則函式值為1個負整數

使用方法

下面的程式輸出1,表示字串1小于字串2

#include<stdio.h>
#include <string.h>
int main() {
    char str1[] = "nameljc";
    char str2[] = "china";
    printf("%d",strcmp(str1,str2));// 1
}

3.4.4. strlen函式

測字串長度的函式,作用是檢測字串長度

使用方法

strlen(str)

輸出:5,可見輸出的是字串的實際長度,不包括\0

#include<stdio.h>
#include <string.h>
int main() {
    char str[] = "china";
    printf("%d",strlen(str));
}

3.4.5. strlwr函式

將大寫轉換為小寫的函式

使用方法

strlwr(字串)

輸出:ljc

#include<stdio.h>
#include <string.h>
int main() {
    char str[] = "LJC";
    printf("%s",strlwr(str));
}

3.4.6. strupr函式

將小寫轉換為大寫的函式

使用方法

strupr(字串)

輸出:I AM LJC

#include<stdio.h>
#include <string.h>
int main() {
    char str[] = "i am ljc";
    printf("%s",strupr(str));
}

3.4.7 練習題

函式呼叫:strcat(strcpy(str1,str2),str3)的功能是______,

A、將串str1復制到串str2中后再連接到串str3之后

B、將串str1連接到串str2之后再復制到串str3之后

C、將串str2復制到串str1中后再將串str3連接到串str1之后

D、將串str2連接到串str1之后再將串str1復制到串str3中

答案:C


博主累了,碼了幾天,已經碼了上萬字了,自己也是一邊復習一邊整理,感徑訓不錯噢,相信你也一定能夠學到很多噢!掛科不存在的!下集預計在下周一發出,大家先收藏好吧~

小丞

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286805.html

標籤:其他

上一篇:laravel 5.8 使用jwt驗證

下一篇:[C++] 什么! 你說你不懂C++? 看這里C++基礎超詳細,看一眼就入門

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more