分支和循环
分支语句
if语句
//如果if后面想跟多条语句,使用代码块
if (age > 18)
{
printf("可以");
printf("不行");
}
else和它最近的if匹配
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else//else和if(b==2)匹配,而不是和if(a==1)匹配
printf("haha\n");
return 0;
}
所以什么都不打印
建议加{}
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
switch语句
switch(整型表达式)//整型表达式,float等类型不行
{
case 整形常量表达式:
语句;
}
int day;
scanf("%d", &day);
//switch (day)//根据day做选择
//{
case决定分支入口,break决定出口
//case 1:
// printf("星期一\n");
// break;
//case 2:
// printf("星期二\n");
// break;
//case 3:
// printf("星期三\n");
// break;
//case 4:
// printf("星期四\n");
// break;
//}
// 1-5工作日 67休息日
switch (day)
{
//多种情况实现同一结果
//不是说每个case后面都要跟break
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default://不跟case匹配就default
printf("输入有误,请输入1-7数字");
break;
}
while语句
break是永久中止循环
int i = 1;
while (i<=10)
{
if (i == 5)
break;
printf("%d", i);
i++;
}
打印1.2.3.4
continue的作用:跳过本次循环continue后面的代码,直接到while循环的判断部分
int i = 1;
while (i<=10)
{
if (i == 5)
continue;
printf("%d", i);
i++;
}
会陷入死循环
getchar和putchar的区别 |
//EOF-end of file -文件结束标志
//getchar读取失败会返回EOF
//1.返回的字符,本质是字符也是ASCII码值,是整数
//2.getchar函数不仅仅返回正常字符,还会返回EOF — -1,所以放在整形变量中
while ((ch = getchar()) != EOF)//输入ctrl+z就停止
{
putchar(ch);
}
思考:为什么下面代码输入密码后还没确认就直接打印失败?
int ch = 0;
char PassWord[20];
printf("请输入密码:");
scanf("%s", PassWord);
printf("请确认: ");
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
scanf去调用输入缓冲区 在我们输入换行时,输入缓冲区里还有\n,getchar再调用输入缓冲区时,里面还有\n
我们想要代码正确可以清理 \nscanf("%s", PassWord); //清理\n getchar();//拿走一个字符 printf("请确认: ");
但是输入空格的话还是会失败
因为scanf读到空格就不读了,输入缓冲区还有剩下的话getchar就会读到
最好的方法
int ch = 0;
char PassWord[20];
printf("请输入密码:");
scanf("%s", PassWord);
while ((ch = getchar()) != '\n')//不等于\n就继续读取,
{
;
}
printf("请确认: ");
continue在for循环和while循环中的区别 |
int i = 0;
int j = 0;
//初始化和调整部分可以省略
//2.判断部分只要省略,就意味着判断恒为真
//尽量不要省略
for (; i < 10; i++)//省略的后果:只打印十个呵呵
{
for (; j < 10; j++)
{
printf("hehe\n");
}
}
do…while()循环
do
循环语句
while();
int main()
{
int i = 1;
do//do - 执行{}里的语句
{
if (i == 5)
continue;
printf("%d ", i);//continue后面的语句不执行,但还得再判断
i++;
} while (i <= 10);//判断
}
练习
计算1-n的阶乘和:n!+(n-1)!+…+2!+1!
方法一:
int n;
scanf("%d", &n);
int count = 0;
for (int i = 1; i <= n; i++)
{
int ret = 1;
for (int j = 1; j <=i; j++)
{
ret = ret * j;
}
count += ret;
}
printf("%d",count);
方法二:
int n;
scanf("%d", &n);
int i = 0, ret = 1, sum = 0;
//4!=4*3!
//3!=3*2!
//2!=2*1!
//1!=1
for (i = 1; i <= n; i++)
{
ret = ret * i;
sum = ret + sum;
}
printf("%d", sum);
二分查找 |
简单的方法:遍历一边看数字是否在数组中
int arr[] = { 1,2,3,4,5,6,7 };
int n = 0;
int i = 0;
scanf("%d", &n);
int m = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < m; i++)
{
if (n == arr[i])
{
printf("找到了,下标为:%d\n", i);
break;//找到就跳出循环
}
}
//i<m:找到了的情况
//i=m:找不到的情况
//所以要判断,如果找到了就不打印找不到
if (i == m)
{
printf("找不到");
}
二分查找法:
int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
int k =14;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0, right = sz-1;//下标
while (left <= right)//left==right -- 指向同一个元素
{
int mid = (left + right) / 2;
if (arr[mid] == k)
{
printf("找到了,下标为:%d\n", mid);
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if (left > right)
{
printf("找不到");
}
编写代码,演示多个字符从两端移动,向中间汇聚。
int main()
{
char arr1[] = "hello world!!!!";
char arr2[] = "###############";
int sz = strlen(arr1);
int left = 0;
int right = sz - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);
left++;
right--;
}
return 0;
}
比较两个字符串是否相等,不能用==
int main()
{
int i = 0;
char password[20] = { 0 };
scanf("%s", password);
//两个字符串比较不能用==
if (strcmp(password,"abcdef")==0)//比较字符串是否相等用strcmp,返回值为0就说明两个字符串相等
{
printf("登录成功");
}
else
{
printf("登录失败");
}
return 0;
}
猜数字游戏
在简单的循环基础上,用到了时间戳和随机数函数rand
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("***** 1.play ******\n");
printf("***** 0.exit ******\n");
}
void game()
{
int guess;
int ret = rand()%100+1;//模100,范围0-99
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input;
//设置随机数的生成起点
srand((unsigned int)time(NULL));//拿时间戳作参数(不需要多次调用)
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误,请重新输入");
break;
}
} while (input);
return 0;
}