出錯原因:之前運行起來的可執行程序沒有關閉 關閉即可
平均數(average)
輸入3個整數,輸出它們的平均值,保留3位小數。
#include <stdio.h>
int main()
{int a, b, c;scanf("%d %d %d", &a, &b, &c);printf("%.3lf", (a + b + c) / 3.0); //注意3.0不能寫成3return 0;
}
整數/整數=整數,浮點數/浮點數=浮點數
下面那個不是轉義字符?
A.‘\n’
B.‘\060’
C.‘\q’
D.‘\b’
答案解析:
C
A:‘\n’ 轉義字符,代表換行
B:‘\060’ 轉義字符,060八進制數據,十進制為48,表示ASCII碼為48的’0’
C:‘\q’ 什么都不是
D:‘\b’ 轉義字符,表示退格。
下面程序的結果是:( )
#include <stdio.h>
#include <string.h>
int main()
{printf("%d\n", strlen("c:\test\121"));return 0;
}
A.7
B.8
C.9
D.10
答案解析:
A
strlen:獲取字符串的有效長度,不包括’\0’
“c:\test\121”: 在該字符串中,\t是轉移字符,水平制表,跳到下一個tab的位置;而\121表示一個字符,是講121看做8進制數組,轉換為10進制后的81,作業為ASCII碼值的字符,即:字符’Q’ ,故上述字符串實際為:“c: estQ”,只有7個有效字符
.局部變量是放在內存的靜態區的,全局變量是放在內存的棧區()
答案
(錯)局部變量是放在內存的棧區的,全局變量是放在內存的靜態區
負數求模的規則是,結果的正負號由第一個運算數的正負號決定。()
答案
(對)
關于scanf函數
scanf()處理所有占位符時,會自動過濾起首的空白字符,包括空格、制表符、換行符()
scanf的占位符%s表示讀取一個字符串,遇到空白字符也全部讀取()
scanf是庫函數,庫函數不需要包含頭文件()
(錯):scanf()處理數值占位符時,會自動過濾空白字符,包括空格、制表符、換行符,scanf輸出字符占位符的時候,不忽略空白字符,總是返回當前第一個字符,無論該字符是否為空格。
(錯):scanf的占位符%s表示讀取一個字符串,遇到空白字符就停止讀取。
(錯):scanf需要包含stdio.h這個頭文件的
printf函數
printf()參數與占位符是一一對應關系,如果有n個占位符,printf()的參數就應該有n個
答案
(錯)printf()參數與占位符是一一對應關系,如果有n個占位符,printf()的參數就應該有n+1個
下面程序輸出的結果是啥:
#include <stdio.h>
int main()
{printf("%5d\n", 123456);return 0;
}
A.12345
B.123456
C.23456
答案
B.printf()允許限定占位符的最小寬度。%5d表示這個占位符的寬度至少為5位。如果不滿5位,對應的值的前面會添加空格。如果超過5位,正常輸出就行,5是最少輸出5位。
關于關系操作符說法錯誤的是?
A.C語言的關系操作符就是用來比較大小關系的
B.關系操作符中判斷是否相等使用 = =
C. = = 操作符可以用來比較2個字符串是否相等
D.關系操作符參與的關系表達式,通常返回0或1,表示真假
正確答案:
C
兩個字符串是否相等不能使用==,應該使用strcmp函數
關于switch說法不正確的是:( )
A.switch語句中的default子句可以放在任意位置
B.switch語句中case后的表達式只能是整形常量表達式
C.switch語句中case子句必須在default子句之前
D.switch語句中case表達式不要求順序
正確答案:
C
答案解析:
A:正確,可以放在任意位置,但是一般建議最好還是放在最后
B:正確,case語句后一般放整形結果的常量表達式或者枚舉類型,枚舉類型也可以看成是一個特殊的常量
C:錯誤,沒有規定case必須在default之前,一般case最好放在default之前
D:正確,但一般還是按照次序來
下面代碼的執行結果是什么( )
#include <stdio.h>
int main() {int x = 3;int y = 3;switch (x % 2) {case 1:switch (y){case 0:printf("first");case 1:printf("second");break;default: printf("hello");}case 2:printf("third");}return 0;
}
A.secondthird
B.hello
C.firstsecond
D.hellothird
正確答案:
D
switch語句時多分支的選擇語句,switch中表達式結果命中那個case,就執行該case子項,如果case子項后沒有跟break語句,則繼續往下執行。
關于該題:先在內部switch的default位置打印hello,緊接著在外部case2中打印third
switch( c )語句中,c不可以是什么類型( )
A.int
B.long
C.char
D.float
正確答案:
D
switch語句中表達式的類型只能是:整形和枚舉類型
D選項為浮點類型,不是整形和枚舉類型
func(1) = ( )
int func(int a)
{int b;switch (a){case 1: b = 30;case 2: b = 20;case 3: b = 16;default: b = 0;}return b;
}
A.30
B.20
C.16
D.0
正確答案:
D
switch的每個case之后如果沒有加break語句,當前case執行結束后,會繼續執行緊跟case中的語句。
func(1)可知,在調用func時形參a的值為1,switch(a)<==>switch(1),case 1被命中,因為該switch語句中所有分支下都沒有增加break語句,因此會從上往下順序執行,最后執行default中語句返回。
break和continue
打印素數
寫一個代碼:打印100~200之間的素數
/*
思路:
素數:即質數,除了1和自己之外,再沒有其他的約數,則該數據為素數,具體方式如下
*///方法一:試除法
int main()
{int i = 0;int count = 0;// 外層循環用來獲取100~200之間的所有數據,100肯定不是素數,因此i從101開始for(i=101; i<=200; i++){//判斷i是否為素數:用[2, i)之間的每個數據去被i除,只要有一個可以被整除,則不是素數int j = 0;for(j=2; j<i; j++){if(i%j == 0)break;}// 上述循環結束之后,如果j和i相等,說明[2, i)之間的所有數據都不能被i整除,則i為素數if(j==i){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;
}//上述方法的缺陷:超過i一半的數據,肯定不是i的倍數,上述進行了許多沒有意義的運算,因此可以采用如下
// 方式進行優化
// 方法二:每拿到一個數據,只需要檢測其:[2, i/2]區間內是否有元素可以被2i整除即可,可以說明i不是素數
int main()
{int i = 0;//int count = 0;for(i=101; i<=200; i++){//判斷i是否為素數//2->i-1int j = 0;for(j=2; j<=i/2; j++){if(i%j == 0)break; }//...if(j>i/2){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;
}/*
方法二還是包含了一些重復的數據,再優化:
如果i能夠被[2, sqrt(i)]之間的任意數據整除,則i不是素數
原因:如果 m 能被 2 ~ m-1 之間任一整數整除,其二個因子必定有一個小于或等于sqrt(m),另一個大于或等于 sqrt(m)。
*/
int main()
{int i = 0;int count = 0;for(i=101; i<=200; i++){//判斷i是否為素數//2->i-1int j = 0;for(j=2; j<=sqrt(i); j++){if(i%j == 0)break; }//...if(j>sqrt(i)){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;
}
//方法4
/*
繼續對方法三優化,只要i不被[2, sqrt(i)]之間的任何數據整除,則i是素數,但是實際在操作時i不用從101逐漸遞增到200,因為出了2和3之外,不會有兩個連續相鄰的數據同時為素數
*/
int main()
{int i = 0;int count = 0;for(i=101; i<=200; i+=2){//判斷i是否為素數//2->i-1int j = 0;for(j=2; j<=sqrt(i); j++){if(i%j == 0)break; }//...if(j>sqrt(i)){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;
}
打印閏年
打印1000年到2000年之間的閏年
/*
思路:
要求1000年到2000年之間的閏年,只需要知道求解閏年的方法即可。
閏年的條件:如果N能夠被4整除,并且不能被100整除,則是閏年或者:N能被400整除,也是閏年即:4年一潤并且百年不潤,每400年再潤一次
*/#include <stdio.h>
int main()
{int year = 0;for(year=1000; year<=2000; year++){//判斷year是否為閏年if(year%4==0) // 如果year能夠被4整除,year可能為閏年{if(year%100!=0) // 如果year不能內100整除,則一定是閏年printf("%d ", year);}if(year%400 == 0) // 每400年再潤一次printf("%d ", year);}return 0;
}
//
//介紹一下這種的簡單寫法
//
int main()
{int year = 0;for(year=1000; year<=2000; year++){if(((year%4==0)&&(year%100!=0))||(year%400==0))printf("%d ", year);}return 0;
}
最大公約數
給定兩個數,求這兩個數的最大公約數
例如:
輸入:20 40
輸出:20
/*
最大公約數:即兩個數據中公共約數的最大者。
求解的方式比較多,暴力窮舉、輾轉相除法、更相減損法、Stein算法算法
此處主要介紹:輾轉相除法思路:
例子:18和24的最大公約數
第一次:a = 18 b = 24 c = a%b = 18%24 = 18循環中:a = 24 b=18
第二次:a = 24 b = 18 c = a%b = 24%18 = 6循環中:a = 18 b = 6
第三次:a = 18 b = 6 c=a%b = 18%6 = 0循環結束
此時b中的內容即為兩個數中的最大公約數。
*/
int main()
{int a = 18;int b = 24;int c = 0;while(c=a%b){a = b;b = c;}printf("%d\n", b);return 0;
}