Bootstrap

C/C++高级语言程序设计课程设计

C/C++高级语言程序设计课程设计

1. 课程设计任务内容

  1. 分蛋糕(201703-1):小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为al , a2, … an。 小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。
    请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕?
  2. 工资计算(201612-2):小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
    1)个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S -3500元;
    2) A中不超过1500元的部分,税率3%;
    3) A中超过1500元未超过4500元的部分,税率10%;
    4) A中超过4500元未超过9000元的部分,税率20%;
    5) A中超过9000元未超过35000元的部分,税率25%:
    6) A中超过35000元未超过55000元的部分,税率30%;
    7) A中超过55000元未超过80000元的部分,税率35%:
    8) A中超过80000元的部分,税率45%;
    已小明这个月税后所得为T元,请问他的税前工资S是多少元?
  3. 最大的矩形(201312-3):在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1≤i≤n)个矩形的高度是hi。这n个矩形构成了一个直方图,求取直方图中最大矩形10。

2. 问题描述与分析

1. 问题描述
  1. 分蛋糕(201703-1)
    小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为al , a2, … an。 小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。
    请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕?
  2. 工资计算(201612-2)
    小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
    1)个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S -3500元;
  1. A中不超过1500元的部分,税率3%;
  2. A中超过1500元未超过4500元的部分,税率10%;
  3. A中超过4500元未超过9000元的部分,税率20%;
  4. A中超过9000元未超过35000元的部分,税率25%:
  5. A中超过35000元未超过55000元的部分,税率30%;
  6. A中超过55000元未超过80000元的部分,税率35%:
  7. A中超过80000元的部分,税率45%;
    例如,如果小明的税前工资为1000元,则10000-3500=6500元其中不超过1500元部分应缴税1500*3%=45元,超过1500元不超过4500元部分应缴税(4500-1500) *10%=300元,超过4500元部分应缴税(6500-4500)*20%=400元。总共缴税745元,税后所得为9255元。已知小明这个月税后所得为T元,请问他的税前工资S是多少元?
  1. 最大的矩形(201312-3)
    在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1≤i≤n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。请找出能放在给定直方图里面的面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图阴影部分,面积为10。
    直方图
2. 设计分析
  1. 分蛋糕(201703-1)
    根据题干中“他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为al , a2, … an。 小明想分给每个朋友至少重量为k的蛋糕。”可以得知需要定义三个变量分别为n,k,val。由题干信息“对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k。”可以得知需要两个判断型语句和一个循环型语句。由最后的问题“总共有多少个朋友分到了蛋糕?”可以得知需要进行累加输出。
  2. 工资计算(201612-2)
    由以下八种情况
    1)个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S -3500元;
    2) A中不超过1500元的部分,税率3%;
    3) A中超过1500元未超过4500元的部分,税率10%;
    4) A中超过4500元未超过9000元的部分,税率20%;
    5) A中超过9000元未超过35000元的部分,税率25%:
    6) A中超过35000元未超过55000元的部分,税率30%;
    7) A中超过55000元未超过80000元的部分,税率35%:
    8) A中超过80000元的部分,税率45%;
    根据税前工资算税后工资相对要容易许多,本题正好相反。从编程方法上来说,一种是将工资段和税率写到程序逻辑中。这种做法修改程序比较难,逻辑也比较复杂。另外一种是查表法,通过查表来计算最后的结果。查表法的优点在于,单有关规定改变时,只需要调整表格,而不需要改变程序逻辑。该问题原始数据可以建两个表格,一是工资收入段表,二是税率表。根据这两个表可以算出收入范围表,即由实际收入得到最高税率是哪一档的表。进一步的计算就变得简单许多。
    例如:如果小明的税前工资为10000元,则10000-3500=6500元其中不超过1500元部分应缴税1500 * 3%=45元,超过1500元不超过4500元部分应缴税(4500-1500) * 10%=300元,超过4500元部分应缴税(6500-4500)*20%=400元。总共缴税745元,税后所得为9255元。根据该例题可以得知算法需要计算各种收入范围后经过判断确定工资最后执行的程序得出税前工资。已知小明这个月税后所得为T元,请问他的税前工资S是多少元?有题干问题得知需要输入一个变量T输出一个结果S。
  3. 最大的矩形(201312-3)
    最大矩形问题是对一个直方图找出其中可以组成矩形最大面积的问题。该问题主要运用的是枚举法。首先在直方图中从左往右进行运算,找出合成矩形的最小高度,然后通过公式得出该矩形的面积,在进行一一的比较,直到找出最大的面积为止,最后输出结果。

3. 算法设计与流程图

  1. 分蛋糕(201703-1)算法设计与流程图
    根据题干可以分析出需要四个部分进行编程。分别为输入:设出三个变量进行输入操作,判断部分为蛋糕是否大于k,第三部分进行计数,第四部分输出。
    判断部分:
while(n--) //采用while用参数控制循环次数
{
	scanf("%d",&val);
	if((sub += val) >= k) //累加计算蛋糕重量与k比较判断
{                     //注意边界条件:最后一个朋友可以不足重量k
		count++;    //计数
		sub=0;     //初始化
	}
}
if(sub>0)   //判断是否剩余蛋糕
count++;

流程图

  1. 工资计算(201612-2)算法设计与流程图
    根据题干以及问题可以分析出算法需要五个部分编程。分别为输入:设一个变量进行输出操作;第二部分计算收入范围利用数组进行储存八种情况工资收入范围;第三部分计算税前工资利用for循环和if判断语句;第四部分定义输出变量进行输出。
    第二部分:利用数组进行储存八种情况工资收入范围
const int SIZE=sizeof(salaryrange)/sizeof(int);//计算数组的长度const使数
int range[SIZE];                             值保持不变
for(int i=1;i<SIZE;i++)        //采用for循环计算各种收入范围
{
range[i]=range[i-1]+(salaryrange[i]-salaryrange[i-1])-  
(salaryrange[i]-salaryrange[i-1])*taxrate[i-1]/100;       
}
#ifdef DEBUG        //防止被include两次
for(int i=0;i<SIZE;i++)
cout<<range[i]<<" ";
cout<<endl;
#endif

第三部分:计算税前工资利用for循环和if判断语句以及公式

for(i=0;i<SIZE;i++)  //用for循环计算收入范围
if(t<=range[i])
break;
if(i==0)          //用if排除税收为0的情况
s=t;
else
{
s=salaryrange[i-1]+(t-range[i-1])*100/(100-taxrate[i-1]);//计算税前工资
}

流程图

  1. 最大的矩形(201312-3)算法设计与流程图
    根据题干以及问题可以分析出算法需要四个部分编程。该问题主要运用的是枚举法。分别为输入:设置变量进行输入操作,输入矩形个数和每个矩形的高度;第二部分计算矩形面积利用数组进行储存;第三部分用枚举法一一比较矩形面积并取出最大值;第四部分定义输出变量进行输出。
    第一部分:设置变量进行输入操作
    int n, ans, height, area n为有多少相邻矩形,ans记录最大矩形面积,height表示矩形高度,area计算矩形面积。
    for(int b=0;b<n;b++) //输入每个矩形的高度
    cin>>h[b];
    ans=0; //初始ans为0
    第二部分:计算矩形面积利用数组进行储存
for(int i=0;i<n;i++)
	{
		height=h[i];
		for(int j=i;j<n;j++)
		{
	if(h[j]<height)//当i的值固定时j改变比较与i时的高度选取较小值
	height=h[j];
	area=(j-i+1)*height;//已知j,i求出此时的面积
	if(area>ans)    //通过一次次的比较面积大小,取出最大值
	ans=area;      //将最大值赋值
	}
}

在这里插入图片描述

4. 编码与测试

5. 程序编码

  1. 分蛋糕(201703-1)程序编码
#include <stdio.h>
int main(void)
{
int n,k,count=0,val,sub=0;
scanf("%d%d",&n,&k);
while(n--)
{
	scanf("%d",&val);
	if((sub+=val)>=k) 
	{
		count++;
		sub=0;
	}
}
if(sub>0)
count++;
printf("%d\n",count);
return 0;
}
  1. 工资计算(201612-2)程序编码
#include <iostream>
using namespace std;
int salaryrange[]={3500,3500+1500,3500+4500,3500+9000,
3500+35000,3500+55000,3500+80000};
int taxrate[]={3,10,20,25,30,35,45};
const int SIZE=sizeof(salaryrange)/sizeof(int);
int range[SIZE];
int main()
{
	int t,s;
	range[0]=salaryrange[0];
	for(int i=1;i<SIZE;i++)
	{
range[i]=range[i-1]+(salaryrange[i]-salaryrange[i-1])-
(salaryrange[i]-salaryrange[i-1])*taxrate[i-1]/100;
}
#ifdef DEBUG   
for(int i=0;i<SIZE;i++)
cout<<range[i]<<" ";
cout<<endl;
#endif
cin>>t;
for(i=0;i<SIZE;i++)
if(t<=range[i])
break;
if(i==0)
s=t;
else
{
s=salaryrange[i-1]+(t-range[i-1])*100/(100-taxrate[i-1]);
}
cout<<s<<endl;
return 0;
}
  1. 最大的矩形(201312-3)程序编码
#include<iostream>
using namespace std;
const int N=1000;
int h[N];
int main()
{
	int n, ans, height, area;
	cin>>n;
	for(int b=0;b<n;b++)
		cin>>h[b];
	ans=0;
	for(int i=0;i<n;i++)
	{
		height=h[i];
		for(int j=i;j<n;j++)
		{
			if(h[j]<height)
				height=h[j];
			area=(j-i+1)*height;
			if(area>ans)
				ans=area;
		}
	}
	cout<<ans<<endl;
	return 0;
}

6. 程序测试

  1. 分蛋糕(201703-1)测试用例及截图
    输入格式;输入的第一行包含了两个整数n, k,意义如上所述。第二行包含n个正整数,依次表示al.a2. … an.
    输出格式;输出一个整数,表示有多少个朋友分到了蛋糕。
    样例输入:6 9
    2 6 5 6 3 5
    样例输出:3
    样例说明:第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。
    评测用例规模与约定:对于所有评测用例,1≤n≤1000, 1≤k≤10000,1≤ai ≤ 1000。

在这里插入图片描述

  1. 工资计算(201612-2)测试用例及截图
    输入格式:输入的第一行包含一个整数T元,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。
    输出格式:输出一个整数S,表示小明的税前工资。
    样例输入:9255
    样例输出:10000
    评测用例规模与约定:对于所有评测用例,1≤T <100000。
    在这里插入图片描述
  2. 最大的矩形(201312-3)测试用例及截图
    输入格式:第一行包含一个整数n,即矩形的数量(1≤n≤1000)。
    第二行包含n个整数h1,h2,···,hn, 相邻的数之间由空格分隔。(1≤hi≤10
    000)。hi是第i个矩形的高度。
    输出格式:输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
    样例输入:6
    3 1 6 5 2 3
    样例输出:10
    在这里插入图片描述

7. 总结分析

这段时间学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多回顾起此次课程设计,感觉计算机知识非常的深妙,这是一个神奇的语种,更让我感受到了计算机的魅力。
回顾起此次C语言课程设计,至今我仍感慨颇多,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C语言的一次实践作业,自己进步的证明。自己更好地学好计算机相关知识。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并懂得如何在执行过程中如何去克服心理上的压力和不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前。
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,网络技术逐渐成为互联网主流。

;