首页 > 其他分享 >c语言分支和循环(上)

c语言分支和循环(上)

时间:2024-10-16 15:49:39浏览次数:3  
标签:case num 语言 int 循环 printf return main 分支

1.if语句

if语句后面不加分号,默认情况下if和else语句后面只能跟一条语句,如果要使用多条语句,可以用{}将想要多条表达的式子放进去

#include<stdio.h>
int main()
{
    int num = 0;
    //输入
    scanf("%d", &num);//一定别忘了取地址
    //判断和输出
    if (num % 2 == 1)//如果num 除以二余一,那么num 就是奇数
        printf("%d 是奇数\n", num);
    else
        printf("%d是偶数\n", num);

    return 0;
}



#include <stdio.h>
int main()
{
    int num = 0;
    if (num == 0);//因为if语句里面的括号中的值是0,是假的,所以在此停止运行
    printf("%d\n", num);
    return 0;

}


int main()
{
    int age = 0;
    scanf("%d", &age);
    if (age > 18)
    {
        printf("成年\n");
        printf("可以谈恋爱\n");
    }
    else
    {
        printf("未成年\n");
        printf("禁止谈恋爱\n");
    }
    return 0;
  默认情况下if和else语句后面只能跟一条语句,如果要使用多条语句,可以用{}将想要多条表达的式子放进去
在if else语句中,else可以与另一个if语句连用,构成多重判断
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数
int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num == 0)
        printf("输入的值是0");
    else
    {
        if (num > 0)
            printf("输入的值是正数\n");
        else
            printf("输入的数是负数\n");

    }

    return 0;

  //适用于三种情况
  或者使用else if
    int main()
{
    int num = 0;
    scanf("%d", &num);
    if (num == 0)
        printf("输入的值是0");
    else if (num > 0)
            printf("输入的值是正数\n");
        else
            printf("输入的数是负数\n");
    return 0;

}





int main()
{
    int num = 0;
    scanf_s("%d", &num);
    if (num >= 0)
    {
        if (num == 0)
            printf("输入的值是0\n");
        else
            printf("输入的值是正数\n");
    }
    else
    {
        printf("输入的值是负数\n");  //里可以不加括号
    }


    return 0;




 题目:if 和else 嵌套

  int main()
{
    printf("请输入年龄");
    int num = 0;
    scanf_s("%d", &num);


        if (num < 18)
            printf("少年");
        else   //num>=18(后面的num 都是大于18的)
        {
            if (18 < num && num < 44) //括号内可以输入num < 44    //18<num || num<44
                printf("青年");
            else//num>44
            {
                if (45 < num && num < 59)
                    printf("中老年");
                else
                {
                    if (60 < num && num < 89)
                        printf("老年");
                    else
                    {
                        if (num > 90)
                            printf("老寿星");
                    }
                }
            }
        }
    return 0;
}

else总是和离他最近的if配对

if语句中,0表示假,非0表示真

2.操作符

相等运算符==

当一个变量和一个常量相比较的时候,建议将常量放在==左边,这样可以很好发现问题所在

三目操作符

int a = 3;
int b = 4;
int c = 7;
if(a<c<b)     //不能多个变量同时使用,对于a<c<b,,因为a<c成立,结果为1,但是1<4,结果就不成立了
  多个关系运算符不宜连用

  争取写法:
  if(a<b && b<c)    //&&的意思就是并且的意思,两边表达式都满足
  if(18<=age<=36),这种写法等同于if(1<=36),因为输入一个40,那么18就<=40,结果是真的,输出为1,然后就变成了1和36的比较了,结果为0,所以后面的打印就不工作了



  int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    /*if (a > 5)
        b = 3;
    else
        b = -3*/
    b = (a > 5 ? 3 : -3);//替换上面的注释,如果a>5的情况下,b就等于3   不是的话就等于-3
    上面的代码运用三目操作符

    return 0;
}
 三目操作符的格式为:b = (exp1 ? exp2 : exp3);//如果exp1的话,那么b就等于exp2,不然b就等于exp3
计算逻辑:如果exp1为真,exp2计算,计算的结果是整个表达式的结果,如果exp1为假,exp3计算,计算的结果是整个表达式的结果

///使用条件表达式实现找两个数字的最大值     三目操作符
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int m = (a > b ? a : b);
    printf("m =%d\n",m);
    return 0;
}

逻辑操作符

! : 逻辑取反运算符(改变单个表达式的真假)

&& :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)

|| : 逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)

若a = 0,那么!a = 1
#include <stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if (month >= 3 && month <= 5)
    {
        printf("春天\n");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int month = 0;
    scanf("%d", &month);
    if (month == 12 || month == 1 || month == 2)
    {
        printf("冬天\n");
    }
    return 0;
}
能被4整除并且不能被100整除的是闰年
能够被400整除的是闰年
#include <stdio.h>
int main()
{
    int year = 0;
    scanf("%d", &year);

    if (((year%4==0) && (year%100!=0)) || (year%400==0))//将一二行的条件带入
    {
        printf("%d 是闰年\n", year);
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    i = (a++ && ++b && d++);
    printf("i = %d\n a = %d\n b = %d\n c = %d\n d = %d\n ", i, a, b, c, d);
    return 0;
}

//对于第四行的a++,因为是后置++,所以先带入a的值0进去,因为a=0,为假,后面的&&就无法继续进行判断了,所以只有a的值改变了,b和c的值没有改变,后置++,先带值进去,为0,假的,就短路了,然后再进行a的++,0+1=1,所以a的值就是1,i=0

int i = 0, a = 1, b = 2, c = 3, d = 4;
将a改为1,则输出结果就是
i = 1
 a = 2
 b = 3
 c = 3
 d = 5
  因为i后面括号内的值都是真的,所以i=1

  a=1的情况下
 对于或者运算符,因为a++=1,为真,那么后面的就没有必要进行计算了,原先是多少就是多少
    i = (a++ || ++b || d++);
    a=0的情况下
    情况就不一样了,因为a++先带a进去,为0,假的,因为这里的符号是||,多以会继续往后面接着运行,因为b=2,++b=3,为真,就停止编译了

3.switch语句

字符类型也归类到整型家族,所以switch后面括号内可以是字符,因为字符的本质是ASCII值,因为ASCII的值是整数

就    //输入任意一个整数值,计算初3之后的余数
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    if (n % 3 == 0) 
        printf("余数是0\n");   
    else if (n%3 == 1)  
        printf("余数是1\n");   
    else    
        printf("余数是2\n");
    return 0;
}

另一种写法:
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch (n % 3)
    {
    case 0:
        printf("余数是0\n");
    case 1:
        printf("余数是1\n");
    case 2:
        printf("余数是2\n");
    }
    return 0;
}
输入6进去,
结果为:
余数是0
余数是1
余数是2
很明显,结果是不对的,因为在运行完每一个case后会继续往后计算的,所以应该在每个case中加上一个break,当结果计算出来就迅速停止,不往下面接着运行


调整后:
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch (n % 3)
    {
    case 0:
        printf("余数是0\n");
        break;
    case 1:
        printf("余数是1\n");
        break;
    case 2://这里的case和2一定要用空格分开,不然结果会有问题的
        printf("余数是2\n");
        break;
    }
    return 0;
}
记住,break 后面一定要加分号

case决定我们从哪里进去,break决定我们从哪里出去


switch()  //switch内的表达式一定要是整型表达式
case n:  //case后面的n一定要是整型常量表达式



//输入1~7的数字,打印出对应的星期
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    switch(day)
    {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\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");
        break;
    case 6:     
    case 7:
        printf("休息日\n");
        break;

    }
    return 0;
}
但是如果我们输入一些与case不相关的数字呢,怎么办?
我们就需要用default来提示用户信息输入错误

#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");
        break;
    case 6:     
    case 7:
        printf("休息日\n");
        break;
    default:   //运用default来提醒用户
        printf("输入错误,输入的值应该在1~7的范围");
    }
    return 0;
}
default没有顺序要求,只要满足逻辑要求就行,也可以放在最前面,case1上面

4.while循环

一个整数%10的结果都是其各位数

#include <stdio.h>
int main()
{
	int i = 1;   // 初始化
	while (i <= 10)   //判断
	{
		printf("%d ", i);
		i++;//等价于i=i+1    //调整
	}
	return 0;
}
最先的数值是1,进去循环之后,就打印出来了,然后i++进行计算,输出2,2再进入循环,以此类推,不断循环。直到最后的数字不满足i <= 10这个循环就结束了
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	while (n)   //while(n!=0)
	{
		printf("%d ", n % 10);
		n = n / 10;
	}
	return 0;
}  

1234 % 10 =4,打印出4,然后下一行的1234 / 10 = 123,然后就相当于再次输入123进入,依次循环,最后得到我们输入的整数的逆序

while后面默认跟一条语句

//用while输入一个正整数,计算这个数是几位
int main()
{
	int count = 0;
	int i = 0;
	scanf("%d", &i);
	while (i != 0)
	{
		i = i / 10;
		count++;
	}
	printf("%d", count);
	return 0;
}

5.for循环

for语法形式如下:

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

表达式1:初始化表达式

表达式2:判断表达式

表达式3:调整

一次#include <stdio.h>
int main()
{
    int i = 0;
    for (i=1;i<=10;i++)   //  ->(表达式1;表达式2;表达式3)
    {
        printf("%d ", i);
    }
    return 0;
}

对比while循环
#include <stdio.h>
int main()
{
    int i = 1;   //表达式1
    while (i <= 10)//  ->表达式2
    {
        printf("%d ", i);
        i++;//等价于i=i+1     //表达式3
    }
    return 0;
}


可以得出for循环的顺序
首先是表达式1进行初始化,然后表达式2进行判断,如果表达式2为真,那么就打印出来,再将打印出来的结果进行表达式3进行调整,再经由表达式2进行判断,再依次循环
for循环的初始化只执行
#include <stdio.h>
int main()
{
    int i = 0;
    int sum = 0;
    for (i = 1; i <= 100; i++)//  把1~100的数全部找出来
    {
        /*printf("%d ", i);*/
        //判断i是否是3的倍数
        if (i % 3 == 0)
            sum += i;  //等价于sum = sum  + i //一开始的sum被定义为0,然后3的倍数依次加进去
    }
    printf("%d\n", sum);
    return 0;
}

另一种写法:
#include <stdio.h>
int main()
{
    int i = 0;
    int sum = 0;
    for (i = 3; i <= 100; i+=3)//   i+=3等价于i=i+3
    {
            sum += i;  //sum = sum +i
    }
    printf("%d\n", sum);
    return 0;
}

6.do while循环

在循环语句中,do while用的很少

没有判断,直接执行语句

do while的循环体至少执行一次

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        printf("%d ", i);  //一上来直接打印
        i++;    //->i的调整
    } while (i <= 10);//i的条件
    return 0;
}
int main()
{
    int n = 0;
    int count = 0;
    scanf("%d", &n);
    do
    {
        count++;      //因为count最开始的量被定义为0,随着n/10的次数,count每次就+1,也就代表这个数的位数
        n = n / 10;// 假如第一次输入123,123/10=12,然后12再次进入循环,12/10=1,然后1再次进入循环,1/10=0,总共进行三次,也就说明count进行了3次count++,最后一次的结果是0,为假,最后不满足条件,就停止运行了,最后得到的count就是你输入值的位数
    } while (n);
    printf("%d\n", count);
    return 0;
}

7.break和continue语句

break:作用是用于永久的终止循环,只要break被执行,就会跳出循环,继续往后执行

continue:作用是跳过本次循环中continue后面的代码,在for循环和while循环中有所差异

int main()
{
    int i = 1;
    while (i < 10)
    {
        if (i == 5)
            break;    //添加break,使代码在i=5时停止继续
        printf("%d ", i);
        i++;
    }


    return 0;
}

i=5后面的都无法打印
int main()
{
    int i = 1;
    while (i < 10)
    {
        if (i == 5)
            continue;
        printf("%d ", i);
        i++;
    }
    return 0;
}
直接跳过i=5,只会打印1234,5自身和后面的统统不打印


#include <stdio.h>
int main()
{
    int i = 0;
    while (i < 10)
    {
        i++;
        if (i == 5)
            continue;
        printf("%d ", i);

    }
    return 0;
}

打印结果为1 2 3 4 6 7 8 9 10 
  i=5的时候直接跳过打印,仅仅是跳过5


  #include <stdio.h>
int main()
{
    int i = 0;
    while (i <= 10)
    {

        if (i == 5)
            continue; //此处break用处相同
        i++;  //      跳过后面的i++和打印,到5就停止,停止+打印了,若是将i++放在if上面,结果就截然不同了,仅仅只有5没有打印
        printf("%d ", i);

    }
    return 0;
}
结果为12345



#include <stdio.h>
int main()
{
    int i = 1;
    do
    {
        if(i==5)
        break;
        printf("%d ", i);  //一上来直接打印
        i++;    //->i的调整
    }
    while (i <= 10);//i的条件
    return 0;
}
输出结果为1 2 3 4,不会打印5以后得数字,因为i=5的时候直接强制停止循环了

8.循环嵌套

//1.产生100~200之间的数字 ---循环
//2.去判断每一组数组是否是素数,是素数就打印
//我们需要判断这个数字是否是素数,是素数就打印
//判断i是否是素数,素数只能被1和自身整除的
//如果2~i-1之间有任何一个数字能整除i,i就不是素数
//如果2~i-1之间所有数字能不能整除i,i就是素数
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//printf("%d ", i);//每一次循环都会产生一个数字
		int flag = 1;
		int j = 0;
		for (j = 2; j <= i - 1; j++)
		{
			if (i % j == 0)     ////如果2~i-1之间有任何一个数字能整除i,i就不是素数
                                  //如果2~i-1之间所有数字能不能整除i,i就是素数
			{
				flag = 0; //如果i % j == 0,那么flag就会被赋值为0,这个数字就不会往后计算下去了,break跳出去,换另一个数字
				break;
			}
		}
		if (flag == 1)  // ,最开始给flag赋的值就是1,如果flag仍然==1,那么这个数就是素数,如果flag没有被赋值为0,那么flag的值还是1,就说明这个数满足i % j != 0,后面就讲这个满足条件的数字打印出来
		{
			printf("%d ", i);
		}

	}	
	return 0;
}

//判断i是不是素数时,只要那2到根号i这个范围就好了
//根号i如何写呢?
//sqrt(i)
 // sqrt是一个库函数-----计算平方根
 // 需要引入头文件//math.h
//  在代码开头添加#include <math.h>
 // for (j = 2; j <= sqrt(i); j++)

9.goto语句

goto语句可以实现在同一个函数内跳转到设置好的标号处

在多层循环的代码中,如果想快速跳出,使用goto就非常方便了,用break跳出循环比较麻烦

int main()
{
    printf("hehe\n");
    if (1)
        goto end;
    printf("haha\n");
end:
    printf("end\n");
    return 0;
}

打印结果:
hehe
end
直接跳过haha


again:
    printf("hehe\n");
    goto again;

死循环打印hehe

shut down

-s关机

-t设置时间关机 秒

shutdown -s -t 60

//倒计时60秒关机

shutdown -a取消关机

system---库函数,可以执行系统命令,需要头文件stdlib.h

两个字符串比较相等时不能实用==

应该实用库函数strcmp,需要使用头文件:string.h

input是用来存你输入的字符串的

system会把你输入的这个字符串,看做命令执行

char 是说这个数组是一个char类型的数组,数组里面存的元素是一个一个字符char

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

int main()
{
    char input[20] = { 0 };
    system("shutdown -s -t 60");
again:
    printf("傻孩子,你的电脑将在1分钟之内关机,如果输入:’我是傻逼’,你爹就给你取消关机\n");
    scanf("%s" , input);
    //判断input中存放的是不是’我是傻逼‘
    if (strcmp("我是傻逼", input)==0)//stecmp负责比较输入的字符串和该判断的字符串是否相等,如果strcmp函数如果返回的是0,就表示这两个字符串相等,就表示input里面放的就是“我是傻逼”
    {
        system("shutdown -a");
    }
    else
    {
        goto again;
    }

    return 0;
}







另一种写法:
int main()
{
    char input[20] = { 0 };
    system("shutdown -s -t 60");
    while (1)
    {
        printf("傻孩子,你的电脑将在1分钟之内关机,如果输入:’我是傻逼’,你爹就给你取消关机\n");
        scanf("%s", input);
        //判断input中存放的是不是’我是傻逼‘
        if (strcmp("我是傻逼", input) == 0)//stecmp负责比较输入的字符串和该判断的字符串是否相等,如果strcmp函数如果返回的是0,就表示这两个字符串相等,就表示input里面放的就是“我是傻逼”
        {
            system("shutdown -a");
            break;
        }
    }       
    return 0;
}
@echo off
echo ......
timeout /t 10 /nobreak >nul
shoutdown -s -f -t 0


  文本文档,将txt改成bat


标签:case,num,语言,int,循环,printf,return,main,分支
From: https://blog.51cto.com/u_17040745/12268848

相关文章

  • C语言手撕实战代码_线索二叉树_先序中序线索二叉树_树的先根遍历_后根遍历_树的度_孩
    文章目录1.设计算法构造一棵先序线索二叉树2.先序线索二叉树的先序遍历算法3.设计算法构造一棵中序线索二叉树4.遍历中序线索二叉树5.树的先根遍历和后根遍历6.树T的叶子结点个数7.计算一棵以孩子兄弟表示的树T的度,该算法的时间复杂度为O(n)8.计算树孩子兄弟链表表示的T......
  • 遥感技术在生态系统碳储量、碳收支、碳循环以及人为源排放反演等领域的技术发展
    以全球变暖为主要特征的气候变化已成为全球性环境问题,对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现实压力,基于......
  • svn中的trunk是什么分支?
    在版本控制系统(如SVN、Git等)中,trunk是一个特殊的分支,通常用于表示主开发线。以下是trunk分支的一些关键点:1.定义Trunk:也称为主干或主分支,是项目的主要开发线。所有主要的开发工作通常都在trunk上进行。2.用途主要开发:开发人员在trunk上进行日常的开发工作,添加新......
  • R语言经典统计分析
    经典统计分析包括了许多常用的统计方法和技术,用于数据的描述、推断和建模。本节将介绍经典统计分析方法(包括t检验、方差分析、卡方检验、线性回归)在R语言中的实现。5.1.1 t检验样本均值(samplemean),又称样本均数,是描述一组数据集中趋势的重要统计量。它是通过将一组数据的所有......
  • C语言中的“宏”以及宏的使用
    在C语言中,宏是一种预处理器指令,主要通过 #define 来定义。宏可以在编译时进行文本替换,使代码更加简洁和可读。如有问题,请指正!以下是C语言宏的几个主要应用场景:1.常量定义使用宏定义常量,可以避免在代码中出现魔法数字,使代码更加易于维护。#definePI3.14159floatra......
  • R语言使用caret包构建神经网络模型(Neural Network )构建回归模型实战、通过method参数
    R语言使用caret包构建神经网络模型(NeuralNetwork )构建回归模型实战、通过method参数指定算法名称目录R语言使用caret包构建神经网络模型(NeuralNetwork )构建回归模型、通过method参数指定算法名称 #导入包和库#仿真数据#R语言使用caret包构建随机森林模型(randomfore......
  • 火车头软件系列产品优惠及火语言VIP权益领取指南
    尊敬的火车头用户:火车头软件系列产品:火车采集器、火车浏览器及触控精灵,始终致力于数据采集领域的深耕与拓展。我们不断优化用户体验,力求为用户提供更加高效、便捷的数据处理工具。火语言作为同创始团队的旗下产品,经过三年的每周版本更新,迭代近百个版本,现已正式上线。为感恩火......
  • 在 C 语言中通过指针访问结构体内存
    在C语言中,指针是用于引用内存地址的变量,通过指针可以有效地访问和操作内存。即使未显式创建结构体实例,只要指向的内存区域足够大且对齐方式正确,指针也能够按照特定结构体的布局访问数据。以下是这个机制的详细解读。1.指针与内存布局指针的类型(如Block*)告诉编译器如何解释......
  • 实验2 C语言分支与循环基础应用编程-1
    实验一:#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));cnt=0;while(cnt......
  • C语言中的指针与内存管理:两种情况分析
    在C语言中,指针的使用和内存管理是非常重要的概念。在本文中,我们将分析两种情况:一种是通过指针修改结构体内容,另一种是错误地尝试通过指针分配新的内存。我们将详细探讨这两种情况中的内存管理问题和如何避免常见的错误。第一例:通过指针修改结构体内容以下是第一段代码:#includ......