Проблемы заключаются в следующем утверждении:
pass[i] = scores[i];
Вы не хотите копировать партитуру в элемент с таким же индексом; Вы хотите скопировать его в первый «свободный» слот. Вам нужно будет отслеживать, как используются элементы pass
.
Есть еще одна проблема: вы выводите size
чисел, даже если количество проходных баллов меньше.
В этом случае вместо того, чтобы сообщать вызывающему объекту количество элементов в возвращаемом массиве, мы могли бы просто поместить 0
в конце, чтобы указать конец. Но мы должны быть внимательны к случаю, когда все оценки проходят оценки!
Незначительная третья проблема: вы считаете, что оценка 36 является ошибочной! Пусть это будет уроком тестирования: всякий раз, когда вы проводите тестирование, всегда проводите тестирование в пределах и за пределами (в этом случае вы будете тестировать с оценками 35, 36 и 37).
Наконец, Вы динамически выделяете массив, но никогда не освобождаете его. Это не критично, что вы освобождаете его, потому что вы делаете это непосредственно перед выходом из программы, но это плохая привычка. (Одним из возможных последствий является то, что выход таких инструментов, как valgrind
, станет очень шумным, если вы решите использовать его для решения проблемы sh.)
#include <stdio.h>
#include <stdlib.h>
int* getPassingScores(const int* scores, int num_scores) {
const int passingScore = 36;
// calloc is like malloc, but the memory will
// be efficiently initialized to 0. This means
// we don't need to do pass[j] = -1; later.
// Need to make sure we have enough space
// when all the grades are passing grades!
int* pass = calloc(num_scores, sizeof(int));
if (!pass)
return NULL;
for (int i=0, j=0; i<num_scores; ++i) {
if (scores[i] >= passingScore) {
pass[j++] = scores[i];
}
}
return pass;
}
int main(void) {
int scores[] = {55, 35, 60, 25, 10, 43};
int num_scores = sizeof(scores)/sizeof(*scores);
int* passingScores = getPassingScores(scores, num_scores);
for (int i=0; passingScores[i]>0; ++i) {
printf("%d\n", passingScores[i]);
}
free(passingScores);
return 0;
}
Конечно, будет достаточно:
#include <stdio.h>
int main(void) {
int scores[] = {55, 35, 60, 25, 10, 43};
int num_scores = sizeof(scores)/sizeof(*scores);
const int passingScore = 36;
for (int i=0; i<num_scores; ++i)
if (scores[i] >= passingScore)
printf("%d\n", scores[i]);
}