一:while循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
循环结构的三种:
1.while
2.do while
3.for
1.while
与if语句非常相似
int main() //语法结构
{
while (1)
printf("hehe\n");
return 0;
}
int main()
{
int i = 1;
while (i <= 10) //()里的是判断表达式,expr的意思,stmt是语句的意思
{
if (i == 5)
break; //在while循环中,break用于永久的终止循环。
//当i == 5时,i就break了,即跳出whlie循环。
continue; //在while循环中,continue的作用是跳过本次循环continue后面的代码直接去判断continue后面的代码,看是否进行下一次循环
//输出结果是1 2 3 4后死循环
printf("%d ", i);
i++;
}
return 0;
}
get char()的用法:
int main()
{
//EOF - end of file - 文件结束标志
int ch = getchar();
//printf("%c\n", ch);
putchar(ch); //输出一个字符
return 0;
}
// 缓冲区
int main() //getchar A\n 键盘
{
int ch = 0;
//Ctrl+z - getchar 读取结束
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
上面代码运用的例子:
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password); //数组本身就是个地址,不需要取地址。
printf("请输入密码(Y/N):>");
//清理缓冲区
//getchar(); //处理 '\n'
int tmp = 0;
while ((tmp = getchar()) != '\n') //处理字符串后面一直到 \n 的字符
{ //getchar不能取字符串后面的\n和空格,所以要去除,去除方式就左边代码
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
3打印数字字符的代码
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9') // || 是或者的意思
continue;
putchar(ch);
}
return 0;
}
int main() //while循环的3个部分离得太远不方便修改代码,所以就有for循环
{
int i = 1; //初始化
while (i <= 10) //判断部分
{
printf("%d", i);
i++; //调整部分
}
return 0;
}
二:for循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
/* if (i == 5)
break;*/
if (i == 5)
continue; //跳过printf..,重新调整,结果是1234 6789
printf("%d ", i);
}
return 0;
}
循环体内改变循环变量的例子
int main() //不可在for循环修改循环变量,防止for循环失去控制
{
int i = 0;
for (i = 1;i <= 10; i++);
{
printf("%d ", i);
int j = 0;
for (j = 0;j <= 10;i++)
{
printf("hehe\n");
}
}
return 0; //结果是死循环打印hehe
}
int mian()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0;i < 10;i++) //左闭右开的例子,推荐
{
printf("%d", arr[i]);
}
return 0;
}
int main()
{
//for循环的三个部分都可以省略,但不建议随便省略
//判断部分的省略 - 判断部分恒为真
for (;;)
{
printf("hehe\n");
}
return 0;
}
int main()
{
int i = 0;
int j = 0;
for (/* i = 0 */;i < 3;i++)
{
for (/* j = 0 */; j < 3;j++)
{
printf("hehe\n");
}
}
return 0; //打印结果为3个hehe
}
一道笔试题,求循环了几次:
int main()
{
int i = 0;
int j = 0;
for (i = 0, j = 0;j = 0;j++)
{
j++;
}
return 0; //循环0次,j = 0是赋值,不是等于
}
三:do while 循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
do
循环语句:
while(表达式);
do while语句例子: //do while的特点:循环至少要执行一次
int main()
{
int i = 0;
do
{
//if (i == 5) break的例子:
// break; 到i == 5跳出循环,不是跳出整个语句
//if (i == 5) continue的例子:
// continue; 到4之后死循环
printf("%d ", i);
i++;
} while (i <= 10); //注意要有;
return 0;
}
练习:
1.计算n的阶乘
int main()
{
int i = 0;
int n = 0;
int num = 1;
printf("n的值为:");
scanf("%d", &n);
for (i = 1;i <= n;i++)
{
num *= i;
}
printf("%d", num);
return 0;
}
2.计算 1!+2!+3!
int main() //效率低
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1;n <= 3; n++)
{
ret = 1; //第二个for循环出来ret的值要不变,所以要加个赋值
for (i = 1;i <= n;i++) //i的阶乘
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
int main() //效率高
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1;n <= 3; n++)
{
ret *= n; //阶乘
sum += ret; //阶乘的和
}
printf("%d\n", sum);
return 0;
}
3.二分查找
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
printf("要查找的数字是:");
scanf("%d", &k);
//再arr这个有序的数组中查找k的值
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;
}
//welcome to china!!!
//###################
//w#################!
//we###############!!
//wel#############!!
//..
//welcome to china!!!
int main()
{
char arr1[] = "welcome to china!!!";
char arr2[] = "###################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000); //睡眠1秒,单位是毫秒,引用头文件#include <windows.h> //新代码
system("cls"); //清空屏幕 //新代码
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
连续输入3次密码,如果错误退出程序
int main()
{
int i = 0;
//假设正确的密码是字符串"123456"
char password[20] = { 0 };
//abcdef 两个字符串的比较是对应的ASCLL码值的比较
//abccqqqqq 所以是第一个大于第二个
// strcmp('abc' , 'abc')两个字符串相等,则代码为0
for (i = 0;i < 3;i++)
{
printf("请输入密码:>");
scanf("%s", password); //数组本来就是地址,再次提醒
if (strcmp(password, "123456") == 0) //err - 两个字符串的比较,不能使用==,应该使用strcmp //新代码
{ //strcmp要引用头文件#include <string.h>
printf("登入成功\n"); //strlen 和 strcmp 都是用字符串,所以要用头文件#include <string.h>
break;
}
else
{
printf("密码错误,请重新输入:>\n");
}
}
if (i == 3)
printf("三次密码均错误,退出程序\n");
return 0;
}