25

Is there a simpler and better way to solve this problem because

  1. I used too many variables.
  2. I used so many if else statements
  3. I did this using the brute force method

Write a program that receives three integers as input and outputs the numbers in increasing order.
Do not use loop / array.

#include <stdio.h>
main(){
   int no1;
   int no2;
   int no3;
   int sto;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &no1);
   printf("Enter No. 2: ");
   scanf("%d", &no2);         
   printf("Enter No. 3: ");
   scanf("%d", &no3);

   if (no1>no2) {   
      sto=no1;    
      lo=no2;   
   } else {
      sto=no2;  
      lo=no1;  
   } 
   if (sto>no3) { 
      hi=sto;    
      if(lo>no3){         
         sto=lo;                
         lo=no3;
      }else {
         sto=no3;      
      }         
   }else hi=no3; 

   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", sto);
   printf("HIGHEST %d\n", hi);  

   getch(); 
}    
Gilles 'SO- stop being evil'
  • 104,111
  • 38
  • 209
  • 254
newbie
  • 14,582
  • 31
  • 104
  • 146
  • Related post - [Sorting 3 numbers without branching](https://stackoverflow.com/q/8098146/465053) – RBT Jun 27 '18 at 00:08
  • Hint: if you have 3 numbers, a, b, and c, min(a, min(b, c)) is the smallest, max(a, max(b, c)) is the largest, and given the smallest and largest numbers, it should be easy to find the third one. – gdj Dec 06 '10 at 15:14
  • Yes, there is a much better way, but you need to use loops and arrays. Probably, for an introductory class, your answer is the answer they are looking for. There are ways to get looping with for/while (recursion, goto, etc). And ways to get something like an array without indexing (`int *ptr = malloc (3 * sizeof(int))`, and then index with `*(ptr+index)`). But, I find it hard to think that that's what they want. – Lou Franco Dec 06 '10 at 15:13

11 Answers11

33
if (a > c)
   swap(a, c);

if (a > b)
   swap(a, b);

//Now the smallest element is the 1st one. Just check the 2nd and 3rd

if (b > c)
   swap(b, c);

Note: Swap changes the values of two variables.

Rajiv Singh
  • 2,947
  • 2
  • 11
  • 30
Petar Minchev
  • 46,889
  • 11
  • 103
  • 119
12

Call the three variables x, y, and z, then:

if (x > y) swap(x, y);
if (y > z) swap(y, z)
if (x > y) swap(x, y);

Writing the swap function is left as an exercise for the reader. Hint: you may have to use pointers.

NPE
  • 486,780
  • 108
  • 951
  • 1,012
10
#include <stdio.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int main(){
   int a, b, c;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &a);
   printf("Enter No. 2: ");
   scanf("%d", &b);         
   printf("Enter No. 3: ");
   scanf("%d", &c);

   lo = min(min(a, b), c);
   hi = max(max(a, b), c);
   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", a+b+c-lo-hi);
   printf("HIGHEST %d\n", hi);  

   getchar(); 
}    
Vovanium
  • 3,798
  • 17
  • 23
5

If you want to sort the values into new external variables, you can actually do the swaps without temporaries:

void sort(int a, int b, int c, int *min, int *mid, int *max) {
    min = a;
    mid = b;
    max = c;
    if (min > mid) { mid = a; min = b; }
    if (mid > max)
    {
        max = mid;
        mid = c;
        if (min > mid)
        {
            mid = min;
            min = c;
        }
    }
}

This works because the last swap test is really only needed if the second test succeeds (otherwise it will simply be a repetition of the first test, which will fail by definition since we already sorted those variables).

Because of this, we can track the assignments of each of the original variables and avoid swap locals.

glopes
  • 4,038
  • 3
  • 26
  • 29
1

To find the min, mid and max of 3 values, you can use the ternary operator. You can either do all your work within the main body of your code, or you can separate the minof3, midof3 and maxof3 calculations into reusable functions.

In the case of min and max you simply make 2 out of 3 possible comparisons, and then return a comparison of the results. In the case of mid, you do the same, but compute the min and max of the 3 values, and then check all 3 against min and max in order to find the value that is neither the min or max. (you can do this part in the main body of your code without an additional function by declaring the min and max values as variables and doing the elimination there).

Putting the pieces together, you could do something similar to the following, which takes the first 3 arguments as the values to sort (or uses defaults of 99, 231, 8 if a needed value isn't specified)

#include <stdio.h>
#include <stdlib.h>

/** direct ternary comparison of 3 values */
long minof3 (long a, long b, long c) {
    long x = a < b ? a : b,
         y = a < c ? a : c;
    return x < y ? x : y;
}

long maxof3 (long a, long b, long c) {
    long x = a > b ? a : b,
         y = a > c ? a : c;
    return x > y ? x : y;
}

long midof3 (long a, long b, long c) {
    long x = a < b ? a : b,
         y = a > b ? a : b,
         z = y < c ? y : c;
    return x > z ? x : z;
}

int main (int argc, char **argv) {

    long x = argc > 1 ? strtol (argv[1], NULL, 10) : 99,
         y = argc > 2 ? strtol (argv[2], NULL, 10) : 231,
         z = argc > 3 ? strtol (argv[3], NULL, 10) : 8;

    /* strtol validations omitted for brevity */

    printf ("\n sorted values : %ld, %ld, %ld\n",
            minof3 (x, y, z), midof3 (x, y, z), maxof3 (x, y, z));
}

Example Use/Output

$ ./bin/sort3
 sorted values : 8, 99, 231

$ ./bin/sort3 -23 -281 1031
 sorted values : -281, -23, 1031

(yes, I know this is an old post, but given the recent comment about code hidden behind the swap function, a full example was in order).

David C. Rankin
  • 81,885
  • 6
  • 58
  • 85
1

The following code performs only 2 (best case) to 3 (worst case) conditional tests, with no assignment operations nor any extra variables:

void from(int ref, int x, int y) {
    (ref < y) ? ((x < y) ? echo(ref,x,y) : echo(ref,y,x)) : echo(y,ref,x);
}
void printSorted(int a, int b, int c) { (a < b) ? from(a,b,c) : from(b,a,c); }

Basic call (scanf() stuff avoided for simplicity):

void echo(int _1st, int _2nd, int _3rd) { printf("%d %d %d", _1st, _2nd, _3rd); }
int main() {
    printSorted(2,3,1); //Output: 1 2 3
}
Ronald Souza
  • 627
  • 1
  • 8
  • 14
1
#include <stdio.h>
int main()
{
  int a;
  int b;
  int c;

  //Temporary storage variable
  int t = 0;

  printf("Enter No. a: ");
  scanf("%d", &a);
  printf("Enter No. b: ");
  scanf("%d", &b);         
  printf("Enter No. c: ");
  scanf("%d", &c);

  if (a > b) 
  {   
      t = a;    
      a = b;
      b = t;
  }
  if (a > c)
  {
    t = a;
    a = c;
    c = t;
  }
  if (c < b)
  {
    t = c;
    c = b;
    b = t;
  }
  
  printf("a = %d < b = %d < c = %d", a, b, c);
  
  return 0;
}
  • 1
    While this code may provide a solution to the question, it's better to add context as to why/how it works. This can help future users learn, and apply that knowledge to their own code. You are also likely to have positive feedback from users in the form of upvotes, when the code is explained. – borchvm Oct 20 '21 at 05:45
0

A compact solution sans magic swap() function, that dances around int overflow, and abuses arrays:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    int c = atoi(argv[3]);

    int ab[] = {a, b}, bc[] = {b, c};
    int smaller[] = {ab[a > b], bc[b > c]}, larger[] = {ab[a < b], bc[b < c]};
    int smallest = smaller[a > c], largest = larger[a < c];
    int middle = (a - smallest) + (b - largest) + c;

    printf("%d, %d, %d\n", smallest, middle, largest);

    return 0;
}

USAGE

> ./a.out 2147483647 2147483645 2147483646
2147483645, 2147483646, 2147483647
> 
cdlane
  • 40,441
  • 5
  • 32
  • 81
0
#include <stdio.h>

int main() {
    int a,b,c;
    printf("enter a b c values:\n");
    scanf("%d%d%d",&a,&b,&c);
    if(a<b && a<c)
    {   printf("%d,",a);
        if(b<c)
            printf("%d,%d",b,c);
        else
            printf("%d,%d",c,b);
    }
    else if(b<a && b<c)
    {
        printf("%d,",b);
        if(a<c)
            printf("%d,%d",a,c);
        else
        printf("%d,%d",c,a);
    }
    else
    {
    printf("%d,",c);
    if(a<b)
    printf("%d,%d",a,b);
    else
    printf("%d,%d",b,a);
    }
    return 0;
}
Leo
  • 1
  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jan 31 '22 at 19:07
0
        int number1 = int.Parse(Console.ReadLine());

        int number2 = int.Parse(Console.ReadLine());

        int number3 = int.Parse(Console.ReadLine());

        int swap = 0;

        if (number2 > number1 && number2 > number3)
        {
            swap = number2;
            number2 = number1;
            number1 = swap;

        }
        else if (number3 > number2 && number3 > number1)
        {
            swap = number3;
            number3 = number1;
            number1 = swap;
        }
        if (number3 > number2)
        {
            swap = number2;
            number2 = number3;
            number3 = swap;

        }
        Console.WriteLine(number1 + "/" + number2 + "/" + number3);
        Console.ReadKey();
-3

I was attempting to solve the same problem today. Could make this compact version of code without using any temporary variables; loops; library functions like swap, sort, max, min, etc. The code uses only if statements and makes continuous mutations in the hierarchy until all possibilities are checked.

int main()
{
  int a, b, c; //User inputs stored in these three variables
  int first, second, third; //These three variables will store the sorted numbers in sequence
  std::cout<<"Please enter three integers : "; //User input prompt
  std::cin>>a>>b>>c;

  first = a; //Initially assuming number 'a' is smallest
  if (b <= a && b <= c) first = b; //Checking whether b is smallest
  if (c <= a && c <= b) first = c; //Checking whether c is smallest
  if (((a >= b && a <= c) || (a >= c && a <= b))) second = a; //Checking if a is middle number
  if (((b >= a && b <= c) || (b >= c && b <= a))) second = b; //Checking if b is middle number
  if (((c >= a && c <= b) || (c >= b && b <= a))) second = c; //Checking if c is middle number
  if (a >= b && a >= c) third = a; //Checking if a is the greatest
  if (b >= c && b >= a) third = b; //Checking if b is the greatest
  if (c >= a && c >= b) third = c; //Checking if c is the greatest

  std::cout<<"The numbers in ascending order are : "<<first<<", "<<second<<", "<<third<<std::endl;
}
Arun Kumar
  • 634
  • 2
  • 12
  • 26