0

ユーザーが実行したい方法に応じて、ファイルの内容を順番に並べ替えるプログラムを作成しています。このファイルには、学生の姓、名、GPA、家族の収入が含まれています。姓、収入、GPA を含むユーザーの選択に基づいてプログラムを並べ替えました。私の問題は、プログラムがファイルを並べ替えると、具体的には収入、gpa、または姓のみを並べ替えてしまうことです。行全体を交換したい。

たとえば、下に 4 つの名前があり、姓、名、GPA、家族の収入が左から右に表示されます。

ヘルナンデス ジョシュア 3.40 65000

スーハリー 3.33 60000

唐エドワード 4.00 100000

関ジェシカ 3.20 50000

私のプログラムが姓でファイルをソートした後、姓のみをソートし、姓がどこにあるかに合わせて残りのデータを変更しません。

関ジョシュア 3.40 65000

ヘルナンデス・ハリー 3.33 60000

Su エドワード 4.00 100000

唐ジェシカ 3.20 50000

これが私のクラスの人です

void getData(Person student[], int& item)
{
    ifstream fin;
    fin.open("C:students.txt");
    item = 0;

    while(!fin.eof())
    {
        fin >> student[item].lastName >> student[item].firstName >> student[item].gpa >> student[item].income;
        item++;
    }


}

void swap(string& name1, string& name2)
{
   //this is a swap function that swaps the data of the two string arguments.
   string temp;
   temp  = name1;
   name1 = name2;
   name2 = temp;
}

void swap2(float& num1, float& num2)
{
    //this is a swap function that swaps the data of the two float arguments
    float temp;
    temp = num1;
    num1 = num2;
    num2 = temp;
}

void sortByLastName(Person student[], int item)
{
   //This for loop will put the items in alphabetical order. 
   for(int j=0; j<item-1; j++)
   {
       //will perform the swapping until all items are in alphabetical order.
       for(int i=0; i<item-1; i++)
          //will swap the two items next to each other if the first item is bigger than the next item.
          if(student[i].lastName > student[i+1].lastName)
            swap(student[i].lastName, student[i+1].lastName);
   }
}

void sortByGpa(Person student[], int item)
{
    //This for loop will put the items in descending order.
   for(int j=0; j<item-1; j++)
   {
      //will perform the swapping until all items are in descending order.
      for(int i=0; i<item-1; i++)
         //will swap the two items next to each other if the first item is smaller than the next item.
         if(student[i].gpa < student[i+1].gpa)
            swap2(student[i].gpa, student[i+1].gpa);
   }
}

void sortByIncome(Person student[], int item)
{
   //This for loop will put the items in ascending order.
   for(int j=0; j<item-1; j++)
   {
      //will perform the swapping until all items are in descending order.
      for(int i=0; i<item-1; i++)
         //will swap the two items next to each other if the first item is smaller than the next item.
         if(student[i].income < student[i+1].income)
            swap2(student[i].income, student[i+1].income);
   }
}

void getChoice(int choice, Person student[], int item)
{

    cout << "Press 1 to sort by last name. Press 2 to sort by gpa. Press 3 to sort by income.";
    cin >> choice;

    if(choice == 1)
        sortByLastName(student, item);
    else if(choice == 2)
        sortByGpa(student, item);
    else if(choice == 3)
        sortByIncome(student, item);
}

void output(Person student[], int item)
{
   //Displays all of the names to the screen.
   for(int i=0; i<item; i++)
      cout << student[i].lastName << " " << student[i].firstName << " " << student[i].gpa << " " << student[i].income << endl;
}
4

2 に答える 2

0

宿題のようにすべてを自分で行う必要がある場合を除き、標準ライブラリを使用してかなりの作業を支援する方がはるかに優れています。次のようなコードを書きます。

struct person { 
    std::string first_name;
    std::string last_name;
    double income;
    double gpa;

    friend std::istream &operator>>(std::istream &is, person &p) { 
        return is >> p.first_name >> p.last_name >> p.income >> p.gpa;
    }

    friend std::ostream &operator<<(std::ostream &os, person const &p) { 
        return os << p.first_name << "\t" << p.last_name << "\t"
                  << p.income << "\t" << p.gpa;
    }
};

// read the data from the file:
std::vector<person> people((std::istream_iterator<person>(infile)),
                            std::istream_iterator<person>());

// sort by GPA:
std::sort(people.begin(), people.end(),
          [](person const &a, person const &b) { return a.gpa < b.gpa; });

// print the data:
for (auto &p : people) 
    std::cout << p << "\n";

GPA で並べ替えるコードに基づくと、名、姓、または収入で並べ替えるコードはかなり明白なはずです。

于 2013-05-25T07:12:25.513 に答える