版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言基礎知識總結c語言基礎知識總結主要內容:i.c數(shù)據(jù)類型.簡單的算術運算和表達式.鍵盤輸入和屏幕輸出.選擇控制結構總結風格:分條羅列,主要是知識點,有例題不多5.循環(huán)控制結構ー、C數(shù)據(jù)類型.C語言處理兩種數(shù)據(jù):常量和變量.常量:整形常量、實型常量、字符常量、字符串常量、枚舉常量.整形常量:正整數(shù)、負整數(shù)、零eg:10,-30,0.實型常量:實數(shù)、小數(shù)、浮點數(shù)eg:3.14,-0.56,18.0.字符常量:字符型常量、用單引號括起來的任意字符eg:‘x''X' '9'.字符串常量:用雙引號括起來的ー個或多個字符eg:"x""Hello""丫78".在C程序中,整型常量可以用十進制、ハ進制、十六進制形式表示,但編譯器都會自動將其轉換成二進制存儲.整型常量的類型:長整型、短整型、有符號、無符號。.不同進制的整型常量的表示形式:1)十進制:〇?9數(shù)字組合,可帶正負號eg:256,-128,0,+72)ハ進制:〇開頭,后面跟〇、7數(shù)字組合eg:021,-0173)十六進制:Ox(OX)開頭,后跟〇?9,a?f(A?F)數(shù)字組合eg:0x12,-OxlF.不同類型的整形常量的表示形式:1)有符號整型常量:默認int型定義為有符號整數(shù),無需signedeg:10,-30,02)無符號整形常量:常量值后跟u或U,只能表示>=0的數(shù)eg:30u,256U3)長整型常量:常量值后跟1或Leg:-2561,1024L4)無符號長整型常量:常量值后跟LU、Lu、1U、lueg:301u.C程序中,實型常量兩種表示形式:小數(shù)、指數(shù).不同形式的實型常量的表示形式:1)十進制表示形式:數(shù)字和小數(shù)點組成,必須要有小數(shù)點,整數(shù)部分可省略eg:0.123,-12.35,.982)指數(shù)形式:e或E代表以10為底的指數(shù),e左邊是數(shù)值部分(有效數(shù)字,可以是整數(shù)、小數(shù),不能省略),e右邊是指數(shù)部分(必須是整數(shù)形式)eg:3.45e-6.實型常量有單精度和雙精度之分,無有符號和無符號之分.不同類型的實型常量表示形式:1)單精度實型常量:常量值后跟F或feg:1.25F,1.25e-2f2)雙精度實型常量(double):實型常量默認按雙精度處理eg:0.123,-12.35,.983)長雙精度實型常量(longdouble):常量值后跟L或1eg:1.25L.變量:在程序執(zhí)行過程中可以改變的量.變量在必須先定義后使用,定義時需要聲明變量的類型和變量名,一般形式:類型關鍵字變量名;.關鍵字是C語言預先規(guī)定具有特殊意義的單詞,類型關鍵字用于聲明變量的類型.標準C語言編寫的程序都是以main。作為開頭,指定了C程序執(zhí)行的起點,在C程序中只能出現(xiàn)一次,稱為主函數(shù).C程序總是從main函數(shù)開始執(zhí)行,與他在程序中的位置無關,main函數(shù)主體部分稱為語句,用。括起來,一般C語句以;結束.變量的類型決定了編譯器為其分配內存單元的字節(jié)數(shù)、數(shù)據(jù)在內存單元中的存放形式、該類型變量合法的取值范圍以及該類型變量可參與的運算種類.變量名是用戶定義的標識符,用于標識內存中具體的存儲單元,存放的數(shù)據(jù)稱為變量的值.新數(shù)據(jù)存放于存儲單元時,舊數(shù)據(jù)將會被修改,反應變量的值是可以改變的1.變量名的命名規(guī)則:1)標識符只能由英文字母、數(shù)字、下劃線組成2)標識符必須以字母或下劃線開頭3)不允許使用C關鍵字為標識符命名4)標識符可以包含任意多個字符,但一般會有最大長度限制,預編譯器有關,一般不會超過,最好不超過8個字符注意:標識符區(qū)分大小寫eg:xy3_imaxELSEXA_to_B(合法)eg:7xint#Nobadonere-input(不合法).標準C規(guī)定所有變量必須在第一條可執(zhí)行語句之前定義.在同一條語句中可以同時定義多個相同類型變量,多個變量之間用逗號分隔,沒有順序要求.在使用標準輸入/輸出函數(shù)時,必須在程序開頭加上編譯預處理命令.くstdio.h>中stdio為頭文件,std是standard,i為input.〇為output,h為head.編譯預處理命令#include的作用:將在輸入/輸出函數(shù)的頭文件stdio.h包含到用戶源文件中.紀按十進制整數(shù)個格式輸出,按十進制小數(shù)格式輸出,--般輸出6位小數(shù),猊輸出ー個字符,\n換行,雙引號內字符原樣輸出.不同類型的數(shù)據(jù)在內存中占用不同大小的存儲單元,他們所能表示的數(shù)據(jù)的取值范圍各不相同,不同類型的數(shù)據(jù)表示形式及其可以參與的運算種類也不同.定義整型變量時,只要不指定為無符號型,其隱含類型為有符號型,signed通常省略不寫.C程序中每個變量的值都是按字節(jié)編址,都被存儲在內存中特定的存儲單元中,這個存儲空間實際是ー個線性地址表,即每個字節(jié)的存儲空間對應ー個唯一的地址.!個字節(jié)等于8個二進制位,即8個位為一個字節(jié),ー個字節(jié)可以表示的整數(shù)最小為0,最大255,即8個位可以表示0-255之間的數(shù),ー個二進制位的值只能是。或1.同種類型在不同的平臺所占字節(jié)數(shù)不同,要計算數(shù)據(jù)類型所占內存空間的字節(jié)數(shù)需要用sizeofO運算符.sizeof是C語言關鍵字,不是函數(shù)名,sizeof(變量名)計算ー個變量所占內存的字節(jié)數(shù).計算不同類型運算符的表達式時,要考慮運算符的優(yōu)先級和結合性.正數(shù)的反碼、補碼與原碼都相同,負數(shù)的補碼等于反碼加1.在計算機內存中負數(shù)都是用補碼來表示.對于實數(shù),無論小數(shù)海曙指數(shù)形式,在計算機內存中都采用浮點形式來存儲.浮點數(shù)分為階碼、尾數(shù)兩部分,實數(shù)N=S*pow(r,j),S為尾數(shù)(無論正負,規(guī)定用存小數(shù)),j為階碼(無論正負,必須是整數(shù)),r是基數(shù)eg:10.0111=0.100111*pow(2,10).階碼所占位數(shù)決定實數(shù)的取值范圍,尾數(shù)所占位數(shù)決定實數(shù)的精度,尾數(shù)的符號決定實數(shù)的正負,階碼和尾數(shù)的字節(jié)大小與編譯器有關.float型變量能接收實型常量的7位有效數(shù)字,double型變量能接收16位.運算符的優(yōu)先級:單目運算〈算術運算〈關系運算〈邏輯運算く條件運算〈賦值運算〈逗號運算.素數(shù):又稱質數(shù),指在大于1的自然數(shù)中,除1和本身不能被其他自然數(shù)整除的數(shù).合數(shù):指在自然數(shù)中除1和本身外還能被其他自然數(shù)整除的數(shù).因子:所有能整除這個數(shù)的數(shù),不包括自身,但包括1.閏年:能被4整除但不能被!00整除,或能被400整除2二、簡單的算術運算和表達式.條件運算符是C語言提供的唯ーー個三元運算符,c語言中沒有嘉運算符.只有計算相反數(shù)是一元運算符,其余運算符都是二元運算符.一元運算符也叫單目運算符,二元運算符也叫雙目運算符,三元運算符也叫三目運算符.整數(shù)除法的結果是整數(shù),浮點數(shù)除法的結果是浮點數(shù)5,求余運算限定參與運算的兩個操作數(shù)必須為整型,余數(shù)的符號與被除數(shù)的符號相同,不能對兩個實型數(shù)進行求余運算.所有的算術運算符中只有一元的去相反數(shù)運算符為右結合,其余的結合性都為左結合.同一優(yōu)先級的運算符進行混合運算時,從左向右依次進行.運算符的優(yōu)先級:單冃運算〉算術運算〉關系運算》邏輯運算〉條件運算》賦值運算》逗號運算.計算并輸出ー個三位整數(shù)的個位、十位、百位數(shù)字之和#include<stdio.h>voidmain()(intx=321;inta,b,c,sum;a=x%10;//a=lb=(x/10)%10;//b=2c=x/100;//c=3sum=a+b+c;printf("a二%d,b=%d,c二%d\nsum二%d\n”,a,b,c,sum);.涉及算術運算的復合賦值運算符有5個:+=,-=,*=,/=,%=1L增1運算符也稱自增運算符,減1運算符也稱自減運算符,都是一元運算符,只有ー個操作數(shù)必須是變量不能是常量或表達式.自增自減運算符作為前綴時,先執(zhí)行加1或減1然后使用:自增自減運算符作為后綴時,先使用再執(zhí)行加1或減1;.考慮優(yōu)先級與結合性的實例m=-n++《=》m=-(n++)《=》m=-n,n=n+l;〃正面:一和++都是一元運算符,優(yōu)先級相同,此時要考慮結合性,結合性都是右結合的,所以先算++后算ー//反面:如果等價m=(-n)++就不合法了,因為表達式不能進行自增操作.scanf函數(shù)和printf函數(shù)都是C的標準輸入/輸出函數(shù),&為取地址運算符.宏常量與宏替換:1)在程序中直接使用的常數(shù)稱為幻數(shù),將幻數(shù)定義為宏常量或const常量是為了提高程序的可讀性和可維護性2)宏常量也稱符號常量,沒有數(shù)據(jù)類型,編譯器不對其進行類型檢查,只進行字符串替換3)宏定義一般形式:^define標識符字符串。標識符被稱為宏名,宏名與字符串之間可有多個空白符,不加等號,結尾不加分號4)宏常量是由宏定義編譯預處理命令來定義,宏名替換成字符串的過程稱為宏替換,宏替換不做任何語法檢查35)當宏定義是ー個表達式時,調用時,是ー個數(shù)就可以直接帶入,而是表達式也要看成是ー個數(shù)代進宏定義表達式中,而看成一個數(shù)這就要求把調用的數(shù)加上圓括號,為了減少不必要的錯誤,最好都加上圓括號6)宏替換的過程是將宏名原樣替換成字符串,而不是直接計算出值,所以要用調用后的結果參與其他運算就需要把調用的結果加上圓括號7)例題:々includeくstdio.h>#defineN2//N=2#defineMN+1〃M=2+1ttdefineNUM2*M+1//NUM=2*2+1+1=6voidmainO(inti;for(i=l;i<=NUM;i++);printf(線d\n”,i);〃執(zhí)行完空循環(huán),i=7i—;//i=6printf("%d\n',i);}8)例題:#include<stdio.h>?(definef(x)x*xvoidmain()(intb;b=f(4+4);//b=4+4*4+4=24,解釋見5)printfCb=%d\n*,b);)9)例題:??includeくstdio.h>?(definef(x)x*xvoidmainOintb;b=f(4+4)/(2+2);//b=4+4*4+4/(2+2)=21解釋見6)printf("b=%d\n”,b);}10)例題:#include<stdio.h>ttdefinef(x)x*xvoidmain()(intb;b=f((4+4));//b=(4+4)*(4+4)=644printf("b=%d\n”,b);}11)例題:#include<stdio.h>#definef(x)(x*x)voidmain()Iintb;b=f((4+4))/(2+2);//b=((4+4)*(4+4))/(2+2)=16printf("b=%d\n”,b);16.const常量const常量只能在定義時賦初值,因為編譯器將其放在只讀存儲區(qū),不允許在程序中修改const常量的定義一般形式:const類型名標識符=字符串;//將標識符聲明為具有該數(shù)據(jù)類型的const常量const是ー種類型修飾符,const常量具有數(shù)據(jù)類型,編譯器要對其進行類型檢查.表達式中的自動類型轉換:1)表達式中,操作數(shù)類型相同,運算的結果類型與操作數(shù)類型相同2)表達式中,操作數(shù)類型不相同,C編譯器自動將所有操作數(shù)進行類型提升,轉換成同一類型,所占字節(jié)最大,再計算.賦值中的自動類型轉換:1)賦值運算符左側變量與右側表達式類型不同時,發(fā)生自動類型轉換:右側表達式的值轉換成左側變量的類型.強制類型轉換:1)強制類型轉換運算符是一元運算符2)強制類型轉換也稱強轉,是將表達式的值轉換為任意類型,并不改變變量本身的數(shù)據(jù)類型3)強轉一般形式:(類型)表達式4)演示強制類型轉換運算符的使用#include<stdio.h>voidmain()iintm=5;printf("m/2=%d\n”,m/2);〃m=2printf(*(float)(m/2)=%f\n*,(float)(m/2));//m=2.000000printfC"(float)m/2=%f\n^?(float)m/2);//m=2.500000printf("m二%d\n",m);//m=5,只是將m強轉為實型數(shù)據(jù),并不改變m的數(shù)據(jù)類型}20,常用的標準數(shù)學函數(shù):1)使用C標準數(shù)學函數(shù),要在程序開頭加上編譯預處理命令:#include<math.h>2)例:已知三角形三邊長為a,b,c,計算三角形的面積#include<stdio.h>#includeくmath.h>5voidmain()ifloata,b,c,s,area;printf(,zlnputa,b,c:');scanf("%f,%f,%f",&a,&b,&c);s=(a+b+c)/2;area=(float)sqrt(s*(s-a)*(s-b)*(s-c));printf("area二%f\n”,area);}21.賦值運算符的左側不能出現(xiàn)表達式,變量與變量之間可以賦值例L若有定義:inta,b,c;下列表達式中哪ー個是合法的C語言賦值表達式(C、D)A)a二7+b二c二7B)a二b++二c二7C)a二(b二7,c二12)D)a=3,b=a+5,c=b+2〃A.7+b表達式不能做左值B.b++表達式不能做左值C.逗號表達式a=12D.依次賦值例2:下面不正確的賦值語句是(B)A)a二++aB)a=b++=10C)a+=bD)a二l>'a'//D.算術運算符優(yōu)先級高于賦值運算符,先算1>'a’再將其結果賦給a例3:若有下列定義:inta=3,b=2,c=l;以下選項錯誤的賦值表達式是(A)A)a=(b=4)=3B)a=b=c+lC)a=(b=4)+cD)a=l+(b=c=4)〃ん先計算圓括號里的值等于4,然后按照賦值表達式的順序從右向左計算,將3賦值給4這是不對的,即賦值號左側只能是變量,不能出現(xiàn)表達式b=46三、鍵盤輸入和屏幕輸出L字符常量:把字符放在ー對單引號內,適用于多數(shù)可打印字符.轉義字符:以反斜線(ヽ)開頭,也是放在ー對單引號內,適用于控制字符(如回車符,換行符).常用的轉義字符:'\n'ー換行8)'\a'-響鈴報警提示音'\r'一回車(不換行)9)’ぐ‘——個雙引號'、0’—空字符10)'ヽ'’——個單引號'\t,一水平制表11)'\\'——個反斜線'\v'—垂直制表12)'\?'-問號,\b,一退格13)'\ddd'一1到3位八進制ASCII碼值所代表的字符,\f,一走紙換頁14)'\xhh'一1到2位十六進制ASCH碼值所代表的字符.\n,是將光標移到下一行起始位置,\r是將光標移到當前行的起始位置.\t,是水平制表符,相當于按下Tab鍵,每次按下Tab鍵并不是從當前光標位置向后移動ー個Tab寬度,而是移到下ー個制表位實際移動的寬度視當前光標位置距相鄰的下ー個制表位的距離而定.制表位,屏幕上的一行被分為若干個域,相鄰域之間的交接點稱為制表位,每個域的寬度就是一個Tab寬度,多數(shù)習慣上為4.當轉義序列出現(xiàn)在字符串中時,是按單個字符計數(shù)的.一個整形數(shù)在內存中是以二進制形式存儲的,而ー個字符在內存中也是以其對應的ASCII碼的二進制形式存儲的,但char型數(shù)據(jù)在內存中只占ー個字節(jié),而int型數(shù)據(jù)在16位系統(tǒng)中占2個字節(jié),32位系統(tǒng)占4個字節(jié).在ASCI!碼取值范圍內,char型數(shù)據(jù)可以和int型數(shù)據(jù)進行混合運算,char型數(shù)據(jù)也能以int型輸出,直接輸出其對應的ASCII碼的十進制值10,字符的輸入/輸出:)getcharO和putcharO是C標準函數(shù)庫中專門用于字符輸入/輸出的函數(shù),功能是只能輸入/輸出ー個字符2)例:從鍵盤輸入一個大寫英文字母,將其轉換為小寫字母顯示在屏幕上#include<stdio.h>voidmain()(charch;ch=getchar();〃鍵盤輸入一個字符,再按回車表示輸入結束,字符存入變量ch,注意:getcharO沒有參數(shù),直接返回讀入的字符ch=ch+32;putchar(ch);〃第二次按回車,將顯示轉換后的結果putchar('\n');〃注意:putcharO內一定要有參數(shù),參數(shù)就是待輸岀的字符,可以是可打印字符,也可是轉義字符).數(shù)據(jù)的格式化屏幕輸出:1)函數(shù)printfO的一般格式:printf(格式控制字符串);或者printf(格式控制字符串,輸出值7參數(shù)表);2)格式控制字符串包括:格式轉換說明符,需要原樣輸出的普通字符3)函數(shù)printfO的格式轉換說明符:%d—輸出帶符號十進制整數(shù),整數(shù)符號省略%u—輸岀無符號十進制整數(shù)%〇-輸出無符號ハ進制整數(shù),不輸出前導符〇%x—輸出無符號十六進制整數(shù)(小寫),不輸出前導符Ox%Xー輸出無符號十六進制整數(shù)(大寫),不輸出前導符Ox%c—輸出ー個字符%s—輸出字符串%f—以十進制小數(shù)形式輸出實數(shù),包含單,雙精度,隱含6位小數(shù),但并非全是有效數(shù)字,單精度有效7位,雙精度16位%e—以指數(shù)形式輸出實數(shù)(小寫e表示指數(shù)部分),小數(shù)點前有且僅有一位非。數(shù)字%E—以指數(shù)形式輸出實數(shù)(大寫E表示指數(shù)部分)%g一自動選取f或e格式中寬度較小的ー種使用,不輸出無意義的。%%—輸出外4)輸出值參數(shù)表:需要輸出的數(shù)據(jù)項的列表,可以是變量或表達式,逗號隔開,類型與格式轉換說明符相匹配5)每個格式轉換說明符與輸出值參數(shù)表中的輸出值參數(shù)ーー對應,沒有輸出值參數(shù),格式控制字符串就不需要格式轉換說明符6)例:從鍵盤輸入一個大寫英文字母,將其轉換為小寫字母和其十進制ASCH碼值顯示在屏幕上#include<stdio.h>voidmainOcharch;printf("Pleaseenterakey:");ch=getchar();ch=ch+32;printf("%c,%d\n",ch,ch);//printf("%c",ch)?=?putchar(ch),printf("\n")?=?putchar(*\n*)}7)函數(shù)printf()中的格式修飾符:在%和格式符中間插入格式修飾符,用于輸出格式的微調,如:指定輸岀域寬、精度、左對齊等英文字母1一修飾格式符d,O,x,u時,用于輸出long型數(shù)據(jù)英文字母L一修飾格式符f,e,g時,用于輸出longdouble型數(shù)據(jù)英文字母h—修飾格式符d,O,x時,用于輸岀short型數(shù)據(jù)輸出域寬m—m為整數(shù),輸出時占m列,若m〉0,當數(shù)據(jù)寬度小于m時,域內右靠齊,左補空格,當數(shù)據(jù)寬度大于m時,修飾符失效,按實際寬度輸出,若m有前導符0,左邊多余位補〇;若水。,輸出數(shù)據(jù)在域內左靠齊顯示精度,n—n為大于等于〇的整數(shù),精度修飾符位于最小域寬修飾符之后,由圓點和整數(shù)構成,對于浮點數(shù),用于指定輸出的浮點數(shù)小數(shù)位數(shù);對于字符串,用于指定從字符串左側開始截取的子串字符個數(shù)8)使用const常量定義pi,編程從鍵盤輸入圓的周長和面積,使其輸出數(shù)據(jù)保留兩位小數(shù)8#include<stdio.h>voidmain()(constdoublepi=3.14159;doubler,circum,area;printf("Pleaseenterr:");scanf("%lf",&r);circum=2*pi*r;area=pi*r*r;printf("輸出沒有寬度和精度的值:");printf("circum=%f,area=%f\n",circum,area);printf("輸出沒有寬度和精度的值:");printf("circum=%7.2f,area=%7.2f\n",circum,area);〃域寬為7.占7個字符寬度,小數(shù)點也算ー個字符,精度為2,小數(shù)點后保留2位).數(shù)據(jù)的格式化鍵盤輸入:1)函數(shù)scanf()的一般格式:scanf(格式控制字符串,參數(shù)地址表);2)格式控制字符串:包括格式轉換說明符,分隔符3)格式轉換說明符以%開始,以格式字符結束,用于指定各參數(shù)的輸入格式4)函數(shù)scanf()的格式轉換說明符:%d—輸入十進制整數(shù)%〇—輸入八進制整數(shù)%x—輸入十六進制整數(shù)%c—輸入一個字符,空白字符(包括空格、回車、制表符)也作為有效字符輸入%s—輸入字符串,遇到第一個空白字符(包括空格、回車、制表符)時結束打或加—輸入實數(shù),以小數(shù)或指數(shù)形式輸入均可%%—輸入ー個%5)參數(shù)地址表:由若干變量的地址組成的列表,用逗號分隔6)函數(shù)scanf()中的格式修飾符:在%和格式符中間插入格式修飾符英文字母1ー加在格式符d,o,x,u之前,用于輸入long型數(shù)據(jù);加在f,e之前,用于輸入double型數(shù)據(jù)英文字母Lー加在格式符f,e之前,用于輸入longdouble型數(shù)據(jù)英文字母h一加在格式符d,〇,x時,用于輸入short型數(shù)據(jù)輸岀域寬mm輸岀域寬m顯示精度.n一n為0或正整數(shù),scanfO沒有精度格式修飾符,輸入時不能規(guī)定精度忽略輸入修飾符?—表示對應的輸入項在讀入后不賦給相應的變量7)函數(shù)scanfO輸入數(shù)值型數(shù)據(jù)時,被認為輸入結束的幾種情況:遇空格符、回車符、制表符;達到輸出域寬;遇非法字符輸入8)如果函數(shù)scanfO的格式控制字符串中存在除格式轉換說明符以外的其他字符,必須將這些字符原樣輸入#include<stdio.h>voidmainO(9inta,b;scanf("%d%d”,&a,&b);〃以空格作為分隔符,等價于scanf("%d%d”,&a,&b),等價于scanf(〃%d%d〃,&a,&b),卩!4は0二%&セア^\べ,a9;〃實際輸入時,空格、回車符、制表符都可作為分隔符,即輸入:12空格3412回車3412制表符34均可,}#include<stdio.h>voidmain(){inta,b;scanf("%d,%d〃,&a,&b);〃輸入時必須以逗號作為分隔符,即只能輸入:12,34printf("a二%d,b二%d\n”,a,b);}#include<stdio.h>voidmainOinta,b;scanf(、二%d,b二%d”,&a,&b)ノ/輸入時必須將"a二"和"b二〃原樣輸入,即只能輸入:a=12,b=34printf("a=%d,b二%d\n",a,b);}#include<stdio.h>voidmain(){inta,b;scanf("%2d%2d",&a,&b);〃輸入時將前兩位數(shù)讀入存到a中,接著兩位存到b中,然后結束讀取,即輸入:1234,或123456結果ー樣printf("a=%d,b二%d\n”,a,b);)#include<stdio.h>voidmain()(inta,b;scanf("%d%d",&a,&b);printf("a=\"%d\",b二、"%d\"\n",a,b)ノ/輸出a二"12",b="34"}#include<stdio.h>voidmainOinta,b;10scanf("紀%*c%d”,&a,&b);〃任意字符都可作為分隔符,即輸入:12,34或!2?34或12+34結果都一樣printf("a=%d,b=%d\n",a,b);)#include<stdio.h>voidmain()(inta,b;scanf(訳2d%*2d%d",&a,&b);//忽略兩位,輸入!23456printf("a=%d,b=%d\n",a,b);〃輸出a=12,b=56)對于程序#include<stdio.h>voidmain()Iinta,b;scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);)如果輸入1234a回車,則結果a=12,b=3,程序在遇到非法字符a時,會導致程序輸入終止,此時a會讀入12,b會讀入3如果輸入123a回車,則結果a=123,b=-858993460.程序在遇到非法字符a時,會導致程序輸入終止,此時a會讀入123,而b未能讀入指定數(shù)據(jù)項數(shù)如果在scanf()函數(shù)中忘記在變量前加取地址運算符&,會導致非法內存訪問.%c格式符使用幾種情況:1)用%c格式讀入字符時,空格字符和轉義字符(包括回車)都會被當做有效字符讀入例:鍵盤輸入ー個整數(shù)加法算式:操作數(shù)1+操作數(shù)2,輸出:操作數(shù)1+操作數(shù)2=計算結果#include<stdio.h>voidmainO{intdatal,data2;charopi〃輸入:12空格+空格3回車〃輸出:12-858993460二一858993448printf("Enterdatal+data2\n");〃輸入:12空格3回車〃輸出:123=15scanf("%d%c%d”,&datal,&op,&data2);〃輸入:12+3回車〃輸出:12+3=15printf("%d%c%d=%d\n",datal,op,data2,datal+data2);}2)先輸入一個數(shù)據(jù)后再輸入字符型變量時,輸入ー個數(shù)據(jù)后,輸入的回車符將被當做有效字符讀給字符型變量例:編程從鍵盤先后輸入int型、char型和float型數(shù)據(jù),要求每輸入ー個數(shù)據(jù)就顯示這個數(shù)據(jù)的類型和數(shù)據(jù)值11#include<stdio.h>voidmain()iinta;charb;floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n〃,a);〃在輸入ー個整型數(shù)據(jù)后,輸入的回車符被當做有效字符讀給了字符型變量b了printf("Pleaseinputacharacter:");scanf("%c",&b);printf("chracter:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f,z,&c);printf("float:%f\n",c);}.%c格式符存在問題的解決方法1)用函數(shù)getcharO將數(shù)據(jù)輸入時存入緩沖區(qū)中的回車符讀入,以避免被后面的字符型變量作為有效字符讀入#include<stdio.h>voidmain()(inta;charb;floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);getcharO;〃將存于緩沖區(qū)中的回車符讀入,避免在后面作為有效字符讀入〃函數(shù)getcharO的返回值是ー個回車符,已經(jīng)避免了錯誤,不需要再將其賦給字符型變量使用printf(*Pleaseinputacharacter:*);scanf("%c",&b);printf("chracter:%c\n〃,b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c);}2)在%c前面加?個空格,將前面數(shù)據(jù)輸入時存于緩沖區(qū)的回車符讀入,避免被后面的字符型變量作為有效字符讀入12#include<stdio.h>voidmain()(inta;charb;floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%c",&b);〃在%c前面加空格,將存于緩沖區(qū)中的回車符讀入printf("chracter:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("floatc);〃解釋:在%c前加空格為什么能將存于緩沖區(qū)中的回車符讀入因為如果函數(shù)scanfO的格式控制字符串中存在除格式轉換說明符以外的其他字符,必須將這些字符原樣輸入,所以在%c前加空格,就必須在輸入字符型數(shù)據(jù)前先原樣輸入空格,而空格,回車符,制表符在函數(shù)scanfO輸入數(shù)值型數(shù)據(jù)時都代表輸入結束,由實踐可知,空格符、回車符、制表符在輸入時等效所以,緩沖區(qū)中的回車將代替需要原樣輸入的空格,因此,實際上,在%c前增加空格或者Tab鍵都可以完成,并且與增加的數(shù)量無關,且可以混合增加3)?經(jīng)典例題:編程實現(xiàn)鍵盤任意輸入字符,統(tǒng)計字母、數(shù)字、空格、其他字符數(shù)量首選字符串的方法:#include<stdio.h>ttdefineN100intmain()Ichara[N];inti,m=0,n=0,b=0,c=0;printf("請輸入字符:'n");gets(a);for(i=0;a[i]!=,\0';i++)if((a[i]>=,a&&a[i]<=,z')||(a[i]>='A'&&a[i]〈='Z'))m++;elseif(a[i]>=0&&a[i]<=9)n++;elseif(a[i]==,')b++;elsec++;13)printf("字母個數(shù):%d\n",m);printf("數(shù)字個數(shù):%d\n",n);printf("空格個數(shù):%d\n",b);printf("其他字符個數(shù):%d\n",c);return0;)單個字符輸入的方法,但是要解決緩沖區(qū)的問題#include<stdio.h>intmain()(charch;inta,b,c,d;a=b=c=d=O;printf("請輸入字符:'n");do{ch=getchar();getcharO;〃清除緩沖區(qū)的回車鍵,不然會當做第二個字符讀入if(ch!='')〃用Tab鍵控制輸入結束,他在程序中只會出現(xiàn)一次并且統(tǒng)計一次,{〃然后結束,所以要去掉它,可以使用if語句,也可在前面初始化為d二一1if((ch>='a'&&chく二'z')||(ch>=,A'&&ch<='Z*))a++;elseif(ch>='O'&&chく='9')b++;elseif(ch==,')c++;elsed++;}while(ch!='');printf("字母個數(shù):%d\n",a);printf("數(shù)字個數(shù):%d\n",b);printf("空格個數(shù):%d\n",c);printf("其他字符個數(shù):%d\n",d);return0;//解釋:你可以把Tab控制結束改成其他任意字符,包括字母、數(shù)字、/;都可以,就是不能直接使用回車控制結束,因為你在實際鍵盤輸入時,需要打回車才能把前面的字符讀入,當你輸完回車后,就已經(jīng)換行了,再回車就達不到你要的效果了,不可能把他讀入,但是他會留在緩沖區(qū)下一次使用,所以說,理論上任意字符都可以控制結束,但是不能直接使用回車再回車的方法,而getcharO函數(shù)一次只能讀ー個字符,當你回車讀入字符后,回車符就會留在緩沖區(qū)下一次使用,你可以試試,你把getcharO這行語句注釋,然后一次輸入兩個字符再回車的話,那么這時他也只能讀入第一個字符,第二個字符和回車就會計入第二次、第三次的結果??偨Y:這種方式與用字符串的區(qū)別在于,字符串可以統(tǒng)計任何字符,但是這種方式不能統(tǒng)計你用來控制結束的字符,比如說,你用/控制結束,那么就不能統(tǒng)計/的數(shù)量了,而且你要把他去掉,因為在整個程序中/只會出現(xiàn)一次,然后就結束了14*?當程序中出現(xiàn)兩次或以上的鍵盤輸入時,就有可能出現(xiàn)緩沖區(qū)的問題,只有一次輸入,回車直接結束沒有這種問題.考點題型:字符串常量的長度問題:1)字符串常量"ab\\c\td\376"的長度是(A)A)7B)12〇8D)14//ab\\c\td\3762)語句printf("%d”,strlen("abs\nol2\l\\"));的輸出結果是(C)A)11B)10C)9D)8//abs\n〇12\1\\.考點題型:賦值運算、關系運算的混合運算問題:1)設m,n,a,b,c,d的值均為〇,執(zhí)行(m=a==b)I(n=c=d),m,n的值是(C)A)0,0B)0,1C)1,0D)1,1//"=プ是算術運算符,是賦值運算符,優(yōu)先級:算術運算符》賦值運算符,先判斷a==b?是否正確正確則為真,把1賦給m,”|ド是或運算,前面已經(jīng)為真,所以丨丨后面的就不會再運算T,結果就為真所以m=l,n-0不變2)inta,b,m,n;初值依次為4,3,2,為經(jīng)計算m=(aく=b)&&(n=mくn)后,m,n的值為(C)A)1,1B)1,0C)0,1D)0,0//a<=b為假,&&是并,前面已經(jīng)為假,后面就不會再運算了,結果就為假,把〇賦給m,即m-0,n=l不變15四、選擇控制結構.沃思提出“數(shù)據(jù)結構+算法=程序”只在面向過程的語言(如C語言)成立.算法的正確性衡量方法:1)有窮性2)確定性3)有效性4)允許沒有輸入或者有多個輸入5)必須有一個或者多個輸出.算法的描述方法:1)自然語言描述2)流程圖描述3)NS結構化流程圖描述4)偽碼描述.關系表達式:用作判斷條件,結果只有真和假,(n%2!=〇)等價于(n%2),0表示假,非。表示真.分支結構:當條件P成立時,執(zhí)行A操作,否則執(zhí)行B操作;如果B操作為空,即為單分支結構;如果B操作不為空,即為雙分支結構;如果B操作中又包含另ー選擇結構,則構成多分支選擇結構;.單分支例題:計算輸出兩整數(shù)最大值單分支(--般形式):if(表達式P)語句A#include<stdio.h>voidmain(){inta,b,max;printf("Entera,b:");scanf("%d%d",&a,&b);if(a>b)〃單分支:if(表達式P)語句Amax=a;if(a<=b)〃單分支:if(表達式P)語句Amax=b;printf("max=%d\n",max);}.雙分支例題:計算輸出兩整數(shù)最大值雙分支(一般形式):if(表達式P)語句1else語句2#include<stdio.h>voidmainOinta,b,max;printf(/zEntera,b:〃);scanf("%d%d”,&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n”,max);}.條件運算符是C語言中唯一的三元運算符,需要三個操作數(shù)16.條件運算符例題:計算輸出兩整數(shù)最大值條件運算符(?般形式):表達式1?表達式2:表達式3含義:若表達式1為非0,則結果為表達式2的值,否則是表達式3的值#include<stdio.h>voidmain()(inta,b,max;printf("Entera,b:");scanf("%d%d",&a,&b);max=a>b?a:b;printf("max=%d\n,z,max);.多分支控制條件語句(一般形式):if(表達式1)語句1elseif(表達式2)語句2elseif(表達式m)語句melse語句m+1.條件語句在語法上只允許每個條件分支中帶一條語句,而要在分支里處理多條語句就要使用花括號,構成復合語句12,隨機數(shù)的使用方法:1)符號常量RAND_MAX在頭文件#includeくstdlib.h>中定義,標準C規(guī)定RAND_MAX不大于雙字節(jié)整數(shù)的最大值327672)隨機函數(shù)rand()產生的是ー個在O~RAND一MAX之間的整數(shù),即[0,32767]之間的整數(shù)3)利用求余運算rand()%b可將函數(shù)rand()生成的隨機數(shù)變化到[0,b-1]4)利用rand()%b+a可將隨機數(shù)的取值范圍平移到[a,a+b-1]例:產生1100的隨機數(shù):rand()%100+l.例題:猜數(shù)游戲:計算機想一個數(shù),人猜對了提示Right!,否則提示W(wǎng)rong!,并告訴大小8include<stdio.h>#include<stdlib.h>voidmain()[intmagic,guess;magic=rand();//隨機數(shù)printf("Pleaseguessanumber:");scanfCy%d",figuess);if(guess>magic)〃多分支printf(*Wrong!Toobig!\n/z)i〃復合語句elseif(guess<magic)(printf(z/Wrong!Toosmall!\n*);)17else{printf("Right!\n");printf(zzThenumberis:%d\nzz,magic);}}.switch語句:用于多路選擇,一般情況大于三種,用開關語句代替條件語句switch語句(一般形式):switch(表達式)(case常量1:可執(zhí)行語句序列1〃注意:語句序列不使用花括號case常量2可執(zhí)行語句序列2case'吊ち]:n:可執(zhí)行語句序列ndefault:可執(zhí)行語句序列n+1}switch語句相當于一系列的if-else語句switch后圓括號內的表達式只能是char型或int型4)關鍵字case后接常量,類型與表達式類型一致,常量的值必須互不相同5)常量與case中間至少有一個空格,常量后面是冒號case本身并沒有條件判斷的功能,若case后面的語句省略不寫,則表示它與后續(xù)case執(zhí)行相同的語句switch語句的執(zhí)行過程:第一步,計算switch后表達式的值第二步,將表達式的值依次與case后的常量比較第三步,如果相等,執(zhí)行case后的代碼段,執(zhí)行完畢,可使用break語句跳出switch語句如果沒有break語句,不會再比較,程序將依次執(zhí)行下面的case后的語句,直到遇到break或者switch的}為止.例題:編程實現(xiàn)簡單計算器功能#include<stdio.h>voidmain(){intdatal,data2;charop;printf("Enteryourexpression:");scanf("%d%c%d",&datal,&op,&data2);switch(op)case'+':printf("%d+%d=%d\n”,datal,data2,datal+data2);18break;case':printf("猊ー/d=%d\n”,datal,data2,datal-data2);break;case' :case'x':case'X':printf(〃%d*%d二%d\n〃,datal,data2,datal*data2);break;case'r:if(0=data2)〃也可寫成data2==0,寫0==data2的好處:{〃因為賦值表達式左值必須是變量,如果把=誤寫成二,會提示錯誤printf("Divisionbyzero!\n");)else{printf("%d/%d=%d\n*,datal,data2,datal/data2);}break;default:printf(*Invalidoperator!\nz,);〃break;這句一般不需要,因為沒有break就會依次執(zhí)行下面的步驟直到break或者switch的})〃這里已經(jīng)是switch的}了}.例題:編程實現(xiàn)簡單計算器功能,能進行浮點數(shù)運算,操作數(shù)與運算符之間可加入任意多個空格#include<stdio.h>#include<math.h>voidmainO(floatdatal,data2;charop;printf("Enteryourexpression:*);scanf("%f%c%f",ftdatal,&op,&data2);switch(op)icase'+':printf("%f+%f=%f\n",datal,data2,datal+data2);break;case'-':printf("%f-%f=%f\n",datal,data2,datal-data2);break;casecase19case'X':printf("%f*%f=%f\n”,datal,data2,datal*data2);break;case'/':if(fabs(data2)<=le-7)(printf("Divisionbyzero!\n");}else{printf("%f/%f=%f\n",datal,data2,datal/data2);}break;default:printf("Invalidoperator!\n");}}〃內存中的浮點數(shù)所表示的精度是有限的,所以比較實型變量data2與O是否相等時,不能像整型變量與〇比較那樣直接用相等關系運算符與〇比較,而應使用如下方式判斷實型變量data2的值是否位于。附近的?個很小的區(qū)間內,即:if(fabs(data2)<=le-7).邏輯運算符和邏輯表達式邏輯非:!,單目運算符,右結合,優(yōu)先級最高邏輯與:&&,雙目運算符,左結合,優(yōu)先級較高邏輯或:L,雙目運算符,左結合,優(yōu)先級較低例:判斷某一年year是否是閏年的條件:1)能被4整除,但不能被100整除;1)能被400整除邏輯表達式:((year%4-=0)&&(year%l00!=0))|I(year%400==0)或:(year%4==0)&&(year%100!=0)」(year%400==0).特別注意:在計算含有邏輯運算符(&&和II)的表達式時,通常盡量使用最少的操作數(shù)來確定表達式的值,這就意味著表達式中的某些操作數(shù)可能不會被計算。例:if(a>l&&b++>2&&c—!=0)中,僅在條件表達式a>l為真時,オ會計算后面的值.程序測試:1)程序測試只能證明程序有錯,不能證明程序無錯2)例:編程輸入三角形三邊長a,b,c,判斷他們能否構成三角形,能構成什么三角形#include<stdio.h>#includeく!oath.h>ttdefineEPSle-lvoidmain()ifloata,b,c;intflag=l;printf("Entera,b,c:");scanf("%f,%f,%f",&a,&b,&c);if(a+b>c&&b+c>a&&a+c>b)20if(fabs(a-b)<=EPS&&fabs(b-c)<=EPS&&fabs(c-a)<=EPS)printf("等邊");flag=O;)elseif(fabs(a-b)<=EPS||fabs(b-c)<=EPS||fabs(c-a)<=EPS)(printf("等腰");flag=O;)if(fabs(a*a+b*b-c*c)<=EPS||fabs(b*b+c*c-a*a)<=EPS|Ifabs(a*a+c*c-b*b)<=EPS){printf("直角”);flag=O;)if(flag)[printf("一般");)printf("三角形、n");)else{printf("不是三角形、n");3)例:編程將輸入的百分制成績轉換為五分制成績輸出#include<stdio.h>voidmain()(intscore,mark;printf("Enterscore:");scanf("%d”,&score);if(score<0|score>100)mark=T;〃這個if語句很重要,如果去掉,邊界測試10「109,Tゝ9會出錯)else{mark=score/10;}switch(mark){case10:case9:21printf("%d-優(yōu)!、n”,score);break;case8:printf("%d一良!、n”,score);break;case7:printf(〃%d一中!\n”,score);break;case6:printf("知-及格!'n",score);case5:case4:case3:case2:case1:case0:printf(〃%d-不及格!\n",score);break;default:printf("Inputerror!\n");}}.對輸入非法字符的檢查與處理1)例:輸入兩個整型數(shù),計算并輸出兩個整數(shù)的最大值?include<stdio.h>voidmain()!inta,b,max;printf("Entera,b:");scanf("%d,%d",&a,&b);max=a>b?a:b;printf(〃max=%d\n〃,max);}〃隱含問題:在VisualC++下1.如果輸入3.2,1則輸出32.如果輸入1,3.2則輸出33.如果輸入q則輸出ー858993460〃解決辦法:#include<stdio.h>voidmain()(inta,b,max,ret;do{printf("Entera,b:");22ret=scanf("%d,%d〃,&a,&b);if(ret!=2)//返回在遇到非法字符前已成功讀入的數(shù)據(jù)項數(shù){〃但是scanf()函數(shù)不做類型檢查,所以輸入1,3.2會輸出3printf("Inputerror!\n");while(getchar()!='、n');else{max=a>b?a:b;printf("max=%d\n”,max);)}while(ret!=2);).位運算符的使用1)位運算是對字節(jié)或字內的二進制數(shù)位進行測試、抽取、設置或移位等操作2)位運算的操作對象只能是char和int類型3)C語言中共有6種位運算符,只有按位取反是單目運算符,其他都是雙目運算符4)關系運算和邏輯運算的結果要么是〇,要么是1,而位運算結果可為任意值,但每ー位都只能是〇或15)6種位運算符:按位取反?用于加密處理,一次求反加密,二次求反解密左移位?右移位?按位與&用于對字節(jié)中某位清零按位異或?按位或I用于對字節(jié)中某位置16)按位取反?1=0,?0=1例:?5=-6?0000010111111010是-6的補碼7)按位與0&0=0,0&1=0,1&1=1例:將15的最低位不變,其余位清零!5&1=100001111&00000001000000018)按位或0|0=0,01=1,1|1=1例:將15的最高位不變,其余位均置1151127=12700001111|0111111101111111是!27的補碼9)按位異或0*0=0,0*1=1,1'1=023例:3*5=600000011*0000010100000110是6的補碼10)左移位x?n表示把x的每一位向左平移n位,右邊空位補〇例:將15左移1、2、3位的二進制補碼如下初始字節(jié)內容00001111對應十進制15左移1位字節(jié)內容00011110對應十進制30左移2位字節(jié)內容00111100對應十進制60左移3位字節(jié)內容01111000對應十進制12011)右移位x?n表示把x的每一位向右移n位,當x為有符號數(shù)時,左邊空位補符號位值ー算術移位當x為無符號位時,左邊空位補〇ー邏輯移位例1:將15右移1、2、3位的二進制補碼如下初始字節(jié)內容00001111對應十進制15右移1位字節(jié)內容00000111對應十進制7右左移2位字節(jié)內容00000011對應十進制3右移3位字節(jié)內容00000001對應十進制1例2:將一15右移1、2、3位的二進制補碼如下初始字節(jié)內容11110001對應十進制T5右移1位字節(jié)內容11111000對應十進制ー8右左移2位字節(jié)內容11111100對應十進制ー4右移3位字節(jié)內容11111110對應十進制ー212)無論左移位還是右移位,從一端移走的位不移入另一端,移走的位的信息就丟失了13)左移位和右移位可以分表代替整數(shù)的乘法和除法,左移n位相當于乘以2、,右移n為相當于除以2、14)例:寫出運行結果#include<stdio.h>x0000000000001100voidmainO~x1111111111110011{~x反碼1000000000001100intx=12,y=8;?x反碼加一:1000000000001101-13printf(*%5d%5d%5d\n*,!x,x|y,x&&y);printf("%5u%5d%5d\n”,?x,x|y,x&y);printf("%5d%5d%5d\n",~x,x|y,x&y);)輸出:0114294967283128-1312824五、循環(huán)控制結構.循環(huán):包括計數(shù)控制的循環(huán)和條件控制的循環(huán).結構化程序設計的三種基本結構:順序結構、選擇結構、循環(huán)結構.循環(huán)結構的類型:1)當型循環(huán)結構:for語句(適合循環(huán)次數(shù)已知,計數(shù)控制的循環(huán))2)直到型循環(huán)結構:while語句、do-while語句(適合循環(huán)次數(shù)未知,條件控制的循環(huán)).while語句1)一般形式為:while(循環(huán)控制表達式){I語句系列丨循環(huán)體}I2)循環(huán)控制表達式在執(zhí)行循環(huán)體之前測試3)執(zhí)行過程:計算循環(huán)控制表達式的值如果循環(huán)控制表達式的值為真,那么執(zhí)行循環(huán)體中的語句,并返回步驟1如果循環(huán)控制表達式的值為假,就退出循環(huán),執(zhí)行循環(huán)體后面的語句.do-while語句1)一般形式為:do(I語句系列丨循環(huán)體}while(循環(huán)控制表達式);2)循環(huán)控制表達式在執(zhí)行循環(huán)體之后測試3)執(zhí)行過程:執(zhí)行循環(huán)體中的語句計算循環(huán)控制表達式的值如果循環(huán)控制表達式的值為真,那么返回步驟1如果循環(huán)控制表達式的值為假,就退出循環(huán),執(zhí)行循環(huán)體后面的語句6.for語句1)一般形式為:for(初始化表達式;循環(huán)控制表達式;增值表達式)(I語句系列I循環(huán)體)I2)在每次循環(huán)體被執(zhí)行之前,都要對循環(huán)控制條件測試ー次,每次循環(huán)體執(zhí)行完以后都要執(zhí)行一次增值表達式3)初始化表達式作用:循環(huán)變量初始化,即賦初值4)循環(huán)控制表達式:是控制繼續(xù)執(zhí)行的條件,當表達式的值為非〇時重復執(zhí)行循環(huán)5)增值表達式作用:每執(zhí)行一次循環(huán),循環(huán)控制變量增值)for語句三個表達式之間用分號分隔,有且只能有兩個分號7)循環(huán)控制表達式若省略,表示循環(huán)條件為永真8)初始化表達式和增值表達式都可省略,但是必須有其他語句反應其作用25.例:從鍵盤輸入n,然后計算輸出1+2+3+,,,,n的值while語句編程實現(xiàn)#include<stdio.h>voidmain()iinti=l,n,sum=0;〃sum一定要初始化,不然會是隨機值printf("Entern:");scanf("%d",&n);while(i<=n)(sum+=i;i++;}printf("1+2+3+,,,,+%d二%d\n”,n,sum);}do-while語句編程實現(xiàn)#include<stdio.h>inti=0,n,sum=O;printfC'Entern:");scanf&n);do(sum+=i;i++;}while(i<=n);printf("1+2+3+,,,,+%d=%d\n”,n,sum);)for語句編程實現(xiàn)#include<stdio.h>voidmain()(inti=l,n,sum=0;printf("Entern:");scanf("%d",&n);for(i=l;i<=n;i++)(sum+=i;printf("1+2+3+,,,,+%d=%d\n",n,sum);.逗號運算符1)所有運算符中優(yōu)先級最低,左結合262)作用:可實現(xiàn)對各個表達式的順序求值3)結果:將最后一個表達式的值作為整個逗號表達式的值4)例:從鍵盤輸入n,然后計算輸出1+2+3+,,,,n的值#include<stdio.h>voidmainO(inti,j,n,sum=0;printf(*Entern:");scanf("%d",&n);for(i=l,j=n;i<=j;i++,j—)(sum+=i+j;)printf("1+2+3+,,,,+%d=%d\n”,n,sum);).空語句1)僅由一個分號構成的語句2)作用:什么也不做,只起延時作用3)例:for(i=l;i<50000000;i++)或for(i=l;i<50000000;i++)或for(i=l;i<50000000;i++);for(i=l;i<=n;i++):(sum+=i;)等價于for(i=l;i<=n;i++)sum+=i;4)例:從鍵盤輸入n,然后計算輸出l+2+3+,,”n的值#includeくstdio.h>voidmain()(inti,j,n,sum=0;printf(""Entern:");27scanf&n);for(i=l,j=n;i<=j;i++,j—);sum+=i+j;printf("1+2+3+,,,,+%d=%d\n”,n,sum);レ/輸出結果:101.死循環(huán)while語句行末加分號將導致死循環(huán)2)例:i=l;while(i<=n);//行末加分號導致死循環(huán)[sum+=i;i++;)相當于i=l;while(i<=n)〃當輸入大于1的n值,循環(huán)體中沒有語句可以改變控制變量i{//使得循環(huán)條件為永真,導致死循環(huán))sum+=i;i++;while語句和do-while語句的區(qū)別1)while先判斷后執(zhí)行,有可能一次都不執(zhí)行,do-while先執(zhí)行后判斷,至少執(zhí)行ー次2)例:n=101;n=101;while(n<100)doprintf("n=%d\n〃,n);printf(〃n=%d\n〃,n);n++;n++;}}while(n<100);〃循環(huán)一次也不執(zhí)行〃結果:輸出n=101,循環(huán)執(zhí)行ー次3)例:分別用while和do-while語句編程,輸入一組數(shù)據(jù),然后顯示每次輸入數(shù)據(jù)進行累加運算的結果,輸入〇結束do-while語句實現(xiàn):#include<stdio.h>voidmainO(intnum,sum=0;do{printf("Enternum:");scanf("%d",&num);sum+=num;28printf("sum=%d\n",sum);}while(num!=0);}while語句實現(xiàn)#includeくstdio.h>voidmainOintnum=l,sum=O;〃給num賦任意非0值都可以while(num!=0){printf("Enternum:");scanf("%d",&num);sum+=num;printf("sum=%d\n",sum);}}.計數(shù)控制的循環(huán):循環(huán)次數(shù)事先上知的循環(huán)1)例1:編寫ー個程序,從鍵盤輸入n,計算輸出n!#include<stdio.h>voidmain()(inti,n,sum=l;printf("Entern:");scanf("%d",&n);for(i=l;i<=n;i++){sum*=i;)printf("%d!=%ld\n",n,sum);2)例2:編寫ー個程序,從鍵盤輸入n,計算輸出1!,2!,,,,n!#include<stdio.h>voidmainOinti,n,sum=l;printf("Entern:");scanf("%d",&n);for(i=l;i<=n;i++)isum*二i;printf("%2d!=%ld\n",i,sum);}}3)例:鍵盤輸入n,編程計算1!+2!+3!+,,,,+n!29#include<stdio.h>voidmain()(intterm=l,sum=0,i,n;printf("Entern:");scanf("%d",&n);for(i=l;iく=n;i++)!term*=i;sum+=term;printf("1!+2!+3!+,,,,+%d!=%ld\n”,n,sum);.條件控制的循環(huán):循環(huán)次數(shù)事先未知,由條件控制1)例L輸入兩個整型數(shù),計算并輸出兩個整型數(shù)的最大值,如若輸入非法字符,提示錯誤并重新輸入〃解釋:非法字符,需要輸入數(shù)字時,字符相對它來說就是非法字符,而需要輸入字符型,數(shù)字對它不是非法字符,所有都是合法#include<stdio.h>voidmainO(inta,b,max,ret;printf['Entera,b:');ret=scanf("%d%d”,&a,&b);while(ret!=2)〃判斷數(shù)據(jù)個數(shù)或格式是否錯誤Iwhile(getchar()!=’\n');〃清除緩沖區(qū)中的錯誤數(shù)據(jù)printf(z,Entera,b:');ret=scanf("%d%d”,&a,&b);}max=a>b?a:b;printf(〃max=%d\n〃,max);//注意:scanf()函數(shù)不做參數(shù)類型匹配檢查,當輸入13.2時,$じ2比返回2,不會導致重新輸入但是,此后的小數(shù)點仍留在緩沖區(qū),如果此后還需輸入內容,就要先清除緩沖區(qū)內容2)例2:先由計算機想ー個1T00之間的數(shù)請人猜,若猜對,則計算機提示Right!結束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,直到猜對為止,記錄人猜的次數(shù),反應猜數(shù)的水平#include<stdio.h>#include<stdlib.h>voidmainO(intmagic;30intguess;intcounter=0;magic=rand()%100+l;do{printf(Z/Pleaseguessamagicnumber:*);scanf("%d”,ftguess);counter++;if(guess>magic){printf(*WronglToobig!\n");elseif(guess<magic)printf(wWrong!Toosmall!\n*);else{printf("Right!\n");)}while(guess!-magic);printf("counter=%d\nz,,counter);).隨機數(shù)的使用a.隨機數(shù)的產生:randO1)符號常量RAND_MAX在頭文件#include<stdlib.h>中定義,標準C規(guī)定RAND_MAX不大于雙字節(jié)整數(shù)的最大值327672)隨機函數(shù)rand()產生的是ー個在O'RAND-MAX之間的整數(shù),即[0,32767]之間的整數(shù)3)利用求余運算rand()%b可將函數(shù)rand()生成的隨機數(shù)變化到[0,b-1]4)利用rand()%b+a可將隨機數(shù)的取值范圍平移到[a,a+b-1]b.隨機數(shù)的產生:srand(time(NULL))1)用rand()直接產生的隨機數(shù)只是ー個偽隨機數(shù),反復調用產生的隨機數(shù)序列是ー樣的,而且每次都只用第一個2)隨機化:使程序每次運行時產生不同的隨機數(shù)序列的過程3)隨機化的實現(xiàn):通過調用標準庫函數(shù)srand()為函數(shù)rand()設置隨機數(shù)種子來實現(xiàn)4)隨機數(shù)種子的設置:法1:每次通過用戶輸入來完成隨機化,srand(1),srand(2),srand(seed),輸入seed法2:的通過函數(shù)time。讀取計算機的時鐘值,并把該值設置為隨機數(shù)種子srand(time(NULL))5)函數(shù)time。返回以秒計算的當前時間值,即ー個代表時間的字符串,使用NULL作為time。的參數(shù)時,time(NULL)的返回值被轉換成一個無符號整數(shù),可作為隨機數(shù)發(fā)生器的種子6)使用time。函數(shù)時,必須在程序開頭將頭文件くtime.h>包含到程序中31.例:先由計算機想ー個1T00之間的數(shù)請人猜,若猜對,則計算機提示Right!結束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,直到猜對為止,記錄人猜的次數(shù),反應猜數(shù)的水平#include<stdio.h>#include<stdlib.h>#include<time.h>voidmainO(intmagic;intguess;intcounter=O;srand(time(NULL));magic=rand()%100+l;do{printf(Z/Pleaseguessamagicnumber:");scanf("%d",&guess);counter++;if(guess>magic)printf("WrongIToobig!\n");elseif(guess<magic)printf("Wrong!Toosmall!\n");}else{printf("Right!\n");}}while(guess!=magic);printf("counter=%d\n",counter);}.例:先由計算機想ー個1T00之間的數(shù)請人猜,若猜對,則計算機提示Right!屏幕輸出多少次成功,結束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,最多猜10次,超過就結束,要避免非法字符的輸入#include<stdio.h>#include<stdlib.h>#includeくtime.h>voidmain()iintmagic;intguess;intcounter=0;32intret;〃保存scanf()函數(shù)的返回值srand(time(NULL));magic=rand()%100+l;do{printf("Pleaseguessamagicnumber:");ret=scanf("%d",&guess);while(ret!=1)〃若存在輸入錯誤,則重新輸入iwhile(getchar()!='\n');〃清楚緩沖區(qū)中的內容printf("Pleaseguessamagicnumber:");ret=scanf("%d",&guess);)〃若存在非法字符,則重新輸入counter++;if(guess>magic)(printf("Wrong!Toobig!\n");}elseif(guess<magic){printf("WrongIToosmall!\n");)else{printf("Right!\n");}while(guess!=magic&&counter<10);printf("counter=%d\n”,counter);}延伸拓展:先由計算機想ー個1T00之間的數(shù)請人猜,若猜對,則計算機提示Right!屏幕輸出多少次成功,結束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,最多猜10次,超過就繼續(xù)猜下ー個數(shù),每次運行程序,可反復猜多個數(shù),直到操作者想停時結束,要注意避免非法字符輸入的問題#include<stdio.h>#include<stdlib.h>#include<time.h>voidmain()(intmagic;intguess;intcounter;charreply;〃保存用戶輸入的答案intret;〃保存scanf()函數(shù)的返回值srand(time(NULL));33do{magic=rand()%100+l;counter=0;do{printf("Pleaseguessamagicnumber:");ret=scanf("%d”,&guess);while(ret!=l)〃若存在輸入錯誤,則重新輸入{while(getchar()!=’\n');〃清楚緩沖區(qū)中的內容printf("Pleaseguessamagicnumber:");ret=scan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四塔吊設備購置與銷售專項合同范本3篇
- 二零二四年家電銷售顧問聘用與售后服務合同3篇
- 二零二五版出租車承包合同綠色出行推廣合作2篇
- 二零二五版豪華度假酒店承包經(jīng)營合同規(guī)范范本3篇
- 二零二五版公益勞動服務基地共建與社區(qū)公共服務拓展合同3篇
- 年度營養(yǎng)型輸液競爭策略分析報告
- 年度智能兒童成長儀市場分析及競爭策略分析報告
- 2024年鋼材交易:居間代理全套合同
- 二零二五版水利工程承包居間代理服務合同2篇
- 2025年變壓器智能化升級采購及技術支持合同3篇
- 安徽省合肥市包河區(qū)2023-2024學年九年級上學期期末化學試題
- 《酸堿罐區(qū)設計規(guī)范》編制說明
- PMC主管年終總結報告
- 售樓部保安管理培訓
- 倉儲培訓課件模板
- 2025屆高考地理一輪復習第七講水循環(huán)與洋流自主練含解析
- GB/T 44914-2024和田玉分級
- 2024年度企業(yè)入駐跨境電商孵化基地合作協(xié)議3篇
- 《形勢與政策》課程標準
- 2023年海南省公務員錄用考試《行測》真題卷及答案解析
- 橋梁監(jiān)測監(jiān)控實施方案
評論
0/150
提交評論