1

私はまだCに比較的慣れていないので、2つの質問がありました. 私は学生の構造を持っています:

   struct student{
        Name   name;
        Comment  comment;

        int ID;
        float fee;
    }

10000 人の学生のグローバル配列があります。名前とコメントは、文字へのポインターのみを保持する構造体です。また、5 つの機能があります。

      void InitStudent();
      BOOL AddNewStudent();
      BOOL DeleteStudent();
      BOOL ReportStudents():
      BOOL Cleanup();
  1. InitStudents() では、すべての学生 ID を -1 に初期化する必要があります。配列全体をループして ID を初期化するよりも簡単な方法があるかどうかわかりませんか?

  2. ReportStudents では、追加されたデータベース内のすべての学生を報告する必要があります。問題は、StudentCount 変数などがないことです。DeleteStudent 関数は、配列にギャップを残して学生を削除することもできます (これは変更できません)。また、関数はパラメーターを取ることができません。ID が -1 でないかどうかを確認するために 10000 回ループすることなく、すべての生徒をループまたは印刷する方法はありますか?

前もって感謝します

4

4 に答える 4

0

InitStudents() では、すべての学生 ID を -1 に初期化する必要があります。配列全体をループして ID を初期化するよりも簡単な方法があるかどうかわかりませんか?

初期化式 (-1) は定数式であるため、技術的には初期化子リスト構文を使用して 10000 要素の配列を初期化できますが、1 万個の構造初期化子を打ち出すことが「より簡単」であるとは思えません。ループは実行可能な解決策のようです。

ReportStudents では、追加されたデータベース内のすべての学生を報告する必要があります。問題は、StudentCount 変数などがないことです。DeleteStudent 関数は、配列にギャップを残して学生を削除することもできます (これは変更できません)。また、関数はパラメーターを取ることができません。ID が -1 でないかどうかを確認するために 10000 回ループすることなく、すべての生徒をループまたは印刷する方法はありますか?

実際には、配列がある場合は、配列全体をループする必要があります。10000 要素は多くありませんが、実行時間に関しては問題になりません。

于 2013-09-17T13:28:05.863 に答える
0

1 人の学生の取得に関しては、インデックス ツリーが役立ちます。

配列に値が入力された後、配列インデックスと各生徒の検索可能な値を保持するツリーを構築できます。

次に、ツリーを使用して検索操作が実行され、結果として配列インデックスが得られます。

于 2013-09-17T14:06:32.037 に答える
0
  1. 実際にはそうではありませんが、関数を使用してこれを行う場合は、すべての学生構造をループして ID を -1 に設定する必要があります。ただし、構造体を使用する前に常に ID を確認すると、便利なビット パターンがあるmemsetため、回避できます。-1

    /* assuming all_students is your array of struct student (and not a pointer
     * to a block of memory)
     */
    memset(all_students, -1, sizeof(all_students));
    
  2. リンクされたリストやビットマップなどの別のデータ構造を介して、どの学生が有効かを追跡する他の手段がないわけではありません。

于 2013-09-17T13:21:38.030 に答える