《c程序設計(譚浩強)》讀書筆記

第1章~第3章java

1.關於scanf和printf的格式問題:c++

1 scanf("%d,%d", &a, &b);
View Code

上面的語句分析:"%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;
View Code

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 }
View Code

將外部變量聲明放在引用它的全部函數以前,能夠避免使用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 }
View Code

 (1)將外部變量的做用域擴展到其餘文件

使用:其餘文件要引用另外一個文件中已定義的外部變量。

1 //file1.c
2 #include<stdio.h>
3 int A ; //定義外部變量
4 
5 //file2.c
6 extern A; //把file1文件中已定義的外部變量的做用域擴展到本文件
View Code

(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 }
View Code

使用注意:在程序設計過程當中,每一個人各自完成不一樣模塊,可能使用同名的外部變量,只須在每一個文件中定義外部變量時加上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;
View Code


使用方式2:

1 struct student
2 {
3  int id;
4   char name[8];
5   char sex;
6   int age;
7 }stu1,stu2;
View Code

結構體類型也能夠和基本數據類型同樣,使用結構數組、結構指針等,是一種用戶自定義的很是靈活的類型。


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; //定義變量
View Code

聯合類型的全部成員變量共享一塊內存,內存長度取決於全部成員中佔用內存最長的一個成員。好比上面的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
View Code

②:

1 #ifndef 標識符  //指定的標識符沒有被定義過
2     程序段1
3 #else
4       程序段2
5 #endif
View Code

③:當指定的表達式值爲真(非0)事就編譯程序段1,不然編譯程序段2

1 #if 表達式
2     程序段1
3 #else
4       程序段2
5 #endif
View Code


第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.還與一個位段的概念,就是把一個多字節數據分紅多位段。

相關文章
相關標籤/搜索