2016-05-02 2 views
3

получил домашнее задание, чтобы произвести программу, которая загружает и отображает двойной точности случайных чисел с размером массива 20. я знаю его неаккуратно, но не хорошо на этомдвойной точности случайных чисел массив

#include <iostream> //required for cin, cout, endl 
#include <cstdlib> //required for setw(), setfill() 
#include <iomanip> 

using namespace std; 


void printArray(int arr[]); 
void fillRandArray(int arr[]); 
void fillDecimalArray(double dArr[]); 
void printDecimalArray (double dArr[]); 

int main() 
{ 

    int random[21]; 
    double decimal[21]; 
    rand(); 

    fillRandArray(random); 
    fillDecimalArray(decimal); 
    printArray(random); 
    printDecimalArray(decimal); 


    cin.get(); 
    cin.get(); 
    return 0; 
} 

void fillRandArray(int arr[]) 
{ 
    for (int i = 1; i < 21; i++) 
    { 
     arr[i] = rand() % 100 + 1; 
    } 

}//end load of rand array 

void fillDecimalArray(double dArr[ ]) 
{ 
    for (double i = 1; i <21; i++) 
    { 
     dArr[i] = static_cast<double>(rand()%100)/10; 
    } 
} 

void printArray(int arr[]) 
{ 
    cout << "   5x4 Array" <<endl; 
    cout <<endl; 

    int cols = 5; 

    for(int i = 1; i < 21; i++) 
    { 
     cout << setw(5) << setfill(' '); 
     cout << arr[i]; 
     if(i%cols == 0) 
      cout << endl; 
    }//end print array 

}//end of printArray() 

void printDecimalArray (double dArr[]) 
{ 
    int cols = 4; 

    for (double i = 1; i <21; i++) 
    { 
     cout << setw(5) << setfill(' '); 
     int precision = 2; 
     cout << dArr[i]; 
     cout << endl; 
    } 
} 

потребности, которые будут отображаться в 4x5 таблице ошибки «недопустимые типы„двойной * [двойные]“для массива подстрочного»

ответ

1
for (double i = 1; i <21; i++) 
{ 
    dArr[i] = static_cast<double>(rand()%100)/10; 

Вы не можете получить доступ в массив с двойным (т.е. dArr[i] является недействительным, поскольку я не целочисленный тип - это значение с плавающей запятой двойной точности), должен быть интегральным типом. Просто сделайте i int, и вы будете хороши.

Это означает, что ваши петли с 1-20 вместо 0-19 будут работать (поскольку вы делаете свои массивы 1 слишком большим), но вы не должны этого делать. Привыкайте к написанию

for (int i = 0; i < size_of_array; i++) 

, а затем просто выделить массив нужного размера (в вашем примере здесь, 20 вместо 21)

+0

принял ваш совет, и теперь он компилирует, что отлично, но десятичный массив имеет диапазон .1-1.0, начиная с 1.00-100.00 любые идеи? –

+0

царапины, что, понял, но моя двойная точность не работает –

+0

Это странно. Я бы ожидал 'dArr [i] = static_cast (rand()% 100)/10;', чтобы дать значения 0 - 9.9 - значения вашего двойника будут двойным представлением целых чисел от 0 до 99, а затем вы разделите это на 10 - так 0-9.9. То, что люди часто делают, - это сбрасывать rand(), чтобы удвоить, делить это на RAND_MAX, а затем умножить этот результат (убедитесь, что вы делаете это в правильном порядке или получаете переполнение) на желаемый максимальный диапазон. Таким образом, вы получаете двойное равномерно распределенное по диапазону 0-1, а затем умножаете его на 100 или независимо от максимального значения. – xaxxon

4

C++ 11 года, вы можете использовать std::uniform_real_distribution

#include <random> 
... 
std::random_device rd; 
std::mt19937 gen(rd()); 
const double min_v = 1.0, max_v = 100.0; 
std::uniform_real_distribution<> dis(min_v, max_v); 
for (int n = 0; n < 20; ++n) { 
//   ^^^^ 
    dArr[n] = dis(gen); 
} 

Link to example

Если вы используете петлю в диапазоне (1-20), используйте cout << arr[i-1]; или использовать цикл в диапазоне (0-19) и изменить условие if((i + 1) % cols == 0) ...


Если вы должны использовать rand() генерировать эти цифры, вы можете использовать:

dArr[n] = 1 + (rand() % 99) + static_cast<double>(rand() % 101)/100.0; 
// Expression       Range 
// [1] rand() % 99     0 - 98 
// [2] 1 + (rand() % 99)    1 - 99 
// [3] rand() % 101     0 - 100 
// [4] (rand() % 101)/100.0   0.00 - 1.00 
// [5] [2] + [4]      1.00 - 100.0 

Но мы предупреждали, что:

  1. распределение случайных чисел, сгенерированных с использованием любых таких выражений, является неоднородным.
  2. Всегда используйте std::srand с переменной (возможно std::time(0)), чтобы получить различный вывод при многократном выполнении того же двоичного кода.
Смежные вопросы