1
#include <stdio.h>
#include <string.h>
void bubble_sort_grades(char [], int); 
int main(void)
{
    int menuswitch=1;
    int amountofstudents;
    int i;
    int z;
    char studentinfo[100];
    char fname[50][100];
    char lname[50][100];
    char grade[50][100];
    printf("Enter Amount of Students: ");
    scanf("%d ", &amountofstudents);
    for (i=0;i<amountofstudents;i++)
    {
        fgets(studentinfo, sizeof(studentinfo), stdin);
        strcpy(fname[i], strtok(studentinfo, " "));
        strcpy(lname[i], strtok(NULL, " "));
        strcpy(grade[i], strtok(NULL, " "));
    }
        while (menuswitch==1)
        {
            int answer;
            printf("Enter 1 for Alphabetical Sort (First Name) \n");
            printf("Enter 2 for Alphabetical Sort (Last Name) \n");
            printf("Enter 3 for Score Sort \n");
            printf("Enter 0 to exit \n");
            printf("Enter choice now: ");
            scanf("%d", &answer);
            if (answer==1)
            {
                bubble_sort_grades(grade,amountofstudents);
                printf("%s\n", grade[0]);
                printf("%s\n", grade[1]);
            }
            if (answer==2)
            {
                printf("In 2 \n");
            }
            if (answer==3)
            {
                printf("In 3 \n");
            }
            if (answer==0)
            {
                printf("Ending Program \n");
                menuswitch=0;
            }
        }
}
void bubble_sort_grades(char grades2[], int amount)
{
    int c, d , t;
    for (c=0; c<(amount); c++)
    {
        for (d=0; d<amount-1; d++)
        {
            if (grades2[c]>grades2[d+1])
            {
                t=grades2[d+1];
                grades2[d+1]=grades2[d];
                grades2[d]=t;
            }
        }
    }
}

別の質問をして申し訳ありませんが、バブルの並べ替えについて助けが必要です。入力から学生の成績をバブルソートする関数を作成しました。しかし、これを行うと、配列の代わりに 1 年生のみが並べ替えられます。

   Input:
    John Smith 86
    Victor Jones 76

出力: 68 76

4

3 に答える 3

3

ここには 2 つの主な問題があります。

問題 1: 配列のインデックス付けが正しくない

@TWhite が既に指摘したように、バブル ソート関数のパラメーターの型が間違っています。配列が typechar[50][100]であると宣言しました。つまり、メモリ内の単一の大きなブロックとして 50*100 文字が割り当てられます。のメモリgradeが at に割り当てられている場合baseAddrgrade[0]is at baseAddr+0grade[1]is at baseAddr+100grade[2]is atなどです。2D 配列の最後の次元を指定baseAddr+200しないと、これらのインデックスを計算する方法がありません。bubble_sort_gradesの署名をbubble_sort_gradesto に変更void bubble_sort_grades(char[][100], int)すると、その問題が解決します。

問題 2: c-string を格納しているが、int のように扱っている

grade配列は、c-strings ( )の配列ですchar*。int ではなく、文字を格納します。つまり、この行は完全に間違っています: if (grades2[c]>grades2[d+1])(サイドノート:c最初のインデックスとして代わりに使用していることに注意してください。dこれもエラーです)。文字列を比較したい場合は、代わりに を使用する必要があります。これはstrcmp、2 つのchar*値を>演算子で比較するとポインター比較が行われるだけだからです。ただし、 を使用strcmpするには、すべての成績が 2 桁である必要があります (例:05ではなく5)。そうでない場合、文字列"9"は よりも大きくなり"80"ます。グレードはc-stringsであるため、aをに格納しているため、これは完全に間違っていることも意味しt=grades2[d+1]ますchar*int. 一時的な buffer を作成してから、割り当てによってコピーする代わりにchar t[100]使用する必要があります。strcpy


を使用するという@chuxの提案が好きstructです。=構造体を使用すると、演算子を使用するときに構造体全体のコピーを自動的に (正しく) 処理するという追加の利点があります。私は似たようなことを提案するつもりでしたが、実際には組み込みqsortルーチンを使用することを提案しましたが、これはおそらく宿題であり、まだ構造体をカバーしていない可能性があることに気付きました。その場合、gradec-string の代わりに int を格納するように配列を変更する方がおそらく簡単です。

于 2013-10-15T22:17:19.790 に答える