C语言是一门结构化的程序设计语句:
1.顺序结构
2.选择结构
3.循环结构
1.if(选择结构):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int age = 10;
if (age < 18)
printf("未成年\n");
else if (age > 18 && age < 28)
//&&-逻辑与(并且), &&左右两边条件同时成立时为真
printf("青年\n");
else if (age > 28 && age < 50)
printf("壮年\n");
else if (age > 50 && age < 90)
printf("老年\n");
else
printf("长寿\n");
return 0;
}
上述代码块时if的一种多分支结构,
注意在表示范围时要注意不可如下图代码块所撰(错误示范):
if(18<age<28);
这里if的条件判断顺序是先判断 "18<age" 是否成立,
若不成立再判断 "age>28" 是否成立,
判断的条件就不再是闭区间 (18, 28) 了
2.else的悬空:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 1)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
此时打印结果为空白,
因为 else 与离它最近的未匹配的 if 进行匹配。
由于 if(a == 1) 条件不成立,所以就不会再继续执行下面的 if...else... 语句,
也就不会打印“hehe” / “haha” 了。
如果想要 else 与 if(a == 1) 匹配,则可以写成如下形式:
int main()
{
int a = 0;
int b = 0;
if (a == 1)
{
if (b == 1)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
此时的打印结果就为 haha
3.练习:
打印出1~100的奇数
法一:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i%2 == 1)
printf(" %d", i);
i++;
}
return 0;
}
法二:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
printf(" %d", i);
i += 2;
}
return 0;
}
输出结果均为:
3.switch分支语句:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
if (day == 1)
printf("星期一");
else if (day == 2)
printf("星期二");
else if (day == 3)
printf("星期三");
else if (day == 4)
printf("星期四");
else if (day == 5)
printf("星期五");
else if (day == 6)
printf("星期六");
else (day == 7);
printf("星期天");
return 0;
}
由上述代码块我们可以看到,当存在很多个分支条件时,像这样用 if 选择语句
写代码显得比较繁琐,那么这时候我们就可以尝试使用 switch 条件分支语句
来实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
像这样的话用 switch 相对来说就显得简洁一些,
注意 switch( ) 括号中的内容必须是整形! 即 switch(整形)
且case语句中必须是常量表达式,即 “case 常量”
缺省break的情况:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误\n");
break;
}
在 switch 语句中,如果表达的值与所有的 case 标签的值都不匹配则
执行 default 子句。 default 可以出现在 switch 语句列表的任何位置,
但一般都放在末尾。
熟悉 switch语句执行流程:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch(n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf(" n= %d\n m= %d\n", n, m);
return 0;
}
上述代码块的输出结果为 n=3 m=5
switch语句可以嵌套使用。
4.while循环语句:
while语句执行流程:
①打印数字1~10:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf(" %d", i);
i++;
}
return 0;
}
打印结果为:
②while 语句中加 break:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf(" %d", i);
i++;
}
return 0;
}
打印结果为:
即当 i == 5 时while循环终止
③while 语句中加 continue:
如图所示,当 i == 5 时,将一直重复如图的执行顺序,不会再往下打印
因此此时的打印结果为:
可见 continue 在while 循环中的作用是:
continue 是用于终止本次循环的,
也就是本次循环中 continue 后面的代码不会再执行,
而是直接跳转到 while 语句的判断部分。进入下一次循环的入口判断。
5.getchar() , putchar() :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = getchar();
printf("%d\n", a);
putchar(a);
return 0;
}
getchar()是最简单的一次读一个字符的函数,
每次调用时从文本流中读入下一个字符,并将其作为结果值返回。
6.EOF:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
while ((a = getchar()) != EOF)
//EOF - end of file 文件结束标志 - Ctrl+Z
{
putchar(a);
}
return 0;
}
如图所示,不管输出任意一个字符型字符,程序都不会停下来。
当输入 Ctrl+Z 时,程序才会停下。
代表的是文件的结束标志,类似于字符 \0
EOF的值为 -1
实际应用:
顺便解释一下scanf()函数吞回车/n的问题:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
char password[20] = { 0 };
printf("请输入密码:>");//输入密码,并存放在password数组中
scanf("%s", password);
printf("请确认密码Y/N");
a = getchar();
if (a == 'Y')
printf("确认成功");
else
printf("确认失败");
return 0;
}
这里假设我们输入密码:123456
当执行程序输入密码敲回车后,
会出现用户还未输入 Y/N 就自动打印“确认失败”的问题:
原因也很简单:
首先这里需要注意的一些重点:
- scanf()在读取数字时会跳过空格、制表符和换行符!
- scanf("%s",s);这里不能有&符号
scanf遇到 回车(enter),空格,TAB 就会结束一次输入,空格不会接收
并且
scanf在一次输入结束后,不会舍弃最后的回车符(即回车符会残留在数据缓冲区中)
当我们输入密码123456并敲下回车键后,此时输入缓冲区中存储的字符为
123456\n,scanf() 函数只把字符串123456读取走了,剩下\n,
然后接着 getchar() 把\n读取走了,导致最后还未等用户输入Y/N就直接打印了确认失败。
那应该如何解决这个问题呢,只需要我们把剩下的\n读取走或者清空缓冲区就可以了。
我们可以在scanf("%s", password);
下面再加上一行代码,比如:
getchar();
或者像这样:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a,b;
char password[20] = { 0 };
printf("请输入密码:>");//输入密码,并存放在password数组中
scanf("%s", password);
while ((b = getchar()) != '\n')
{
;
}
printf("请确认密码Y/N");
a = getchar();
if (a == 'Y')
printf("确认成功");
else
printf("确认失败");
return 0;
}
此时程序就能正常运行了:
如果理解有差错,还请斧正,谢谢!
标签:语句,case,int,else,break,循环,printf,day,分支 From: https://blog.51cto.com/u_16247982/7420171