Как сделать цикл, который читает значения и сравнивает их, чтобы сохранить растущие последовательности?

Я должен написать программу, которая считывает значения и говорит, какая последовательность температур является самой высокой по возрастанию, в каком положении она начинается и какова ее длина, но я не знаю, как это сделать.

Программа заканчивается, если введено число -1, и именно тогда результат должен быть напечатан на экране. Я могу использовать только базовые команды, такие как while, if else или до for, но не намного.

#include <iostream>
using namespace std;
int main(){
    setlocale(LC_CTYPE, "Spanish");
    double temperatura1, temperatura2;
    int contador1, contador2, posicion, contador3;

    temperatura2=0;
    contador2=0;
    contador1=0;
    contador3=0;

    while(temperatura1!=-1 && temperatura2!=-1){

        if(temperatura1!=-1 && temperatura2!=-1){
            cout << "Introduzca la temperatura: ";
            cin >> temperatura1;
        }

        if(temperatura1!=-1 && temperatura2!=-1){
            if(temperatura2>temperatura1){
                if(contador2>contador1)
                    contador1=contador2;
                contador2=1;
            }
        }   
        if(temperatura1!=-1 && temperatura2!=-1){
            contador3++;
            contador2++;
        }

        if(temperatura1!=-1 && temperatura2!=-1){
            cout << "Introduzca la temperatura: ";
            cin >> temperatura2;

        }
        if(temperatura1!=-1 && temperatura2!=-1){
            if(temperatura1>temperatura2){
                if(contador2>contador1)
                    contador1=contador2;
                contador2=1;
            }
        }
            if(temperatura1!=-1 && temperatura2!=-1){
            contador3++;
            contador2++;
            }
    }

    posicion=contador3-contador1-contador2+1;
    if(contador2>contador1){
        contador1=contador2;
        posicion=contador3-contador1+1;
    }
    cout << "\n" << posicion << "\n";
    cout << contador1;
}
0
задан 30.10.2016, 13:39
1 ответ

Важно упоминать о том, что с floats и doubles он невозможен использовать операторы == или !=, потому что после того, как сохраняли, например, один 1 в переменной вышеупомянутого типа, в памяти, выражении 1 он смог бы сохранять действительно как 1.00000001 или как 0.99999999999999999999 и сходные. То же самое применимое в -1 или любое другое число плавающей точки, всегда есть проблемы точности.

Как добавочный совет, используй описательные имена (и не столькие contadorдело в том, что один не знает, зачем служит каждый до тех пор, пока не изучается код). И как longest_init он более короткий, чем inicio_mas_larga, так как код идет на английском (я говорю это тебе с уже, он на английском пишет себе меньше):

#include <iostream>
#include <cmath> // para std::abs (que no es lo mismo que `abs`).

using namespace std;

int main()
{
    int longest_init = 0, longest_end = 0;
    int curr_init = 0, curr_end = 0;

    double curr_temp, former_temp;

    cin >> former_temp;

    // Si la temperatura anterior es diferente a -1
    // (es decir, si no está pegado a `-1`).
    while (std::abs(former_temp - -1.) >= 0.0001) {

       ++curr_end;

       cin >> curr_temp;

       // Comprobar fin de secuencia, bien por -1, bien por no ascendiente
       // Comprobar si secuencia actual es mayor que la secuencia anterior
       if (std::abs(curr_temp - -1) < .0001 or curr_temp <= former_temp) {

           if ((curr_end - curr_init) > (longest_end - longest_init)) {
              longest_init = curr_init;
              longest_end = curr_end;
           }

           curr_init = curr_end;
       }

       former_temp = curr_temp;
    }

    cout << "Secuencia (inicio, longitud): (" << longest_init
         << ", " << (longest_end - longest_init) << ")" << endl;
}

Выполни этот код.

Несколько замечаний:

  • Относительно abs, нужно иметь в виду, что abs это функция, которая происходит C, и из-за retrocompatibilidad (C ++ пробует быть больше retrocompatible с C, что смог, так что большинство программ C смогло быть составленным составителем C ++), C ++ у нее есть, для каждой функции C, несколько функций с тем же именем. В случае abs, есть две версии:

    • Простая функция abs, что только функционирует с целыми числами abs(int), и что не внутри namespace std (потому что C у него нет областей имен).

    • Функция std::abs, с различными перегрузками для int, floats, и т.д. (в C, другие перегрузки доступны через функции fabs, labs, и т.д.).

    По этой причине, хотя уже есть включая using namespace std; в начало кода, я вновь определяю std::abs чтобы избегать того, чтобы была выбрана версия C (что предпочитает), и что оно только функционирует с целыми числами.

  • В случае, если будет несколько максимальных последовательностей (того же размера), алгоритм оставляет себе первую их.

  • Сравнение, которое я использую, чтобы видеть, нисходящая ли последовательность (curr_temp <= former_temp), он сможет поражать тебя тот факт, что он использовал сравнение равенства (<=) когда накануне я только что сказал, что ты не можешь надеяться из-за проблем точности, и это верно. Я это оставил так из-за простоты, не сравнив с другой постоянной величиной, а с предыдущим элементом последовательности (которая переносит те же проблемы точности), так что мы понимаем, что пользователь не будет вводить вручную никогда такую похожую стоимость между собой. В случае -1 сравнение было обязательное, потому что пользователь, в самом деле, может вводить один -1 который приложение потом получает как один -0.99999. Если ты хочешь сделать немного более надежное сравнение, ты можешь делать что-то как:

    (curr_temp - .0001) <= former_temp
    

    так, каким-то образом, мы вынуждаем, что, если настоящая температура практически равна предыдущей, отрицали у него маленькую стоимость, мы вынуждаем, в который он был меньше в former_temp (это поддержания или нет = до определенной степени он опциональный вслед за вычитанием). Но я настаиваю, если пользователь помещает "нормальную" стоимость для упражнения университета, у тебя будут проблемы, кроме с -1, что сравнение посредством абсолютного вычитания, если она обязательная.

2
ответ дан 24.11.2019, 12:51