资源描述
程序实践设计报告
自动化072班 许云 0702100208
一、题目
计算基尼系数
基本数据:广西2008年度全区在岗职工年平均工资25660元,月平均工资为2138元。2008年南宁市均工资26142元,市月均工资2718.5元。南宁市最低工资标准670元(自2008年8月起执行)(年工资12*670=8040元)。据 2009年02月06日广西新闻网-南国早报:“2008年南宁市各行业间就业者收入差距有所扩大,人均就业收入最高收入行业是最低收入行业的8.4倍(去年为5.5倍),这是记者2月5日从国家统计局南宁调查队获悉的消息。”
题目:随机生成100个人的年工资(8040元—30万元),并使平均工资接近于26142元,再计算基尼系数。
附:基尼系数基本知识及计算方法
20世纪初意大利经济学家基尼,根据洛伦茨曲线找出了判断分配平等程度的指标(如右图所示)。
设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际收入分配曲线右下方的面积为B。并以A除以A+B的商表示不平等程度。这个数值被称为基尼系数或称洛伦茨系数。如果A为0,基尼系数为0,表示收入分配完全平等;如果B为0则系数为1,收入分配绝对不平等。该系数可在0和1之间取任何值。收入分配越是趋向平等,洛伦茨曲线的弧度越小,基尼系数也越小,反之,收入分配越是趋向不平等,洛伦茨曲线的弧度越大,那么基尼系数也越大。
如果个人所得税能使收入均等化,那么,基尼系数即会变小。联合国有关组织规定:若低于0.2表示收入绝对平均;0.2-0.3表示比较平均;0.3-0.4表示相对合理;0.4-0.5表示收入差距较大;0.6以上表示收入差距悬殊。基尼系数的国际警戒标准是0.4。
基尼系数的直接计算方法如下:
其中:u平均收入,n总人数,Y个人收入。
二、概要设计
在Microsoft Visual C++ 6.0的平台上,通过C语言将基尼系数的计算公式翻译成计算机可编译执行的代码,并随机生成题目所要求的100个人的工资样本,作为模拟计算基尼系数的实际参数。整个过程在编写代码时预先设计完成,执行代码就可直接得到符合题目要求的结果。
三、详细设计
程序代码功能概要:
(1) 随机生成100个人的工资样本(使用“while”语句使得平均工资接近于26142元), 并计算该样本的平均值。
(2) 查找资料简化基尼系数计算公式,并按照简化算法对100个人的工资进行升序排列,然后先进行求和的计算,最终再进行剩下的计算。
(3) 显示程序执行结果。
附基尼系数计算公式简化算法:
第一步,分解 n n ∑∑| j=1 i=1Yj-Yi∣
设将收入按从低到高排列Y1、Y2、……Yn,则上式可以分解为矩阵A:
Y1 Y2 …… Yn-1 Yn
Y1
Y2
……
Yn-1
Yn
0 Y2-Y1 …… Yn-1-Y1 Yn-Y1
Y2-Y1 0 …… Yn-1-Y2 Yn-Y2
…… …… …… …… ……
Yn-1-Y1 Yn-1-Y2 …… 0 Yn-Yn-1
Yn-Y1 Yn-Y2 …… 0
将矩阵中各项加总得到:
2〔(n-1)Yn+(n-2)Yn-1+……+Y2—(n-1)Y1-(n-2)Y2-……-Yn-1〕
=2〔(n-1)Yn+(n-3)Yn-1+(n-5)Yn-2……-(1-n)Y2-(n-1)Y1〕
第二步,计算 1 2n2u
取样本均值u= Y1+Y2+……Yn n = n∑Yi n
1 2n2u = 1 2n n∑Yi
综上,第一步、第二步,得到
G= 1 n n∑Yi 〔(n-1)Yn+(n-3)Yn-1+(n-5)Yn-2……-(1-n)Y2-(n-1)Y1〕
四、效果及存在问题
代码编译没有出现问题,执行后得到符合题目要求的数据结果。
五、心得体会
这次程序实践设计的题目的主要难点在于如何通过代码实现利用计算机强大的计算能力来计算基尼系数。起初直接对题目所给公式进行计算,结果发现出错,而且找不到代码错误的地方。之后通过查找有关资料,另外找到了简化该公式的证明步骤,并得到易于进行编写代码的基尼系数计算公式。
虽然此次题目难度不大,但是编写代码的过程对于我是再一次学习认识C语言的过程,也是一次熟悉算法、操作、编程步骤的过程。计算机的优势在于可以通过简单的计算机语言实现复杂繁琐的数学计算,将现实世界的复杂多样性较为准确的映射到计算机中。
程序设计一般经过需求分析、概要设计、详细设计、软件编码、软件测试、软件维护几个步骤。通过实践,我熟悉了以上一个步骤,一定程度提高了动手能力。在以后的学习中,我不仅得继续学习各种常用代码的使用方法和编程、调试经验,最重要的是还得发散自己的思维,力求能够创造出更短更实用更优化的代码,这也是每个程序员的终极追求,是这次程序实践带给我的最大收获。
六、程序代码
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
void main()
{ int a[100],i,j,k,sum(0),u,s,t;
srand((unsigned)time(NULL));//使生成的随机数每次都不相同
while( u<26100 || u>26200 )//使样本的平均工资接近于26142元
{
for(i=0;i<100;i++)
{
a[i]=rand()%291961+8040;//在8040~300000的范围内随机生成100个样本
sum=sum+a[i];//100个样本求和
}
u=sum/100;//求平均工资
}
for(i=0;i<100;i++)//利用两重循环将100个人的工资升序排列
{
for(j=i+1;j<100;j++)
{
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<99;i++)//根据化简的公式分步计算基尼系数
s=s+(100-i)*a[100-i];
for(i=0;i<99;i++)//根据化简的公式分步计算基尼系数
k=k+(100-i)*a[i];
cout<<"平均工资为:"<<u<<endl;//输出结果
cout<<"基尼系数为:"<<(double)(s-k)/(10000*u)<<endl;
}
七、参考文献
(1)熊俊:《基尼系数估算方法的比较研究》;《财经问题研究》2003年1月第1期
(2)王文森:《基尼系数及推广应用》;《统计与预测》;2003年1月第1期
展开阅读全文