博客 / 詳情

返回

小凱15天快速講完c語言-簡單學習第四課

這節課筆記的排版有點問題,感覺是markdown語法有問題,當然不排除思否社區的排版問題,哈哈哈,已反饋官方啦,大家湊合看。

0. 複習

0.1 運算符

1.賦值
注意的點:
// 定義變量的時候,給的值 這時叫做初始化。
int a = 0;
int b = 10;
int c = 0;
// 定義完變量,再去給值,這個就叫賦值
a = 100; //正確的
100 = a; //錯誤的
a = b = c = 500;
複合賦值運算
a+=b; //相當於 a = a+b;
2.算術運算符
有幾個:+ - * / % ++ --
需要注意的:
除法運算:兩個整數相除,結果就是一個整數
取模運算:參與運算的兩個數,必須是整數 取模運算經常被用於判斷A是不是B的倍數
自增自減:自增自減的同時參與了其他運算,前置自增是先自增,再參與其他運算,後置,反過來。 3. 取地址

獲取一個變量的地址,經常用於scanf_s 輸入數據
注意:數組的名字,就是數組的起始地址

4.sizeof

求得一個數據類型或者一個已經定義好的變量的大小
 int a= 200; 
 sizeof(int)  就是4
 sizeof(a)    也是4
 int  arr[8] = {0};
 sizeof(arr);  這個就是32 

5.逗號

 他是優先級最低的運算符

6.關係運算符

>    >=   < <=  ==  !=   他們是用於比較大小關係的,結果只能是 true 或者false
true和false  是bool類型。
從數值上看  true  就是1    false 就是0

7.邏輯運算符

&&     
||    
!

0.2 數組

定義:
數據類型 數組名[數組長度] = {初始值};
使用:

   數組名[數組下標] = 數值;

比如:

  int   arr[10] = {0};
  arr[2] = 100; 
 scanf_s("%d",&arr[2]);

數組名是下標,給0號元素輸入數據的時候,可以寫成下面的方式:

 scanf_s("%d",arr);
 scanf_s("%d",&arr[0]);

注意:
如果數組有10個元素,那麼下標就是 0~9
數組越界,一般是比較難以尋找的BUG
字符數組
char arr[20] = "hello";
如果想要用字符數組當成字符串使用,一般就可以直接使用數組名。
scanf_s("%s",arr,20);
如果想要打印:
printf("%s",arr);

還有四個函數:
strlen 求長度 注意 不算結尾的0
strcpy 拷貝 注意使用安全版
strcat 拼接 也是使用安全版
strcmp 比較 相等0 不等為非0

每一個函數,都有對應的wchar版本的函數。

0.3 三大結構

順序
選擇
a 單if
if()
{
}
b if-else
if()
{
}
else
{
}
c if-else-if
if()
{
}
else if()
{
}
else if()
{
}
else if()
{
}
else
{
}
switch-case
switch(數值)
case 常量1:
break;
case 常量2:
break;
case 常量3:
break;
default:
都不匹配執行這個

1.循環

while()
{

}

輸出0-100的值(實際有很多種方法,能輸出即可)

1.1while循環輸出

`

include <stdio.h>

include <stdlib.h>

int main()
{

//第一種方法:循環輸出0到100
int n = 1;
int nNum = 0;
while (n<=101)
{
    printf("%d ", nNum);
    nNum++;
    n++;
}
printf("\n");
```

//第二種方法:循環輸出0到100

int nNum1 = 0;
while (nNum1 <= 100)
{
    printf("%d ", nNum1);
    nNum1++;
}

return 0;

}
`

2.do-while循環


#include <stdio.h>
#include <stdlib.h>

int main()
    {
        int i = 0;
        do
        {
            printf("%d\n", i);
            i++;
        }
        while (i < 100);
        return 0;
    }

3.for循環

#include <stdio.h>
#include <stdlib.h>
int main()
{
    //輸出0~100
    for (int i = 0; i <= 100; i++)
    {
        printf("%d ", i);
    }
    return 0;
}

關於for的總結:
1.for有三條語句,第一句 用於初始化一個循環變量 第二句 用於控制循環條件 第三句 用於循環變量的變化。
2.三條語句規範上,應該按照以上的寫法,實際上,寫什麼都行

1.4 關於三種循環的總結

1.三種循環一般情況下,是可以相互替換的。
2.當明確循環次數的時候,一般使用for循環,不能明確循環次數的時候,一般使用while循環。
3.while和for有可能一次循環體都不執行,do-while 至少執行一次循環體

對於while和for while就是簡化版的for

for (; ;)

{
    printf("我是循環體\n");
}

while (1)
{
    printf("我是循環體\n");

}

1.5無限循環

當循環條件一直為真的時候,就會無限循環。也稱之為死循環

1.6 break和continue

break是結束循環
continue 是結束本輪循環,直接開始下一輪循環

1.輸出0~100以內的所有偶數---要求使用continue

#include <stdio.h>
#include<stdlib.h>
int main()
{

for(int i=0;i<=100;i++)
{
    if (i % 2 == 1)
    {
        continue;
    }
    else
    {
        printf("%d", i);
    }
    system("pause");
    return 0;


2.假如咱們有一個數組 int arr[8] = {5,3,6,7,1,2,9,0},從鍵盤上輸入一個數字,判斷這個數字在不在數組中,如果在的話,輸出他的下標,如果不在的話,輸出NO---使用break

//2. 假如咱們有一個數組  int  arr[8] = { 5,3,6,7,1,2,9,0 },
    //    從鍵盤上輸入一個數字,判斷這個數字在不在數組中,
    //    如果在的話,輸出他的下標,如果不在的話,輸出NO-- - 使用break
    int  arr[8] = { 5,3,6,7,1,2,9,0 };
    int nNum = 0;
    printf("請輸入一個整數:");
    scanf_s("%d", &nNum);
    //_contof是用來獲取數組元素的個數的
    //比如這個位置_countof(arr) 就是8
    //這個代碼是有問題的
    //for (int i = 0; i < _countof(arr); i++)
    //{
    //    if (nNum == arr[i])
    //    {
    //        printf("%d\n", i);
    //        break;
    //    }
    //    else
    //    {
    //        printf("NO\n");
    //    }
    //}
    //如何能夠比較好的處理這種,找到還是沒找到的問題
    //方法2:使用下標去判斷
    //int i = 0;
    //for (; i < 8; i++)
    //{
    //    if (nNum == arr[i])
    //    {
    //        break;
    //    }
    //}
    //if (i == 8)
    //{
    //    printf("NO\n");
    //}
    //else
    //{
    //    printf("%d\n", i);
    //}
    //方法2:使用標記
    bool nFind = false;
    for (int i = 0; i < 8; i++)
    {
        if (nNum == arr[i])
        {
            printf("%d\n", i);
            nFind = true;
            break;
        }
    }
    if (nFind == false)
    {
        printf("NO\n");
    }
    return 0;

1.7 循環的嵌套

圖片.png

#include <stdio.h>
#include <stdlib.h>
int main()
{

for (int i = 1; i <= 9; i++)
{
    for (int n = 1; n <= i; n++)
    {
        printf("%d ", n);
    }
    printf("\n");
}

//for (int n = 1; n <= 1; n++)
//{
//    printf("%d ", n);
//}
//printf("\n");
////....
//for (int n = 1; n <= 7; n++)
//{
//    printf("%d ", n);
//}
//printf("\n");
//for (int n = 1; n <= 8; n++)
//{
//    printf("%d ", n);
//}
//printf("\n");
//for (int n = 1; n <= 9; n++)
//{
//    printf("%d ",n);
//}
//printf("\n");
return 0;

}

練習2:打印99乘法表

 #include <stdio.h>
 #include <stdlib.h>
int main()
{
    //打印一個99乘法表
    for (int i = 1; i <=9; i++)
    {
        for (int n = 1; n <= i; n++)
        {
            printf("%d*%d=%d ", n, i, n * i);
        }
        printf("\n");
    }



//for (int n = 1; n <= 8; n++)
//{
//    printf("%d*%d=%d ", n, 8, n * 8);
//}
//printf("\n");
//for (int n = 1; n <=9; n++)
//{
//    printf("%d*%d=%d ", n, 9, n * 9);
//}
//printf("\n");
}

練習3:雞兔同籠
方法1:

#include <stdio.h>
#include <stdlib.h>
 int main()
{
    //雞    i只
    //兔子  j只
    //i+j==40 
    //2*i+4*j == 110
    int n = 0;
    bool bSign = false;
    for (int i = 0; i <=40; i++)
    {
        for (int j = 0; j <= 40; j++)
        {
            if (i+j==40&&2*i+4*j==110)
            {
                printf("雞的數量是%d 兔子的數量是%d\n", i, j);
                bSign = true;
                break;
            }
            n++;
        }
        if (bSign == true)
        {
            break;
        }
    }
    printf("內層循環執行了%d次", n);
    return 0;
}

方法2:

for (int i = 0; i < 40; i++)
    {
        if (i * 2 + (40 - i) * 4 == 110)
        {
            printf("雞的數量是%d 兔子的數量是%d\n", i, 40 - i);
            break;
        }
    }

2. 預處理

以#開頭的命令,稱之為預處理命令。
在編譯之前,對於源代碼進行一些 複製 粘貼 替換的操作。

2.1 #include包含

#inlucde的作用,就是將頭文件複製粘貼到命令所在的位置。
有兩種用法:
#include <文件名.h>
#include "文件名.h"
尖括號 <>和雙引號 "" 有什麼區別呢???
<>是去系統目錄尋找頭文件。所以一般庫函數的頭文件,都使用 <>
“” 先到工程所在的當前目錄中尋找文件,找不到,再去系統目錄裏面找。
一般情況下,系統的頭文件,都使用 <>
自己工程的頭文件,都使用 " "

2.2 #define 宏定義

2.2.1 無參宏
經常會被用於定義一個符號常量

#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415926
int main()
{
    //假如我們編寫了一個UFO的程序
    //在這個程序中有100萬個地方用到了圓周率
    //double pi = 3.1415926;
    double r = 4.8;
    double s = 0;
    double l = 0;
    //........
    //s = 3.141592 * r * r;
    s = PI * r * r;
    //這裏有10萬行代碼
    //l = 2 * 3.141592 * r;
    l = 2 * PI * r;
    return 0;
}

為什麼要使用無參宏???

  1. 便於代碼的修改
  2. 安全,因為這是一個常量,無法在運行中去修改值
  3. 起了一個名字,增強了可讀性
    無參宏的本質就是 替換

2.2.2 有參宏
可以給替換的位置,填充一個參數

#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415926
#define GETS(r) PI*r*r
//有參宏的侷限性
#define M(n) n*n
int main()
{
    double r1 = 4.8;
    double r2 = 8.7;
    double s = 0;
    double l = 0;
    //好多代碼
    s = PI * r1 * r1;
    s = GETS(r1);//PI*r1*r1
    //好多代碼
    //s = PI * r2 * r2;
    s = GETS(r2);

    //有參宏的侷限性:
    int n = M(8);// 8*8
    printf("%d", n);
    int m = M(4+4);//宏是純替換,不會先把4+4算出來,再去替換
                   //所以結果就是:4+4*4+4  也就是24了
    printf("%d", m);
    return 0;

3.二維數組

include <stdio.h>

include <stdlib.h>

int main()
{

int arrTest4[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int arrTest1[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int arrTest2[3][4] = { {1,2,3},{4,5},{6} };
int arrTest3[][4] = { {0},{0} };//相當於是2行

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++)
    {
        printf("%d  ", arrTest1[i][j]);
    }
    printf("\n");
}


return 0;
user avatar shadowck 頭像 dhero 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.