- 論壇徽章:
- 0
|
今天開(kāi)始是劉羽華講課,把C語(yǔ)言的基本概念都講了一遍:
講了:變量類型,枚舉,隱式聲明和顯示聲明的區(qū)別,外部變量和靜態(tài)變量
位操作是重點(diǎn)! 流控制講了折半查找,還有冒泡排序
編程實(shí)例:
1.折半查找:對(duì)一組有序的排列來(lái)說(shuō),折半查找是最快捷的方法:
#include <stdio.h> #include <stdlib.h> int binsearch(int number,int arr[],int size) { int start=0,end=size-1; int middle=(start+end)/2; while(end > start) { middle=(start+end)/2; //printf("%d\n",middle); if(number == arr[middle]) return middle; else if(number < arr[middle]) end = middle-1; else start = middle+1; } return -1; }
main(void) { int arr[]={1,3,5,7,9,11,13,15,17,19,21,23,25}; int ind; ind = binsearch(15,arr,13); printf("%d\n",ind); }
2.冒泡排序:
void my_sort(int arr[],int n) { int i,k; int temp; for(i=0;i<n;i++) { for(k=0;k<n-i;k++) { if(arr[k]>arr[k+1]) { temp=arr[k]; arr[k]=arr[k+1]; arr[k+1]=temp; } } } }
3.位操作 1)一些有用的函數(shù): #include <stdio.h> #include <stdlib.h>
#define BITMAX 32
void showbits(int number) //將一個(gè)int 整數(shù)以2進(jìn)制方式顯示出來(lái) { int temp = number; int bit; int i; for(i=BITMAX-1;i>=0;i--) { bit = (temp & (1 << i)) >> i; printf("%d",bit); } }
int bit_num(void) //查看本機(jī)器支持的最大位數(shù),i386機(jī)器一般為32位 { int i=1; int count=1; while(i>0) { i=i<<1; count++; } return count; } /* main(void) { int a=28; printf("The number of bit in this machine is %d\n",bit_num()); showbits(a); } */
2) 第三位取1 a | (1<<3) 第三位取0 a & ~(1<<3) 取第三位數(shù)值 bit = (a & 8) >> 3 非零整數(shù)的二進(jìn)位取值 (。)
#include <stdio.h> #include <stdlib.h> #include "usefull.c"
void showbits(int number); int bit_num(void);
main(void) { int a=115; int a1,a2,bit; printf("a =%d:",a); a1=a|(1<<3); a2=a&~(1<<3); showbits(a); printf("\na1=%d:", a1 ); showbits(a1); printf("\na2=%d:", a2 ); showbits(a2); bit = (a & 8) >> 3;
printf("\nThe 3rd position of a is %d\n",bit); }
課堂筆記
/*********************** * 快速的旅行 **********************/
1、Hello world
每一個(gè)C語(yǔ)言程序都由函數(shù)和變量組成。 函數(shù)中包含一些語(yǔ)句,用以指定要執(zhí)行的操作; 變量用于存儲(chǔ)計(jì)算過(guò)程中使用的值。
通常函數(shù)名和變量名都沒(méi)有限制,但main是一個(gè)特殊的函數(shù)。 C程序都有且只有一個(gè)main函數(shù),程序會(huì)從main函數(shù)開(kāi)始執(zhí)行。 可以用傳參數(shù)的方式在函數(shù)間交換數(shù)據(jù)。 函數(shù)中的語(yǔ)句用一對(duì)花括號(hào){}括起來(lái)。
2、變量與算術(shù)表達(dá)式
考慮一個(gè)程序,用公式 C = (5/9)(F-32)打印溫度對(duì)照表: 華氏(Fahrenheit) 攝氏(Celsius) 0 -17 20 -6 40 4 60 15 80 26 100 37 ... ... ... ... 280 137 300 148
基本數(shù)據(jù)類型: char short int long float double
3、控制語(yǔ)句
for if goto
4、符號(hào)常量
#define 名字 替換文本
5、數(shù)組
6、函數(shù)
7、字符輸入/輸出
int getchar(void) int putchar(int c)
int mygetline(char *s, int len);
大整數(shù)加法(可選)
/*********************** * 類型、運(yùn)算符與表達(dá)式 **********************/
1、變量名
名字是由字母和數(shù)字組成的序列,第一個(gè)字符必須為字母。下劃線"_"被看做是字母。 變量實(shí)際上是一段帶有名字、類型的存儲(chǔ)空間。
位與上下文
2、數(shù)據(jù)類型和長(zhǎng)度
C語(yǔ)言只提供了下列幾種基本數(shù)據(jù)類型: char int float double
類型決定了程序?qū)⑷绾问褂靡欢未鎯?chǔ)空間。
3、常量
類似 1234 的整數(shù)常量為 int 類型 long 類型的常量以字母 l 或 L 結(jié)尾 無(wú)符號(hào)常量以字母 u 或 U 結(jié)尾 后綴 ul 或 UL 表示 unsigned long 類型
浮點(diǎn)常量中包含一個(gè)小數(shù)點(diǎn)(如12.3)或一個(gè)指數(shù)(如12e-3),也可以兩者皆有。 沒(méi)有后綴的浮點(diǎn)數(shù)常量為 double 類型 后綴 f 或 F 表示 float 類型 后綴 l 或 L 表示 long double 類型
帶前綴 0 的整數(shù)常量表示它為八進(jìn)制格式 帶前綴 0x 或 0X 的整數(shù)常量表示它為十六進(jìn)制格式
一個(gè)字符常量是一個(gè)整數(shù)。例如:在ASCII字符集中,字符‘0’的值為 48 某些字符可以用轉(zhuǎn)義序列表示,如 '\n'
字符串常量 "hello, world!" C風(fēng)格的字符串包含尾0 編譯時(shí)可以將多個(gè)字符串常量連接起來(lái)。例如: "hello, ""world" 等價(jià)于 "hello, world!"
常量表達(dá)式是僅僅包含常量的表達(dá)式。這種表達(dá)式在編譯時(shí)求值。
枚舉是一個(gè)常量整型值的列表。 enum boolen {NO, YES};
4、聲明
所有的變量及函數(shù)都必須先聲明后使用。 一個(gè)聲明指定一種變量類型,后面所帶的變量表可以包含一個(gè)或多個(gè)該類型的變量。 int i, j, foo[16];
變量可以在聲明的時(shí)候初始化。 int i = 0;
外部變量和靜態(tài)變量默認(rèn)初始化為 0
變量的聲明可以使用 const 限定符。 該限定符指定的變量的值不能被修改。
5、算術(shù)運(yùn)算符
+ - * / % % 不能用于浮點(diǎn)類型
6、關(guān)系運(yùn)算符和邏輯運(yùn)算符
關(guān)系運(yùn)算符 > >= < <= == !=
邏輯運(yùn)算符 && || !
由 && 和 || 連接的表達(dá)式按從左到右的順序進(jìn)行求值,并且在知道結(jié)果值為真或假后立即停止計(jì)算。
根據(jù)定義,在關(guān)系表達(dá)式或邏輯表達(dá)式中,如果關(guān)系為真,則表達(dá)式的結(jié)果值為數(shù)值1;如果為假,結(jié)果值為數(shù)值0。
7、類型轉(zhuǎn)換
當(dāng)一個(gè)運(yùn)算符的幾個(gè)操作數(shù)類型不同時(shí),需要通過(guò)一些規(guī)則把它們轉(zhuǎn)換成某種共同的類型。
類型轉(zhuǎn)換分為自動(dòng)轉(zhuǎn)換(隱式)和強(qiáng)制轉(zhuǎn)換(顯式)兩種。
一般來(lái)說(shuō),自動(dòng)轉(zhuǎn)換是指把表達(dá)能力弱的操作數(shù)類型轉(zhuǎn)換成表達(dá)能力強(qiáng)的操作數(shù)的類型。 詳細(xì)規(guī)則參見(jiàn) ISO/IEC 9899:1999(E) 6.3.1.8
強(qiáng)制轉(zhuǎn)換: (類型名)表達(dá)式
8、自增和自減運(yùn)算符
++ --
9、按位運(yùn)算符
& 按位與 | 按位或 ^ 按位異或 << 左移 >> 右移 ~ 按位求反
10、賦值運(yùn)算符
= += -=
大多數(shù)二元運(yùn)算符都有一個(gè)相應(yīng)的賦值運(yùn)算符 op= ,op 可以是下面運(yùn)算符之一: + - * / % << >> & | ^
賦值語(yǔ)句本身也具有值,并且可以用在表達(dá)式中。
11、條件表達(dá)式
expr1 ? expr2 : expr3
12、優(yōu)先級(jí)與求值順序
/*********************** * 控制流 **********************/
1、語(yǔ)句與程序塊
在表達(dá)式之后加上一個(gè)分號(hào) ";" ,它們就成了語(yǔ)句。
用一對(duì)花括號(hào) "{" 和 "}" 把一組聲明和語(yǔ)句括起來(lái)就構(gòu)成一個(gè)復(fù)合語(yǔ)句(也叫程序塊)。 復(fù)合語(yǔ)句在語(yǔ)法上等價(jià)于單條語(yǔ)句。 右花括號(hào) "}" 用于結(jié)束程序塊,其后不需要分號(hào)。
2、if-else 語(yǔ)句
if-else 語(yǔ)句用于條件判斷。語(yǔ)法如下: if (expression) statement1 else statement2
else 部分可選。該語(yǔ)句執(zhí)行時(shí),先判斷 expression 的值,如果其值為真(非 0),則執(zhí)行 statement1 。 反之,如果其值為假(expression 的值為 0),則執(zhí)行 statement2 。
因?yàn)?else 部分可選,所以在嵌套的 if 語(yǔ)句中會(huì)導(dǎo)致歧義。 C語(yǔ)言規(guī)定每個(gè) else 與最近的前一個(gè)沒(méi)有 else 配對(duì)的 if 進(jìn)行匹配。 建議在有 if 語(yǔ)句嵌套的情況下使用花括號(hào)。
3、else-if 語(yǔ)句
折半查找
4、switch 語(yǔ)句
switch (expression) { case const-expr: statements break; case const-expr: statements default: statements }
5、while 循環(huán)和 for 循環(huán)
冒泡排序
void reverse(char s[])
逗號(hào)運(yùn)算符
6、do-while
itoa()
7、break 和 continue 語(yǔ)句
8、goto
/*********************** * 函數(shù)與程序結(jié)構(gòu) **********************/
函數(shù)可以把大的計(jì)算任務(wù)分解成若干個(gè)較小的任務(wù),程序員可以基于函數(shù)進(jìn)一步構(gòu)造程序,而不需要重新編寫所有代碼。 函數(shù)還可以將程序中不需要了解的具體細(xì)節(jié)隱藏起來(lái),從而使程序結(jié)構(gòu)更清晰,并降低修改程序的難度。
1、函數(shù)的基礎(chǔ)知識(shí)
返回值類型 函數(shù)名(參數(shù)表) { 聲明和表達(dá)式
return 返回值或表達(dá)式 }
grep
2、外部變量
函數(shù)都是外部的。
棧
逆波蘭序計(jì)算器(可選)
3、作用域規(guī)則
名字的作用域是指程序中可以使用該名字的部分。
變量 函數(shù)
4、頭文件
5、靜態(tài)變量
6、寄存器變量 register
7、const 和 volatile
8、程序塊結(jié)構(gòu)
9、初始化
10、遞歸(可選)
itoa()
11、C預(yù)處理器
文件包含 #include "文件名" #include <文件名>
宏替換
#define 名字 替換文本
#define max(A, B) ((A) > (B) ? (A) : (B))
#undef
條件包含
#if #else or #elif #endif
defined(identifier) defined identifier
#if !defined(identifier) #define identifier ... ... #endif
#ifdef #ifndef
12、函數(shù)的實(shí)現(xiàn)(可選)
/*********************** * 指針與數(shù)組 **********************/
指針是一種保存變量地址的變量。
1、指針與地址
&取地址,只能用于變量和數(shù)組元素。 指針的聲明,賦值,類型。 間接引用。&*a
2、指針與函數(shù)參數(shù)
swap()
用指針傳結(jié)構(gòu)體(可選)
3、指針與數(shù)組
數(shù)組聲明。含義。 數(shù)組初始化,賦值。 數(shù)組名,與指針的對(duì)應(yīng)關(guān)系。 類似的操作方式。
在函數(shù)定義中,形參 char s[] 等價(jià)于 char *s
4、地址算術(shù)運(yùn)算
指針的比較,運(yùn)算,+、-、自增。強(qiáng)調(diào)類型。強(qiáng)調(diào)(*ip)++的括號(hào)。 指針和整型的關(guān)系;ハ嗫梢赞D(zhuǎn)化,不可移植。
5、字符指針與函數(shù)
字符串常量是一個(gè)字符數(shù)組。
char amessage[] = "hello world!"; char *pmessage = "hello world!";
strcpy strcat strcmp
6、指針數(shù)組以及指向指針的指針
指針數(shù)組與數(shù)組指針。
7、多維數(shù)組
8、指針與多維數(shù)組
9、命令行參數(shù)
10、指向函數(shù)的指針
11、復(fù)雜聲明
/*********************** * 結(jié)構(gòu) **********************/
1、結(jié)構(gòu)的基本知識(shí)
考慮一下,如果我們要存儲(chǔ)一個(gè)復(fù)數(shù),或者是一個(gè)矢量,或者是一個(gè)坐標(biāo)值。
struct point { int x; int y; };
關(guān)鍵字 struct 引入結(jié)構(gòu)聲明。結(jié)構(gòu)聲明由包含在花括號(hào)內(nèi)的一系列聲明組成。 關(guān)鍵字 struct 后面的名字是可選的,稱為結(jié)構(gòu)標(biāo)記。結(jié)構(gòu)標(biāo)記為結(jié)構(gòu)命名。 在定義之后,結(jié)構(gòu)標(biāo)記就代表花括號(hào)內(nèi)的聲明,可以用它作為該聲明的簡(jiǎn)寫形式。
結(jié)構(gòu)中定義的變量稱為成員。結(jié)構(gòu)成員、結(jié)構(gòu)標(biāo)記和普通變量可以重名。
struct point a, b, c; struct {...} x, y, z; int x, y, z;
初始化,必須是常量表達(dá)式 struct point foo = {3000, 8000};
引用 結(jié)構(gòu)名.成員
結(jié)構(gòu)可以嵌套。
sizeof 對(duì)象 sizeof(類型名)
2、結(jié)構(gòu)與函數(shù)
結(jié)構(gòu)的合法操作只有幾種: 作為一個(gè)整體復(fù)制和賦值,通過(guò) & 運(yùn)算符取地址,訪問(wèn)其成員。
結(jié)構(gòu)指針 struct point *p; p->結(jié)構(gòu)成員
3、自引用結(jié)構(gòu)
malloc() 單鏈表
4、表查找 (可選)
5、類型定義
typedef int LENGTH; typedef char *STRING;
typedef int (*PFI)(char *, char *);
6、聯(lián)合
聯(lián)合提供了一種方式,在單塊存儲(chǔ)區(qū)中管理不同類型的數(shù)據(jù)。
union a { int a; float b; char *c; } d;
聯(lián)合名.成員 聯(lián)合指針->成員
7、位字段 (位域)
struct { unsigned int a : 1; unsigned int b : 2; unsigned int c : 1; } flags;
位序的問(wèn)題: 據(jù)說(shuō)常有公司出有關(guān)位域的面試題。 不同機(jī)器的位序不一致。 X86平臺(tái)從低到高。
例: union { struct { char a:1; char b:2; char c:1; } s; char d; } u; u.d = 1; printf("%d\n", u.s.a);
/*********************** * 再論函數(shù) **********************/
1、變量的類型
2、棧
3、x86 平臺(tái) linux 進(jìn)程的內(nèi)存結(jié)構(gòu)
4、函數(shù)的參數(shù)傳遞
5、用一個(gè)反匯編代碼來(lái)觀察函數(shù)的棧實(shí)現(xiàn)
6、遞歸
數(shù)學(xué)歸納法
7、變長(zhǎng)參數(shù)表
/*********************** * 標(biāo)準(zhǔn)庫(kù) **********************/
1、stdio.h
2、stdlib.h
3、string.h
|
|