Randomizing/Modifing Arrays - c++

So I'm trying to randomize an array of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Then ask for the user to select a position in the array, and modify it. After that, it should display the number the user entered for all of the 10 values. Finally, it will need to get the original array that was randomized and reverse it.
So far, I have this
#include <iostream>
using namespace std;
int array [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int rarray [10];
int main() {
cout << "Random Array = ";
for (int i = 0; i < 10; i++) {
int index = rand() % 10;
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
for (int i = 1; i <= 10; i++) {
cout << array[i] << " "; //somehow, this display needs to be entered into another array
}
system("PAUSE");
}
But as stated in the comment, I'm stuck on as how to do this.

You can accomplish this by using std::shuffle, std::copy, and std::reverse from the C++ Standard Library.
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int position;
// Get the position to modify and make sure it's within our bounds.
do
{
cout << "Select a position: ";
}
while (!(cin >> position) || position < 0 || position > 9);
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int rarray[10];
// Shuffle the array. We use std::begin and std::end to get the bounds of
// of the array instead of guessing it's size.
std::random_shuffle(std::begin(array), std::end(array));
// Copy it to the new array
std::copy(std::begin(array), std::end(array), rarray);
// Modify the new array and display it. Add your own code here to get the
// value it is modified with.
rarray[position] = 100;
for (auto value : rarray)
cout << value << " ";
cout << endl;
// Reverse the original array and display it
std::reverse(std::begin(array), std::end(array));
for (auto value : array)
cout << value << " ";
cout << endl;
system("PAUSE");
}
or if you are not allowed to use the C++ Standard Library you will need to handle everything manually. This is a tedious task but a great example of why the C++ Standard Library should be leveraged whenever possible. This is also more prone to errors, more difficult to maintain, and ugly to look at.
int main()
{
int position;
do
{
cout << "Select a position: ";
} while (!(cin >> position) || position < 0 || position > 9);
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < 10; i++)
{
int index = rand() % 10;
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
// Copy the array
int rarray[10];
for (int i = 0; i < 10; i++)
{
rarray[i] = array[i];
}
// Modify the new array and display it
rarray[position] = 100;
for (int i = 0; i < 10; i++)
{
cout << rarray[i] << " ";
}
cout << endl;
// Reverse the old array and display it
for (int i = 0; i < 10 / 2; i++)
{
int tmp = array[i];
array[i] = array[9 - i];
array[9 - i] = tmp;
}
for (int i = 0; i < 10; i++)
{
cout << array[i] << " ";
}
cout << endl;
system("PAUSE");
}
Both implementations are close to your original request but you may need to expand on it a little to match your requirements exactly. They should get you moving along nicely though.

Related

I need to find the longest ascending array,im kind new to c++

Example: Array{2,3,4,7,8,9,10}
I need to find the longest one:
Answer: {7,8,9,10} and write "The longest=4"
code
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int x[100],n,k=0;
cout<<"Introduceti n=";cin>>n;
cout << "Introduceti elementele tabloului:" << endl;
for(int i=0;i<n;i++){
cout<<"n["<<i<<"]=";cin>>x[i];
}
cout<<"Elementele tabloului:"<<endl;
for(int i=0;i<n;i++){
cout<<x[i]<<setw(5);
}
cout<<endl;
cout<<"Cel mai lung sir de ordonate crescator:"<<endl;
for(int i=0;i<n;i++){
if(x[i]+1==x[i+1]|| x[i]-1==x[i-1]){
cout<<x[i]<<setw(5);
k++;
}
}
cout<<endl;
cout<<"Lungimea este:"<<k;
return 0;
}
This is what i have tried,but i don't know how to determine all the possible line lenghts.
The following code works for me:
#include <iostream>
using namespace std;
int main() {
int array[] = {2, 3, 4, 7, 8, 9, 10, 12, 13};
//get the size of the array
int size = sizeof(array) / sizeof(array[0]);
//stores the number of the current streak
int longest = 1;
//stores the biggest streak
int biggest = 1;
for(int i = 1; i <= size; i++) {
if(array[i] - array[i - 1] == 1) {
longest ++;
}
else if(biggest < longest) {
biggest = longest;
longest = 1;
} else
longest = 1;
}
cout << "Longest array: " << biggest << endl;
return 0;
}
After a lot of work & thinking, I've coded the solution of your problem. Consider the following code:
#include <iostream>
int main(void)
{
int array[] = {2, 3, 4, 7, 8, 9, 10};
int size = sizeof(array) / sizeof(array[0]);
int longest = 1, streak = 1;
for (int i = 1; i < size; i++) {
if (array[i] - array[i - 1] == 1) {
streak++;
if (longest < streak) {
longest = streak;
}
} else {
streak = 1;
}
}
std::cout << "Longest array: " << longest << std::endl;
return 0;
}
The above program gets the size of the array dynamically and checks if the current iterator of array is equal to its previous value, if so, then add otherwise reset and it'll go till the last. You can add/remove arrays, it's totally flexible.
Output:
Longest array: 4
Hope it helps you!

Displaying records by integer value

I have to display the records based on the integer value in an array. For instance, if I have an array i.e.
2, 3, 5, 3, 6, 8, 10, 1, 9, 7
I would need to display 3 and 5 based on the integer 2. Then it should display 6,8 and 10 based on integer 3 and then 9 based on 1. So my display array would be:
3,5
6,8,10
9
So far, I haven't been able to form any algorithm/code.. How to proceed on this one?
tested it with your given array...
void display_records(std::vector<int> vi) {
int tmp = 0;
int index = 0;
for(int i=0;i<vi.size(); i++){
for(int j=1;j<=vi[i];j++){
index = i + j;
tmp = vi[index];
if((i+j) < vi.size()) { //to prevent it going out of range
std::cout << tmp << " " ;
}
}
i = i + vi[i];
std::cout << std::endl;
}
}
Try something like this: (i am not sure if i understood your question) (not tested)
void displayRecords(int* vect, int size, int val)
{
for(int i=0; i<size; i++)
{
if(vect[i]==val)
{
int tmp = val;
int j = i + 1;
while(tmp && j != size)
{
std::cout<<vect[j]<<" ";
j++;
tmp--;
}
break;
}
}
}

Sorting Parallel array

I have two arrays. One is of roll numbers, the other is of total marks for the roll numbers. I have to sort the roll number array in ascending order while keeping the data as it is assigned to each roll number. I have sorted the array but how do I put the marks accordingly to the roll number?
Here's the code so far.
int roll_num[5] = { 2, 4, 1, 6, 8 }, total_marks[5] = { 9, 7, 10, 8, 9 }, min=0, temp, size = 5;
for (int i = 0; i <= size; i++)
{
min = i;
for (int j = i + 1; j < size; j++)
{
if (roll_num[j] < roll_num[min])
{
min = j;
}
}
swap(roll_num[i], roll_num[min]);
}
cout << "Roll No." << " " << "Total Marks" << endl;
for (int i = 0; i < size; i++)
{
cout << roll_num[i] << " | " << total_marks[i] << endl;
}
You probably want to combine the two arrays into a std::map. Then it will be sorted and your values will be connected:
int roll_num[5] = { 2, 4, 1, 6, 8 };
int total_marks[5] = { 9, 7, 10, 8, 9 };
std::map<int, int> my_map;
for (int i=0; i < 5; ++i) {
my_map.insert(roll_num[i], total_marks[i]);
}
if you want them sorted by roll_num.
As your basic sort algorithm does work (I checked it), all you need do is add an equivalent swap call for the total_marks array. Thus, immediately after the:
swap(roll_num[i], roll_num[min]);
line, just add this:
swap(total_marks[i], total_marks[min]);
Thus, everything that is done on the roll_num array will be replicated in the total_marks array.

Finding missing numbers in an array

I am trying to create a code where given an ordered array with numbers between 1 and 10, the code returns all of the values missing.
My code is as follows:
int missingArray [] = {1, 3, 4, 5, 7, 8};
for (int i = 0; i < 11; i++) {
if (missingArray[i] == i+1) {
cout << "Continue. \n";
}
if (missingArray[i] != i+1) {
cout << "The value of " << i+1 << " is missing. \n";
}
}
I want the code to return
Continue
The value of 2 is missing
Continue
Continue
Continue
The value of 6 is missing
Continue
Continue
The value of 9 is missing
The value of 10 is missing
But instead, after I get the first "missing" element, it lists everything as missing. Anyone have any suggestions?
What is REALLY going wrong is that your initial assumption - that the value (i+1) is expected at location i - becomes invalid once a missing value is detected. If you intend to detect ALL missing values, you need to decouple the array index from the value tracking. Consider the following code:
#define NMISSWING 6
int missingArray[NMISSING] = {1, 3, 4, 5, 7, 8};
int i = 0;
for (int n=1; n<=10; n++) {
if (i >= NMISSING) break; // all array entries checked
if (missingArray[i] == n) {
cout << "Continue. \n";
i += 1; // Matched i'th, move on to next
}
else {
cout << "The value of " << n << " is missing. \n";
}
}
note that I just use 'else' instead of performing essentially the same test twice. If someone is trying to teach you to to do otherwise, feel free to tell them that my opinion as a professional programmer is that that motif strikes me as academic pedantry which should be avoided
Your code leads to undefined behavior since missingArray[i] is not valid for values of i greater than 5.
You need to change your approach a little bit.
int missingArray [] = {1, 3, 4, 5, 7, 8};
int* start = missingArray;
int* end = start + sizeof(missingArray)/sizeof(*missingArray);
for (int i = 1; i < 11; i++)
{
if ( std::find(start, end, i) == end )
{
cout << i << " is missing.\n";
}
// Optionally
else
{
cout << "Found " << i << "\n";
}
}
you check missingArray[i] == i+1
1 == 1
3 == 2
4 == 3
5 == 4
...
so after first condition 1==1 others are never equal.
int missingArray[] = { 1, 3, 4, 5, 7, 8 };
int k = 0;
for (int i = 0; i < 10; i++) {
if (missingArray[k] == i + 1) {
cout << "Continue. \n";
k++;
}
else if (missingArray[k] != i + 1) {
cout << "The value of " << i + 1 << " is missing. \n";
}
}
My approach would be to select each element of the array in turn and then iterate between one greater than that value and the next element in the array.
Then to finish off iterate between the final value and the maximim value you are seeking (11 in this case).
int missingArray [] = {1, 3, 4, 5, 7, 8};
int j = 0;
for(auto i = 0U; i < sizeof(missingArray)/sizeof(int) - 1; ++i)
for(j = missingArray[i] + 1; j < missingArray[i + 1]; ++j)
std::cout << "missing: " << j << '\n';
for(++j; j < 11; ++j)
std::cout << "missing: " << j << '\n';
Output:
missing: 2
missing: 6
missing: 9
missing: 10
As Pmar said, your initial assumption was not valid. I change the code a little bit. I hope this will help you.
#include<stdio.h>
#include <iostream>
using namespace std;
int main (){
int missingArray [] = {1, 3, 4, 5, 7, 8};
int numbers_mising = 0;
for (int i = 0; i < 10; i++) {
if (missingArray[i - numbers_mising] == i+1) {
cout << "Continue. \n";
}
if (missingArray[i - numbers_mising] != i+1) {
cout << "The value of " << i+1 << " is missing. \n" << numbers_mising << "\n";
numbers_mising++;
}
}
}
In this example, also the number two is missing. You do not need to know in advance what numbers are missing with this solution. I use a variable to keep track of the numbers missing and changing the index of the array.
you can go with this logic also this is very simplest logic for you.
Expected Output:
The value of 3 is missing.
The value of 7 is missing.
int missingArray[]={1,2,4,5,6,8};
int n=sizeof(missingArray)/sizeof(missingArray[0]);
int i=0,k=1;
while (i<n)
{
if(missingArray[i]==k)
{
i++;
k++;
}
else
{
cout<<"The value of "<<k<<" is missing. \n";
k++;
}
}
int main()
{
char array[10] = {1,2,3,4,5,6,7,7,9,10};
char i;
char i_2 = 1;
char not_ok = 1;
while(i_2 < 11){
i = 0;
while(i < 10){
if(array[i] == i_2){
not_ok = 0;
}
i++;
}
if(not_ok){
printf("Missing %d\n",i_2);
}
not_ok = 1;
i_2++;
}
return 0;
}

How do I store numbers that matches in an array?

I want to add the index of arrayOfNumbers that matched to numToMatch to an array. Not sure how to go about this. I'm new to C++. Any help would be appreciated ty.
int numToMatch[4] = {1,2,3,4};
int arrayOfNumbers[7] = {0, 1, 2, 3, 4, 5, 6};
int IndexThatMatched[4]; // Want to add to this Array.
int main()
{
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 7; j++)
{
if(numToMatch[i] == arrayOfNumbers[j])
{
cout << "Num " << numToMatch[i] << " ";
cout << "matches " << arrayOfNumbers[j];
cout << endl;
}
}
}
}
Added only two lines.
int numToMatch[4] = {1,2,3,4};
int arrayOfNumbers[7] = {0, 1, 2, 3, 4, 5, 6};
int IndexThatMatched[4]; // Want to add to this Array.
int main()
{
for(int i = 0; i < 4; i++)
{
IndexThatMatched[i] = -1;
for(int j = 0; j < 7; j++)
{
if(numToMatch[i] == arrayOfNumbers[j])
{
cout << "Num " << numToMatch[i] << " ";
cout << "matches " << arrayOfNumbers[j];
cout << endl;
IndexThatMatched[i] = j;
}
}
}
}
If there was no match for numToMatch[k] then IndexThatMatched[k] will be -1.
In your example IndexThatMatched will be: {1, 2, 3, 4}.
That's because numToMatch's elements are positioned in indices 1-4 of arrayOfNumbers.
Moreover, after that run, for any k in the safe range:
numToMatch[k] == arrayOfNumbers[IndexThatMatched[k]]
If you really want to learn C++ ditch the C-style arrays and start practising with containers. If you combine them with the functions in <algorithm> you can write something like this:
std::vector<int> MatchNums{1,2,3,4};
std::vector<int> NumsToMatch{0, 1, 2, 3, 4, 5, 6};
std::vector<int> MatchedNums;
for ( auto Number:NumsToMatch )
{
auto Match = std::find( MatchNums.begin(), MatchNums.end(), Number );
if ( Match != MatchNums.end() )
{
MatchedNums.push_back( *Match );
}
}
for ( auto i:MatchedNums )
{ //Print out the found numbers:
std::cout << i << std::endl;
}
There's a lot more ways of doing this by combining different algorithms and I encourage you to try and think of as many ways as you can and try them all out.