目录
while循环:初始化、判断部分、循环变量的调整部分,任一一个发生变化都会影响结果,随着代码越来越多,三个部分离得越来越分散,未来要改动循环的时候,就会比较麻烦。for循环就可以解决这个问题。
#include<stdio.h>
int main(void)
{
int i = 1; //初始化
while (i <= 10) //判断部分
{
printf("%d\n", i);
i++; //循环变量的调整部分
}
return 0;
}
for循环语法
特点:初始化只执行一次
举例:打印1-10的整数
#include<stdio.h>
int main(void)
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
break 和 continue 在for循环的用法:
break 终止整个循环
continue 终止本次continue后面的语句执行,跳到调整部分
for语句的循环控制变量,一些建议:
1,不可在for 循环体内修改循环变量,防止for循环失去控制。
2,建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
循环体内改变变量举例:
#include<stdio.h>
int main(void)
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i); //进入死循环
i = 6;
}
return 0;
}
#include<stdio.h>
int main(void)
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
int j = 6;
for (j = 0; j < 10; i++)
{
printf("haha\n"); //进入死循环
}
}
return 0;
前闭后开举例:
#include<stdio.h>
int main(void)
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++) //前闭后开,一眼能看出循环了10次
//for (i = 0; i <= 9; i++) //前闭后闭
{
printf("%d ", arr[i]);
}
return 0;
}
一些for 循环的变种
for 循环的初始化、判断和调整三个部分都可以省略,语法是支持的,但是判断部分的省略,判断部分就恒为真,代码进入死循环
//变种1
#include<stdio.h>
int main(void)
{
for (;;)
{
printf("哈哈\n "); //进入死循环
}
return 0;
}
也不建议随便省略:
//变种2
#include<stdio.h>
int main(void)
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("哈哈\n");
}
return 0;
}
思考:下面循环要循环多少次?
do while() 循环
do语句的语法:不管三七二十一,先执行完了,然后再判断,判断为真,然后再新的一轮执行。
循环至少执行一次,使用的场景有限。所以不是经常使用。
do
循环语句;
while (表达式);
举例:打印1-10
#include<stdio.h>
int main(void)
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
break 在do while()循环里举例,如果多个循环嵌套,一个break只能跳出自己这层循环。
#include<stdio.h>
int main(void)
{
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i); // 输出:1 2 3 4
i++;
} while (i <= 10);
return 0;
}
continue 在do while()循环里举例
#include<stdio.h>
int main(void)
{
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i); // 输出:1 2 3 4 之后一直 i = 5 进入死循环
i++;
} while (i <= 10);
return 0;
}
练习
1,计算 n 的阶乘。
while循环:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int x = 1;
int n;
int sum = 1;
scanf("%d", &n);
while (x <= n)
{
sum *= x;
x++;
}
printf("%d 的阶乘是:%d\n", n, sum);
return 0;
}
for循环:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int x = 1;
int n;
int sum = 1;
scanf("%d", &n);
for (x = 1; x <= n; x++)
{
sum *= x;
}
printf("%d 的阶乘是:%d\n", n, sum);
return 0;
}
do while循环:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int x = 1;
int n;
int sum = 1;
scanf("%d", &n);
do
{
sum *= x;
x++;
} while (x <= n);
printf("%d 的阶乘是:%d\n", n, sum);
return 0;
}
2,计算 1! + 2! + 3! +……+ 10!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int x = 0;
int y = 1;
int sum = 0;
for (x = 1; x <= 10; x++)
{
y *= x; //算出每个数的阶乘
sum += y;
}
printf("%d\n", sum);
return 0;
}
3,在一个有序数组中查找具体的某个数字n。编写 int binsearch(int x, int v[], int n);功能:在v[0]<=v[1]<=v[2]<=……<=v[n-1]的数组中查找x。
解析:折半查找(二分查找),效率高。找出这组元组最中间元素的下标:((最左下标+最右下标)/ 2)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 7; //要查找的数字
//在arr这个有序的数组中查找k(7)的值
//首选确定最左下标和最右下标
int sz = sizeof(arr) / sizeof(arr[0]); //数组的元素个数
int left = 0;
int right = sz - 1;
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);
break;
}
}
if (left > right)
{
printf("找不到了\n");
}
return 0;
}
4,编写代码,演示多个字符从两端移动,向中间汇聚。
解析:Sleep(1000):1000毫秒 = 1秒,睡眠1秒。
需要引用头文件 #include<windows.h>,Sleep() 的 S 要大写
system("cls"):清空屏幕,代码会打一行清除(覆盖)一行。
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main(void)
{
char arr1[] = "Welcome to hangzhou!!!";
char arr2[] = "######################";
int left = 0; //左下标
int right = strlen(arr1) - 1; //右下标,需要 #include<string.h>
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //1000毫秒 = 1秒,睡眠1秒。需要 #include<windows.h>
//Sleep() 的 S 要大写
system("cls"); //清空屏幕,代码会打一行清除(覆盖)一行。
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
5,编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
解析:两个字符串比较,不能使用 ==,应该使用专门的“字符串比较函数”:
strcmp(string1, string2):比较的是对应字符的ASCII码值
返回值 == 0 时,string1 = string2
返回值 < 0 时,string1 < string2
返回值 > 0 时,string1 > string2
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main(void)
{
//假设正确的密码是字符串“123456”
char password[30];
int i = 0;
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password); //数组名本身就是地址,不需要加取地址符号&
//if (password == "123456") //错的,两个字符串比较不能用==
//要用字符串比较函数strcmp(),返回0,说明两个字符串相等
if (strcmp(password, "123456") == 0) //需要头文件 #include<string.h>
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误,请重新输入\n");
}
}
if (i == 3)
printf("三次密码均输入错误,退出程序\n");
return 0;
}