Funktion schreiben 2



  • Hallo nochmal,
    nochmal ein großes Dankeschön an diejenigen, die mir gestern auf die schnelle geholfen haben. Ich bin gerade wieder an einer AUfgabe, woch ich nicht genau weiß ob sie richtig ist.

    Aufgabenstellung:
    Aus einer Messeinrichtung liegen eine Reihe von Temperatur-Messungen vor, die jeweils aus einer ID-Nr, einem Zeitstempel- der seinerseits aus einer Zeitangabe für Stunde, Sek., Min besteht - und aus einem Temperaturwert in Grad Fahrenheit bestehen.

    a) Definieren Sie geeignete Strukturen zur Aufnahme aller Daten einer Messung und ein statischer array zur abspeicherung aller (max. 100) Messungen.

    struct zeit{
    int stunde, minute, sekunde;
    };
    
    struct messungen{
    double ID;
    zeit zeitstempel;
    double tempFa;
    };
    
    const int LEN = 100;
    messungen p[100];
    

    b)Schreiben Sie eine Hilfsfunktion F2C, die einen Temperaturwert von Grad Fahrenheit auf Grad Celsius umrechnet.
    Zusammenhang: T(°F) = 32 + 9/5 * T(°C)

    double F2C( double tempFa){
    double tempCe;
    
    tempCe = (tempFa - 32) * 5 / 9;
    return(tempCe);
    }
    

    c) Schreiben Sie eine Funktion, die unter Verwendung von F2C in allen Messungen den Temperaturwert in °C umrechnet ( d.h. in den einzelnen Feldelementen ersetzt) sowie den Mittelwert der Temperatur über alle Messungen in °F & °C zurückgibt.

    struct mittelwert{
    double mwF, mwC; 
    };
    
    mittelwert func(messungen p[], const int LEN){
    mittelwert werte;
    
    for(i=0; i < LEN; i++){
    werte.mwF += p[i].tempFa;
    werte.mwC += F2C(p[i].tempFa);
    }
    if(LEN > 0) {
    werte.mwF /= LEN;
    werte.mwC /= LEN;
    }
    return ( werte);
    }
    

    Sorry wenn das viel ist ich weiß nicht was so die Kapazitäten eines Themas sind 🙄 Ich denke die ersten beiden sind richtig mir geht es hauptsächlich um C aber für die braucht man ja die anderen beiden Informationen

    LG 😕


  • Mod

    heyal schrieb:

    a) Definieren Sie geeignete Strukturen zur Aufnahme aller Daten einer Messung und ein statischer array zur abspeicherung aller (max. 100) Messungen.

    Kritik am Lehrer: Er lehrt also C++ als (schlechtes) C mit cout. Du darfst dich geistig schon einmal darauf vorbereiten, dass du hinterher alles qwieder vergessen und mühsam umlernen darfst.

    double ID;
    

    Kommt mir als ein denkbar ungeeigneter Typ für Identifikationsnummern vor.

    const int LEN = 100;
    messungen p[100];
    

    Tolle Benutzung von LEN 🙄

    tempCe = (tempFa - 32) * 5 / 9;
    

    Hast du denn nicht wenigsten einmal die Funktion ausprobiert, ob das Ergebnis stimmt oder wenigstens stimmen kann?

    struct mittelwert{
    double mwF, mwC; 
    };
    
    mittelwert func(messungen p[], const int LEN){
    mittelwert werte;
    
    for(i=0; i < LEN; i++){
    werte.mwF += p[i].tempFa;
    werte.mwC += F2C(p[i].tempFa);
    }
    if(LEN > 0) {
    werte.mwF /= LEN;
    werte.mwC /= LEN;
    }
    return ( werte);
    }
    

    Welchen Anfangswert hat werte ? Und wenn LEN gleich 0 ist? Soll der Durchschnitt dann 0 sein, oder was? Falls ja: Der Durchschnitt von 0 Werten ist aber nicht 0. Das siehst du schon da dran, dass 0F nicht gleich 0C sind; kann ja nicht beides zugleich der Durchschnitt sein. Probier mal aus was heraus kommt, wenn du die Sonderbehandlung weg lässt, vielleicht wissen Computer mehr über Mathematik als du 😉

    Ansonsten: Vielleicht wäre es klüger, erst einen Durchschnitt zu berechnen und hinterher die Umwandlung? So kommt man von bis zu 100 Umwandlungen auf nur noch eine.



  • Kritik am Lehrer: Er lehrt also C++ als (schlechtes) C mit cout. Du darfst dich geistig schon einmal darauf vorbereiten, dass du hinterher alles qwieder vergessen und mühsam umlernen darfst.

    Na toll -_-'

    double ID;
    

    Kommt mir als ein denkbar ungeeigneter Typ für Identifikationsnummern vor.

    int ID;
    

    wäre hier glaube ich richtig, aber ich weiß doch nicht wie lange die ID ist vielleicht sprengt das den Rahmen des int's.

    const int LEN = 100;
    messungen p[100];
    

    Tolle Benutzung von LEN 🙄

    danke _'

    tempCe = (tempFa - 32) * 5 / 9;
    

    Hast du denn nicht wenigsten einmal die Funktion ausprobiert, ob das Ergebnis stimmt oder wenigstens stimmen kann?

    Yep Funktion funktioniert 😃 😃

    struct mittelwert{
    double mwF, mwC; 
    };
    
    mittelwert func(messungen p[], const int LEN){
    mittelwert werte;
    
    for(i=0; i < LEN; i++){
    werte.mwF += p[i].tempFa;
    werte.mwC += F2C(p[i].tempFa);
    }
    if(LEN > 0) {
    werte.mwF /= LEN;
    werte.mwC /= LEN;
    }
    return ( werte);
    }
    

    Welchen Anfangswert hat werte ? Und wenn LEN gleich 0 ist? Soll der Durchschnitt dann 0 sein, oder was? Falls ja: Der Durchschnitt von 0 Werten ist aber nicht 0. Das siehst du schon da dran, dass 0F nicht gleich 0C sind; kann ja nicht beides zugleich der Durchschnitt sein. Probier mal aus was heraus kommt, wenn du die Sonderbehandlung weg lässt, vielleicht wissen Computer mehr über Mathematik als du 😉

    Ansonsten: Vielleicht wäre es klüger, erst einen Durchschnitt zu berechnen und hinterher die Umwandlung? So kommt man von bis zu 100 Umwandlungen auf nur noch eine.

    werte
    

    muss ich natürlich 0 setzen glaube ich 🙂

    Ich teile doch durch 0 dann müsste doch die Funktion/ das Programm abbrechen oder ?
    oder müsste ich dann noch extra eine Fehlerausgabe schreiben ?


  • Mod

    heyal schrieb:

    tempCe = (tempFa - 32) * 5 / 9;
    

    Hast du denn nicht wenigsten einmal die Funktion ausprobiert, ob das Ergebnis stimmt oder wenigstens stimmen kann?

    Yep Funktion funktioniert 😃 😃

    Stimmt, entgegen meinem ersten Instinkt geht das aufgrund der genauen Reihenfolge ja doch. Dir ist aber klar, dass 5/9 alleine für sich gleich 0 ist? Und das beispielsweise 5 / 9 * (tempFa - 32) nicht mehr funktionieren würde? Probier es mal aus, wenn du es nicht glaubst.

    Ich teile doch durch 0 dann müsste doch die Funktion/ das Programm abbrechen oder ?
    oder müsste ich dann noch extra eine Fehlerausgabe schreiben ?

    Was kommt bei dir denn derzeit raus, wenn du 0 Werte rein tust? Und was passiert überhaupt, wenn man durch 0 teilt? Probier es doch mal aus.



  • Stimmt, entgegen meinem ersten Instinkt geht das aufgrund der genauen Reihenfolge ja doch. Dir ist aber klar, dass 5/9 alleine für sich gleich 0 ist? Und das beispielsweise 5 / 9 * (tempFa - 32) nicht mehr funktionieren würde? Probier es mal aus, wenn du es nicht glaubst.

    Ja, ich denke aus dem Grund, weil es eine integerdivision ist oder ?

    Was kommt bei dir denn derzeit raus, wenn du 0 Werte rein tust? Und was passiert überhaupt, wenn man durch 0 teilt? Probier es doch mal aus.

    Ich kriege die Funktion nicht ganz gestartet muss noch ein bisschen tüfteln, aber hauptsache man hat spaß 😃 🙄


  • Mod

    heyal schrieb:

    Ja, ich denke aus dem Grund, weil es eine integerdivision ist oder ?

    So ist es. Ist dir auch klar, wieso die Reihenfolge wichtig ist und deine jetzige Variante wie gewünscht funktioniert? Und weiter gedacht: Wie du es so machen könntest, dass die Reihenfolge egal ist?



  • [So ist es. Ist dir auch klar, wieso die Reihenfolge wichtig ist und deine jetzige Variante wie gewünscht funktioniert? Und weiter gedacht: Wie du es so machen könntest, dass die Reihenfolge egal ist?

    wieso sie funktioniert ja, da das Programm ja erst die Klammer mit der 5 multipliziert und anschließend erst durch die 9 teilt,
    aber was ich machen kann damit die Reihenfolge egal ist fällt mir leider nicht ein 🙄


  • Mod

    Wenn die 5 und/oder die 9 ein double wären (also 5. oder 9.), dann ist es auf jeden Fall eine double-Division.



  • SeppJ schrieb:

    Wenn die 5 und/oder die 9 ein double wären (also 5. oder 9.), dann ist es auf jeden Fall eine double-Division.

    heißt ich müsste einfach nur die 5 & die 9 als double deklarieren und dann ginge es ?

    double 5,9;
    

  • Mod

    heyal schrieb:

    SeppJ schrieb:

    Wenn die 5 und/oder die 9 ein double wären (also 5. oder 9.), dann ist es auf jeden Fall eine double-Division.

    heißt ich müsste einfach nur die 5 & die 9 als double deklarieren und dann ginge es ?

    double 5,9;
    

    Jain. Die 5 und/oder die 9 müssen doubles sein. Wie schon gesagt, aber vielleicht nicht klar geworden: 5.0 , oder kurz einfach nur 5. , ist ein double.

    Dein Vorschlag ist hingegen totaler Quatsch. Weder kann man den Typ von Variablen umdefinieren:

    int i;
    double i; // geht nicht
    

    Und erst recht nicht kann man Literale umdefinieren:

    1 = 2;  // Netter Versuch, aber nein.
    if (1 + 1 == 4) ...
    


  • Alles klar ich habe es verstanden _

    einfach der Punkt macht es zum double

    (sorry wie gesagt ist mein erstes semester 🙄 )



  • heyal schrieb:

    (sorry wie gesagt ist mein erstes semester 🙄 )

    Darf ich fragen, welches Studienfach?



  • Schlangenmensch schrieb:

    heyal schrieb:

    (sorry wie gesagt ist mein erstes semester 🙄 )

    Darf ich fragen, welches Studienfach?

    Maschinenbau, wir haebn auch nur ein Modul Informatik im Studiengang, aber ich finde Programmiersprachen geil 😃



  • Alles klar.

    Das erklärt so ein bisschen die Aufgabenstellung mit C++ in C Syntax und so. Meiner Erfahrung nach, von Freunden die Maschinenbau, E-Technik o.ä. Ingeneurswesen studieren (bzw. studiert haben), kommt es in den Studiengängen häufiger vor, dass Sprachelemente nicht sauber getrennt und für Informatiker ungewöhnlich unterrichtet werden.

    Aber immerhin ist es bei dir C/C++. Ich kenne auch Maschinenbaustudenten die VBA (Visual Basic for Application) in ihrem Informatik Modul gemacht haben.


Log in to reply