本篇是接着分享一些有趣的C语言实例,其实学习C语言这类结构化语言是非常锻炼逻辑思维的,也可以让我们对编程语言有更深入的理解
一、动态分配内存
1、题:
用动态分配内存来处理学生成绩。输入5个学生成绩,再输出这5个学生的成绩,并且计算出平均成绩;再来5个学生,再计算10个学生的平均成绩;重点在用的是5个动态内存空间来操作,所以称之为动态分配
2、分析:
(1)分配5个保存整数的内存空间,保存输入的5个学生成绩,计算该5个学生的平均分;
(2)重新分配保存10个整数的内存空间,输入新来的5个学生成绩,再计算10个学生的平均成绩
3、参考代码:
#include <stdio.h>
main()
{
int i;
double sum= 0;
int *p;
p= (int *) malloc(5 * sizeof(int));
//分配动态内存存储空间 ,molloc表示动态内存 ,每个空间大小为一个int型的大小
printf("请输入5个成绩:\n");
for(i=0; i<5; i++) //得到前5个数据的值
{
scanf("%d",p+i);
}
printf("前5个学生的成绩是:\n");
for(i=0; i<5; i++) //输出到屏幕上
{
printf("%d ",*(p+i));
}
printf("\n");
for(i=0; i<5; i++) //求和,除以5后得到平均值
{
sum+= *(p+i);
}
printf("前5个同学的平均成绩是:%4.2f\n",sum/5);
p= (int *) realloc(p, 10 * sizeof(int)); //realloc表示更改已经配置的内存空间
printf("请再输入5个学生的成绩:\n");
for(i=5; i<10; i++) //从p+5后的地址开始加入新的数据
{
scanf("%d",p+i);
}
printf("10个学生的成绩是:");
for(i=0; i<10; i++)
{
printf("%d ",*(p+i));
}
printf("\n");
sum= 0; //重置sum的值
for(i=0; i<10; i++) //求10个数的总和,之后求平均数
{
sum+= *(p+i);
}
printf("10个学生成绩的平均值为:%4.2f",sum/10);
free(p); //释放动态存储空间的内存
}
4、参考结果:
二、猴子吃桃问题
1、题:
猴子第一天摘了若干桃子,当即吃了一半,又多吃一个;第二天吃了剩下的一半,又多吃一个… 第十天只剩下一个桃;求总共摘了多少桃子
2、分析:
(1)第10天剩下一个桃子,则第9天应该有2×(1+1)=4个桃子,第八天应该有2×(4+1)个桃子,以此类推…
(2)用while或者for循环遍历9次就可以实现,因为第十天到第一天总共只有10天,但是第10天没有吃,仅仅说它只剩下1个桃子了
3、参考代码:
#include <math.h>
//第一天摘了若干桃子,当即吃了一半,又多吃一个;第二天吃了剩下的一半,又多吃一个... 第十天只剩下一个桃子
main()
{
int i=0, n=1; //第十天剩下一个,但第十天没有吃,所有应该遍历9次
while(i<9)
{
n = 2*(n+1);
i++;
}
printf("第一天桃子的个数为:%d\n",n);
}
4、参考结果:
三、两种计算π的值
1、第一种参考代码:
#include <stdio.h>
#include <math.h>
main()
{
double t=1.0, pi=0.0; //t为每一项,pi为每一项的和
double i=1.0, n=1.0; //n用于保存正负号,i用于遍历
while(fabs(t) >= 1e-6) //精度为10的-6次方
{
pi += t;
i += 2.0;
n = -n;
t = n/i;
}
printf("最终的π值为:%lf",pi*4.0); //上述计算的是π/4的值,因此输出需要乘以4
}
2、第二种参考代码:
#include <stdio.h>
main()
{
double s=0.0, s1=1.0; //s用来记录数列的总和,s1用来记录数列的每一项的和
int n=1;
while(s1 >= 0.0005) //0.0005是精度
{
s += s1;
s1 = s1 * n/(2*n+1);
n++;
}
printf("π的值为:%lf",s*2); //因为整个数列算的是π/2的值,所以需要乘2才是π最终的值
}
3、两个结果:
很明显,两个结果不一样,因为它们用的计算公式和精度都不一样了,因此算出来的π的近似值也不同
四、计算指定年月有几天
1、题:
输入年份和月份,输出该月份有几天
2、分析:
(1)每年的1、3、5、7、8、10、12有31天,用算法(month<=7 && month%2!=0) || (month%2>=8 && month%2==0)
来判断;
(2)用算法(year%4==0 && year%100!=0) || (year%400==0)
来判断是否闰年
3、参考代码:
#include <stdio.h>
main()
{
int year, month;
int days; //记录总天数
printf("请输入年份和月份,以空格分开:");
scanf("%d %d",&year,&month);
if((month<=7 && month%2!=0) || (month%2>=8 && month%2==0))
{
days += 31;
}
else if(month==2) //判断是否为2月,因为闰年2月有29天
{
if((year%4==0 && year%100!=0) || (year%400==0))
{
days += 29;
}
else
days +=28;
}
else
days = 30;
printf("%d年 %d月总共有 %d天",year,month,days);
}
4、参考结果: