如何用C++或C编写求MAX,MIN,平均值,均方差
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用C++或C编写求MAX,MIN,平均值,均方差相关的知识,希望对你有一定的参考价值。
连续输入若干个双精度浮点数,数与数之间以逗号隔开,输出最大值、最小值、平均值和均方差,输入数据个数最少2个,不设上限,计算平均数精度保留到小数点后4位。输入-3.2,0.2,5.6,-8,7.2,则输出最小值为-8,最大值为7.2,平均值为0.3600,均方差为…;输入-6.2,0.3,-6.8,0.78,5.32,4.2,0.01,则输出最小值为-6.2,最大值为5.32,平均值为-0.3414,均方差为…
参考技术A #include <iostream>#include <vector>
#include <iterator>
#include <algorithm>
#include <math.h>
using namespace std;
typedef double DataType;
typedef vector<DataType> DataList;
DataType Average(DataList const & data_list)
size_t n;
DataType sum;
DataList::const_iterator ite = data_list.begin();
if ( ite == data_list.end() ) return (DataType) 0;
n = data_list.size();
for (sum = *ite++; ite != data_list.end(); ite++)
sum += * ite;
return sum / n;
DataType StdDev(DataList const & data_list)
size_t n;
DataType avg, var, diff;
DataList::const_iterator ite = data_list.begin();
if ( ite == data_list.end() ) return (DataType) 0;
n = data_list.size();
avg = Average(data_list);
var = 0;
for (;ite != data_list.end(); ite++)
diff = *ite - avg;
var += diff * diff;
return sqrt(var/n);
int main(int argc, char **argv)
DataList data_list;
DataType min=0, max=0, avg=0, dev=0, ele;
while ( cin.good() && cin.peek() != '\n')
cin >> ele; data_list.push_back(ele);
min = *min_element(data_list.begin(), data_list.end());
max = *max_element(data_list.begin(), data_list.end());
avg = Average(data_list);
dev = StdDev(data_list);
cout.precision(4);
cout.setf(ios::fixed, ios::floatfield);
cout << "Min: " << min << endl
<< "Max: " << max << endl
<< "Average: " << avg << endl
<< "Standard deviation: " << dev << endl;
cout.unsetf(ios::floatfield);
return 0;
如何用 C++ 编写多个 GetAsyncKeyState
【中文标题】如何用 C++ 编写多个 GetAsyncKeyState【英文标题】:How do I write multiple GetAsyncKeyState with C++ 【发布时间】:2014-08-15 08:52:07 【问题描述】:我的问题是我在哪里可以添加这行代码:
if( GetKeyState(VK_F2) & 0x8000 )
我尝试了不同的方法,但是当我编译并运行它并按 F1 或 F2 键时,它会执行所有功能。我想在按下键时调用 F1 键功能,在按下键时调用 F2 键。我正在使用 Visual Studio 2010 Express。
这是我的代码:
switch(uMsg)
case WM_INITDIALOG:
// do something here
break;
case WM_TIMER:
if( GetKeyState(VK_F1) & 0x8000 )
if( GetKeyState(VK_F2) & 0x8000 )
// do something here
break;
case WM_CLOSE:
// do something here
return 0;
【问题讨论】:
我认为在你的情况下,当你想在按下一个键时做某事,或者在按下另一个键时做另一件事,你应该使用GetKeyState
函数。另请注意,此评论包含如何操作的提示。
【参考方案1】:
已解决:) 我的问题在尝试了一段时间后终于解决了,我终于明白了 是那个小小的“休息”吗?声明请看代码它的工作完美无缺。 非常感谢您的宝贵时间和帮助
case WM_TIMER:
if(GetKeyState(VK_F1) & 0x8000 )
MessageBoxA (NULL, TEXT ("This is a call from F1 key!"), TEXT("Test F1 key"), MB_OK );
//break; << this was the one that was giving me the problem
if(GetKeyState(VK_F2) & 0x8000 )
MessageBoxA (NULL, TEXT ("This is a call from F2 key!"), TEXT("Test F2 key"), MB_OK );
//if(GetKeyState(VK_F3) & 0x8000 ) << i can add multi VK_ keys here
break; // << should be here
case WM_CLOSE:
【讨论】:
【参考方案2】:几点:
-
您确定要这样投票吗?也许您想在用户按下这些键(例如 WM_KEYDOWN)而不是定期轮询时响应通知?如果您在
WM_TIMER
s 之间按下并释放 F1,您的代码很容易错过。
正如 Joachim Pileborg 所说,您可能应该使用 GetKeyState
。 GetAsyncKeyState
作用于调用时的键盘状态; GetKeyState
作用于当前消息发送时的键盘状态。这往往会使事情更紧密地同步。也就是说,如果您在 WM_TIMER
进行投票,那可能没那么重要。
您只是检查返回值是否非零,这不是该函数的工作方式。返回值是一个位掩码。来自文档:
如果高位为1,则key为down;否则,它就起来了。
如果低位为 1,则键被切换。一个键,如 CAPS LOCK 键,如果打开,它会被切换。如果低位为 0,则该键处于关闭状态且未切换。切换键时键盘上的切换键指示灯(如果有)将亮起,当键未切换时熄灭。
因此,要检查 F1:
if( GetKeyState(VK_F1) & 0x8000 )
...
【讨论】:
我不知道,如果(GetKeyState(VK_F2)和0x8000)我应该在哪里写下一个代码,因为你知道我是编程语言的新手,谢谢你的帮助和时间感谢 您需要扎实的编程语言基础才能充分利用本网站。如果您不理解答案,那么发布问题没有多大意义。您的问题不在于检查是否按下了按键,而在于基本 C++ 语法。 除了别人说的,看看GetKeyboardState(),这样就可以同时查看多个按键的状态,而不必进行多个函数调用。 谢谢您,先生,我正在考虑如何只制作一个函数而不是多个函数调用可能需要一些时间:) 但无论如何我都渴望学习它感谢您的帮助和时间谢谢您以上是关于如何用C++或C编写求MAX,MIN,平均值,均方差的主要内容,如果未能解决你的问题,请参考以下文章