问题导入
- 输入4个数,输出最大的数字。
- 实现三角形 输入防御机制,实现三角形特殊形状判断。
- 输入不超过5位数的整数,判断出是几位数,并把位数输出。
- 实现销售提成问题,要求使用switch解决
- 假设南昌市2020年工业总产值为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);
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);
}
在此案例中我们使用了每两个数之间比较,将大数与后边的数继续比较,最后输出最大数的过程,此问题解决的选择结构中判断条件有多种写法,不再多述。
实现三角形输入防御机制,实现三角形特殊形状判断
又是典型的选择结构,特殊三角形包含如下:
- 直角三角形
- 等腰三角形
以及上述三角形的特殊情况及它们的组合 此例中我们简单介绍一下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?=rate?yearn? 其中
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(亿)
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个数
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1?,a2?,a3?
- 首先我们比较
a
1
与
a
2
a_1与a_2
a1?与a2?的值,选出较大的值让他们交换位置,假设
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?
- 让较大的数与
a
3
a_3
a3?比较,选出大数放在最序列的最右边,这样就保证在第一轮交换后,最右边的是最大的数。
- 刨除掉最大数,对序列重复上述操作就可以确定第二大数,第三大数,直到把序列排序完成
用循环实现一个月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(元)
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
|