習(xí)記錄-1)
正在學(xué)習(xí)C語言中…編程前須知今天懶得寫了第一個程序求下落位移#includestdio.hintmain(){inth,t,g10;doubles;scanf(%d%d,h,t);sg*t*t/2;if(sh)printf(%.1f\n,s);elseprintf(%d\n,h);return0;}新知1.main()里面可以空白也可以寫void2.控制輸出小數(shù)位printf(“%.nf”,variable); n代表要求輸出n位小數(shù)且會四舍五入而非直接截斷易錯1.scanf后面修改變量值必須加取變量運算符“”2.if后面條件要在()里3.每一條語句后面都要有分號4.如果ifelseforwhile等后面的body只有一行可以不用{}否則必須有且這些所在的那一行不能寫分號5.區(qū)分整數(shù)除法與浮點除法只要被除數(shù)與除數(shù)之中一個是浮點數(shù)就采用浮點除法注意下面第二個是大坑它是先按整數(shù)除法得到1再轉(zhuǎn)為浮點數(shù)1.0位數(shù)沒關(guān)系只要有小數(shù)點就是浮點數(shù)doubleint sum9double avg sum / 2.0;等價于double avg (double)sum / 2;inta9/5;// 1 整數(shù)除法余數(shù) 4 被丟掉doubleb9/5;// 1.0 ?? 先算 9/51再轉(zhuǎn)成 doubledoublec9/5.0;// 1.8 浮點除法doubled9.0/5;// 1.8 浮點除法第二個程序海倫公式求三角形面積#includestdio.h#includemath.hintmain(){charagain;do{doublea,b,c,p,s;printf(輸入三邊長\n);scanf(%lf%lf%lf,a,b,c);if(abcacbbcaa0b0c0){p(abc)/2.0;ssqrt(p*(p-a)*(p-b)*(p-c));printf(面積為%f\n,s);}else{printf(不能組成三角形\n);}printf(還要繼續(xù)嗎回復(fù)y/n\n);scanf( %c,again);}while(againy||againY);return0;}新知1.stdio.h庫中常用函數(shù)有printfscanfgetcharputchar等math.h中庫有sin,cos,tan,asin,acos,atan,exp,log,log10,pow,sqrt,cbrt等2.char定義的是字符數(shù)據(jù)類型本質(zhì)上是字符依據(jù)ASCⅡ?qū)?yīng)的那個整數(shù)一個變量只能儲存單個字符內(nèi)存一個byte賦值形似char c ‘Y’;。注意此處是單引號單引號是字符本質(zhì)是一個整數(shù)雙引號是字符串本質(zhì)是指向那一串字符的地址。char對應(yīng)的格式符可以是%c字符或%dint字符串對應(yīng)的格式符是%s3.定義數(shù)組如 char array[10];里面的數(shù)字指的是數(shù)據(jù)個數(shù)可以給其賦值字符串字符串就是以’\0’結(jié)尾的字符串數(shù)組比如上述array[10]數(shù)組就可以記錄9個字符最后一個留給’\0’如abc‘a(chǎn)’,‘b’,‘c’,‘\0’數(shù)組是一段連續(xù)空間下標從0開始如聲明int a[5]下標只有012344.字符串字面量就是寫在源碼里的那個量比如abc,經(jīng)編譯后變?yōu)橐浴痋0’結(jié)尾的字符數(shù)組即字符串。5.邏輯運算符邏輯與邏輯或||邏輯非!任何非0的數(shù)的返回結(jié)果都是1真0的返回結(jié)果是0假如int a5 if(a){}就會正常執(zhí)行因為a!0返回結(jié)果就是1優(yōu)先級! 算術(shù)運算 關(guān)系運算(, , ) || 賦值()和||都有短路特性只要左邊能確定結(jié)果右邊就不會執(zhí)行0任意東西都為假inti0;intr0i;// 左邊 0 是假 → 右邊 i 不執(zhí)行 → i 還是 0ints1||i;// 左邊 1 是真 → 右邊 i 不執(zhí)行 → i 還是 0易錯1.字符數(shù)組中’\0’也占一個位置這很容易忘記導(dǎo)致越界2.注意寫\n保證美觀3.%c 會讀取空白字符包括空格、換行、Tab常需在 %c 前加空格如 %c 來跳過前導(dǎo)空白。此段代碼即是如此用戶輸入三個邊長后會按\n來推進程序而這個\n會保留在緩存區(qū)后續(xù)%c一讀取就讀到了\n ! ‘y’||‘Y’故程序會直接結(jié)束4.%s 遇到空白就停且不會檢查數(shù)組越界建議用寬度限制如 %19s補充記錄循環(huán)for循環(huán)適用于次數(shù)已知的循環(huán)for(初始化 ; 判斷條件 ; 更新表達式){循環(huán)體}執(zhí)行順序初始化→判斷條件→循環(huán)體→更新表達式→判斷條件→…三個位置不能交換各有職責// 三部分都可以省略但分號不能省for (;; ) // 死循環(huán)for (; i 5;) // 省略初始化和更新for (i 0; ; i) // 省略條件等于死循環(huán)可以把更新表達式寫在循環(huán)體里但是可讀性差while循環(huán)適用于次數(shù)未知靠條件控制的循環(huán)while條件{循環(huán)體}先判斷條件為真才執(zhí)行循環(huán)體??赡芤淮味疾粓?zhí)行??記得在循環(huán)體里更新否則會形成死循環(huán)do-while循環(huán)適用于至少執(zhí)行一次的場景do{循環(huán)體}while條件\??注意這里需要加分號先執(zhí)行一次循環(huán)體再判斷條件。至少執(zhí)行一次break和continuebreak立即跳出整個循環(huán)for(inti0;i10;i){if(i5)break;// i 到 5 時直接結(jié)束循環(huán)printf(%d ,i);// 0 1 2 3 4}continue跳過本次進入下一次for(inti0;i10;i){if(i%20)continue;// 偶數(shù)跳過printf(%d ,i);// 1 3 5 7 9}注意continue 在 while 里要小心死循環(huán)inti0;while(i5){if(i2)continue;// ?? i 沒機會自增永遠停在 2 → 死循環(huán)i;}然而在 for 里沒這個問題因為 i 是循環(huán)語法的一部分continue 后仍會執(zhí)行緩沖區(qū)鍵盤輸入的字符不會立刻被程序讀到而是先進輸入緩沖區(qū)等 scanf、getchar 來取若輸入3.14 2.71 1.41\n緩沖區(qū)[3][.][1][4][ ][2][.][7][1][ ][1][.][4][1][\n]scanf(“%lf%lf%lf”,…) 按格式一點點讀走 3.14、2.71、1.41但換行 \n 留下了。于是下一個 scanf(“%c”, …) 就把這個殘留的 \n 讀走了——這就是為什么要在%c前面加一個空格來跳過空白符核心結(jié)論scanf 按格式讀多余的字符會留在緩沖區(qū)污染后面的讀取。返回值幾乎所有函數(shù)都有返回值除了返回void的函數(shù)scanf返回值是成功讀取的變量個數(shù)失敗返回EOF藉此可以判斷是否正確讀取getchar返回值是讀到的字符int值失敗返回EOF數(shù)學(xué)運算返回值就是運算結(jié)果值零零散散的知識i 等價于i 1放在for循環(huán)里就可以說1是它的步長