Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Brauche Hilfe bei der Bool Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
28.01.2019, 09:53 Uhr
ao

(Operator)



Zitat von f.-th.:
Gib Gas, sonst ist der Zug beim Programmieren für dich abgefahren.

Bleib entspannt. In dem Programm fehlen nur Kleinigkeiten, dann läuft es. Abgefahren ist der Zug erst dann, wenn man aufhört, dazuzulernen.

Der Sprachstil ist ein Problem, aber dafür können die Studenten nix.

Dieser Post wurde am 28.01.2019 um 09:54 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
28.01.2019, 10:20 Uhr
fastlife




Zitat:
Bleib entspannt. In dem Programm fehlen nur Kleinigkeiten, dann läuft es. Abgefahren ist der Zug erst dann, wenn man aufhört, dazuzulernen.


Ja ich bemühe mich. Kannst du mir sagen, welche Kleinigkeiten hier fehlen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
28.01.2019, 10:26 Uhr
ao

(Operator)


Lies mal auf Seite 1 ganz unten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
28.01.2019, 11:27 Uhr
fastlife




C++:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void gib_array_aus(int a[], int);
void ist_array_aufsteigend_sortiert(arr, ANZ_ElEM);

int main()
{
    const int ANZ_ElEM = 15;

    srand(2);  

    int arr[ANZ_ElEM];
    for (int i = 0; i < ANZ_ElEM; i++)
    {
        arr[i] = rand() % (ANZ_ElEM + 1);
    }
    gib_array_aus(arr, ANZ_ElEM);

    bool is = ist_array_aufsteigend_sortiert(arr, ANZ_ElEM);
    if (is)
    {
        cout << "Das Array ist aufsteigend sortiert." << endl;
    }
    else
    {
        cout << "Das Array ist nicht aufsteigend sortiert." << endl;
    }

    system("Pause");
    return 0;
}

void gib_array_aus(int a[], int n)
{
    cout << "{";
    for (int i = 0; i < n; i++)
    {
        cout << a[i];
        if (i < n - 1)
            cout << ",";
    }
    cout << "}" << endl;
}

bool ist_array_aufsteigend_sortiert(int a[], int n)
{
    for (int i = 1; i < n; i++)
    {
        if (a[i - 1] < a[i])
            return false;
    }
}



Ich habe es jetzt so gemacht, wie ihr gesagt habt und hab versucht mein ,,ist_array_aufsteigend_sortiert" am Anfang zu definieren ,aber da kommen trotzdem viele Errors raus.


Zitat:
Was den Code-Stil angeht: Der ist spätestens seit dem Standard C++11 (verabschiedet 2011, daher der Name) völlig veraltet, wird aber an Universitäten beharrlich weiter gelehrt. Vermutlich aus dem katholischsten aller Gründe: "das hamwer immer so gemacht


Interessant zu hören, schade das die Universitäten nicht auf den neusten Stand sind :/ .

Dieser Post wurde am 28.01.2019 um 11:32 Uhr von fastlife editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
28.01.2019, 12:06 Uhr
ao

(Operator)



Zitat von fastlife:
hab versucht mein ,,ist_array_aufsteigend_sortiert" am Anfang zu definieren ,aber da kommen trotzdem viele Errors raus.


Machs so:

C++:
using namespace std;

void gib_array_aus(int a[], int);
bool ist_array_aufsteigend_sortiert(int arr[], int ANZ_ElEM);

int main()
{
/* ..... */



Das nennt sich "Prototyp", es macht den Funktionsnamen bekannt und gibt an, welche Parameter die Funktion annimmt (Anzahl und Typen der Parameter, optional auch die Namen) und was sie zurückgibt. Du hast dabei folgende Fehler gemacht:
1. Der Rückgabetyp im Prototyp muss natürlich mit dem übereinstimmen, den die Funktion tatsächlich hat (hier bool).
2. Du hast nicht die Typen der Parameter genannt, sondern nur die Namen (arr und ANZ_ELEM). Die richtige Minimallösung wäre gewesen (int[], int), damit hätte der Compiler die Datentypen gekannt und wäre zufrieden gewesen. (int arr[], int ANZ_ELEM) ist aber genauso korrekt und für menschliche Leser sogar hilfreicher, weil auch die Bedeutung der Parameter genannt wird - das hilft, die Aufgabe der Funktion zu verstehen.

In der Praxis kannst du einfach die Kopfzeile der Funktion von unten kopieren und oben einfügen, dann noch ein Semikolon anhängen und fertig.


Zitat:
da kommen trotzdem viele Errors raus.

Mach dir bitte in Zukunft die Mühe, die Fehlermeldungen hier zu nennen, das erspart es uns, den Code jedesmal durch den Compiler zu schicken. Wenn es sehr viele Fehler sind, dann nur die ersten paar, es sind dann wahrscheinlich viele Folgefehler dabei.


Zitat:

Interessant zu hören, schade das die Universitäten nicht auf den neusten Stand sind :/ .

Ja. Leider ist es die Regel, dass Studenten, die hier mit Übungsaufgaben aufschlagen, mit immer denselben ollen Kamellen kommen. Blätter hier mal zurück, dann siehst du es. Das ist original derselbe Krempel, mit dem wir schon gequält wurden (und ich bin seit 1994 mit der Uni fertig).

Das wäre im Prinzip nicht schlimm, wenn das gelehrte Wissen immer noch aktuell und richtig wäre, aber das ist hier definitiv nicht der Fall! Die Sprache C++ ist weiterentwickelt und erheblich (!!!) verbessert worden. Bjarne Stroustrup hat über C++11 gesagt "it feels like new language", und damit hatte er recht. Nur die Hochschullehrer nehmen das offenbar nicht zur Kenntnis und lehren immer noch so, wie es ihnen selbst beigebracht worden ist.

Dieser Post wurde am 28.01.2019 um 12:29 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
28.01.2019, 12:52 Uhr
fastlife




Zitat:
Das nennt sich "Prototyp", es macht den Funktionsnamen bekannt und gibt an, welche Parameter die Funktion annimmt (Anzahl und Typen der Parameter, optional auch die Namen) und was sie zurückgibt. Du hast dabei folgende Fehler gemacht:
1. Der Rückgabetyp im Prototyp muss natürlich mit dem übereinstimmen, den die Funktion tatsächlich hat (hier bool).
2. Du hast nicht die Typen der Parameter genannt, sondern nur die Namen (arr und ANZ_ELEM). Die richtige Minimallösung wäre gewesen (int[], int), damit hätte der Compiler die Datentypen gekannt und wäre zufrieden gewesen. (int arr[], int ANZ_ELEM) ist aber genauso korrekt und für menschliche Leser sogar hilfreicher, weil auch die Bedeutung der Parameter genannt wird - das hilft, die Aufgabe der Funktion zu verstehen.

In der Praxis kannst du einfach die Kopfzeile der Funktion von unten kopieren und oben einfügen, dann noch ein Semikolon anhängen und fertig.


Vielen Dank! Ich habe jetzt mehr Sache hier rausgelernt, als bei der eigentlichen Vorlesung.


Zitat:
Mach dir bitte in Zukunft die Mühe, die Fehlermeldungen hier zu nennen, das erspart es uns, den Code jedesmal durch den Compiler zu schicken. Wenn es sehr viele Fehler sind, dann nur die ersten paar, es sind dann wahrscheinlich viele Folgefehler dabei.


Ja tut mir leid,werde ich in der Zukunft machen.


Zitat:
Das wäre im Prinzip nicht schlimm, wenn das gelehrte Wissen immer noch aktuell und richtig wäre, aber das ist hier definitiv nicht der Fall! Die Sprache C++ ist weiterentwickelt und erheblich (!!!) verbessert worden. Bjarne Stroustrup hat über C++11 gesagt "it feels like new language", und damit hatte er recht. Nur die Hochschullehrer nehmen das offenbar nicht zur Kenntnis und lehren immer noch so, wie es ihnen selbst beigebracht worden ist.


Ich hoffe es kommt bald eine neue Reform an meiner Uni, dass die Programmiersprachen auf einen Stand gebracht werden.


Nochmals vielen Dank !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
28.01.2019, 15:58 Uhr
ao

(Operator)



Zitat von fastlife:
Vielen Dank! Ich habe jetzt mehr Sache hier rausgelernt, als bei der eigentlichen Vorlesung.

Gern geschehn. Es hilft eben, das Ganze mal an einer praktischen Aufgabe durchzuspielen.


Zitat:
Ich hoffe es kommt bald eine neue Reform an meiner Uni, dass die Programmiersprachen auf einen Stand gebracht werden.

Wenn das nicht gerade schon konkret im Gange ist, dann würde ich darauf nicht wetten.

Ich glaube übrigens, dass deine ist_array_aufsteigend_sortiert-Funktion das falsche Ergebnis liefert. Spiel das mal aufm Papier durch mit einem Array, das perfekt sortiert ist. Du kriegst false zurück, weil deine Bedingung falsch ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
28.01.2019, 17:17 Uhr
fastlife




Zitat:
Ich glaube übrigens, dass deine ist_array_aufsteigend_sortiert-Funktion das falsche Ergebnis liefert. Spiel das mal aufm Papier durch mit einem Array, das perfekt sortiert ist. Du kriegst false zurück, weil deine Bedingung falsch ist.


Ja, also wenn ich das abspiele kommt eine Zahlenfolge und die Aussage: ,,Das Array ist nicht aufsteigend sortiert" Wie kann ich die Bedingung ändern? ( ich habe versucht die letzte Zeile in true zu ändern ,aber kommt trotzdem das gleiche raus)

(Zudem kommt immer die gleiche Zahlenfolge raus, wie kann man das machen das immer zufällige generierte Zahlen Kombinationen raus kommen ?. Habe es auch in srand
(time(NULL ) umgeändert.

Dieser Post wurde am 28.01.2019 um 17:33 Uhr von fastlife editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
31.01.2019, 23:32 Uhr
f.-th.



Wir schreiben ja hier hin und wieder von aktuellerem C++.

Hier ein Teil der Lösung bei einer ähnlichen Aufgabe etwas moderner und noch ohne sortieren.

Da ist bei z.B. bei den Namen der Vectoren sicher noch etwas Luft.

Auch die Quelltextformatierung ist nicht optimal - aber einfaches copy&paste ist ja ...


C++:

#include <iostream>
#include <vector>
#include <algorithm>

void gib_array_aus(std::vector<int> &Array);

int main()
{
const int Anz_Elem = 6;
    
std::vector<int> zahlen;
std::srand(time(NULL)); // zufallsgenerator initialisieren
for(int i = 0; i < Anz_Elem; ++i)
  zahlen.push_back(std::rand()%49+1); // 6 zufallszahlen zwischen 0 und 49 generieren
gib_array_aus(zahlen);
}

void gib_array_aus(std::vector<int> &Array)
{
    std::cout << "{\n";
    std::for_each(Array.begin(), Array.end(), [](int v) {std::cout << v << '\n';});
    std::cout << "}" << std::endl;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
01.02.2019, 13:05 Uhr
ao

(Operator)


Das mit dem Lambda ist für einen Anfänger vielleicht ein bisschen zuviel auf einmal. Ich würde daher diese Ausgabefunktion vorschlagen:

C++:
void gib_array_aus(const std::vector<int> &Array)
{
    std::cout << "{\n";
    for (auto n : Array)
        std::cout << n << std::endl;
    std::cout << "}" << std::endl;
}



Der wichtigste Vorteil von std::vector gegenüber dem C-Array ist, dass er ein vollständig selbst-beschriebenes Objekt ist, das weiß, wieviele Elemente es enthält. Einer Funktion wie gib_array_aus muss man also nur den vector übergeben und nicht noch eine Längenangabe dazu.

Das Problem bei der Längenangabe ist nicht die Tipparbeit, sondern die Möglichkeit, Fehler zu machen und eine Länge zu übergeben, die nicht zum Array passt. Hierfür gibt es keine Sicherheitsmechanismen, der Programmierer ist allein verantwortlich. Bei einem Array ist das noch leicht, aber stell dir vor, dein Programm wird größer und enthält zehn oder hundert solcher Arrays, die alle verschieden lang sind. Das wird der blanke Horror.

Wenn es um Lottozahlen geht, ist freilich std::set als Containerklasse geeigneter als std::vector, aus zwei Gründen:
1. bei Lottozahlen kann dieselbe Zahl nicht zweimal gezogen werden. std::rand kann das nicht sicherstellen, aber beim Einfügen in den set wird eine Zahl, die bereits enthalten ist, nicht akzeptiert - das kann man abfragen und die Zahl neu ziehen, so lange bis 6 verschiedene Zahlen gezogen wurden.
2. der Set speichert die Zahlen automatisch in aufsteigender Reihenfolge, das Sortieren gibts also geschenkt.

Beides (die Einzigartigkeit der Zahlen und die aufsteigende Sortierung) müsste man ohne set selber programmieren.

Man sieht also schon an diesem einfachen Beispiel, wie sehr es sich lohnt, mit modernem C++ zu arbeiten. Hier ist ein vollständiges Programm. Es ist sehr ausführlich geschrieben, um die Schritte zu verdeutlichen und um die Debug-Ausgaben unterzubringen. Als produktives Programm (ohne Lehrcharakter) würde man das wahrscheinlich wesentlich kürzer machen:


C++:
#include <iostream>
#include <set>
#include <algorithm>

static void print (const std::set<int> & numbers)
{
    std::cout << "{ ";
    for (auto n : numbers)
        std::cout << n << " ";
    std::cout << "}" << std::endl;
}

int main ()
{
    std::srand(time(0));
    std::set<int> numbers;
    const int NUM_NUMBERS = 6;
    while (numbers.size() < NUM_NUMBERS)
    {
        int n = std::rand() % 49 + 1;
        std::cerr << n;
        auto result = numbers.insert(n);
        if (result.second)
        {
            std::cerr << ": inserted." << std::endl;
        }
        else
        {
            std::cerr << ": rejected." << std::endl;
        }
    }
    
    print (numbers);
    
    return 0;
}


Dieser Post wurde am 01.02.2019 um 13:07 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: