(篇二)C语言动态分配内存、计算π的值


本篇是接着分享一些有趣的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、题:
输入年份和月份,输出该月份有几天

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、参考结果:
计算天数

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙Next

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值