[C语言基础]2.分支循环

if_else_else if

int main()
{
	int age = 60;
	if (age < 18)
		printf("青年\n");
	else if (age >= 18 && age < 60)//&&且
		printf("中年\n");
	else if (age >= 60 && age < 100)
		printf("老年\n");
	else
		printf("长寿\n");
	return 0;
}

错误:18<=age<60。逻辑:18<=age为1,1<60。

玄空else:else和最近的if匹配

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else//else和最近的if匹配
			printf("haha\n");
	return 0;
}//结果:什么都没输出

更正:明确匹配{ }

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

判断一个数是不是奇数

int main()
{
	int num = 15;
	if (num % 2 == 1);
		printf("奇数");
	return 0;
}

输出1~100的所有奇数

int main()
{
	int i = 1;
	while (i < 100)
	{
		if (i % 2 == 1)
			printf("%d ", i);
		i++;
	}
	return 0;
}
int main()
{
	int i = 0;//C++,C99才支持
	for (i = 1; i < 100; i++)
	{
		if (i % 2 == 1)
			printf("%d ", i);
	}
	return 0;
}

switch case default

int main()
{
   int day = 0;
   scanf("%d", &day);
   switch (day)//switch(整形)
   {
   case 1://case决定入口
   	printf("一");
   	break;//break决定出口
   case 2://case 整形常量:
   	printf("二");
   	break;//不加break就会执行后续的case
   case 3:
   	printf("三");
   	break;
   default:
   	printf("warning");//输入其他值返回结果
   }
   return 0;
}

while(判断)

int main()
{
	int i = 1;//初始化
	while (i <= 10)//判断
	{
		if (5 == i)
			break;//while循环中,break永久终止循环
			//continue;//while中,continue跳过后续代码
			//直接去判断部分,是否进行下一次循环
			//1234_然后死循环
		printf("%d ", i);
		i++;//调整
	}
	return 0;
}

getchar();
putchar();

//getchar读取字符,读取错误返回EOF,即-1
//EOF - end of flie - 文件结束标志
int main()
{
	int ch = getchar();
	//printf("%c\n", ch);
	putchar(ch);//输出一个字符
	return 0;
}
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}//ctrl+z - getchar读取一个EOF,读取结束
	return 0;
}

输入密码: > 123
确认密码(Y / N) :> 失败

int main()
{
	int password[20] = { 0 };
	printf("输入密码:>");//输入123,缓冲区内是123\n
	scanf("%s", password);//password本身就是地址,不需要取地址
	printf("确认密码(Y/N):>");//scanf从缓冲区取走了123
	int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了\n
	if (ch == 'Y')
		printf("成功\n");
	else
		printf("失败\n");
	return 0;
}

更改:加入 getchar();//清理缓冲区,处理\n

int main()
{
	int password[20] = { 0 };
	printf("输入密码:>");//输入123,缓冲区内是123\n
	scanf("%s", password);//password本身就是地址,不需要取地址
	printf("确认密码(Y/N):>");//scanf从缓冲区取走了123
	//清理缓冲区
	getchar();//处理\n
	int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了\n
	if (ch == 'Y')
		printf("成功\n");
	else
		printf("失败\n");
	return 0;
}
//输入密码: > 123
//确认密码(Y / N) :> Y
//成功

输入密码:>123 abc
确认密码(Y/N):>失败

int main()
{
	int password[20] = { 0 };
	printf("输入密码:>");//输入123 abc,缓冲区内是123 abc\n
	scanf("%s", password);
	printf("确认密码(Y/N):>");//scanf从缓冲区取走了123,缓冲区还有 acb\n
	//清理缓冲区
	getchar();//处理 abc
	int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了
	if (ch == 'Y')
		printf("成功\n");
	else
		printf("失败\n");
	return 0;
}

更改:循环getchar(),清空缓冲区中多个字符

int main()
{
	int password[20] = { 0 };
	printf("输入密码:>");//输入123 abc,缓冲区内是123 abc\n
	scanf("%s", password);
	printf("确认密码(Y/N):>");//scanf从缓冲区取走了123,缓冲区还有 acb\n
	//清理缓冲区
	//getchar();//处理 abc
	//清除缓冲区多个字符
	int tmp = 0;
	while ((tmp = getchar()) != '\n')
	{
		;
	}
	int ch = getchar();//由于缓冲区还有值,不需要输入,getchar取走了
	if (ch == 'Y')
		printf("成功\n");
	else
		printf("失败\n");
	return 0;
}
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch > '9')//||or,'0'是指字符0和9
			continue;
		putchar(ch);
	}
	return 0;
}

for(初始化;判断;调整)


int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)//(初始化;判断;调整)
	{
		if (i == 3)
			continue;//跳过3
		if (i == 8)
			break;//到8停止
		printf("%d", i);
	}
	return 0;
}

建议:

  1. 不要在循环体内改变循环变量
  2. 采取左闭右开区间(i = 0; i < 10; i++)//循环10次
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)//判断部分k=0是赋值,0为假,不进行循环
		k++;
	return 0;
}

do 循环语句; while(判断);

int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

continue;
break;

int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			//break;//1 2 3 4
			continue;//1 2 3 4__死循环,会跳过后面的i++
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

practice

1.计算n的阶乘

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		ret *= i//ret = ret * i
	}
	printf("%d!= %d", n, ret);
	return 0;
}

2.计算1!+2!+3!+…+10!

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 3; n++)//1!+2!+3!=1+2+6=9,这个输出是15
	{
		//改进:计算之前重置ret
		ret = 1;
		for (i = 1; i <= n; i++)
		{
			ret *= i;//因为到这里ret没有重置
		}
		sum += ret;
	}	
	printf("%d", sum);
	return 0;
}

优化:3!=32!,n!=n(n-1)!

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	int sum = 0;
	for (n = 1; n <= 3; n++)
	{
		ret *= n;
		sum += ret;
	}
	printf("%d", sum);
	return 0;
}

3.在一个有序数组中査找具体的某个数字n。
编写int binsearch(intx,int v[],int n);
功能:在v[0]<=v[1]<=v[2]<= ….<=v[n-1]的数组中查找x
二分查找法:前后下标均值

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;
}

4.编写代码,演示多个字符(welcome to china!)从两端移动,向中间汇聚。__25-1-4

#include <stdio.h>
#include <string.h>//strlen()
#include <Windows.h>//sleep()
//welcome to china!
//#################
int main()
{
	char arr1[] = "welcome to china!";
	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);//睡眠1秒
		system("cls");//清空屏幕	
		left++;
		right--;
	}
	printf("%s", arr2);
	return 0;
}

5.编写代码实现,模拟用户登录情景,并且只能登录三次。
只允许输入三次密码,如果密码正确则提示登录成功。
如果三次均输入错误,则退出程序。

int main()
{
	char password[20] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);//数组名本身就是地址
		if ( )
		{
			printf("登录成功。\n");
			break;
		}
		else
		{
			printf("登录失败,重新输入密码:\n");
		}
	}
	if (i == 3)
		printf("三次输入错误,退出程序。\n");
	return 0;
}

6.写一个猜数字游戏
1.自动产生一个1-100之间的随机数
2.猜数字
a. 猜对了,就恭喜你,游戏结束
b. 你猜错了,会告诉猜大了,还是猜小了,继续猜,直到猜对
3.一直猜,猜对推出

#include <time.h>//time()
#include <stdlib.h>//rand();srand()
void menu()
{
	printf("****1.play****\n");
	printf("****0.exit****\n");
}
void game()//1、生成随机数;2、猜数字
{
	//rand()函数前需要使用srand()进行随机起点设置
	//rand()返回0--32767的数字
	int ret = rand()%100+1;//%100余数为0--99
	int guess = 0;
	while(1)
	{
		printf("猜数字\n");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("正确!\n");
			break;
		}
	}
}

7.求两个数的最大公约数

int main()
{
	int m = 0;
	int n = 0;
	int t = 0;
	scanf("%d %d", &m, &n);
	while (t = m % n)
		//m=18,n=24-->
		//t=18%24=18,m=n=24,n=t=18;
		//t=24%18=6,m=n=18,n=t=6;
		//t=18%6=0结束循环
	{
		m = n;
		n = t;
	}
	printf("%d", n);
	return 0;
}

8.打印1000–2000之间的闰年
闰年:被4整除&&不能被100整除。||能被400整除。

int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		if (y % 4 == 0 && y % 100 != 0)//1. 被4整除,不能被100整除。
			printf("%d ", y);
		if (y % 400 == 0)//2. 能被400整除。
			printf("%d ", y);
		if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))//简单优化
			//被4整除 && 不能被100整除 || 能被400整除。
			printf("%d ", y);
	}
	return 0;
}

9.打印100–200的素数
素数(质数):只能被自己和1整除

int main()
{
	int i = 0;
	int j = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j < i; j++)//i%j==0即i能被2--i-1的数字整除,则不是素数
		{
			if (i % j == 0)
				break;
		}
		if (i == j)//i=j即i能被自己整除,i是素数
			printf("%d ", i);
	}
	return 0;
}

优化:i=m*n;m,n一定小于 i 的开方sqrt(i)

#include <math.h>//sqrt()
int main()
{
	int i = 0;
	//int flag = 1;//错误代码:flag定义在循环外
	//在每次开始判断一个新的数 i 是否为素数时,都应该先将 flag 重置为 1(假设它是素数)
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;
		for (j = 2; j <= sqrt(i); j++)
		{
			//if (i % j == 0)//错误代码:break 语句的作用范围遵循代码块规则
			//	flag = 0;
			//	break;//break 语句实际只跳出了 if 语句块,而没有跳出内层的 for 循环,导致逻辑错误。
			if (i % j == 0)//i%j==0即i能被2--sqrt(i)的数字整除
			{
				flag = 0;//i不是素数
				break;
			}
		}
		if (flag == 1)//i是素数
			printf("%d ", i);
	}
	return 0;
}

goto

goto不能跨函数,只能在一个函数范围跳转

//一个goto的练习关机程序
#include <string.h>//strcmp()
#include <stdlib.h>//system()
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");//关机命令systme()-stdlib.h
again:
	printf("电脑一分钟后关机,\n输入“我是猪”取消关机。\n");
	scanf("%s", input);//s是字符串,c是字符
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangRuaRua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值