C++ displaying array elements - c++

Hi when running this small program, I appear to have an output of the memory addresses rather than the values stored inside them: any ideas? thanks.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a[5] = { 1, 3, 5, 7, 9 };
int b[5] = { 2, 4, 6, 8, 10 };
int c[10] = {};
int j, i;
for(j = 0; j < 10; j++)
{
if (a[j] < b[j])
{
c[j] = a[j];
}
else
{
c[j] = b[j];
}
}
for (i= 0; i < 10; i++)
{
cout << c[i];
}
return 0;
}

Your conditions are wrong. a and b both have size 5, but you are iterating upto size 10.

Related

find how many is prime number

I want give array of numberes and find how many of them is prime number,but program give me zero
int Prime_complete(int a[],int len){
int sum=0;
int m,flag;
for(int i=0 ; i<len ; i++){
m=a[i]/2;
for(i = 2; i <= m; i++){
if(a[i] % i == 0){
flag=1;
break;
}
}
if (flag==0) {
sum++;
}
}
return sum;
}
As mentioned already in comments, you need to fix your flag variable to reset each iteration. Right now your code finds a number that isn't prime and then the flag is never reset.
#include <iostream>
using namespace std;
int Prime_complete(int a[],int len)
{
int sum = 0;
int flag = 1;
for(int i = 0; i < len; i++)
{
for (int j = 2; j < a[i]/2; j++)
{
if (a[i] % j == 0)
{
flag = 1;
}
}
if (flag == 0)
{
sum++;
}
flag = 0;
}
return sum;
}
int main()
{
int numbers[13] = {3, 5, 7, 11, 13, 17, 19, 23, 29, 4, 6, 8, 10};
cout << Prime_complete(numbers,13);
return 0;
}
You could also improve your prime checking by only checking values up to the sqrt(a[i]) but that would only be a minor improvement in this case.

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.

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.

Custom sorting algorithm c++

I was tinkering with C++ and I was like let's make a sorting algorithm :)
I did something, but it didn't sort the array but instead the array was overwritten with the max number
I don't know where is my mistake because I ran the algorithm on paper (don't ask) and it was correct.
I tried every modification possible.
any help?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int mn = 0, mx = 0;
int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };
for (int i = 0; i < 10; i++)
{
mn = a[i]; mx = a[i];
for (int j = i; j < 10 - i; j++)
{
mn = min(a[j], mn);
mx = max(a[j], mx);
}
swap(a[i], mn);
swap(a[10-1-i], mx);
}
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
}
You are not swapping array elements, but basically you write the min/max values to the corresponding places within the array. Their old value is simply overwritten. You need to track the positions of the min/max elements and swap accordingly, e.g. swap(a[i], a[min_pos]). Additionally, you could run your outer loop up until the middle of the array is reached as you put two elements into their place on each iteration.
Here's the working code:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int mn = 0, mx = 0;
int a[] = { 4, 8, 5, 2, 6, 9, 0, 3, 1, 7 };
for (int i = 0; i < 10 / 2; i++)
{
int min_pos = i, max_pos = i;
for (int j = i; j < 10 - i; j++)
{
if (a[j] < a[min_pos]) {
min_pos = j;
} else if (a[j] > a[max_pos]) {
max_pos = j;
}
}
int min_val = a[min_pos];
int max_val = a[max_pos];
swap(a[i], a[min_pos]);
swap(a[10-1-i], a[max_pos]);
a[i] = min_val;
a[10-1-i] = max_val;
}
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
}
Note, you need to take care of 'special cases', e.g. when the min_pos and max_pos are at the ends of the interval - they would be swapped twice staying in their original positions.

Group sum of n consecutive numbers of array

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