今天繼續學習了 循環結構算法
#include <stdio.h> int main() { int ch = 0; // EOF - end of file 文件結束標誌 while ((ch = getchar()) != EOF) { putchar(ch); } return 0;
程序運行過程當中,直接輸入EOF並不能結束程序,EOF - end of file 爲文件結束標誌,在程序運行窗口輸入Ctrl+z,會顯示^Z的字樣,爲程序結束標誌的碼值輸入。windows
#include <stdio.h> int main() { int ch = 0; int ret = 0; char password[16] = { 0 }; printf("請輸入密碼:>\n"); scanf("%s", password); // 輸入了密碼 並存放在password數組中 // 緩衝區還剩餘一個 '\n', //因而讀取一個 '\n'; while ((ch = getchar()) != '\n') { ; } //getchar(); //讀取了輸入密碼以後的用於確認字符串的回車 //當密碼中輸入空格的時候 scanf只會讀取空格前內容 因此須要用getchar把空格後的字符讀完 //才能在下一步進行確認 printf("請確認:> Y/N\n"); //此時輸入密碼後的回車會被getchar獲取 字符\n的碼值爲10 爲真 ret = getchar(); // if (ret == 'Y') { printf("確認成功\n"); } else { printf("放棄確認\n"); } return 0; }
其中的註釋起來的單獨一行「//getchar(); //讀取了輸入密碼以後的用於確認字符串的回車」是前面爲了把輸入在scanf函數裏的數字最後一位用於確認的回車「\n」字符拿掉,「\n」的返回值部位0,沒有拿掉這個字符,下面的if條件句就不能正確的執行。 後來考慮到輸入後可能會有空格,而空格之後的字符一個 scanf 沒法獲取,就使用了一個 while 循環將 scanf 能拿掉的字符以後的字符拿取乾淨,而後才能讓下面的 if 語句正確執行。數組
#include <stdio.h> int main() { int i = 0; int j = 0; for ( ; i < 10 ; i++) { for ( ; j < 10; j++) { printf("hehe "); } //內部循環省略賦初值以後會致使第一次循環完成以後變量再也不進行賦初值 //下一次進入循環的時候 j==10 沒法再次循環 } return 0; }
原本想寫一個可以輸出一百個「hehe」的程序,可是因爲內層循環裏的賦初值省略了,最終只能十個「hehe」ide
#include <stdio.h> int main() { int x,y; for (x = 0, y = 0; x<2 && y<5; ++x, y++) { printf ("hehe "); } return 0; }
for 語句的使用也能夠是好幾個賦初值和判斷句構成函數
計算 1!+ 2! + 3!+...+10!學習
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 3; n++) { for (i = 1; i <= n; i++) { ret = ret * i; } sum = ret + sum; }//1 + 2 + 6 == 9 n=3 時打印出結果爲15 printf("%d \n ", sum); return 0; }
以上,是有問題的,由於直接10!的階乘比較大,難以確認,因此用前三位來進行確認,以上程序運行的結果爲15, 1!+ 2! + 3! = =9,很明顯有問題。通過逐步調試,發現了問題所在。糾正後源代碼以下:設計
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 10; n++) { for (i = 1; i <= n; i++) { ret = ret * i; } sum = ret + sum; ret = 1; //ret 運算事後保留了值 要重置才能正確加入下一次階乘運算 } printf("%d \n ", sum); return 0; }
問題也很明確,過程當中的階乘初值 ret=1 ,但在過程當中並未重置爲1,因此得不到正確的結果,固然該代碼還有改進的餘地,以下:調試
#include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; for (n = 1; n <= 10; n++) { ret = ret * n; sum = sum + ret; // 直接進行累乘 時最簡單的算法 只須要進行一次循環 printf(" ret=%d sum=%d\n", ret, sum); } return 0; }
以上代碼之中也將過程的變化量打印了出來,方便觀察,並且只用了單個循環code
順序數組,指a[0]<=a[1]<=a[2]...字符串
#include <stdio.h> int main() { int i = 0; int v[100] = { 0 }; for (i = 0; i < 100; i++) { v[i] = 2 * i + 1; } int k = 0; printf("請輸入你想要尋找到的數字:\n"); scanf("%d", &k); int sz = sizeof v / sizeof v[0]; for (i = 0; i < sz; i++) { if (k ^ v[i]) continue; else { printf("找到了 v[%d]=%d \n", i, v[i]); break; } } if (i == sz) { printf("找不到!!!"); } return 0; }
我先用循環填充了一個內含100個元素的數組v[100],而後用異或進行判斷,使用 if 語句,其中「 k ^ v[i] 」返回值爲零時,進入else,找到對應數字,中止循環,「 k ^ v[i] 」返回值不爲零,跳過該次循環。
#include <stdio.h> #include <string.h> #include <windows.h> #include <stdlib.h> int main() { char arr1[] = "Li yan qing LOVE Xie yu qing "; char arr2[] = "*****************************"; int right = strlen(arr1) - 1; int left = 0; while(right >= left) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf(" %s \n", arr2); //休息一秒,須要調用Windows.h頭文件 Sleep(1000); system("cls");//執行系統命令的函數 清空屏幕 須要調用stdlib.h頭文字 left++; right--; } printf(" %s \n", arr2); return 0; }
代碼運行的效果爲,一行字符逐漸被另外一串字符替換,(本人夾帶私貨,給女友表白了一波,【doge】),strlen函數的做用爲求字符串長度,須要stdlib.h的頭文件。Sleep爲讓程序暫停的函數,後面括號裏的數字單位爲毫秒,所需頭文件爲windows.h。system("cls");//執行系統命令的函數 清空屏幕 須要調用stdlib.h頭文字。須要注意的爲,一個字符串被另外一個字符串所代替的過程當中,下標,字符串最後一位爲結束字符‘\0’,並不會在字符串後顯示,但也佔一位,因此在計算字符串長度的時候須要 -1;
#include <stdio.h> #include <string.h> int main() { int i = 0; printf("請輸入密碼:\n"); char password[20] = { 0 }; for (i = 0; i < 3; i++) { scanf("%s", password); if (strcmp(password, "100086") == 0) { printf("登陸成功\a\n"); break; } printf("輸入錯誤!!!\a\n"); } if (i == 3) { printf("三次機會已用完,程序退出!!!\a \n"); } return 0; }
其中'\a'爲提示音,此程序中值得注意的一點是,字符串是否相等並不能直接將字符串寫在 == 兩邊進行判斷,須要用到一個函數,strcmp 函數,頭文件爲string.h,其中的所須要驗證的密碼是由源代碼書寫人定的,之後或許能設計出更完善的登陸端口