开关语句、循环语句、goto

本文复习了C语言中的开关语句,详细介绍了switch结构及其在判断季节和计算天数等场景的应用。同时,讲解了for、while、do while循环语句,包括循环嵌套,并给出了相关练习。此外,还探讨了在不使用循环的情况下如何利用跳转语句计算斐波那契数列。

复习:

1、数据类型:
    signed char         1   %hhd    -128~127
    signed short        2   %hd     -32768~32767
    signed int          4   %d      正负20亿
    signed long         4   %ld
    signed long long    8   %lld    9天开头的19位数
    unsigned char       1   %hhu    0~255
    unsigned short      2   %hu     0~65535
    unsigned int        4   %u      0~40亿
    unsigned long       4   %lu     
    unsigned long long  8   %llu    1开头的20位数
    float               4   %f
    double              8   %lf
    long double         12  %LF
2、变量取名规则
    1、由数字 字母 下划线组成
    2、不能以数字开头
    3、不能与关键字重名
    4、见名知义
3、变量的输入输出
    printf 提示信息+占位符+变量名
    scanf 占位符+变量地址
    %nd %0nd %-nd %n.mf
3、运算符
    / % 除数不能0,否则会产生浮点数例外,核心已转储错误
    == 变量尽量放在右边
    ++/-- 一行代码中不要过多使用
    && || 具有短路特性
    A?B:C 不能出现流程控制语句
4、类型转换
    自动类型转换:不同类型的数据会先转换成相同类型的数据才能进行运算。
    转换规则(以不丢失数据为基础,适当牺牲一些空间):
    1、字节少向字节多转
    2、相同字节数有符向无符转
    3、整型向浮点型转

    强制类型转换:
        (目标类型)数据 , 可能会造成数据丢失,慎重使用。

一、开关语句

switch
switch(n)//运算结果必须是整型
{
    case val: // val必须是整常量 ,如果val等于n,则打开执行开关
        ... 
        break; // 关闭执行开关
    注意:如果每个cast后都有break,就形成了分支结构。
    default:// 如果所有的case都没有匹配成功则打开执行开关
}
case a ... b: 判断一个范围,此为GNU编译器独有的语法,不建议使用。

练习1:输入一个月份,判断季节。
123 春天
456 夏天
789 秋天
10 11 12 冬天
other 输入的月份有误

#include <stdio.h>

int main()
{
	unsigned int month = 0;
	printf("请输入一个月份:");
	scanf("%u",&month);
	switch(month)
	{
		case 1 ... 3: printf("春天"); break;
		case 4 ... 6: printf("夏天"); break;
		case 7 ... 9: printf("秋天"); break;
		case 10 ... 12: printf("冬天"); break;
		default: printf("输入的月份有误!\n"); break;
	}
}

练习2:输入一个月份,判断该月有多少天,忽略闰年问题。

#include <stdio.h>
#include <stdint.h>

int main(int argc,const char* argv[])
{
	uint8_t month = 0;
	printf("请输入一个月份:");
	scanf("%hhu",&month);

	if(month < 1 || month > 12)
	{
		printf("输入的月份有误!\n");
		return 0;
	}

	switch(month)
	{
		case 2: printf("28天\n"); break;
		case 4: case 6:case 9:case 11: 
			printf("30天\n"); break;
		default: printf("31天\n"); break;
	}
}

for循环语句:
循环就是让一段代码反复执行,达到你想要的结果。
for一种比较灵活且危险(与其它循环相比)的一种循环。
一般使用一个变量来引导它的运行,这个变量就叫作循环变量。
for([1];[2];[3])
{
    [4];
}

1、给循环变量赋初值,C99标准才可以定义循环变量。
    此处定义的循环变量,只能for循环内使用。
2、判断循环变量的是否到达边界。
4、被反复执行的代码,也叫循环体。
3、改变循环变量,防止变成死循环,一般对循环变量自加或自减。

大括号问题:
    1、建议上下对齐
    2、循环体如果只有一行代码,大括号可以省略
        但不利于扩展,一般商业代码要求大括号不能省略。

for循环的多种写法:
for(;;)
{
    // 死循环
}

int i = 0;
for(;i<10; i++)
{

}

for(int i=0; i<10;)
{
    printf("----");
    i++;
}
while语句:
while(条件) // 当条件为真执行循环体,为假时结束
{
    // 循环体
}

while循环相当于for循环的精简版本。
for循环负责解决明确知道循环次数的问题。
while负责解决只知道结束条件而不确定循环次数的问题。
do while语句:
do{
    循环体
}while(条件); 
先执行循环体,再判断循环条件,该循环至少执行一次。
循环嵌套:
循环语句中包含循环语句。
外层循环执行一次,内存循环执行遍。

练习3:计算出所有的水仙花数。

#include <stdio.h>

int main(int argc,const char* argv[])
{
	for(int i=100; i<1000; i++)
	{
		int g = i%10;
		int s = i/10%10;
		int b = i/100;
		if(g*g*g+s*s*s+b*b*b == i)
		{
			printf("%d\n",i);
		}
	}
}

练习4:输入一个正整数,判断是否是素数。

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d",&num);

	if(num < 2)
	{
		printf("输入的数据有误!\n");
		return 0;
	}

	int cnt = 0;
	for(int i=1; i<=num; i++)
	{
		if(0 == num%i)
		{
			cnt++;
		}
	}

	if(2 == cnt)
	{
		printf("是素数\n");
	}
	else
	{
		printf("不是素数\n");
	}
}

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d",&num);

	if(num < 2)
	{
		printf("输入的数据有误!\n");
		return 0;
	}

	int i = 2;
	for(; i<num; i++)
	{
		if(0 == num%i)
		{
			printf("不是素数\n");
			return 0;
		}
	}
	printf("是素数!\n");

}

练习5:输入一个整数,分解显示。
-1234
-1 2 3 4

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

int main(int argc,const char* argv[])
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d",&num);
	if(num < 0 )
	{
		printf("-");
		num = abs(num);
	}
	int copy = num , cnt = 0;

	while(copy)
	{
		copy /= 10;
		cnt++;
	}
	
	for(int i=cnt; i>0; i--)
	{
		printf("%.0lf ",num/pow(10,i-1));
		num = num % (int)pow(10,i-1);
	}
}

练习6:输入一个正整数,判断是否是回文数。
1234
4321

#include <stdio.h>

int main(int argc,const char* argv[])
{
	int num = 0 , new = 0;
	printf("请输入一个正整数:");
	scanf("%d",&num);
	if(num < 0)
	{
		printf("输入的数据有误\n");
		return 0;
	}

	int copy = num;
	while(copy)
	{
		new = (new*10)+(copy%10);
		copy /= 10;
	}
	
	printf("%d %d\n",num,new);
	if(num == new)
	{
		printf("是回文数\n");
	}
	else
	{
		printf("不是回文数\n");
	}
}

跳转语句:
goto 可以在函数内任意跳转。
它可能会破坏已经设计好的分支或循环语句,因此绝大多数公司禁止使用。
但它在驱动编程时特别适合处理异常。

标签: // 位置
goto 标签;

练习7:不使用循环计算前N项的斐波那切数列。
1 1 2 3 5 8 13 21 …

#include <stdio.h>

int main(int argc,const char* argv[])
{
	// 1 0 1 1 2 3
	int n = 0;
	printf("输入n的值:");
	scanf("%d",&n);
	int f1 = 1 , f2 = 0 , t = 0;

loop:
	t = f1 + f2;
	f1 = f2;
	f2 = t;
	printf("%d ",t);
	if(--n) goto loop;
}

在这里插入图片描述


该系列持续更新
希望喜欢的小伙伴可以一键三连~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值