C语言期末考试知识点总结
目錄
二.章節速覽
三.常用程序源碼:
標題一.C?語言總復習?
總體上必須清楚的:
1)程序結構是三種:?順序結構?,?循環結構?(三個循環結構),?選擇結構?(if?和?switch)
2)讀程序都要從main()入口,?然后從最上面順序往下讀(碰到循環做循環,碰到選擇做選擇),直到主函數結束。
3)計算機的數據在電腦中保存是以 二進制的形式,數據存放的位置就是他的地址,地址是十六進制的.
4)bit是位 是指為0?或者1。?byte?是指字節,?一個字節?=?八個位.
5)一定要記住 二進制 如何劃成 十進制。
6)描述算法有三種常用方法:偽代碼,流程圖或N-S圖,自然語句。
概念??嫉降?#xff1a;?
1、編譯預處理不是C語言的一部分,不再運行時間。C語言編譯的程序稱為源程序,它以ASCII數值存放在文本文件中。
2、每個C語言程序中main函數是有且只有一個。
3、在函數中不可以再定義函數。
4、算法的是一定要有輸出的,他可以沒有輸入。
5、break可用于循環結構和switch語句。
6、運算符優先級中,單目運算符>雙目運算符>三目運算符,算術運算符>關系運算符>邏輯運算符>賦值運算符,逗號運算符的級別最低。
二.章節速覽
第一章
1)合法的用戶標識符考查:
合法的要求是由字母,數字,下劃線組成。有其它元素就錯了。
并且第一個必須為字母或則是下劃線。第一個為數字就錯了。
關鍵字不可以作為用戶標識符號。main??define??scanf??printf?都不是關鍵字。迷惑你的地方If是可以做為用戶標識符。因為If中的第一個字母大寫了,所以不是關鍵字。
2)實型數據的合法形式:
2.333e-1?就是合法的,且數據是2.333×10-1。
考試口訣:e前e后必有數,e后必為整數。.
3)字符數據的合法形式::
?? '1'?是字符占一個字節,"1"是字符串占兩個字節(含有一個結束符號)。
?'0'?的ASCII數值表示為48,'a'?的ASCII數值是97,'A'的ASCII數值是65。
4)字符型變量占1個字節,整型占4個字節,單精度浮點型占4個字節,雙精度占8個。
5)轉義字符的考查:
???
| 轉義字符 | 作用 | ASCII值 |
| \a | 響鈴 | 007 |
| \b | 退格 | 008 |
| \f | 換頁 | 012 |
| \n | 換行 | 010 |
| \r | 回車 | 013 |
| \t | 水平制表 | 009 |
| \v | 垂直制表 | 011 |
| \\ | 反斜杠 | 092 |
| \? | 問號字符 | 063 |
| \' | 單引號字符 | 039 |
| \" | 雙引號字符 | 034 |
| \0 | 空字符 | 000 |
| \ddd | 任意字符 | 三位八進制 |
| \xhh | 任意字符 | 二位十六進制 |
6)算術運算符號的優先級別:
???同級別的有的是從左到右,有的是從右到左。
7)強制類型轉換:
??一定是 (int)a?不是??int(a),注意類型上一定有括號的。
???注意(int)(a+b)和(int)a+b?的區別。 前是把a+b轉型,后是把a轉型再加b。
8)表達式的考查:
???是表達式就一定有數值。
???賦值表達式:表達式數值是最左邊的數值,a=b=5;該表達式為5,常量不可以賦值。
???自加、自減表達式:假設a=5,++a(是為6),?a++(為5);
運行的機理:++a?是先把變量的數值加上1,然后把得到的數值放到變量a中,然后再用這個?++a表達式的數值為6?,而a++是先用該表達式的數值為5?,然后再把a的數值加上1為6,
再放到變量a中。 進行了++a和a++后在下面的程序中再用到a的話都是變量a中的6了。
??考試口訣:++在前先加后用,++在后先用后加。
逗號表達式:優先級別最低 ;表達式的數值逗號最右邊的那個表達式的數值。
(2,3,4)的表達式的數值就是4。
9)位運算的考查:
會有一到二題考試題目。
總的處理方法:幾乎所有的位運算的題目都要按這個流程來處理(先把十進制變成二進制再變成十進制)。
例1: char a = 6, b;
b = a<<2;??這種題目的計算是先要把a的十進制6化成二進制,再做位運算。
例2: 一定要記住,
例3: 在沒有舍去數據的時候,<<左移一位表示乘以2;>>右移一位表示除以2。
10)018的數值是非法的,八進制是沒有8的,逢8進1。?
11)%符號兩邊要求是整數。不是整數就錯了。
12) 取整丟小數的情況:
1、int a =1.6;
??????????????2、(int)a;
第二章
1)printf函數的格式考查:
???? %d對應整型);%c對應字符;%f對應單精度等等。寬度的,左對齊等修飾。
???? %ld對應?long int;%lf?對應double。
注:有時需要用到如:%3d,%.f,%-5等形式,在‘%’和‘d/c/f’前的數字代表輸出的數據占據幾個位置,而數字之前的負號表示讓輸出的數據多對齊,用這種方法能很好的實現輸出數據的美觀。
2)scanf函數的格式考察:
???注意該函數的第二個部分是?&a?這樣的地址,不是?a?;?
?? Scanf(“%d%d%*d%d”,&a,&b,&c);?跳過輸入的第三個數據。
注:若每個數據使用空格隔開,則%c之前的空格不可省略,否則發生錯誤。
3)putchar ,getchar?函數的考查:
?? char??a = getchar()?是沒有參數的,從鍵盤得到你輸入的一個字符給變量a。
?? putchar(‘y’)把字符y輸出到屏幕中。
4)如何實現兩個變量x?,y中數值的互換(要求背下來)
???不可以把?x=y ,y=x;?要用中間變量?t=x;x=y;y=t。
5)如何實現保留三位小數,第四位四舍五入的程序,(要求背下來)
???這個有推廣的意義,注意?x =?(int)x?這樣是把小數部分去掉。
第三章
特別要注意:c語言中是用非0表示邏輯真的,用0?表示邏輯假的。?
1)關系表達式:
???表達式的數值只能為1(表示為真),或0(表示假)
???當關系的表達是為真的時候得到1。如?9>8這個是真的,所以表達式的數值就是1;
2)邏輯表達式:
?????只能為1(表示為真),或0(表示假)
?????a)共有&&?? ||???! 三種邏輯運算符號。
?????b)!>&&>||??優先的級別。
?????c)注意短路現象??荚嚤容^喜歡考到。
?????d)要表示?x?是比0大,比10小的方法。?0<x<10是不可以的(一定記住)。是先計算0<x?得到的結果為1或則0;再用0,或1與10比較得到的總是真(為1)。所以一定要用?(0<x)&&(x<10)表示比0大比10小。?
3)if?語句
?? else?是與最接近的if且沒有else的相組合的。
4)條件表達式:
??? 表達式1??表達式2?:表達式3
??? 注意是當非0?時候是表達式2的數值,當為0?是就是表達式2的數值。
考試口訣:真前假后。
5)switch語句:
a)一定要注意 有break?和沒有break的差別,沒有break時候,只要有一個case匹配了,剩下的都要執行,有break則是直接跳出了swiche語句。
?b)switch只可以和break一起用,不可以和continue用。
第四章
1)三種循環結構:
?? a)for() ;?while();?? do- while()三種。
?? b)for循環當中必須是兩個分號,千萬不要忘記。
?? c)寫程序的時候一定要注意,循環一定要有結束的條件,否則成了死循環。
?? d) do-while()循環的最后一個while();的分號一定不能夠丟。(當心上機改錯)
2) break?和??continue的差別
???記憶方法:
break:是打破的意思,(破了整個循環)所以看見break就退出一層循環。
continue:是繼續的意思,(繼續循環運算),但是要結束本次循環,就是循環體內剩下的語句不再執行,跳到循環開始,然后判斷循環條件,進行新一輪的循環。
3)嵌套循環
? ?多個或者多種循環的嵌套使用,循環內還有循環,外層循環執行一次,內層循環執行一輪。
4) while((c=getchar())!=’\n’) 和?while(c=getchar() !=’\n’)的差別
先看a = 3 != 2??和(a=3)!=2?的區別:
(!=號的級別高于=號?所以第一個先計算?3!=2)?第一個a的數值是得到的1;第二個a的數值是3。
考試注意點:?括號在這里的重要性。
第五章
函數:是具有一定功能的一個程序塊;
1)?函數的參數,返回數值(示意圖):
??main()
{
int a = 5,b=6,c;
??c =?add(a,b);
??printf(“%d”,c);
}
調用函數
a,b是實參
整個函數得到一個數值就是
Add函數的返回數值。
int add ( int x, int y)
{
int z;
??z=x+y;
??return z;
}
被調用函數
x,y是形式參數
函數返回數值是整型
z就是這個add函數計算后得到的結果,就是函數返回給主程序的返回數值。
程序是在從上往下順序執行,當碰到了函數add后,把a,b的數值穿給調用函數,程序暫時中斷等待返回數值。當得到了返回數值后,再順序的往下執行
2)一定要注意參數之間的傳遞
??實參和形參之間?傳數值,和傳地址的差別。(考試的重點)?
??????傳數值的話,形參的變化不會改變實參的變化。
??????傳地址的話,形參的變化就會有可能改變實參的變化。
3)函數聲明的考查:
一定要有:函數名,函數的返回類型,函數的參數類型。
不一定要有:形參的名稱。
4)遞歸:函數自己調用自己稱為遞歸,而兩個函數相互調用則稱為間接遞歸。
遞歸的謹慎使用:倘若不能夠熟練使用遞歸,最好不要使用,否則容易讓自己暈頭轉向,而且遞歸運算無論是時間還是空間占用也不小。
第六章
1一維數組的重要概念:
對a[10]這個數組的討論。
1、a表示數組名,是第一個元素的地址,也就是元素a[10]的地址。
2、a作為數組名,本質是地址,所以只要出現a++,或者是a=a+2賦值的都是錯誤的。
3、a是一維數組名,所以它是列指針,也就是說a+1是跳一列?!?/span>
對a[3][3]的討論。
1、a表示數組名,是第一個元素的地址,也就是元素a[3][3]的地址。
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]是不同的,它們的基類型是不同的。前者是一行元素,后三者是一列元素。
二維數組做題目的技巧:
如果有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]元素,所以是1。
*(a[1]+2)我們就知道是第二行的第一個元素往后面跳二列。那么這里就是a[1][2]元素,所以是6。
一定記住:只要是二維數組的題目,一定是寫成如上的格式,再去做題目,這樣會比較簡單。
數組的初始化,一維和二維的,一維可以不寫,二維第二個一定要寫
??????int a[]={1,2}?合法。?? int a[][4]={2,3,4}合法。???但int a[4][]={2,3,4}非法。
二維數組中的行指針???????int a[1][2];?
其中a現在就是一個行指針,a+1跳一行數組元素。??搭配(*)p[2]指針
???? a[0],a[1]現在就是一個列指針。a[0]+1?跳一個數組元素。搭配*p[2]指針數組使用
還有記住脫衣服法則:
?? a[2]??變成?? *(a+2)?? a[2][3]變成?*(a+2)[3]再可以變成?? *(*(a+2)+3)???這個思想很重要!
第七章
指針變量的本質是用來放地址,而一般的變量是放數值的。?
int??*p?中?? *p和p的差別:
*p可以當做變量來用;*的作用是取后面地址p里面的數值
p是當作地址來使用。
*p++?和 (*p)++的之間的差別:改錯題目中很重要
???????? *p++是 地址會變化。
?????????(*p)++?是數值會要變化。??????????????????
注:分清楚指針數組,數組指針,指針函數和函數指針,在這四種讓人暈頭轉向的名稱中,其實每一種的本質取決于他的第一個名詞,如指針數組int *p[4],其實它本質上是指針,不過以數組的形式存放,即數組的每個元素都是一個指針;數組指針:本質上是一個指針,指向一個數組;指針函數:本質是一個函數,返回值是指針;函數指針:本質是一個指針,指向一個函數。
其他:
三名主義:(考試的重點)
???數組名:表示第一個元素的地址。數組名不可以自加,他是地址常量名。(考了很多次)
???函數名:表示該函數的入口地址。
???字符串常量名:表示第一個字符的地址。
注意事項:1).數組下標不要越界;
? ? ? ? ? ? ? ? ? 2).函數的返回類型由函數類型決定而非變量類型決定;
? ? ? ? ? ? ? ? ? 3).運算符優先級一定要記清楚;
? ? ? ? ? ? ? ? ? 4).寫程序是最好有注釋,這不但是個好習慣,也有助于程序美觀,增加程序可讀性。
三.常用程序源碼:
冒泡排序(為了確保程序簡單,照顧函數可能不太明朗的讀者,三個基礎排序程序均不使用自定義函數):
#define _CRT_SECURE_NO_WARNINGS #define N 10 #include <stdio.h> void main() {int a[N], i, j, t;for (i = 0; i < N; i++) //輸入N個數據{scanf("%d", &a[i]);}for (i = 0; i < N-1; i++) //外層循環控制輪數,只需要進行N-1輪{for (j = 0; j < N - 1 - i; j++) //內層循環遍歷后面每個數據(可以理解為數學中的握手問題,10數據分別需要9,8,7...2,1次。){if (a[j] > a[j+1]) //大小判斷{t = a[j]; //數據置換a[j] = a[j+1];a[j+1] = t;}}}for (i = 0; i < N; i++) //輸出{printf("%-3d", a[i]);} }選擇排序:
#define _CRT_SECURE_NO_WARNINGS #define N 10 //定義N為10,即數組的長度 #include <stdio.h> void main() {int a[N] , t, i,j;for (i = 0; i < N; i++) //循環輸入N個數據scanf("%d", &a[i]); for (i = 0; i < N - 1; i++) //選擇排序需要進行N-1輪比較,外層循環控制輪數{for (j = i + 1; j < N; j++) //因為是a[i]同它之后的數據作比較,所以j從i+1開始,內層循環讓a[i]同它之后的每個數據進行比較{if (a[i] < a[j]) //判斷大小{ t = a[i]; //數據置換a[i] = a[j];a[j] = t;}}}for (i = 0; i < N; i++) //輸出{printf("%6d", a[i]);} }插入排序:
#define _CRT_SECURE_NO_WARNINGS #define N 10 #include <stdio.h> void main() {int i, j, t,a[N];for (i = 0; i < N; i++) //輸入N個數據scanf("%d", &a[i]);for (i = 1; i < N; i++) //外層循環從第二數據開始{t = a[i]; j = i-1; //j從0開始while (j >= 0 && a[j] > t) //判斷大小并且保證下標不會越界{a[j + 1] = a[j]; //數據的置換j--;}a[j + 1] = t; }for (i = 0; i < N; i++) //循環輸出printf("%-3d", a[i]); }蛇形矩陣:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(int N, int r) //形參N,r {int f = 1, i;for (i = 1; i <= r; i++){f += i - 1; //f為每一行第一個數據的值}int t = f;int n = r + 1;for (i = 1; i < N - r + 1; i++){if (i < N - r + 1)printf("%d ", t); //不是每行最后一個數據則多數出一個空格elseprintf("%d", t); //每行最紅一個空格只輸出數據t += n; //t存放每次要輸出的數據n++; //n每次循環后自加} } void main() {int N, i;scanf("%d", &N); //輸入行數for (i = 1; i <= N; i++) //循環控制每行{fun(N, i); //實參對應自定義函數N,rprintf("\n"); //每行輸出結束后換行} }函數遞歸之斐波那契:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int Fib(int n) {if (n == 1 || n == 2) //斐波那契數列的第一二項均為1return 1;elsereturn Fib(n - 1) + Fib(n - 2); //遞歸調用 } void main() {int n,s; scanf("%d", &n); //輸入ns = Fib(n); //s存儲Fib函數的返回值printf("%d\n", s); }函數遞歸之漢諾塔:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(int n, int a, int b, int c) {if (n == 1)printf("%d->%d\n", a, c);else{fun(n - 1, a, c, b);printf("%d->%d\n", a, c);fun(n - 1, b, a, c);} } void main() {int n;scanf("%d", &n);fun(n, 1, 2, 3); }最后附上一個我copy的表白程序,祝各位早日脫單,把握住:
#include<stdio.h> #include<math.h> #include<windows.h> int main() {printf("\t\t\t\t\t**我愛你\n\n");printf("\t\t\t\t綢繆束薪,\t\t三心在天。\n");printf("\t\t\t\t今夕何夕,\t\t見此良人。\n");printf("\t\t\t\t子兮子兮,\t\t如此良人何!\n");for (double y = 1.9; y > -1.2; y -= 0.1) {for (double x = -1.8; x < 2.6; x += 0.04) {if (x * x + (y - pow(x * x, 1.0 / 3)) * (y - pow(x * x, 1.0 / 3)) <= 1) printf("*");else if (x <= -1.4 && x >= -1.7 && y <= 1.6 && y >= -1.1) printf("*");else if (x >= 1.4 && x <= 1.6 && y <= 1.6 && y >= -1.1) printf("*");else if (x >= 2.3 && x <= 2.5 && y <= 1.6 && y >= -1.1) printf("*");else if (x >= 1.6 && x <= 2.3 && y <= -0.7 && y >= -1.1) printf("*");else printf(" ");}system("color 5c");printf("\n");}getchar();return 0; }總結
以上是生活随笔為你收集整理的C语言期末考试知识点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive 之多表查询
- 下一篇: 移相全桥的分析与计算