C - Отображение деталей в порядке возрастания по номеру детали

Я новичок здесь, поэтому я понятия не имею, правильно ли я написал это. Я сделал все, что инструктор сказал нам сделать для этой программы, но эта последняя поставила меня в тупик, потому что мы никогда не говорили о сортировке в классе. В нем говорится: "Измените функцию print(), чтобы отображать детали, отсортированные в порядке возрастания по номеру детали". Я пытался просмотреть книгу и в Интернете, но я просто стал еще больше сбит с толку. Может кто-нибудь мне помочь? Вот мой код:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NAME_LEN 25
#define MAX_PARTS 100

struct part {
int number;
char name[NAME_LEN + 1];
int on_hand;
float price;
};

int find_part(int number, const struct part inv[], int np);
void insert(struct part inv[], int *np);
void search(const struct part inv[], int np);
void update(struct part inv[], int np);
void print(const struct part inv[], int np);
int read_line(char [], int);

/**************************************************************
 * main:    Prompts the user to enter an operation code,      *
 *          then calls a function to perform the requested    *
 *          action. Repeats until the user enters the         *
 *          command 'q'. Prints an error message if the user  *
 *          enters an illegal code.                           *
 **************************************************************/
int main(void)
{   
char code;
struct part inventory[MAX_PARTS];
int num_parts = 0;

for (;;)
{
    printf("Enter operation code: ");
    scanf(" %c", &code);
    while (getchar() != '\n')    /* skips to end of line */
    {
        ;
    }

    switch (code)
    {
        case 'i':
            insert(inventory, &num_parts);
            break;

        case 's': 
            search(inventory, num_parts);
            break;

        case 'u':
            update(inventory, num_parts);
            break;

        case 'p': 
            print(inventory, num_parts);
            break;

        case 'q':
            return 0;

        default:
            printf("Illegal code\n");
            break;
    }

    printf("\n");
}
}

/************************************************************
 * find_part:   Looks up a part number in the inv array.    *
 *              Returns the array index if the part number  *
 *              is found; otherwise, returns -1.            *
 ************************************************************/
int find_part(int number, const struct part inv[], int np)
{
int i;

for (i = 0; i < np; i++)
{
    if (inv[i].number == number)
    {
        return i;
    }
}

return -1;
}

/****************************************************************
 * insert: Prompts the user for information about a new         *
 *               part and then inserts the part into the inv    *
 *               array. Prints an error message and returns     *
 *               prematurely if the part already exists or the  *
 *               array is full.                                 *
 ****************************************************************/
void insert(struct part inv[], int *np)
{
int part_number;

if (*np == MAX_PARTS)
{
    printf("Database is full; can't add more parts.\n");
    return;
}

printf("Enter part number: ");
scanf("%d", &part_number);

if (find_part(part_number, inv, *np) >= 0)
{
    printf("Part already exists.\n");
    return;
}

inv[*np].number = part_number;
printf("Enter part name: ");
read_line(inv[*np].name, NAME_LEN);
printf("Enter quantity on hand: ");
scanf("%d", &inv[*np].on_hand);
printf("Enter the price of the item: ");
scanf("%f", &inv[*np].price);
(*np)++;
}

/************************************************************
 * search:  Prompts the user to enter a part number, then   *
 *          looks up the part in the inv array. If the      *
 *          part exists, prints the name and quantity on    *
 *          hand; if not, prints an error message.          *
 ************************************************************/
void search(const struct part inv[], int np)
{
int i, number;


printf("Enter part number: ");
scanf("%d", &number);

i = find_part(number, inv, np);
if (i >= 0)
{
    printf("Part name: %s\n", inv[i].name);
    printf("Quantity on hand: %d\n", inv[i].on_hand);
    printf("Item Price: %.2f\n", inv[i].price);
}
else
{
    printf("Part not found.\n");
}
}

/*************************************************************
 * update:  Prompts the user to enter a part number.         *
 *          Prints an error message if the part can't be     *
 *          found in the inv array; otherwise, prompts the   *
 *          user to enter change in quantity on hand and     *
 *          updates the array.                               *
 *************************************************************/
void update(struct part inv[], int np)
{
int i, number, change, userChoice, changePartNum;
float changePrice;
char *changeName[] = {""};

printf("Enter part number: ");
scanf("%d", &number);

i = find_part(number, inv, np);
if (i >= 0)
{   
    printf("Enter your selection to edit this particular part:\n"
            "\t\t Type 1 to change the Part Number\n"
            "\t\t Type 2 to change the Part Name\n"
            "\t\t Type 3 to change the Price\n"
            "\t\t Type 4 to change the Quantity on Hand\n"
            "\t\t Type 5 to exit without making changes\n\n"
            "\t\t Enter your choice here: ");
    scanf("%d", &userChoice);
    switch ( userChoice )
        {
            //printf("Would you like to change the Part Number? \nType 1 for yes or 2 for no.");
            //scanf("%d", &userChoice);
            case 1:
                    printf("Enter new part number: ");
                    scanf("%d", &changePartNum);
                    inv[i].number = changePartNum;
                    printf("Change part num: %d\n", changePartNum);
                    printf("inv[i].number: %d\n", inv[i].number);
                    break;

            //printf("Would you like to change the Part Name? \nType 1 for yes or 2 for no.");
            //scanf("%d", &userChoice);
            case 2:
                    printf("Enter new name of part: ");
                    scanf("%s", changeName);
                    printf("Change part name: %s\n", changeName);
                    //strcpy (*changeName, inv[i].name[NAME_LEN + 1]);
                    //printf("&inv[i].name[NAME_LEN + 1]: %d\n", &inv[i].name[NAME_LEN + 1]);
                    break;


            //printf("Would you like to change the price? \nType 1 for yes or 2 for no.");
            //scanf("%d", &userChoice);
            case 3:
                    printf("Enter change in item price: ");
                    scanf("%f", &changePrice);
                    inv[i].price = changePrice;
                    break;

            //printf("Would you like to change the quantity on hand? \nType 1 for yes or 2 for no.");
            //scanf("%d", &userChoice);
            case 4:
                    printf("Enter change in quantity on hand: ");
                    scanf("%d", &change);
                    inv[i].on_hand = change;
                    break;
            case 5:
                printf("Exiting the editor.");
                break;
            default:
                printf("Your choice is not on the list.");
                break;
        }   
} 
else
{
    printf("Part not found.\n");
}
}

/************************************************************
 * print:   Prints a listing of all parts in the inv array, *
 *          showing the part number, part name, and         *
 *          quantity on hand. Parts are printed in the      *
 *          order in which they were entered into the       *
 *          array.                                          *                                                           *
 ************************************************************/
void print(const struct part inv[], int np)
{
int i;

printf("Part Number  Part Name       "
             "Quantity on Hand    "
             "  Price\n");
for (i = 0; i < np; i++)
{
    printf("%7d\t\t    %-5s%31d\t%.2f\n", inv[i].number,
                 inv[i].name, inv[i].on_hand, inv[i].price);
}
}

/*************************************************************
 * read_line:   Skips leading white-space characters, then   *
 *              reads the remainder of the input line and    *
 *              stores it in str.   Truncates the line if its *
 *              length exceeds n.   Returns the number of    *
 *              characters stored.                           *
 *************************************************************/
int read_line(char str[], int n)
{
int ch = 0;
int i = 0;

while (isspace (ch = getchar()))
{
    ;
}

while (ch != '\n' && ch != EOF)
{
    if (i < n)
    {
        str[i++] = ch;
    }

    ch = getchar();
}

str[i] = '\0';

return i;
}

1 ответ

Решение

Если ваш профессор позволяет вам использовать функцию из стандартной библиотеки, посмотрите функцию библиотеки C, чтобы выполнить сортировку, которая дает ответ, который показывает вам, как использовать qsort(), Если вы работаете в Linux, вы также можете получить документацию по этой функции (и другим функциям стандартной библиотеки), выполнив man qsort, Если вы не пользуетесь Linux, ознакомьтесь с любой из различных справочных страниц в Интернете.

Если нет, ваш профессор, вероятно, ожидает, что вы проведете собственное исследование. Обычно алгоритм пузырьковой сортировки преподается новичкам из-за его простоты. rosettacode предоставляет псевдокод того, как должна выглядеть пузырьковая сортировка:

repeat
    hasChanged := false
    decrement itemCount
    repeat with index from 1 to itemCount
        if (item at index) > (item at (index + 1))
            swap (item at index) with (item at (index + 1))
            hasChanged := true
until hasChanged = false

Обратите внимание, что в вашей функции печати у вас уже есть все, что вам нужно, массив и его длина. Вы продемонстрировали это, пройдя по нему и распечатав все переменные-члены. Теперь вам просто нужно написать алгоритм для сортировки. Единственное, что вам нужно для алгоритма - это функция сравнения. Вы заявили, что вам нужно отсортировать по номеру детали. Это означает, что ваша функция сравнения, вероятно, будет выглядеть так:

int compare(struct part a, struct part b)
{
    return (a.number < b.number);
}

За qsort():

qsort(inv, np, sizeof(part), compare);

В вашем алгоритме сортировки (что вы должны написать сами):

if (item.number at index) > (item.number at (index + 1))
Другие вопросы по тегам