注册 登录
编程论坛 C++教室

我想做一个求平均数的程序,可遇到难题了!望大家指教,新手

xuyu950403 发布于 2011-08-23 11:52, 3048 次点击
我想做一个求平均数的程序,可遇到难题了!望大家指教,新手
  难题就是我不知道会有多少个数要求平均数,就不知道怎么设置变量,想过用循环语句,但是如何把每个数加到一个不同的变量里呢?如何用循环语句能够自动增加变量,然后输入赋值给变量,最后怎么计算呢?我想了好久,人笨了,唉!请大家指教。
  我还想过用字符来循环
如:
  char a
  a='a'
  a=a+1
  int a
这种方式,然后循环,就可以自动增加了,但是有错,a=a+1,可以让变量a变成‘b’,可是后头的int a好像有错,我想的就是int a的话,因为变量a=‘b’,那么int a不就等于int b 在循环,就可以自动增加,c,d等变量,可是好像不行?不知道我的方法错了还是算法有问题,新手请大家指教?
20 回复
#2
xuyu9504032011-08-23 11:57
请大家多读几篇,我可能表达不太好,但这个的确不好表达!
#3
八画小子2011-08-23 12:32
不是表达不太好,我读的时候感觉是太不好了,能不能重新表述?
#4
八画小子2011-08-23 12:38
再一次拜读,然后询问度娘和谷歌,还是似懂非懂。但我可以指出你写出来的代码中的错误,已经声明a为字符类型,然后你又一次声明a为整型,是错的。
#5
xg56992011-08-23 12:44
不是很明白,不过我可以告诉你思路

比如 输入变量值,将变量值赋给b
    如此在赋给c啊d啊
   将 b c d 等等这些变量统统加起来,赋给a;
如果不知道有几个变量,那么可以建立个新变量int total=0;
用户没输入一次将total进行自加,配合for循环那是非常的简单
知道了变量总数就用a/totla结果就出来了

[ 本帖最后由 xg5699 于 2011-8-23 12:47 编辑 ]
#6
xuyu9504032011-08-23 12:48
虽然我是int a,但是变量a的值是b,开始我想int a的话,因为变量a的值是b,那么int a不就等于int b等于新建一个变量b了吗?我的想法可能是错的,我主要想解决的是如何在算法中自动新建变量,然后给变量赋值,最后求平均数,因为我不知道要求多少个数的平均数,开始也不知道要建立好多个变量,如何使变量自动增加,也就是说想求多少个数的平均数就求多少个?谢谢大家热心
#7
xuyu9504032011-08-23 12:51
total怎么用?我还没学到?我刚学完循环语句那里,我看的是《c++程序设计》这本书,什么谭写的!好不好?
#8
八画小子2011-08-23 12:56
这本书啊,可以考虑卖废纸了。
#9
xg56992011-08-23 12:59
回复 7楼 xuyu950403
早了,对你而言要这么做太早了,简单点用数组就可以做到,程序
优秀点用链表写出来是更好。即时我现在写出数组你是根本看不懂的
    先要把基础打好,等看到数组了,你就自然会了
#10
xuyu9504032011-08-23 14:48
哦,谢谢指教,真的这本书不好?那我看什么书自学?希望推荐一下,学了c++,我还想学c.谢谢!
#11
jcw081201102011-08-23 15:42
可以尝试STL 库解决问题~    设置一个向量c; 经过一系列求值;再用for循环(int a=0;a<c.size();a++) total+=c[a]; 至于你说的那个什么用char类型的变量来做循环控制条件;你不觉得char类型能标示的数太少了嘛! 顶多256个嘛~   程序不大 我就帮你写出来了:
程序代码:
#include<iostream>
#include<vector>
using namespace std;
void main()
{
    vector<double> c;//定义浮点向量c;大小为0;
    double d;
    while(cin>>d)  //输入判断条件:只要你输入的是数字就可以继续输入;
    {
        c.push_back(d); // 向向量尾部添加d;向量就是可以改变大小的数组;
    }
    d=0;
    for(int a=0;a<c.size();++a)d+=c[a];  //c.size();求向量的大小;
    d/=c.size();
    cout<<"平均数是:"<<d;

}
#12
xuyu9504032011-08-23 15:46
谢谢楼上,虽然看不大懂,但是基本思路还是似懂非懂了,谢谢!
#13
jcw081201102011-08-23 15:56
你这个问题难度就是 不知道有多少数据;以及求出数据的长度; 如果用数组的话 定义一个数组 double a[10000]又不实际还浪费空间;定少了怕溢出;很纠结 所以用向量vector很轻易就能克服这2个难题;
#14
xg56992011-08-23 16:09
回复 10楼 xuyu950403
坚持是最好的书本。
#15
sqqg19862011-08-23 16:38
#include<iostream.h>
int main(){
int a,b=0,sum=0;
char c='n';
do{
cout<<"请输入数字"<<endl;
cin>>a;
sum=sum+a;
b++;
cout<<"请问是否已经输完所有的数字,y为已输完,n为继续输入。"<<endl;
cin>>c;
}while(c=='n');
sum=sum/b;
cout<<"所输入的数字的平均数为"<<sum<<endl;
return 0;
}
本人新手,目前只能做到这样不强大的程序,但愿抛砖引玉,能有高手指点指点。
#16
xg56992011-08-23 20:05
回复 11楼 jcw08120110
STL数据库是在数组和链表之后教的...
我才看到流这里,那家伙连int total=0;都不明白什么意思你和他讲STL...
不过你写的是非常好的


[ 本帖最后由 xg5699 于 2011-8-23 20:07 编辑 ]
#17
xg56992011-08-23 20:10
回复 12楼 xuyu950403
...

[ 本帖最后由 xg5699 于 2011-8-23 20:19 编辑 ]
#18
羽毛扇2011-08-23 20:37
回复 楼主 xuyu950403
char 型到 Int型貌似应该强制类型转换一下
#19
hoei56992011-08-23 20:53
《C++ Primer》
#20
xg56992011-08-23 22:25
程序代码:
#define num 100
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int x;float h;
    cout<<"请输入学生的数量,范围不要超过100!"<<endl;
    cin>>x;
  while(x<0||x>99)
  {
      cout<<"输入学生的范围不要超过100!"<<endl;
      cin>>x;
  }
  int a[num], c=0,i;
  for (i=0;i<x;i++)
  {
      cout<<"请输入第"<<i+1<<"名学生的成绩\t";
      cin>>a[i];
      c=c+a[i];
  }

 
  h=(float)c/x;
  cout<<x<<"名学生的平均成绩为\t"<<h<<endl;
  return 0;
}
}
这是很久前我写的,用的是数组,缺点也像11楼说的那样浪费空间和限制,不过链表的诞生就是为 解决数组浪费空间而创建的
接下来演示用链表制作
程序代码:
#include <iostream>
#include<string>
using namespace std;
class labe   //链表类
{
private:
    labe *next;
     double date;
public:
    labe():date(0),next(0){};
    labe(double a):date(a),next(0){};
   ~labe(){delete next;}
    void setnext(labe *a){ next=a;}
    labe* getnext()const{return next;}
    void print2(){cout<<date<<endl;}
    double getDate()const{return date;}
};
class list  //操作类
{
private:
    labe *head;
    int total;
public:
    list():head(0),total(0){}
    ~list(){delete head;}
    void run();
    void print();
    void math();
    //void gettotal(){cout<<total<<endl;}
};
void list::math()
{
      
    if(!head)
    {
        cout<<"程序结束"<<endl;
        return;
    }
    int i=0;
     double Total=0;
    labe *head2=head;
    while(head2)
    {   
      
        Total=Total+head2->getDate();
        head2=head2->getnext();
        i++;
    }
   cout<<"总和为"<<Total<<" 平均数为:"<<(Total/total)<<endl;
}
void list::print()   //为了具体说明链表拥有和数组一样的功能,特意输出了所有输入的数字;和数组的区别是它的优越性可以不受束缚"无限"创建;不用去管他是怎么做的,只管创建就行了.
{
    if(!head)
    {
        cout<<"程序结束"<<endl;
        return;
    }
     labe *head2;
    int i=0;
    head2=head;
    while(head2)
    {
        i++;
        cout<<""<<i<<"个数为:";
        head2->print2();
        head2=head2->getnext();
   }

}
void list::run()
{
    labe *sen2;
    labe *sen;
    double a;

   
    cout<<"请输入一个数字,当不是数字时结束"<<endl;
   
    cin>>a;
     if(a<0||a>9)
    {
        return;
    }
       head=new labe(a);
           total++;
            sen=head;
            string sd;
    while(1)
    {
    cout<<"请输入一个数字;当不是数字时结束"<<endl;
   
    cin>>sd;
    if(sd[0]<'0'||sd[0]>'9')
    {
      
        return;
    }
    a=atof(sd.c_str());
         sen2=new labe(a);
         total++;
         sen->setnext(sen2);
         sen=sen->getnext();
   

    }
}

void main()
{

    list a;
    a.run();
    a.print();
    a.math();
   
}
用链表的优越性大大的加强,不像数组产生多余空间无法定义元素数目的问题,但缺点则是写起来比较复杂(麻烦),由于我还没有看到摸版STL,对11楼的程序表示看不懂
如果想又简单又方便就用11楼的程序(我个人认为大多初学者都不会用STL);


[ 本帖最后由 xg5699 于 2011-8-23 22:52 编辑 ]
#21
syx07522011-08-28 13:56
1