У меня есть массив структур, где каждый объект является студентом с именем и оценкой, и я пытаюсь объединить сортировку этого массива (я хочу отсортировать их по классам в порядке возрастания). Вот структура студента:
struct Student
{
char grade[42];
char city[42];
};
оценка - это символ, потому что я присваиваю оценку, получая данные от пользователя с помощью fgets и sscanf. Я не думаю, что необходимо помещать весь мой код алгоритма сортировки слиянием, но я хочу поделиться этой частью, которая, я думаю, может быть проблематичной c?
int firstHalfSize = midElement - firstElement + 1;
int secondHalfSize = lastElement - midElement;
struct Student firstHalfArray[firstHalfSize];
struct Student secondHalfArray[secondHalfSize];
char *p;
char *s;
int index1 = 0;
int index2 = 0;
int mergedArrIndex = firstElement;
while (index1 < firstHalfSize && index2 < secondHalfSize)
{
if (strtol(firstHalfArray[index1].grade, &p, 10) <= strtol(secondHalfArray[index2].grade, &s, 10))
{
arr[mergedArrIndex] = firstHalfArray[index1];
index1++;
}
else
{
arr[mergedArrIndex] = secondHalfArray[index2];
index2++;
}
mergedArrIndex++;
}
той частью, где я сортирую Объект ученика, сравнивая оценку, состоит в преобразовании char grade
в длинную с strtol
, что, я думаю, у меня получилось хорошо, так что это может не быть проблемой. Мои проблемы в том, что я инициализирую свой массив структур следующим образом:
struct Student students[5501];
, и когда я получаю новый ввод от пользователя, я просто добавляю его в массив следующим образом:
struct Student aStudent;
int lineCounter = 0;
students[lineCounter] = aStudent;
и увеличивайте lineCounter
на 1 каждый раз, когда я получаю новый ввод. (aStudent
изменяется, когда я получаю новый ввод) Здесь я вызываю функцию сортировки слиянием и получаю странные результаты:
mergeSort(students, 0, 5501); // 5501 is the size of the array
printArray(students, 5501);
Вот функция printArray, созданная просто для того, чтобы увидеть, получаю ли я оценку в по возрастанию
void printArray(struct Student A[], int size)
{
char *p;
int i;
for (i=0; i < size; i++)
printf("%ld", strtol(A[i].grade, &p, 10));
}
, но я продолжаю печатать:
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000...
и я не знаю почему. Кроме того, как я могу это сделать, если пользователь добавляет объект «3 студента» в массив students
Я рассматриваю его только как массив из 3 элементов, а не как массив из 5501 элемента? Спасибо! И извините, если это немного долго, я действительно старался быть кратким, не теряя важную информацию.