1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 分支结构 循环结构C语言案例

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

时间:2023-08-23 05:54:50

相关推荐

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

C语言程序案例之3

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

问题导入

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

输入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);elseprintf("最大的数为%d",d);elseif(c>d)printf("最大的数为%d",c);elseprintf("最大的数为%d",d);else if(b>c)if(b>d)printf("最大的数为%d",b);elseprintf("最大的数为%d",d);elseif(c>d)printf("最大的数为%d",c);elseprintf("最大的数为%d",d);}

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

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

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

直角三角形等腰三角形

以及上述三角形的特殊情况及它们的组合

此例中我们简单介绍一下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("输入的三边组成等腰直角三角形");elseprintf("输入的三边组成等腰三角形");}else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)printf("输入的三边组成直角三角形");elseprintf("组成的三角形为普通三角形");}elseprintf("输入的三边构不成三角形,请重新输入");}

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

判断整数位数,我们可以用整除10的次数来判断,比如

915//10=91915//10 = 91 915//10=9191//10=991 //10 =9 91//10=99//10=09//10 = 09//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//10000I//10000I//10000来确定收入利润的数量级,并且在case后通过break;来确定计算方式。

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

非常典型的迭代题目,迭代公式由下放给出

yearn+1=rate⋅yearnyear_{n+1} = rate\cdot year_n yearn+1​=rate⋅yearn​

其中yearnyear_nyearn​表示第n年的工业产值且year0=1(亿)year_0 = 1(亿)year0​=1(亿)

迭代的终止条件

yearn≥2(亿)year_n\geq 2(亿) yearn​≥2(亿)

因为次数不定,所以循环的条件并不能确定次数,我们可以通过改变传统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);}

冒泡算法的原理

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

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

很显然这也是一个迭代的题目,迭代公式如下

an+1=2ana_{n+1}=2a_nan+1​=2an​

其中a1=1a_1=1a1​=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元一个,实现满足条件的结果输出。

遍历所有情况来找出满足条件的结果

3i+2j+1k=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(元)10⋅3(元)+20⋅1(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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。