I want to input an array, and then make 2 arrays, one contains odd elements of A and the other contains even elements. I calculated sum of all elements in those two arrays, but there was a problem like this. Can you explain for me pls?
#include <stdio.h>
void input(int x, int A[x]){
for (int i = 0; i < x; i ){
printf("A[%d] = ", i);
scanf("%d", &A[i]);
}
}
int sum(int x, int A[x]){
int s = 0;
for (int i = 0; i < x; i ){
s = A[i];
}
return s;
}
void OddnEven(int x, int A[x], int B[x], int C[x]){
int m,n = 0;
B[m] = 0;
C[m] = 0;
for (int i = 0; i < x; i ){
if(A[i] % 2 == 0){
A[i] = B[m];
m;
} else {
A[i] = C[n];
n;
}
}
}
int main(){
int x;
printf("Enter size: "); scanf("%d", &x);
int A[x], B[x], C[x];
printf("Enter A: \n");
input(x, A);
printf("\nSum of all numbers in A: %d", sum(x, A));
OddnEven(x, A, B, C);
printf("\nSum of even numbers in A: %d", sum(x, B));
printf("\nSum of odd numbers in A: %d", sum(x, C));
}
Here is the output:
Enter size: 3
Enter A:
A[0] = 1
A[1] = 2
A[2] = 3
Sum of all numbers in A: 6
Sum of even numbers in A: -1106957381
Sum of odd numbers in A: 423238244
CodePudding user response:
Problems in your code:
In
OddnEven()function, the statementint m,n = 0;will only initialisento0andmwill be remain uninitialised and it is using variablembefore initialising. The value ofmis indeterminate and if you use it before initialising, it will lead to undefined behaviour. Instead, you should doint m = 0,n = 0;In
OddnEven()function, you are modifying the input array -A[i] = B[m];. It should beB[m] = A[i];. Same in else part ofifblock. May you shouldconstmodifier with the parameterint A[x], so that compiler flag these kind of issues.In
sum()function, you are adding all elements up toxand, due to this, your program end up accessing the array elements whose value is indeterminate. So, you should ensure that after filling upevennumbers in arrayBandoddnumbers in arrayC, rest of the elements of arrayBandCshould be assigned0. Or keep the record of number ofevenandoddelements in arrayBandCrespectively.In
main()function, you should validate the user inputsizeby adding upper and lower bounds check. Note that, arrayA,BandCare Variable Length Array (VLA). May you should try giving input size like a negative number or a huge positive number and check the program behaviour. Better to use some fixed size array likeA[1024]and just add check whether the user input is> 0and< 1024. The another advantage of using fixed size array is you can initialise it like thisint A[1024] = {0};, which is not possible in case of VLA. If it's a need to have value of all elements of a VLA0before using it then you have to explicitly assign0to all elements of a VLA.It is possible that sum of
evennumbers oroddnumbers may overflow. You should check it and appropriately handle this situation.
Making the minimal required changes in your code:
#include <stdio.h>
void input(int x, int A[x]){
for (int i = 0; i < x; i ){
printf("A[%d] = ", i);
scanf("%d", &A[i]);
}
}
int sum(int x, const int A[x]){
int s = 0;
for (int i = 0; i < x; i ){
s = A[i];
}
return s;
}
void OddnEven(int x, const int A[x], int B[x], int C[x]){
int m = 0, n = 0;
for (int i = 0; i < x; i ){
if(A[i] % 2 == 0){
B[m ] = A[i];
} else {
C[n ] = A[i];
}
}
}
void init_arr(int size, int *arr) {
while (size--) {
arr[size] = 0;
}
}
int main(){
int x;
printf("Enter size [1 - 100]: ");
scanf("%d", &x);
//validate input size from user, add check for upper and lower bound
//for e.g. input size should not be less than 0 and greater than 100
if ((x < 1) || (x > 100)) {
printf ("Invalid input, exiting..\n");
//may you want to add retry logic here..
return 0;
}
int A[x], B[x], C[x];
printf("Enter A: \n");
input(x, A);
init_arr(x, B);
init_arr(x, C);
OddnEven(x, A, B, C);
printf("Sum of all numbers in A: %d\n", sum(x, A));
printf("Sum of even numbers in B: %d\n", sum(x, B));
printf("Sum of odd numbers in C: %d\n", sum(x, C));
return 0;
}
Output:
Enter size [1 - 100]: 5
Enter A:
A[0] = 10
A[1] = 15
A[2] = 20
A[3] = 25
A[4] = 30
Sum of all numbers in A: 100
Sum of even numbers in B: 60
Sum of odd numbers in C: 40
Leaving it up to you to try following:
Keeping record of number of
evenandoddelements in arrayBandCand in the sum function pass that assizeto avoid the unnecessary loop iteration.Check the overflow in
sum()function and appropriately handle it.At the time of taking input from user in array
Aidentify whether the input number isevenorodd, that way you have total number ofevenandoddelements in arrayAjust after input from user. DeclareBandCof typeint *i.e.intpointer and allocate memory dynamically to them based on theevenandoddnumber count. Make the other required changes in the program.May you want to try with fixed size array as well once, like
A[100], B[100] and C[100]. Initialise them like thisint A[100] = {0}, B[100] = {0}, C[100] = {0};. Do other required changes in the program like keeping track ofevenandoddelements etc.
CodePudding user response:
This will happen because you are doing two wrong things in here
1st one is initiating arrays that have length x for B and C. But you don't update the values of that B and C from array A, instead of that, you are updating A from B and C. but B and C already have some garbage values. so when you add the values of A and B it adds garbage values, that is why you are getting these wrong values
2nd thing is, even if you put the values of A to B and C according to odd and even, you don't update all the values in B and C. Some indexes may update some are not, for that you need to initialize all the values of B and C something known value first (for example -1). then you can add all the values of B and C if the value is not equal to -1
You should not get -1 if you are using -1 to fill the array A, use something that you doesn't use to fill the array A
void OddnEven(int x, int A[x], int B[x], int C[x]){
for (int i = 0; i < x; i ){
B[i] = -1
C[i] = -1
if(A[i] % 2 == 0){
B[i] = A[i];
} else {
C[i] = A[i];
}
}
}
int sum(int x, int A[x]){
int s = 0;
for (int i = 0; i < x; i ){
if (A[i] != -1) {
s = A[i];
}
}
return s;
}
CodePudding user response:
Consider making a support function that test for even/odd count.
int OddCount(int x, const int A[x]) {
int count = 0;
for (int i = 0; i < x; i ) {
if (A[i] % 2) count ;
}
return count;
}
// Fix initialization.
void OddnEven(int x, const int A[x], int B[x], int C[x]) {
// int m,n = 0; // Only sets n
int m = 0,n = 0;
...
}
int main(){
int x;
printf("Enter size: "); scanf("%d", &x);
int A[x]; // Only A
printf("Enter A: \n");
input(x, A);
printf("\nSum of all numbers in A: %d", sum(x, A));
int odds = OddCount(x, A);
int evens = x - odds;
B[evens ? evens : 1] = 0; // Insure arrays have at least size 1 to prevent UB
C[odds ? odds : 1] = 0;
OddnEven(x, A, B, C);
printf("\nSum of even numbers in A: %d", sum(evens, B)); // do not use x
printf("\nSum of odd numbers in A: %d", sum(odds, C));
}
