Для l oop, пропускаемых после функции пузырьковой сортировки - PullRequest
0 голосов
/ 02 апреля 2020

Я делаю программу сортировки для окончательного задания. Он берет номер счета, фамилию и остаток на счете и сортирует его в порядке возрастания на основе номера счета. Проблема, с которой я сталкиваюсь в моей программе, заключается в том, что, как только она достигает l oop для вывода информации, она полностью пропускает ее. Я считаю, что это может быть связано с моей функцией сортировки пузырьков, но я не уверен, как это исправить. Нас не учили быстрой сортировке, поэтому я им не пользуюсь. Я получаю сообщение об ошибке: несовместимый тип для аргумента 1 `sort ', но я не могу изменить массив на тип struct без возникновения дополнительных проблем. Вот мой код:

#include <stdio.h>

/* Define structure */

struct account
{
    int number;
    char full_name[30];
    float balance;
};

/* Function prototype */

void sort (int[], int);

/* Begin main function */

int main()
{

    /* Declare variables */

    struct account person[5];
    int x=0, i=0, count=0;

    printf("Enter account number, last name, and balance.\n");
    printf("Enter -999 to end input:\n\n");

    /* Create loop for user information */
    while(1)
    {

            scanf("%i", &person[x].number);
            if(person[x].number == -999) /*Break when -999 is input */
            {
                count = x;
                break;
            }


            if(person[x].number < 1 || person[x].number >1000)
            {
                printf("***Invalid account number. Please enter 1 - 1000 or -999 to exit***\n");
                x--;  
                continue;
            }

            scanf("%s", person[x].full_name);
            scanf("%f", &person[x].balance);

            if(person[x].balance < 0)
            {
            printf("*** Invalid balance amount. Please enter a positive value. ***\n");
            x--;
            continue;
            }
    }/* End of while loop */

    /* Call to sort function to sort information */

    sort(person[x].number, count);

    /* Display the information in ascending order */

    printf("ACCOUNT\tLAST NAME\tBALANCE\n");

    /* Create for loop to output the sorted information */

    for(x=0; x < count; x++)
    {
        printf("%d\t%s\t%f\n",person[x].number,person[x].full_name,person[x].balance);

    } /* End of for loop */
}/* End of main */

/* Start sort function */

void sort(int p[], int count)
{
    /* Declare variables.*/
 char changed = 'T'; /* a "flag" to indicate if a swap was made.*/
 int x, temp;
 while (changed == 'T') 
 {
    changed = 'F';
    /* Create for loop for swaping information */
    for (x = 0; x < count-1; x++)
    {
        if ( p[x] > p[x + 1])
        {
            /* Swap needs to be made.*/
            temp = p[x];
            p[x] = p[x+1];
            p[x+1] = temp;
 /* Set flag indicating that a swap was made. This ensures that */
 /* processing will continue, until nothing needs to be swapped. */
            changed = 'T';
        }
    } /* end for loop */
 } /* end while loop*/
} /* end function sort */

Вот мой вывод:

Enter account number, last name, and balance.
Enter -999 to end input:

10 Happy 55.00
15 Day 60.00
35 Man 75.00
-999
ACCOUNT LAST NAME       BALANCE
Press any key to continue . . .

Я ценю вашу помощь и время, которое вы тратите на помощь!

1 Ответ

1 голос
/ 02 апреля 2020

сначала, как упомянуто в комментариях, добавьте x++ в конце вашего while-loop для сканирования данных.

также вы должны знать, что отправив одного члена struct (number) в вашу функцию сортировки и сортируя его, другие члены не будут отсортированы (вместо них будет заменен только другой номер).

также обратите внимание: sort(person[x].number, count); вы отправляете один элемент номера члена из структуры в функцию. в то время как в объявлении функции вы сказали, что отправите ей массив целых чисел.

это должно быть sort(person, count);, а при замедлении функции вы должны использовать sort(struct account p[],int count);, также вы должны изменить функцию с помощью p[x].number.

также обратите внимание, что для добавления x++ в конце вашего while-loop вы должны удалить эти continue, в противном случае, когда вы сделаете x--, вы не достигнете x++.

Я написал другую функцию сортировки, которая, на мой взгляд, более логична.

struct account
{
    int number;
    char full_name[30];
    float balance;
};
void sort(struct account p[], int count);

int main()
{
    struct account person[5];
    int x = 0, i = 0, count = 0;

    printf("Enter account number, last name, and balance.\n");
    printf("Enter -999 to end input:\n\n");
    while (1)
    {
        scanf("%i", &person[x].number);
        if (person[x].number == -999) 
        {
            count = x;
            break;
        }

        if (person[x].number < 1 || person[x].number >1000)
        {
            printf("***Invalid account number. Please enter 1 - 1000 or -999 to exit***\n");
            x--;
            //remove continue
        }

        scanf("%s", person[x].full_name);
        scanf("%f", &person[x].balance);

        if (person[x].balance < 0)
        {
            printf("*** Invalid balance amount. Please enter a positive value. ***\n");
            x--;
            //remove continue
        }
        x++;//add x++ 
    }

    sort(person, count);//new function sort

    printf("ACCOUNT\tLAST NAME\tBALANCE\n");

    for (x = 0; x < count; x++)
    {
        printf("%d\t%s\t%f\n", person[x].number, person[x].full_name, person[x].balance);

    } 
}


void sort(struct account p[], int count)
{
    char changed = 'T'; 
    int x, temp;
    float btemp;
    char ntemp[30];// btemp for balance and ntemp for full_name
    while (changed == 'T')
    {
        changed = 'F';
        for (x = 0; x < count - 1; x++)
        {
            if (p[x].number > p[x + 1].number)
            {
                temp = p[x].number;
                p[x].number = p[x + 1].number;
                p[x + 1].number = temp;

                btemp = p[x].balance;
                p[x].balance = p[x + 1].balance;
                p[x + 1].balance = btemp;

                strcpy(ntemp , p[x].full_name);
                strcpy(p[x].full_name , p[x + 1].full_name);
                strcpy(p[x + 1].full_name , ntemp);
                changed = 'T';

            }
        }
    } 
} 
...