【C语言入门】SDUT《程序设计基础I 》实验2-选择结构程序设计题解 c语言语法讲解
題目鏈接
A - C語言實驗——求絕對值(選擇結構)
使用if選擇語句, 大于等于 0 直接輸出, 小于 0 輸出 -x 即可
拓展: 求絕對值的函數
<math.h>頭文件下有abs() 和 fabs() 兩個函數, 分別可以返回整數和浮點型的原數的絕對值
code A
//if分支語句 #include <stdio.h>int main() {int x;scanf("%d", &x);if(x >= 0) printf("%d", x);else printf("%d", -x);return 0; } //使用abs()函數 #include <stdio.h> #include <math.h> int main() {int x;scanf("%d", &x);printf("%d", abs(x));return 0; }B - C語言實驗——時間間隔
- 我們可以使用統一單位的方法, 把兩個時間段統一化成秒為單位
- 根據兩個時間化成秒后的大小, 可以通過交換, 讓較小的時間在前面
- 將兩個時間作差得到兩個時間的差值, 再將其還原成小時和分鐘
- 時間是60進制, 可以類比10進制的方式思考
- 一個三位的十進制數, % 10 得到的是個位, / 10 得到的是個位之前的數, / 100得到的是百位, % 100 得到的是去掉最高位后剩下的數, 如123, 百位為123 / 100 = 1, 個位為123 % 10 = 3, 可以理解成, /10就是從十位切一刀, 然后取前半部分; 而 %10 相當于從10位切一刀, 然后取后半部分, 這樣想得到中間的數字, 可以從后往前取, 也就是123 / 10 = 12, 12 % 10 = 2; 也可以從前往后取, 也就是123 % 100 = 23, 23 / 10 = 2;
- 按照同樣的方式, 從我們已經得到的10進制的時間差, 轉換為3位(時、分、秒) 的60進制 時間, 記時間差為t, 時 = t / 3600, 秒 = t % 60, 分 = t / 60 % 60 (從后往前) 或 分 = t % 3600 / 60(從前往后)
code B
#include <stdio.h>int main() {int h1, m1, s1; //第一個時間的時分秒int h2, m2, s2; //第二個時間的時分秒scanf("%d:%d:%d", &h1, &m1, &s1);scanf("%d:%d:%d", &h2, &m2, &s2);int t1 = h1 * 3600 + m1 * 60 + s1;int t2 = h2 * 3600 + m2 * 60 + s2; //將兩個時間轉換成以秒為單位if(t1 > t2) //如果t1大,交換t1和t2,目的是讓t2 >= t1, 直接用t2 - t1求時間差 (當然也可以用abs(t1 - t2)求時間差) {int t = t1;t1 = t2;t2 = t;}int t = t2 - t1; //t為時間差, 交換后t2一定比t1大printf("%02d:%02d:%02d", t / 3600, t / 60 % 60, t % 60);return 0; }C - C語言實驗——求兩個整數之中較大者
用if來判斷較大值即可
code C
#include <stdio.h>int main() {int a, b, max;scanf("%d %d", &a, &b);if(a > b) max = a;else max = b;printf("max=%d", max); return 0; }D - 小鑫吃蘋果
跟上題相同, 都是找兩個數的最大值, 直接if比較即可
code D
#include <stdio.h>int main() {int a, b, max;scanf("%d %d", &a, &b);if(a > b) max = a;else max = b;printf("%d", max); return 0; }E - 小鑫の日常系列故事(一)——判斷對錯
仍然是直接用if判斷c是否等于a + b之和
code E
#include <stdio.h>int main() {int a, b, c;scanf("%d %d %d", &a, &b, &c);if(c == a + b) printf("YES\n");else printf("NO\n");return 0; }F - 小鑫追女神
判斷輸入是0是1即可, 可以直接用簡寫, if(n) 表示n != 0, if(!n) 表示n == 0
code F
#include <stdio.h>int main() {int n;scanf("%d", &n);if(n) printf("I like you");else printf("He he");return 0; }G - C語言實驗——求三個整數的最大值
可以對三個數排序, 排序完之后最大值最小值中間值就都可以求了;
也可以用打擂法來求max,min, 也就是初始化一個非常小的max(非常大的min), 遇到更大的(更小的)更新這個值, 最后留下的即為這些值全部的最大值or最小值, 在循環和數組章節中會經常見到打擂法
知識點: 三個數排序
對三個數排序, 最多需要3個if即可, 首先比較ab, 然后比較bc, 最后再比較一次ab
如要讓a b c從小到大排序 (a < b < c)
首先比較是否a > b, 如果是則交換a b, 交換后b的值為a和b中的較大值
然后比較是否b > c, 如果是則交換b c, 交換后c的值為b和c中的較大值, 此時的c一定為a b c中的最大值
最后比較是否a > b, 如果是則交換a b, 交換后滿足a <= b, 而c已經確保為三個數中的最大值了, 排序完成
code G
//排序 #include <stdio.h>int main() {int a, b, c;scanf("%d,%d,%d", &a, &b, &c);if(a > b){int t = a;a = b;b = t;} if(b > c){int t = b;b = c;c = t;} if(a > b){int t = a;a = b;b = t;}printf("max=%d", c); //交換完之后c為maxreturn 0; } //打擂法可以求max或者min #include <stdio.h>int main() {int a, b, c;scanf("%d,%d,%d", &a, &b, &c);int max = -2e9; // 表示2 * 10的9次方, 為max初始化一個極小的數if(a > max) max = a;if(b > max) max = b;if(c > max) max = c;printf("max=%d", max); //交換完之后c為maxreturn 0; }H - 相加和最大值
可以對三個數排序, 最大的兩個數相加的和一定是最大的;
也可以分別兩兩求和, 再求最大值
code H
#include <stdio.h>int main() {int a, b, c;scanf("%d %d %d", &a, &b, &c);if(a > b){int t = a;a = b;b = t;} if(b > c){int t = b;b = c;c = t;} if(a > b){int t = a;a = b;b = t;}printf("%d", b + c); //最大倆數加起來一定是最大的和return 0; } //倆倆求和, 這里還是用的與上題相同的打擂法的思想 #include <stdio.h>int main() {int a, b, c;scanf("%d %d %d", &a, &b, &c);int max = -2e9; // 表示2 * 10的9次方, 為max初始化一個極小的數if(a + b > max) max = a + b;if(b + c > max) max = b + c;if(c + a > max) max = c + a;printf("%d", max); return 0; }I - 時間格式轉換
只需要分類表示每一種情況即可, 注意用%02d控制輸出的格式, 這個題時不能用%02d,分需要用%02d
code I
//簡化版, 需要處理好邊界 #include <stdio.h>int main() {int h, m;scanf("%d:%d", &h, &m);int hh, mm = m;//轉換后的時和分, 分和原來的分相同//按照h來分類if(h == 0 || h == 12) hh = 12; //h = 0和h = 12兩個條件可以合并else if(h <= 11) hh = h; //h >= 1這個條件可以省略不寫else hh = h - 12; //除此之外的時間即為h >= 13 到 h <= 23之內的if(h < 12) printf("%d:%02d AM", hh, mm); //注意后面的AM和PMelse printf("%d:%02d PM", hh, mm);return 0; } //詳細版, 如果不好考慮邊界條件可以完完全全按照題目說的來寫 #include <stdio.h>int main() {int h, m;scanf("%d:%d", &h, &m);int hh, mm;if(h == 0) hh = 12;else if(h >= 1 && h <= 11) hh = h;else if(h == 12) hh = 12;else if(h >= 13 && h <= 24) hh = h - 12;mm = m;if((h == 0) || (h >= 1 && h <= 11)) printf("%d:%02d AM", hh, mm);if((h == 12) || (h >= 13 && h <= 23)) printf("%d:%02d PM", hh, mm);return 0; }J - C語言實驗——從大到小輸出a、b、c(選擇結構)
按照G思路對三個數排序即可
code J
#include <stdio.h>int main() {int a, b, c;scanf("%d%d%d", &a, &b, &c);if(a > b){int t = a;a = b;b = t;}if(b > c){int t = b;b = c;c = t;}if(a > b){int t = a;a = b;b = t;}printf("%d %d %d", c, b, a);return 0; }K - C語言實驗——三個數排序
與上一個題完全相同, 輸入中間是逗號
code K
#include <stdio.h>int main() {int a, b, c;scanf("%d,%d,%d", &a, &b, &c);if(a > b){int t = a;a = b;b = t;}if(b > c){int t = b;b = c;c = t;}if(a > b){int t = a;a = b;b = t;}printf("%d %d %d", a, b, c);return 0; }L - C語言實驗——找中間數
仍像G或前兩個題一樣, 對三個數進行排序, 輸出中間值即可
code L
#include <stdio.h>int main() {int a, b, c;scanf("%d%d%d", &a, &b, &c);if(a > b){int t = a;a = b;b = t;}if(b > c){int t = b;b = c;c = t;}if(a > b){int t = a;a = b;b = t;}printf("%d", b);return 0; }M - C語言實驗——整除
用&&(與)把兩個條件連起來即可
ps: 當你找不到wa哪里的時候不妨看看是不是輸出大小寫的問題
code M
#include <stdio.h>int main() {int n;scanf("%d", &n);if(n % 5 == 0 && n % 3 == 0) printf("Yes");else printf("No");return 0; }N - 閏年
判斷閏年的條件: 能被400整除 或者 能被4整除但不能被100整除
code N
#include <stdio.h>int main() {int n;scanf("%d", &n);if(n % 400 == 0 || n % 4 == 0 && n % 100) printf("Yes");else printf("No");return 0; }O - C/C++經典程序訓練3—模擬計算器
知識點: 吃掉行末空格
scanf %c 不會跳過空白符(如空格’ ‘或換行符’\n’), 因此當數字后面有換行符(或空格)而后需要讀入字母的時候需要吃掉行末換行符(空格符)
- 可以用getchar()直接吃掉行末的換行或者空格
- 可以設一個無關char類型變量, 然后用scanf %c 吃掉換行或者空格
code O
#include <stdio.h>int main() {int a, b;char c;scanf("%d%d", &a, &b);getchar(); //吃掉行末換行scanf("%c", &c);int ans;if(c == '+') ans = a + b;else if(c == '-') ans = a - b;else if(c == '*') ans = a * b;else ans = a / b;printf("%d", ans); return 0; }P - C語言實驗——某年某月的天數
注意判斷閏年即可
可以用switch case語句來寫, 注意在除最后一個分支下添加break即可
code P
#include <stdio.h> int main() {int y, m;scanf("%d\\%d", &y, &m);if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) printf("31");else if(m == 4 || m == 6 || m == 9 || m == 11) printf("30");else //二月需要特別處理{if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0) printf("29");else printf("28");}return 0; } //switch case寫 #include <stdio.h> int main() {int y, m;scanf("%d\\%d", &y, &m);switch(m){case 1: case 3: case 5: case 7: case 8: case 10: case 12:printf("31");break;case 4: case 6: case 9: case 11:printf("30");break;default:if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0) printf("29");else printf("28");}return 0; }Q - C語言實驗——輸入數字星期,輸出英文(switch語句)
- switch-case 語句記得在除了最后一條分支以外的所有分支加上break, break相當于switch的開關,不加的話switch會一直往下滑, 并輸出滑過的所有結果
code Q
#include <stdio.h> int main() {int d;scanf("%d", &d);switch(d){case 1: printf("Monday");break;case 2:printf("Tuesday");break;case 3:printf("Wednesday");break;case 4:printf("Thursday");break;case 5:printf("Friday");break;case 6:printf("Saturday");break;case 7: //可以寫defaultprintf("Sunday"); //最后一個可以不加break}return 0; }題解僅供參考, 一定要多敲多思考!!! 有問題歡迎在評論區指出或單獨聯系我!
總結
以上是生活随笔為你收集整理的【C语言入门】SDUT《程序设计基础I 》实验2-选择结构程序设计题解 c语言语法讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 保研边缘人的夏令营之旅~
- 下一篇: 7-1 sdut-求一个3*3矩阵对角线