Passing 2D array Random Number Generator into main with C++ - c++

Hi guys I'm very new to C++ and was wondering if you guys could help me. Right now I'm just going by the book and what the teacher told me to do so some of the stuff might look different.
What I want to do is have my void random generator put numbers into my 2D array and then it goes into main. Then I have it pass through into my display function but for some reason I can't get it work right. Can you guys help me out?
edit: Ok I figured that it has something to do with my random number generator not putting the numbers into the array but not sure why. Since my number generator works find with 1D Array.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
//Globral Varaibles Must be on top
const int max = 100;
const int min = 1;
const int COL = 4;
const int Rows = 3;
//Functions
void Population(int Array[][COL], int size);
void Show(const int Array[][COL], int max);
int main()
{
int a[3][4];
Population(a, Rows);
Show(a, Rows);
}
void Population( int Array[][COL], int size)
{
for (int index = 0; index < Rows; index++)
{
for (int Count = 0; Count < COL; Count++)
{
unsigned seed = time(0);
Array[index][Count] = (rand() % (max - min + 1)) + min;
}
}
}
void Show(const int a[][COL], int Rows)
{
for (int i = 0; i < Rows; i++)
{
for (int J = 0; J < COL; J++)
{
cout << setw(4) << a[i][J] << endl;
}
}
cout << endl;
cout << endl;
}

You seem to be seeding your random number generator every time you enter your second for loop in population(). You should only seed a random number generator once in a program, near the beginning.
Try removing your seed line from population() and instead using
srand(time(NULL));
at the beginning of your main()

AH, I figured out the problem. I had been mistaking what was being showing as one giant column instead of it being divided into rows and columns.
I had to have a small space after the a[i][J] part so that it could be divided into rows and columns.
cout << setw(4) << a[a][J] << " ";
That_Knight_Guy thanks for the suggestion. Now my generator finally puts out random numbers.

Related

Create a 10x10 matrix filled with random integers from 1 - 99 using functions (C++)

I am writing some code that has 2 functions. The first function I believe has no problems. The first one is to create the 10x10 matrix filled with random numbers, the second function is to print the matrix. The problem that I am having is that even with the declaration of the row and column sizes, the matrix prints out in one line and not in a grid-like shape. I have tried to use the setw to end the line when the limit reaches 10. I am new to programming so I am not sure why the array is not printing the way it should.
This is the code I have:
#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>
using namespace std;
const int ROW_SIZE = 10;
const int COLUMN_SIZE = 10;
void initialize(int [][10], int, int);
void display(int matrix[][10], int, int);
int main() {
int matrix [ROW_SIZE][COLUMN_SIZE];
initialize(matrix, ROW_SIZE, COLUMN_SIZE);
display(matrix, ROW_SIZE,COLUMN_SIZE);
return 0;
}
//question 1
void initialize(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for (int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
matrix[i][j] = 1 + rand() % 99;
}
}
}
//question 2
void display(int matrix[][COLUMN_SIZE], int ROW_SIZE, int COLUMN_SIZE){
for(int i = 0; i < ROW_SIZE; i++){
for(int j = 0; j < COLUMN_SIZE; j++){
cout<< setw(4)<<matrix[i][j]<< " ";
}
}
cout<< endl;
}
The problem is that you're not ever printing an end of line character. Setw(n) will tell cout that every chunk of text that you write has to be printed using exactly n characters, but it doesn't say that that chunk of text has to end in a newline.
To make sure that there's a new line after every row of your matrix, you could write cout << endl, or cout << '\n' (a fancy character meaning "start a new line") after printing each row. Both of which explicitly tell the computer to add a new line.

for looping index of arrays?

I want to output my histogram using the fewest amount of for loops possible
int* histogram(int size, int* arr)
{
int bin[10] = {};
for (int i = 0; i < size; i++)
{
if (arr[i] >= 0 && arr[i] < 10)
{
bin[0]++;
}
else if (arr[i] >= 10 && arr[i] < 20)
{
bin[1]++;
}
return bin;
}
Currently I am outputting the histogram like this:
cout << "0|";
for (int j = 0; j < bin[0]; j++)
cout << "*";
cout << endl;
But this is long and annoying. Is there a way to achieve the same output in fewer
for loops?
I am going to ignore the bugs in your histogram code, as it isn't really relevant to the question of optimising histogram output.
For information on the bug (returning a local variable), check out this Stack Overflow question.
Also, you are missing a curly brace. Always check that your code compiles and runs in its most minimalist form before posting it.
You state that the problem is that the method you use is "long and annoying", but it isn't clear if you are referring to the design of your code or the speed at which it performs.
Performance
The fastest you can possibly read the histogram is with O(n), where n is the number of bins in the histogram. In this sense your code is about as fast as it can get without micro-optimising it.
If you include the printing out of your histogram, then you have O(n*m), where m is the average number of entries per bin.
Writing a histogram is also O(n*k), where k is the number of entries in your array, because you have to figure out which bin each value belongs in.
Design
If the problem you have is that the code is bloated and unwieldy, then use less magic numbers and add more arguments to the function, like this:
#include <iostream>
void histogram(int const size, int const * const arr, unsigned int const number_of_bins, float const bin_min, float const bin_max, int * output)
{
float const binsize = (bin_max - bin_min)/number_of_bins;
for (int i = 0; i < size; i++)
{
for(int j = 0; j < number_of_bins; ++j)
{
if (arr[i] >= bin_min + binsize*j && arr[i] < bin_min + binsize*(j+1))
{
output[j]++;
}
}
}
}
int main(){
int const number_of_bins = 10;
float const bin_min = 0;
float const bin_max = 100;
int const size = 20;
int const array[size] = {5,6,20,40,44,50,110,6,-1,51,55,56,20,50,60,80,81,0,32,3};
int bin[number_of_bins] = {};
histogram(size, array, number_of_bins, bin_min, bin_max, bin);
for(int i = 0; i < number_of_bins; ++i)
{
std::cout << i << "|";
for (int j = 0; j < bin[i]; j++)
{
std::cout << "*";
}
std::cout << std::endl;
}
}
Compiled with:
g++ main.cc -o Output
Output:
0|*****
1|
2|**
3|*
4|**
5|*****
6|*
7|
8|**
9|
(Bonus, your bugs are fixed)
First of all your program is incorrect since, as pointed out, you return a pointer to a local variable form a function. To correct this you should use either std::array<Type, Size> or std::vector<Type>.
Regarding your question if you want short and compact code try this:
#include <string>
#include <algorithm>
#include <iostream>
#include <array>
std::array<int, 10> bin;
// Fill your array here
int i = 0;
std::for_each(bin.begin(), bin.end(), [&i](auto x)
{
std::cout << i++ << "|" << std::string(x, '*') << std::endl;
});
This code takes advantage of fill constructor of std::string which avoids your for cycle. But since you want to iterate through the array you need to do it in one way or the other. Either by an explicit for or by calling another function.
Note: this code is less efficient than a standard for loop but your question is how to avoid these.

Trying to get user data in an array

OK I'm still a beginner, and i have alot to learn. Still in my first programming class and was wondering if i could get some help on an assignmet. I DON'T WANT YOU TO DO IT FOR ME just some help. I'm supposed to making a lottery type game using arrays and functions. Here's what i have so far:
#include<iostream>
#include<random>
#include<ctime>
using namespace std;
void getPlayersNumbers(int playerArray[], int size);
void getComputersNumbers(int computerArray[], int size);
bool WinningNumber(int playerArray[], int computerArray[], int size);
int main() {
const int SIZE = 5;
int userNumbers[SIZE];
int computerNumbers[SIZE];
getComputersNumbers(computerNumbers, SIZE);
return 0;
}
void getPlayersNumbers(int playerArray[], int size) {
int playersNumbers;
cout << "Please enter 5 numbers for a chance to win!!\n";
for (int i = 0; i < size; i++) {
cin >> ???
}
}
void getComputersNumbers(int computerArray[], int size) {
mt19937 randomGenerator(time(0));
uniform_int_distribution<int> randomNumbers(1, 5);
int computerNumbers;
for (int i = 0; i < size; i++) {
computerNumbers = randomNumbers(randomGenerator);
computerArray[i] = computerNumbers;
cout << computerNumbers << " ";
}
cout << endl;
}
bool winningNumbers(int playerArray[], int computerArray[], int size) {
}
My getComputerNumbers function is working just fine. The one I'm having trouble with is my getPlayerNumbers function. How would i go about getting the uses numbers from them, and keeping them so when i call the function i can compare them to the random numbers in my getComputerNumbers function? Now i already know how I'm going to go about comparing the numbers. That's what my that third function winningNumbers is for. I just Need help with the getPlayersNumbers.
Also if you see anything else that i can do to make this code better let me know.
Thanks again!!
If you want to store user's number into an array:
for (int i = 0; i < size; i++) {
cin >> userNumbers[i]
}
when you want to access a particular number out of the five, you use:
userNumbers[n], where n ranges from 0 to 4
Just do:
void getPlayersNumbers(int* playerArray, int size)
{
cout << "Please enter 5 numbers for a chance to win!!\n";
for (int i = 0; i < size; i++) {
cin >> playerArray [i];
}
}
Thanks to #user4581301 for pointing out a better solution using std::vector
std::vector getPlayersNumbers(int size)
{
std::vector myNumberList;
cout << "Please enter 5 numbers for a chance to win!!\n";
for (int i = 0; i < size; i++) {
int number;
cin >> number;
myNumberList.push_back (number);
}
return myNumberList;
}
STL makes working with arrays a whole lot easier and also it provides additional functions that are optimized for their use case

Populating a two dimensional vector C++

I'm working on a project for school to create a minesweeper game.
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
int mines;
int rows;
int columns;
vector<vector<int> > mineField;
int main() {
cout << "Input number of rows: ";
cin >> rows;
cout << "Input number of columns: ";
cin >> columns;
cout << "Input number of mines: ";
cin >> mines;
int mine = 0;
int num_of_mines = 0;
vector<int> temp;
while(num_of_mines < mines){
mine = rand()%(rows * mines);
if(mineField[mine][mine] != 1){
temp.push_back(1);
mineField.push_back(temp);
num_of_mines++;
}
}
return 0;
}
What i'm trying to do here is populate the minefield using a two dimensional vector and then trying to output it to see if the mines were randomly allocated. (1 <=> mines); but this keeps giving me an error.
Thank you so much for any help!
As others have stated, your problem is that you don't properly allocate your mineField matrix. Easiest would be to add
for (int i = 0; i < rows; ++i) {
mineField.push_back(vector<int>(columns, 0)); // init everything to zeroes
}
Now you can populate the mine field with mines. Some pointers on generating mines: at the moment you only randomize one coordinate, but you should randomize two. Also, I'm not entirely sure why you need to multiply by mines. I would do something like:
while (num_of_mines < mines) {
minex = rand() % columns;
miney = rand() % rows;
if (mineField[minex][miney] != 1)
...
Your if statement looks after something that does not exist because of the way mine is computed (you look after the size of the matrix not after the size of a line and a column)
(you do not correctly init the minefield and do not use columns)

Sorting my 2d array in c++

My homework program has to write random numbers for arrival time and burst time into a file. Then after they are written, it reads the file and sorts the contents.
I figured setting up a 2d array would be the easiest way for me to go about this. But I am unsure on how to implement my sort so that if an arrival time swaps places then burst time of that arrival goes along for the ride.
I feel like I worded that poorly, but a basic example would be:
array[3][10] > array[2][23]
So since second array has an earlier arrival time I need both its arrival 2 and its burst 23 to move before array[3][10], but I need this do that and compare 100 inputs.
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <fstream>
const int max = 100;
using namespace std;
int main()
{
multimap<int [][]> myMap;
int randomBurst[max];
int arrivalTime[max];
int line[max][2];
int first = 0;
for (int i = 0; i < 100; i++)
{
if (i < 100)
{
ofstream write("Schedule.txt", ios::app);
randomBurst[i] = rand() % 1000;
arrivalTime[i] = rand() % 1000;
write << arrivalTime[i] << " " << randomBurst[i] << endl;
}
}
ifstream read("Schedule.txt");
for (int i = 0; i <= max; i++)
{
for (int j = 0; j < 2; j++)
{
read >> line[i][j];
cout << line[i][j] << " " ;
}
cout << endl;
}
cout << endl;
cout << endl;
for (int i = 0; i <= max; i++)
{
for (int j = 0; j < 2; j++)
{
myMap.insert(pair<int[][]>(line[i][j]);
}
cout << endl;
}
system("pause");
return 0;
}
My code sets up my array correctly after it reads the written file content, but I'm kind of lost what I should implement for a sort.
Well coming forward with this, mainly left that comment to be able to find this question faster on my laptop.
Like I said in the comment, if you want a presorted, by key value 2D "array", the quickest manner in which you could do this is with the map container., and if you really need the internal points to be ordered, and you will be using multiple entries within it, lets say entries 2,30 2,12 ... You could either build a map of vectors, or arrays, or use a Multimap. Not too sure of this data structure, as I have never really had a reason to use it as of yet. Referenced here http://www.cplusplus.com/reference/map/multimap/
The above will provide you with the sorting done for you, and the reason why I recommended a vector is the lack of order within it, and not sure if the 'bursts?' are to be ordered as well.
EDIT:
Forgot to mention, that a map will not hold more than one key of any given value, so if you are, again, inputting multiple points a above, then you will. if implementing things as you were before, overwrite things.
EDIT:
So this is more or less the fix I think I have, but you are working around this in a very indirect manner, that is hard to follow honestly.
#include <map>
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <fstream>
using namespace std;
const int MAX = 100;
int main()
{
multimap<int,int> myMap;
int randomBurst[100];
int arrivalTime[100];
int line[100][2];
int first = 0;
for (int i = 0; i < 100; i++)
{
if (i < 100)
{
ofstream write("Schedule.txt", ios::app);
randomBurst[i] = rand() % 1000;
arrivalTime[i] = rand() % 1000;
write << arrivalTime[i] << " " << randomBurst[i] << endl;
}
}
ifstream read("Schedule.txt");
for (int i = 0; i <= 100; i++)
{
for (int j = 0; j < 2; j++)
{
read >> line[i][j];
cout << line[i][j] << " " ;
}
cout << endl;
}
// cout << endl;
// cout << endl;
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 2; j++)
{
//Attain the value in the index, and the held value within it.
myMap.insert(pair<int, int> (line[i][j], line[i][j]));
}
cout << endl;
}
// system("pause");
return 0;
This fixes the insertion point, just because you give it an array it does not mean that the program will take that as a pair, as the first index is a point to another array in itself. And so on. I recommend starting off wiht a map object instead, as the multimap makes things a bit annoying, if you are familiar with the vector containers then use that instead within the map to log multiple values.