C语言
1.結構化程序是由順序結構、選擇結構、循環結構三大結構組成。
2.讀程序時都要從main()入口,然后從main中第一行程序依次順序往下讀。
3.計算機數據在電腦中保存是以二進制的形式保存的。
4.bit是位,二進制中的0或1,byte是指字節,一個字節=八位。
5.編譯預處理不是C語言,不占運行時間,不要加分號。
6.define PI3.1415926;這個寫法是錯誤的,后面一定不能出現分號。
7.每個C語言程序中main函數有且只有一個。
8.在函數中不可以再定義函數,但是函數中可以再調用函數。
9.算法:可以沒有輸入,但是一定要有輸出。
10.break可用于循環結構和switch語句。
11.逗號運算符的級別最低,賦值的級別倒數第二。
C語言的基礎知識
第一節
1.C語言編寫的程序稱為源程序,又稱為編譯單位。
2.C語言書寫格式是自由的,每行可以多個語句,可以寫多行。
3.一個C語言程序有且只有一個main函數,是程序運行的起點。
第二節
1.VC是軟件,用來運行寫的C語言程序,上機考試系統是VC6.0
2.每個C語言程序寫完后,都是先編譯,后鏈接,最后運行。(.c-----.obj------.exe)這個過程中注意.c和.obj文件時無法運行的,只有.exe文件才可以運行。
第三節
1.標識符:合法的要求是由字母、數字、下劃線組成,并且第一個必須為字母或則是下劃線,不可以是數字。
2.標識符分為關鍵字、預定義標識符、用戶標識符
關鍵字:不可以作為用戶標識符,都是小寫。main、define、scanf、printf都不是關鍵字。迷惑你的地方if是可以作為用戶標識符。因為if中的第一個字母大寫了,所以不是關鍵字。第四節
第四節
1.十進制轉換
第五節
1.C語言中只有八、十、十六進制。但運行時,所有進制都要轉換成二進制來處理。
a.C語言中的八進制規定要以0開頭。018的數值是非法的,八進制不可以出現8
b.C語言中的十六進制規定要以0x開頭。要看懂0xff。
2.小數的合法寫法:C語言小數點兩邊有一個是零的話,可以不用寫。
a.1.0在C語言中可寫成”1.“
b.0.1在C語言中可以寫成“.1”
3.實型數據的合法形式:
(1)2.333e-1就是合法的,且數據是2.333×10-1
(2)考試口訣:e前e后必有數,e后必為整數。請結合書上的例子.
4、整型一般是4個字節, 字符型是1個字節,雙精度一般是8個字節:
long int x; 表示x是長整型。 unsigned int x; 表示x是無符號整型
第六節、第七節
核心:表達式一定有數值!
1.算術表達式:+,-,*,/,%,重點是/和%。
“/” 兩邊都是整型的話,結果取整。 3/2的結果就是1.
“/” 如果有一邊是小數,結果為小數。 3/2.0的結果就是0.5
“%” 符號請一定要注意是余數,考試最容易算成了除號。
“%”符號兩邊要求是整數。不是整數就錯了。
2.賦值表達式:賦值表達式的結果是最左邊的數值,a=b=5;該表達式為5,常量不可以賦值
1、int x=y=10:;錯啦,定義時,不可以連續賦值。
2、int x,y; x=y=10; 對滴,定義完成后,可以連續賦值。
3、int x=7.7; 對滴,x就是7。
4、float y=7; 對滴,x就是7.0。
5、賦值的左邊只能是一個變量。x+y=10;這個寫法是錯的。
3. 復合的賦值表達式:
int a=2;
a*=2+3;運行完成后,a的值是12。
一定要注意,首先要在2+3的上面打上括號。變成(2+3)再運算。
4、自加表達式:
自加、自減表達式:假設a=5,++a(是為6), a++(為5);
考試口訣:++在前先加后用,++在后先用后加。
5、逗號表達式:優先級別最低(表達式的數值逗號最右邊的那個表達式的數值)
(2,3,4)的表達式的數值就是4。取最右邊的值。
z=(2,3,4)(整個是賦值表達式) 這個時候z的值為4。
z= 2,3,4 (整個是逗號表達式) 這個時候z的值為2。
6、補充:
1、空語句不可以隨意執行,會導致邏輯錯誤。
2、注釋是最近幾年考試的重點,注釋不是C語言,不占運行時間,沒有分號。不可以嵌套!
3、強制類型轉換:
a、一定是(int)a不是int (a),注意類型上一定有括號的。
b、注意(int) (a+b) 和(int)a+b 的區別。 前是把a+b轉型,后是把a轉型再加b。
4、三種取整丟小數的情況:
1)int a =1.6;結果a為1
2)(int)a;整個數值取整
3)1/2; 3/2;0 和 1
第八節:
字符:有單單和轉義字符之分
1.字符數據的合法形式:單單(單引號里面單個字符)
“0”的ASCII數值表示為48,“a”的ASCII數值是97,“A”的ASCII數值是65.
2.轉義字符:單引號里面加上另外字母形成新的組合。
轉義字符分為一般轉義字符、八進制轉義字符。十六進制轉義字符。
3.字符型和整數是近親:兩個具有很大的相似之處。
第九節
1.例1: char a = 6, b; b = a<<2; 解題時:先要把a化成二進制,再做位運算。
例2: 一定要記住,異或的位運算符號” ^ ”。0 ^ 1=1。0 ^ 0=0。
例3: 在沒有舍去數據的時候,<<左移一位表示乘以2;>>右移一位表示除以2。
第二章
第一節:數據輸出(一)(二)
1.使用printf和scanf函數時,要在最前面加上:#include“stdio.h”
2.printf可以可以只有一個參數,也可以有兩個參數
3.printf(“a=%d,b=%d”,12,34)記住:是將第二部分的12和34以第一部分的形式在終端顯示。
考試核心為:一模一樣在黑色屏幕上顯示為a=12,b=34
printf(“a=%d,
b=%d”,12,34)那么輸出的結果就是a=12
b=34
4.int x=017;(一定要弄清楚為什么是這個結果!過程很重要)
printf(“%d”, x); 15
printf(“%o”, x); 17
printf(“%#o”,x); 017
printf(“%x”, x); f
printf(“%#x”,x); 0xf
6.一定要背誦的
|
格式說明 |
表示內容 |
格式說明 |
表示內容 |
|
%d |
整型 int |
%c |
字符 char |
|
%ld |
長整型 long int |
%s |
字符串 |
|
%f |
浮點型float |
%o |
不帶前導0八進制 |
|
%lf |
浮點型double |
%#o |
帶前導0的八進制 |
|
%% |
輸出一個百分號 |
%x |
不帶前導0x十六進制 |
|
%5d |
輸出要求有五位 |
%#x |
帶前導0x的十六進制 |
7.舉例說明:
printf(“%2d”,123 );第二部分123有三位,大于第一部分指定的兩位,原樣輸出123
printf(“%5d”,123 );第二部分123有三位,小于第一部分指定的五位,左邊補兩個空格123
printf(“%10f”,1.25 );小數要求補足6位的,沒有六位的補0,。結果為1.250000
printf(“%5.3f”,1.25 );第一部分指定小數三位,整個五位,結果為1.250(小數點算一位) printf(“%3.1f”,1.25 );第一部分指定小數一位,整個三位,結果為1.3(要進行四舍五入)
第三節:數據輸入
1.scanf(“a=%d,b=%d”,&a,&b)(超級重點)
考試核心為:一模一樣。以第一個部分雙引號里面為輸入標準形式。
終端輸入為:a=12,b=34才可把12和34正確賦值給a和b。
2、scanf(“%d,%d”,x,y);
scanf的第二個部分一定要是地址(或是指針變量)!
scanf(“%d,%d”,&x,&y);注意寫成這樣正確!
3、特別注意指針在scanf的考察(近幾年重點)
例如: int x=2;int *p=&x; scanf(“%d”,x); 錯誤
scanf(“%d”,p);正確 scanf(“%d”,&p); 錯誤
scanf(“%d”,*p)錯誤
4、指定輸入的長度 (考試重點)
終端輸入:1234567 scanf(“%2d%4d%d”,&x,&y,&z);x為12,y為3456,z為7
終端輸入:1 234567 由于1和2中間有空格,所以只有1位給x
scanf(“%2d%4d%d”,&x,&y,&z); x為1 ,y為2345,z為67
5、字符和整型是近親:
int x=97; printf(“%d”,x); 結果為97
printf(“%c”,x); 結果為 a
6、輸入時候字符和整數的區別(考試超級重點)
scanf(“%d”,&x);這個時候輸入1,特別注意表示的是整數1
scanf(“%c”,&x);這個時候輸入1,特別注意表示的是字符?1?,ASCII為整數48。
7、補充說明:
1)scanf(“%d%d%*d%d”,&a,&b,&c); 跳過輸入的第三個數據。
2)putchar ,getchar 函數的考查。前是輸出一個字符,后是獲得一個字符。
3)交換兩個數 t=x;x=y;y=t。當成單詞去背。
第三章
特別要注意:
1、C語言中是用非0表示邏輯真,0表示邏輯假的。
2、C語言有構造類型,沒有邏輯類型。
3、關系運算符號:注意<=的寫法,==和=的區別!(考試重點)
4、if只管后面一個語句,要管多個,請用大括號!
1)關系表達式:
a、表達式的數值只能為1(表示為真),或0(表示假)。
如 9>8這個關系表達式是真的,所以9>8這個表達式的數值就是1。
如 7<6這個關系表達式是假的,所以7<6這個表達式的數值就是0
b、考試最容易錯的:就是int x=1,y=0,z=2;x<y<z是真還是假?帶入為1<0<2,從數學的角度出發肯定是錯的,但是如果是C語言那么就是正確的!因為要1<0為假得到0,表達式就變成了0<2那么運算結果就是1,稱為了真的了!
c、等號和賦值的區別!一定記住“=”就是賦值,“= =”才是等號。做錯了,我一定會強烈鄙視你!
2)邏輯表達式:共有&& || ! 三種邏輯運算符號
核心:表達式的數值只能為1(表示為真),或0(表示假)。
a、注意短路現象。考試比較喜歡考。詳細請見書上例子,一定要會做例1和例2。
b、表示 x 小于0大于10的方法。(考試非常容易錯的)
0<x<10是不行的(一定記住),他永遠為真。(0<x)&&(x<10)才是正確表示方法。
3)if 語句
a、else 是與最接近的if且沒有else的語句匹配。
b、交換的程序寫法:t=x;x=y;y=t;
c、if(a<b)t=a;a=b;b=t;
if(a<b){t=a;a=b;b=t;} 兩個的區別,考試多次考到了!
d、單獨的if語句:if(a<b)t=a;
標準的if語句:if(a<b)min=a;
else min=b;
嵌套的if語句:if(a<b)
if(b>c)printf(“ok!”);
多選一的if語句if(a= =t)printf(“a”);
else if(b= =t)printf(“b”);
else if(c= =t)printf(“c”);
else pritnf(“d”);
通過習題,要熟悉以上幾種if語句!
4)條件表達式: 表達式1 ?表達式2 :表達式3
a、考試口訣:真前假后。
b、int a=1,b=2,c=3,d=4,e=5;
k=a>b?c:d>e?d:e;
求k的數值時多少? 答案為5
5)switch語句:(我用了一年的時間才弄懂,考試重點)
a) 執行的流程一定要弄懂!上課時候詳細的過程講了,請自己一定弄懂!
b)注意有break和沒有break的差別,break在C語言中就是分手,一刀兩斷的意思。
c) switch只可以和break一起用,不可以和continue用。
d) switch(x) x是整型常量,字符型常量,枚舉型數據。
{case 1: …. 不可以是變量。
case 2: …. }
e)switch是必考題型,請大家一定要完成書上的課后的switch的習題。
6.goto語句,是關鍵,不可以隨便使用,已經淘汰
第四章
1.三種循環結構:
a.for();while();do- while()三種循環
b.for循環當中必須是兩個分號,千萬不要忘記
c.寫程序時一定要注意,循環一定要有結束的條件,否則就形成了死循環
d.do- while()循環是至少執行一次循環
2.break和continue的差別
break:是打破的意思,(破了整個循環),所以break就退出一層循環
continue:是繼續的意思,(繼續循環運算),但是要結束本次循環,就是循環體內剩下的語句不再執行,跳到循環開始,然后判斷循環條件,進行新一輪的循環。
3.嵌套循環
就是有循環里面還有循環,這種比較復雜,要一層一層耐心計算,一般記住兩層是處理二維數組的。
4.while((c=getchar()) !=‘
’)和while(c=getchar()!=‘
’)的差別
先看 a=3!=2和(a=3)!=2的區別:(!=號的級別高于=號 所以第一個先計算3!=2)第一個a的數值是得到的1;第二個a的數值是3
5.如何整除一個數:i%5==0表示整除5 i%2==0表示整除2,同時表示的是偶數!
6.輸入123,輸出321逆序輸出數據
int a =123;
while (i!=o)
{
printf(“%d”,i%10);
i=i/10;}
7.for只管后面一個語句:
int i=3;
for (i=3; i<6;i++); 循環控制這個空語句,空語句是循環體
printf(“#”); 請問最終打印幾個#號?答案為一個!
8.不停的輸入,直到輸入#停止輸入! while((x=getchar())!="#")
不停的輸入,直到輸入$停止輸入! while((x=getchar())!="$")
不停的輸入,直到輸入?停止輸入! while((x=getchar())!="?")
9.超級重點:
int k=1
while(--k);
printf("%d",k);
結果為0
int k=1
while(k--);
printf("%d",k);
結果為-1
第五章
1.函數:是具有一定功能的一個程序塊,是C語言的基本組成單位。
2.函數不可以嵌套定義。但可以嵌套調用。
3.函數名缺省返回值,默認為int。
4.C語言由函數組成,但有且有一個main函數!是程序運行的開始!
5.如何判斷a是否為質數:
void iszhishu(int a)
{ for (i=2;i<a/2;i++)
if(a%i=0)printf("不是質數");
printf(“是質數!”);
}
6.如何求階層:n!
int fun(int n)
{ int p=1;
for(i=1;i<n,i++) p=p*1;
return p;
}
7.函數的參數可以是常量、變量、表達式,甚至是函數調用。
8.一定要注意參數之間的傳遞。實參和形象之間的傳數值,和傳地址的差別
傳數值的話,形參的變化不會改變實參的變化
傳地址的話,形參的變化就98%會改變實參的變化
9.函數聲明的考查:
一定要有:函數名,函數的返回類型,函數的參數類型
不一定要有:形參的名稱(可寫,可不寫,可亂寫)
10.要求掌握的庫函數:
abs(),sqrt(),fabs(),pow(),sin(),其中pow(a,b)是重點,2的3次方是由pow(2,3)表示的。
第六章
指針變量的本質:放地址。變量三要素:名稱、內容、地址、
1.int *p中 *p和p的差別:簡單的說*p是數值,p是地址!
*p可以當做變量來使用,*的作用是取后面的地址P里面的數值。
p是當做地址來使用,可以用在scanf函數中:scanf(“%d”,p)
2.*p++和(*p)++的差別:
*p++是地址會變化,口訣:取當前值,然后在移動地址!
(*p)++是數值會變化。口訣:取當前值,然后再使數值增加1.
例題: int*p,a[]={1,3,5,7,9};
p=a;
請問*p++和(*P)++的數值分別為多少?
*p++ :本身為3,然后挪到下個地址,地址變動。
(*P)++ :本身為3,然后再把3變成4,地址不動
3、二級指針:*p:一級指針:存放變量的地址。
**q:二級指針:存放一級指針的地址。
常考題目: int x=7;
int*p=&x,**q=p;
問你:*p為多少?*q為多少?**q為多少?
7 p 7
再問你:**q=&x的寫法可以嗎?
不可以,因為二級指針只能存放一級指針的地址。
4、三名主義:(考試的重點)
數組名:表示第一個元素的地址。數組名不可以自加,他是地址常量名。
函數名:表示該函數的入口地址。
字符串常量名:表示第一個字符的地址。
5、移動指針(經常加入到考試中其他題目綜合考試)
char *s=“meikanshu” while(*s){printf(“%c”,*s);s++;}
s++是地址移動,打印了一個字母后,就會移動到下一個字母!
6、指針變量兩種初始化(一定要看懂)
方法一:int a=2,*p=&a;(定義的同時初始化)
方法二:int a=2,*p; (定義之后初始化) p=&a;
7、傳數值和傳地址(每年必考好多題目)
|
Void fun(int a,int b) {int t; t=a;a=b;b=t; } Main(){int x=1,y=3, Fun(x,y); Printf(“%d,%d”,x,y); } |
Void fun (int *a,int*b) {int t; t=*a;*a=*b;*b=t; } Main() {int x=1,y=3, Fun(&x,&y) Printf(“%d,%d”,x,y); } |
|
這個題目的答案是1和3 傳數值,fun是用變量接受,所以fun中的交換不會影響到main中的x和y。 傳數值,形參的變化不會影響實參。 |
這個題目的答案是3和1 傳地址,fun用指針接受!這個時候fun中的交換,就會影響到main中的x和y。 傳地址形參的變化絕大數會影響到實參。 |
8.函數返回值是地址,一定注意這個*號
int *fun(int *a,int*b) 可以發現函數前面有個*,這個就是說明函數運算結果是地址
{if (*a>*b) return a; return a可以知道返回的是a地址
else return b;
}
main()
{int x=7,y=8,*max;
max=fun(&x,&y); 由于fun(&X,&Y)的運算結果是地址,所以用max來接收
printf("%d,%d",)
}
9.指針變量是存放地址的。并且指向哪個就等價哪個,所有出現*p的地方都可以用它的等價的代替
例如:int a=2,*p=&a;
*p=*p+2;
(由于*P指向變量a,所以指向哪個就等價哪個,這里*P等價于a,可以相當于a=a+2.
第七章
數組:地址連續,類型一致
1.一維數組的初始化:
int a[5]={1,2,3,4,5};合法
int a[5]={1,2,3};合法
int a[]={1,2,3,4,5};合法
int a[5]={1,2,3,4,5,6};不合法,賦值的個數多余數組的個數了
2.一維數組的定義:
int a[5];定義數組不可以是變量
int x,int a[x];不合法,因為個數是x,是個變量,非法的
define P 5 int a[P] 合法,define后的p是符號常量,只是長得像變量
3.二維數組的初始化:
int a[2][3]={1,2,3,4,5,6}; 合法,
int a[2][3]={1,2,3,4,5, }; 合法,后面一個默認為0。
int a[2][3]={{1,2,3,} {4,5,6}}; 合法,
int a[2][3]={{1,2,}{3,4,5}}; 合法,
int a[2][3]={1,2,3,4,5,6,7}; 不合法,賦值的個數多余數組的個數了。
int a[][3]={1,2,3,4,5,6}; 合法,可以缺省行的個數。
int a[2][]={1,2,3,4,5,6}; 不合法,不可以缺省列的個數
4.補充:
1)數組的重要概念:
a[10]的討論。(一維數組的討論)
1、a表示數組名,是第一個元素的地址,也就是元素a[0]的地址。(等價于&a)
2、a是地址常量,所以只要出現a++,或者是a=a+2賦值的都是錯誤的。
3、a是一維數組名,所以它是列指針,也就是說a+1是跳一列。
a[3][3]的討論。(二維數組的討論)
1、a表示數組名,是第一個元素的地址,也就是元素a[0][0]的地址。
2、a是地址常量,所以只要出現a++,或者是a=a+2賦值的都是錯誤的。
3、a是二維數組名,所以它是行指針,也就是說a+1是跳一行。
4、a[0]、a[1]、a[2]都是地址常量,不可進行賦值操作,同時它們都是列指針,a[0]+1,a[1]+1,a[2]+1都是跳一列。
5、注意a和a[0]、a[1]、a[2]是不同的,它們基類型是不同的。前者是一行元素,后三者是一列元素
2.二維數組做題目的技巧:
如果有a[3][3]={1,2,3,4,5,6,7,8,9}這樣的題目
步驟一:把他們寫成:
|
第一列 |
第二列 |
第三列 |
||
|
a[0] |
1 |
2 |
3 |
第一行 |
|
a[1] |
4 |
5 |
6 |
第二行 |
|
a[2] |
7 |
8 |
9 |
第三行 |
步驟二:*(a[0]+1)我們就知道是第一行的第一個元素往后面跳一列,那么這里就是a[0][1]元素, 所以就是2
*(a[1]+2)我們就知道是第二行的第一個元素往后跳二列,那么這里就是a[1][2]元素, 所以就是6
3.數組的初始化,一維和二維的,一維可以不寫數字,二維第二個一定要寫出列,可以不寫行
4. 二維數組中的行指針:二位數組名是行指針
5.脫衣服法則:a[2] 變成 *(a+2)
a[2][3] 變成 *(a+2)[3] 再變成 *(*(a+2)+3)
其他重點:
.
總結
- 上一篇: MGW——美团点评高性能四层负载均衡
- 下一篇: Codeforces & Atc