循环与分支

表达式

都需要用到表达式:表达式部分可以是关系表达式,逻辑表达式,以及数值表达式,输入表达式时需要注意逻辑死否清晰,是否表达式的内容与自己想象中的判断一致。

分支(选择)

if语句

形式1.:(没有else部分)

if (expression)
{
    
    
 	statement;   
}

形式2.:(有else子句部分)

if (expression)
{
    
    
    statement;
}
else
{
    
    
statement;    
}

形式3.:(在else部分嵌套了多个if语句)

if(expression)
{
    
    
    statement;
}
else if(expression)
{
    
    
	statement;    
}
else if (expression)
{
    
    
    statement;
}
else
{
    
    
    statement;
}

比如下面这个代码:(将= 与== 输出错误)

int main()
{
    
    
    int a = 10;
    if (a = 5)//写成5 == a可以避免很多错误情况     
    {
    
    
        printf("hehe\n");
    }//仍然会打印hehe,因为把等于符号打成了赋值符号。
    return 0;
}

例子

1.判断一个数是否为奇数:
#include<stdio.h>
int main()
{
    
    
    int a = 0;
    scanf("%d",&a);//
    
    if(a % 2 != 0)
        printf("%d是奇数",a);
    else
        printf("%d是偶数",a);
    return 0;
}
2.输出1-100之间的奇数
#include<stdio.h>
int main()
{
    
    
    int a = 1;
    for (a = 1;a<=100;a++)
    {
    
    
    	if (a % 2 != 0)
        	printf("%d",a);
    }
    return 0;
}

switch语句:

例子1.

#include<stdio.h>
int main()
{
    
    
     int day = 0;
    scanf("%d",&day);
    switch (day)//必须是整形
    {
    
    
        case 1://case后面必须是整形常量表达式
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日");
            break;
        case 6:
        case 7:
            printf("周末\n");
                break;
        default:
            printf("输入错误\n");
    }
    return 0;
}

例子2: 输入年月得出该月多少天

 //#include<stdio.h>
int main()
{
    
    
	int month = 0;
	int year = 0;
	int day = 0;

	printf("请输入年:");
	scanf("%d", &year);
	printf("请输入月:");
	scanf("%d", &month);

	switch (month)
	{
    
    
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			day = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			day = 30;
			break;
		case 2:
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				day = 29;
			else
				day = 28;
			break;
		default:
//			day = -1;
			break;
	}
	if (-1 == day)
		printf("输入错误");

	printf("这个月有%d天",day);
	return 0;
}
例题
#include<stdio.h>
int main()
{
    
    
    int n = 1;
    int m = 2;
    switch(n)
    {
    
    
        case 1:m++;
        case 2:n++;
        case 3:
            switch(n)
            {
    
    
                case 1:n++;
                case 2:
                    m++;
                    n++;
                   break;
            }
        case 4:
            m++;
            break:
        default:
            break;
    }
    printf("m = %d,n = %d ",m,n);//m = 5、n = 3
    return 0;
}

循环:

while循环:

先介绍两个语句的作用:
1.break:终止后面所有循环
2.continue:结束后面所有循环,直接跳到判断部分

while(expression)
{
    
    
    statement;
}//表达式为真就执行循环

例子:打印1-10:

#include<stdio.h>
int main()
{
    
    
    int a = 1;
    while (a <= 10)
    {
    
    
        if (5 ==a)
        {
    
    
            //continue;//跳过后面的循环,直接开始判断:1234死循环
            //break;//终止循环:1234
        }
        printf("%d",a);
        a++;
    }
    return0;
}

while与getchar、putchar



#include<stdio.h>
int main()
{
    
    
	int ch = getchar();//'a'--97   用整形没有问题
	//printf("%c\n", ch);
	putchar(ch); //输出一个字符
		
	return 0;
}
/*getcahr  ———— 获取一个字符 ———— 一次只能操作一个字符

getchar读取失败的时候,返回EOF  ———— ( -1 )
putchar ———— 输出一个字符

标准输入————键盘; 标准输出————屏幕;*/
#include<stdio.h>
int main()
{
    
    
	int ch = 0;
	while ((ch = getchar()) != EOF)
    {
    
    //从缓冲区得到的是字符,就会执行循环
        //得到的不是字符,就会返回-1,循环终止
        putchar(ch);
    }
        return 0;
}

例子:输入密码

#include<stdio.h>
int main()
{
    
    
	char input[20] = {
    
    0};//1

	printf("请输入密码\n");//
	scanf("%c",input);//数组名本来就是地址,所以这里就不用&
    //问题一解决:
   /*
   getchar()//用来读取\n
   */
    //问题二解决:
    /*
    int tmp = 0;
	while ((ch = getchar()) != '\n')//可以用来清理缓冲区
	//用循环来读取字符,直到读到\n停止
    {
        ;//空语句
	}
	*/
	printf("请确认密码\n");//
	int ch = getchar();
	
	if (ch == '	Y')
		printf("成功\n");
	else
		printf("失败\n");
    
	return 0;
}


情况一:输入abcdef然后回车

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUjCicQJ-1635573432073)(D:\typora\相册\密码001.png)]

程序解释:原因:输入的是abcde回车,键盘里面得到的是abcde\n

当scanf读取了abcde时,缓冲区剩下\n,然后执行后面的代码,轮到执行getchar时,getchar发现缓冲区有\n,所以getchar读取了\n,但是\n不等于‘Y’,所以会报失败

改正方法;在scanf函数后面加上一句getchar语句用来读取\n
解决方法见上面————问题一解决

情况二

如果输入密码是:abcde hehe\n (中间有空格)该怎么办?
已经知道:scanf 读取字符串时遇到空格就结束
后面还有:hehe\n
getchar 每次只能读一个字符,所以不适合用上面的方法,但是可以通过加入一个循环去将一系列不需要的字符读取掉
解决方法件上面————问题二解决

for函数

优点:集初始化,循环判断,调整部分于一体

//格式
for (ex1;ex2;ex3)
{
    
    
    statement;
}

for循环执行流程很重要:
第一步:ex1————整个循环过程中只会执行一次
第二步:ex2
第三步:statement
第四步:ex3————第三部分是在循环执行完后再开始的

注意
1.尽量不在for循环内部改变循环变量=-----可能会改变循环–造成死循环
2.建议左闭右开:可以提高可读性

for(a = 0; a < 10; a++)//循环十次
{
    
    
    
}
//上下效果一样,但是建议使用上面的方法
//可读性更高
for(a = 0; a<= 9; a++)
{
    
    
    
}
for循环的其他格式

不建议省略表达式:可能会导致出错


int main()
{
    
    
	int a = 0;
	int b = 0;
	for (a = 0; a < 3; a++)
	{
    
    
		for (b= 0; b < 3; b++)
			printf("haha\n");
	}
}//九个hehe

int main()
{
    
    
	int a = 0;
	int b = 0;
	for (; a < 3; a++)
	{
    
    
		for (; b < 3; b++)
			printf("haha\n");
	}
}//三个heh
加上逗号表达式
for(a = 1,b = 1;a < 10; a++, b++)//使用逗号可以给a、b都赋值
    

但是使用逗号表达式时也要有注意的地方:特定时候需要在意顺序

for(a +=b ,b = 1;a < 10; a++, b++)//这里a +=b先进行,再进行b的赋值
for(a = 1;b = 0; b++)//这个循环不会执行
    //表达式:b = 0;表达式结果为0;则判断部分也为0-----假

do while

特点:至少要执行一次

表达式:

do
{
    
    
;可以是空语句
}

while;
//打印1-10
#include<stdio.h>
int main()
{
    
    
	int a = 1;
	do
	{
    
    
		printf("%d	", a);
		a++;
		
	} while (a <= 10);//这里这个分号不能漏掉
	return 0;
}

下面是一些关于循环的例题

1.求n的阶乘:

#include<stdio.h>
int main()
{
    
    

	int a = 1;
	int n = 0;
	int num = 1;//不能从0开始
	scanf("%d", &n);

	for (a = 1; a <=n; a++)//这里要<=
	{
    
    
		num = num * a;
	}
	printf("%d", num);
	return 0;
}

2.求1!+2!=3!……n!;

方法一:

#include<stdio.h>
int main()
{
    
    
	int a = 1;
	int b = 1;
	int n = 0;
	scanf("%d", &n);
	int sum = 0;
	int num = 1;
	for (a = 1;a<=n;a++)
	{
    
    
		num = 1;//重新循环时,需要将num重新赋值,否则上一次的计算结果会影响下一次运算
		for (b = 1; b <= a; b++)
		{
    
    
			num = num * b;
		
		}
		sum +=num;
	}
	printf("%d", sum);return 0;
}

方法二:


#include<stdio.h>
int main()
{
    
    
	int a = 1;
	int b = 1;
	int n = 0;
	scanf("%d",&n);
	int num = 1;
	int sum = 0;
	for (a = 1; a <= n; a++)
	{
    
    
		num *= a;
		sum += num;
	}
	printf("%d", sum);
	return 0;
}

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

#include<stdio.h>
int main()
{
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
    
    
		if (i == k)
			printf("找到了,下标时%d\n", i);
		
	}
	if (10 == i)
		printf("找不到\n");

	return 0;
}//效率很低

方法二:



#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[1]);
				//40/4=10
	int right = sz-1;
	int left = 0;
	while (left <= right)
	{
    
    
		int mid = (right + left) / 2;
		if (arr[mid] < k)
			left = mid + 1;
		else if (arr[mid > k])
			right = mid - 1;
		else
		{
    
    
			printf("找到了,下标是:%d", mid);
			break;
		}
	}
	if(right<left)
		printf("找不到")
	return 0;
}

4.多个字符从两端移动,向中间聚集

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
    
    

	char arr1[] = {
    
    "hello world"};//2
	char arr2[] = {
    
    "###########"};
	int left = 0;
	int right = strlen(arr1) - 1;//sizeof要减2
	while (left <= right)
	{
    
    
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//单位是毫秒,需要Windows.h的头文件
		system("cls");//清空屏幕
		left++;
		right--;
	}

	return 0;
}

上面的练习中注意代码的逻辑性,在输入时也要注意不要粗心

总结一下我练习的时候容易犯的错误:

1.在for循环和if分支的后面“自然地”加上分号,导致结果出错

2.用字符串初始化数组时没有加双引号:错误写法:char arr[ ] = { hahaha }

3.在创建字符数组时要用int去创建,报错时才反应过来

4.= 和 == 有时候会输错,陷入死循环时才找到错误
端移动,向中间聚集

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
    
    

	char arr1[] = {
    
    "hello world"};//2
	char arr2[] = {
    
    "###########"};
	int left = 0;
	int right = strlen(arr1) - 1;//sizeof要减2
	while (left <= right)
	{
    
    
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//单位是毫秒,需要Windows.h的头文件
		system("cls");//清空屏幕
		left++;
		right--;
	}

	return 0;
}

上面的练习中注意代码的逻辑性,在输入时也要注意不要粗心

总结一下我练习的时候容易犯的错误:

1.在for循环和if分支的后面“自然地”加上分号,导致结果出错

2.用字符串初始化数组时没有加双引号:错误写法:char arr[ ] = { hahaha }

3.在创建字符数组时要用int去创建,报错时才反应过来

4.= 和 == 有时候会输错,陷入死循环时才找到错误

猜你喜欢

转载自blog.csdn.net/cainiaochufa2021/article/details/121050182