1.分支
1.1 if语句
int main()
{
int age = 0;
/*scanf("%d", &age);*/
if (age < 18)
{
printf("%少年\n");
}
else if (age >= 18 && age < 30)
{
printf("%青年\n");
}
else if (age >= 30 && age < 50)
{
printf("%中年\n");
}
else
{
printf("%老年\n");
}
return 0;
}
1.1.1 悬空else
1.2 switch
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//switch 只能接整型
{
//case 只能整型常量表达式
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期7\n");
break;
/*当 switch 表达式的值并不匹配所有 case 标签的值时,
这个 default 子句后面的语句就会执行。*/
default://default 也可以放在case判断前
printf("%输入错误\n");
break;
}
return 0;
}
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;//n为2
case 3:
switch (n)//switch允许嵌套使用
{
case 1://这里n为2,所以判断不成立
n++;
case 2:
m++;
n++;//n为3
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n=%d\n", m, n);
return 0;
}
2.循环
2.1 while
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;//满足条件时,本次循环中continue后面的代码不再执行,,然后回到while重新开始
printf("%d ", i);
i++;
}
return 0;
}
//1 2 3 4
i++;放到continue前,结果如下:
int main()
{
int i = 1;
while (i <= 10)
{
i++;//放到continue前
if (i == 5)
continue;//满足条件时,本次循环中continue后面的代码不再执行,,然后回到while重新开始
printf("%d ", i);
}
return 0;
}
//2 3 4 6 7 8 9 10 11
2.1.1 getchar机制
int main()
{
int ret = 0;//定义变量ret,接收getchar的返回值
int ch = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//定义变量ret,接收getchar的返回值
//scanf读取完还剩下一个“\n”
while ((ch = getchar()) != '\n')//如果输入123456 ABCD,则一个getchar不行,加一个循环,让getchar一直读取,直到读取为'\n'结束。
{
;//空语句,不需要做什么,只需要不断的判断。
}
printf("请确认(Y/N):>");//请确认,输入Y确认成功,N放弃确认。
ret = getchar();//读取上输入的确认字符,并由ret接收。
if (ret == 'Y')//判断输入的是Y还是N,Y输出确认成功,N输出放弃确认。
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
2.2for循环
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1;i <= 10;i++)
{
printf("%d\n", i);
}
return 0;
}
注:for(::) 判断部分如果被省略,判断条件就是恒为真;
int main()
{
int i = 0;
int j = 0;
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
printf("he\n");//结果打印100次
}
}
return 0;
}
而下面
int main()
{
int i = 0;
int j = 0;
for (;i<10;i++)
{
for (;j<10;j++)
{
printf("he\n");//只打印10次,当j循环了10次后,i循环重新开始后j还是10,没有重新变为0
}
}
return 0;
}
for循环变种
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x,y++)
//第一次x,y=0满足,直接打印,打印后x,y都加1,第二次x,y=1,再打印,然后退出循环
{
printf("he\n");
}
return 0;
}
2.3do...while()循环
int main()
{
int i = 1;
do
{
if (5 == i)
continue;
printf("%d\n", i);
i++;
} while (i < 10);
return 0;
}
2.4练习
2.4.1计算n的阶乘
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%ret = %d\n", ret);
return 0;
}
2.4.2计算1!+2!+3!+......+10!
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n=1; n<=3; n++)
{
/*ret = 1;*/ //这里声明ret=1,就不重新计算1*1*2
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
sum = sum + ret;
}
printf("sum = %d\n", sum);
return 0;
}
//n=1 i=1 ret=1*1 sum=0+1
//n=2 i=2 ret=1*1*2 sum=(0+1)+(1*2)
//n=3 i=2 ret=1*1*2*1*2*3 sum=(0+1)+(1*2)+(2*1*2*3)
2.4.3在一个有序数组中查找具体的某个数字n。(讲解二分查找)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0;i < sz;i++)
{
if (k == arr[i])
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == sz)
printf("找不到\n");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int 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)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
2.4.4编写代码,演示多个字符从两端移动,向中间汇聚。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
//123456 to 654321 达成这个效果
//################
//1##############1
//12############21
//123##########321
//......
//123456 to 654321
char arr1[] = "123456 to 654321";
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);
system("cls");//执行系统命令的函数 cls-清空屏幕
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
2.4.5编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
int main()
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
if (strcmp(password , "123456") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
printf("三次密码均错误,退出程序\n");
return 0;
}
2.5goto
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
agai:
printf("请注意,你的电脑即将关机,如果输入:12,就取消\n请输入:>");
scanf("%s", input);
if (strcmp(input, "12") == 0)
{
system("shutdown -a");
}
else
{
goto agai;
}
return 0;
}
也可以用while循环
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意,你的电脑即将关机,如果输入:12,就取消\n请输入:>");
scanf("%s", input);
if (strcmp(input, "12") == 0)
{
system("shutdown -a");
break;
}
}
return 0;
}