C语言是一门程序化的结构设计语言
1.顺序结构 2.选择结构 3.循环结构
分支语句和循环语句
1.分支语句
2.循环语句
3.goto语句
什么是语句?
C语言中有一个分号;隔开的就是一条语句。比如:
printf("hehe");
;
1+2;
分支语句(选择结构)
if语句
if语句的语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
if(表达式)
语句1;
else if(表达式2)
语句2;
else
语句3;
演示代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
int main() {
int age = 0;
scanf("%d",&age);
if (age < 18)
printf("少年\n");
else if (age >= 18 && age < 28)
printf("青年\n");
else if (age >= 28 && age < 50)
printf("壮年\n");
else
printf("老年");
return 0;
}
注:在循环语句中,如果表达式的结果为真,则语句执行。 在C语言中如何表示真假? 0表示假,非0表示真。
如果条件成立,要执行多条语句,应该使用代码块。
#include <stdio.h>
int main(){
if(表达式1){
语句列表1;
}
else{
语句列表2;
}
return 0;
}
这里的一对 { } 就是一个代码块。
悬空else
#include<stdio.h>
#include <string.h>
int main() {
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
注:else和离自己最近的if进行匹配。
练习: 1、判断一个数是否为奇数
#include<stdio.h>
#include <string.h>
int main() {
int num = 0;
printf("请输入一个数:");
scanf("%d",&num);
if (num % 2 == 0)
printf("输入的数是偶数");
else
printf("输入的数是奇数");
return 0;
}
2、输出1~100之间的奇数
#include<stdio.h>
#include <string.h>
int main() {
int i;
for (i = 1; i <= 100; i++) {
if (i % 2 == 1) {
printf("%d\n",i);
}
}
return 0;
}
switch语句
switch语句也是一种分支语句。常常用于多分支的情况。
switch(整形表达式)
{
语句项;
}
而语句项是什么呢?
case 整形常量表达式:
语句;
在switch语句中的break
在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。
例:
#include<stdio.h>
#include <string.h>
int main() {
int day = 0;
printf("请输入1-7之间的数字:");
scanf("%d",&day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("输入有误\n");
break;
}
return 0;
}
在switch语句中 case 后也可以是字符常量
例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <string.h>
int main() {
char letter = 0;
printf("请输入a-c之间的字母:");
scanf("%c",&letter);
switch (letter)
{
case 'a':
printf("a\n");
break;
case 'b':
printf("b\n");
break;
case 'c':
printf("c\n");
break;
default:
printf("输入有误\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的部分。
default子句
当switch表达式的值并不匹配所有case标签的值时,这个defailt子句后面的语句就会执行。 所以每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像贯穿一个case标签一样贯穿default子句。
循环语句
while 循环
while(表达式){
循环语句;
};
 例:在屏幕打印1-10的数字
#include<stdio.h>
int main() {
int i = 1;
while (i <= 10) {
printf("%d\n", i);
i++;
}
return 0;
}
while语句中的break和continue
break介绍:
#include<stdio.h>
int main() {
int i = 1;
while (i <= 10) {
if (i == 5) {
break;;
}
printf("%d\n", i);
i++;
}
return 0;
}

总结: break在while循环中的作用: 其实在循环中只要遇到break,就停止后期的所有循环,直接终止循环。 所以:while中的break是用来永久终止循环的。
continue介绍:
#include<stdio.h>
int main() {
int i = 0;
while (i <= 10) {
i++;
if (i == 5) {
continue;
}
printf("%d\n", i);
}
return 0;
}

总结: continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
getchar()的一个使用例子
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int ch = 0;
while ((ch = getchar()) != 'A') {
putchar(ch);
}
return 0;
}
重要
#include<stdio.h>
int main() {
int ch = 0;
int ret = 0;
char password[20] = { 0 };
printf("请输入密码");
scanf("%s",password);
printf("请确认(Y/N)");
ret = getchar();
if (ret == 'Y') {
printf("确认成功");
}
else {
printf("确认失败");
}
return 0;
}

这里为什么会直接报确认失败呢? 答:在scanf输入密码后,缓冲区还存在着 ‘\n’,getchar在读取缓冲区时,直接将’\n’读出,所以直接输出了确认失败。
改进之后:
#include<stdio.h>
int main() {
int ch = 0;
int ret = 0;
char password[20] = { 0 };
printf("请输入密码");
scanf("%s",password);
while ((ch = getchar()) != '\n') {
;
}
printf("请确认(Y/N)");
ret = getchar();
if (ret == 'Y') {
printf("确认成功");
}
else {
printf("确认失败");
}
return 0;
}
for循环
语法:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量。表达式2为条件判断部分,用于判断循环何时结束。表达式3位调整部分,用于循环条件的调整
例:使用for循环打印1-10的数字
#include<stdio.h>
int main() {
printf("打印1-10的数字");
for (int i = 0; i <= 10; i++) {
printf("%d\n",i);
}
return 0;
}
for循环流程图 
for语句的循环控制变量
一些建议: 1、不可在for循环体内修改循环变量,防止for循环失去控制。 2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
一道笔试题:
#include<stdio.h>
int main(){
int i = 0;
int k = 0;
for(i = 0,k = 0;k=0;i++,k++)
k++;
return 0;
}
答:循环0次, k=0赋值,条件为假,直接跳过。
do while循环
do语句的语法:
do
循环语句;
while(表达式);
使用do while循环打印1-10的数字
#include<stdio.h>
int main() {
int i = 1;
do {
printf("%d\n",i);
i++;
} while (i<=10);
return 0;
}
do语句执行流程 
do while语句的特点: 循环至少执行一次。
习题:
折半查找算法(二分查找算法)
#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 (right>=left) {
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);
printf("值为:%d",arr[mid]);
break;
}
}
if (right < left) {
printf("找不到");
}
return 0;
}

编写代码,演示多个字符从两端移动,向中间汇聚。
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>
int main() {
char arr1[] = "hello world!";
char arr2[] = "############";
int left = 0;
int right = strlen(arr1) - 1;
while (left<=right) {
arr2[left] = arr1[left];
arr2[right] = arr1[right];
Sleep(1000);
system("cls");
left++;
right--;
printf("%s\n",arr2);
}
return 0;
}
模拟登陆
编写代码实现,模拟用户登录情景,并且只能登录三次。 (只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>
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;
}
|