分支结构,循环结构C语言案例

问题导入

  1. 输入4个数,输出最大的数字。
  2. 实现三角形 输入防御机制,实现三角形特殊形状判断。
  3. 输入不超过5位数的整数,判断出是几位数,并把位数输出。
  4. 实现销售提成问题,要求使用switch解决
  5. 假设南昌市2020年工业总产值为1个亿,假设平均增长率为6%,8%,10%时,编程实现几年后可达2亿。
  6. 请实现三个数由小到大的输入输出。
  7. 用循环实现一个月30天,第一天一元,第二天是第一天的一倍的结果输出。
  8. 实现99乘法表的输出(使用双重循环)。
  9. 猜随机数,直到猜到随机数为止。
  10. 实现100-1000之间所有位数之和等于9的所有数输出
  11. 男女小孩共30人,吃饭用去50元,男人3元一位,女人2元一位,小孩1元一个,实现满足条件的结果输出。
  12. 实现笑脸和音符的三角形输出

输入4个数,输出最大的数字。

经典的比较大小问题,数字个数为4,有限个输入,可采取的方法很多

代码

#include<stdio.h>

void main(){
    int a,b,c,d;
    printf("请输入四个整数");
    scanf("%d%d%d%d",&a,&b,&c,&d);

    if(a>b)
        if(a>c)
            if(a>d)
                printf("最大的数为%d",a);
            else
                printf("最大的数为%d",d);
        else
            if(c>d)
                printf("最大的数为%d",c);
            else
                printf("最大的数为%d",d);
    else    
        if(b>c)
            if(b>d)
                printf("最大的数为%d",b);
            else
                printf("最大的数为%d",d);
        else
            if(c>d)
                printf("最大的数为%d",c);
            else
                printf("最大的数为%d",d);
    
}

在此案例中我们使用了每两个数之间比较,将大数与后边的数继续比较,最后输出最大数的过程,此问题解决的选择结构中判断条件有多种写法,不再多述。

实现三角形输入防御机制,实现三角形特殊形状判断

又是典型的选择结构,特殊三角形包含如下:

  1. 直角三角形
  2. 等腰三角形

以及上述三角形的特殊情况及它们的组合
此例中我们简单介绍一下C语言的选择结构

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

以上结构,当表达式1结果为真时,会执行语句1,当表达式1为假且表达式2为真时,会执行语句2,表达式1与表达式2都为假时,会执行语句3,可以用if来实现简单的条件判断,else if 与 else 不是必须,且我们可以认为最后的else是并列于表达式1的if,也可认为是并列于表达式2的if。

代码案例

#include <stdio.h>

void main()
{
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b, &c);
    if (a < (b + c) && b < (a + c) && c < (a + b))
    {
        printf("三边可以构成三角形\n");
        if (a == b || b == c || a == c)
        {
            if (a == b && b == c)
                printf("输入的三边组成等边三角形");
            else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
                printf("输入的三边组成等腰直角三角形");
            else
                printf("输入的三边组成等腰三角形");
        }
        else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
                printf("输入的三边组成直角三角形");
        else
            printf("组成的三角形为普通三角形");
    }
    else
        printf("输入的三边构不成三角形,请重新输入");
}

输入不超过5位数的整数,判断几位数并将位数输出

判断整数位数,我们可以用整除10的次数来判断,比如
915 / / 10 = 91 915//10 = 91 915//10=91 91 / / 10 = 9 91 //10 =9 91//10=9 9 / / 10 = 0 9//10 = 0 9//10=0
整除3次后商为0,所以915是三位数,此结构可以用while循环来实现,while循环的结构之前的文章中讲述过了,这里不多叙述

代码案例

#include<stdio.h>

void main(){
    int n,cnt=0;
    printf("请输入不超过5位的整数");
    scanf("%d",&n);
    while(n){
        n /= 10;
        cnt += 1;
    }
    printf("该数为%d位数",cnt);
}

我们来看一下运行的效果

请输入不超过5位的整数915
该数为3位数
请输入不超过5位的整数1051
该数为4位数

本案例可以测试整个int存储范围之内的自然数,更改变量类型为长整型时可测试的数据更多

实现销售提成问题,要求使用switch解决

首先我们来介绍一下switch的用法

switch (表达式)
    {
    case 表达式情况1:
        语句1;
        break;
    case 表达式情况2:
    	语句2;
    	break;
    default:/* 否则 */
    	语句3;
        break;
    }

所谓switch就是选择表达式情况,执行对应情况的对应语句
网上找到的一个销售提成的题目

企业发放的奖金根据利润原则。利润Ⅰ低于或者等于100 000元的,奖金可提10%;利润高于100 000元,低于200 000元
( 100 000 <I≤200 000 )时,低于100 000元的部分按10%提成,高于100 000元的部分,可提成――7.5%;
200 000<|≤400 000元时,低于200 000元的部分仍按上述办法提成(下同)。高于200 000元的部分按5%提成; 
400 000<≤600 000元时,高于400 000元的部分按―3%提成; 600 000<I≤1000 000元时,高于600 000元的部
分按1.5%提成;I>1000 000元时,超过1000 000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。

我们来看一下这个案例的代码

代码案例

#include<stdio.h>

void main(){
    double res,I;
    int method;
    printf("请输入获得的利润I");
    scanf('%lf',I);
    method = (int)(I/10000);
    switch (method)
    {
    case 0:res = I * 1.1;
        break;
    case 1:res = 11000+(I-10000)*1.075;
        break;
    case 2: 
    case 3:res = 21750 + (I-20000)*1.05;
        break;
    case 4:
    case 5:res = 42750 + (I-40000)*1.03;
        break;
    case 6:
    case 7:
    case 8:
    case 9:res = 63350 + (I-60000)*1.015;
        break;
    default:res =103950 +(I-100000)*1.01;
        break;
    }
    printf("利润提成过后%d",res);
}

此案例中通过 I / / 10000 I//10000 I//10000来确定收入利润的数量级,并且在case后通过break;来确定计算方式。

假设南昌市2020年工业总产值为1个亿,假设平均增长率为6%,8%,10%时,编程实现几年后可达2亿。

非常典型的迭代题目,迭代公式由下放给出
y e a r n + 1 = r a t e ⋅ y e a r n year_{n+1} = rate\cdot year_n yearn+1=rateyearn
其中 y e a r n year_n yearn表示第n年的工业产值且 y e a r 0 = 1 ( 亿 ) year_0 = 1(亿) year0=1亿

迭代的终止条件
y e a r n ≥ 2 ( 亿 ) year_n\geq 2(亿) yearn2(亿)
因为次数不定,所以循环的条件并不能确定次数,我们可以通过改变传统for循环的终止条件或是使用while循环来实现
首先来看while循环的一种写法

代码案例1

#include<stdio.h>

void main(){
    double value = 1,rate = 0.06;
    int year = 1;
    while(1){
        value *= (1+rate);
        year += 1;
        if (value > 2)
            break;
    }
    printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}

此例中我们使用while True 的方式构建了死循环,当达到迭代的终止条件时跳出循环来找到对应的年份

代码案例2

#include<stdio.h>

void main(){
    double value = 1,rate = 0.08;
    int year = 1;
    while(value<2){
        year += 1;
        value *= (1+rate);
    }
    printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}

对照while的案例我们给出for循环的参考代码

代码案例3

#include<stdio.h>

void main(){
    double value = 1,rate = 0.1;
    int year;
    for (year = 2;;year++){
        value *= (1+rate);
        if(value>2)
            break;
    }
    printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}

代码案例4

#include<stdio.h>

void main(){
    double value = 1,rate = 0.1;
    int year;
    for (year = 1;value<2;year++)
        value *= (1+rate);
    
    printf("当增长速度为%.2f时,第%d年时南昌市工业总产值可达2亿",rate,year);
}

请实现三个数由小到大的输入输出。

经典的排序问题,排序算法中最经典的就是冒泡法,常用于数组中,下面我们给出冒泡排序的算法

代码

#include<stdio.h>

void main(){
    int a,b,c,temp;
    scanf("%d%d%d",&a,&b,&c);
    if (a>b)
    {
        temp = b;
        b = a;
        a = temp;
    }
    if (b>c)
    {
        temp = c;
        c = b;
        b = temp;
    }
    if (a>b)
    {
        temp = b;
        b = a;
        a = temp;
    }
    printf("%d,%d,%d",a,b,c);
}

冒泡算法的原理

  1. 首先我们假设存在3个数 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3
  2. 首先我们比较 a 1 与 a 2 a_1与a_2 a1a2的值,选出较大的值让他们交换位置,假设 a 1 > a 2 a_1>a_2 a1>a2,则排序变为 a 2 , a 1 , a 3 a_2,a_1,a_3 a2,a1,a3
  3. 让较大的数与 a 3 a_3 a3比较,选出大数放在最序列的最右边,这样就保证在第一轮交换后,最右边的是最大的数。
  4. 刨除掉最大数,对序列重复上述操作就可以确定第二大数,第三大数,直到把序列排序完成

用循环实现一个月30天,第一天一元,第二天是第一天的一倍的结果输出

很显然这也是一个迭代的题目,迭代公式如下
a n + 1 = 2 a n a_{n+1}=2a_n an+1=2an
其中 a 1 = 1 a_1=1 a1=1
同样,很显然这是一个公比为2的等比数列,首项为1,我们接下来给出代码实例

代码实例

#include<stdio.h>

void main(){
    long int a=1;
    int i;
    for(i=1;i<30;i++)
        a *= 2;
    printf("第三十天的收入为%ld",a);
}

这个问题便是著名的荷花定律

荷花定律

什么是“荷花定律”?

在一个荷花池中,第一天开放的荷花只是很少的一部分,第二天开放的数量是第一天的两倍,之后的每一天,荷花都会以前一天两倍的数量开放…

假设到第30天荷花就开满了整个池塘,那么请问:在第几天池塘中的荷花开了一半?

是第15天吗?错!!

是第29天。

这就是著名的荷花定律,也叫30天定律。

思想决定行动,行动决定人生。

中国有句古话叫“行百里者半九十”,和上面说的“荷花定律”意思很相似:走一百里路程,到九十里的时候才算是走到一半。厚积薄发,共勉。

实现99乘法表的输出(使用双重循环)

在这里插入图片描述
既然是九九乘法表,使用双重循环,循环变量的范围必是 [ 1 , 9 ] [1,9] [1,9],通过图片可以看到第i行只有i个等式,如果行数用变量i控制,列用变量j控制,则j循环的条件就可以看出j<=i

代码

#include<stdio.h>

void main(){
    int i,j;

    for(i=1;i<=9;i++){
        for(j=1;j<=i;j++){
            printf("%dX%d=%d\t",j,i,j*i);
        }
    printf("\n");
    }
}

猜随机数,直到猜到随机数为止

内置函数

到这里,我们就学习到了函数的概念,函数是指封装一定的代码通过调用实现一定功能的代码块,而我们在编译前导入的头文件中实则就是封装了很多函数的头文件,产生随机数的rand()函数在stdlib.h中,内置函数可以理解为通过导入头文件就可以使用的函数

代码

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

void main(){
    int temp,randnum;
    randnum = rand() % 10 + 1;
    printf("生成的随机数在1-10之间,请输入此范围内的一个数,猜猜这个数是多少\n");
    while(1){
        scanf("%d",&temp);
        if(temp == randnum){
            printf("猜对了,这个数就是%d,你真是我肚子里的蛔虫呢",randnum);
            break;
        }
        else if (temp<randnum)
            printf("你猜的数小了哦\n");
        else if(temp>randnum)
            printf("你猜的数大了哦\n");
    }
}

rand()函数生成的是至少是一个32767范围的随机数,我们通过取余10来限定随机数生成的范围0-9.然后通过加1来使得区间的左端点变为1,从而使范围变为1-10

实现100-1000之间所有位数之和等于9的所有数输出

这道题目的核心算法就是取数位,前面已经介绍过整除10的方法可以将个位抹掉形成一个新数,我们还可以通过取余10的方式将个位数取出,我们直观的看一代码

代码

#include<stdio.h>

void main(){
    int i,d1,d2,d3;
    for(i=100;i<1000;i++){
        d1 = i % 10;
        d2 = i / 10 % 10;
        d3 = i / 100 % 10;
        if (d1+d2+d3 == 9)
            printf("%d\t",i);
    }
}

男女小孩共30人,吃饭用去50元,男人3元一位,女人2元一位,小孩1元一个,实现满足条件的结果输出。

遍历所有情况来找出满足条件的结果
3 i + 2 j + 1 k = 50 ( 元 ) 3i+2j+1k=50(元) 3i+2j+1k=50()

代码实例

暴力破解即可

#include<stdio.h>

void main(){
    int i,j,k;
    for(i=0;i<=30;i++){
        for(j=0;j<=30;j++){
            k = 30-i-j;
            if(i*3+j*2+k==50)
                printf("男人%d人,女人%d人,小孩%d人\n",i,j,k);
        }
    }
}

会过头来我们再分析一下这个问题,确定一下各个人数的范围
因为
i + j + k = 30 ( 人 ) i+j+k=30(人) i+j+k=30
因为
3 ( 元 ) ∗ 30 ( 人 ) > 50 ( 元 ) 3(元)*30(人)>50(元) 3()30()>50() 2 ( 元 ) ∗ 30 ( 人 ) > 50 ( 元 ) 2(元)*30(人)>50(元) 2()30()>50() 1 ( 元 ) ∗ 30 ( 人 ) < 50 ( 元 ) 1(元)*30(人)<50(元) 1()30()<50()
男人最多的时候一定是男人+小孩的组合
由此可见男人最多为
10 ⋅ 3 ( 元 ) + 20 ⋅ 1 ( 1 元 ) = 50 ( 元 ) 10\cdot3(元)+20\cdot1(1元) = 50(元) 103()+201(1)=50()
同理,分析女人和小孩的组合可以得到女人最多的情况,
女人最多为20人
经过分析后的算法可以简化代码的时间复杂度

简化时间复杂度的代码

#include<stdio.h>

void main(){
    int i,j,k;
    for(i=0;i<=10;i++){
        for(j=0;j<=20;j++){
            k = 30-i-j;
            if(i*3+j*2+k==50)
                printf("男人%d人,女人%d人,小孩%d人\n",i,j,k);
        }
    }
}

实现笑脸和音符的三角形输出

对照ASCII码表我们可以看到😊的ASCII码值为1;我们可以使用printf("\1”);来输出笑脸,接下来就是控制行与列输出的位置,这里我们以5行为例

代码

#include<stdio.h>

void main(){
    int i,j;
    for(i=1;i<=5;i++){
        for(j=1;j<=5-i;j++)
            printf("  ");
        for(j=1;j<=2*i-1;j++)
            printf("\1 "); \*printf("😀");*\
        printf("\n");
    }
}

codeblocks和vscode好像输出不了转义之后的笑脸;
音符的ASCII代码十六进制是0D可以将\1替换为\x0D

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值