Sorry for the wording of the title, I could not think of a better way to word my question. In my code I am taking n sets of input for a struct I call interval. If the user only wants to enter 1 structure, then the program accepts input and prints just fine. However, anything greater than 1 will accept all the input, but after the last input that stores an integer inside the structure, it will become 'stuck' where the cursor will move down one line as if it is waiting for input. Except no matter what you enter the program doesn't progress at all. I need to understand what is stopping my program from progressing. Thanks for any and all help.
The error (I assume) is in the main when the function takeInput is called.
I compiled using gcc on a Linux machine. Below is the Code.
#include <stdio.h>
typedef struct interval{
int num_left, denum_left;
int num_right, denum_right;
int left_state, right_state;
}interval;
interval combine(interval x, interval y);
int combineCheck(interval x, interval y);
int valueCheck(interval x, interval y);
void mergeSort(interval x[], int l, int r);
void merge(interval x[], int l, int m, int r);
interval takeInput();
int main(){
int response, i;
char d;
printf("Enter the number of intervals to input: ");
scanf("%d", &response);
interval data[response];
for(i = 0; i < response; i++){
data[i] = takeInput();
}
printf("%d/%d %d/%d", data[0].num_left, data[0].denum_left, data[0].num_right, data[0].denum_right);
mergeSort(data, 0, response-1);
printf("%d/%d %d/%d", data[0].num_left, data[0].denum_left, data[0].num_right, data[0].denum_right);
}
interval takeInput(){
interval temp;
printf("Enter left numerator: ");
scanf("%d", &temp.num_left);
printf("Enter left denominator: ");
scanf("%d", &temp.denum_left);
printf("Enter right numerator: ");
scanf("%d", &temp.num_right);
printf("Enter right denominator: ");
scanf("%d", &temp.denum_right);
printf("\n");
if(temp.num_left < 0){
temp.num_left = temp.num_left*-1;
temp.left_state = -1;}
else{
temp.left_state = 0;}
if(temp.num_right < 0){
temp.num_right = temp.num_right*-1;
temp.right_state = -1;}
else{
temp.right_state = 0;}
printf("Testing Shit");
return temp;
}
int combineCheck(interval x, interval y){
int left, right;
left = x.num_right * y.denum_left; //used to find relationship between 2 fractions
right = y.num_left * x.denum_right;
if(left == right && (x.right_state + x.left_state) == 0){
return 1;
}
else if(left > right){
return 1;
}
return 0;
}
interval combine(interval x, interval y){
int left, right; //used to check if one interval is all encompassing
left = x.num_right * y.denum_right;
right = x.denum_right * y.num_right;
interval temp;
temp.num_left = x.num_left;
temp.denum_left = x.denum_left;
temp.left_state;
if(left > right){
temp.num_right = x.num_right;
temp.denum_right = x.denum_right;
temp.right_state = x.right_state;
return temp;
}
temp.num_right = y.num_right;
temp.denum_right = y.denum_right;
temp.right_state = y.right_state;
return temp;
}
int valueCheck(interval x, interval y){
int first, second; //used to check values
first = x.num_left * y.denum_left;
second = y.num_left * x.denum_left;
if(first > second){
return 1;
}
return -1;
}
void mergeSort(interval x[], int l, int r){
if(l < r){
int m = l + (r-1)/2;
mergeSort(x, l, m);
mergeSort(x, m+1, r);
merge(x, l, m, r);
}
}
void merge(interval arr[], int l, int m, int r){
int i, j, k;
int n1 = m-l +1;
int n2 = r-m;
interval L[n1], R[n2];
for(i = 0; i < n1; i++)
L[i] = arr[l + i];
for(j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
j = 0;
i = 0;
k = l;
while(i < n1 && j < n2){
if(valueCheck(L[i], R[j]) == -1){
arr[k] = L[i];
}
else{
arr[k] = R[j];
j++;
}
}
while(i < n1){
arr[k] = L[i];
i++;
k++;
}
while(j < n2){
arr[k] = R[j];
j++;
k++;
}
}
Checking your merge sort algorithm I see this:
I think you meant:
Because what you want is the middle index.
You have some problem in your merge sort routine:
You're not incrementing i after assigning to arr. Since i is never changing, your while loop never terminates. Add a
i++
in that first if condition and it would work. Also see the point made by MondKin, that's also a very serious problem in your code.There is an infinite loop problem as others indicate. You cannot indicate this in your debug prints, because it may not flush whenever they are called. You can add newline to your debug prints to see where your program stucks.
I think that the middle index
m
is incorrect.Change this:
to this: