void getMax(int numOfPitches, char pitchType[], double pitchSpeed[], char pitchToFind, int numOfChars){
int index = 0;
for(index = 0; index < numOfPitches; index++){
if (pitchType[index] == pitchToFind){
double max = 0.00;
for(int g = 0; g < index; g++){
if (pitchSpeed[index] > max){
max = pitchSpeed[index];
}
}
printf("%.1lf \n", max);
}
}
}
text file looks like:
S 96.3
B 89.7
S 92.8
H 93.4
B 95.1
B 92.3
B 94.7
S 91.6
S 90.8
S 92.3
S 96.3
H 94.2
S 90.7
B 88.9
B 91.5
S 93.1
H 93.8
Я пытаюсь получить максимальное значение всех значений B, но вместо этого я получаю все значения с плавающей запятой B вместо максимального значения, распечатываемого вместо максимального значения. Что не так с моим кодом? Я думал, что он напечатает максимум, но он печатает все значения с плавающей запятой B.
Что должно произойти, если вы не найдете его? Как вы возвращаете найденные значения? max
обычно подразумевает единственное значение, но вы, кажется, хотите найти все элементы для данного типа. numOfChars
не используется.
Отредактируйте вопрос, чтобы уточнить или предоставить данные, но приведенный выше вопрос отличается от того, который вы задали изначально. Таким образом, было бы лучше вместо этого задать новый вопрос.
Инициализируйте max
вне (внешнего) цикла, иначе каждое значение будет возвращено как max
.
Используйте одну петлю. Нет причин не делать этого.
Вы не сказали нам, какой диапазон значений вы ожидаете для pitchSpeed
; если 0
является допустимой точкой данных, вы не можете использовать ее для начального значения max
.
Обработайте случай, когда поиск не дает никаких результатов. В своем ответе ниже я использую магическое значение -1
. Вы также можете вернуть статус (возможно, FOUND
/ NOT_FOUND
) и добавить параметр double *max
, чтобы вернуть интересующее значение, если FOUND
.
Предпочитайте тип unsigned
для длины или количества; в противном случае вы должны быть готовы справиться с numOfPitches < 0
.
#include <stdio.h>
#define NOT_FOUND -1
double getMax(unsigned numOfPitches, char pitchType[numOfPitches], double pitchSpeed[numOfPitches], char pitchToFind) {
double *max = NULL;
for(unsigned i = 0; i < numOfPitches; i++)
if (
pitchType[i] == pitchToFind &&
(!max || *max < pitchSpeed[i])
)
max = &pitchSpeed[i];
return max ? *max : NOT_FOUND;
}
int main() {
double max = getMax(17,
"SBSHBBBSSSSHSBBSH",
(double []) { 96.3,89.7,92.8,93.4,95.1,92.3,94.7,91.6,90.8,92.3,96.3,94.2,90.7,88.9,91.5,93.1,93.8},
'B'
);
printf("%g\n", max);
}
и пример вывода:
95.1
Объявление max
и инициализация его нулем на каждой итерации, где pitchType[index] == pitchToFind
будет печатать все значения b
, потому что все они будут больше 0,00, объявить и инициализировать max
где-то еще
продолжайте получать все значения для B char вместо максимального количества всех значений B char
Да, вы делаете. Посмотрите на эту часть вашего кода:
if (pitchType[index] == pitchToFind){
....
....
....
printf("%.1lf \n", max);
}
Как видите, у вас есть безусловный printf
внутри if
-оператора, который проверяет тип B
. Таким образом, вы делаете распечатку всякий раз, когда тип B
. Вам нужно переместить этот printf
в конец функции, то есть после первого цикла.
Нравиться:
for(index = 0; index < numOfPitches; index++){
if (pitchType[index] == pitchToFind){
....
....
....
}
}
printf("%.1lf \n", max);
Кроме того, вы не хотите устанавливать max
в ноль внутри цикла. Сделайте это только один раз и перед циклом.
double max = 0.00;
for(index = 0; index < numOfPitches; index++){
if (pitchType[index] == pitchToFind){
....
....
....
}
}
printf("%.1lf \n", max);
И, наконец, вам не нужны вложенные циклы. Один цикл будет делать.
double max = 0.00;
for(index = 0; index < numOfPitches; index++){
if (pitchType[index] == pitchToFind){
if (pitchSpeed[index] > max){
max = pitchSpeed[index];
}
}
}
printf("%.1lf \n", max);
Конечная нота
Часть
if (pitchType[index] == pitchToFind){
if (pitchSpeed[index] > max){
max = pitchSpeed[index];
}
}
можно записать с помощью одного оператора if
, например
if (pitchType[index] == pitchToFind && pitchSpeed[index] > max){
max = pitchSpeed[index];
}
Вероятно, это не будет иметь большого значения (если вообще будет) для скомпилированного кода, так что это просто вопрос вкуса.
user21600183,
double arr[0];
недействителен стандарт C. Какую версию C вы используете?