Board logo

标题: 【编程相关】CPP的问题……求大伙帮忙…… [打印本页]

作者: shixn    时间: 2010-7-4 01:48     标题: 【编程相关】CPP的问题……求大伙帮忙……

posted by wap

就是想整一个类对象,存数,每一秒一存,一小时求一次均值,输出……如何实现?求思路……要不声明一百多个变量实在太麻烦了……激骚伺候
作者: 荡的正册哟西啊    时间: 2010-7-4 03:41

posted by wap, platform: UC

定时器,然后另一个变量就存总数,加到3600次的时候一除不就出结果了,楼主是不是这个意思,每秒的数据还要存下来输出?这样声明一个数组不就可以了么?
作者: HyperIris    时间: 2010-7-4 11:06

#include <vector>

std::vector<float> my_array;

// 存数
my_array.push_back(0.0f);

// 求平均
float sum = 0.0f;
for (size_t i=0; i<my_array.size(); i++)
{
sum += my_array;
}
float result = sum / 3600.0f;
作者: 猫猫猫    时间: 2010-7-4 11:43

我问楼主一个问题

做一个程序, 需要储存全班60个学生的姓名

你怎么做?  定义60个变量??
作者: carnon    时间: 2010-7-4 11:49

引用:
原帖由 HyperIris 于 2010-7-4 11:06 发表
#include <vector>

std::vector<float> my_array;

// 存数
my_array.push_back(0.0f);

// 求平均
float sum = 0.0f;
for (size_t i=0; i<my_array.size(); i++)
{
sum += my_array;
}
float result = sum / 3600.0f;
这程序有个大缺陷

sum精度不够,要回绕了
做算术最容易让人忽略的问题就是变量类型精度

[ 本帖最后由 carnon 于 2010-7-4 11:54 编辑 ]
作者: shixn    时间: 2010-7-4 11:50

posted by wap

定义一个变量啊,但是我现在又要存名字,身高,体重,年龄,智商,电话,等等一百多个属性……哦对了,还要实时求方差……
作者: HyperIris    时间: 2010-7-4 12:27

引用:
原帖由 carnon 于 2010-7-4 11:49 发表


这程序有个大缺陷

sum精度不够,要回绕了
做算术最容易让人忽略的问题就是变量类型精度
lz 又没说要多高的精度,也没说是3600个多大的数
作者: shixn    时间: 2010-7-4 12:46

long 的就够了……
3楼的做法我感觉跟用数组没啥区别啊……是不是就相当于一个float型的数组?
作者: Eurydice    时间: 2010-7-4 12:55

STL最高
数组是渣
作者: nvidia007    时间: 2010-7-4 13:57

posted by wap, platform: UC
引用:
猫猫猫 发表于 2010-7-4 11:43
我问楼主一个问题

做一个程序, 需要储存全班60个学生的姓名

你怎么做?  定义60个变量??
定义一个struct结构体存储学生信息:名字学号等,然后定义数组或者stl的vector存储n个学生信息
作者: shixn    时间: 2010-7-4 14:50

posted by wap

TO楼上:如果我想随时查看学生身高的平均值和方差,并画出曲线应该如何操作?
作者: shixn    时间: 2010-7-4 14:55

posted by wap

先不画曲线了……就求个均值吧……我觉得用数组不好,因为数据是不断增加的(学生数量不断增加),也就是说如果用结构体数组,数组的长度是未知的……
作者: McLovin    时间: 2010-7-4 15:42

引用:
原帖由 HyperIris 于 2010-7-4 11:06 发表
#include

std::vector my_array;

// 存数
my_array.push_back(0.0f);

// 求平均
float sum = 0.0f;
for (size_t i=0; i
这么用vector性能上有大问题.
作者: nvidia007    时间: 2010-7-4 16:10

引用:
原帖由 shixn 于 2010-7-4 14:55 发表
posted by wap

先不画曲线了……就求个均值吧……我觉得用数组不好,因为数据是不断增加的(学生数量不断增加),也就是说如果用结构体数组,数组的长度是未知的……
有新学生,就每次push_back一个学生的struct进vector咯,也能够查找、修改和删除某个学生的属性。如果用数组么,每个学生可以new一个struct,然后用指针做一个链表去管理。还是stl方便

std::vector<stu_struct> aaa;
作者: shixn    时间: 2010-7-4 17:18

posted by wap

那如何提取某一属性的值?比如打印输出每一学生姓名和身高,及身高均值。
作者: lijgame    时间: 2010-7-4 17:19

引用:
原帖由 shixn 于 2010-7-4 14:55 发表
posted by wap

先不画曲线了……就求个均值吧……我觉得用数组不好,因为数据是不断增加的(学生数量不断增加),也就是说如果用结构体数组,数组的长度是未知的……
你难道不知道vector这东西?
作者: 猫猫猫    时间: 2010-7-4 18:07

引用:
原帖由 HyperIris 于 2010-7-4 11:06 发表
#include

std::vector my_array;

// 求平均
float sum = 0.0f;
for (size_t i=0; i<my_array.size(); i++)
{
sum += my_array;
}
  
for 里面的 i 用在哪里?
作者: ypandoo    时间: 2010-7-4 18:11

class studentArray
{
     public:
     class student
     {
          int studentID;
          CString studentName;
          double StudentHeight;//身高
           
      }
     void addStudent(int studentID, CString studentName, double studentHeight)
     {
        m_studentArray.push_back(new student(studentID, studentName, studentHeight))
     }
     double averageHeight()
     {
        std::vector<student*>::iterator it = m_studentArray.begin();
        double sum = 0.0;
        for(;it != m_studentArray.end(); ++it)
        {
          sum+= it->studentHeight;
        }
        return ( sum / double(m_studentArray.size()));
     }
private:
std::vector<studentArray*> m_student;
}

//使用方式
studentArray students;
students.add(1001, "yang", 180);
students.add(1002, "zhang", 172);
double averHeight = students.averageHeight();

至于方差 公式忘了 基本也是不难求的

至于画曲线 我不太明白楼主想要的是哪种 可以很复杂 可以很简单
一种最简单的思路是 求students中最高 和 最低 的差值作为 竖坐标
学生的个数做为横坐标 并以一定的粒度统计 一定数量的人 的 一定身高
举个最简单的例子 就是每个人都是曲线上一点 横坐标就是1个人竖坐标是该人身高
作者: ypandoo    时间: 2010-7-4 18:13

补充一下:
vector只适合存放指针 而不是结构或者对象 性能很差

楼主在析构时需要手动删除没一个学生对象~
作者: cc0128    时间: 2010-7-4 18:53

posted by wap, platform: Android

话说。为啥不用数据库。。。
作者: HyperIris    时间: 2010-7-4 19:00

引用:
原帖由 猫猫猫 于 2010-7-4 18:07 发表


for 里面的 i 用在哪里?
代码里写了,提交帖子好像被系统给删掉了,233

顺便回楼上某些贴,lz这意思看起来也就是鼓捣个作业之类的罢了,至于搬出什么溢出吗,那索性用大数计算好了,有现成的也可以自己写,1024位够不够啊?
还有什么vector的性能,你研究过vector下面的内存管理吗?就lz这么点数据,提前给vector reserve 10w个元素,以后push_back几天才能重分配几次内存?
作者: ypandoo    时间: 2010-7-4 19:59

回ls 我说的是vector直接存取对象的性能, vector存取每一个对象都会调用对象的拷贝构造函数 我并没有搬出溢出之类的。。请ls不用动肝火。。
作者: HyperIris    时间: 2010-7-4 21:27

引用:
原帖由 ypandoo 于 2010-7-4 19:59 发表
回ls 我说的是vector直接存取对象的性能, vector存取每一个对象都会调用对象的拷贝构造函数 我并没有搬出溢出之类的。。请ls不用动肝火。。
说溢出是在你楼上的,

另外对于first class数据类型,并不存在过高的性能瓶颈,编译器实际生成的只是个memcpy,要避免拷贝构造函数调用也很容易,在vector里面保存对象指针即可。为了避免内存碎片还可以用mem pool。
这种话题要说细了,比如说用std::list 代替std::vector,虽然某种程度上是轻松了(避免了vector内部的mem扩容操作),但是内存使用会每个对象增大至少4个字节,要是保存数百万节点,浪费非常可观。

当然这些我想对于lz完全没有任何意义。
最简单的解决办法,fopen fwrite fclose往硬盘上存就是了。求什么平均的时候从硬盘读取计算就是了。听起来慢,实际上也就几秒。
作者: lijgame    时间: 2010-7-4 21:41

引用:
原帖由 ypandoo 于 2010-7-4 19:59 发表
回ls 我说的是vector直接存取对象的性能, vector存取每一个对象都会调用对象的拷贝构造函数 我并没有搬出溢出之类的。。请ls不用动肝火。。
除非用指针,否则所有容器直接存取对象都有你说的这个问题,和vector有什么关系。。。

当然vector扩容的时候有可能会有内存拷贝的开销,但这一般情况下基本可以忽视
作者: shixn    时间: 2010-7-4 23:53

其实就是个采集办卡的通讯软件,数据量大概是每秒40000字节,连续工作起码要5个小时以上,如果连续24小时不出问题就很理想了……
俺电脑是i3的CPU,内存4G,500G硬盘。。。会出问题么?

俺编程是业余,没系统的学过,遇到问题现google。。。各位能不能推荐本书给我?就是讲这方面知识的,俺目前只有孙鑫和侯捷的2本入门神书……

[ 本帖最后由 shixn 于 2010-7-4 23:57 编辑 ]




欢迎光临 TGFC Lifestyle (http://bbs.tgfcer.com/) Powered by Discuz! 6.0.0