[英]Array Classes - Get Largest and Smallest Value
我真的很想解決這個問題。
如果有人可以將我推向正確的方向。 我將非常感謝
以下是我的代碼
平地機
#ifndef GRADER_H
#define GRADER_H
#define MAXSIZE 100
#include <iostream>
#include <cstdlib>
class Grader {
public:
Grader( );
void addScore( int score );
void addScores( int scores[], int size );
void clear();
int findBiggest( ) const;
int findSmallest( ) const;
private:
int my_Values[ MAXSIZE ];
int my_ValuesSeenSoFar;
};
#endif
評分器
#include <iostream>
#define MAXSIZE 100
#include "Grader.h"
Grader::Grader( ){
my_Values [MAXSIZE] = 0;
my_ValuesSeenSoFar = 0;
}
void Grader::addScore( int score ){
my_Values[MAXSIZE] = score;
}
void Grader::addScores( int scores[], int size ){
my_Values[MAXSIZE] = scores[size];
}
void Grader::clear(){
my_Values[0];
}
int Grader::findBiggest() const{
int i;
for (i = 0; i < MAXSIZE; i++)
return my_Values[i];
}
int Grader::findSmallest( ) const{
}
驅動程序
#include <iostream>
#include "Grader.h"
using namespace std;
int main( )
{
Grader g;
double d[5]= {99,70,85,93,84};
double e[4]= {100,81,60,91};
g.addScore( 75 );
g.addScore( 82);
g.addScores( d, 5 );
cout << "Best Score = " << g.findBiggest( ) << endl;
/// should give value 99
cout << "Worst Score = " << g.findSmallest( ) << endl;
/// should give value 70
g.clear( );
g.addScore( 50 );
g.addScore( 74 );
g.addScores( e, 4 );
cout << "Best Score = " << g.findBiggest( ) << endl;
/// should give value 100
cout << "Worst Score = " << g.findSmallest( ) << endl;
/// should give value 50
}
我在弄清楚a)時遇到了麻煩
b)如何將這些分數稱為findBiggest和findSmallest。
您的代碼有很多問題:
my_Values [MAXSIZE] = 0;
在構造函數中寫一個超出數組最大索引的值。 MAXSIZE
用作索引,因為index從0
到MAXSIZE - 1
。 addScores
一樣將數組添加到另一個數組。 使用標准庫提供的功能(請參見此處以獲得良好的參考站點 )確實會為您現在和將來提供幫助。
將來,無論何時考慮任何類型的動態數組,都應該考慮std::vector
。
例如,向向量添加值就很簡單
std::vector<int> vector;
vector.push_back(123);
要插入一個老式數組,就像您想在addScores
函數中那樣,可以將std::copy
與std::back_inserter
一起使用:
std::copy(array, array + size, std::back_inserter(vector));
為了使向量保持排序,請使用std::sort
標准函數:
std::sort(std::begin(vector), std::end(vector));
這是問題所在:
void Grader::addScore( int score ){
my_Values[MAXSIZE] = score; <---
}
您總是在添加第MAXSIZE個元素(這並不明智) 。 您需要執行以下操作:
void Grader::addScore( int score ){
my_Values[myValuesSoFar++] = score;
}
至於最大和最小,您可以在addScore()
和addScores()
上使用qsort 。 這樣,最小的元素將位於my_values[0]
,最大的元素將位於my_values[myValuesSoFar-1]
。
另外,您的代碼還有很多問題(只需看::clear()
)。 我推薦這篇有關使用數組的文章 ,或嘗試std::vector
a /如何使用一個實例變量來指示數組的當前索引。 添加n個元素時,將其遞增n;移除n個元素時,將其遞減n。
b /兩種選擇:
一世。 每次調用此方法時,都要遍歷所有元素並獲得最小值/最大值。 如果最大數組大小不太大,則確定。
ii。 每次添加或刪除值時,都會迭代所有元素並設置全局變量min / max,然后可以在調用findSmallest()和findBiggest()時返回該變量
我覺得grader.cpp應該看起來像這樣。 用於查找最大值和最小值而不進行排序
#include <iostream>
#define MAXSIZE 100
#include "Grader.h"
Grader::Grader( ){
my_Values [MAXSIZE] = 0;
my_ValuesSeenSoFar = 0;
}
void Grader::addScore( int score ){
if( my_ValuesSeenSoFar < MAX_SIZE)
my_Values[my_ValuesSeenSoFar++] = score;
}
void Grader::addScores( int scores[], int size ){
for(int i=0; (i < size) && (my_ValuesSeenSoFar < MAX_SIZE) ; i++)
my_Values[my_ValuesSeenSoFar++] = scores[i];
}
void Grader::clear(){
for(int i=0; i < MAX_SIZE ; i++)
my_Values[i] = 0;
}
int Grader::findBiggest() const{
int max = my_Values[0];
for(int i=1 i < my_ValuesSeenSoFar ; i++)
{
if( my_Values[i] > max)
max = my_Values[i];
}
return max;
}
int Grader::findSmallest( ) const{
int min = my_Values[0];
for(int i=1 i < my_ValuesSeenSoFar ; i++)
{
if( my_Values[i] < min )
min = my_Values[i];
}
return min;
}
您需要一個變量來顯示my_Values中有多少個元素。 假設
private:
int my_Values[ MAXSIZE ];
int my_ValuesSeenSoFar;
int my_size;
Grader::Grader( ){
my_Values [MAXSIZE] = 0; //here you put 0 out of array (to array.size+1 place). delete it
my_ValuesSeenSoFar = 0;
my_size = 0;
}
void Grader::addScore( int score ){
if (my_size < MAXSIZE )
my_Values[my_size] = score; //put new element on next place
++my_size;
else
std::cout<<"No more place in array";
}
void Grader::addScores( int scores[], int size ){
int i =0;
while (my_size < MAXSIZE && i<size)
{
my_Values[my_size] = scores[i];
++my_size;
++i;
}
if (my_size == MAXSIZE && i==size)
std::cout<<"no more place in array";
}
int Grader::findBiggest() const{
int i;
int max=my_Values[0];
for (i = 0; i < my_size; i++) //finding max element in array
{
if(my_Values[i]>max)
max = my_Values[i];
}
return max;
}
int Grader::findSmallest( ) const{
int i;
int min=my_Values[0];
for (i = 0; i < my_size; i++) //finding min element in array
{
if(my_Values[i]<min)
min = my_Values[i];
}
return min;
}
如果我提出正確的問題,類似的事情。
要回答您的確切問題,可以使用std::minmax_element
(在C ++ 11中)獲取數組的最大和最小值:
#include <algorithm>
#include <iostream>
int main()
{
double d[] = { 99, 70, 85, 93, 84 };
auto result = std::minmax_element( std::begin( d ), std::end( d ) );
std::cout << "minimum: " << *(result.first) << "\n"
<< "maximum: " << *(result.second) << "\n";
}
打印:
minimum: 70
maximum: 99
作為參考,下面是一個完整的實現:
#include <vector>
#include <iterator>
#include <algorithm>
class Grader {
std::vector<int> scores_;
public:
void addScore(int score) {
scores_.push_back(score);
}
void addScores(int *scores, int nscores) {
std::copy(scores, scores + nscores,
std::back_inserter(scores_));
}
void clear() { scores_.clear(); }
int findBiggest() const {
if (scores_.empty()) return -1; // handle this error somehow
return *std::max_element(scores_.begin(),
scores_.end());
}
int findSmallest() const {
if (scores_.empty()) return -1; // handle this error somehow
return *std::min_element(scores_.begin(),
scores_.end());
}
};
請注意,我並沒有在得分排序findBiggest
或findBiggest
因為他們聲明為const。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.