Я должен написать программу, которая считывает значения и говорит, какая последовательность температур является самой высокой по возрастанию, в каком положении она начинается и какова ее длина, но я не знаю, как это сделать.
Программа заканчивается, если введено число -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;
}
Важно упоминать о том, что с float
s и double
s он невозможен использовать операторы ==
или !=
, потому что после того, как сохраняли, например, один 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
, float
s, и т.д. (в 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
, что сравнение посредством абсолютного вычитания, если она обязательная.