複習上一課
0.1 如何將一個十進制數轉為二進制數?
整數部分:逆序取餘
小數部分:正向取整
例題:20.28
整數部分:
20/2 10 0
10/2 5 0
5/2 2 1
2/2 1 0
1/2 0 1
小數部分:
0.28*2 0.56 0
0.56*2 1.12 1
0.12*2.....
結果就是:10100.01
0.2 如何將一個二進制數轉為十進制數?
將各個位所代表的權值 加到一起
5 4 3 2 1 0 -1 -2 -3
1 1 0 1 1 0. 1 0 1
32 + 16+0+4+2+0 + 0.5 +0 + 0.125
結果:54.625
0.3 如何在二進制和十六進制之間轉換?
核心邏輯:4個二進制位 代表1個十六進制位
比如:
二進制轉十六進制
0001 1010 1001. 1101 1000
1 A 9 D 8
十六進制轉二進制
3 D 4
0011 1101 0100
0.4 原碼,反碼,補碼
正數:三碼合一,或者也可以説正數不區分這些東西
負數:
原碼 最高位是符號位 (1代表負數) 其餘的位按照正數去寫就可以 比如 -5 1 000 0101
反碼 符號位不變 其餘的位按位取反 1 111 1010
補碼 反碼+1 1 111 1011
一個字節 是8位 如果用於存儲正整數 範圍 就是 0~ 255 (2的8次方 -1 )
一個字節 是8位 如果即用來存儲正數,也存儲負數 -127~127 但是有一個特殊規定 -0 表示-128 所以規定的範圍是 -128~127
今日內容
1. 預處理,庫函數,關鍵字,註釋,語句,main函數
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world");
system("pause");
return 0;
}
1.1 預處理命令
以#開頭的一些命令,這些命令,使得 編譯器 在正式編譯之前,對源代碼進行一些處理。
#include #define #if...
#include <stdio.h> 的功能就是 找到 stdio.h 這樣一個文件,然後將文件中的內容複製粘貼到命令所在的位置。
賦值粘貼這樣的操作,不算是編譯
複製粘貼不是我們程序員做的,是編譯器自己做的,編寫做的這些編譯之前的操作,就叫做編譯預處理。
1.2 庫函數
C語言會將一些常用的代碼,提供給開發者去使用。這些常用的代碼,是以庫函數的方式提供給我們的。
比如:printf就是一個 庫函數,這個函數的功能是 輸出一個字符串,這個printf函數是被存放在stdio.h這個庫裏面。
如果我們想要使用庫函數,就必須先包含對應的頭文件。
1.3 練習
設置控制枱的標題為“ Hello ” ,並輸出白底黑字的內容“i love you ”;
提示:
system("color 0A")中color後面的0是背景色代號,A是前景色代號。
各顏色代碼如下:
0=黑色 1=藍色 2=綠色 3=湖藍色 4=紅色
5=紫色 6=黃色 7=白色 8=灰色 9=淡藍色
A=淡綠色 B=淡淺綠色 C=淡紅色
D=淡紫色 E=淡黃色 F=亮白色
system("title XXX")修改標題。
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("title 學習快樂");
system("color EA");
printf("歡迎同學學習");
system("pause");
return 0;
}
1.4 關鍵字
1.5 註釋
不參與程序的編譯和運行,一般起到一個提示作用,註釋有兩種:
多行註釋 / /
單行註釋 //
註釋的作用:
a. 對於我們學習的時候來説,便於今後看代碼的時候進行復習。
b. 對於工作來説,便於工作的交接。
代碼寫出來主要是給別人看的,順帶着能夠正確的執行。
體現的 代碼可讀性 的重要
1.6 語句
單語句
以分號為結尾的
複合語句
使用{}括起來的一堆語句
C語言執行的基本單位 是 語句
組成C語言的基本單位 是 函數
1.7 main函數
main函數是我們編寫的第一個函數。 int 是main的返回值類型 return 0 會結束掉main函數。
C語言規定 整個程序的入口,就是main函數。一個程序只能有一個main函數。
C語言的代碼,是從main函數中的第一條語句開始,順序的往下執行。
基本寫法:
int main()
{
return 0;
}
2. 常量和變量
2.1 常量
整型: 123 017 0xABC
浮點: 3.15 科學計數法:10.88e5
字符: ‘A’ L‘A’
字符串:“hello world” L“hello World”
2.2 變量
格式:
變量類型 變量名稱 = 初始值;
2.2.1 變量的定義,各個類型的區別
- 整型
a. long 4字節
b. short 2字節
c. int 4字節
d. 每一個類型的前面,都可以加上一個 unsigned 表示無符號數 - 浮點
a. float 4字節
b. double 8字節 -
字符
a. char 1字節
b. wchar_t 2字節
#include <stdio.h> #include <stdlib.h> int main() { //1. 定義變量 int a = 20; //定義了一個整型變量 char c = 'A'; //定義了一個字符型變量 double m = 3.5;//定義了一個浮點型變量 //這些變量的值是可以被修改的 a = 50;//賦值 將右邊的數據存儲到左邊去 c = 'M'; m = 10.5; //2. 定義變量還有其他多種類型 //整型 //long long num0; //8字節 long int num1 =10; //4字節 -20多億~20多億 short int num2 =20; //2字節 -32768~32767 int num3 =100; //4字節 long num4; short num5; int num6; //字符型 //char的範圍 就是 -128~127 //char 類型是一個字節,説是存儲字符,實際上就是存儲數字 //可以將char類型,看作1個字節的整數 char cCh = 'A'; //char cCh = 65; char cCh2 = '1'; //char cCh2 = 49; char cCh3 = 1; char cCh4 = -5; char cCh5 = -128; //wchar_t的使用方式和char差不多,就是字符前面都應該加一個L wchar_t wCh1 = L'A'; //浮點型 主要看的是精度 //float 4個字節 精度低 // float fNum1 = 3.88; //double 8個字節 精度高 double fNum2 = 3.88; return 0; }2.2.2 標識符的規則
字母,數字,下劃線
數字不能開頭
不能使用關鍵字
區分大小寫2.2.3 怎麼選用變量類型
在過去的時候,硬件資源比較緊張,能用小的類型,就儘量使用更小的。
現在:
整型,沒有特殊要求,就是用int
浮點,沒有特殊要求,就使用 double
字符,沒有特殊要求,就使用 char2.3 關於自動類型轉換的問題
#include <stdio.h>
#include <stdlib.h>
int main()
{
//1. 定義變量
int a = 20; //定義了一個整型變量
char c = 'A'; //定義了一個字符型變量
double m = 3.5;//定義了一個浮點型變量
char n = 0;
a = m;
//第一種自動類型轉換方式
//當賦值的時候,左右兩邊類型不一致
//會將右邊的數據轉換為左邊的類型,再賦值
//m是double,a是int 將m轉為int再賦值
//轉換過程中,有可能會丟失數據
a = 10000;
n = a; //a是4字節 n是1字節 有可能會丟失數據
a + m;
//第二種自動轉換的方式
//當一個算式中,出現了多種類型的時候,會自動往
//範圍較大的類型去轉換,儘量的不丟失數據
//會先將a轉為double,然後再做加法
return 0;
}
2.4 關於顯示轉換的問題
#include <stdio.h>
#include <stdlib.h>
int main()
{
//1. 定義變量
int a = 20; //定義了一個整型變量
char c = 'A'; //定義了一個字符型變量
double m = 3.5;//定義了一個浮點型變量
char n = 0;
a = (int)m;
//第一種自動類型轉換方式
//當賦值的時候,左右兩邊類型不一致
//會將右邊的數據轉換為左邊的類型,再賦值
//m是double,a是int 將m轉為int再賦值
//轉換過程中,有可能會丟失數據
a = 10000;
n = (char)a; //a是4字節 n是1字節 有可能會丟失數據
(double)a + m;
//第二種自動轉換的方式
//當一個算式中,出現了多種類型的時候,會自動往
//範圍較大的類型去轉換,儘量的不丟失數據
//會先將a轉為double,然後再做加法
return 0;
}
顯示轉換的目的,第一個是增強了可讀性。
總結:
a. 命名一定要有含義
b. 註釋要詳細
c. 排版要清晰規範
交換兩個數:
int main(void)
{
int a = 5;
int b = 6;
/*a = b;
b = a;*/
int c = 0;
c = a;
a = b;
b = c;
return 0;
}
關於顯示轉換,隱式轉換,可參考我之前的一篇帖子
https://segmentfault.com/a/11...
3. 輸入和輸出
3.1 輸出
基本用法:
printf("帶格式控制符的字符串",參數2,參數3,.....);
這裏面%d是一個格式控制符。
函數的作用:將字符串中的內容原樣輸出,遇到了格式控制符就匹配後面的參數
格式控制符:
a. 表示十進制整數
i. %d
b. 表示雙精度浮點數
i. %lf
c. 表示單個字符
i. %c
d. 表示字符串
i. %s
e. 其他的,暫時不重要
i. %o 八進制輸出
ii. %f 單精度浮點
iii. %u 無符號整數
iv. %p 輸出地址
v. ....
除了格式控制符之外,還需要知道一個轉義字符
\n 表示換行
#include <stdio.h>
int main(void)
{
int a = 5;
int b = 6;
/*a = b;
b = a;*/
printf("a的值是%d,b的值是%d\n", a, b);
int c = 0;
c = a;
a = b;
b = c;
printf("a的值是%d,b的值是%d\n", a, b);
printf("b");
return 0;
}
輸出
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 65;
double b = 10.8;
char cCh = 'a';
printf("整數的值%d\n", a);
printf("整數的值按照字符輸出%c\n", a);
printf("浮點數的值%lf\n", b);
printf("浮點數的值%d\n", b);
printf("字符的值%c\n", cCh);
printf("字符的值按照整數輸出%d\n", cCh);
printf("字符的值按照整數輸出%d\n", cCh +2);
return 0;
}
3.2 輸入-scanf_s
scanf_s是微軟提供的安全版本,當然也可以選擇scanf,沒有這些規定要求。
#include <stdio.h>
int main(void)
{
//輸入兩個數,輸出兩個數的和
int nNumberA = 0;
int nNumberB = 0;
printf("請輸入兩個數:");
//注意:&它是用來獲取一個變量的地址的
scanf_s("%d,%d", &nNumberA, &nNumberB);
return 0;
}
scanf_的格式控制符和printf是一樣的
scanf_的格式控制符和printf是一樣的
需要注意的地方:
- scanf_s這個函數,是將鍵盤上輸入的內容,按照規定的格式,存儲到變量中。需要提供變量的地址才能夠正確執行。 獲取變量的地址 使用 &
- 在輸入單個字符(整數,浮點數不用加)的時候,需要多一個參數,要寫個1
- 在輸入字符串的時候,需要寫一下,最大的大小
3.3 getchar putchar _getch
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
//對於字符而言,有專門的庫函數輸入輸出字符
//從鍵盤上獲取字符
char a = 0;
a = getchar();//函數的返回值,就是輸入的字符
//將單個字符輸出
//putchar(a);
//無回顯的獲取字符
char cCh = 0;
cCh = _getch();
return 0;
}
拓展:vs調試基礎:
關於基本的調試:
點一下,出現一個小紅點,這裏就是斷點。
F9:下斷點
F5 調試運行,就會中斷在第一個斷點的位置。 如果再按F5 就會運行到下一個斷點處。
F10:單步步過
F11:單步步入
遇到自己寫的函數的時候,他倆有區別,其他時候是一樣的。
在單步運行的過程中,我們可以查看 變量的值,從而去驗證我們的代碼是否正確
我曾經總結的c語言試題
(持續更新,已更新至8月25日)C語言經典題集合