1

これは大学の課題なので、擬似コード、またはプロセスの基本的な考え方を好みます。ただし、助けていただければ幸いです。

問題:

配列courseNamesと配列maximumEnrollmentの2つの並列配列があります。アルファベット順に配列courseNamesに新しい要素を挿入するfacultyが提供する関数を使用する必要があります。

// Assume the elements of the array are already in order
// Find the position where value could be added to keep
//    everything in order, and insert it there.
// Return the position where it was inserted
//  - Assumes that we have a separate integer (size) indicating how
//     many elements are in the array
//  - and that the "true" size of the array is at least one larger 
//      than the current value of that counter

template <typename T>
int addInOrder (T* array, int& size, T value)
{
  // Make room for the insertion
  int toBeMoved = size - 1;
  while (toBeMoved >= 0 && value < array[toBeMoved]) {
    array[toBeMoved+1] = array[toBeMoved];
    --toBeMoved;
  }
  // Insert the new value
  array[toBeMoved+1] = value;
  ++size;
  return toBeMoved+1;
}

配列courseNamesは空なので、最初に関数を使用するときに配列が整然としていることを心配する必要はありません。すべての入力は行で区切られたファイルから取得され、すべての行にはクラスの名前(ei。CS150)と許可される最大登録数(ei。50)が含まれます。最初の配列はコースの名前を保持し、2番目の配列は最大登録数を保持します。

ファイルから入力を読み取る関数のコードは次のようになります。

/*
 * Read the course names and max enrollments. Keep the courses
 * in alphabetic order by course name.
 */
void readCourses (istream& courseFile, int numCourses,
          string* courseNames, int* maxEnrollments)
{
  //!! Insert your code here
    for(int i =0; i < numCourses; ++i){
        string course;
        courseFile >> course;
        int pos = addInOrder(courseNames, numCourses, course);
        courseFile >> maxEnrollments[pos];
    }
}

私は、courseNamesの要素に指定された位置を、指定されたコースの最大登録数を格納するためのインデックスとして使用しています。新しい値がcourseNamesに挿入され、それが追加された位置を取得すると、問題が発生します。その位置を使用すると、インデックスの古い値が上書きされ、すべてが適切に配置されなくなります。

私の質問は、どうすればこれが起こらないようにすることができますか?配列を整理し、並列配列maximumEnrollment *を各コースのcourseNamesのインデックスと一致させるために、どの値が置き換えられたかを確認するにはどうすればよいですか?

あなたが提供できるかもしれないどんな助けにも前もって感謝します!

アップデート

私もこの機能を提供されました:

// Add value into array[index], shifting all elements already in positions
//    index..size-1 up one, to make room.
//  - Assumes that we have a separate integer (size) indicating how
//     many elements are in the array
//  - and that the "true" size of the array is at least one larger 
//      than the current value of that counter

template <typename T>
void addElement (T* array, int& size, int index, T value)
{
  // Make room for the insertion
  int toBeMoved = size - 1;
  while (toBeMoved >= index) {
    array[toBeMoved+1] = array[toBeMoved];
    --toBeMoved;
  }
  // Insert the new value
  array[index] = value;
  ++size;
}

だから私は私のコードをこれに変更しました:

/*
 * Read the course names and max enrollments. Keep the courses
 * in alphabetic order by course name.
 */
void readCourses (istream& courseFile, int numCourses,
          string* courseNames, int* maxEnrollments)
{
  //!! Insert your code here
    int size = 1;
    for(int i =0; i < numCourses; i++){
        string course;
        int maxEnroll;
        courseFile >> course;
        courseFile >> maxEnroll;

        int pos = addInOrder(courseNames, size, course);
        addElement(maxEnrollments, size, pos, maxEnroll);

    }
}
4

0 に答える 0