scanf
函数用法
scanf()
函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
调用格式: scanf("<格式化字符串>",<地址表>)
;
格式字符 | 说明 |
| 读入一个浮点值(c99有效) |
| 读入一个字符 |
| 读入十进制整数 |
| 读入十进制,八进制,十六进制整数 |
| 读入八进制整数 |
| 读入十六进制整数 |
| 读入一个字符串 |
| 读入一个浮点数 |
| 读入一个指针 |
| 读入一个无符号十进制整数 |
| 至此已读入值的等价字符数 |
| 扫描字符集合 |
| 读%符号 |
附加格式说明字符表
修饰符 | 说明 |
| 输入"长"数据 |
| 输入"短"数据 |
| 指定输入数据所占宽度 |
| 空读一个数据 |
If
丶else
语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int age;
printf("请输入你的年龄 :");
scanf("$d", &age);
if (age>=18)
printf("可以色色!\n");
else
printf("不可以色色!\n");
return 0;
}
//result
//请输入你的年龄 :1
//不可以色色!
switch
丶case
语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main() {
int go = 5;
switch (go)
{
case 1:
printf("LOL!");
break;
case 2:
printf("王者荣耀!");
break;
case 3:
printf("刺激战场!");
break;
case 4:
printf("绝地求生!");
break;
case 5:
printf("使命召唤!");
default:
printf("sleep.zzz");
break;
}
return 0;
}
//result
//使命召唤!
C语言循环
while
循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
while(表达式)
{
语句块;
}
//先计算“表达式”的值,当值为非0时,执行“语句块”;
//执行完“语句块”,再次计算表达式的值,如果为非0,继续执行“语句块”一直循环到表达式结果为0则跳出循环。
int main()
{
int line = 0;
printf("加入复仇者\n");
while(line<=20000000)
{
printf("我要继续努力打怪兽:%d\n",line);
line++;
}
if(line>=20000000)
printf("超级英雄\n");
return 0;
}
//result
我要继续努力打怪兽:19999975
我要继续努力打怪兽:19999976
我要继续努力打怪兽:19999977
我要继续努力打怪兽:19999978
我要继续努力打怪兽:19999979
我要继续努力打怪兽:19999980
我要继续努力打怪兽:19999981
我要继续努力打怪兽:19999982
我要继续努力打怪兽:19999983
我要继续努力打怪兽:19999984
我要继续努力打怪兽:19999985
我要继续努力打怪兽:19999986
我要继续努力打怪兽:19999987
我要继续努力打怪兽:19999988
我要继续努力打怪兽:19999989
我要继续努力打怪兽:19999990
我要继续努力打怪兽:19999991
我要继续努力打怪兽:19999992
我要继续努力打怪兽:19999993
我要继续努力打怪兽:19999994
我要继续努力打怪兽:19999995
我要继续努力打怪兽:19999996
我要继续努力打怪兽:19999997
我要继续努力打怪兽:19999998
我要继续努力打怪兽:19999999
我要继续努力打怪兽:20000000
超级英雄
do
while
循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
do{
语句块;
}while(表达式);
//do while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;
//如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
int main()
{
int i = 1;
do{
printf("%d\n",i);
i++;
}while(i<=100);
return 0;
}
//reslut
1-100
for
循环可以取代 while
循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
for(表达式1;表达式2;表达式3)
{
语句块;
}
它的运行过程为:
1) 先执行“表达式1”,一般为初始条件(只在循环开始时运行一次),可以认为这是一个初始化语句。
2) 再执行“表达式2”,循环条件表达式,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”,大多数情况下是带有自增自减的表达式,使循环条件不成立。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。
int main()
{
int i, j, k, t, m, a, b, c = 0;
int x, y, z, n;
printf("请按下面格式输年-月-日\n");
printf("请输入现在年月日:\n");
scanf("%d-%d-%d", &i, &j, &k);
printf("请输入出生年月日:\n");
scanf("%d-%d-%d", &x, &y, &z);
n = i - x + 1;
printf("你的年龄是:%d\n", n);
switch (j)
{
case 1:m = k; break;
case 2:m = 31 + k; break;
case 3:m = 59 + k; break;
case 4:m = 90 + k; break;
case 5:m = 120 + k; break;
case 6:m = 151 + k; break;
case 7:m = 181 + k; break;
case 8:m = 212 + k; break;
case 9:m = 243 + k; break;
case 10:m = 273 + k; break;
case 11:m = 304 + k; break;
case 12:m = 334 + k; break;
}
switch (y)
{
case 1:a = z; break;
case 2:a = 31 + z; break;
case 3:a = 59 + z; break;
case 4:a = 90 + z; break;
case 5:a = 120 + z; break;
case 6:a = 151 + z; break;
case 7:a = 181 + z; break;
case 8:a = 212 + z; break;
case 9:a = 243 + z; break;
case 10:a = 273 + z; break;
case 11:a = 304 + z; break;
case 12:a = 334 + z; break;
}
for (b = x; b <= i; b++)
{
if (b % 400 == 0)//(b%4==0&&b%100!=0)
c = c + 1;
if (y < 2)
c = c - 1;
if (j < 2)
c = c + 1;
}
t = (i - x) * 365 + m - a + c; printf("出生到现在的天数:%d", t); return 0;
}
//relust
//请按下面格式输年-月-日
//请输入现在年月日:
//2022-12-16
//请输入出生年月日:
//2000-8-15
//你的年龄是:23
//出生到现在的天数:8154
for
中的三个表达式都是可以省略的
Ⅰ、如果在前面已经定义了初始条件,则可以在for中省略表达式①,但是这里可能会出现一个问题,条件不会被初始化,例如在函数主体里定义i=10
,而for需要的是i=0
,此时如果在for
中不进行初始化则i
会直接从10
运行导致bug。
Ⅱ、省略表达式2,省略这一步相当于啥呢?相当于解决不了问题就解决提出问题的人,自我感觉良好导致死循环
Ⅲ、省略表达式3,for就跟while一样了。
Ⅳ、全都省略,相当于while(1),表示无限循环。
跳出循环——中断
break
关键字用于 while
、for
循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
for(int i=0;i<100;i++)
{
if(i==10)
{
break;
}
printf("%d\n",i);
}
return 0;
}
//break的中断能力比较弱,只能打破一次中断,也就是说当多个循环嵌套时break只能中断最近的一个break,而且break只能写在循环里。
continue
语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue
语句只用在 while
、for
循环中,常与 if
条件语句一起使用,判断条件是否成立。当continue
在while
和for
中时,运行到continue
不会直接跳出循环,而是跳到判断条件处进行判断,条件满足时则继续循环。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char c = 0;
while(c != '\n')
{
//回车键结束循环
c = getchar();
if(c=='4' || c=='5')
{
//按下的是数字4 或 5
continue;//跳过当前循环,进入下次循环
}
putchar(c);
}
return 0;
}
break
与continue
的对比:break
直接中断这一层循环,循环语句不再有执行的机会;continue
则是只结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
循环嵌套
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
在C语言中,if-else、while、do-while、for 都可以相互嵌套。
所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,
或者 for 里面有 while,while 里面有 if-else等等等等。
//99惩罚表
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d * %d = %-4d", i, j, i * j);
}
printf("\n");
}
return 0;
}
//relust
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16
5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25
6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36
7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49
8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64
9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81