分支语句与循环语句

c语言是结构化的程序语言 

顺序结构,选择结构,循环结构

什么是语句?

c语言里面包括五种语句

1表达语句

2函数调用语句

3控制语句(分支语句与循环语句)有九种

(1)条件判断语句 (分支语句)if        switch

(2)循环执行语句  do while         while        for

(3)转向语句 break         goto        continue        return

4复合语句

5空语句

分支语句

if

#include <stdio.h>
int main()
{
	if (3 == 3)//结果为真就执行
	{
		printf("hehe\n");
	}
	return 0;
}
if  else
#include <stdio.h>
int main()
{
	int age = 17;
	if (age >=18)
	{
		printf("成年\n");
	}
	else//不满足上面if就执行下面else
	{
		printf("未成年\n");
	}
	return 0;
}
if elseif else
#include <stdio.h>
int main()
{
	int age = 17;
	if (age >=18)
	{
		printf("成年\n");
	}
	else if(age>=30)
	{
		printf("长大\n");
	}
    else
    {
        printf("未成年\n");
    }
	return 0;
}

注意else跟最近的if匹配

#include <stdio.h>
int main()
{
	int age = 17;
	if (age ==18)
        if(age==17)
		printf("成年\n");
	
	else
		printf("未成年\n");//该结果是什么都没有因为最下面else跟第二个if匹配
	
	return 0;
}

小练习

//打印1——100的奇数
#include <stdio.h>
int main()
{
	int num1;
	for (num1 = 0; num1 < 100; num1++)
	{  
		if (num1 % 2 == 1)
			printf("%d\n", num1);
	}
	return 0;
}

风格推荐可以看一下《高质量c++指南》

switch

#include <stdio.h>




int main()
{
	int num;
	scanf("%d",&num);while(getchar() != '\n');
	
	switch(num)
	{
		case 1:
		{
			printf("1 \n");
		}break;//没有break就是在满足的case之后全部执行
		case 2:
		{
			printf("2 \n");
		}break;
		case 3:
		{
			printf("3 \n");
		}break;
		case 4:
		{
			printf("4 \n");
		}break;
		case 5:
		{
			printf("5 \n");
		}break;
	}
	
	
	
	return 0;
}
 
default

可以当选择超出case时的额外结果,有点像else

#include <stdio.h>




int main()
{
	int num;
	scanf("%d",&num);while(getchar() != '\n');
	
	switch(num)
	{
		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;
		default 
		printf("输入错误");
		break;
	}
	
	
	
	return 0;
}
 

循环语句

1.while

while()//判断条件非零为真
{
continue//跳过continue后面的语句回到下一次的判断
break;//永久结束循环
}//循环体
int main()
{
	int num = 1;
	// while语句 一般用来做死循环
	while(1)
	{
		printf("****************** 1.登录 ******************\n");
		printf("****************** 2.注册 ******************\n");
		printf("****************** 3.游戏 ******************\n");
		printf("****************** 4.退出 ******************\n");
		scanf("%d",&num);
		if(num == 1)
		{
			// 登录功能
			printf("登录功能\n");
			printf("按任意键继续\n");
			getchar();
			getchar();
			// ...
		}
		if(num == 2)
		{
			// 注册功能
			printf("注册功能\n");
			printf("按任意键继续\n");
			getchar();
			getchar();
			// ...
		}
		if(num == 3)
		{
			// 游戏功能
			printf("游戏功能\n");
			printf("按任意键继续\n");
			getchar();
			getchar();
			// ...
		}
		if(num == 4)
		{
			// break;	// 跳出循环
		}
	}
	
	
	return 0;
}
 
while中有关getchar
int ch = getchar();//getchar获取一个字符,把字符转换成ASCII值存在ch里面
//为什么不用char类型,根据getchar使用手册当getchar获取正确的字符返回正确的字符,当遇到文件末尾或者错误时放回
//EOF:end of file 他的值是-1所以int更好因为char放不下-1;
putchar(ch);//等价于printf("%c",ch);
int ch = 0;
	while ((ch = getchar()) != EOF)//为什么会换行当我输入一个字符时也会按下回车,字符与回车都被读到缓冲区里面getchar去读取,
		//putchar再打印就会出现换行现象。
		putchar(ch);
#include<stdio.h>
int main()
{
	
	
	char password[20] = { 0 };
	printf("请输入密码");
	scanf("%s", password);

	int ret = getchar();//当我们输入密码后getchar把回车读取存放到ret中
	if ('Y' == ret)
		printf("yes\n");
	else
		printf("NO\n");//所以直接执行下一步打印出NO
	
	return 0;
}

解决办法

#include<stdio.h>
int main()
{
	
	
	char password[20] = { 0 };
	printf("请输入密码");
	scanf("%s", password);
    getchar();//将回车读取走,但是会有其他问题。

	int ret = getchar();
	if ('Y' == ret)
		printf("yes\n");
	else
		printf("NO\n");
	
	return 0;
}

c语言中在读取键盘数据时,一般是带缓存的数据输入,需要按回车键才能完成该“行”数据的输入确认。

而 scanf()函数对这个回车确认符并不进行处理,回车符会留在输入缓存区中。

因此,在下一个读“字符”操作函数(getchar, scanf("%c"), gets()等)运行时,会读到这个字符。

而在读数值型数据或字符串时,scanf()会从第一个非空白字符(空白字符指:回车,空格,TAB键)开始读取,自动忽略前面的空白字符,而遇到空白字符结束该类型数据的输入。

#include<stdio.h>
int main()
{
	
	
	char password[20] = { 0 };
	printf("请输入密码");
	scanf("%s", password);
    //getchar();
    while ((ch =getchar()) !='\n');
	int ret = getchar();
	if ('Y' == ret)
		printf("yes\n");
	else
		printf("NO\n");
	
	return 0;
}

只打印数字

#include<stdio.h>
int main()
{
	char ch = '\0';//'\0'是字符类型的0
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch>'9')
			continue;
		putchar(ch);
	}
	return 0;
}

小练习将数字73,32,99,97,110,32,100,111,32,105,116,33转化为ascii值

#include<stdio.h>
int main()
{
	int arr[] = { 73,32,99,97,110,32,100,111,32,105,116,33 };
	int i = 0;
	int size = sizeof(arr) / sizeof(arr[0]);
	while (i < size)
	{
		printf("%c", arr[i]);
		i++;
	}
	
	return 0;
}

2.do while

do
	{
	循环体
    }//先循环后判断
		while(表达式)

3.for

for (表达式1;表达式2;表达式3;)//初始化,条件判断,调整比while更集中容易去修改
	{
		循环体
	}//执行顺序是表达式1,表达式2,循环体,表达式3

注意事项

1没有条件初始化,导致嵌套时的问题
#include <stdio.h>
int main()
{
	int i =0, j =0;
	for(;i<3;i++)
	{
		for (; j < 3; j++)
		{
			printf("hehe\n");
		}
	
	}
	return 0;
}
2在for中进行类型初始化
for(int i =0;i<8;i++)//c99支持有的不支持
3小练习,判断该循环进行多少次
#include <stdio.h>
int main()
{
	int i =0, j =0;
	for (i = 0, j = 0; j = 0; i++, j++)
		j++;
	return 0;
}

0次表达式2是对j赋值,0为假,条件结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值