c语言鹏哥学习笔记(分支与循环)

本文介绍了C语言中的基本控制结构,包括分支语句(如if和switch)和循环结构(while,for,do...while),并提供了示例代码。还讲解了如何计算阶乘、使用二分法查找、字符串比较、生成随机数以及求最大公约数和判断闰年及素数的方法。
摘要由CSDN通过智能技术生成

目录

语句

分支与循环

结构化

分支语句(选择结构)

if语句语法结构

----if else只能管下面的一条语句(大括号最好带上)

----&&      错误写法         2<=10<>

----悬空else  else默认和距离最近的if匹配

if书法格式对比

----判断一个数是否是奇数

----输出1~100的奇数

switch语句

循环结构 循环语句

while循环

----getchar() putchar()

----getchar()运用  拿走\n

--------清理缓冲区中的字符

--------只打印数字

for循环

----省略初始化

----两个循环变量

do while语句

练习题

1.计算n的阶乘

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

----错误

3.在一个有序数组中查找某个数字n   二分法

4.打印逐渐显现的文字

----Sleep 函数    system("cls")清空屏幕

5.模拟用户登录  两个字符串比较strcmp

6.猜数字

 ----随机数  ----------------

----强制类型转换

三个整数从大到小输出*

两个数的最大公约数

----辗转相除法

打印1000到2000的闰年

打印素数100~200

----sqrt()计算根

goto语句

只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机

----可发行


语句

c语言 中用;隔开的就是一条语句

分支与循环

0是假 其他都是真

结构化

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

顺序结构

选择结构

循环结构

分支语句(选择结构)

if语句语法结构

单分支

if(表达式)   //表达式中非0就是真

     语句;

------------------------------------------------

if(表达式)

        语句;

else (表达式)

      语句;

多分支

if(表达式)

        语句;

else if(表达式)

     语句;

else (表达式)

      语句;

----if else只能管下面的一条语句(大括号最好带上)

int main()
{
	int age = 20;
	if (age > 18)
		printf("成年\n");
	else
		printf("未成年\n");
		printf("不能结婚\n");

	return 0;
}

 

----&&      错误写法         2<age<=10

先2<age是真 所以把2<age赋值为1

int main()
{
	int age=50;
	if (age < 10)
	{
		printf("童年");
	}
	else if (age >= 10 && age <= 5)//&&表示并   大于等于10并且 小于等于5
	{
		printf("青年");
	}
	else
	{
		printf("壮年");
	}
	return 0;
}

----悬空else  else默认和距离最近的if匹配

int main()
{
	int a = 0;
	int b = 1;
	if (a > 9)
		if (b > 2)
			printf("哈哈");
	else
		printf("呵呵");
	return 0;
}

结果是都不打印

if书法格式对比

一样的(return以后代码就停止了)推荐第二种写法

 if (5==num)这种书写风格好   (防止写成num=5 少一个=不会提示)

----判断一个数是否是奇数

int main()
{
	printf("请输入一个数-->");
	int a = 0;
	scanf("%d", &a);
	if (a % 2==0)
	{
		printf("是个偶数");
	}
	else
	{
		printf("是个奇数");
	}
	return 0;
}

scanf里除了%之外不要写别的

----输出1~100的奇数

int main()
{
	int a = 1;
	while (a <= 100)
	{
		if (a % 2 == 1)
		{
			printf("%d ", a);
			a++;
		}
		else
		{
			a++;
		}
	}
}

switch语句

适合多分支

语法

switch(整形表达式)

{

语句项

}

语句项  case 整形常量表达式(字符也可,对应Asall码值)

                       语句;

int main()
{
	int sel = 0;
	scanf("%d", &sel);

	switch (sel)
	{
	case 1:
		printf("星期1");
	case 2:
		printf("星期2");
	case 3:
		printf("星期3");
	case 4:
		printf("星期4");
		break;
	}
	return 0;
}

整形表达式结果是几就从几进,遇到break停止  没有break的话 def也执行

defalut:case后的都没有,则输出defalut的 (defalut无问题顺序)

switch可以嵌套使用

int main()//1~5工作日   6,7休息日
{
	int a = 0;
	scanf("%d", &a);

	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	}
	return 0;

}

循环结构 循环语句

while

for

do while

while循环

while(表达式)

     循环语句;

break跳出当前循环,continue跳出本次循环,进入下次循环

int main()
{
	int a = 0;
	while (a < 500)
	{
		if (a == 5) 
		{
			a++;
			continue;//跳出本次循环,进入下一次循环
		}
		else if (a == 100)
		{
			break;//跳出当前循环
		}
		printf("  %d", a);
		a++;
	}
	return 0;
}

----getchar() putchar()

从键盘输入一个字符 ,读取正确返回的是ASALL码值,读取错误返回EOF

EOF end of file文件结束标志 本质上是-1

int main()
{
	int a = getchar();//从键盘输入一个字符
	putchar(a);//输出一个字符
	return 0;
}

putchar()输出一个字符

int main()
{
	int a = 0;
	while ((a = getchar()) != EOF)
	{
		printf("%c", a);
	}
	return 0;
}

会自动换行,因为每次输入时都会回车,相当于字符/n

----getchar()运用  拿走\n

int main()
{
	char passwd[20] = { 0 };
	printf("请输入密码->");
	scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址

	printf("请确认密码->Y/N");
	int a = getchar();

	if (a == 'Y')
	{
		printf("确认成功");
	}
	else
	{
		printf("确认失败");
	}
	return 0;
}

scanf 数组名不用取地址  数组名本来就是首个元素的地址

不拿转义字符,不拿空格后的

从缓冲区拿数据

(键盘:快递员    缓冲区:驿站    输入函数:你)

再写一个getchar()拿走\n

int main()
{
	char passwd[20] = { 0 };
	printf("请输入密码->");
	scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址

	printf("请确认密码->Y/N");
	
	getchar();//再写一个
	int a = getchar();

	if (a == 'Y')
	{
		printf("确认成功");
	}
	else
	{
		printf("确认失败");
	}
	return 0;
}

 但是输入  123 456(有空格仍会失败)

--------清理缓冲区中的字符

清理缓冲区剩下来的字符

	int tmp = 0;
	while ((tmp = getchar()) != '\n')
	{
		;                            //用来清理缓冲区字符
	}

--------只打印数字

int main()
{
	int a = 0;
	while ((a = getchar()) != EOF)
	{
		if (a < '0' || a>'9')//看对应的ASCALL码值
		{
			continue;
		}
		putchar(a);
	}
	return 0;
}

for循环

       (初始化部分只执行一次)

        初始化      判断           调整

for(表达式1;表达式2;表达式3)

       循环语句;

int main()
{
	int a;
	for (a = 1; a <= 10; a++)
	{
		printf("%d", a);
	}
	return 0;
}

break 

continue(跳到调整部分

三个部分可以不写(最好写,判断部分省略恒为真)

建议

最好别在for循环修改循环变量

----省略初始化

int main()
{
	int a = 0;
	int b = 0;
	for (; a < 3; a++)
	{
		for (; b < 3; b++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}//最后打印了三次

 第一次循环b加到3,下一次循环b不重新初始化到0

----两个循环变量

int main()
{
	int a, b;
	for (a = 0, b = 0; b < 4; b++, a++)
	{
		printf("%d", b);
	}
	return 0;
}

这是赋值!

do while语句

先执行后判断,至少执行一次

do

    循环语句;

while(表达式)

int main()
{
	int a = 1;
	do
	{
		printf("%d", a);
		a++;
	} while (a <= 5);

	return 0;
}

continue跳到判断

练习题

1.计算n的阶乘

int main()
{
	int n;
	int j;
	int sum=1;

	printf("请输入n,计算n!->");
	scanf("%d", &n);

	for (j = 1; j <= n; j++)
	{
		sum = sum * j;
	}
	printf("%d", sum);

	return 0;
}

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

int main()
{
	int i;
	int n;
	int sum=1;
	int he=0;

	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sum = sum * i;
		he = he + sum;
	}
	printf("%d", he);
	return 0;
}

----错误

ret不能复原

时间复杂度高,效率低

3.在一个有序数组中查找某个数字n   二分法

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

	int k = 0;
	scanf("%d",&k);//要查找的数


	int left = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int right = sz - 1;
	int mid;//中间指针

	while (left<=right)
	{
		mid = (left + right) / 2;
		if (arr[mid]<k)
		{
			left = mid + 1;//要加1,因为k大于arr[mid],所以也排除掉他
		}
		else if (arr[mid]>k)
		{
			right = right - 1;//同上,不过要减去
		}
		else if (arr[mid] = k)
		{
			printf("找到了,索引是[%d]", mid);
			break;
		}
	}
	if (left>right)
	{
		printf("没有这个数");
	}
	return 0;
}

4.打印逐渐显现的文字

例如:

#####

w###!

we#t!

west!

int main()
{
	char arr[] = "helloworld";
	char arr2[] = "##########";

	int left = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int right = sz - 1;

	while (left <= right)
	{
		
		arr2[left] = arr[left];
		arr2[right] = arr[right];
		printf("%s\n", arr2);
		left++;
		right--;
	}
	return 0;
}

----Sleep 函数    system("cls")清空屏幕

#include <Windows.h>

Sleep(数字)休息几毫秒

S要大写

		Sleep(1000);
		system("cls");

5.模拟用户登录  两个字符串比较strcmp

 两个字符串比较不能使用等号(字符串名字就是首字母地址,比较这个没意义)

strcmp(字符串1,字符串2)返回值为0证明相等

要引入头文件

#include <string.h>
int main()
{
	char passwd[20] = { 0 };//密码
	int i = 0;
	for (i = 0; i <3; i++)
	{
		printf("请输入密码->");
		scanf("%s", passwd);//密码

		if (strcmp(passwd,"123456")==0)
		{
			printf("密码正确");
			break;
		}
		else
		{
			printf("输入错误\n");
		}
	}
	if (i==3)
	{
		printf("三次机会已经用光");
	}
	return 0;
}

6.猜数字

 ----随机数

#include <stdlib.h>

rand()返回一个随机数 0-32767      生成的随机数顺序固定

srand设置随机数  strand(中间输入输入数字后rand()生成固定的随机数)种子 中放一个随机值

时间戳随机 放时间戳(相较于计算机起始时间的差 秒数)

time(NULL)返回一个时间戳

           不想输入参数

#include <time.h>
#include <stdlib.h>
void num()
{
	srand((unsigned int)time(NULL));
	int com_guess = rand() % 100 + 1;//题目要求0到99的数字 %100取余 余数一定小于100 0~99 加一就是0~100
	printf("%d",com_guess);

	int you_guess = 0;

	while (1)
	{
		scanf("%d", &you_guess);
		if (you_guess > com_guess)
		{
			printf("猜大了");
		}
		else if (you_guess < com_guess)
		{
			printf("猜小了");
		}
		else if (you_guess == com_guess)
		{
			system("cls");
			printf("猜对了\n");
			break;
		}
	}
}

int main()
{
	int sel = 0;
	do
	{
	printf("* * * * * * * * * * * * * * * *\n");
	printf(" * * * * * 1.开始游戏 * * * * *\n");
	printf(" * * * * * 2.退出游戏 * * * * *\n");
	printf("* * * * * * * * * * * * * * * *\n");

	printf("是否开始游戏->");
	scanf("%d", &sel);
	
		switch (sel)
		{
		case 1:
			num();
			break;
		case 2:
			printf("退出");
			break;
		default:
			system("cls");
			printf("只能输入1或2,请重新输入\n");
			break;
		}

	} while (sel!=2);
	return 0;

}

----强制类型转换

(int) a

三个整数从大到小输出*

输入 5 6 3

输出 6 5 3

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b, &c);

	if (a<b)
	{
		int tmp = 0;
		tmp = a;
		a = b;
		b = tmp;
	}

	if (a < c)
	{
		int tmp1 = 0;
		tmp1 = a;
		a = c;
		c = tmp1;
	}

	if (b < c)
	{
		int tmp2 = 0;
		tmp2 = b;
		b = c;
		c = tmp2;
	}
	printf("%d %d %d", a, b, c);
	return 0;
}

注意这几个if是并列关系

两个数的最大公约数

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);

	int min = 0;
	if (a>b)
	{
		min = b;
	}
	else
	{
		min = a;
	}

	while (1)
	{
		if (a % min == 0 && b%min==0 )// ||是或  &&才是且
		{
			printf("最小公约数%d",min );
			break;
		}
		min--;
	}
	return 0;
}

----辗转相除法

24 18

24%18=6(取余)

18%6=0(直到余数为0,除数就是最大公因数)

int main()
{
	int m = 0;
	int n = 0;
	int t = 0;
	scanf("%d %d", &m, &n);

	while (m % n != 0)
	{
		t = m % n;
		m = n;
		n = t;
	}

	printf("最大公因数是%d", n);
	return 0;
}

打印1000到2000的闰年

能被4整除 不能被100整除

能被400整除                                           是闰年

int main()
{
	int year = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (year%4==0&&year%100!=0)
		{
			printf("%d是闰年\n", year);
		}
		if (year % 400 == 0)
		{
			printf("%d是闰年\n", year);
		}
	}
	return 0;
}

打印素数100~200

质数=素数  只能被1和其本身整除的数

int main()
{
	int a = 0;
	for (a = 100; a <= 200; a++)
	{
		int i = 0;
		for (i = 2; i < a; i++)
		{
			if (a % i == 0)
			{
				break;
			}
		}
		if (i == a)
		{
			printf("%d是素数\n", a);
		}
	}
	return 0;
}

----sqrt()计算根

#include <math.h>

如果 a=m*n

那么m和n之间一定有一个<=  a开根号

即:    在2~根号m之间,没有a的因数 就说明a没有2~a-1的因数

所以只用计算2~根号m之间的(优化代码)

#include <math.h>
int main()
{
	int a = 0;
	for (a = 100; a <= 200; a++)
	{
		int i = 0;
		int flag = 1;
		for (i = 2; i <= sqrt(a); i++)
		{
			if (a % i == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag==1)
		{
			printf("%d是素数\n", a);
		}
	}
	return 0;
}

goto语句

理论上没有goto语句也可以写出代码

相当于传送

int main()
{
aaa:
	printf("11111\n");
	printf("22222\n");

	goto aaa;//传送到aaa哪里

}

只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机

跳出多重循环方便 

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

dos(cmd)

shutdown -s -t 60 60秒后关机

shutdown -a     取消关机

#include <string.h>
#include <stdlib.h>

int main()
{
	char arr[20] = { 0 };
	printf("输入我是猪,否则电脑100秒关机->");
	system("shutdown -s -t 100");
flag:	scanf("%s", arr);

	if (strcmp("我是猪", arr) == 0)
	{
		system("shutdown -a");
	}
	else
	{
		printf("请重新输入->");
		goto flag;
	}
	return 0;
}

----可发行

debug改为release

 多了个release

 里面的是可发行版本(可发到别人的电脑上执行)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值