#include <stdio.h> int main() { int a, b, c; printf("請輸入三個數:\n"); scanf("%d%d%d", &a, &b, &c); if (a < b) { a = a ^ b; b = b ^ a; a = a ^ b; } if (a < c) { a = a ^ c; c = a ^ c; a = a ^ c; } if (b < c) { b = b ^ c; c = c ^ b; b = b ^ c; } printf("%d %d %d", a, b, c); return 0; }
分支用到了if條件句,我用了異或的方法進行兩個數的值得互換,‘^’異或,將兩個數按二進制位異或,同爲0,異爲1。進階的利用循環結構的一組數據的大小排列以下:程序員
#include <stdio.h> int main() { int a[10] = {0}; int i = 0; int c = 0; int j = 0; printf("請輸入10個數:\n"); for (i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (i = 0; i < 10; i++) { for (j = i+1; j < 10; j++) { if (a[i] < a[j]) { c = a[i]; a[i] = a[j]; a[j] = c; } } } for (i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }
利用循環語句進行填充數組,循環語句進行大小的排列,也稱爲冒泡法,用第三個值進行兩個數字的值的交換,用循環語句進行順序打印數組
#include <stdio.h> int main() { int i = 0; for (i = 0; i < 100; i++) { if (i % 3 == 0) { printf("%d ", i); } } return 0; }
繼續使用循環語句打印多個數字,a%b表示a除以b以後取餘數,餘數爲0即爲3的倍數架構
#include <stdio.h> int main() { int n = 18; int m = 24; int r = 0; scanf("%d%d", &m, &n); while (r = m % n) { //r = m % n; m = n; n = r; } printf("%d\n", n); return 0; }
展轉相除:爲了獲得兩個數的最大公約數,以除數和餘數反覆作除法運算,當餘數爲 0 時,取當前算式除數爲最大公約數。代碼中「//r = m % n」這個部分是能夠優化放在循環條件的地方,就能提升執行效率,當餘數爲零時,while(0)下面的循環再也不執行,邏輯成立。框架
#include <stdio.h> int main() { int year = 0; int count = 0; printf("1000到2000年間的閏年爲:\n"); for (year = 1000; year <= 2000; year++) { //if (year % 4 == 0 && year % 100 != 0) //{ // printf("%d ", year); // count++; //} //else if (year % 400 == 0) //{ // printf("%d ", year); // count++; //} if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { printf("%d ", year); count++; } } printf("\n%d\n", count); return 0; }
閏年的判斷方法爲,一個年份能被四整除且不能被100整除,或者能被四百整除,註釋起來的地方爲將兩個判斷句分開,將帶這個判斷條件整合成一個條件,放在if語句中,更優。ide
#include <stdio.h> //1.試除法 #include <math.h> //2.將試除的上限值改成sqrt(i) int main() //3.將偶數去掉,再次減小計算量 { int i = 0; int j = 0; int k = 0; for (i = 101; i <= 200; i+=2) { for (j = 2; j <sqrt(i); j++) { if (i % j == 0) { break; } } if (j > sqrt(i)) { k++; printf("%d ", i); } } printf("\n素數有%d個\n", k); return 0; }
都是用到了試除法,第一次是將內部循環中的限制條件改成sqrt(),求算術平方根,減小計算量,第二次優化是將外循環中的偶數跳過,再次減小了計算量。函數
#include <stdio.h> int main() { double n = 0, i = 0; double s1 = 0, s2 = 0; double s = 0; for (n = 1; n < 100; n += 2) { s1 = 1 / n + s1; } for (i = 2; i <= 100; i += 2) { s2 = s2 - 1 / i; } printf("%lf\n", s = s1 + s2); return 0; }
第一次想到的方法是把正的負的分開來算,須要定義的變量較多。優化
#include <stdio.h> int main() { double n = 0; double s = 0; int flag = 1; for (n = 1; n <= 100; n++) { s =flag* 1 / n + s; flag = -flag; } printf("%lf\n", s ); return 0; }
利用一個flag變量,每次循環乘以-1,實現正負相加的循環,最終求得答案。指針
#include <stdio.h> int main() { int i = 1, j = 1; int x = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { x = i * j; printf("%d * %d = %d ", j, i, x); if (i <= j) { printf("\n"); break; //一開始使用的continue 致使沒法正確跳出循環而只是跳過該次循環 } } } return 0; }
第一次想了比較久,也想到了須要兩層循環,也想到了內層循環須要限制,但是前面就是沒有想到須要使用的是break跳出循環,而不是continue跳過該次循環,到後來看完答案,上廁所的時候才忽然想到,應該用break,就不會繼續打印出一列乘法求和了,有興趣的能夠看看把break換成continue是什麼樣子。如下是老師給出的代碼:code
#include <stdio.h> int main() { int i = 1, j = 1; int x = 0; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) //i表明行數,而每行的打印個數等於改行行數,因此內循環的上限爲i { x = i * j; printf("%d*%d =%-2d ", j, i, x); //一點細節爲 %數字d 數字表示左縮進(-)或者右縮進(+)位數由數字決定 } printf("\n"); } return 0; }
這個是我今天花了最長時間的一個代碼了,一部分緣由是對於函數使用的不熟練,一部分緣由是由於接納這種代碼的邏輯關係確實須要一點時間,源代碼以下,有興趣的話能夠玩着試試,遊戲
#include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("##############################################\n"); printf("********* 1.play * * 0.exit *********\n"); printf("##############################################\n"); } void game() { int g = 0; int ret = 0; ret = rand() % 100 + 1; while (1) { scanf("%d", &g); if (g > ret) { printf("大了\n"); } else if (g < ret) { printf("小了\n"); } else { printf("恭喜你 猜對了 \a \n"); break; } } } int main() { int input = 0; menu(); srand((unsigned int)time(NULL)); do { printf("請選擇是否要開始遊戲:1/0\n"); scanf("%d", &input); switch (input) { case 1: { printf("請猜數字:\n"); game(); break; } case 0: { printf("退出遊戲\n\a"); break; } default: { printf("請輸入0/1\n"); break; } } } while (input); return 0; }
核心爲:
1.電腦會生成一個隨機數
2.猜數字
3.能夠連續玩
其中的細節包括:
1.利用do while在主函數內作一個至少會循環一次的循環語句,在裏面進行是否進入遊戲的判斷。
2.利用函數建立一個簡單的菜單欄,無返回值函數viod。
3.在主函數循環以外寫一個生成隨機數的函數rand(),再循環內,則每次猜就會生成一個新的數字。 所需頭文件爲 <stdlib.h>。
4.隨機數生成須要srand函數從新定義,不然每一次都會生成一組相同的隨機數。
5.srand函數也須要隨機數,才能讓rand每一次在不一樣的起點生成隨機數。
6.因此用時間戳做爲srand函數的參數,變量類型強制轉換爲(unsigned int)time。所需頭文件爲<time.h>。
7.時間戳生成函數的參數的類型爲指針,NULL爲空指針,咱們無需一個具體的指針,因此用空指針生成時間戳供srand使用就夠了。
8.而且遊戲函數內部能進行對於數字的判斷,進行相應的提示,大了或者小了。
9.首先是要理解架構,搭建框架,再填充其中細節,雖然我也是個程序小白,可是我以爲這麼理解是沒有錯的。
#include <stdio.h> #include <stdlib.h> //system 的頭文件 #include <string.h> //strcmp 的頭文件 int main() { char input[20] = { 0 }; //system() 用來執行系統命令的 system("shutdown -s -t 60"); again: printf(" 電腦要關機了 請輸入:我最帥 \n"); scanf("%s", input); if (strcmp(input, "我最帥") == 0) { system("shutdown -a"); } else { printf("\a"); goto again; } return 0; }
goto語句的使用一直有所爭議,其實程序之中沒有goto語句也不會有什麼影響,並且goto語句的頻繁使用會使得邏輯混亂,可能會致使程序員本人也讀不懂。以上的關機程序就能體現goto最有用的地方,跳出多層循環,當一個代碼之中有多層循環嵌套,須要直接從最裏層跳出,goto語句的方便之處方能體現,again就是一個標點,goto again,就是直接跳到again的地方繼續執行語句,而break只能跳出一層。system("shutdown -s -t 60")爲系統函數,須要<stdlib.h>的頭文件,shutdown -s 爲執行關機,後面的 -t60 爲六十秒後執行,shutdown -a爲取消關機,字符'\a'爲提示音。(固然本人夾帶私貨,自戀了一波【doge】)明天開始函數