C语言——控制语句

news2024/11/24 15:52:16

目录

  • 1. 分支语句
    • 1.1 if语句
      • 1.1.1 基本结构
      • 1.1.2 分层结构
      • 1.1.3 嵌套结构
    • 1.2 switch case 语句
  • 2.循环语句
    • 2.1 for循环
      • 2.1.1 基本结构
      • 2.1.2 嵌套结构
      • 2.1.3 变形
    • 2.2 while循环
    • 2.3 do while循环
    • 2.4 死循环
    • 2.5 循环控制语句

控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。

1. 分支语句

1.1 if语句

1.1.1 基本结构

if(表达式)

{
​	语句块1}
else
{
	语句块2}

执行顺序:如果条件成立,则执行语句块1,如果调节不成立,则执行语句块2。

例子:

if(下雨)
{
	带伞;
}
else
{
	不带伞;
}
#include 
#define RAIN 1
int main(int argc, char const *argv[])
{
	if(RAIN)
		printf("with unbrella\n");
	else 
		printf("no unbrella\n");
	return 0;
}

练习:输入a和b两个整数,用if语句实现两数相减

#include 
int main()
{   
    int a=0,b=0;
    scanf("%d%d",&a,&b);
    if(a>b)
        printf("%d\n",a-b);
    else 
        printf("%d\n",b-a);
    
}

1.1.2 分层结构

if(表达式1)
{
	语句块1}
else if(表达式2)
{
	语句块2}
else
{
	语句块3}

执行顺序:如果满足if中的表达式则执行if后面的语句块1,如果不满足则进行else if后面表达式2的判断,如果满足表达式则会执行语句块2。如果前面条件都不满足则会执行else后面的语句块3。

例子:

#include 
int main()
{   
    int a=0,b=0;
    scanf("%d%d",&a,&b);
    if(a>b)
        printf("a>b");
    else if(a<b)
        printf("a);
    else 
        printf("a=b"); 
}

练习:从终端输入一个学生的成绩,判断学生成绩,打印成绩级别。

【90 - 100】 A

【80 - 89】 B

【70 - 79】 C

【60 - 69】 D

< 60 sorry you lost

#include 
int main()
{   
    int score =0;
    scanf("%d",&score);
    if(score>=90)
        printf("A\n");
    else if(score>=80)
        printf("B\n");
    else if(score>=70)
        printf("C\n");
    else if(score>=60)
        printf("D\n");
    else 
        printf("sorry,you lost!\n");
    return 0;
}

1.1.3 嵌套结构

if(表达式1)
{
	if(表达式2)
	{
		语句块1}
	else
	{
		语句块2}
}
else
{
	语句块3}

举例子:如果今天下雨,我就带伞,并且如果下小雨我就骑车,否则我就坐车,不下雨我就不带伞。

#include 
#define RAIN 0
#define LIANG 0
int main()
{   
   if(RAIN)
   {
        printf("with umbrella!\n");
        if(LIANG>50)
            printf("by car\n");
        else 
            printf("walk\n");
   }
   else
       printf("no umbrella!\n");
    return 0;
}

练习:输入一个数,如果大于0打印大于0并且再进行判断是否大于10,如果大于等于10打印大于等于10,小于10打印小于。否则如果小于0打印不想要这个数。

#include 
int main()
{
    int a;
    scanf("%d", &a);
    if (a > 0)
    {
        printf(">0\n");
        if (a >= 10)
            printf(">=10\n");
        else
            printf("<10\n");
    }
    else
    {
        printf("i don't want this number\n");
    }

    return 0;
}

总结:

  • (1)首先判断表达式是否成立,如果成立就执行语句块1,否则执行语句块2。

  • (2)if后面可以没有else,但是else前面必须有if。

  • (3)if和else后面如果只有一行语句可以省略花括号{}。

1.2 switch case 语句

基本结构:

swtich(变量或表达式)
{

	case 常量1: 语句块1;break;
	case 常量2: 语句块2;break;
	case 常量3: 语句块3;break;
	...
	case 常量n: 语句块n;break;
	default:语句块n+1;
}

执行顺序:

当变量或表达式的量与其中一个case语句中的常量相符时,就执行此case后面的语句,并依次向下执行后面所有case中的语句,除非遇到break语句就会跳出swtich语句为止。如果变量或者表达式都不相符,就会执行default后面的语句。

注意🚨:

  1. 表达式不能是浮点型或者字符串。

  2. ase后面的break可以省略,但是省略时会顺序执行,指导遇到break就会结束。

  3. 如果case的语句块和下面case中的语句块相同,则可以省略。形式如下:

    case 常量1:

    case 常量2:语句块1;break;

练习:从终端输入一个学生的成绩,判断学生成绩,打印成绩级别用switch写

【90 - 100】 A

【80 - 89】 B

【70 - 79】 C

【60 - 69】 D

< 60 sorry you lost

#include 
int main()
{
    int score;
    scanf("%d", &score);
    switch (score / 10)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("you lost\n");
        break;
    case 6:
        printf("D\n");
        break;
    case 7:
        printf("C\n");
        break;
    case 8:
        printf("B\n");
        break;
    case 9:
    case 10:
        printf("A\n");
        break;
    default:
        printf("error!\n");
        break;
    }
    return 0;
}

练习:从终端输入一个日期 scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天

(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)

方式1:

#include
int main(int argc, char const *argv[])
{
    int year,month,day,days=0,leap=0;
    scanf("%d %d %d",&year,&month,&day);
    if(year % 100==0)
	{
		if(year%400==0)
			leap=1;
		else 
			leap=0;
	}
	else 
	{
		if(year%4==0)
			leap=1;
		else 
			leap=0;
	}	
   // leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
    switch (month)
    {
    case 1:days = day;break;
    case 2:days = 31+day;break;
    case 3:days = 31+28+leap+day;break;
    case 4:days = 31+28+leap+31+day;break;
    case 5:days = 31+28+leap+31+30+day;break;
    case 6:days = 31+28+leap+31+30+31+day;break;
    case 7:days = 31+28+leap+31+30+31+30+day;break;
    case 8:days = 31+28+leap+31+30+31+30+31+day;break;
    case 9:days = 31+28+leap+31+30+31+30+31+31+day;break;
    case 10:days= 31+28+leap+31+30+31+30+31+31+30+day;break;
    case 11:days = 31+28+leap+31+30+31+30+31+31+30+31+day;break;
    case 12:days =31+28+leap+31+30+31+30+31+31+30+31+30+day;break;
    default:
        printf("month err\n");
        return -1;
    }
    printf("这是这一年的第%d天\n",days);
    return 0;
} 

方式2:

#include <stdio.h>

int main()
{
    int year, mon, day, sum;
    int sumMon=0;//前面 mon-1 个月的天数
    int flag = 0;//润年平年标志
    printf("请输入年月日(例如:2023 5 4):\n");
    scanf("%d %d %d",&year,&mon,&day);
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        flag = 1;
    else
        flag = 0;
    
    switch (mon)
    {
        case 12:sumMon += 30;    //若是12月xx日,加上11~1月天数
        case 11:sumMon += 31;    //若是11月xx日,加上10~1月天数
        case 10:sumMon += 30;    //若是10月xx日,加上9~1月天数
        case 9:sumMon += 31;     //若是9月xx日,加上8~1月天数
        case 8:sumMon += 31;     //若是8月xx日,加上7~1月天数
        case 7:sumMon += 30;     //若是7月xx日,加上6~1月天数
        case 6:sumMon += 31;     //若是6月xx日,加上5~1月天数
        case 5:sumMon += 30;     //若是5月xx日,加上4~1月天数
        case 4:sumMon += 31;     //若是4月xx日,加上3~1月天数
        case 3:sumMon += (flag==1?29:28);//若是3月xx日,加上2~1月天数
        case 2:sumMon += 31;     //若是2月xx日,加上1月天数
        case 1:sumMon += 0;break;     //若是1月xx日,加0
        default:printf("月份错误!\n");break;
    }

    sum = sumMon + day;
    printf("这是%d年的第%d天\n",year,sum);
    return 0;
}

2.循环语句

2.1 for循环

2.1.1 基本结构

格式:

for(表达式1;表达式2;表达式3)
{
	语句块;
}
  • 表达式2:判断条件

  • 表达式3:增值或减值语句

执行顺序:首先执行表达式1进行赋值,然后判断表达式2是否成立,如果成立就进入循环执行语句块,最后再执行表达式3增值或减值语句,然后再判断表达式2是否成立如果成立再进入循环,指导表达式2不成立的时候退出循环。

例子:循环打印1 2 3 4 5

 for(int i=1;i<=5;i++)
        printf("%d\n",i);

例子:求5!

#include
int main(int argc, char const *argv[])
{
    int sum =1;
    for(int i=1;i<=5;i++)
        sum *=i;    //sum=sum*i;
    printf("%d\n",sum);
    return 0;
}

2.1.2 嵌套结构

格式:

for(表达式1;表达式2;表达式3)
{
	for(表达式4;表达式5;表达式6)
	{
		语句块;
	}
}

练习:用for循环打印99乘法表

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12   4*4=16
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
#include<stdio.h>

int main(int argc, char const *argv[])
{
    int i=0,j=0;
    for(i = 1;i <= 9;i++){
        for(j = 1;j <= i;j++){
            printf("%d*%d=%d\t",j,i,j*i);
        }
        putchar(10);
    }
    return 0;
}

2.1.3 变形

(1)变形一:

表达式1for(;表达式2;表达式3)
{
	语句块;
}

(2)变形二:

表达式1;
for(;表达式2;)
{
	语句块;
	表达式3;
}

(3)变形三:

表达式1;

for(;;) //死循环
{
	if(表达式2)
	{
		语句块;
		表达式3;
	}
	else
	{
		break;
	}
}

练习:打印所有的水仙花数。(水仙花数:一个三位数,百位立方+十位立方+个位立方 = 原数)

#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[])
{
    int i;
    int ge, shi, bai;
    for (i = 100; i <= 999; i++)
    {
        ge = i % 10;
        shi = i / 10 % 10;
        bai = i / 100;
        // if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i)
        //     printf("%d ", i);
        if(pow(ge,3)+pow(shi,3)+pow(bai,3) == i)
            printf("%d ", i);
    }
    putchar(10);
    return 0;
}

练习:打印以下图案:

要求行数从终端输入。

输入:5

输出以下:

p92QDqU.png

#include
int main(int argc, char const *argv[])
{
    int n=0;
    scanf("%d",&n);
    for (int i = 1; i <=n; i++)
    {
        for (int j = 1; j <=i ; j++)
        {
            printf("*");
        }
        printf("\n"); 
    } 
    return 0;
}

练习:

要求行数从终端输入。

输入:5

输出以下:

p92QTde.png

行数i空格数=i-1星星数=5-i+1
10=1-15=5-1+1
21=2-14=5-2+1
32=3-13=5-3+1
43=4-12=5-4+1
54=5-11=5-5+1
#include <stdio.h>
int main(int argc, char const *argv[])
{
    int n = 0;
    scanf("%d", &n);
    /*1. 实现上半部分打印*/
    for (int i = 1; i <= n; i++)    //行数
    {
        for (int j = 1; j <= i; j++) //打印每行星星数
        {
            printf("*");
        }
        printf("\n");                //每行打印结束后换行
    }
    
    /*2. 实现下半部分打印*/
    for (int i = 1; i <= n; i++)            //行数
    {
        for (int k = 1; k < i; k++)         //实现打印每行空格数
            printf(" ");
        for (int j = 1; j <= n - i + 1; j++)//实现打印每行星星数
            printf("*");
        printf("\n");                        //每行打印结束后换行
    }
    return 0;
}

2.2 while循环

格式:

定义循环变量并赋值;
while(判断条件)
{
	语句块;
	增值或减值语句;
}

执行顺序:

首先定义循环变量并且赋值,然后判断条件是否满足,如果满足就进入循环执行语句块,以及执行增值或减值语句。然后再进行判断,如果满足再次进入循环,直到不满足之后退出循环。相当于for循环的变形。

例如: 求从1加到100

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int i=1,sum=0;
    while (i<=100)
    {
        sum+=i;
        i++;
    }
    printf("%d\n",sum);
    return 0;
}

2.3 do while循环

格式:

do
{	语句块;
	增值减值语句;
}while(判断条件);

执行顺序:先执行后判断

例如:实现1-10求和?

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int i=1,sum=0;
    do
    {
        sum+=i;
        i++;
    } while (i<=10);
    
    printf("%d\n",sum);
    return 0;
}

p92lFWn.png

左边do-while 右边while

两者区别:

  1. 执行顺序不同:do while是先执行后判断,while先判断后执行。
  2. 执行次数不同:do while至少会执行一次。

2.4 死循环

for(;;){}
while(1){}
while(1);

2.5 循环控制语句

break continue goto

  • (1)break:直接结束循环

  • (2)continue:结束本次循环,继续下一次循环

  • (3)goto:强制跳转到标签位置,可以应用于多重循环嵌套。

例如:

for(...)
{
    for(...)
    {
        for(...)
        {
            if(错误条件)
                goto error;
        }
    }
}
...
error:
    ...//处理情况

练习:打印100到200中能被三整除的数

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int n;
    for(n=100;n<=200;n++)
    {
        if(n%3 !=0 ) continue;
        printf("%d ",n);
    }
    return 0;
}

练习:从终端上循环输入一个字符并在终端上输出这个字符,当输入字符为‘q’时,程序结束。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    char ch;
    while(1)
    {
        scanf("%c",&ch);
        //getchar();
        if(ch=='\n')
            continue;
        if(ch == 'q')
            break;
        printf("%c\n",ch);
    }
    return 0;
}

使用场景:

使用在循环语句中,做为结束循环的应用。使用时需要有判断条件。

练习:循环输入一个5位数,判断它是不是回文数。当输入0时循环结束,是回文数循环也结束。

即12321是回文数,个位与万位相同,十位与千位相同。

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n;
    int g, s, b, q, w;
    while (1)
    {
        scanf("%d", &n);
        if (n == 0)
            break;
        g = n % 10;
        s = n / 10 % 10;
        b = n / 100 % 10;
        q = n / 1000 % 10;
        w = n / 10000;

        if ((g == w) && (s == q))
        {
            printf("YES!\n");
            break;
        }
        else
        {
            printf("NO!!\n");
            continue;
        }
    }

    return 0;
}

%c",&ch);
//getchar();
if(ch==‘\n’)
continue;
if(ch == ‘q’)
break;
printf(“%c\n”,ch);
}
return 0;
}


使用场景:

使用在循环语句中,做为结束循环的应用。使用时需要有判断条件。



练习:循环输入一个5位数,判断它是不是回文数。当输入0时循环结束,是回文数循环也结束。

即12321是回文数,个位与万位相同,十位与千位相同。

```c
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n;
    int g, s, b, q, w;
    while (1)
    {
        scanf("%d", &n);
        if (n == 0)
            break;
        g = n % 10;
        s = n / 10 % 10;
        b = n / 100 % 10;
        q = n / 1000 % 10;
        w = n / 10000;

        if ((g == w) && (s == q))
        {
            printf("YES!\n");
            break;
        }
        else
        {
            printf("NO!!\n");
            continue;
        }
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shiro框架漏洞分析与复现

Shiro简介 Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性&#xff0c;可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 1、Shiro反序列…

Linux下的线程(线程的同步与互斥)

目录 Linux下线程创建函数pthread_ create() 线程的等待函数pthread_ join() 线程终止 函数pthread exit() 函数pthread_cancel() 分离线程pthread_detach() 线程间的互斥 线程间同步 死锁 进程和线程 线程和进程是一对有意义的概念&#xff0c;主要区别和联系如下&am…

【Linux】常见指令以及权限理解

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C专栏&#xff1a;Linux修炼内功基地 家人们更新不易&#xff0c;你们的&#x1f44d;点赞&#x1f44d;和⭐关注⭐…

Vue 中动态引入图片为什么要是 require

在vue中动态的引入图片为什么要使用require&#xff1f; 因为动态添加src被当做静态资源处理了&#xff0c;没有进行编译&#xff0c;所以要加上require&#xff0c; 我倒着都能背出来...... emmm... 乍一看好像说的很有道理啊&#xff0c;但是仔细一看&#xff0c;这句话说…

《设计模式》之单例模式

文章目录 1、定义2、动机2、类结构3、单例的表现形式4、总结4、代码实现(C) 1、定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。 2、动机 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff…

可道云上传文件后报错: Call to undefined function shell_exec()

宝塔面板中直接一键部署的可道云&#xff0c;使用的是PHP8.0环境&#xff0c;上传文件或者点击我刚上传好的文件夹就会报错以下错误&#xff1a; 出错了! (warning!) Call to undefined function shell_exec() 系统错误 fileThumb/app.php[376] fileThumbPlugin->checkB…

UML时序图详解

上篇文章&#xff0c;介绍了UML状态图&#xff0c;并通过visio绘制一个全自动洗衣机的UML状态图实例进行讲解。 本篇&#xff0c;来继续介绍UML中的另一种图——时序图。 1 时序图简介 时序图(Sequence Diagram)&#xff0c;也叫顺序图&#xff0c;或序列图&#xff0c;是一…

基于SpringBoot的招聘信息管理系统设计与实现

前言 本次设计任务是要设计一个招聘信息管理系统&#xff0c;通过这个系统能够满足管理员&#xff0c;用户和企业的招聘信息管理功能。系统的主要功能包括首页、个人中心、用户管理、企业管理、工作类型管理、企业招聘管理、投简信息管理、面试邀请管理、求职信息管理、社区留…

银行数字化转型导师坚鹏:银行数字化转型的5大发展趋势

银行数字化转型的发展趋势主要包括以下5个方面&#xff1a; 从过去的局部数字化转型向全面数字化转型转变&#xff1a;2022年1月&#xff0c;中国银保监会发布《关于银行业保险业数字化转型的指导意见》&#xff0c;标志着中国银行业的数字化转型已经不是过去银行自己主导的局…

简单理解正向代理和反向代理

上一篇文章说到反向代理是用来做负载均衡的&#xff0c;同时我就想到了那么正向代理是不是也可以说一说&#xff0c;可能还是有很多人是弄不清他俩的区别是什么的吧&#xff1f; 那么本次文章就用借钱的例子来阐述一下什么是正向代理&#xff0c;什么是反向代理 正向代理 正…

Android系统的问题分析笔记(4) - Android设备硬件基础

问题 典型的Android手机/平板硬件架构是怎么样的&#xff1f; 1 典型Android手机/平板硬件架构图 2 基带处理器 (Baseband Processor) 市场上大多数的手机采用了相互独立的处理单元来分别处理用户界面软件和射频功能。即&#xff1a;应用处理器 (Application Processor&#…

5年积淀,Mapmost打造连接无限的数字孪生平台

数字孪生是充分利用物理模型、传感器更新、运行历史等数据&#xff0c;集成多学科、多物理量、多尺度、多概率的仿真过程&#xff0c;在虚拟空间中完成映射&#xff0c;从而反映相对应的实体装备的全生命周期过程。在“数字中国”、“实景中国”战略指导下&#xff0c;数字孪生…

【Redis】IO多路复用机制

IO多路复用的概念 IO多路复用其实一听感觉很高大上&#xff0c;但是如果细细的拆分以下&#xff0c; IO&#xff1a;网络IO&#xff0c;操作系统层面指数据在内核态和用户态之间的读写操作。 多路&#xff1a;多个客户端连接(连接就是套接字描述符&#xff0c;即Socket) 复用&…

什么是零知识证明?

零知识证明&#xff08;Zero Knowledge Proof&#xff0c;以下简称ZKP&#xff09;是一种加密学中的重要技术&#xff0c;它可以让一个人向另一个人证明某个事情是真的&#xff0c;而不需要透露这个事情的具体内容&#xff0c;即不需要泄露任何信息。ZKP 技术可以在不牺牲隐私的…

难见的oracle 9i恢复---2023年----惜分飞

时过境迁,以前恢复大量oracle 8/9版本的库,现在一套oracle 9i的库都比较稀奇了.今天恢复客户一套9.2.0.6的aix环境rac库,通过分析确认主要问题: 1. 重建控制文件&#xff0c;resetlogs库遗漏数据文件 2. 数据库启动主要报错ORA-600 2663和ORA-600 kclchkblk_4 Tue Nov 8 09:…

Python dshelper:动动鼠标,搞定数据探索!

本次分享一个Python数据探索小工具dshelper&#xff0c;适合快速查看数据基本特征、数据可视化等使用场景。 无需代码&#xff0c;自动完成数据集描述统计&#xff1b; 无需代码&#xff0c;界面点鼠标绘制多种统计图&#xff1a; 支持命令行、jupyter notebook、docker三种…

RK3588平台开发系列讲解(进程篇)Linux 进程的数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux 进程的数据结构二、创建 task_struct 结构三、Linux 进程地址空间四、Linux 进程文件表沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍 Linux 如何表示进程。 一、Linux 进程的数据结构…

Java测试:OJ练习(字符串合并后返回按照先后顺序排列的不重复新字符串、合并数组并按升序排列、Arrays 类中的sort方法)

1、给定一个长度为n的字符 串&#xff0c;字符串中只包含大小写字母。 请你返回该字符串拥有那些字符。 并将它们按照出现的先后&#xff01;顺序拼接成一个新的字符串。 这是我最开始写的&#xff0c;代码有点问题&#xff1a; public String setString(String str) {char[]…

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…