Продолжайте получать все значения для B char вместо максимального количества всех значений B char

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.

user21600183, double arr[0]; недействителен стандарт C. Какую версию C вы используете?

chux - Reinstate Monica 16.04.2023 07:51

Что должно произойти, если вы не найдете его? Как вы возвращаете найденные значения? max обычно подразумевает единственное значение, но вы, кажется, хотите найти все элементы для данного типа. numOfChars не используется.

Allan Wind 16.04.2023 08:08

Отредактируйте вопрос, чтобы уточнить или предоставить данные, но приведенный выше вопрос отличается от того, который вы задали изначально. Таким образом, было бы лучше вместо этого задать новый вопрос.

Allan Wind 16.04.2023 08:25
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  1. Инициализируйте max вне (внешнего) цикла, иначе каждое значение будет возвращено как max.

  2. Используйте одну петлю. Нет причин не делать этого.

  3. Вы не сказали нам, какой диапазон значений вы ожидаете для pitchSpeed; если 0 является допустимой точкой данных, вы не можете использовать ее для начального значения max.

  4. Обработайте случай, когда поиск не дает никаких результатов. В своем ответе ниже я использую магическое значение -1. Вы также можете вернуть статус (возможно, FOUND / NOT_FOUND) и добавить параметр double *max, чтобы вернуть интересующее значение, если FOUND.

  5. Предпочитайте тип 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];
    }   

Вероятно, это не будет иметь большого значения (если вообще будет) для скомпилированного кода, так что это просто вопрос вкуса.

Другие вопросы по теме