這節課筆記的排版有點問題,感覺是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 循環的嵌套
#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;
}
為什麼要使用無參宏???
- 便於代碼的修改
- 安全,因為這是一個常量,無法在運行中去修改值
- 起了一個名字,增強了可讀性
無參宏的本質就是 替換
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;