Verständnisproblem bei Aufgabe



  • Hi,
    ich habe gerade erst angefangen mit c++ zu programmieren(bzw. überhaupt zu programmieren)und bisher waren die Aufgaben leicht, jetzt komm ich aber net mehr weiter.
    Ich muss folgende Aufgabe lösen und habe da ein Verständnidproblem:
    Programm soll entworfen werden, mit dem

    -eine ganze Zahl in einem beliebigen Zahlenformat bis zur Basis 20 eingegeben werden kann.
    -diese Zahl in ein beliebiges Zahlenformat bis zur Basis 20 gewandelt wird
    -diese gewandelteZahl ausgegeben wird.

    Ich verstehe die Aufgabe nicht so richtig, könnt ihr mir sagen, was ich genau machen muss?
    Ich habe sie so verstanden, dass zum Bsp. 1101, Basis 2 eingegeben wird,
    das soll dann zu Basis 4 in 0031 gewandelt werden
    Stimmt das?

    Vielen Dank schon mal für die Hilfe
    Martin



  • Martin18 schrieb:

    Stimmt das?

    stimmt, allerdings kommen dabei auch noch die ersten zehn buchstaben des alphabets mit ins spiel 😉
    hier haste 'ne funktion zur ausgabe: http://www.jbox.dk/sanos/source/lib/xtoa.c.html



  • Hi,
    vielen dank für den Tip, ich habe das Programm jetzt mal geschrieben, wie ich es für richtig halte. Ich habe bei c++ noch nicht so den Durchblick und programmiere erst seit ein paar Wochen.
    Sind bestimmt tausend Sachen falsch, aber ihr würdet mir einen großen Gefallen tuen, wenn ihr mir helft.

    Das Programm sieht wie folgt aus:

    # include <iostream>
    using namespace std;

    static void xtoa(int val, char *buf, int radix)
    {
    char *p;
    char *firstdig;
    char temp;
    int digval;

    p = buf;
    firstdig = p;

    do
    {
    digval =(val % radix);
    val /= radix;

    if (digval > 9)
    *p++ = (char) (digval - 10 + 'a');
    else
    *p++ = (char) (digval + '0');
    } while (val > 0);

    *p-- = '\0';
    do
    {
    temp = *p;
    *p = *firstdig;
    *firstdig = temp;
    p--;
    firstdig++;
    } while (firstdig < p);
    }

    char *itoa(int val, char *buf, int radix)
    {
    if (radix == 10 && val < 0)
    xtoa(val, buf, radix);
    else
    xtoa( val, buf, radix);
    return buf;
    }

    int main()
    {int basis,basis2,summe;
    cout<<"Basis eingeben"<<endl;
    cin>>basis;
    cout<<""<<endl;
    const int max=10;
    int daten[max]={0};
    int zaehler=0,zahl;
    do{
    cout<<"Zahl eingeben"<<endl;
    cin>>zahl;
    daten[zaehler]=zahl;
    zaehler++;
    }
    while(zaehler<=10);

    cout<<"gewuenschte Basis eingeben"<<endl;
    cin>>basis2;

    for(int i=0;i<zaehler;i++)
    { if(zahl>0)
    summe=summe+zahl*basis^i;
    else
    summe=summe+0;
    return summe;
    }

    char itoa(summe,char *daten[zaehler],basis2); HIER GIBT FEHLERMELDUNG WEGEN CHAR
    cout<<daten[zaehler]<<endl;
    return 0;

    }

    Im Hauptprogramm soll er erst die Zahl(zb 10110...)einlesen und dann in einen normale Zahl umwandeln. Diese Zahl soll dann durch xtoa und schließlich itoa wieder mit der Basis2 umgewandelt werden.

    Gruß Martin



  • Benutze am besten die C/C++ Tags fuer den Code, die haben auch Syntaxhighlighting.

    Hab jetzt (erstmal) nur die main ueberflogen (grad nur Mittagspause in der Schule)

    1. In der Regel deklariert man Variablen in C++ ab da wo man sie braucht (siehe deklaration von basis2 und summe)

    cout<<""<<endl;
    

    Wozu das "" wenn du eh ein endl machst??

    const int max=10;
    

    du verwendest max nur an einer Stelle, da kannst du die Zahl auch gleich hinschreiben ODER besser du schreibst diese Deklaration an eine leicht zu findende Stelle (und nicht direkt ueber die Stelle wo du sie brauchst) Dies steht ausnahmwesie im gegensatz zu dem was ich unter 1 gesagt hat, weil du const int max nicht irgendwie ab dann brauchst sondern es eher verhindern soll, dass du sogenannte magic numbers verwendest)

    do{ 
    cout<<"Zahl eingeben"<<endl; 
    cin>>zahl; 
    daten[zaehler]=zahl; 
    zaehler++; 
    } 
    while(zaehler<=10);
    

    Das kannst du in eine for Schleife umwandeln. Ausserdem WENN du schon cont int max degfinierst um nicht 10 schreiben zu muessen solltest du die Variable auch hier verwenden.

    summe=summe+0;
    

    Also, das ist sinnfrei. Das else kannst du da gleich weglassen.

    return summe;
    

    Hmm, nee... return ist fuer den Rueckgabewert von Funktionen gedacht. Keine Ahnung was du jetzt damit machen wolltest.

    summe=summe+zahl*basis^i;
    

    Solltest du basis hoch i meinen dann ist das falsch! ^ ist in C++ NICHT fuer exponente gedacht!! Ausserdem meinst meienr Meinung nach nicht zahl sondern daten[i], oder?

    char itoa(summe,char *daten[zaehler],basis2); HIER GIBT FEHLERMELDUNG WEGEN CHAR
    

    Logisch, nee? siehe:

    int daten[max]={0};
    

    Du hast ein int array und ploetlich deklarierst du das neu als char*. Falls du aus dem int array ein char array machen wollen muesstest du casten.

    for(int i=0;i<zaehler;i++)
    

    ebenso, hier solltest du wieder dein max verwenden.

    Den Rest wird sich, ebvor ich wieder schreiben kann, wohl sowieso schon ein anderer angesehen haben.

    PS: ich bin selbst noch Anfaenger, denke aber, dass das soweit alles stimmt.


Anmelden zum Antworten