C语言学习笔记(二)分支语句和循环语句

arongsec / 2023-07-16 / 原文

分支语句和循环语句

分支语句(选择结构)

  • if语句
  • switch语句

if语句

==:判断

=:赋值

-------------------------------------------------1---------------------------------------------------------
if (条件)
{
	语句;
   	......
}
-------------------------------------------------2---------------------------------------------------------
if (条件)
{
	语句1;
    .....
}
else
{ 
	语句2;                            //注意if和else后面没有冒号
	......
}
-------------------------------------------------3---------------------------------------------------------
//多分支
if(条件1)
{
    语句1;
}
else if(条件2)
{
    语句2;
}    
else
{
    语句3;
}
------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int age=20;
    if (age<18)
    {
        printf("未成年\n");
    	printf("nonono\n");
    }                           //包含多条语句时要使用大括号
    else if(age>=18 && age<28)  //此处不能写为18<=age<28
        printf("青年\n");
    else
        print("123");
    return 0;
}
---------------------------------------------悬空else问题----------------------------------------------------
#include <stdio.h>
int main()
{
    int a=1;
    int b=2;
    if (a<0)
    	if(b<0)
    		printf("nonono\n");                            
    else   
        printf("yes\n");
    return 0;
}                       //此时什么都不输出,因为else会和最近的未匹配的if匹配

#include <stdio.h>
int main()
{
    int a=1;
    int b=2;
    if (a<0)
    {	if(b<0)
    		printf("nonono\n");
    }                           
    else   
        printf("yes\n");
    return 0;
}                       //此时输出yes

书写形式对比

if(条件)
{
	return x;
}
return y;
//满足条件返回x,不满足返回y
if(条件)
{
	return x;
}
else
{
	return y;
}

输出1-100的奇数

#include <stdio.h>
int main()
{
    int i = 0;
    for(i=0;i<100;i++)
        if(1==i%2)
            printf("%d ",i);
    return 0;
}
------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int i = 0;
    while(i<100)
    {    if(1==i%2)
         {   
            printf("%d ",i);
         }
    	i++;  //注意此处i++要在if判断外
    }
    return 0;
}

switch语句

switch语句常用于多分支的情况

switch(整型表达式)  //类型必须是整型
{
    case 整型常量表达式:   //可以是表达式,但运算结果必须是 整型常量
	语句项;
	//break;

//整型表达式是几,就从case 几 进入
	语句项;
	......
}  


------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch(day)
    {
        case 1:               //注意case和数字之间要有空格
            printf("星期1\n");
            break;            //注意要有break;   用于跳出switch语句。不然会继续执行后面的代码
        case 2:
            printf("星期2\n");
            break;
        case 3:
            printf("星期3\n");
            break;
        case 4:
            printf("星期4\n");
            break;
        case 5:
            printf("星期5\n");
            break;
        case 6:
            printf("星期6\n");
            break;
        case 7:
            printf("星期天\n");
            break;
    }
    return 0;
}
------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d",&day);
    switch(day)
    {
        case 1:                                   
        case 2:     
        case 3:
        case 4:
        case 5:
            printf("工作日\n");         //输入1-5,都会输出”工作日“
            break;
        case 6:
        case 7:
            printf("休息日\n");
            break;
        default:                      //处理无法匹配的数字
            //printf("输入错误!");     //case和default的前后顺序没有严格要求
            break;                    //每个switch语句只能出现一个default子句
    }
    return 0;
}

循环语句

  • while语句
  • do-while语句
  • for语句

while循环

while(条件)    //注意此处没有冒号
{
	循环语句;  //循环执行,直到条件为假
    ......;
}

在屏幕上打印1-10

#include <stdio.h>
int main()
{
	int i=1;
	while(i<11)
	{
		printf("%d\n",i);
        i++;
	}
	return 0;
}

break:一旦执行,终止此次循环,跳出循环

    while(i<11)
	{   
        if(i==6)
            break; //此处跳出整个while循环
		printf("%d\n",i);
        i++;
	}

continue:一旦执行,终止此次循环,并返回循环开头,继续执行

int i=0;
    	while(i<11)
	{   
        if(i==6)
            continue; //跳过本次循环,跳回while循环开头,然后继续执行-->此处陷入死循环
		printf("%d\n",i);
        i++;
	}

getchar()、putchar()

getchar()定义:用于接收键盘输入的字符。

int ch=getchar();

putchar()定义:输出字符。

putchar(ch);

举例

#include <stdio.h>
int main()
{
	int ch = 0;                //注意getchar要放在while的判断条件处,来实现循环输入;不能放在while循环前
	while((ch=getchar())!=EOF) //EOF(end of file,值为-1):即ctrl+z  
	{
		putchar(ch);
	}
    return 0;
}

使用putchar()之前需要清空缓存区

while((ch=getchar()) != '\n')//循环检查缓冲区,知道读走缓冲区的最后一个字符'\n'
{
    ;//不用进行任何操作,只需函数去读取缓冲区内容即可
}

注意:scanf()函数只会读取空格前面的内容,遇到空格就终止读取。

for循环

for(表达式;表达式;表达式)//表达式1为初始化部分;表达式2为条件判断部分;表达式3是调整部分
{
		循环语句;
		......
}
//while循环的缺陷:三个部分分布较分散

在屏幕上打印1-10

#include <stdio.h>
int main()
{
    int i=1;//创建变量
    for(i=1;i<11;i++)//定义、判断、调整
    {
        printf("%d ",i);
    }
    return 0;
}

break和continue:与while循环大致相同,但是for里面的continue拥有调整机会,while里面的continue可能会跳过调整语句。

注意:

1.不可在for循环体内改变循环变量。

2.建议采取左闭右开的区间写法

do...while循环

至少循环一次

do
{
    循环语句;
    ......
}
while(表达式);//这里的表达式只写条件判断语句

在屏幕上打印1-10

 #include <stdio.h>
int main()
{
	int i = 1;
	do                       //do后面接多条语句的时候要加大括号
    {
		printf("%d ",i);
        i++;
    }
	while(i<11);
	return 0;
}

break和continue:与while循环相同,且continue后没有调整机会,可能陷入死循环

练习题

1.计算n的阶乘

#include <stdio.h>
int main()
{
    int n = 0;
    int s = 1;
    int i = 0;
    int jc = 0;
    scanf("%d",&n);
    for(i=n;i>0;i--)
    {
        s=s*i;
        
    }
    printf("%d阶乘为:%d",n,s);
    return 0;
}

2.计算1!+2!+...+n!

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    int s = 1;
    int n = 0;
    int sum = 0;

    printf("请输入一个整数:");
    scanf("%d", &n);

    for (i = n; i > 0; i--)
    {
        s = 1;  // 重置 s 为 1
        for (j = i; j > 0; j--)
        {
            s = s * j;  // 计算阶乘
        }
        sum = sum + s;  // 累加阶乘的和
    }
    printf("阶乘的和为:%d\n", sum);
    return 0;
}

改进版:

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    int s = 1;
    int n = 0;
    int sum=0;
    scanf("%d",&n);
    for(i=1;i<n+1;i++)            
    {   
        s=s*i;   //利用前一个已经计算好的阶乘结果
        sum=sum+s;
    }
    printf("阶乘的和为:%d",sum);
    return 0;
}

3.二分查找

二分法

计算复杂度:
$$
log_2N
$$

#include <stdio.h>
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);//数组的元素个数
    int left = 0;//区间最左边的角标
    int right = sz-1;//区间最右边的角标
    int k = 7;//要查找的数字是7

    while(left<=right)               //注意执行循环的条件,此条件代表区间里有数可以找
    {
        int mid = (left+right)/2;
        if(arr[mid]>k)
        {
            right = mid-1;
        }
        else if(arr[mid]<k)
            {
                left = mid+1;
            }
        else if(arr[mid]==k)
            {
                printf("find!number=:%d",mid);
                break;//跳出循环
            }
    }
    if(left>right)
    {
     
        printf("can not find!");
    }
     return 0;
}