第1章~第3章java
1.關於scanf和printf的格式問題:c++
1 scanf("%d,%d", &a, &b);
上面的語句分析:"%d,&d"指定輸入的數據按照什麼格式輸入, &是地址符, &a的含義是「變量a的地址」,整個語句的做用是:從鍵盤讀入兩個整數,送到變量a和b的地址出,而後把兩個整數分別賦予a和b。算法
scanf(格式控制,地址列表);數組
printf(格式控制,輸出列表);ide
a=12;b=34;模塊化
printf("a=%5d \nb=%4d\n",a,b); 函數
輸出:(口表示空格)工具
口口口12學習
口口34優化
2.結構化程序設計方法:
強調程序設計風格和程序結構的規範化,提倡清晰的結構。
經常使用方法:
(1)自頂向下、逐步細化:將問題求解由抽象逐步具體化的過程。
(2)模塊化設計:當程序複雜是很是有必要。根據程序的模塊的功能將它劃分爲若干子模塊,子模塊再細分,這個過程是自頂向下的。程序中的子模塊經常使用函數實現。
(3)結構化編碼:就是將設計好的一個結構化的算法用程序語言表示,用3個基本的結構語句(if-else,while,for語句)實現。
3.指數形式的常量:
12.34e-8:表明12.34*10^8 由於沒法表示指數符號,因此用e或者E表明以10爲地鼠的指數,注意e或E前面必需要有數字,且指數必須爲整數。
4.注意c中的轉義字符及其做用:轉義字符常以「\」開頭。
5.標識符:數字、字母和下劃線組合而成,不能以數字開頭。
6.不一樣類型數據間的混合運算:
自動進行類型轉換再運算。一般是向精度高的類型轉換。
7.強制類型轉換:
(類型名) 表達式
例子:
1 double x; 2 int a;
a=(int)x ;
把x強制類型轉換爲int型,獲得一個臨時的中間值,再把中間值賦給a;注意x的值和類型都沒有變化。
第4章 選擇結構程序設計
選擇結構和條件判斷:
(1)if-else語句:實現兩個分支的選擇結構
(2)switch語句:實現多分支的選擇結構
第5章 循環結構程序設計
(1)while語句:
(2)do-while語句:
(3)for語句:
用break語句跳出循環。
用continue語句提早結束本次循環,進入下一次循環條件檢查。
第6章 數組
1.定義一維數組:
類型符 數組名[常量表達式];
常量表達式中能夠包含常量和符號常量,但不能包含變量。數組的大小一依賴於程序運行過程當中變量的值。
說明:可變長數組
void fun(int n)
{
int a[n]; //合法,數組大小由形參n傳入,函數調用過程n的大小不變,數組的長度是固定的。
}
2.定義二維數組:
類型符 數組名[常量表達式1][常量表達式2];
二維數組中元素的排列順序是按行存放的,在內存中先存放第一行的元素,接着存放第二行的元素。。。
3.字符數組:
字符數組結束的標誌:'\0'
char c[]={"china"};
c | h | i | n | a | \0 |
4.字符串處理函數:
包含在頭文件中:
#include<string.h>
說明:庫函數不是c語言自己的組成部分,而是c語言編譯系統爲方便用戶使用而提供的公共函數。不一樣的編譯系統可能有微小差異,使用時能夠查詢庫函數手冊。
(1)puts函數:輸出字符串的函數
用法:puts(字符數組);
char str[]={"china\nbeijing"};
puts(str);
輸出結果:
china
beijing
(2)gets函數:輸入字符串的函數
用法:gets(字符數組);
gets(str); //str是已定義的數組
(3)strcat函數:字符串鏈接函數
用法:strcat(字符數組1,字符數組2);
printf("%s",strcat(str1,str2));
(4)strcpy和strncpy函數:字符串複製函數
用法:
strcpy(字符數組1,,字符數組2); 將字符數組2複製到字符數組1中去。
strncpy(字符數組1,,字符數組2,n);將字符數組2中最前面的n個字符複製到字符數組1中,取代字符數組1中最前面的n個字符.
n不大於字符數組中原有字符個數(不包括結束標誌符\0)。
strcpy(str1,str2);
strncpy(str1,str2,n);
(5)strcmp函數:字符串比較函數
strcmp(字符串1,字符串2);
相等返回0,str1>str2返回正數,str1<str2返回負數
strcmp(str1,str2);
(6)strlen函數:測量字符串長度的函數
strlen("china"); //值是5,不包含結束標誌符\0
(7)strlwr函數:將字符串中的大寫字母轉換爲小寫字母
strupr函數:轉換爲大寫
strlwr(str);
strupr(str);
第7章 用函數實現模塊化程序設計
函數就是功能,每個函數實現一個特定的功能,函數名應反映函數所表明的功能。
1.函數定義:包括函數聲明和函數實現
類型名 函數名(形參列表)
{
函數體
}
(1)定義空函數:
類型名 函數名()
{ }
在程序設計過程當中,每每根據須要肯定若干個模塊,分別由一些函數實現。在第一階段每每只涉及最基本的模塊,在須要擴充的地方定義一個空函數,函數暫時沒寫好,只是先佔一個位置,之後再用一個編寫好的函數代替它。這樣作,使程序結構清晰,可讀性好,擴充功能也方便。
(2)c程序設計人員有一個習慣,就是把全局變量的首字母大寫。例如 float Max=0; 同名的全局變量會被局部變量 屏蔽。
在沒必要要時儘可能不用全局變量:緣由有
(1)空間消耗多
(2)通用性下降
(3)下降程序的可讀性和清晰性,容易出錯。
2.靜態局部變量(static局部變量):(注意:在c和c++中是下面的狀況,但在java中不是這樣的!!)
靜態局部變量的值在函數調用結束後不消失而繼續保留原值,其佔用的存儲單元不釋放。下一次再調用這個函數時,該變量已經有值(上一次函數調用結束時的值)。static變量在整個程序運行過程當中都不釋放,在函數調用結束後仍然存在,但只有建立它的函數能引用它,不能被其餘函數引用。
用法:若非必要,不要多用靜態局部變量,由於調用時不知道當前static變量的值是什麼,是否被修改過。
3.寄存器變量(register變量):通常變量是存放在內存中的,存取速度較慢。若是須要頻繁存取的,能夠定義爲寄存器變量,用關鍵字register聲明。
register int pi;
使用:如今計算機優化的編譯系統能識別使用頻繁的變量,自動將它們放到寄存器中,再也不須要程序設計者指定。
4.變量有3種存儲位置:
(1)動態存儲區:動態的局部變量
(2)靜態存儲區:靜態局部變量(即static變量),還有全局變量(即外部變量)
(3)寄存器:register變量
5.用extern關鍵字作「外部變量聲明」,擴展外部變量的做用域。
例子:
1 int main() 2 { 3 extern int A,B,C; //把外部變量A,B,C的做用域擴展到此處 4 scanf("%d%d%d",7A,&B,&C); 5 printf(max()); 6 } 7 int A,B,C; //定義外部變量A,B,C 8 int max() 9 { 10 int m=A>B?A:B; 11 return m>C? m:C; 12 }
將外部變量聲明放在引用它的全部函數以前,能夠避免使用extern關鍵字聲明。
上面的代碼和下面的代碼是等價的:
1 int A,B,C; //定義外部變量A,B,C 2 3 int main() 4 { 5 scanf("%d%d%d",7A,&B,&C); 6 printf(max()); 7 } 8 int max() 9 { 10 int m=A>B?A:B; 11 return m>C? m:C; 12 }
(1)將外部變量的做用域擴展到其餘文件
使用:其餘文件要引用另外一個文件中已定義的外部變量。
1 //file1.c 2 #include<stdio.h> 3 int A ; //定義外部變量 4 5 //file2.c 6 extern A; //把file1文件中已定義的外部變量的做用域擴展到本文件
(2)將外部變量的做用域限制在本文件中
1 //file1.c 2 #include<stdio.h> 3 static int A; 4 int main() 5 { 6 ...... 7 } 8 9 //file2.c 10 extern A; 11 void fun(int n) 12 { 13 A=A+n; //error,A的做用域被限制在文件file1中! 14 }
使用注意:在程序設計過程當中,每一個人各自完成不一樣模塊,可能使用同名的外部變量,只須在每一個文件中定義外部變量時加上static便可!
(3) static聲明一個變量的做用:
1.對局部變量用static聲明,把它分配到靜態存儲區,在整個程序執行過程不釋放。
2.對外部變量用static聲明,是把該外部變量的做用域限制在本文件中。
(4)關於變量的聲明和定義
定義:創建存儲空間的聲明稱爲定義。
聲明:不須要創建存儲空間的聲明稱爲聲明。
(5)內部函數和外部函數
1.內部函數:一個函數只能被本文件中的其餘函數所調用,則這個函數稱爲內部函數。在定義內部函數時,用static修飾符修飾。
static int fun();//函數fun只能被本文件調用
用法:一般把只能由本文件使用的函數和外部變量放在文件的開頭,前面都冠以static使之局部化,其餘文件不能引用,提升程序可靠性。
好處:內部函數又稱爲靜態函數,使用內部函數,能夠把函數的做用域只侷限於所在文件。這樣子在不一樣文件中即便具備同名的函數也互不干擾。在一個大工程中,在各人編寫本身的文件模塊時,使用內部函數,能夠沒必要擔憂所用函數是否會與其餘文件模塊的函數同名。
2.外部函數: 在定義函數時,在函數首部的最左端加掛念子extern修飾,在此函數是外部函數,能夠供其餘文件調用。省略extern則默認爲外部函數。
extern int fun();//函數fun能夠被其餘文件調用。
第8章 指針
指針是很靈活但也很容易出錯的工具,初學者不易學會,要謹慎使用~~
1.指針指向內存地址。
2.指針引用數組,也是指向數組的首地址,而不是整個數組。
3.指針引用字符串,也是指向字符串第一個字符的地址。
1 char *string; //定義個char*型變量 2 string="I love China!"; //把字符串第1個元素的地址賦給字符指針變量string 3 4 //這裏的string被定義爲一個指針變量,基類是字符型,它只能指向一個字符型數據。
若是再對指針變量賦值,如:
1 string="I am a student";
這時候string就指向了新的字符串。
執行語句:
1 printf("%s\n",string); //輸出字符串string
輸出結果以下:
I am a student
說明:
經過字符數組名或者字符指針變量能夠輸出一個字符串,但對於一個數值型數組,只能逐個元素輸出。
數組名作函數參數,只是把數組的首地址傳給形參,函數裏修改值會影響傳入數組的實參的值。
第9章 結構體變量struct
1.用關鍵字struct聲明用戶自定義的結構體類型。
struct 結構體名
{
類型名 成員名1;
類型名 成員名2;
類型名 成員名3;
...
};
先聲明結構體類型,而後定義該類型的變量。
使用方式1:
1 struct student 2 { 3 int id; 4 char name[8]; 5 char sex; 6 int age; 7 }; 8 student stu1,stu2;
使用方式2:
1 struct student 2 { 3 int id; 4 char name[8]; 5 char sex; 6 int age; 7 }stu1,stu2;
結構體類型也能夠和基本數據類型同樣,使用結構數組、結構指針等,是一種用戶自定義的很是靈活的類型。
2.用關鍵字union定義聯合類型(共用體):
1 union Data //聲明共用體類型 2 3 { 4 5 int i; 6 7 char c; 8 9 float f; 10 11 }; 12 13 Data a; //定義變量
聯合類型的全部成員變量共享一塊內存,內存長度取決於全部成員中佔用內存最長的一個成員。好比上面的Data的實例變量a佔用4個字節(float類型佔用4個字節)。
union在某個時刻只能有一個值,起做用的成員是最後一次被賦值的成員。
不能引用實例變量名,只能用點運算符(.)操做成員。
3.枚舉類型用關鍵字enum聲明:
enum Weekday {sun,mon,tue,wed,thu,fri,sat};
關鍵字 枚舉變量名 0 1 2 3 4 5 6 (每個元素默認表明一個整數,從0開始。不能對枚舉元素賦值!)
4.用typedef關鍵字聲明新類型名。在c++裏是typename。
《c程序設計(第四版)學習輔導》第二部分 深刻學習c程序設計
第11章 預處理指令
c程序中,在正式編譯以前,要先對源碼中一些「預處理指令」進行「預處理」,把預處理指令轉換成相應的代碼段。這項工做由c預處理器完成。
1.c提供的預處理功能包括有如下三種:
(1)宏定義
(2)文件包含
(3)條件編譯
這些指令以「#」開頭,指令後沒有分號。
(1)宏定義
①宏定義:
#define 標識符 字符串
#define PI 3.1415926
說明:宏定義只是用宏名簡單替代一個字符串,只是簡單的置換,不作正確型檢查。
②帶參數的宏定義:
#define 宏名(參數表) 字符串
#define s(a,b) a*b
......
area=s(3,2); //用3*2代替s(3,2)
帶參數的宏定義展開置換:從左到右替換,若是宏定義中的字符不是參數字符,則保留。(例如上面的*號)。宏定義對空格很是敏感,必定要謹慎使用空格。
使用宏的次數多時,宏展開後源代碼會變長,函數調用不會使代碼變長。
宏替換不佔用運行時間,只佔用預處理時間,函數調用佔用運行時間。
通常用宏表明簡短的表達式比較適合。
(2)文件包含
①文件包含指令
#include<...> //標準方式,系統到存放c庫函數頭文件的目錄中尋找包含的文件
#include"..." //系統先在用戶當前目錄中尋找包含的文件,如找不到,再按照標準方式尋找。
(3)條件編譯
在知足某條件時對某一組語句進行編譯,當條件不知足時則編譯另外一組語句。
使用形式:(else語句能夠缺省)
①:
1 #ifdef 標識符 //若是指定的標識符已經被宏定義過 2 程序段1 3 #else 4 程序段2 5 #endif
②:
1 #ifndef 標識符 //指定的標識符沒有被定義過 2 程序段1 3 #else 4 程序段2 5 #endif
③:當指定的表達式值爲真(非0)事就編譯程序段1,不然編譯程序段2
1 #if 表達式 2 程序段1 3 #else 4 程序段2 5 #endif
第12章 位運算
運算符 | 含義 | 運算規則 | 經常使用功能 |
& | 按位與 | 0&0=0,0&1=0,1&1=1 | 清零,取一個數中某些指定位,保留某些位 |
| | 按位或 | 0|0=0,0|1=1;1|1=1 | |
^ | 按位異或 | 0^0=0,0^1=1;1^0=1;1^1=0 | 使特定位反轉,交換兩個值而不用臨時變量 |
~ | 按位取反 | 0變1,1變0 | |
<< | 左移 | 二進制數向左移位,高位左移後溢出丟棄,低位補0 | |
>> | 右移 | 二進制數向右移位,高位補0,低位被丟棄 |
說明:
1.位運算符中,只有~取反是單目運算符,其餘都是雙目運算符,須要2個操做數。
2.參與位運算的對象只能是整型或者字符型的數據,不能爲實型數據。
3.不一樣長度的數據進行位運算,系統將兩者按右端對齊,正數額左側補滿0,負數的左側補滿1,無符號整數則左側補滿0.
4.還與一個位段的概念,就是把一個多字節數據分紅多位段。