質問

I have a program here that asks the user to enter up to 20 numbers. It then displays the numbers entered with duplicates removed and then uses a bubble sort to display them in ascending order with the duplicates removed. My issues is in the bubble sort. When it lists the nos in ascending order the last number always gets removed. Can someone help me by showing why it's doing that.

#include <stdio.h>    

/* This program asks the user to enter up to 20 numbers. It then displays the numbers entered, removes duplicates
 and then list the numbers with the duplicates removed in ascending order.
 */
int main (void)
{
    setbuf(stdout, NULL);

    int nums[20] , i , j, k, swap ;
    int count=0;

    {
        printf("Enter integers. (Negative -1 to stop):\n");
        for (i=0; i < 20; i++)
        {
            scanf("%d", &nums[i]);
            count = count +1;

            if(nums[i] == -1 ) // If user enters -1 stops the program from expecting anymore number inputs
                break;
        }
    }

    printf("The numbers you entered are:\n"); // outputs the numbers you entered one number per line
    for(i=0;i<count;++i)
    {
        printf("%d\n", nums[i]);
    }

    printf("\n Your numbers with the duplicate numbers removed:\n ");
    // for loop for removing the duplicate numbers that the user enters.
    for(i=0;i<count;i++)
    {
        for(j=i+1;j<count;)
        {
            if(nums[j]==nums[i])
            {
                for(k=j;k<count-1;++k)
                {
                    nums[k]=nums[k+1];
                }
                count--;
            }
            else
            {
                j++;
            }
        }
    }

    for(i=0;i<count;i++) // outputs the numbers you entered with the duplicates removed one number per line
        printf("%d\n ",nums[i]);

    // start of the bubble sort for listing the numbers in ascending order. Can replace ">" with "<" to list in descending order
    for(i=0; i<(k-1); i++)
    {
        for(j=0; j < k - i; j++)
        {
            if (nums[j] > nums[j+1])
            {
                swap = nums[j];
                nums[j] =nums[j+1];
                nums[j+1] = swap;
            }
        }
    }
    printf("\nYour numbers sorted in to ascending order with the duplicates removed:\n");

    for(j=0;j<i;j++) // outputs the numbers in ascending order. One number per line
        printf("%d\n ",nums[j]);


    return 0;
}
役に立ちましたか?

解決

There are two issues.

Keep in mind that after removing the duplicates, you have the total number of entries in your variable count.

So it'd be easier to do

for(i=0; i < count - 1; i++)
{
    for(j=0; j < count - 1 - i; j++)
    {
        .....

Notice the -1 in the second loop. This prevents the iteration from going out of bounds, since you are using j+1

The second error is simply in your printing loop.

Since you already have the amount of numbers to print stored in count, change

for(j = 0; j < i; j++)

to

for(j = 0; j < count; j++)

他のヒント

replace

 for(i=0; i<(k-1); i++)
 {
     for(j=0; j < k - i; j++)

with

 for(i=0; i<k; i++)
 {
     for(j=0; j < k - i-1; j++)

or

for(i=0; i<=(k-1); i++)
{
     for(j=0; j < k - i-1; j++)

Your sort routine uses k as condition. The above code suggests that k may or may not be properly initialized according to the data you have. Probably you wanted to use count?

Same for the last loop.

One suggestion: Never reusing loop variables, it is attracting all sorts of trouble. Your code is really hard to read and probably has some more issues.

P.S. You can declare a variable in each block starting with {. Declare the variables inside the loops to prevent unwanted reuse.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top