eine komplizierte Aufgabe mit (struct) Struktur und Funktionen



  • Ich brauche Hilfe mit diese Aufgabe! Ganz hinten habe ich eine noch eine ähnliche Aufgabe angehängt, vielleich es hilft (mir hilft es doch nicht, ich verstehe vieles nicht)

    Hier ist die Aufgabe:

    a) Erstellen Sie eine Datei MesswerteStruktur.cpp. Deklarieren Sie außerhalb von main
    eine Struktur MessWert, welche die folgenden zwei Elemente enthält:
    (1) eine Gleitkommazahl für die Aufnahme des Zahlenwertes und
    (2) einen string für die Aufnahme der Einheit.

    b) Definieren Sie in main zwei Strukturvariablen vom Typ MessWert und initialisieren Sie diese
    mit 20 uA und 10 kV.

    c) Erstellen Sie eine Funktion zur Ausgabe von MessWert-Strukturvariablen auf dem Bildschirm. Ausgegeben werden soll der Zahlenwert, gefolgt von einem Leerzeichen und der Einheit. Es werden zwei Parameter an die Funktion übergeben:
    (1) ein Zeiger auf die auszugebende Strukturvariable und
    (2) eine Ganzzahl zur Beeinflussung der Ausgabe wie folgt:
    0 => keine weitere Aktion
    1 => es wird ein endl angehangen
    2 => es wird ein Leerzeichen angehangen
    3 => es wird ein Leerzeichen und danach ein endl angehangen.
    Die Funktion hat keinen Rückgabewert.
    Geben Sie Ihre beiden Strukturvariaben mittels dieser Funktion aus.

    d) Erstellen Sie eine Funktion zur Normierung der Einheit auf die Basiseinheit (Beispiel: 2.5 kV vor der Normierung werden zu 2500 V nach der Normierung.). Als Basiseinheiten sind A, V und W zulässig. Als Vorsatzzeichen sind n, u (für µ), m sowie k und M zulässig. Die Funktion bekommt eine Referenz auf eine Strukturvariablen vom Typ MessWert übergeben. Der Rückgabewert ist vom Typ int. Konnte die Normierung fehlerfrei durchgeführt werden, so ist eine 0 zurückzugeben, andernfalls eine Zahl ungleich 0.

    Erzeugen Sie zwei neue MessWert-Variablen und initialisieren Sie diese mit den beiden Variablen aus b). Normieren Sie anschließend diese beiden neuen Variablen und geben Sie sie auf dem Bildschirm aus.

    e) Erstellen Sie eine Funktion, die aus zwei MessWert-Variablen die elektrische Leistung berechnet und in einer dritten MessWert-Variablen speichert.

    Die Funktion bekommt drei Referenzen auf MessWert-Variablen übergeben. Die ersten beiden sind die Operanden. Sie sind vor einer Modifikation innerhalb der Funktion zu schützen. Die dritte Referenz ist das Ergebnis.

    Der Rückgabewert der Funktion ist eine Ganzzahl. Konnte die Leistung fehlerfrei berechnet werden, so ist eine 0 zurückzugeben, andernfalls eine Zahl ungleich 0.

    Testen Sie innerhalb der Funktion, ob ein Operator einen Spannungswert und der andere einen Stromwert enthält und behandeln Sie Fehlerfälle entsprechend.

    f) Definieren Sie einen Vektor mit 5 Messwerten und besetzen Sie dessen Elemente mit den zuvor erzeugten MessWert Variablen. Entwickeln Sie eine Ausgabeschleife, die alle Elemente zeilenweise ausgibt.

    Hier ist die ähnliche Aufgabe (die soll eine Zahl in hexadezimale Vorstellung schön umwandeln):

    #include <iostream> //Nummer 6
    
    using namespace std;
    
    struct HexZahl16 {
    short Wert;
    string HexString;
    //0: AB12, 1:AB12h, 2: 0xAB12
    //4: ab12, 5:ab12h, 6: 0xab12
    char Darstellung;
    };
    
    
    void PrintHexZahl (const HexZahl16 &p)
    {
        cout << p.Wert << " = " << p.HexString << endl;
    }
    
    int UpdateHexString (HexZahl16 &p, char d)
    {
    
        string str_tmp = "";
        unsigned short wert = p.Wert;
    
        do{
            char rest = wert % 16;
            wert = wert / 16;
    
            if (rest < 10) {
                // 0,,,9
                rest = rest + '0';
            }
            else if (d & 0x04)
            {
                //a,,,f
                rest = rest + 87;
            }
             else
            {
                //A,,,F
                rest = rest + 55;
            }
    
        str_tmp = rest + str_tmp;
        } while ( wert > 0);
    
        switch(d) {
    case 2:
    case 6:
        str_tmp = "0x" + str_tmp;
        break;
    case 1:
    case 5:
        str_tmp = str_tmp + 'h';
        break;
    case 0:
    case 4:
        break;
    default:
        return 1;
    
        }
    
        p.HexString = str_tmp;
        p.Darstellung = d;
        return 0;
    }
    
    int NormiereHexzahl (HexZahl16 &p)
    {
        string str_tmp = p.HexString;
    short len = str_tmp.length();
        switch(p.Darstellung) {
    case 2:
    case 6:
       while (len++ < 6)
       {
           str_tmp.insert(2, 1, '0');
           }
        break;
    case 1:
    case 5:
        while (len++ < 5)
       {
           str_tmp.insert(0, 1, '0');
           }
        break;
    case 0:
    case 4:
        while (len++ < 4)
       {
           str_tmp.insert(0, 1, '0');
           }
        break;
    default:
        return 1;
        }
        p.HexString = str_tmp;
        return 0;
    }
    
    int main()
    {
        HexZahl16 h01 = {211, "nan", 0};
        HexZahl16 h02 = h01;
      PrintHexZahl(h01);
        UpdateHexString(h01, 6);
      PrintHexZahl(h01);
        NormiereHexzahl(h01);
       PrintHexZahl(h01);
    
        UpdateHexString(h01, 1);
      PrintHexZahl(h01);
        NormiereHexzahl(h01);
      PrintHexZahl(h01);
    
        cout << h01.HexString[2] << endl;
        h01.HexString.erase(1,2);
        PrintHexZahl(h01);
    
        cout << endl << endl << "Array" << endl;
    
        HexZahl16 HexVek[] = {{-32768}, {-20000}, {-1}, {0}, {1}, {15000}, {32767}};
        HexZahl16 *pHexVek = HexVek;
        while (pHexVek < &HexVek[sizeof(HexVek)/sizeof(HexZahl16)])
        {
            if(UpdateHexString(*pHexVek, 2) == 0)
            {
                PrintHexZahl(*pHexVek);
                NormiereHexzahl(*pHexVek);
                PrintHexZahl(*pHexVek);
            }
            pHexVek++;
        }
        return 0;
    }
    
    

    Ich würde mich so sehr freuen, wenn jemand mir helfen kann!


  • Mod

    Was ist deine Frage?



  • Ich frage, ob jemand deise Aufgabe lösen kann.



  • @etaaaaaaa sagte in eine komplizierte Aufgabe mit (struct) Struktur und Funktionen:

    Ich frage, ob jemand deise Aufgabe lösen kann.

    Die Antwort lautet mit 99,999999999%iger Sicherheit "Ja".



  • @Swordfish könntest du vielleich mir auch den Code verraten? Ich wäre sehr dankbar!



  • @etaaaaaaa sagte in eine komplizierte Aufgabe mit (struct) Struktur und Funktionen:

    @Swordfish könntest du vielleich mir auch den Code verraten? Ich wäre sehr dankbar!

    Ja, klar.

    #include <cassert>
    #include <iostream>
    #include <vector>
    #include <string>
    
    /*
    a) Deklarieren Sie außerhalb von main eine Struktur MessWert, welche die
       folgenden zwei Elemente enthält:
       (1) eine Gleitkommazahl für die Aufnahme des Zahlenwertes und
       (2) einen string für die Aufnahme der Einheit.
    */
    struct MessWert
    {
    	double wert;
    	std::string einheit;
    };
    
    /*
    c) Erstellen Sie eine Funktion zur Ausgabe von MessWert-Strukturvariablen auf
       dem Bildschirm. Ausgegeben werden soll der Zahlenwert, gefolgt von einem
       Leerzeichen und der Einheit. Es werden zwei Parameter an die Funktion über-
       geben:
       (1) ein Zeiger auf die auszugebende Strukturvariable und
       (2) eine Ganzzahl zur Beeinflussung der Ausgabe wie folgt:
           0 => keine weitere Aktion
           1 => es wird ein endl angehangen
           2 => es wird ein Leerzeichen angehangen
           3 => es wird ein Leerzeichen und danach ein endl angehangen.
       Die Funktion hat keinen Rückgabewert.
    */
    void ausgeben(MessWert const *messwert, int format)
    {
    	assert(messwert);
    
    	std::cout << messwert->wert << ' ' << messwert->einheit;
    
    	switch (format) {
    	case 1:
    		std::cout << std::endl;
    		break;
    	case 2:
    		std::cout.put(' ');
    		break;
    	case 3:
    		std::cout << ' ' << std::endl;  // wie sinnlos.
    		break;
    	}
    
    	return (void) messwert;
    }
    
    /*
    d) Erstellen Sie eine Funktion zur Normierung der Einheit auf die Basiseinheit
       (Beispiel: 2.5 kV vor der Normierung werden zu 2500 V nach der Normierung.)
       Als Basiseinheiten sind A, V und W zulässig. Als Vorsatzzeichen sind n, u
       (für µ), m sowie k und M zulässig. Die Funktion bekommt eine Referenz auf
       eine Strukturvariablen vom Typ MessWert übergeben. Der Rückgabewert ist vom
       Typ int. Konnte die Normierung fehlerfrei durchgeführt werden, so ist eine
       0 zurückzugeben, andernfalls eine Zahl ungleich 0.
    */
    int normieren(MessWert &messwert)
    {
    	if (messwert.einheit == "A" || messwert.einheit == "V" ||
    		messwert.einheit == "W")
    	{
    		return 0;
    	}
    	
    	if (messwert.einheit.length() != 2 || messwert.einheit[1] != 'A' &&
    	    messwert.einheit[1] != 'V' && messwert.einheit[1] != 'W')
    	{
    		return 42;
    	}
    
    	switch (messwert.einheit[0]) {
    	case 'n':
    		messwert.wert *= 0.000000001;
    		break;
    	case 'u':
    		messwert.wert *= 0.000001;
    		break;
    	case 'm':
    		messwert.wert *= 0.001;
    		break;
    	case 'k':
    		messwert.wert *= 1000.;
    		break;
    	case 'M':
    		messwert.wert *= 1000000.;
    		break;
    	default:
    		return 42;
    	}
    
    	messwert.einheit = messwert.einheit.substr(1);
    	return 0;
    }
    
    /*
    e) Erstellen Sie eine Funktion, die aus zwei MessWert-Variablen die elektrische
       Leistung berechnet und in einer dritten MessWert-Variablen speichert. Die
       Funktion bekommt drei Referenzen auf MessWert-Variablen übergeben. Die
       ersten beiden sind die Operanden. Sie sind vor einer Modifikation innerhalb
       der Funktion zu schützen. Die dritte Referenz ist das Ergebnis.
       Der Rückgabewert der Funktion ist eine Ganzzahl. Konnte die Leistung fehler-
       frei berechnet werden, so ist eine 0 zurückzugeben, andernfalls eine Zahl
       ungleich 0.
       Testen Sie innerhalb der Funktion, ob ein Operator[sic!] einen Spannungswert
       und der andere einen Stromwert enthält und behandeln Sie Fehlerfälle ent-
       sprechend.
    */
    int leistung(MessWert const &operand1, MessWert const &operand2,
    	MessWert &ergebnis)
    {
    	MessWert foo{ operand1 };
    	MessWert bar{ operand2 };
    
    	if (normieren(foo) || normieren(bar))
    		return 42;
    
    	if (!(foo.einheit == "V" && bar.einheit == "A") &&
    	    !(foo.einheit == "A" && bar.einheit == "V"))
    	{
    		return 42;
    	}
    
    	ergebnis.wert = foo.wert * bar.wert;
    	ergebnis.einheit = "W";
    	return 0;
    }
    
    int main()
    {
    	/*
    	b) Definieren Sie in main zwei Strukturvariablen vom Typ MessWert und
    	   initialisieren Sie diese mit 20 uA und 10 kV.
    	*/
    	MessWert a{ 20, "uA" };
    	MessWert b{ 10, "kV" };
    
    	/*
    	Geben Sie Ihre beiden Strukturvariaben mittels dieser Funktion aus.
    	*/
    	ausgeben(&a, 2);
    	ausgeben(&b, 1);
    
    	/*
    	Erzeugen Sie zwei neue MessWert-Variablen und initialisieren Sie diese mit
    	den beiden Variablen aus b). Normieren Sie anschließend diese beiden neuen
    	Variablen und geben Sie sie auf dem Bildschirm aus.
    	*/
    	MessWert c{ a };
    	normieren(c);
    	ausgeben(&c, 2);
    
    	MessWert d{ b };
    	normieren(d);
    	ausgeben(&d, 1);
    
    	// steht zwar nirgends, aber
    	MessWert e;
    	if (leistung(a, b, e)) {
    		std::cerr << "Leistung konnte nicht berechnet werden :(\n\n";
    		return 42;
    	}
    
    	/*
        f) Definieren Sie einen Vektor mit 5 Messwerten und besetzen Sie dessen
    	   Elemente mit den zuvor erzeugten MessWert Variablen. Entwickeln Sie
    	   eine Ausgabeschleife, die alle Elemente zeilenweise ausgibt.
    	*/
    	std::vector werte{ a, b, c, d, e };
    	for (auto const &w : werte)
    		ausgeben(&w, 1);
    }
    


  • @Swordfish Danke mehrmals! :***



  • @Swordfish haettest das nicht mit template magic machen koennen?
    Die wahrscheinlichkeit das OP damit was anfangen kann ist viel zu hoch...



  • Bin auch grad etwas entsetzt 😱
    Muss wohl an der Weihnachtszeit liegen, dass hier Geschenke verteilt werden.


Anmelden zum Antworten