Проблемы с размещением вывода в основной функции в С++

я хочу поместить ввод для n/anzahl и вывод минимальной и максимальной температуры в основную функцию, имея при этом расчет в функции void. я думаю, что моя ошибка в том, что я назвал неправильную ссылку, но я этого не вижу. может кто-нибудь помочь мне увидеть мою ошибку?

я получил это до сих пор. этот код - все в основной функции, он отлично работает, но у меня проблемы с реализацией ввода вывода в основную функцию

#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{


    int n,i;
    int groesst, kleinst;
    int rand(void);
    cout << "Geben Sie Anzahl der Temperaturwerte an: "; //put in the amount of temperatures
    cin >> n;
    n=n+1; //so non programmers arent confused


    vector<int> temp(n);
    cout << "31 zufaellige Temperaturen:\n" << endl;
    groesst = temp[0];
    kleinst = temp[0];
     for (i=1;i<n;i++)
    {
        temp[i]=rand()%20-4;//random temperature between -4 and 15
        cout << temp[i] << " Grad Celsius"<< endl;

        if (temp[i]>groesst) //
        {
            groesst = temp[i]; //
        }

        if (temp[i]<kleinst)
        {
            kleinst = temp [i];
        }
    }


    cout << kleinst; //minimum temperature
    cout << "\n";
    cout << groesst; //maximum temperature

 return 0;
}

это моя попытка:

#include <iostream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;

void minmaxim(vector<int>& temp, int& n, int& kleinst, int& groesst)
{
    int i;
    int rand(void);

    temp[n];
    groesst = temp[0];
    kleinst = temp[0];
     for (i=1;i<n;i++)
    {
        temp[i]=rand()%20-4;


        if (temp[i]>groesst)
            groesst = temp[i];
        }

        if (temp[i]<kleinst)
        {
            kleinst = temp [i];
        }
        return;
    }


int main ()
{
    vector<int> temps;
    int anzahl, minimum,maximum;
    cout << "Geben Sie die Anzahl der Temperaturwerte ein: "; //type in the amounts of temperatures
    cin >> anzahl;

   minmaxim(temps, anzahl, minimum, maximum); //calling the function
   cout << " " << anzahl;

    cout << " " << minimum <<endl;
    cout << " " << maximum <<endl;

    return 0;
}

Можете ли вы объяснить проблему, которую вы видите? Он не компилируется, печатает неправильные значения или?

Tumbleweed53 10.12.2020 05:45

О, сначала вы захотите изменить размер вектора, например. temps.resize(n);. Как бы то ни было, я думаю, вы просто используете неопределенную память.

Tumbleweed53 10.12.2020 05:46

он не печатает ничего, кроме того, что я должен ввести, поэтому `"Geben Sie die Anzahl der Temperaturwerte ein:" `

nrerf 10.12.2020 10:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самая большая проблема заключается в том, что minimum и maximum не инициализируются, когда minmaxim() вызывается, вызывая неопределенное поведение. Прежде чем сравнивать свои значения, вы должны инициализировать maximum и minimum числами ниже и выше диапазона возможных температур, например.

    int anzahl, 
        minimum =  200,     /* initialize min above and max below possible range */
        maximum = -200;

Или, правильно охватывая весь диапазон int, например.

#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()
...
    int anzahl,
        minimum = NMAX,     /* initialize min above and max below possible range */
        maximum = NMIN;

Ваше использование случайных значений с помощью C rand() было заменено в C++ на Генерация псевдослучайных чисел. Вы должны создать и использовать случайное устройство следующим образом:

void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
    std::random_device rd;    /* delcare the randon number generator device */
    std::mt19937 gen(rd());   /* standard mrsene_twister engine seeded w/rd */
    std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */

Затем вызов

int value = dist(rd);

получает случайное значение в диапазоне. Вы можете установить максимальный диапазон или продолжать использовать весь диапазон значений и по модулю, более или менее на ваш выбор.

Вы используете std::vector не совсем правильно. std::vector предоставляет функцию-член .push_back() для добавления к вектору. ваша функция minmaxim () может быть записана как:

void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
    std::random_device rd;    /* delcare the randon number generator device */
    std::mt19937 gen(rd());   /* standard mrsene_twister engine seeded w/rd */
    std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
    
    for (int i = 0; i < n; i++) {
        int randval = dist(rd) % 20 - 4;
        temp.push_back(randval);
        
        if (randval < kleinst)
            kleinst = randval;
        if (randval > groesst)
            groesst = randval;
    }
}

См. Почему «используя пространство имен std;» считается плохой практикой?. Внеся эти изменения, вы можете написать весь исходный код так:

#include <iostream>
#include <vector>
#include <random>

#define NMAX std::numeric_limits<int>::max()
#define NMIN std::numeric_limits<int>::min()

void minmaxim (std::vector<int>& temp, int& n, int& kleinst, int& groesst)
{
    std::random_device rd;    /* delcare the randon number generator device */
    std::mt19937 gen(rd());   /* standard mrsene_twister engine seeded w/rd */
    std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
    
    for (int i = 0; i < n; i++) {
        int randval = dist(rd) % 20 - 4;
        temp.push_back(randval);
        
        if (randval < kleinst)
            kleinst = randval;
        if (randval > groesst)
            groesst = randval;
    }
}


int main (void)
{
    std::vector<int> temps{};
    int anzahl,
        minimum = NMAX,     /* initialize min above and max below possible range */
        maximum = NMIN;
    
    std::cout << "Geben Sie die Anzahl der Temperaturwerte ein: ";
    if (!(std::cin >> anzahl)) {
        std::cerr << "error: invalid integer input.\n";
        return 1;
    }

    minmaxim (temps, anzahl, minimum, maximum); 
    
    for (const auto& t : temps)
        std::cout << t << '\n';
    std::cout << "\n " << anzahl << "\n " << minimum << "\n " << maximum << '\n';

    return 0;
}

(примечание: избегайте включения неиспользуемых заголовков)

Пример использования/вывода

$ ./bin/maxmintemps
Geben Sie die Anzahl der Temperaturwerte ein: 5
4
-4
8
3
13

 5
 -4
 13

Если вы хотите немного упорядочить вывод main(), вы можете вывести значения температуры в строках по 10 с результатами ниже. Затем вы можете законно включить заголовок <iomanip>, чтобы выровнять значения температуры с std::setw(). Вы можете заменить текущий выходной цикл на:

#include <iomanip>
...
    for (size_t i = 0; i < temps.size(); i++) {
        if (i % 10 == 0)
            std::cout.put ('\n');
        std::cout << " " << std::setw(2) << temps[i];
    }
    std::cout << "\n\n anzahl  : " << anzahl << 
                "\n minimum : " << minimum << 
                "\n maximum : " << maximum << '\n';

Обновленный вывод

$ ./bin/randtempchk
Geben Sie die Anzahl der Temperaturwerte ein: 40

  3 13  9  8 12 15  1  0  7  4
 -2 -3  8 14 -4  7 -2  7 -2  2
 10  1 14  7  6  6 13  6  6  0
  5  9  6  8 13  9 14  9 15  6

 anzahl  : 40
 minimum : -4
 maximum : 15

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

спасибо за все это!! я должен был так сказать, но я еще не настолько знаком с программированием, поэтому я не уверен, что означает большинство из этих вещей, которые вы привели. я не думаю, что у нас было «распределение», «отталкивание» или это случайное число генератор в нашей лекции еще. есть ли способ решить эту проблему без их использования?

nrerf 10.12.2020 10:47

Посмеиваясь - никто не знает об этом, когда они начинают. Изучение C++ похоже на поедание кита — вы просто берете его по одному байту за раз :). См. UniformRandomBitGenerator для случайной генерации. (а также просто добавьте в закладки сайт cppreferece.com ). Это лучшая ссылка. Даже сейчас, когда мне нужно поработать с кортежем, я иду в std::tuple и обновляю синтаксис и то, как собрать вещи в один, а затем снова возвращаюсь. Итак, по одному байту за раз :)

David C. Rankin 10.12.2020 10:57

На сайте cppreference вы можете использовать окно поиска, чтобы найти почти все, что вам нужно. Чтобы перейти от страницы кортежа к странице о векторах, просто введите std::vector в поле поиска. (Если вы не знаете точно, что ищете, тогда поиск отстой, поэтому просто начните со ссылок на главной странице этого сайта, и вы обычно можете найти то, что вам нужно. Поиск здесь по переполнению стека , просто используйте "[c++] your search terms", чтобы ограничить поиск вопросами, помеченными [c++]. Здесь и на cppreference есть полезная информация, но скептически относитесь к тому, что вы найдете в других местах. Удачи.

David C. Rankin 10.12.2020 11:04

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