FOR循环
for循环语法:
for (/* 表达式1;表达式2;表达式3 */)
{
/* 代码(循环语句) */
}
表达式1为初始化部分,用于初始化循环变量
表达式2为条件判断部分,用于判断循环终止条件
表达式3为调整部分,用于循环条件的调整(与 a++; 相似)
例1:打印1~10的数字
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d\n", i);
}
return 0;
}
for循环将初始化、判断、调整放在一起,让代码更明了
break在for循环中的用法和作用与在while循环中相似
continue在if语句中用法:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++) //初始化 判断 调整
{
if (i==5)
{
continue;
}
printf("%d\n", i); //结果只是没有5,且不会发生死循环
}
return 0;
}
int main()
{
int i = 1; //初始化
while (i<=10) //判断
{
if (i==5)
{
continue;
}
printf("%d\n", i); //只打印1 2 3 4并陷入死循环
i++; //调整
}
return 0;
}
上面的for语句和while语句执行顺序为初始化->判断->if语句->调整
在for语句中,continue执行后只跳过了printf语句,再执行调整部分
在while语句中,continue执行后可能还会跳过调整部分,改良:
int main()
{
int i = 0;
while (i<=9)
{
i++;
if (i==5)
{
continue;
}
printf("%d\n", i);
}
return 0;
}
for语句的循环控制变量
建议:不可在for循环体内修改循环变量,防止for循环失去控制
建议for语句的循环控制变量的取值采取“前闭后开区间”的写法(不绝对),如:
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
/* 10次循环/打印,10个元素 */
for ( i = 0; i < 10; i++) /* <10就是开,<=就是闭 */
{
printf("%d ", arr[i]);
}
return 0;
}
for循环的一些变种:
变种1:
int main()
{
for (; ;) //for循环初始化、判断、调整都可省略
{ //for循环判断部分被省略时,判断条件就是:恒为真
printf("Oh\n");
}
return 0;
}
变种2:
int main()
{
int x, y;
for (x=0, y=0; x<2 && y<5; ++x, y++)
{
printf("Oh ");
}
return 0;
}
DO...WHILE循环
语法:
do
{
/* 代码(循环语句) */
} while (/* 判断语句 */); //此“;”必须输入
do...while至少循环一次,使用场景有限
例1:打印1~10
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i<=10);
return 0;
}
do...while语句中的break与continue:
int main()
{
int i = 1;
do
{
if (i==5)
{
break;
}
printf("%d ", i); //只打印1 2 3 4
i++;
} while (i<=10);
return 0;
}
int main()
{
int i = 1;
do
{
if (i==5)
{
continue;
}
printf("%d ", i); //只打印1 2 3 4并陷入死循环
i++;
} while (i<=10);
return 0;
}
break和continue在do...while语句中作用及用法与在while语句中相似
一些使用
计算n的阶乘:
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
int m = 1;
scanf("%d", &n);
for ( i = 1; i <= n ; i++)
{
m = i*m;
}
printf("%d", m);
return 0;
}
计算1!+2!+3!
int main()
{
int a = 1;
int b = 1;
int c = 1;
int sum = 0;
for (b=1; b<=3 ; b++)
{
for (a=b ; a==b ; a++)
{
c=c*a;
}
sum = sum + c;
}
printf("%d\n", sum);
return 0;
}
优化:
int main()
{
int b = 1;
int c = 1;
int sum = 0;
for (b=1; b<=3 ; b++)
{
c=c*b;
sum = sum + c;
}
printf("%d\n", sum);
return 0;
}
编辑一个密码程序,3次机会:
#include <stdio.h>
int main()
{
int password = 0;
int mistake = 0;
printf("Please enter a 4-digit password\n");
printf("You have a total of three chances\n");
for (mistake=2 ; mistake>=0 ; mistake--)
{
scanf("%d", &password);
if (password == 2048)
{
printf("You can access\n");
break;
}
else
{
printf("Try again,you have %d more chances\n", mistake);
}
}
if (mistake<0)
{
printf("Locked\n");
}
return 0;
}
数组版:
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char password[20] = {0};
for ( i = 0; i < 3; i++)
{
printf("Please enter password:>");
scanf("%s", password);
if (strcmp(password,"2048") == 0) //==不能直接用来比较两个字符串是否相等
{ //使用strcmp需要用头文件<string.h>
printf("You can access\n"); //两个字符串相等时=0
break; //第一个字符串更大时>0
} //第二个字符串更大时<0
else
{
printf("Password is wrong\n");
}
}
if (i == 3)
{
printf("Locked\n");
}
return 0;
}
在有序数组{1,2,3,4,5,6,7,8,9,10}中找到一个数:
逐步查找:
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int m = 0;
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
scanf("%d", &m);
for ( i = 0; i <= sz ; i++)
{
if (m == arr[i])
{
printf("Found,subscript is %d\n", i);
break;
}
}
if (i >= sz)
{
printf("Can't find\n");
}
return 0;
}
二分查找:
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 0;
int sz = sizeof(arr)/sizeof(arr[0]); //计算元素个数
int left = 0; //左下标
int right = sz-1; //右下标
int mid = 0;
scanf("%d", &k);
while (left <= right)
{
mid = (left+right)/2;
if (arr[mid] > k)
{
right = mid-1;
}
else if (arr[mid] < k)
{
left = mid+1;
}
else
{
printf("Found,subscript is %d\n", mid);
break;
}
}
if (left>right)
{
printf("Can't find\n");
}
return 0;
}
编写代码,演示多个字符从两边浮现,向中间汇聚,效果如下:
############
H##########!
He########d!
Hel######ld!
Hell####rld!
Hello##orld!
Hello,World!
代码:
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "Hello,World!"; //整型数组无需考虑\0问题,但字符或字符数组
char arr2[] = "############"; //要考虑\0是否会引起下标加1
int left = 0;
int right = strlen(arr1)-1; //strlen计算数组长度,计算结果不包含\0
while (left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //使用Sleep函数需要头文件<windows.h>,1000指一千毫秒
left++;
right--;
}
return 0;
}
优化执行结果的代码:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "Hello,World!"; //整型数组无需考虑\0问题,但字符或字符数组
char arr2[] = "############"; //要考虑\0是否会引起下标加1
int left = 0;
int right = strlen(arr1)-1; //strlen计算数组长度,计算结果不包含\0
while (left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //使用Sleep函数需要头文件<windows.h>
system("cls"); //cls是清空屏幕的意思,使用system需要头文件<stdlib.h>
left++;
right--;
}
return 0;
}