-2

学生のスケジュールを扱うプログラムがあります。Section、Title、および Teacher は、ClassCollection[] と呼ばれる構造体 ClassInfo の配列に格納されます。オプションの 1 つは、クラスを追加することです。クラスが追加された後、クラスはタイトルに基づいてソートされるはずです。この関数は C++ 操作 "cin" を使用しますが、プログラムは主に C で記述されていると想定されています。情報の入力はすでに私のために書かれています。並べればいいだけ。

void class_add() {
    //check if we have room in the array
    if(nextIndex < MAX_CLASSES)
    {
        ... //Input code

        int xMin,x,y;

        for(y=0;y<nextIndex;y++){
            xMin = y;
            for(x=y+1;x<nextIndex;x++){
                if(strcmp(ClassCollection[x].title,ClassCollection[xMin].title)<0)
                    xMin = x;
            }
            if(xMin!=y){
                swap(ClassCollection[x],ClassCollection[xMin]);
            }
        }
    } else {
        printf("\nERROR: Your collection is full. Cannot add new entries.\n");
        cin.ignore();
    }
}

コードをコメントアウトすると、問題なく配列の最後にクラスを追加できます。ただし、配列を並べ替えようとすると、セクション、タイトル、教師の追加クラスがそれぞれ 0、' '、' ' に変更されるだけです。選択ソートの基本的なプロセスが正しいはずであることはわかっていますが、文字配列を操作するときの C の煩わしいちょっと変わった点にはあまり詳しくありません。誰でも助けることができますか?さらにコードを投稿したり、変数/定数を説明したりする必要がある場合はお知らせください。

-編集-

交換しました

if(xMin!=y){
                    swap(ClassCollection[x],ClassCollection[xMin]);
                }

if(xMin!=y){
                temp = ClassCollection[x];
                ClassCollection[x]=ClassCollection[xMin];
                ClassCollection[y] = temp;
            }

temp は ClassCollection と同じように ClassInfo として定義されます。私は配列内の2つのクラスでこれをテストしてきました。この新しいメソッドで 3 番目のクラスを追加すると、配列の最初のクラスは、セクション、タイトル、教師がそれぞれ 0、' '、' ' になります。2 番目と 3 番目のクラスは、私が入力した新しい情報になります。これについて何か考えはありますか?

4

1 に答える 1

1

C コードを記述している場合、への呼び出しはswap()ポインターを渡す必要があります。

xMinが より小さいことを確認しましたyが、 と を交換xxMinます。スワッピングxMiny.

for (y = 0; y < nextIndex; y++)
{
    xMin = y;
    for (x = y + 1; x < nextIndex; x++)
    {
        if (strcmp(ClassCollection[x].title, ClassCollection[xMin].title) < 0)
            xMin = x;
    }
    if(xMin != y)
        swap(&ClassCollection[y], &ClassCollection[xMin]);
}

入力操作をソート コード (2 つの関数) から分離する必要があります。C でプログラミングすることになっている場合は、C コードを作成する必要があります。C と C++ を混ぜて混乱させないでください。

作業コード

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

enum { MAX_STRING_LENGTH = 64 };
enum { MAX_CLASSES = 10 };

typedef struct ClassInfo
{
    char title[MAX_STRING_LENGTH];
    char teacher[MAX_STRING_LENGTH];
    int section;
} ClassInfo;

static ClassInfo ClassCollection[MAX_CLASSES];
static int nextIndex = 0;

static void dump_item(int i, ClassInfo const *c)
{
    printf("%d: %-12s : %-12s : %3d\n", i, c->title, c->teacher, c->section);
}

static void dump_array(const char *tag, int n, ClassInfo *array)
{
    printf("%s: %d\n", tag, n);
    for (int i = 0; i < n; i++)
        dump_item(i, &array[i]);
}

static void class_add(void)
{
    if(nextIndex < MAX_CLASSES)
    {
        char *end;
        char line[MAX_STRING_LENGTH];
        printf("What is the title of the class? ");
        if (fgets(ClassCollection[nextIndex].title, MAX_STRING_LENGTH, stdin) == 0)
            exit(1);
        if ((end = strchr(ClassCollection[nextIndex].title, '\n')) != 0)
            *end = '\0';
        printf("What is the name of the teacher? ");
        if (fgets(ClassCollection[nextIndex].teacher, MAX_STRING_LENGTH, stdin) == 0)
            exit(1);
        if ((end = strchr(ClassCollection[nextIndex].teacher, '\n')) != 0)
            *end = '\0';
        printf("nWhat is the section number? ");
        if (fgets(line, MAX_STRING_LENGTH, stdin) == 0)
            exit(1);
        if (sscanf(line, "%d", &ClassCollection[nextIndex].section) != 1)
            exit(1);
        nextIndex++;
    }
    else
        printf("No space left\n");
}

static void swap(ClassInfo *c1, ClassInfo *c2)
{
    ClassInfo t = *c1;
    *c1 = *c2;
    *c2 = t;
}

static void selection_sort(void)
{
    int xMin, x, y;

    for (y = 0; y < nextIndex; y++)
    {
        xMin = y;
        for (x = y + 1; x < nextIndex; x++)
        {
            if (strcmp(ClassCollection[x].title, ClassCollection[xMin].title) < 0)
                xMin = x;
        }
        if (xMin != y)
        {
            printf("Swap(%d,%d)\n", y, xMin);
            swap(&ClassCollection[y], &ClassCollection[xMin]);
        }
    }
}

int main(void)
{
    for (int i = 0; i < 3; i++)
        class_add();
    putchar('\n');
    dump_array("Before swap", 3, ClassCollection);
    swap(&ClassCollection[0], &ClassCollection[1]);
    dump_array("After swap", 3, ClassCollection);
    swap(&ClassCollection[0], &ClassCollection[1]);
    dump_array("Before sort", 3, ClassCollection);
    selection_sort();
    dump_array("After sort", 3, ClassCollection);
}

入力データ

Physics
Dobson
101
Chemistry
Keeling
221
Mathematics
Toulson
312

プログラムからの出力

プロンプトを無視しています...

Before swap: 3
0: Physics      : Dobson       : 101
1: Chemistry    : Keeling      : 221
2: Mathematics  : Toulson      : 312
After swap: 3
0: Chemistry    : Keeling      : 221
1: Physics      : Dobson       : 101
2: Mathematics  : Toulson      : 312
Before sort: 3
0: Physics      : Dobson       : 101
1: Chemistry    : Keeling      : 221
2: Mathematics  : Toulson      : 312
Swap(0,1)
Swap(1,2)
After sort: 3
0: Chemistry    : Keeling      : 221
1: Mathematics  : Toulson      : 312
2: Physics      : Dobson       : 101
于 2013-09-29T05:27:48.023 に答える