2016-01-31 2 views
-1

У меня есть структура Студента, которая будет представлять собой Student-массив, содержащий имя студента, их четыре числа GPA и их средний показатель GPA.Использование сортировки вставки для структуры, вызывающей ошибку

struct Student 
{ 
    string name; 
    double gpa[4]; 
    double averageGPA; 
}; 

Я пытаюсь использовать вставки рода для сортировки этого массива студенческих структур по имени студента в алфавитном порядке. Я придумал это до сих пор, когда ptr является указателем на структуру. Я попытался запустить его, и я получаю сообщение об ошибке «operator =». Должно быть, я пытаюсь сравнить элементы, вызывающие эту ошибку?

void insertionSort(Student* ptr[]) 
{ 
    const int MAX = 10; 
    int current = 1;     
    int last = MAX - 1;   
    int temp;      
    int walker;      

    while (current <= last) 
    {  
     temp = ptr[current];   
     walker = current - 1; 
     while (walker >= 0 && temp < ptr[walker]) 
     {  
      ptr[walker+1] = ptr[walker]; 
      walker = walker - 1;  
     } 

     ptr[walker+1] = temp; 
     current = current + 1;  
    } 
} 
+2

> «Я не уверен, будет ли эта сортировка сортировки работать» Вы попробовали запустить ее как часть программы, чтобы проверить, работает она или нет? Если да, то что вы получили? – ray

+0

Создайте несколько тестовых примеров, в которых вы знаете, какой должен быть правильный результат. Попробуй. Я не подхожу, не использую мышление и отладчик. –

+1

Этот код имеет определенную ошибку в 'ptr [walker + 1] = temp;' вы пытаетесь присвоить 'int'' Student'. Вам нужно будет написать специальный код для обмена «Студент» с учетом всех его переменных-членов. –

ответ

1

Вот полное решение вашей проблемы с помощью вставки сортировать:

struct Student 
{ 
string name; 
double gpa[4]; 
double averageGPA; 
}; 

Я определил функцию перестановки двух Student объектов:

void swap(Student* a, Student* b) 
{ 
Student temp; 

temp.name = a->name; 
for(int i=0; i<4; i++) 
    temp.gpa[i] = a->gpa[i]; 
temp.averageGPA = a->averageGPA; 

a->name = b->name; 
for(int i=0; i<4; i++) 
a->gpa[i] = b->gpa[i]; 
a->averageGPA = b->averageGPA; 

b->name = temp.name; 
for(int i=0; i<4; i++) 
b->gpa[i] = temp.gpa[i]; 
b->averageGPA = temp.averageGPA; 
} 

Это основная вставка sort алгоритм:

void insertionSort(Student* ptr) 
{ 
const int MAX = 10; 
int current = 1; 
int last = MAX - 1;   
Student *temp; 
int walker; 

while (current <= last) 
{  
    temp = &ptr[current];   
    walker = current - 1; 
    while (walker >= 0 && temp->name < ptr[walker].name) 
    { 
     swap(temp,&ptr[walker]); 
     temp = &ptr[walker]; 
     walker = walker - 1;  
    } 
    current = current + 1;  
} 
} 

Я проверил этот код, и он работает.

В основном, где вы передаете свой Student массив вставки сортировать как void insertionSort(Student* ptr[]) неверен потому, что вы либо использовать [] или * и они несколько альтернатив представляют то же самое.

+0

Я очень ценю вашу помощь, но вам не нужно было тратить свое время, чтобы сделать для меня полное решение. Я только надеялся получить совет, чтобы поставить меня в правильном направлении. Мне не разрешено выполнять функцию свопинга для этого домашнего задания, но, благодаря вашей помощи, я думаю, что могу найти способ заставить его работать без использования функции свопинга. Спасибо. – Mark

+0

@Mark Это не было проблемой, на самом деле то, что я хочу, чтобы вы поняли, заключается в том, что вы должны обрабатывать содержимое «struct» explicity при копировании его на другой. Просто присваивание самого объекта ничего не делает, и это то, что мы называем ** мелкой копией **. Вы можете изучить концепции Deep Copy и Shallow Copy **, чтобы лучше понять их. –

+0

@Mark Кроме того, массивы уже переданы по ссылке, поэтому нет необходимости отправлять 'Student * ptr []' в качестве аргумента. Любой из 'Student ptr []' или 'Student * ptr' будет делать. И передача 'Student * ptr []' может быть полезна, когда вы хотите передать массив массивов, например, если они представляют студентов для их организации по разным дисциплинам. –

Смежные вопросы