《C++ Primer Plus》,6-2,我写了一个臃肿不堪的程序,还能如何进一步优化?

acgtyrant 2012-06-17 10:19:17
在下新人,初次发帖,请多指教。梦想是Google软件工程师,任重道远。大家一起努力吧。

题目来自《C++ Primer Plus》,编号6-2

“编写一个程序,最多将10个donation值读入到一个double数组中,遇到非数字输入就结束输入并输出所有有效数字的平均值以及数组中有多少个数字大于平均值”

我花了一小时才写出这不伦不类的程序来:


#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int Max = 10;

double sum = 0,ave = 0;
int count = 0;

int main()
{
double donation[Max]={0,0,0,0,0,0,0,0,0,0};

for (int i = 0;i < Max;++i)
{
while (!(cin >> donation[i]))
{
int j = (i+1),count = 0;
cin.clear();
while (cin.get() != '\n')
continue;
for (int i = 0;i < j;++i)
{
sum += donation[i];
ave = sum/i;
}
for (int i = 0;i < j;++i)
{
if (donation[i]>ave)
++count;
}
cout << "平均值是 " << ave << endl << "大于平均数的有 " << count << endl;
cin.get();
cin.get();
exit(1);
}
}
int j = 10,count = 0;
for (int i = 0;i < j;++i)
{
sum += donation[i];
ave = sum/i;
}
for (int i = 0;i < j;++i)
{
if (donation[i]>ave)
++count;
}
cout << "平均值是 " << ave << endl << "大于平均数的有 " << count << endl;
cin.get();
cin.get();
return 0;
}


虽然达到了题目的要求,但本身臃肿无比。大家觉得还能如何进一步优化呢?
...全文
641 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
li4c 2015-01-19
  • 打赏
  • 举报
回复
你这样求平均数的方法其实是不对的,如果数组里面的数太多太大,加起来就溢出了。求出的和和平均数就都是错的了
N0bug 2015-01-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <numeric>
#include <string>
#include <iterator>
using namespace std;


int main(void)
{
	int i=0;
	int cnt=0;
	double sum=0.0;
	double donation[10];
	while(i!=10 && cin>>donation[i++])
		;
	sum = accumulate(donation,donation+i,0.0);
	sum /=10;
	for (int j=0;j<i;j++)
		if(sum<donation[j])
			donation[cnt++] = donation[j];
	cout<<cnt<<"个数大于平均数"<<sum<<endl;
	cout<<"它们是:"<<endl;
	copy(donation,donation+cnt,ostream_iterator<double>(cout," "));
	
	
	
	return 0;
}
N0bug 2015-01-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <numeric>
#include <string>
#include <iterator>
using namespace std;


int main(void)
{
	int i=0;
	int cnt=0;
	double sum=0.0;
	double donation[10];
	while(i!=10 && cin>>donation[i++])
		;
	sum = accumulate(donation,donation+10,0.0);
	sum /=10;
	for (int j=0;j<i;j++)
		if(sum<donation[j])
			donation[cnt++] = donation[j];
	cout<<cnt<<"个数大于平均数"<<sum<<endl;
	cout<<"它们是:"<<endl;
	copy(donation,donation+cnt,ostream_iterator<double>(cout," "));
	
	
	
	return 0;
}
赵4老师 2015-01-19
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
qq_25409815 2015-01-18
  • 打赏
  • 举报
回复
#include<iostream> using namespace std; int main() { double donation[10], zhongshu=0; int geshu = 0; for (int i = 0; i < 10; i++) { if (!(cin >> donation[i])) break; zhongshu += donation[i]; } for (int a=0; a < 10; a++) { if (donation[a]>zhongshu / 10) geshu++; } cout << "平均值" << zhongshu / 10 << endl; cout << "个数" << geshu << endl; system("pause"); return 0; } 参照了楼上的,感觉他的挺不错,大一新人。
Cxlins 2012-06-23
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
int main()
{
double donation[10]={0};
int sum(0),j(0),k,i;

for(i = 0;i < 10 ; i++ ){
if(!(cin >> donation[i]))
break;
sum += donation[i];
}

for(sum /= i,k=0 ; k < i ; k++)
if(donation[k] > sum )
j++;

cout<<"平均数:"<<sum<<" 大于平均数:"<< j<<endl;
return 0;
}


飘过!
xtianshi00 2012-06-22
  • 打赏
  • 举报
回复
哥们 加油。。我也在看。。学到14章了。。。。我的目标是。。7月下放暑假前。。看完、、、玛德。。最后一周 考试。。还有考试,,尼玛。。大学。坑得
笨蛋糕 2012-06-20
  • 打赏
  • 举报
回复
优化就得从算法上优化
减少语句的数量就是优化了吗?有多大的必要吗
Flammable_ice 2012-06-20
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void main()
{
double donation[100],sum=0;
for (int i=0;i<10;i++)
{
if (!(cin>>donation[i]))
{
break;
}
sum+=donation[i];
}
sum=sum/i;
cout<<"所有有效数字的平均值为"<<sum<<endl;
int n=0;
for (int j=0;j<i;j++)
{
if (donation[j]>sum)
{
n++;
}
}
cout<<"大于平均值的数有"<<n<<"个"<<endl;
}
//这个就用了2个循环 第一个循环是求平均值 第二个循环是求大于平均值的个数
acgtyrant 2012-06-20
  • 打赏
  • 举报
回复
看了各位的答案,发现其实优化所需的知识已经远远超出我的学习领域了,难怪我就目前所学的有限知识自然是没法着手进行优化的。

这样吧,这个帖子就暂时不结贴,直到我学完《C++ Prime Plus》再细读各位的答案。
ljianhui 2012-06-19
  • 打赏
  • 举报
回复
在一本书上看过一句话,不成熟的优化是万恶之根。如果你想优化的话,最好从算法上优化,不要太过于拘泥于小节,因为其实编译器在编译时会通过复杂的算法来帮你进行一定的优化,对于那些自己没有充分理由认为能提高效率的优化最好就是把它写得更简洁易看易懂,不要把代码改得效率没有多大的提高,反而非常难读和难以维护,所以最好还是从算法上入手吧。还有规范很重要,一个程序的代码易读性的重要性并不亚于效率。这是我个人的一个感悟吧,希望对你有帮助。
寂静的风之力 2012-06-19
  • 打赏
  • 举报
回复
有个错误没仔细看,这个是改正的:


#include <iostream>

#define MAX_INPUT_COUNT 10
#define SUCCESS 0

using std::cin;
using std::cout;
using std::endl;
using std::cerr;

int main(int argc, char **argv){
int i = 0, moreThanAvgCount = 0;

double inputBuf[MAX_INPUT_COUNT] = {0},
temp = 0, avg = 0, sum = 0;

for (i = 0; i < MAX_INPUT_COUNT; i++){
if (!(cin >> temp))
break;

inputBuf[i] = temp;
sum += temp;
}

avg = sum / (double)i;

for (int j = 0; j <= i; j++)
if (inputBuf[j] > avg)
moreThanAvgCount++;

cout << "平均值: " << avg << "\n大于平均值的数有:" << moreThanAvgCount << endl;

return SUCCESS;
}
寂静的风之力 2012-06-19
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>

#define MAX_INPUT_COUNT 10
#define SUCCESS 0

using std::cin;
using std::cout;
using std::endl;
using std::cerr;

int main(int argc, char **argv){
int i = 0, moreThanAvgCount = 0;

double inputBuf[MAX_INPUT_COUNT] = {0},
temp = 0, avg = 0, sum = 0;

for (i = 0; i < MAX_INPUT_COUNT; i++){
if (!(cin >> temp))
break;

if (cin)

inputBuf[i] = temp;
sum += temp;
}

avg = sum / (double)i;

for (int j = 0; j <= i; j++)
if (inputBuf[j] > avg)
moreThanAvgCount++;

cout << "平均值: " << avg << "\n大于平均值的数有:" << moreThanAvgCount << endl;

return SUCCESS;
}


out:

1 23 4 5 6
s
平均值: 7.8
大于平均值的数有:1
Press any key to continue


我很少写控制台的程序,仅供参考。
寂静的风之力 2012-06-18
  • 打赏
  • 举报
回复
你想优化什么?把自己的代码排版得更紧凑?还是提高代码的速度改进算法?你这个几十行的程序怎么改进?朋友,在今天这个年代,能快速解决问题才是第一的,在保持良好风格的前提下,把优化之类的先放在第二位。

鉴于你在学习阶段,应该是学生吧,如果你想改进和继续学习:
1. 试试使用不同的方法,比如使用一些更高级的库来解决这个简单的问题,纯当是练手。
2. 尝试使用纯C来解决同样的问题。
3. 尝试使用指针来表达一个数组,练习指针以及动态内存分配,并提高程序的通用性可以接受任意多的数字。
4. 改进你的循环,比如试着在循环中使用并行加速,或者使用多线程。
5. 我不知道最后那几行代码是什么意思,你的代码重复了很多,试试把重复的部分用一个函数解决。
6. 设计一个通用的类来解决“这个”问题。
7. 设计一个模版类来解决“这一类”问题。
8. 学习WIndows API函数,试试用Ctrl-C/Ctrl-Z来让用户终止输入。
…………
ybjx111 2012-06-18
  • 打赏
  • 举报
回复
double donation[Max]={0,0,0,0,0,0,0,0,0,0};
可以这么来double donation[Max]={0};
exit(1);最好是直接return 0;
不知道你是这么判断非字符输入的cin.get() != '\n'?
还有为什么要写两个一模一样的部分呢?
ybjx111 2012-06-18
  • 打赏
  • 举报
回复
还是不同作用域的
ybjx111 2012-06-18
  • 打赏
  • 举报
回复
int count = 0;一个变量定义了3遍,你何必呢?
kevinyank 2012-06-18
  • 打赏
  • 举报
回复
使用面向对象的方法。。。。。。
acgtyrant 2012-06-18
  • 打赏
  • 举报
回复
@lejcey

我才学到第九章@_@

我所说的优化是指追求登峰造极的简洁,毕竟如同你第5条所说,代码重复了很多,但一时想不起还有什么更简洁的方法。

@ddlddy

Thx!
龙哥依旧 2012-06-18
  • 打赏
  • 举报
回复
向未来的Google软件工程师致敬!
:)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧