020
02.02.2019, 15:10 Uhr
f.-th.
|
Da in der Aufgabenstellung etwas von vector <int> und standard int Arrays der Länge ANZ_ELEM steht, hatte ich vermutet das doch eine Lösung mit Containern erwartet wurde?
Zitat von fastlife: |
... Aufgabe:
1. Erstellen einer vector <int> Liste bzw. eines standard int Arrays der Länge ANZ_ELEM -> 1.3 von Zufallszahlen, jeweils aus dem Bereich [0 ... ANZ_ELEM]
...
|
Wie das mit dem vector <int> etwa aussehen kann hatte ich ja mit dem 6 aus 49 Beispiel angedeutet.
Nun noch etwas zu std::array<int, Anz_Elemente im Array>:
array-container in cpp Stand 2018/19
bisher ist bei C++ zwar der std::array-container verfügbar aber die Lösungen sind, gemessen an einem guten C++ Stil, noch nicht ganz gelungen.
C++: |
#include <array> #include <algorithm> #include <iostream>
int main() { const int arraysize = 10; std::array <int, arraysize> a; // ORACLE c-array-containers-2252536.html for (int i = 0; i < arraysize; i++) { a[i] = ((i * 32315 ^ 393) &15); } for (auto n : a) std::cout << n << std::endl; }
|
Bis hierher sieht das ja elegant aus.
Als nächsten Schritt lagern wir die Ausgabe in eine Funktion aus. In sehr vielen Tutorials oder Beispielen im Netz hat man für die Länge des std::array oft eine feste Zahl genommen und das ist dann nicht mehr so elegant:
C++: |
void gib_array_aus(std::array<int, 15> &Array);
int main() { std::srand(time(NULL )); std::array <int, 15> a; for (int i = 0; i < 15; i++) { a[i] = std::rand() % (15 + 1); } gib_array_aus(a); }
void gib_array_aus(std::array<int, 15> &Array) { std::cout << "{\n"; for (auto n : Array) std::cout << n << std::endl; std::cout << "}" << std::endl; }
|
Plan B, das Ganze global ist auch nicht so ganz das Rechte:
C++: |
const int Anz_Elem = 10; // global? ==> const?
void gib_array_aus(std::array<int, Anz_Elem> &Array);
int main() { std::srand(time(NULL )); std::array <int, Anz_Elem> a; for (int i = 0; i < Anz_Elem; i++) { a[i] = std::rand() % (Anz_Elem + 1); } gib_array_aus(a); }
void gib_array_aus(std::array<int, Anz_Elem> &Array) { ...
|
dann gibt es zu dem Thema noch verschiedene Lösungswege mit Config-Datein oder mit einem Template
Es gibt Überlegungen in C++20 folgende Lösung zu ermöglichen:
C++: |
#include <array> #include <algorithm> #include <iostream> #include <ctime> // rand()
void gib_array_aus(auto &Array);
int main() { const int Anz_Elem = 10; std::srand(time(NULL )); std::array <int, Anz_Elem> a; for (int i = 0; i < Anz_Elem; i++) { a[i] = std::rand() % (Anz_Elem + 1); } gib_array_aus(a); }
void gib_array_aus(auto &Array) { std::cout << "{\n"; for (auto n : Array) std::cout << n << std::endl; std::cout << "}" << std::endl; }
|
Die letzte Lösung ist noch nicht im Cpp Standard! Halbwegs aktuelle g++ Compiler übersetzen den Quelltext als C++14 oder höher/neuer. Andere Compiler (noch?) nicht.
Ich hoffe mal dieser Beitrag ist im Sinn des Forums.
Die Quelltexte sind nicht alle komplett. Aber, das erkennt ihr ja, das da ein paar Zeilen fehlen.
Quellen: https://www.learncpp.com/cpp-tutorial/6-15-an-introduction-to-stdarray/ https://stackoverflow.com/questions/ bei letzterer mehrere Beispiele. Es wurden auch noch andere Texte zu dem Thema gelesen.
MfG f.-th. Dieser Post wurde am 02.02.2019 um 15:37 Uhr von f.-th. editiert. |