Strukturierte Programmierung

Aufrufe: 1046     Aktiv: 13.01.2022 um 07:43

0

Hallo ich benötige Hilfe!

Ich soll oberhalb von main eine Struktur MEssWert mit 2 Elemtene erstellen, die eine Gleitkommazahl um des Zahlenwert (50,8ua und 70,5kV) aufzunehmen und einen string für die Aufnahme der Einheit!

Meine Idee ich würde float für die gleitkommazahl angeben ich weiß aber nicht wie ich den string definieren soll?! Vielen Dank im Voraus

EDIT vom 15.12.2021 um 17:37:

enter image description here

Diese Frage melden
gefragt

Punkte: 10

 

Ich habe eine andere Frage könntest du da mal vorbeischauen? danke

  ─   mathe_97 12.01.2022 um 16:11

Hallo mathe_97, geht's um deine neuem Fragen?

  ─   jobe 13.01.2022 um 07:38
Kommentar schreiben
3 Antworten
0

Hallo mathe_97, leider hast Du die Programmiersprache nicht angegeben. Für C gilt folgendes: im einfachsten Fall gibst du ein Array of char an, z.B. char Name[50+1]; Dann hast du 50 Zeichen als String oder du definierst einen char Zeiger. Also char *Name; Dann musst du Speicher für den Zeiger anfordern: Name = calloc(1, 51); Dann hast du wieder 50 Zeichen für deinen String. C schließt einen String immer mit 0x00 ab. Also brauchst du immer ein char mehr als der String lang sein muss. Hoffe es hilft. Falls es sich um eine andere Sprache handelt, bitte spezifizieren. Gruß jobe.

Nachtrag: bei C++ wurde die Stringverarbeitung vereinfacht. Es gibt den Datentyp string. Hier kannst du also einfach string Name; definieren.

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Die Sprache ist C++

  ─   mathe_97 10.12.2021 um 14:03

Hallo mathe_97, dann geht meine Antwort. Das geht auch in C++. Gruß jobe

  ─   jobe 10.12.2021 um 14:13

1

include
using namespace std;

struct MessWert {
short Wert;
string Einheit;

};

// c) Ausgabefunktion

void PrintAusgabe(MessWert *p)
{
cout << p->Wert << " = " <Einheit<< endl;
}
bei der ausgabe habe ich keine Werte wieso?

// e) Funktion zur Normierung (erstellung einer funktion zur Normierung der Basiseinheit z.B.: 554.4--> normiert 0.0005544)

int NormiereEinheit (Einheit &r)
string str_tmp = r.Einheit;
char leng = str_tmp.lengh ();
switsch (r.Darstellung) {
case 554.4:
case 9.35
hier weiß ich nicht so ganz wie ich die FEhlerbehandlung durchführen soll ich würde es so machen
// Fehlerbehandlung
if (len > 554.4)
return -9.35;
if (( str_tmp [0] != ´0´) und weiter?


// g) (ich soll hier eine funktion erstellen die aus 2 variablen die elektrische Leistung in W berechnen soll) und diesen 3. Wert abspeichern soll
int UpdateEinheit (MessWert &r, char d)
string str_tmp= "";
unsigned short Wert = r.Wert;



int main ()
{
// b) Definition und Initialisierung von Strukturvariablen

MessWert Wert1 = {554.4,"uA"};
MessWert Wert2 = {9.35, "kV"};



return 0;

ich hoffe du kannst mir dabei weiterhelfen ;D

  ─   mathe_97 14.12.2021 um 19:56

Hallo mathe_97 die Formatierung ist scheußlich und es kommt bei mit copy paste scheinbar nur die Hälfte an. Kannst du das versuchen zu verbessern? Gruß jobe

  ─   jobe 14.12.2021 um 20:36

Ich habe es einfach nur eingetippt ;)

  ─   mathe_97 14.12.2021 um 21:44

Kommentar schreiben

0

Hallo mathe_97, ich hab mal ein paar Programmstückchen gemacht. Schau, ob sie dir weiterhelfen. Wie ich schon geschrieben habe kann ich deinen Ansatz leider nur erraten.

Dekalration muss etwas abgewandelt werden.

    /* Alte Deklaration, auskommentiert.
    struct MessWert {
    double  Wert;   // float oder double. Sonst gehen keine Kommazahlen.
    string Einheit;
    };
    */
// Neue Deklaration als typedef
    typedef struct MessWertStruct {
    double  Wert;   // float oder double. Sonst gehen keine Kommazahlen.
    string Einheit;
    } MessWert;

Ausgabe war fast richtig

void PrintAusgabe(MessWert* p)
{   // hier hast du ein "<" und ein "p->" vergessen
    cout << p->Wert << " = " << p->Einheit << endl;
}

Beim Normieren geht der switch - case nicht. Du musst von der Einheit auf den Faktor schließen. Deshalb müsstest du switch(Einheit) machen was aber mit Strings nicht geht. Es gäbe mehrere Lösungsansätze. Am Einfachsten ist aber wohl if() else if()... else if() else.

void NormiereEinheit(MessWert* r)
{
    double Faktor = 1;
    string Basis = "";

    if (r->Einheit == "uA")
    {
        Faktor = 1000000;
        Basis = "Ampere";
    }
    else if (r->Einheit == "mA")
    {
        Faktor = 1000;
        Basis = "Ampere";
    }
//.....
    if (Basis.size() > 0)
        r->Einheit = Basis;
    r->Wert = r->Wert / Faktor;
}

Zum Berechnen übergibst du 2 Zeiger und gibst das Ergebnis entweder direkt aus oder als Funktionswert zurück. Etwa so

MessWert UpdateEinheit(MessWert* Strom, MessWert* Spannung)
{
    MessWert DasErgebnis;
    //......rechnen
    return DasErgebnis;
}

Zum Schluss das Hauptprogramm - als ein mögliches Beispiel.

int main()
{
  MessWert Wert1 = { 554.4,"uA" };
  MessWert Wert2 = { 9.35, "kV" };
  MessWert Ergebnis;

  NormiereEinheit(&Wert1);
  NormiereEinheit(&Wert2);
  Ergebnis = UpdateEinheit(&Wert1, &Wert2);
  PrintAusgabe(&Ergebnis);
  return 0;
}

Nun sollte es aber hoffentlich klappen. Gruß jobe

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Müsste es nicht bei der normierung so lauten: void NormiereEinheit ( MessWert* & r)
} sein? Mit deiner Schreibweise wird mir ein Fehler angezeigt

  ─   mathe_97 14.12.2021 um 21:58

Nö, Zeiger als Parameter werden mit TYP STERN VARIABLE gemacht. Z.B. int * DerZeiger. Mein Compiler hat das anstandslos geschluckt. Allerdings hatte ich erwartet, dass er "struct MessWert* Strom" will weil deine Deklaration keine Typdefinition (typedef) ist. Versuchs mal mit dem Zusatz struct. Der & Operator wird nur bei der Übergabe benötigt. Er bedeutet nimm nicht den Wert der Variablen sondern deren Adresse was dann ein Zeiger ist.

  ─   jobe 14.12.2021 um 22:24

Also so
void NormiereEinheit(struct MessWert* Strom)

  ─   mathe_97 14.12.2021 um 22:30

Also da wird mir wieder ein Fehler ausgegeben vielleicht benötigt er einen rückgabewert?

  ─   mathe_97 14.12.2021 um 22:40

Sorry, da bin ich verrutscht und habe als Beispiel den Header von UpdateEinheit() genommen. Wenn das mit struct nötig ist, musst du das natürlich in allen Headern anpassen. Beispiel für NormiereEinheit: "void NormiereEinheit(struct MessWert * r)". Wie gesagt, das muss dann bei allen Funktionsheadern die MessWert übergeben bekommen gemacht werten..

Vielleicht ist es einfacher die Deklaration anzupassen. Dann muss man in den Funktionsheadern nichts ändern. Ich passe mal meine zweite Antwort an. Wenn es damit auch nicht geht liegt das Problem woanders. Da musst du mal die Fehlermeldugn genau analysieren.

  ─   jobe 15.12.2021 um 08:26

die funktion zur normierung ist immer noch falsch ich weiss einfach nicht wo der fehler ist

  ─   mathe_97 15.12.2021 um 16:10

Fehler: expected initializer before »void«
void NormiereEinheit(struct MessWert * r)

  ─   mathe_97 15.12.2021 um 16:19

wie kann ich das in g) berechnen?

  ─   mathe_97 15.12.2021 um 16:45

Wie ich schon gesagt habe, die Darstellung deines Codes ist sehr unglücklich. Liegt ziemlich sicher am hier verwendeten Editor. Als ich gestern int * DerZeiger eingegeben habe war nachher der * weg und DerZeiger kursiv geschrieben.
Der // als Kommentar gilt nur für die aktuelle Zeile. Kann es sein, dass dein Kommentar „e) Funktion….“ mehrzeilig ist? Die Fehlermeldung würde ich zunächst so interpretieren, dass zwischen dem Ende der Funktion void PrintAusgabe(MessWert * p) und der Zeile void NormiereEinheit(MessWert * r) etwas steht was der Compiler versucht zu übersetzen. Könntest du ggf. ein Bild von deinem Code machen und hochladen?
g) habe ich ja mit MessWert UpdateEinheit(MessWert Strom, MessWert Spannung) angedeutet. Ich habe deine Bezeichnung übernommen. Ich hätte einen anderen Namen zur Berechnung genommen oder fehlt dir das Wissen wie man die elektrische Leistung berechnet?

  ─   jobe 15.12.2021 um 17:15

Die Leistung ist das Produkt aus elektrischer Spannung und elektrischen Strom

weiß nicht so ganz wie ich das in c++ übernehmen soll da macht er wieder einen Fehler in der Ausgabe

  ─   mathe_97 15.12.2021 um 17:33

Ich habe den Aufgabenteil e) hochgeladen am Ende haben noch die „;“ gefehlt

  ─   mathe_97 15.12.2021 um 17:40

Bedeutet das jetzt, dass du fehlerfrei Übersetzen und laufen lasen kannst?

Die Funktion NormiereEinheit() ist noch nicht fertig. Ich habe das versucht mit "//....." anzudeuten. Bisher wird nur µA und mA in die Basis Ampere umgerechnet. Vieleicht brauchst du noch nA und kA? Das musst Du wissen. Die Spannung musst Du ja auch noch normieren. Für 1.5 kV ist dann der Faktor 0.001 und die Einheit dann eben Volt und was du sonst noch brauchst. Die Rechenzeile ist dann einfach: DasErgebnis.Wert = Strom->Wert * Spannung->Wert; Dann noch die Einheit zuweisen und fertig. Ein bisschen sollst du ja selber programmieren. Von nur Abschreiben lernt man leider nicht viel.

  ─   jobe 15.12.2021 um 18:15

Nein leider nicht im Compiler wird nichts angezeigt

  ─   mathe_97 15.12.2021 um 18:21

Laut deinem Bild fehlen die im Zweig if (r->Einheit == "uA"){...} hinter 1000000 und "Ampere" immer noch die Strichpunkte. Ist es das? Außerdem solltest du die Zeile r->Einheit = Basis; einrücken damit man sieht, dass sie nur bei wahrem if() ausgeführt wird.

Was meinst du mit "nichts Angezeigt"? keine Fehlermeldung? Eine Fehlermeldung und kein Ergebnis? Gar nichts?

  ─   jobe 15.12.2021 um 18:36

Ich habe es doch so gemacht wie du’s gemacht wieso fehlt da noch was? könntest du den Code schreiben damit ich das nachvollziehen kann? Das wäre gut

  ─   mathe_97 15.12.2021 um 18:51

Also den Code habe ich schon längst mit Visual Studio realisiert. Bei mir tut alles und bei mir sind überall Strichpunkte wo sie hingehören. Auch in meiner 2ten Antwort. Normalerweise mache ich das nicht aber ich lade jetzt ein Bild von meinem gesamten Programm und von der Ergebnisausgabe hoch. Ich hoffe du kannst dann deine Fehler finden.

  ─   jobe 15.12.2021 um 19:05

Kommentar schreiben

0

Programm Teil 1

Programm Teil 2

Ergebnisausgabe mit deinen Werten

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Danke das kann ich jetzt viel besser nachvollziehen vielen Dank nochmal

  ─   mathe_97 15.12.2021 um 19:43


Also wir machen es nicht über Virtual Studio sondern über vpl

  ─   mathe_97 15.12.2021 um 20:10

Die Ausgabe Funktion ist bei vpl falsch also void PrintAusgabe(Messwert p)
und void NormiereEinheit(MessWert
r)

die FEhler
Fehler: Variable oder Feld »PrintAusgabe« als »void« deklariert
void PrintAusgabe(MessWert p)

^
Fehler: »MessWert« wurde in diesem Gültigkeitsbereich nicht definiert
Fehler: »p« wurde in diesem Gültigkeitsbereich nicht definiert
void PrintAusgabe(MessWert
p)

^
: Fehler: Variable oder Feld »NormiereEinheit« als »void« deklariert
void NormiereEinheit(MessWert r)

^
Fehler: »MessWert« wurde in diesem Gültigkeitsbereich nicht definiert
Fehler: »r« wurde in diesem Gültigkeitsbereich nicht definiert
void NormiereEinheit(MessWert
r)

  ─   mathe_97 15.12.2021 um 20:36

Irgendwas an deinem Code stimmt noch nicht. Hast du noch irgendwo geschweifte Klammern um alles drumherum? Die Fehlermeldung Variable oder Feld »PrintAusgabe« als »void« deklariert deutet für mich darauf hin, dass der Compiler nicht weiß, dass es sich um eine Funktion handelt. »MessWert« wurde in diesem Gültigkeitsbereich nicht definiert kann gar nicht sein. Globaler als die typedef struct MessWert deklariert ist kann man es gar nicht machen. Unabhängig davon darf man natürlich alle Funktionen mit einen Rückgabewert versehen. Dann heißt es eben nicht void Funktionsname() sondern z.B. int Funktionsname(). Dann brauchst du aber am Ende jeder dieser Funktionen einen return xxx; also wie in main() return 0;. Kannst du ja mal versuchen.

Kann man eure Umgebung (vpl und Compiler) irgendwo herunterladen? Wenn ja, poste doch einen Link. Dann würde ich versuchen sie zu installieren und meinen Code durchjagen.

  ─   jobe 16.12.2021 um 07:51

Hier der link: https://vpl.dis.ulpgc.es/

Danke!

  ─   mathe_97 16.12.2021 um 15:02

Man, die Installation hat gedauert. Ist nicht meine Welt. Ich hab meinen Code aber am Laufen. Es fehlt die Zeile

#include < iostream >

dann läuft mein Code wie fotografiert durch. Allerdings hatte ich ohne diese Codezeile andere Fehlermeldungen als du geschrieben hast. Wenn dann alles passt und ich Ausführen drücke geht ein Konsolenfenster auf und es erscheint "5.18364 = Watt"
Also: meinen Code abschreiben (und verstehen), als erste Zeile noch den zusätzlichen include, dann muss es gehen - zumindest geht's bei mir. Nächstes Mal gib es aber keinen fertigen Code mehr :-) Gruß jobe

  ─   jobe 16.12.2021 um 20:42

also dein code verstehe ich jetzt

  ─   mathe_97 16.12.2021 um 22:35

Kommentar schreiben