я хочу поместить ввод для 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;
}
О, сначала вы захотите изменить размер вектора, например. temps.resize(n);
. Как бы то ни было, я думаю, вы просто используете неопределенную память.
он не печатает ничего, кроме того, что я должен ввести, поэтому `"Geben Sie die Anzahl der Temperaturwerte ein:" `
Самая большая проблема заключается в том, что 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
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.
спасибо за все это!! я должен был так сказать, но я еще не настолько знаком с программированием, поэтому я не уверен, что означает большинство из этих вещей, которые вы привели. я не думаю, что у нас было «распределение», «отталкивание» или это случайное число генератор в нашей лекции еще. есть ли способ решить эту проблему без их использования?
Посмеиваясь - никто не знает об этом, когда они начинают. Изучение C++ похоже на поедание кита — вы просто берете его по одному байту за раз :)
. См. UniformRandomBitGenerator для случайной генерации. (а также просто добавьте в закладки сайт cppreferece.com ). Это лучшая ссылка. Даже сейчас, когда мне нужно поработать с кортежем, я иду в std::tuple и обновляю синтаксис и то, как собрать вещи в один, а затем снова возвращаюсь. Итак, по одному байту за раз :)
На сайте cppreference вы можете использовать окно поиска, чтобы найти почти все, что вам нужно. Чтобы перейти от страницы кортежа к странице о векторах, просто введите std::vector
в поле поиска. (Если вы не знаете точно, что ищете, тогда поиск отстой, поэтому просто начните со ссылок на главной странице этого сайта, и вы обычно можете найти то, что вам нужно. Поиск здесь по переполнению стека , просто используйте "[c++] your search terms"
, чтобы ограничить поиск вопросами, помеченными [c++]
. Здесь и на cppreference есть полезная информация, но скептически относитесь к тому, что вы найдете в других местах. Удачи.
Можете ли вы объяснить проблему, которую вы видите? Он не компилируется, печатает неправильные значения или?