tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
17
ZUGRIFFE
3198
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Redneet Tutorials.de Gastzugang
    Hi,

    ich habe hier eine Aufgabe aus der Schule und bekomme die irgendwie nicht richtig hin, weil ich die for-schleife und wertübergabe von funktion zu funktion noch nicht ganz beherrsche, weil die ferien dazwischen waren habe ich das meiste nicht mehr drauf. Ich hoffe ihr könnt mir helfen!

    Aufgabe:
    Die 1.Funktion(genannt werteparameter) erhält über die Tastatur zwei Werte(wert1,wert2) mitgeteilt. Diese Werte werden miteinander multipliziert. Das Ergebnis(wert3) wird an die 2.Funktion(zeigerparameter) übergeben mithilfe von zeigern.
    In der 2.Funktion soll von 0 bis zum übergebenen Wert(wert3) alle Zahlen, mit der größten Zahl beginnend, in der Konsole erscheinen ((also wert3-bis0)mithilfe einer for-schleife zu lösen). Diese Werte sollen miteinander addiert werden und die Summe soll an die Main-Funktion übergeben werden.
    In der Main-Funktion soll die Summe ausgegeben werden und das Programm muss man wiederholen können.

    Hier schon mal das was ich gemacht habe:

    #include <iostream>

    using namespace std;

    int werteparameter()
    {
    int wert1,wert2,erg;
    //EINGABE
    cout<<"Funktion Werteparameter"<<endl;
    cout<<"ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"<<endl;
    cout<<"Bitte geben Sie den ersten Wert ein!"<<endl;
    cin>>wert1;
    cout<<"Bitte geben Sie den zweiten Wert ein!"<<endl;
    cin>>wert2;
    //BERECHNUNG
    erg=wert1*wert2;
    //AUSGABE
    cout<<"Das Ergebnis der Multiplikation ist: "<<erg<<"\n"<<endl;
    //ÜBERGABE
    return (erg);

    }

    int zeigerparameter(int *erg)
    {
    int y;
    cout<<"Funktion Zeigerparameter"<<endl;
    cout<<"ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n"<<endl;

    for(y=0;*erg=y;*erg--)
    {
    cout<<*erg;
    }
    return (*erg);
    }
    int main(int erg)
    {
    //int r;
    werteparameter();
    zeigerparameter(&erg);

    //cout<<zeigerparameter((r=werteparameter(),&r));
    }

    Wir programmieren mit dem Microsoft Visual Express 2008 - Compiler...hoffe ihr könnt mir das erklären mit Kommentaren usw.

    Danke schon mal.

    PS: Muss das bis Sonntag-Abend fertig haben
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include<stdio.h>
     
    unsigned int zeigerparameter(int *c)
    {
        unsigned int i,sum=0;
        for(i=*c;i>=0;i--)
        {
            printf("%d",i);
            sum+=i;
        }
        return sum;
    }
     
    unsigned int werteparameter(int a,int b)
    {
        unsigned int c=a*b;
        return(zeigerparameter(&c));
    }
     
    int main()
    {
        unsigned int a,b;
        while(1)
        {
            scanf("%u %u",&a,&b);
            printf("%d",werteparameter(a,b));
        }
        return 0;
    }

    Wenn du das ganze mit cout und cin willst, die printf und scanf eben ersetzen
    Das include<stdio.h> brauchst du dann auch nicht mehr
    Redneet bedankt sich. 

  3. #3
    Redneet Tutorials.de Gastzugang
    Danke das du mir geholfen hast , aber leider kommt bei mir immer dieser Fehler:

    Fehler 1 error C2664: 'zeigerparameter': Konvertierung des Parameters 1 von 'unsigned int *' in 'int *' nicht möglich 17

    Die Zeile 17 sieht genau so aus :

    return(zeigerparameter(&c));


    Ich hoffe du kannst mir noch eben schnell helfen
     

  4. #4
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Da ist mir wohl ein Fehler unterlaufen...hier die korrigierte Version:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include<stdio.h>
     
    unsigned int zeigerparameter(unsigned int *c)
    {
        unsigned int i,sum=0;
        for(i=*c;i>=0;i--)
        {
            printf("%u",i);
            sum+=i;
        }
        return sum;
    }
     
    unsigned int werteparameter(unsigned int a,unsigned int b)
    {
        unsigned int c=a*b;
        return(zeigerparameter(&c));
    }
     
    int main()
    {
        unsigned int a,b;
        while(1)
        {
            scanf("%u %u",&a,&b);
            printf("%u",werteparameter(a,b));
        }
        return 0;
    }
    Geändert von sheel (17.04.10 um 23:43 Uhr)
    Redneet bedankt sich. 

  5. #5
    Redneet Redneet ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    13
    Bei mir zeigt das Programm, wenn ich zwei Zahlen in die Konsole eingebe lauter Minuszahlen an, also das Fenster wird mit lauter Minuszahlen beschrieben und das immer so weiter.

    Zur Verständnis:

    Das Programm soll in der 1.Funktion (werteparameter) durch die Tastatur zwei beliebige zahlen bekommen. Diese zwei Zahlen sollen in der Funktion multipliziert werden. Die Summe, also das Ergebnis soll an die 2.Funktion(zeigerparameter) übergeben werden und in dieser Funktion soll der übergebene Wert und die Zahlen bis 0 angezeigt werden (Bsp: 18 17 16 15 ...0). Das soll mithilfe einer for-schleife gemacht werden. Dann sollen die Zahlen, die ausgegeben werden (bsp. 18+17+16..+0) miteinander addiert werden. Und dieses Ergebnis soll in der main-Funktion ausgegeben werden.

    Ich hoffe mir kann jetzt jemand helfen

    Danke schon mal
    Geändert von Redneet (17.04.10 um 15:42 Uhr)
     

  6. #6
    Redneet Redneet ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    13
    ok ich musste einfach nur das unsigned wegnehmen vor den int-befehlen dann hat es funktioniert.

    kannst du mir denn noch erklären was in der for-schleife genau passiert und was das u und d bedeuten und warum man in der main-funktion den wert 0 zurückgeben muss?

    Könntest du mir vielleicht auch schreiben, wie man erst die werteparameter-funktion benutzt und dann erst die zeigerparameter-funktion?

    Und das mit dem ersetzen von scanf klappt irgendwie nicht.... habe statt scanf das hier geschrieben cin>>("%u %u",&a,&b); , aber das mit printf ersetzen funktioniert.

    wäre echt nett

    Danke schon mal für das alles .
    Geändert von Redneet (17.04.10 um 16:02 Uhr)
     

  7. #7
    XxbambamxX XxbambamxX ist offline Mitglied Silber
    Registriert seit
    Oct 2009
    Beiträge
    60
    Hi erstma
    ich bin leicht verwirrt.
    Diese zwei Zahlen sollen in der Funktion multipliziert werden. Die Summe, also das Ergebnis...
    meinst du jetzt die Summe oder das Produkt? Was ist denn nun das Ergebnis
    wie dem auch sei.
    Ich habe versucht eine lösung auszuarbeiten und diese ausreichend zu kommentieren damit du es auch verstest. Ich habe auch nicht ganz kapiert wie du das mit den Zeigern haben musst. Bei mir arbeitet das Programm einwandfrei und tut was ich will.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include <iostream>
     
    using namespace std;
     
    int wertparameter();                    //Funktionsprototypen
    int zeigeparameter(int * Zeiger);       //""
     
    int main()                              //Hauptprogramm    
    {
        int *Zeiger;                        //Definition des Zeigers
        *Zeiger=wertparameter();            //Deklaration des Zeigers
        int Ergebnis=zeigeparameter(Zeiger);//Ergebnis übergabe an Main
     
        cout<<"Ergebnis= "<<Ergebnis<<endl;//Ausgabe vom Endgültigen Ergebnis
     
        return 0;
    }
     
    int wertparameter()                     
    {
        int Wert1,Wert2,Wert3;
        cout<<"Bitte ersten Wert eingeben"<<endl;
        cin>>Wert1;
        cout<<"Bitte zweiten Wert eingeben"<<endl;
        cin>>Wert2;
        Wert3=(Wert1*Wert2);
        return(Wert3);
    };
     
    int zeigeparameter(int *Zeiger)
    {
        int Ergebnis=0;
        for(int i=*Zeiger;i>=0;i--)
        {
            cout<<i<<endl;
            Ergebnis+=i;
     
        }
        cout<<endl;
        cout<<Ergebnis;
     
    return (Ergebnis);
    };

    Hoffe ich konnte helfen
    mfg
    Redneet bedankt sich. 
    Wer im Steinhaus sitzt sollte nicht mit Glas werfen!
    Wer Rechtschreibefehler findet darf sie behalten ;)
    www.simonsmile.jimdo.com

  8. #8
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Schande über mich...
    Also entweder alle unsigned weg (hast du ja gemacht) oder bei printf und scanf die "%d" durch "%u" ersetzen.

    Und das cin schreibst du besser so:
    cin<<a;
    cin<<b;

    Mit u und d meinst du wohl %u und %d?
    Für printf, scanf und ähnliche Funktionen muss man angeben, welchen Typ die Variablen haben.
    cin und cout machen das ziemlich eigenständig.
    %d bedeutet, dass es sich um eine int-Variable handelt.
    %u steht für unsigned int.

    Das war eben mein Fehler, ich hab ein paar %d drinnen...

    Wegen dem return 0 im main: Die main-Funktion muss ein int zurückgeben.
    Man darf das "return 0;" beim main auch weglassen, dann wird automatisch irgendeine Zahl (0 glaub ich) genommen. Ich hab es mir nur angewöhnt, trotzdem immer ein return schreiben.
    Du kannst es also einfach weglassen, macht auch nichts.

    Und was soll in der for-Schleife sein?
    Es wird von der Zahl immer 1 runtergezählt, bis zu 0.
    Jede Zahl davon wird erstens ausgegeben und zweitens zu sum wie Summe dazugezählt.
    Am Schluss brauchst du ja die Summe, die wird da beim Ausgeben gleich mitberechnet.
    Geändert von sheel (17.04.10 um 19:08 Uhr)
    Redneet bedankt sich. 

  9. #9
    Redneet Redneet ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    13
    Bei mir kommt beim Starten von dem neuen Quellcode, den du vorhin geschickt hast ein Fehler, der sagt, das die Variable "zeiger" ohne Initialisierung ist und deshalb kann man das Programm nicht ausführen.
    Bei dem Quellcode habe ich nur die Variablen wert3 mit pro getauscht, damit mein lehrer das besser versteht (ist nicht mehr der jüngste ).
    Hier nochmal der Code:
    #include<iostream>
    using namespace std;

    int werteparameter();
    int zeigerparameter(int *zeiger);

    //Main-Funktion
    int main()
    {
    //Deklaration
    int /*wert1,wert2*/*zeiger;
    *zeiger=werteparameter();
    int sum=zeigerparameter(zeiger);

    cout<<"\nDie Summe der ganzen Zahlen ist: "<<sum<<endl;
    /*//While-Schleife
    while(1)
    {
    //Ausgabe
    cin>>wert1;
    cin>>wert2;
    cout<<"\nDie Summe der ganzen Zahlen ist: "<<(werteparameter(wert1,wert2))<<endl;

    }*/
    //Rückgabe
    return 0;
    }
    int werteparameter()
    {
    int wert1,wert2,pro;
    cout<<"Bitte geben Sie den ersten Wert ein!"<<endl;
    cin>>wert1;
    cout<<"Bitte geben Sie den zweiten Wert ein!"<<endl;
    cin>>wert2;
    pro=(wert1*wert2);
    return(pro);
    }

    int zeigerparameter(int *zeiger)
    {
    int sum=0;
    for(int i=*zeiger;i>=0;i--)
    {
    cout<<i<<endl;
    sum+=i;
    }
    cout<<endl;
    cout<<sum;

    return(sum);
    }


    /*//Funktion - zeigerparameter
    int zeigerparameter(int *pro)
    {
    //Deklaration
    int i,sum=0;
    cout<<"2.Funktion - zeigerparameter"<<endl;
    cout<<"ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"<<endl;
    cout<<"Die Reihe der Zahlen lautet: "<<endl;
    //for-Schleife
    for(i=*pro;i>=0;i--)
    {
    //Ausgabe
    cout<<i<<" ";
    sum+=i;
    }
    //Rückgabe
    return sum;
    }
    //Funktion - werteparameter
    int werteparameter(int wert1,int wert2)
    {
    cout<<"1.Funktion - werteparameter"<<endl;
    cout<<"ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"<<endl;
    //Eingabe
    cout<<"Bitte geben Sie den ersten Wert ein!"<<endl;
    cin>>wert1;
    cout<<"Bitte geben Sie den zweiten Wert ein!"<<endl;
    cin>>wert2;
    //Berechnung
    int pro=wert1*wert2;
    //Ausgabe
    cout<<"Das Ergebnis der Multiplikation ist: "<<pro<<endl;
    cout<<"\n"<<endl;
    //Übergabe
    return(zeigerparameter(&pro));
    }

    */
    /* Legende:
    wert1= erster eingegebener Wert
    wert2= zweiter eingegebener Wert
    pro= Produkt aus Wert1 und Wert2
    sum= Summe aus allen Werten von pro bis 0
    */

    Wenn ich das, was ich ausgeklammert habe verwende funktioniert das Programm, aber ich muss das leider in der Reihenfolge machen, dass die 1.Funktion werteparameter ist und die 2.Funktion erst zeigerparameter, daher wäre es schön wenn du den Fehler finden könntest.

    Und danke für die Erklärung hat mir echt weitergeholfen ... wir sind gerade im ersten lernjahr C++ und daher kann ich das noch nicht so gut
     

  10. #10
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Eine Anmerkung: Wenn du den Vorschlag von xxbambamxx nimmst, warum hat die Funktion werteparameter dann ihren Namen, wenn sie ja keine Params bekommt?

    Der Sinn der Aufgabe ist wohl eher, das Einlesen im main zu machen.

    @xxbambamxx: Nett, wenn du alles auskommentierst, aber auf einen nicht allokierten Pointer zugreifen ist unschön
    Geändert von sheel (17.04.10 um 19:12 Uhr)
    Redneet bedankt sich. 

  11. #11
    Redneet Redneet ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    13
    ich weiß, dass ich das auskommentierte noch rausnehmen muss ... ich habe es nur behalten, weil es so funktioniert hat und jetzt ja der fehler mit dem "zeiger" kommt.

    Die Namen standen so in der Aufgabe, da kann ich jetzt auch nichts dran ändern und eigentlich sind die namen ja auch nebensache und unwichtig in erster linie...

    Ich wollte nur wissen was jetzt der fehler ist....
     

  12. #12
    XxbambamxX XxbambamxX ist offline Mitglied Silber
    Registriert seit
    Oct 2009
    Beiträge
    60
    aber auf einen nicht allokierten Pointer zugreifen ist unschön
    Jap stimmt. Entschuldigung und danke das du mich darauf hingewiesen hast.
    Ein dummer Fehler der mir des öftern passiert leider. Ich habe mich davon blenden lassen, dass bei 5 testläufen alles problemlos funktionierte.
    Redneet bedankt sich. 
    Wer im Steinhaus sitzt sollte nicht mit Glas werfen!
    Wer Rechtschreibefehler findet darf sie behalten ;)
    www.simonsmile.jimdo.com

  13. #13
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Zitat:
    Die 1.Funktion(genannt werteparameter) erhält über die Tastatur zwei Werte(wert1,wert2) mitgeteilt.

    Ich bin mir ziemlich sicher, dass du die Werte übergeben musst.

    Ansonsten würde der main-Teil:
    Code cpp:
    1
    2
    3
    
    int *zeiger;
    *zeiger=werteparameter();
    int sum=zeigerparameter(zeiger);
    so gehören:
    Code cpp:
    1
    2
    3
    
    int zeiger;
    zeiger=werteparameter();
    int sum=zeigerparameter(&zeiger);

    Oder, falls ihr Sachen mit malloc etc schon gelernt habt:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    int sum;
    int *zeiger;
    zeiger=(int *)malloc(sizeof(int));
    if(zeiger==0)
        cout<<"Fehler";
    else
    {
        *zeiger=werteparameter();
        sum=zeigerparameter(zeiger);
        free(zeiger);
    }

    Die new-Variante:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    int sum;
    int *zeiger;
    try{zeiger=new int;}
    catch(...){zeiger=0;}
    if(zeiger==0)
        cout<<"Fehler";
    else
    {
        *zeiger=werteparameter();
        sum=zeigerparameter(zeiger);
        delete zeiger;
    }
    Redneet bedankt sich. 

  14. #14
    Redneet Redneet ist offline Mitglied
    Registriert seit
    Apr 2010
    Beiträge
    13
    Ich dachte eigentlich man müsste die Funktion nur in der Main-Funktion aufrufen und dann würde der rest also die zwei werte dort abgefragt und nur der wert3 also bei mir pro (Produkt) müsste übergeben werden an die andere Funktion ...oder muss man extra nen zeiger in der main-funktion plazieren und kann nicht von der einen zur anderen funktion springen?

    Sry habe nicht so viel ahnung .... das mit diesem malloc hatten wir noch nicht und ich glaube ne if-schleife sollten wir da auch nicht verwenden ... naja hoffe ihr schafft es mir zu helfen .... bin morgen um 11 uhr wieder da und schau mir das hier nochmal an ..
     

  15. #15
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.506
    Dass du die zweite Funktion in der ersten aufrufen kannst und dir somit den zeiger in der main-Funktion sparst, hab ich doch schon im Beitrag 4 oben geschrieben-als kompletter Code, bei dem höchstens das "Bitte geben Sie zwei Zahlen ein" fehlt.

    Und hat zwar nichts mit dem Thema zu tun,aber:
    Schleifen wiederholen sich.
    In C++ also while, for, dowhile
    if gehört da nicht dazu
    Redneet bedankt sich. 

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 09.10.09, 14:40
  2. Antworten: 16
    Letzter Beitrag: 03.09.07, 10:16
  3. Antworten: 8
    Letzter Beitrag: 08.04.07, 07:32
  4. Bitte um hilfe bei einer Schleife.
    Von xony im Forum PHP
    Antworten: 3
    Letzter Beitrag: 10.11.04, 19:27
  5. Knifflige Mathe Aufgabe bitte helft mir
    Von danielmueller im Forum Smalltalk
    Antworten: 10
    Letzter Beitrag: 28.05.04, 16:38