大家好,最近很多小伙伴向我反應(yīng)小編!我參加了藍(lán)橋杯但是我連那是什么都不知道,我該怎么訓(xùn)練?是不是在網(wǎng)站刷題就可以啊?
在這里我要回答的是刷題是必須的,著名土神(tourist)刷題超過(guò)10000道
每道估計(jì)40分鐘,大約要7000個(gè)小時(shí)??墒钦f(shuō)是地標(biāo)最強(qiáng)【俄羅斯真是恐怖
當(dāng)然我們做題是要有章法的,今天我們先統(tǒng)一學(xué)一遍C的基本用法
Dev-cpp
C語(yǔ)言網(wǎng)
推薦課外學(xué)習(xí)教材:《算法競(jìng)賽入門(mén)經(jīng)典(第2版)》 劉汝佳 編著 清華大學(xué)出版社
縮進(jìn)
代碼 {}
內(nèi)的所有代碼加上一個(gè) 縮進(jìn)(Tab)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include int main(){ // 這是 main 函數(shù)的代碼塊 int radius; scanf('%d', &radius); if(radius > 10){ // 這是 if 語(yǔ)句的代碼塊 printf('輸入的半徑大于 10'); } // if 語(yǔ)句結(jié)束 else{ // 這是 else 語(yǔ)句的代碼塊 printf('輸入的半徑小于 10'); } // else 語(yǔ)句結(jié)束 return 0; } // main 函數(shù)結(jié)束
|
標(biāo)識(shí)符
ans:表示答案。
flag:表示標(biāo)志。
sum:表示求和。
除規(guī)定好的標(biāo)識(shí)符規(guī)范之外,要求標(biāo)識(shí)符盡量 有意義。
常用的標(biāo)識(shí)符:
1 2 3 4 | int radius; // 表示半徑 double PI = 3.1415; // 表示圓周率 double ans; // 表示答案
|
關(guān)鍵字 | 類型名稱 | 說(shuō)明 |
---|---|---|
int | 整型 | 取值范圍在 – 231 ~ 231 – 1(大約 21 億) |
short int | 短整型 | 不常用 |
long int | 長(zhǎng)整型 | 取值范圍在 – 231 ~ 231 – 1(與 int 范圍等同) |
long long int | 取值范圍在 – 263 ~ 263 – 1 | |
float | 單精度浮點(diǎn)數(shù) | 不常用 |
double | 雙精度浮點(diǎn)數(shù) | |
char | 字符型 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include #include int main(){
// 測(cè)試下 int、long int、long long int 的最大值
printf('int %d\n',INT_MAX); printf('long int %ld\n',LONG_MAX); printf('long long int %lld\n', LLONG_MAX); // 注意 long long int 所用的占位符
return 0; }
|
幾個(gè)常用的字符型常量
字符常量 | ASCII 碼 |
---|---|
'A' | 65 |
'a' | 97 |
'0' | 48 |
算術(shù)運(yùn)算符 | 作用 |
---|---|
+ | 兩側(cè)操作數(shù)做加法運(yùn)算 |
- | 兩側(cè)操作數(shù)做減法運(yùn)算 |
* | 兩側(cè)操作數(shù)做乘法運(yùn)算 |
/ | 兩側(cè)操作數(shù)做除法運(yùn)算 |
% | 兩側(cè)操作數(shù)做除法運(yùn)算,將余數(shù)作為結(jié)果 |
題目 1:輸入一個(gè)半徑,輸出圓的面積。
1 2 3 4 5 6 7 8 9 10 11 12 | #include int main(){
double radius; // 輸入需要一個(gè)變量進(jìn)行存儲(chǔ) double PI = 3.1415926; scanf('%lf', &radius); // 輸入
printf('%lf\n', PI * radius * radius); // 直接將表達(dá)式作為結(jié)果輸出
return 0; }
|
如果對(duì)精度有要求:
%.mlf // m 表示精度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include int main(){ int a = 10;
// 自增前綴運(yùn)算符 printf('a = %d\n', a++); printf('a = %d\n', a);
// 自增后綴運(yùn)算符 a = 10; printf('a = %d\n', ++a); printf('a = %d\n', a);
return 0; }
|
關(guān)系運(yùn)算符 | 作用 |
---|---|
> | 大于 |
| 小于 |
>= | 大于等于 |
<> | 小于等于 |
== | 等于 |
!= | 不等于 |
邏輯運(yùn)算符 | 作用 |
---|---|
&& | 邏輯與 |
|| | 邏輯或 |
! | 邏輯非 |
在 C 語(yǔ)言中,非 0 即真。
位運(yùn)算符 | 作用 |
---|---|
& | 按位與 |
| | 按位或 |
^ | 按位異或 |
~ | 按位非 |
左移 | |
>> | 右移 |
賦值運(yùn)算符 =
可以與其他運(yùn)算符(除邏輯運(yùn)算符)進(jìn)行合并。
類型轉(zhuǎn)換
表達(dá)式的結(jié)果的類型為操作數(shù)中精度最高的類型。
高精度向低精度轉(zhuǎn)換需要 強(qiáng)制轉(zhuǎn)換。
格式輸入輸出函數(shù)
1 2 3 | scanf('格式符', &變量1, &變量2, ...); printf('要輸出的字符串、格式符以及轉(zhuǎn)義字符', 變量1, 變量2, ...);
|
格式字符 | 作用 |
---|---|
%d | 整型變量 |
%o | 以八進(jìn)制整型變量 |
%x | 以十六進(jìn)制整型變量 |
%ld | 長(zhǎng)整型變量 |
%lld | long long 型變量 |
%c | 字符變量 |
%f | 單精度浮點(diǎn)數(shù) |
%lf | 多精度浮點(diǎn)數(shù) |
%s | 字符串 |
單字符輸入輸出函數(shù)
1 2 3 4 | char c; getchar(c); // 輸入一個(gè)字符 putchar(c); // 輸出一個(gè)字符
|
多字符輸入輸出函數(shù)
1 2 3 4 | char c[10]; gets(c); // 輸入一個(gè)字符串 puts(c); // 輸出一個(gè)字符串
|
gets 函數(shù)可以讀取字符串中的空格,scanf 函數(shù)不能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if(條件){ // 條件成立則執(zhí)行 語(yǔ)句; } else if(條件){ // 前面的條件不成立且當(dāng)前條件成立則執(zhí)行 語(yǔ)句; } ... else{ // 前面所有套件都不成立 語(yǔ)句; }
|
題目2:輸入三個(gè)數(shù),輸出最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include int main(){
int a, b, c; scanf('%d%d%d', &a, &b, &c); // 注意占位符之間不需要空格,但輸入時(shí)兩個(gè)數(shù)字用空格或回車隔開(kāi)
if(a > b){ if(b > c){ printf('%d\n',a); } else if(a > c){ printf('%d\n',a); } else{ printf('%d\n',c); } } else{ if(a > c){ printf('%d\n',b); } else if(b > c){ printf('%d\n',b); } else{ printf('%d\n',c); } } return 0; }
|
太麻煩了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include int main(){
int a, b, c; scanf('%d%d%d', &a, &b, &c);
int max = a; // 使用輔助的變量存儲(chǔ)最大值 if(max b){ max = b; } if(max c){ max = c; }
printf('%d\n', max); return 0; }
|
還可以用條件運(yùn)算符或函數(shù)進(jìn)行簡(jiǎn)化。
題目3:雞兔同籠
一個(gè)籠子中同時(shí)裝有一些雞和一些兔,輸入頭和腳的個(gè)數(shù),輸出雞和兔的數(shù)目,否則輸出無(wú)法計(jì)算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include int main(){
int head, feet; scanf('%d%d', &head, &feet);
if((feet % 2) || (feet head * 2) || (feet > head * 4){ // 需要注意特殊情況 printf('無(wú)法計(jì)算\n'); } else{ int rabbit = (4 * head - feet) / 2; // 直接使用推導(dǎo)的公式 int chicken = head - rabbit;
printf('chicken = %d\nrabbit = %d\n', chicken, rabbit); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | switch(變量值){ // 變量值只能為 整型、字符型、浮點(diǎn)型 case 值1: // 變量值為值 1 時(shí) 語(yǔ)句; // 執(zhí)行該語(yǔ)句 break; // 跳出 switch 語(yǔ)句,若省略則繼續(xù)執(zhí)行下面的 case case 值2: 語(yǔ)句; break; ... default: // 上面的 case 全部不成立時(shí)執(zhí)行 語(yǔ)句; break; }
|
題目4:彩票中獎(jiǎng)
若彩票號(hào)碼為 123, 456, 789 中一等獎(jiǎng),為 147, 258, 369 中二等獎(jiǎng),為 159, 357, 555 中三等獎(jiǎng),其余號(hào)碼均未中獎(jiǎng)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include int main(){
int num; scanf('%d',&num);
switch(num){ case 123: case 456: case 789: printf('中一等獎(jiǎng)\n'); break; case 147: case 258: case 369: printf('中二等獎(jiǎng)\n'); break; case 159: case 357: case 555: printf('中三等獎(jiǎng)'); break; default: printf('未中獎(jiǎng)'); break; } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // while 循環(huán) while(條件){ 循環(huán)語(yǔ)句; }
// do-while 循環(huán) do{ 循環(huán)語(yǔ)句; }while(條件)
// for 循環(huán) for(初始化; 條件; 循環(huán)自增){ 循環(huán)語(yǔ)句; }
|
題目5:轉(zhuǎn)換密碼
按照轉(zhuǎn)換規(guī)則,將一串密碼轉(zhuǎn)換成對(duì)應(yīng)的密碼。
規(guī)則:’A’ 轉(zhuǎn)換成 ‘E’,’B’ 轉(zhuǎn)換成 ‘F’,…,’Z’ 轉(zhuǎn)換成 ‘D’(僅輸入大寫(xiě)字符)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include int main(){
char c; while((c = getchar()) != EOF){ // 注意這道題沒(méi)有提示輸入結(jié)束的標(biāo)志 if(c >= 'A' && c <> 'Z'){ putchar((c - 'A' + 4) % 26 + 'A'); } else if(c >= 'a' && c <> 'z'){ putchar((c - 'a' + 4) % 26 + 'a'); } } putchar('\n');
return 0; }
|
scanf() 函數(shù)具有返回值,為輸入正確輸入的個(gè)數(shù)或
EOF
。
getchar() 函數(shù)同樣具有返回值,為輸入正確的字符或EOF
。當(dāng)輸入結(jié)束時(shí),可以輸入 Ctrl + Z 結(jié)束輸入。
題目6:打印九九乘法表
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include int main(){ // 循環(huán)變量默認(rèn)使用 i, j, k for(int i = 1; i <> 9; i ++){ // 可以在循環(huán)初始化條件中聲明循環(huán)變量 for(int j = 1; j <> i; j ++){ printf('%d*%d=%d ', i, j, i * j); } printf('\n'); }
return 0; }
|
1 2 3 4 5 | 類型 數(shù)組名[數(shù)組大小]; // 數(shù)組的聲明
int a[10]; // 聲明一個(gè)大小為 10,數(shù)組名為 a 的整型數(shù)組 char s[10]; // 聲明一個(gè)大小為 10,數(shù)組名為 s 的字符串
|
數(shù)組的元素下標(biāo)從 0 起始,若大小為 10,則最后一個(gè)元素的下標(biāo)為 9。
字符串總是以 '\0'
結(jié)尾。
題目5:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include #include int main(){
char s[100]; scanf('%s', s); // 輸入字符串使用 %s
int m = strlen(s); // strlen() 的作用是返回字符串的長(zhǎng)度 for(int i = 0; i m; i ++){ // 數(shù)組下標(biāo)從 0 起始,到 長(zhǎng)度 - 1 結(jié)束 if(s[i] >= 'A' && s[i] <> 'Z'){ printf('%c', (s[i] - 'A' + 4) % 26 + 'A'); } else if(s[i] >= 'a' && s[i] <> 'z'){ printf('%c', (s[i] - 'a' + 4) % 26 + 'a'); } } printf('\n');
return 0; }
|
題目7:數(shù)組插入數(shù)字
已有一個(gè)已排好的9個(gè)元素的數(shù)組,今輸入一個(gè)數(shù)要求按原來(lái)排序的規(guī)律將它插入數(shù)組中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include int main(){
int num[9];
for(int i = 0; i 9; i ++){ scanf('%d', &num[i]); }
int x; scanf('%d', &x);
for(int i = 0, flag = 1; i 9; i ++){ if(flag && num[i] >= x){ // 當(dāng)輸出過(guò) x 值時(shí) flag 置為 0 printf('%d\n', x); flag = 0; } printf('%d\n', num[i]); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 | struct 結(jié)構(gòu)體名{ 結(jié)構(gòu)體內(nèi)的數(shù)據(jù); };
// 定義一個(gè)點(diǎn) struct point{ int x; int y; };
|
結(jié)構(gòu)體通常定義在函數(shù)外。
結(jié)構(gòu)體實(shí)質(zhì)上將多個(gè)變量整合在一起,使分離的變量之間具有一定的意義。
1 2 3 4 5 6 | struct point p1, p2; // 定義兩個(gè)結(jié)構(gòu)體變量 p1.x = 0; // 使用成員運(yùn)算符 `.` p1.y = 2; scanf('%d%d', &p2.x, &p2.y); printf('%d %d', p2.x, p2.y);
|
題目8:兩點(diǎn)之間距離
輸入兩點(diǎn)坐標(biāo)(xx, y1), (x2, y2),計(jì)算并輸出兩點(diǎn)間的距離。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include #include struct point{ int x; int y; }; int main(){
struct point p1, p2;
while(scanf('%d%d%d%d', &p1.x, &p1.y, &p2.x, &p2.y) != EOF){ // 注意是多組輸入數(shù)據(jù) int x = (p1.x - p2.x) * (p1.x - p2.x); int y = (p1.y - p2.y) * (p1.y - p2.y); printf('%.2lf\n', sqrt(x + y)); // 用 sqrt() 計(jì)算平方根 } return 0; }
|
1 2 3 4 5 | 返回值類型 函數(shù)名(參數(shù)列表){ // 函數(shù)體 語(yǔ)句; }
|
返回值類型即 return
后跟著的變量或值的類型,若沒(méi)有返回值或省略則填寫(xiě) void
。
通過(guò) return
語(yǔ)句可以 提前結(jié)束 函數(shù)并返回調(diào)用處。
若省略返回值則 執(zhí)行到大括號(hào) 并返回調(diào)用處。
參數(shù)列表中為函數(shù)需要的各個(gè)參數(shù),在調(diào)用時(shí)需要 提供對(duì)應(yīng)的參數(shù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include int f(int x){ if(x 5){ f(x + 1); // 遞歸的入口 } else{ return x; // 必要的出口 } } int main(){
printf('%d',f(1)); return 0; }
|
遞歸是在函數(shù)內(nèi)調(diào)用函數(shù)本身的一種方式。
函數(shù)必須有一個(gè)入口以及一個(gè)出口。
通過(guò)遞歸可以不斷重復(fù)同一個(gè)過(guò)程,在必要的條件下結(jié)束并得到結(jié)果。
題目9:最大公約數(shù)和最小公倍數(shù)
寫(xiě)兩個(gè)函數(shù),分別求兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù),用主函數(shù)調(diào)用這兩個(gè)函數(shù),并輸出結(jié)果兩個(gè)整數(shù)由鍵盤(pán)輸入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include
// 可以將公用的變量放在函數(shù)外作為全局變量 // 全局變量可以被從聲明位置起以后的所有語(yǔ)句使用 int num1, num2; int GCD;
// 利用 輾轉(zhuǎn)相除法 求得兩個(gè)數(shù)的最小公約數(shù) int gcd(int a, int b){ // 函數(shù)參數(shù)以在函數(shù)內(nèi)有效 if(a b){ int temp = a, a = b, b = temp; // 這個(gè)局部變量只在該代碼塊間有效 } if(!(a % b)){ return b; } gcd(b, a % b); }
// 最大公約數(shù) * 最小公倍數(shù) = 兩數(shù)乘積 int lcm(){ return num1 * num2 / GCD; } int main(){
scanf('%d%d', &num1, &num2); GCD = gcd(num1, num2); printf('%d %d\n',GCD, lcm()); return 0; }
|
include 預(yù)處理
用來(lái)加載頭文件。
define 預(yù)處理
用來(lái)將指定字符序列替換成對(duì)應(yīng)的字符序列
1 2 | #define PI 3.1415926 // 常用于定義一個(gè)常量
|
進(jìn)制轉(zhuǎn)換
階乘之和
– 輸入 n,計(jì)算 S = 1! + 2! + … + n! 的末 6 位(不含前導(dǎo) 0)。
– 樣例輸入:10
– 樣例輸出:37913
汽水瓶
– “某商店規(guī)定:三個(gè)空汽水瓶可以換一瓶汽水。小張手上有十個(gè)空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶。
– 樣例輸入:10
– 樣例輸出:5
WERTYU
– 輸入往右一個(gè)錯(cuò)位后敲出的字符串(所有字母均大寫(xiě)),輸出打字員本來(lái)想打出的句子,且輸入保證合法。
– 樣例輸入:O S, GOMR YPFSU/
– 樣例輸出:I AM FINE TODAY.
生成元
– 如果 x 加上 x 的各個(gè)數(shù)字之和得到 y,就說(shuō) x 是 y 的生成元。給出 n 求出最小生成元,無(wú)解輸出 0。
– 樣例輸入1:216
– 樣例輸出1:198
– 樣例輸入2:121
– 樣例輸出2:0
– 樣例輸入3:2005
– 樣例輸出3:1979
聯(lián)系客服