Group sum of n consecutive numbers of array - c++

So I have an array like {1, 4, 2, 3, 5, 3, 7} and I have to make a new array containing the sums of each 3 consecutive elements like {7, 9, 10, 11, 15}.
So far I got here and I don't know what I'm doing wrong.
#include <iostream>
#include <conio.h>
using namespace std;
int a[] = {1, 1, 2, 3, 5, 3, 7};
int lung = sizeof(a)/sizeof(a[0]);
int *l = new int[10];
int calc(int *a, int m)
{
int sum = 0;
int stmax = (lung - m) - 1;
for(int st=0;st <= stmax; st++)
{
for(int i = 0; i < m; i++)
{
sum = sum + a[st+i];
}
l[st] = sum;
}
return 0;
}
void main()
{
int a[] = {1, 1, 2, 3, 5, 3, 7};
cout << calc(a, 3)<< endl;
for (int i = 0; i < lung; i++)
{
cout << l[i] << " | ";
}
_getch();
}

you have to set sum=0; after each iteration
for(int st=0;st <= stmax; st++)
{
sum=0;
for(int i = 0; i < m; i++)
{
sum = sum + a[st+i];
}
l[st] = sum;
}
and also you have to declare int stmax = (lung - m); //ommit -1
and in the main function print the array till stmax
for (int i = 0; i <= stmax; i++)
{
cout << l[i] << " | ";
}

I would do it like this:
#include <iostream>
#include <conio.h>
using namespace std;
int a[] = { 1,4,2,3,5,3,7};
int lung = sizeof(a) / sizeof(a[0]);
int *l = new int[10];
void calc(int* a, int m){
a += 1; // Increment pointer
for (int st = 0; st <m; st++){
l[st] = a[st-1]+a[st]+a[st+1];
}
}
int main(){
calc(a, lung-2);
for (auto i = 0; i < lung-2; i++){
std::cout << l[i] << " ";
}
}

Related

Shifting value i multi dimensional array C++

I want to shift value in multi dimensional array, i try but its not working at all and am also confused within logic.
here what i want to do
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
and let i pass 1, 2 so it should delete 5 from array and shift all elements.
Expected Output:
1, 2, 3,
4, 6, 7,
8, 9, 0
Here is my code.
#include <iostream>
void display(int arr[][3], int size)
{
std::cout << "\nDisplay of array:\n";
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
std::cout << i << " " << j << " : " << arr[i][j] << std::endl;
}
}
return;
}
void insert(int arr[][3], int size)
{
std::cout << "\nInserting element in an array:\n";
int pos, num;
std::cout << "Enter new value to be inserted: ";
std::cin >> num;
std::cout << "Enter the position where you wanted to inserted it: ";
std::cin >> pos;
/*for (int i = size - 2; i >= pos; i--) {
arr[i+1] = arr[i];
}*/
//arr[pos] = num;
display(arr, size);
}
void delete_ele(int arr[][3], int size)
{
std::cout << "\nDeleting an array:\n";
int posX, posY;
display(arr, size);
std::cout << std::endl;
std::cout << "Enter the X pos where you wanted to delete element: ";
std::cin >> posX;
std::cout << "Enter the Y pos where you wanted to delete element: ";
std::cin >> posY;
const int s = 3;
int newArr[s][s];
int x = 0, y = 0;
bool t = false;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (i == posX && j == posY) {
t = true;
continue;
}
newArr[x][y] = arr[i][j];
y++;
}
if (t) {
continue;
}
x++;
}
display(newArr, size);
}
int main(void)
{
// size of array.
const int size = 3;
//Decleration of arrays
int arr[size][size] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int arr2[size][size] = {
{1, 2, 3},
{7, 8, 9}
};
// Delete an array basse on position.
delete_ele(arr, size);
// Insert an array by shifting..
insert(arr2, size);
return 0;
} // end of main.
Thanks

Merge sort same output C++

I wrote the below code for merge sort but it's not working, And I am unable to find out problem!
Every time the output becomes same as input, I think that problem may occur due to vector reference.
I think mergeSort is not creating a new vector for sub array. But I am still confused.
input vector: 5, 4, 3, 2, 1
output: 5, 4, 3, 2, 1
Req output: 1, 2, 3, 4, 5
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int> &la, vector<int> &ra, vector<int> &A) {
int i = 0, j = 0, k = 0;
// overwriting A using its solved sub arrays i.e la, ra
while (i < la.size() && j < ra.size()) {
if (la[i] <= ra[j]) {
A[k] = la[i];
i++;
k++;
} else {
A[k] = ra[j];
j++;
k++;
}
}
// if any subarray left then
while (i < la.size()) {
A[k] = la[i];
k++;
i++;
}
while (j < ra.size()) {
A[k] = ra[j];
k++;
j++;
}
}
mergeSort function:
void mergeSort(vector<int> &A) {
if (A.size() < 2)
return;
int len = A.size();
vector<int> la, ra;
for (int i = 0; i < len / 2; i++)
la.push_back(A[i]);
for (int i = len / 2; i < len; i++)
ra.push_back(A[i]);
// dividing the proble into subproblem
mergeSort(la);
mergeSort(ra);
// merging the solved subproblem
merge(la, ra, A);
}
Driver function:
int main(void) {
int arr[] = { 5, 4, 3, 2, 1 };
vector<int> A(arr, arr + 5);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
cout << endl;
mergeSort(A);
for (int i = 0; i < A.size(); i++)
cout << A[i] << " ";
return 0;
}
The code posted does not seem to have a problem.
Executing it produces the expected output: 1 2 3 4 5, so there is something else going on that could cause your observations: you might be running an executable produced by a previous or at least different version of the code.

how do i use a for loop to compare arrays of different sizes

I have 2 arrays:
arr1 = [0, 1, 2, 3, 4, 5, 6]
arr2 = [0, 1, 3, 3, 4, 6]
I'm trying to write a function to compare the two arrays and make a new array with the missing numbers.
I tried this for loop but it didn't print out anything. What other ways can I compare 2 arrays of different sizes?
int n = 0;
int *newArr = new int[];
for (int i = 0; i<=6; i++) {
if (arr1[i] != arr2[i]) {
newArr[n] = arr1[i]
n++;
}
}
for (int j = 0; j<n; j++) {
cout << arr[j] << endl;
}
I'm trying to write a function to compare the two arrays and make a
new array with the missing numbers.
You can use a range-based for loop and std::find to check both arrays for the missing numbers
And then store the result in a std::set
Example
int main()
{
int a[] { 0, 1, 2, 3, 4, 5, 6 };
int b[] { 0, 1, 3, 3, 4, 6 };
std::set<int> c;
for (auto const& i : a)
if (std::find(std::begin(b), std::end(b), i) == std::end(b))
c.insert(i);
for (auto const& i : b)
if (std::find(std::begin(a), std::end(a), i) == std::end(a))
c.insert(i);
}
or using a regular for loop
for (auto it = std::begin(a); it != std::end(a); ++it)
if (std::find(std::begin(b), std::end(b), *it) == std::end(b))
c.insert(*it);
Try something like this:
int arr1[] = {0, 1, 2, 3, 4, 5, 6};
int size_arr1 = 7;
int arr2[] = {0, 1, 3, 3, 4, 6};
int size_arr2 = 6;
int *newArr = new int[size_arr1 + size_arr2];
int n = 0;
for (int i = 0; i < size_arr1; i++) {
newArr[n++] = arr1[i];
}
for (int i = 0; i < size_arr2; i++) {
bool found = false;
for (int j = 0; j < n; j++) {
if (arr2[i] == newArr2[j]) {
found = true;
break;
}
}
if (!found)
newArr[n++] = arr1[i];
}
for (int i = 0; i < n; i++) {
cout << newArr[i] << endl;
}
delete[] newArr;
Another way to collect unique numbers from both arrays is to use a std::set or std::unsorted_set instead, eg:
#include <unordered_set>
int arr1[] = {0, 1, 2, 3, 4, 5, 6};
int arr2[] = {0, 1, 3, 3, 4, 6};
set::unsorted_set newArr;
for(int num : arr1) {
newArr.insert(num);
}
for(int num : arr2) {
newArr.insert(num);
}
for (int num : newArr) {
std:: cout << num << endl;
}
You've declared the arrays dynamically in your code (i.e. on the heap) and initializing them with numbers isn't as straight forward. You are also allocating an array of 0 size. If you declare your arrays on the stack then you can achieve what you want to do with a nested for loop.
Take note though that for large datasets this would be inefficient. If you're curious research binary search algorithms.
#include <iostream>
int main()
{
int arr1Size = 6;
int arr2Size = 8;
int arr1[] = { 2, 5, 7, 12, 45, 65 };
int arr2[] = { 2, 5, 6, 10, 32, 65, 98, 123 };
for (int i = 0; i < arr1Size; i++)
{
for (int j = 0; j < arr2Size; j++)
{
if (arr1[i] == arr2[j])
{
std::cout << arr1[i] << std::endl;
}
}
}
}

Return a generic C-style array using templates

I know using vectors is much easier but it just crossed my mind if i wanted to use C-style arrays to do generic matrix multiplication, how would that work. I searched online and got some help by using templates but the array won't return from the function.
// Example program
#include <iostream>
#include <string>
using namespace std;
template <typename T, size_t row1, size_t col1, size_t row2, size_t col2>
typename multiply(T(&a)[row1][col1], T(&b)[row2][col2]) {
if (row1 != col2) {
cout << "Error! Rows of first matrix is not the same as Columns of second "
"matrix, therefore Multiplication is NOT POSSIBLE!";
return 0;
} else {
T c[row1][col2];
for (size_t i = 0; i < row1; ++i) {
for (size_t j = 0; j < col2; ++j) {
c[i][j] = 0;
for (size_t k = 0; k < col1; ++k) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
return c;
}
}
int main() {
// C-style array
int my_array[2][5] = {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}};
int my_array2[5][2] = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}};
int my_array3[2][2];
int c[2][2] = multiply(my_array, my_array2);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
cout << c[i][j] << " ";
}
cout << endl;
}
return 0;
}
So any idea how I can make this code work?
You can't either return 0 either return c in your function as you do.
Instead, pass the output as a parameter c and put a and b as const.
The return of the function is the error code (0 for OK, -1 for KO)
Btw, your check condition is wrong, I corrected it also
// Example program
#include <iostream>
#include <string>
using namespace std;
template <typename T, size_t row1, size_t col1, size_t row2, size_t col2>
int multiply(const T(&a)[row1][col1], const T(&b)[row2][col2], T(&c)[row1][col2] ) {
if (col1 != row2) {
cout << "Error! Columns of first matrix is not the same as Rows of second "
"matrix, therefore Multiplication is NOT POSSIBLE!";
return -1;
} else {
//T c[row1][col2];
for (size_t i = 0; i < row1; ++i) {
for (size_t j = 0; j < col2; ++j) {
c[i][j] = 0;
for (size_t k = 0; k < col1; ++k) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
return 0;
}
}
int main() {
// C-style array
int my_array[2][5] = {{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}};
int my_array2[5][2] = {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}};
int my_array3[2][2];
int a = multiply(my_array, my_array2,my_array3);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
cout << my_array3[i][j] << " ";
}
cout << endl;
}
return 0;
}
You can pass the result as a parameter:
template<class T,int NLine1,int NC1L2,int NCol2>
void multiply(T (left&)[NLine1][NC1L2], T(right&)[NC1L2][NCol2], T(result&)[NLine1][NCol2]);

Maximum Sub-Array Sum C++

Given an array, I am trying to find the maximum sub-array sum. A sub-array is as follows. For example, I get the following array: [9, -7, 5, 3, 91]. Whilst [9, -7, 5] is a sub-array, [9, 5, 3, 91] is not. My code is below:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int arraylen, subarraylen, subarraysum, itervar1, itervar2, itervar3, incrementvar;
cin >> arraylen;
vector<int> mainarray(arraylen);
vector<int> sumarray(arraylen * (arraylen-1) + 1);
for (itervar1 = 0; itervar1 < arraylen; itervar1++) {
cin >> mainarray[itervar1];
}
sumarray[0] = 0;
for (itervar1 = 0; itervar1 < arraylen; itervar1++) {
for (itervar2 = arraylen; itervar2 > 0; itervar2--) {
subarraylen = itervar2-itervar1;
if (subarraylen < 1) {
continue;
}
vector<int> subarray(subarraylen);
incrementvar = 0;
for (itervar3 = itervar1; itervar3 < itervar2; itervar3++) {
subarray[incrementvar] = mainarray[itervar3];
incrementvar++;
}
subarraysum = 0;
for (itervar3 = 0; itervar3 < subarraylen; itervar3++) {
subarraysum += subarray[itervar3];
}
}
}
return 0;
}
For some reason, it doesn't work; just infinitely loops around. Any help would be appreciated.
First, here is a routine to list all the sub arrays:
vector<int> vec{ 9, -7, 5, 3, 91 };
int sz = vec.size();
for(int start = 0; start < sz; start++)
{
for(int end = start; end < sz; end++)
{
for(int j = start; j <= end; j++)
{
cout << vec[j] << ", ";
}
cout << "\n";
}
}
Now you just have to get the total in loop j, add to a vector sum. You don't need to know the size of sum before hand. Use push_back to add total to sum.
Note, the array itself is included as a sub array, you can exclude that array depending on what the definition is.