目錄
do...while()循環
do語句的語法
?do語句的特點
do while循環中的break和continue
練習
goto語句
do...while()循環
do語句的語法
do
????????循環語句;
while(表達式);
?do語句的特點
循環至少執行一次,使用的場景有限,所以不是經常使用。
#include <stdio.h>
int main()
{int i = 10;do{printf("%d\n", i);} while (i < 10);return 0;
}
do while循環中的break和continue
int main()
{int i = 0;do{if (i == 5)break;printf("%d ",i);i++;} while (i <= 10);return 0;
}
int main()
{int i = 0;do{if (i == 5)continue;printf("%d ",i);i++;} while (i <= 10);return 0;
}
do while循環中break和continue和在while循環中一模一樣。
break都是用于終止循環,continue是跳過本次循環后邊的代碼,直接去判斷部分。
練習
1. 計算 n的階乘。
#include<stdio.h>
int main()
{int n = 0;scanf("%d",&n);int i = 0;int ret = 1;//得到1-n的數字,累乘for (i = 1; i <= n; i++){ret *= i;}printf("%d\n",ret);return 0;
}
.2.計算 1!+2!+3!+……+10!
效率太低,循環次數多
#include<stdio.h>
int main()
{int n = 0;int i = 0;int ret = 1;int sum = 0;//讓n變起來,從1-10for (n = 1; n <= 10; n++){//得到1-n的數字,累乘for (i = 1; i <= n; i++){ret *= i;}sum += ret;ret = 1;}printf("%d\n",sum);return 0;
}
對上述代碼改進,提升效率 ↓
#include<stdio.h>
int main()
{int n = 0;int i = 0;int ret = 1;int sum = 0;//讓n變起來,從1-10for (n = 1; n <= 10; n++){ret *= n;//直接用上次得到的結果乘新的nsum += ret;}printf("%d\n", sum);return 0;
}
3.?在一個有序數組中查找具體的某個數字n。
此題用到了二分查找(折半查找)
這種方法效率很高,但條件苛刻,需要數組有序。
思路:
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d",&k);int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz - 1;int flag = 0;while (left <= right){int mid = (left + right) / 2;if (arr[mid] < k)left = mid + 1;//右下標不變else if (arr[mid] > k)right = mid - 1;//左下標不變else{printf("找到了,下標是%d\n", mid);flag = 1;break;}}if (flag == 0){printf("找不到了\n");}return 0;
}
4. 編寫代碼,演示多個字符從兩端移動,向中間匯聚。
#include<stdio.h>
#include <windows.h>
int main()
{char arr1[] = "**********************";char arr2[] = "welcome to bit!!!!!!!!";int sz = sizeof(arr2) / sizeof(arr2[0]);int left = 0;int right = sz - 2;//減去/0,求出的是下標// int right = strlen(arr2)-1;//包含string.hwhile (left <= right){arr1[left] = arr2[left];arr1[right] = arr2[right];left++;right--;printf("%s\n",arr1);Sleep(500);//休眠0.5s,需要包含<windows.h>system("cls");//清空屏幕}printf("%s",arr2);return 0;
}
5. 編寫代碼實現,模擬用戶登錄情景,并且只能登錄三次。(只允許輸入三次密碼,如果密碼正確則提示登錄成,如果三次均輸入錯誤,則退出程序。
補充:比較字符串時,不能直接用 == 比較,strcmp函數是比較字符串的大小的,頭文件是string.h
? ? ? ? ? 如果>,返回 >0
? ? ? ? ? 如果==,返回0
? ? ? ? ? 如果<?,返回<0
#include <stdio.h>
#include <string.h>
int main()
{int i = 0;for (i = 0; i < 3; i++){char password[20] = { 0 };scanf("%s", password);if (strcmp(password, "123456") == 0){printf("登陸成功\n");break;}else{printf("密碼錯誤\n");}if (i == 3){printf("三次密碼錯誤,退出程序\n");}}return 0;
}
goto語句
C語言中提供了可以隨意濫用的 goto語句和標記跳轉的標號。
從理論上 goto語句是沒有必要的,實踐中沒有goto語句也可以很容易的寫出代碼。
但是某些場合下goto語句還是用得著的,最常見的用法就是終止程序在某些深度嵌套的結構的處理過程。
goto語言真正適合的場景如下:
for(...)
????????for(...)
????????{
????????????????for(...)
????????????????{
????????????????????????if(disaster)
????????????????????????goto error;
????????????????}
????????}
…
error:
????????if(disaster)
????????// 處理錯誤情況
下面是使用goto語句的一個例子,然后使用循環的實現方式替換goto語句:
#include <stdio.h>
int main()
{char input[10] = { 0 };system("shutdown -s -t 60");
again:printf("電腦將在1分鐘內關機,如果輸入我是豬,就取消關機\n");scanf("%s",input);if (strcmp(input, "我是豬") == 0){system("shutdown -a");printf("你很配合,已取消關機\n");}else{goto again;}return 0;
}
而如果不使用goto語句,則可以使用循環:
#include <stdio.h>
int main()
{char input[10] = { 0 };system("shutdown -s -t 60");while (1){printf("電腦將在1分鐘內關機,如果輸入我是豬,就取消關機\n");scanf("%s", input);if (strcmp(input, "我是豬") == 0){system("shutdown -a");printf("你很配合,已取消關機\n");break;}}return 0;
}