版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章C語言的基本詞法一、字元集1.什麼是字元集
在C語言程式中允許出現的所有基本字元的組合稱為C語言的字元集。2.字元集分類(1)大小寫英文字母(52個)(2)數字符號(10個)(3)鍵盤符號(33個)(4)轉義字元3.轉義字元的作用、表示方法(1)作用:通常用來表示鍵盤上的控制代碼或特殊符號。(2)表示方法:由“反斜杠字元(\)”後跟單個字元或若干個字元組成。(3)常用轉義字元:
\n,\t,\a,\”,\’,\\,\ddd,\xhh二、保留字1.什麼是保留字在C語言的程式中有特殊含義的英語單詞稱為保留字。2.保留字的作用主要用於構成語句、進行存儲類型和數據類型的轉換。3.常用保留字可參考教材。三、識別字1.什麼是識別字識別字是用戶自定義的一種字元序列,通常用來表示程式中需要辨認的對象名稱。2.識別字的命名規則(1)識別字是由字元或下劃線開頭的字母、數字、下劃線組成的一串符號;(2)保留字不能作為識別字。正確識別字:sumia2a_2_a2_a_2錯誤的識別字:2aa?c.ga-2ifwhile第2章基本數據類型和運算2.1C語言的數據類型整型實型字元型無值型指針型數組結構型枚舉型共用型基本類型構造類型2.2常量一、什麼是常量二、常量類型
整型常量、實型常量、字元常量、字串常量三、常量特點四、各種類型常量說明1.整型常量(1)
整型常量就是整數,包括正整數、負整數及0;(2)整型常量有三種書寫方式十進位整數:0、-111、+15、21八進制整數:00、-0111、+015、021十六進制整數:0x0、-0x111、0x21(3)整型常量在機記憶體放一般占2個位元組,所表示的範圍-32768~+32767(4)為了擴大數值範圍,C語言提供“長整型常量”,長整型常量在機記憶體放占4個位元組。表示方法是在數的後面加一個L或l字母。(0L、40000L)2.實型常量(1)
實型常量就是帶小數點的實數,也稱為浮點數;(2)實型常量書寫方式有兩種:一般形式的實數:12.345、-1.23456、7.0指數形式的實數:-1.2345E3.0、0.12345e4(3)實型常量在機記憶體放一般占4個位元組;3.字元常量(1)
字元常量就是用兩個單引號(‘)前後括住的單個字元;例如:’a’、’A’、’1’、’%’(2)轉義字元也可以組成字元常量;例如:‘\n’、’\101’、’\x41’(3)字元常量在機記憶體放一般占1個位元組;4.字串常量(1)
字串常量就是用兩個雙引號(“)前後括住的若干個字元;例如:”abc”、”ABC”、”112”(2)轉義字元也可以出現在字串常量中;例如:“123\n4\\”、”\”1\43\n2\x11\””(3)字串常量在機記憶體放所佔用的位元組數等於字串長度+1;2.3變數一、基本問題1.什麼是變數2.變數的命名規則3.變數的特點(1)變數在內存中要佔用連續的若干個位元組;(2)所佔用的位元組數由變數的數據類型確定;(3)變數使用必須要先定義。二、變數的數據類型及其定義1.變數定義格式[存儲類型符]數據類型符變數名1,變數名2,……;
2.變數數據類型數據類型類型符號佔用位元組數數據類型類型符號佔用位元組數整型int2無符號長整型unsignedlong4短整型short2單精確度實型float4長整型long4雙精度實型double8無符號整型unsignedint2字元型char1無符號短整型unsignedshort23.變數存儲類型三、變數的初始化1.變數賦初值的語句格式:[存儲類型符]數據類型符變數名1=初值,變數名2=初值;
2.幾點說明存儲類型存儲類型符存儲地點自動型auto記憶體堆疊區寄存器型registerCPU的通用寄存器靜態型static記憶體數據區外部參照型extern3.舉例分析例1:main(){inta;staticintb;printf(“%d”,a);‘將輸出不確定的值
printf(“%d”,b);‘將輸出0}例2:voidf1();main(){f1();f1();}voidf1(){inta=3;staticintb=4;printf(“%d,%d”,a,b);a=a+1;b=b+1;}說明:(1)第1次調用f1(),將輸出3,4(2)第2次調用f1(),將輸出3,5四、變數的生存期和作用域1.什麼是內部變數和外部變數
把在函數(或某個複合語句)內定義的變數稱為“內部變數”,把在函數外定義的變數稱為“外部變數”。2.什麼是變數的生存期
我們把變數從開始分配記憶體單元到分配的記憶體單元被收回的期間稱為變數的生存期。3.什麼是變數的作用域
在變數的生存期中,我們把變數可以使用的程式區域稱為變數的作用域。4.作用域的分類全局變數:生存期覆蓋了定義點到整個程式結束的變數稱為全局變數。局部變數:生存期只覆蓋某個函數(或某個複合語句)的變數稱為局部變數。5.幾點說明6.舉例分析
inta1;main(){inta2;{inta3;}}inta4;voidf1(){inta5;staticinta6;}2.4運算符基本問題1.什麼是運算符
用來表示各種運算的符號稱為運算符。2.運算符特點(1)運算符必須有運算對象,運算對象都有規定的數據類型,同時運算結果也有確定的數據類型。(2)每個運算符都有自己特定的運算規則。(3)當運算式中出現多個運算符時則必須考慮運算符的優先順序。(4)同級別的運算符還規定了結合性。一、算術運算符包括基本算術運算符和增1、減1運算符兩種1.基本算術運算符(1)有哪些運算符號(2)特點(3)舉例說明運算符名稱優先順序結合性+、-取正、取負2自右向左*、/、%乘、除、取餘數3自左向右+、-加、減4自左向右2.增1、減1運算符(1)有哪些運算符號(2)特點①增1、減1的運算對象必須是變數或數組元素;②增1(或減1)運算符作為首碼使用時,是先對運算對象加1(或減1),然後再使用加1(或減1)後的運算對象。③增1(或減1)運算符作為尾碼使用時,是先使用不加1(或減1)的運算對象,然後再對運算對象加1(或減1)。運算符名稱優先順序結合性++增12自右向左--減1二、關係運算符1.關係運算有哪些運算符號2.關係運算符的特點①關係運算符可以用來比較兩個數值型數據的大小,也可以比較兩個字元型數據的大小。②關係運算符的運算結果是邏輯值,若為“真”用整數1表示,若為“假”用整數0表示。運算符名稱優先順序結合性>=、>、<=、<大於等於、大於、小於等於、小於6自左向右==、!=等於、不等於7自左向右三、邏輯運算符1.邏輯運算有哪些運算符號2.邏輯運算符的特點①邏輯運算符運算對象是數值型或字元型等;如果是非0表示邏輯真,0表示邏輯假。②運算結果是邏輯值,如運算結果為真用1表示,若為假則用0表示。運算符名稱優先順序結合性!邏輯非2自右向左&&邏輯與11自左向右||邏輯或12自左向右3.注意幾點①用“&&”對兩個運算式進行計算時,若第1個運算式的值為“假”,則與第2個運算式的值無關,結果肯定為“假”,所以C語言規定此時第2個運算式不再計算。②用“||”對兩個運算式進行計算時,若第1個運算式的值為“真”,則與第2個運算式的值無關,結果肯定為“真”,所以C語言規定此時第2個運算式不再計算。四、賦值運算符
賦值運算符分為三種:基本賦值運算符、算術自反賦值運算符、位自反賦值運算符1.基本賦值運算符(1)運算符號(2)特點①賦值運算符的前面必須是變數,後面是運算式;②賦值運算符是先計算運算式的值,再把值賦給變數。運算符名稱優先順序結合性=賦值14自右向左2.算術自反賦值運算符(1)運算符號(2)特點
該運算符是將某個變數和運算式進行指定算術運算後的結果賦予該變數。運算符名稱優先順序結合性+=加賦值14自右向左-=減賦值*=乘賦值/=除賦值%=模賦值五、逗號運算符1.運算符號2.特點(1)該運算符是雙目運算,其運算對象是運算式;(2)運算規則是依次計算前、後運算式的值;(3)運算結果是後運算式的值。運算符名稱優先順序結合性,逗號15自左向右六、條件運算符1.運算符號2.特點(1)該運算符是三目運算符,其三個運算對象是運算式(e1?e2:e3);(2)運算規則是如果e1運算式為“真”,取e2運算式的值,否則取e3運算式的值。運算符名稱優先順序結合性?:逗號13自右向左七、長度運算符1.運算符號2.特點(1)其運算對象可以是任何數據類型或變數;(2)運算對象必須用圓括號括住。運算符名稱優先順序結合性sizeof長度2無八、位運算符(一)基本問題1.什麼是位運算是一種對運算對象按二進位位進行操作的運算。2.位運算的特點(1)位運算不允許只操作其中的某一位,而是對整個數據按二進位位進行運算;(2)位運算的對象只能是整型數據(包括字元型),運算結果仍是整型數據。(3)位運算符分為位邏輯運算符、位移位運算符、位自反賦值運算符三種。(二)位邏輯運算符1.運算符號2.特點位邏輯運算符是將數據中每個二進位位上的“0”或“1”看成邏輯值,逐位進行邏輯運算。運算符名稱優先順序結合性~位非2自右向左&位與8自左向右^按位加9自左向右|位或10自左向右(三)位移位運算符1.運算符號2.特點(1)該運算符是將數據看成是二進位數,對其進行向左或向右移動若干位的運算;(2)該運算符是雙目運算,第一運算對象是移位對象,第二個運算對象是所移的二進位位數。運算符名稱優先順序結合性<<左移5自左向右>>右移自左向右(四)位自反賦值運算符1.運算符號2.特點該運算符是將某個變數和運算式進行指定位運算後的結果賦予該變數。運算符名稱優先順序結合性&=位與賦值14自右向左^=按位加賦值|=位或賦值<<=位左移賦值>>=位右移賦值2.5運算式1.什麼是運算式用運算符將運算對象連接形成的式子就是運算式。2.運算式的特點(1)每個運算式都可以按照其中運算符的優先順序和運算規則依次對運算對象進行運算,最終獲得一個數據,該數據稱為運算式的值。(2)運算式值的數據類型就稱為運算式的數據類型。3.運算式的分類主要有六種:算術運算式、關係運算式、邏輯運算式、條件運算式、賦值運算式和逗號運算式。4.運算式計算時的數據類型轉換(1)為什麼計算時數據類型要轉換(2)轉換方法①運算式計算中數據類型的自動轉換原則特點:參加運算的各個數據都轉換成數據長度最長的數據類型,然後計算。計算結果值當然就是數據長度最長的數據類型。例如:設i為int,f為float,d為double,e為long則10+a+i*f-d/e的結果是double。②運算結果存入變數時數據類型的自動轉換原則特點:先將運算結果的數據類型自動轉換成變數的數據類型,然後再賦予該變數。3.2賦值語句1.賦值語句是最常用的運算式語句,由賦值運算式加分號構成。2.賦值語句有三種形式:(1)簡單賦值:x=2*y+1;(2)多重賦值:x=y=z=3;(3)複合賦值:x+=y;3.使用賦值語句需注意以下兩點:(1)定義變數時若賦初值則不能採用多重賦值形式。例如:intx=y=z=0;
是錯誤形式。而應改寫成:
intx=0,y=0,z=0;而賦值語句x=y=z=0;
是正確形式。(2)賦值運算式可以出現在任何運算式中,而賦值語句則不能。例如:x=(y=2)+(z=3+y);
是正確的。而:x=(y=2;)+(z=3+y;);
是錯誤的。
3.3數據的輸出一、基本說明1.C語言本身沒有直接提供用於輸出的語句,它是通過輸出函數來實現的(例如:putchar函數、printf函數)。2.由於C語言將上述標準輸出函數的原型放在頭檔stdio.h中,因此在編寫程式時,要在根源程式的開頭用#include“stdio.h”命令將頭檔stdio.h包括到用戶根源程式中。(但是printf函數除外)二、putchar函數1.函數調用格式:putchar(參數);
其中:參數可以是一個字元型變數、整型變數或一個字元型常量(包括控制字元和轉義字元)。2.功能:是在顯示器上輸出一個參數對應的字元。例如:charch1=‘C’;inta=105;
putchar(ch1);/*輸出字元C*/
putchar(a);/*輸出字元i*/
putchar(‘n’);
/*輸出字元n*/
putchar(‘\n’);
/*輸出回車換行*/三、printf函數1.函數調用格式:
printf(“格式控制字串”,運算式1,運算式2,…);2.功能:按照自右向左的順序,依次計算各運算式的值,然後按照“格式控制字串”中規定的格式輸出到顯示器上顯示。例如:
inta=3,b=2;printf(“%d,%d”,b=a<b,a=a<b);輸出結果:1,0
3.說明:(1)輸出項可以是變數、常量和運算式。(2)格式控制字串中允許包含格式編輯符和原樣輸出的字串。例如:“c=%d”
(是一個格式控制字串)(c=是原樣輸出的字串,%d是格式編輯符)(3)格式編輯符用於指定輸出格式,其形式為:
%[格式修飾]格式字元(4)格式字元的符號及功能如下表所示:4.舉例分析:例3-1
格式字元數據對象輸出形式數據輸出方法%-mdint,shortunsignedintunsignedshortchar十進位整數無m按實際位數輸出有m輸出m位超過m位,按實際位數輸出不足m位,補空格無(-)右對齊(左補空格)有(-)左對齊(右補空格)%-mo八進制整數%-mx十六進制整數%-mu無符號整數%-mldlongunsignedlong十進位整數%-mlo八進制整數%-mlx十六進制整數%-mlu無符號整數%-m.nffloatdouble十進位小數無m.n按實際位數輸出有m.n輸出n位小數,總寬度為m%-m.ne十進位指數%-mcchar,int,short單個字元無m輸出單個字元,有m輸出m位,補空格%-m.ns字串一串字元無m.n按實際字串輸出全部字元有m.n僅輸出前n個字元,補空格3.4數據的輸入一、基本說明1.C語言本身沒有直接提供用於輸入的語句,它是通過輸入函數來實現的(例如:getchar函數、scanf函數)。2.由於C語言將上述標準輸出函數的原型放在頭檔stdio.h中,因此在編寫程式時,要在根源程式的開頭用#include“stdio.h”命令將頭檔stdio.h包括到用戶根源程式中。(但是scanf函數除外)二、getchar函數1.函數調用格式:getchar()2.功能:從鍵盤輸入一個字元。3.說明:該函數只能接收一個字元,而且得到的是字元的ASCII碼。該值可以賦給一個字元型變數或一個整型變數。4.舉例說明例3-2三、scanf函數1.函數調用格式:
scanf(“格式控制字串”,輸入項1,輸入項2,…);2.功能:按指定的格式接收由鍵盤輸入的數據,並存入輸入項變數所在的記憶體單元中。3.說明:(1)格式控制字串中允許包含格式編輯符和原樣輸入的字串。例如:“c=%d”
(是一個格式控制字串)(c=是原樣輸入的字串,%d是格式編輯符)(2)格式編輯符用於指定輸入格式,其形式為:
%[格式修飾]格式字元格式字元用於規定相應輸入項的輸入格式,其字元如下表所示:(3)輸入項必須為變數的地址,通常用“&變數名”組成。例如:定義intx;用scanf(“%d”,x);是錯誤的。用scanf(“%d”,&x);是正確的。
格式字元數據對象輸入形式數據輸入方法%mdint,shortunsignedintunsignedshortchar十進位整數無m按實際位數輸入有m輸入m位,不足m位則跟回車鍵%mo八進制整數%mx十六進制整數%mld
longunsignedlong十進位整數%mlo八進制整數%mlx十六進制整數%mf%mefloat十進位小數十進位指數%mlf%mledouble%mcchar單個字元無m僅取單個字元,有m輸入m位,僅取第一個字元%ms字串一串字元無m取若干個字元直到回車或空格為止,有m僅取前m個字元(4)輸入數據時,數據與數據之間應使用分隔符號。分隔符號有兩種形式:一種是在輸入格式控制串中給定的,例如scanf(“%d,%d”,&x,&y);其分隔符號為逗號(,)。另一種是空格、跳位字元(Tab)或換行符,它們不是在輸入格式控制串中給定的,而是用戶在鍵入數據時隨機使用的。例如:scanf(“%d%d”,&x,&y);執行時就可以用以上方法作為輸入數據之間的分隔符號。(5)鍵入數據的類型、寬度應該與格式控制中給定的相一致。例3-3第四章選擇結構程式設計一、概述:1.什麼是選擇結構在程式執行中依據條件判斷,確定某些操作是做還是不做,或者確定若干操作中選擇哪個操作來執行。2.選擇結構有兩種形式If語句(單分支結構、雙分支結構、多分支結構)switch語句4.1if語句一、單分支結構1.形式:
if(運算式)語句;2.語義:若運算式的值為非0,就執行“語句”,否則直接執行if語句的後繼語句。運算式語句塊非003.說明(1)“運算式”允許是任何運算式,而且兩側的圓括號不可少。(2)如果“語句塊”包含多個語句,必須用{}將其括成複合語句。二、雙分支結構1.形式:
if(運算式)
語句塊1;
else
語句塊2;2.其語義是:如果運算式的值為非0,則執行“語句塊1”,然後跳出if結構,執行後續語句;若運算式的值為0,則執行“語句塊2”,之後跳出if結構,往下執行後續語句。運算式語句塊1語句塊23.說明“運算式”允許是任何運算式,而且兩側的圓括號不可少。如果“語句塊”包含多個語句,必須用{}將其括成複合語句。else必須與if語句配對使用,而且總是和最近的if配對。例如:
if(c>=‘0’&&c<=‘9’)if(c==‘5’)y=0;elsey=1
if(c>=‘0’&&c<=‘9’){if(c==‘5’)y=0;}elsey=1三、多分支結構1.形式:
if(運算式1)
語句塊1;
elseif(運算式2)
語句塊2;
elseif(運算式3)
語句塊3;
else
語句塊4;2.說明
多分支if語句的執行步驟是:首先判斷運算式1的條件是否成立,若成立就執行語句1,否則判斷運算式2的條件是否成立,若成立就執行語句2……依次類推,若所有的條件都不成立,就執行else後面的語句,然後出口。4.2switch語句1.作用:用於實現多分支選擇結構問題。2.形式:
switch(運算式){case常量運算式1:語句1;[break;]case常量運算式2:語句2;[break;]
…
case常量運算式n:語句n;[break;][default:語句n+1;]}3.該語句的含義是:(1)先計算switch右邊運算式的值,並將其逐個與case行中“常量運算式”的值相比較,若相等,則執行case行給出的語句,若有break語句則跳出switch語句執行後續語句;(2)若沒有break語句則繼續執行後續case行所給出的語句;(3)如果所有的常量運算式都不匹配,則執行default行指引的語句。4.說明(1)該結構中{}必不可少,其中的語句是switch語句體;(2)case後跟的常量運算式與冒號一起構成語句標號。case和常量運算式之間必須要有空格,常量運算式的值必須唯一。(3)switch後面的運算式可以是整型、字元型,但不能是實型。運算式的值與常量運算式的值應保持類型一致。(4)case後面跟的語句允許是多條語句,可以不加{}。一個語句也可以被多個case共用。
例如:case1:case2:printf(“ok”);第五章迴圈結構程式設計一、概述:1.什麼是迴圈結構
在程式執行中當滿足某個特定的條件時,重複執行某段程式,直至條件不滿足為止,這種結構就稱為迴圈結構。2.迴圈結構有三種類型當型結構(while結構)直到型結構(do-while結構)已知迴圈次數的結構(for結構)5.1當型迴圈結構(while結構)1.形式:
while(運算式)語句;2.語義:先計算運算式的值,判斷其是否為0,若為非0,表示迴圈條件滿足,就執行循環體,如此重複,直至運算式的值為0,退出迴圈執行後繼語句。迴圈語句運算式後繼語句0非03.說明(1)運算式可以是任意合法的運算式,並以它作為判別循環體執行與否的條件。若運算式的值為非0表示條件成立;若為0表示條件不成立。(2)“語句”是重複執行部分,稱之為循環體。(3)循環體中可以只包含一句語句,也可以包含多個語句。若為多條語句,必須用{}括起來,組成一個複合語句,否則while語句只將第一句語句視為循環體。(4)循環體中必須要有改變條件運算式值的語句,否則將成為死迴圈。(5)該迴圈結構由於先判斷迴圈條件,當一開始條件就不成立循環體就不會執行,所以該迴圈結構又可稱允許0次迴圈的結構。舉例說明:例5-1#include“stdio.h”main(){charc;while((c=getchar())!=’\n’)switch(c){case‘0’:case‘1’:putchar(c+2);case‘2’:putchar(c+3);break;case‘3’:putchar(c+4);default:putchar(c+1);break;}printf(“\n”);}假設從鍵盤上輸入:420回車則程式運行結果為:55325.2直到型迴圈結構(do-while結構)1.形式:
do
語句;
while(運算式);2.語義:先執行循環體一次,然後判斷運算式是否成立,若為非0,表示迴圈條件滿足,就繼續執行循環體,如此重複,直至運算式的值為0,退出迴圈執行後繼語句。運算式後繼語句迴圈語句0非03.說明(1)運算式可以是任意合法的運算式。(2)“語句”是重複執行部分,稱之為循環體。(3)循環體中可以只包含一句語句,也可以包含多個語句。若為多條語句,必須用{}括起來,組成一個複合語句,否則只將第一句語句視為循環體。(4)循環體中必須要有改變條件運算式值的語句,否則將成為死迴圈。(5)該迴圈結構由於先執行迴圈語句再判斷迴圈條件是否成立,所以該迴圈結構又可稱不允許0次迴圈的結構。5.3已知迴圈次數的迴圈結構(for結構)1.形式:for(運算式1;運算式2;運算式3)語句;2.語義:(1)先計算“運算式1”的值;(2)再計算“運算式2”的值,並判斷其是否為0,若非0,則執行循環體一次,否則跳出迴圈,執行for語句的後續語句;(3)計算“運算式3”的值,然後轉到步驟(2)重複執行。注:for語句的語義也可用下圖表示:
求運算式1的值運算式2循環體語句求運算式3的值後續語句非003.說明(1)在整個for迴圈執行過程中,“運算式1”只計算一次,“運算式2”和“運算式3”可能計算多次;循環體可能多次被執行,也可能一次也不執行。(2)循環體中可以只包含一句語句,也可以包含多個語句。若為多條語句,必須用{}括起來,組成一個複合語句,否則只將第一句語句視為循環體。(3)for迴圈結構的循環體可以是空語句。(4)for語句中的各運算式都可以省略,但分號間隔符不能少。例如:
for(;運算式2;運算式3)
for(運算式1;;運算式3)
for(運算式1;運算式2;)
for(;
;)若運算式1省略,則運算式1的計算必須在for語句的上面完成。若運算式2省略,則循環體中必須要有控制迴圈結束的break語句,否則將會死迴圈。若運算式3省略,則運算式必須在循環體內完成。
5.4迴圈結構中的轉移語句一、break語句1.形式:break;2.功能:是終止當前的迴圈,轉向後繼語句執行。例如:for(x=1,y=0;x<=10;x++){y=y+x;
if(y>5)break;printf(“y=%d\n”,y);}
當x=3時,y的值為6,使if(y>5)的運算式的值為1,於是執行break語句,跳出for循環體。二、continue語句1.形式:continue;2.功能:對於while和do-while語句,其功能是結束本次迴圈轉去求迴圈條件運算式的值,而在for語句中,則是求解運算式3的值。While(運算式){…continue;…}do{…continue;…}While(運算式);for(;;){…continue;…}5.5迴圈結構的嵌套1.含義:當一個迴圈語句的循環體中又出現另一個迴圈語句時,就構成了迴圈的嵌套。2.形式:while()…while()…do…do…while();while();for(;;)…for(;;)…3.說明(1)不要將迴圈的嵌套和並列混為一談。例如:
for(i=1;i<3;i++){for(j=1;j<=2;j++)printf(“%d\t”,i*j);for(k=2;k<4;k++)m=i*k;s=s+m;}其中,j迴圈和k迴圈為並列關係,它們都是i的內層迴圈。(2)由於內迴圈是外迴圈的循環體,因此外迴圈每執行一遍,內迴圈從初值到終值完整執行一周。例如:
for(i=1;i<=3;i++)for(j=1;j<=2;j++)printf(“%d\t”,i*j);
內層循環體printf(“%d\t”,i*j);共執行了3*2(6)遍。例1:編寫程式,列印出所有的“水仙花數”。所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數本身。如:153=13+53+33,故153是水仙花數。main(){inti,x1,x2,x3;for(i=100,i<=999;i++){x1=i%10;/*取個位數*/x2=(i/10)%10;/*取十位數*/x3=i/100;/*取百位數*/if(x1*x1*x1+x2*x2*x2+x3*x3*x3==i)printf(“%d\t”,i);}}第六章數組6.1數組的概述:1.什麼是數組
數組是一組相同類型變數的集合。2.數組的特點(1)數組中的每一個成員稱為“數組元素”。每一個“數組元素”都有相同的名稱,但用不同的下標來區分。(2)每一個數組元素都可以當做單個變數來使用,但它們的數據類型都必須是相同的。(3)數組的類型可以是整型、實型、字元型、指針型、結構型等(4)數組根據其下標的個數可分為一維數組、二維數組及多維數組。6.2數組的說明一、數組說明形式1.形式:存儲類型數據類型數組名[長度1][長度2]……2.說明:(1)數組說明的作用是為數組預留空間。(2)數據類型可以是int、float、double、char等基本類型,也可以是指針型或結構類型。(3)數組名是按照“識別字”的規則構成的。(4)長度定義了數組中所含元素的個數,通常是一個整型常數。(5)方括號[]為下標運算符,其個數決定了數組的維數。例如:
inta[5],b[2][3];charc[20];floatd[4][3];
這裏一共定義了四個數組,其中a為一維整型數組,有5個元素;
b為二維整型數組,有2行3列共6個元素;
c為一維字元型數組,有20個元素;
d為二維實型數組,有4行3列共12個元素。二、使用數組的注意事項1.在C語言中,數組元素的下標起始值為0而不是1。例如:inta[5],b[2][3];
那麼a數組包含的數組元素為:
a[0],a[1],a[2],a[3],a[4]
b數組的元素為:b[0][0]、b[0][1]、b[0][2]b[1][0]、b[1][1]、b[1][2]2.[]中的長度必須為正整數。它們的乘積確定了整個數組的長度。3.[]中不允許使用變數定義數組長度;但允許包含符號常量和sizeof運算式6.3數組的引用一、下標變數的表示形式1.什麼是下標變數:數組中的每一個元素可以當做一個變數來使用,這種變數必須以下標形式表示。2.表示形式:數組名[下標1][下標2]……例如:inta[10];floatb[3][5];a[0]=15;a[9]=100;b[0][0]=3.58;b[0][4]=2.5;3.使用說明(1)引用下標變數時,所給出的下標個數必須與所定義的數組維數相一致,而且每一個下標運算式的值不得超界。例如:inta[10];a[10]=0;是錯誤的數組下標引用。(2)數組下標引用時可用整型常量、整型運算式和整型變數。6.4數組的賦初值1.給數組賦初值的語法形式數據類型數組名[下標1][下標2]…={常數列表}2.說明:(1){常數列表}為初值表,其中常數與常數之間用逗號分隔。例如:floatx[4]={-1.0,0.0,2.7,5.2E-8};inty[3][2]={{0,1},{2,3},{4,5}}x數組元素的初值為:x[0]=-1.0,x[1]=0.0,x[2]=2.7,x[4]=0.0000000052y數組元素的初值為:y[0][0]=0,y[0][1]=1,y[1][0]=2,y[1][1]=3,y[2][0]=4,y[2][1]=6,(2)對數組賦初值時,若初值表中常數個數少於數組元素的個數,這表示僅對數組中排列靠前的元素賦初值;若初值表中給定的初值多於下標變數的個數,將出現編譯錯誤。例如:intx[5]={10,20,30};是正確的
intx[5]={1,2,3,4,5,6}是錯誤的(3)C語言允許使用一維數組賦初值的方法對多維數組賦初值。下麵兩句語句寫法等價:
inty[3][2]={{0,1},{2,3},{4,5}}inty[3][2]={0,1,2,3,4,5}(4)一維數組定義時若賦初值則[]內的下標可省略,由初值表中初值的個數來間接決定長度。二維數組定義時若賦初值則第1個[]內的下標可省略,由初值表中初值的個數來間接決定其長度。例如:intx[]={0,1,2,3,4,5};inty[][3]={0,1,2,3,4,5};6.5字元數組與字串處理一、字串1.所謂字串,就是用雙引號括起來的字元序列。它是由若干個字元組成的,其最後一個字元是結束標記“\0”。2.在C語言中,沒有標準的字串定義類型,字串被當作字元數組來處理。3.所謂字元數組就是每一個元素都是一個字元變數的數組。二、字元數組的定義1.定義形式:char數組名[下標1][下標2]…
例如:charc1[100],c2[20][20];
c1被定義為一維字元數組,包含100個字元型的數組元素;c2被定義為二維字元數組,20行20列共有400個字元型的數組元素。2.說明因為字元型變數只能存放一個由單引號括起來的字元,因此字元數組中的每一個元素也只能存放一個字元。三、字元數組賦初值第一種方法:按單個字元的方式賦初值。例如:chars1[3]={‘1’,’2’,’3’};結果s1[0]的值為‘1’,s1[1]的值為‘2’,s1[2]的值為‘3’。但s1數組中存放的不是一個字串。
staticchars2[3]={‘1’,’2’};結果s2[0]的值為‘1’,s2[1]的值為‘2’,s2[2]的值為空。s2數組中存放的是一個字串。因為空字元的值為0,等於字串結束標記‘\0’。
chars3[3]={‘1’,’2’,’\0’}結果s3[0]的值為‘1’,s3[0]的值為‘2’,s3[2]的值為‘\0’。所以s3中存放的是一個字串。
第二種方法:是直接在初值表中寫一個字串常量。例如:chars1[3]={“12”};結果s1[0]的值為‘1’,s1[1]的值為‘2’,s1[2]的值為‘\0’。所以s1數組中存放的是一個字串。
chars2[5]={“ABCD”};結果s2[0]的值為‘A’,s2[1]的值為‘B’,s2[2]的值為‘C’,s2[4]的值為‘D’,s2[5]的值為‘\0’。存放的是一個字串。chars2[]={“ABCD”};結果s2[0]的值為‘A’,s2[1]的值為‘B’,s2[2]的值為‘C’,s2[4]的值為‘D’,s2[5]的值為‘\0’。存放的是一個字串。chars2[5]={“ABCDE”};該語句在編譯時將是錯誤的,因為數組元素個數小於字串長度。四、字串的輸入字串的輸入可以用scanf(),也可以用gets()。1.用scanf()輸入其形式為:
charc1[80];scanf(“%s”,c1);2.用gets()輸入其形式為:
charc1[80];gets(c1);3.說明(1)scanf()和gets()輸入相同的地方:它們都是直接用數組名,因為數組名是地址常量。另外輸入的字串最大長度必須是數組個數減1。(2)不同的地方:scanf()可以同時輸入多個輸入項,而gets()只能輸入一個輸入項。scanf()用%s格式輸入字串時,遇空格字元、Tab鍵和回車符將自動結束輸入。gets()不識別字串中的轉義字元,它原樣傳送,而以回車作為輸入結束。例如:charc1[40];scanf(“%s”,c1);
如果輸入Howareyou
則c1中只存放Howcharc1[40];gets(c1);
如果輸入Howareyou
則c1中只存放Howareyou五、字串的輸出字串的輸出可以用printf()
或puts()。1.用printf()輸出其形式為:
charc1[]=“abcdefg”;printf(“%s”,c1);2.用puts()輸出其形式為:
charc1[]=“abcdefg”;puts(c1);3.說明相同點:都能識別轉義字元。例如charc1[]=“ABCDEFGHI”;printf(“%s”,c1);結果為ABCputs(c1);結果為ABC不同點:printf()能輸出多個輸出項,而puts()則能輸出一個輸出項。六、常用字符串處理函數1.strlen函數形式:strlen(str);功能:計算並返回字串的長度(結束標記‘\0’不計入內)說明:str可以是字串常量、字元數組。例如:strlen(“abcdefgh\\\123”);結果為11。2.strcmp函數形式:strcmp(str1,str2);功能:比較str1和str2兩個字串的大小。若相同則返回0,若str1大於str2則返回大於0,若str1小於str2則返回小於0。例如:strcmp(“ABC”,”ABC”);結果為0strcmp(“abc”,”ABC”);結果為大於0strcmp(“ABC”,”abc”)結果為小於0說明:(1)str1、str2可以是字串常量、字元數組。(2)不能用if語句比較兩個字串是否相同。3.strcpy函數形式:strcpy(str1,str2);功能:將字串str2的內容連同結束標記‘\0’一起複製到str1中。說明:(1)str1、str2只能是字元數組。(2)str1必須有足夠的長度以容納str2的內容。例如:charc1[80],c2[40]=“abcdefghijk”;strcpy(c1,c2);4.strcat函數形式:strcat(str1,str2);功能:將字串str1與字串str2尾首相接,拼接以後,原str1串尾的結束符‘\0’被自動覆蓋,新串的未尾自動加上‘\0’,生成的新串存放於str1中。說明:(1)str1必須是字元數組、str2可以是字串常量、也可以是字元數組。
(2)str1必須有足夠的長度以容納拼接後的新串內容。例如:charc1[80]=“abcdefgh”,c2[40]=“xyz123”;strcat(c1,c2);結果為abcdefghxyz123編程舉例:例1:從鍵盤上輸入一串字串,並按逆序顯示出來。
main(){charc[80];inti;gets(c);for(i=strlen(c)-1;i>=0;i--)printf(“%c”,c[i]);}第7章指針7.1指針和指針變數一、指針1.什麼是指針所謂指針,就是指存放數據的記憶體地址。2.變數與記憶體地址的關係例如:有一條定義語句
inti=3,j=5;floatf;地址記憶體單元20012002200320042005200620072008整型變數i整型變數j單精確度變數f3.數組與地址的關係例如:有一條定義語句
inta[3];地址記憶體單元200120022003200420052006整型數組元素a[1]整型數組元素a[0]整型數組元素a[2]二、指針變數1.什麼是指針變數
用於存放地址的變數稱為指針變數2.指針變數的特點
地址是一種特殊的數據類型,所以存放地址的指針變數和存放字元型、整型、實型數據的變數是不同類型的變數。3.如何獲得地址3.如何獲得地址(1)變數地址或數組元素地址通過“&”運算符獲得。例如:inta,b[10];&a、&b[3](2)數組的首地址直接可用數組名,不必利用“&”運算符獲得。例如:intb[10]那麼數組名b就是數組首地址7.2指針變數的定義、初始化和引用一、指針變數的定義和初始化1.定義格式
存儲類型數據類型*指針變數名[=初值]……2.功能:定義指向“數據類型”變數或數組的若干個指針變數,同時給這些指針變數賦初值。3.說明3.說明(1)指針變數名前面必須有“*”號。(2)定義指針變數時的“數據類型”可以是任何數據類型,但這個數據類型不是指針變數中存放的數據類型,而是它將要指向的變數或數組的數據類型。(3)其中的初值必須是地址。4.舉例
inta;int*p=&a;intf1,f[10],*p1=&f1,*p2=f;二、指針變數的引用方式1.給指針變數賦值格式:指針變數=運算式例如:inti,*p_i;p_i=&i;2.直接引用指針變數名(1)作用:凡是用到地址時,可以直接引用指針變數名。(2)舉例:
inti,j,*p=&i,*q;
q=p;scanf(“%d,%d”,q,&j);3.通過指針變數來引用它所指向的變數(1)使用格式:*指針變數名(2)例如:
inti=1,j=2,k,*p=&i;k=*p+j;(等價於k=i+j;)printf(“%d”,*p);(等價於printf(“%d”,i);)
注意:printf(“%d”,p);是錯誤用法。三、取地址運算符與指針運算符說明:(1)“&”運算符的運算對象必須是已定義過的變數或數組名;(2)“*”運算符的運算對象必須是已賦值的指針變數;不能是普通變數。例如:inta,*pa=&a;*&a、*&pa、&*pa是正確用法;
&*a是錯誤用。運算符名稱優先順序結合性&取地址2自右向左*取對象7.3指針變數的使用一、指向變數的指針變數的使用1.給指針變數賦值格式:指針變數=地址運算式;說明:指針變數的數據類型和地址對應的數據類型應一致。例如:
inta,*p_a;floatb,*p_b;p_a=&a;p_b=&b;是正確的
p_a=&b;p_b=&a;是錯誤的2.引用所指向的變數(1)格式:*指針變數(2)說明:使用時要注意該指針變數必須已賦過值即已指向某個變數。二、指向一維數組的指針變數的使用1.指針變數指向數組的方法(1)指向數組首地址用賦初值方法:*指針變數=數組名在程式中賦值:指針變數=數組名(2)指向某數組元素用賦初值方法:*指針變數=&數組名[下標]在程式中賦值:
指針變數=&數組名[下標]2.用指向一維數組的指針變數處理數組元素(1)當指針變數指向數組首地址引用數組元素[i]:*(指針變數+i)(2)當指針變數指向下標為i的數組元素引用數組元素[i]:*指針變數引用數組元素[i-k]:*(指針變數-k)引用數組元素[I+k]:*(指針變數+k)(3)當指針變數指向數組首地址後,對下標為i的數組元素引用的四種方法*(指針變數+i)*(數組名+i),
指針變數[i]
數組名[i]例如:inta[10],*p=a;
若要引用a[5]數組元素:
*(p+5)、*(a+5)、p[5]、a[5]3.指向一維數組的指針變數的運算(1)指針變數和整數的算術運算
指針變數+整數指針變數-整數
++指針變數
--指針變數指針變數++
指針變數--例如:inta[10],*p=a;p+5(表示a[5]的地址,指針仍指向a[0])
p=&a[4],p-2(表示a[2]的地址,指針仍指向a[4]
)
p=&a[3],p++(表示a[3]的地址,指針將指向a[4])
p=&a[3],++p(表示a[4]的地址,指針將指向a[4])
a+5(表示a[5]的地址)
a++(這是不允許的)例如:(2005年試卷試題一(7))main(){inta[4]={0,4,5,13},*p;p=&a[2];printf("++(*p)=%d\n",++(*p));printf("*--p=%d\n",*--p);printf("*p++=%d\n",*p++);printf("%d\n",a[0]);}輸出結果:
++(*p)=6*--p=4*p++=40(2)指針變數和指針變數的減法運算
指針變數1-指針變數2注意:要求這兩個指針變數必須指向同一個數組,否則不能進行減法運算;運算結果為它們所指向的數組元素下標相差的整數。例如:inta[10],*p=&a[5],*q=&a[8];q-p(值為3)
p-q(值為-3)(3)指針變數的關係運算
指針變數1關係運算符指針變數2注意:要求這兩個指針變數必須指向同一個數組,否則不能進行關係運算;運算結果為邏輯真(1),或邏輯假(0)。例如:inta[10],*p=&a[5],*q=&a[8];q>p(值為1)
q<p(值為0)
p>=a(值為1)
p>=&a[8](值為0)
三、指向字串的指針變數的使用1.將指針變數指向字串常量的方法第一種方法:給指針變數賦初值的方法格式:*指針變數=字串常量例如:char*p=“abcd”第二種方法:先定義指針變數,再賦值。格式:指針變數=字串常量例如:char*pp=“abcd”2.指向字串常量的指針變數的使用(1)處理整個字串輸出字串printf(“%s”,指針變數);輸入新的字串代替原字串
scanf(“%s”,指針變數);(2)處理字串中的單個字元第i個字元的表示方法*(指針變數+i)3.指向存放字串的字元數組的指針變數的使用同數組處理。四、指向二維數組的指針變數的使用1.指針變數指向二維數組的某個元素(1)讓指針變數指向二維數組的某個元素的方法用賦初值方式的格式:
*指針變數=&數組名[下標1][下標2]用賦值方式的格式:
指針變數=&數組名[下標1][下標2](2)數組元素的引用方法:*指針變數2.指針變數指向二維數組的首地址(1)指針變數指向二維數組首地址的方法用賦初值的方式有兩種:
*指針變數=二維數組名
*指針變數=&二維數組名[0][0]用賦值的方式也有兩種:
指針變數=二維數組名指針變數=&二維數組名[0][0](2)數組元素的地址表示方法:
指針變數+i*列數+j
數組元素的引用方法:
*(指針變數+i*列數+j)3.指針變數指向二維數組中某個一維數組(1)讓指針變數指向二維數組中某個一維數組的方法第一步:先定義一個指針變數
(*指針變數)[m]第二步:將該指針變數指向二維數組的首地址用賦初值的方法:(*指針變數)[m]=二維數組名用賦值的方法:指針變數=二維數組名第i行對應的一維數組首地址可以用下列運算式表示:*(指針變數+i)(2)二維數組元素的引用方法數組元素地址:*(指針變數+行下標)+列下標數組元素引用:*(*(指針變數+行下標)+列下標)7.4指針數組和多級指針一、基本問題1.什麼是指針數組當某個數組被定義為指針類型,就稱這樣的數組為指針數組。2.什麼是多級指針用來存放其他指針變數的地址的指針變數稱為二級指針。二、指針數組的定義1.定義格式
存儲類型數據類型*指針數組名[長度]={初值1}2.功能:3.說明:三、指針數組元素的引用1.引用所指向的普通變數或數組*指針數組名[下標]2.對其賦值:指針數組名[下標]=地址運算式3.參加運算:(1)賦值運算(2)算術運算(3)關係運算四、多級指針的定義和應用1.定義格式:存儲類型數據類型**指針變數={初值1}……
功能、使用說明2.引用方法
*二級指針變數(代表所指向的一級指針變數)**二級指針變數(代表所指向的一級指針變數指向的變數)第8章函數8.1函數的概念一、函數的概念1.什麼是函數函數是一個可以反復使用的程式段,從其他的程式段中均可以通過調用語句來執行這段程式,完成既定的工作。2.函數說明(1)建立函數稱為“函數定義”,使用函數稱為“函數調用”。(2)調用其他函數的函數稱為“主調函數”,而被調用的函數稱為“被調函數”。二、函數的定義1.定義格式(1)有參函數的定義存儲類型數據類型函數名(形式參數表)形式參數說明序列;
{數據定義語句序列;執行語句序列;
}(2)無參函數的定義存儲類型數據類型函數名()
{數據定義語句序列;執行語句序列;
}2.定義函數的說明(1)函數有“函數頭”和“函數體”兩部分組成;(2)存儲類型可以是exterm和static兩種;(3)數據類型規定了函數返回值的數據類型,若無返回值則數據類型為void;(4)形式參數表是用逗號分隔的若干個形式參數,每個形參可以是一個變數名、數組名、指針變數名和指針數組名;(5)形參說明可以用一條說明語句說明,也可以寫在形式參數表中;(6)形參若是數組,只需給出數組名,數組長度不需給出;(7)如果函數有返回值,則在函數體中應有一條返回語句“return(運算式);”,無返回值,則返回語句應為“return;”,也可以省略。三、函數的調用1.調用格式(1)沒有返回值的函數調用格式:
函數名(實際參數表);(2)有返回值的函數調用格式:函數名(實際參數表)2.函數調用時對被調函數的說明(1)調用系統函數時,要求在程式的開始用包含命令“#include<頭檔案名.h>”(2)如果被調函數是非整型或字元型函數,而且書寫順序在主調函數後面,則在主調函數中需對被調函數進行說明。例8-1intmax(x1,x2,x3)intx1,x2,x3;{
……}main(){intx,y,z,w,m;scanf("%d,%d,%d,%d",&x,&y,&z,&w);m=max(x-y,y-z,z-w);printf("max=%d\n",m);}例8-2main(){voidf();inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);
f(a);for(i=0;i<10;i++)printf("%d",a[i]);}voidf(b)intb[];{……}8.2函數調用中的數據傳遞方法一、基本問題1.函數調用中的數據傳遞方法(1)值傳遞方式(2)地址傳遞方式二、值傳遞方式1.特點(1)值傳遞方式所傳遞的是參數值;(2)調用函數時,將實值的值計算出來賦予對應的形參(3)在函數體中對形參的加工與實參完全脫離關係;(4)當函數體執行完畢返回時,形參的值將不回帶到對應的實參中;(5)用值傳遞方式時,形參一般都是變數,實參可以是變數,也可以是運算式。2.舉例說明(例8-1)三、地址傳遞方式1.特點(1)地址傳遞方式所傳遞的是地址,調用函數時,將實值的地址賦予對應的形參作為其地址;(2)因為形參和實參共用同一個地址,所以在函數體中對形參的加工實際是對實參的加工;(3)當函數體執行完畢返回時,形參的值將回帶到對應的實參中;(4)用地址傳遞方式時,實參可以是變數地址、指針變數或數組名,所以形參一般是指針變數或數組名。2.舉例說明(例8-2)例8-3(2005年試卷試題二(2))#include<stdio.h>voidfunc(int*x,inty){statick=3;y=*x+y;*x=y%k;k++;printf("*x=%d,y=%d\n",*x,y);}voidmain(){intx=12,y=5;func(&x,y);printf("x1=%d,y1=%d\n",x,y);func(&y,x);printf("x2=%d,y2=%d\n",x,y);}結果:*x=2,y=17x1=2,y1=5*x=3,y=7x2=2,y2=38.3函數的嵌套調用和遞歸調用一、函數的嵌套調用1.什麼是函數的嵌套調用函數甲調用了函數乙,而函數乙又調用了函數丙。2.嵌套調用方法函數甲函數乙函數丙調用函數乙返回調用函數乙結束返回二、函數的遞歸調用1.什麼是函數的遞歸調用即函數在自身定義的內部又調用自己。2.遞歸的特點(1)遞歸必須有遞歸結束條件;(2)遞歸過程首先是一級一級遞推(即當前調用未結束又引出下一層調用),而滿足遞歸結束條件時結束遞推,再一級一級的回歸(即一級一級再返回上一級的調用繼續完成上一級的未完成的操作)。3.舉例說明例8-4(2004年試卷試題一(7))voidconv(intm){if(m>=2)conv(m/2);printf("%d",m%2);}voidmain(){conv(13);}結果是:11018.4指針型函數及調用一、指針型函數的定義1.什麼是指針型函數是指該函數的返回值是指針型的,也就是說,這類函數的返回值是地址數據。2.指針型函數的特點指針型函數的返回值必須是地址值,調用該類函數時,接受返回值的必須是指針變數等能存入地址的對象。3.定義方法定
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论