Finding max value in an array - c++

If I have an array, e.g.
10, 4, 7, 8
The value of the maximum element is
10
How can I find this value?
Here's my attempt:
int highNum = 0;
int m;
int list[4] = {10, 4, 7, 8};
for (m = 0 ; m < size ; m++);
{
if (list[m] > highNum)
highNum = list[m];
cout << list[m];
}
cout << highNum;
I am trying to write a simple loop to store a max value from an array, and I wrote this thinking it would work, but for some reason at the beginning of the for loop it stores the m variable as 4 and exits the loop.

Unless you're doing this for homework and have to write the loop, just use std::max_element, as in:
int list[4] = {10, 4, 7, 8};
std::cout << *std::max_element(list, list+4);
...or better, avoid hard-coding the length:
int list[] = {10, 4, 7, 8};
std::cout << *std::max_element(std::begin(list), std::end(list));

You have a semicolon after your for statement:
for (m = 0 ; m < size ; m++);
{
This should be:
for (m = 0 ; m < size ; m++)
{

int highNum = 0;
int m;
int list[4] = {10, 4, 7, 8};
for (m = 0 ; m < size ; m++); // <-- semicolon?
{
if (list[m] > highNum)
highNum = list[m];
cout << list[m];
}
cout << highNum;
Looking at your indentation, you may have missed a pair of { ... } for the if statement as well.

There is a ; right after the closing parentheses of your for loop:
for (m = 0 ; m < size ; m++);
The statements inside the block (inside the curly braces) gets executed only after the loop do nothing for size number of times and that too only once.
You have also missed a pair of { ... } for the if statement as well.

You put a superfluous at the end ; in :
for (m = 0 ; m < size ; m++);
Edit : Working code with some additional << endl;
int size = 4;
int highNum = 0;
int m;
int list[4] = {10, 4, 7, 8};
for (m = 0 ; m < size ; m++)
{
if (list[m] > highNum)
highNum = list[m];
cout << list[m] << endl;
}
cout << highNum << endl;

Related

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.

Filter out duplicate values in array in C++

I have a row of ten numbers for example:
5 5 6 7 5 9 4 2 2 7
Now I want a program that finds all duplicates and gives them out in the console like 3 times 5, 2 times 2, 2 times 7.
While I did code an algorithm that finds duplicates in a row of numbers I can't give them out in the console as described. My program will output:
3 times 5
2 times 5
2 times 7
2 times 2
How can I solve this problem?
#include <iostream>
using namespace std;
int main()
{
int arr[10];
int i,j;
int z = 1;
for(i = 0; i < 10; i++) {
cin >> arr[i];
}
for(i = 0; i < 10; i++){
for(j = i+1; j < 10; j++){
if(arr[i] == arr[j]){
z++;
}
}
if(z >= 2){
cout << z << " times " << arr[i] << endl;
z = 1;
}
}
return 0;
}
You can use the STL here (C++11):
int arr[10];
std::map<int, int> counters;
for (auto item : arr)
{
cin >> item;
++counters[item];
}
std::for_each(counters.begin(), counters.end(), [](const std::pair<int,int>& item)
{
if(item.second > 1) std::cout << item.second << " times " << item.first << std::endl;
});
You need to check that arr[i] is not already found before, like this for example:
if(z >= 2) {
int found_before = 0;
for(j = 0; j < i; ++j)
if(arr[i] == arr[j])
found_before = 1;
if(!found_before)
cout << z << " times " << arr[i] << endl;
z = 1;
}
which will print:
3 times 5
2 times 7
2 times 2
That way you don't print 5 again.
With your code it would print that it found 5 three times (for the first 5 in your array), and then when it would move to he second 5 in your array, it would forgot about the first 5 in your array, and report that it found 5 twice (itself and the 5th number of the array).
Why not use STL?
std::map<int, int> counter;
for (i = 0; i < 10; i++)
counter[arr[i]] ++;
for (i = 0; i < 10; i++) {
if (counter.count(arr[i]) > 0){
std::cout << counter[arr[i]] << " times "<< arr[i] << std::endl;
counter.erase(arr[i]);
}
}
std::map is a convenient tool for this job. You can easily count up occurrences of a specific number. After counting, you can print the count of each array element. With counter.erase, it's guaranteed that you won't print the same element for multiple times.
Why keeping your algorithm idea, I suggest to create sub method:
std::size_t count(const int* arr, std::size_t start, std::size_t end, int value)
{
std::size_t res = 0;
for (std::size_t i = start; i != end; ++i) {
if (arr[i] == value) {
++res;
}
}
return res;
}
then your fixed algorithm would be:
for (std::size_t i = 0; i != 10; ++i) {
if (count(arr, 0, i, arr[i]) != 0) {
continue; // Already visited
}
auto total = count(arr, i, 10, arr[i]);
if(total >= 2){
std::cout << z << " times " << arr[i] << std::endl;
}
}
An easy way is to make another array for it, especially if the numbers are not that big.
Lets say you have initialized your array like so: int nums[10] = { 5, 5, 6, 7, 5, 9, 4, 2, 2, 7 }
int result[max(nums)]; //Fill with zeroes, max(nums) is the highest number in the array
for(int i = 0; i < 10; i++) {
result[nums[i]]++;
}
for(int i = 0; i < max(nums); i++) {
if (result[i] > 1) cout << result[i];
}
Mind you this isn't optimized for memory. For larger number contents you might want to consider hashmaps.
If you don't need performance but rather compact code, then std::multiset with std::upper_bound is an alternative:
#include<set>
#include<iostream>
#include<algorithm>
int main(int a, char** b)
{
int array[] = {5, 5, 6, 7, 5, 9, 4, 2, 2, 7};
std::multiset<int> a(std::begin(array), std::end(array));
for(auto it = a.begin(); it != a.end(); it = std::upper_bound(a.begin(), a.end(), *it))
{
if(a.count(*it) > 1)
std::cout << *it << " times " << a.count(*it) << std::endl;
}
return 0;
}

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;
}

Find largest Max list in an array

I need to find the first Max list of an array and find it's middle. In other words, having for example this array {2, 8, 8, 8, 8, 8, 6, 3, 8, 8, 8} I need to have as a result the index 3, which is the middle of the first max list. I did try but my C++ code is still missing something. Can you please help.
Thanks
The following code is just a sample what I'm working on is an 90 elements array.
#include <iostream>
using namespace std;
int main()
{
int array[] = {2, 8, 8, 8, 8, 8, 6, 8, 0};
int Max = 0;
int StartMax = 0, EndMax = 0;
for (int m = 0 ; m < 9 ; m++){
if(array[m] > Max){
Max = array[m];
StartMax = m;
EndMax = m;
cout << "array[m] > Max " << Max << endl;
}
else if(array[m] < Max){
cout << "array[m] < Max " << Max << endl;
}
else {
int a = array[m] - array[m-1];
cout << "a = " << a << endl;
if (a == 0){
cout << "a = " << a << endl;
EndMax = m;
}
}
}
cout << "Index of Max : " << ((StartMax+EndMax)/2) << endl;
}
The problem
Your code work for this example but it won't work when you have a second "max list" which has more than 2 elements.
Indeed with array[] = {2, 8, 8, 8, 8, 8, 6, 8, 8}; (notice the last 8)
We get the result : middle=4 instead of middle3 because you enter this branch condition when you encounter 8 again :
else {
int a = array[m] - array[m-1];
And you enter the branch if (a==0) and you set EndMax to the end of the array !
StartMax = 1 and Endmax = 8 thus middle = 4
This is not what you want !
Live Code
Solution
I would suggest to use a boolean tracker to manage that instead :
size_t give_middle_max_list(const std::vector<int>& v) {
size_t idx_start_max = 0;
size_t idx_end_max = 0;
int max_val = v[0];
bool should_continue = false;
for(size_t i = 1; i < v.size(); i ++) {
if(v[i] > max_val) {
max_val = v[i];
idx_start_max = i;
idx_end_max = i;
should_continue = true;
}
else {
if (v[i] == max_val && should_continue == true) {
idx_end_max = i; // I am still in the first max list
}
else {
should_continue = false; // I am not in the first max list anymore !
}
}
}
std::cout << idx_start_max << ";" << idx_end_max << std::endl;
return (idx_end_max + idx_start_max) / 2;
}
Live code

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.