-!hilfe!-

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • hallo
    ich hab ein ganz großes problem!!
    es geht um meine note in EDV - ich hab die 2 echt nötig :)

    mein lehrer hat zu mir gesagt das ich eine 2 bekomme, wenn ich ein prog erstelle mit C++
    es muss Dualzahlen in Dezimalzahlen umwandeln können...
    und dann nochmal eins das Dezimalzahlen in Dualzahlen umwandet

    ich hab aber GAR KEINE ahnung vom coden :(
    ich hab gar keine vorstellung wie "coden" funktioniern sollte... :-/

    könnt ihr mir BITTE BITTE BITTE helfen???

    vielen dank im vorraus

    by DaCoxxxA
  • ganz easy. Mit

    Mit dem Paramter (int) wandelst du eine beliebige Zahl in einen Integer um.

    Mit dem Parameter (double) gehts genau anders rum.

    Bsp:

    double double_zahl = (double)ganze_zahl;
    int ganze_zahl = (int)double_zahl;

    Ciao :lego:
    [SIZE=1]Dumme Antworten sind rein zufällig und auf einen Fehler in der Speicherverwaltung zurückzuführen
    [/SIZE]
  • hääääää?????????????
    wie was wo warum????

    kannst du mir bitte erklären was ich ganz genau machen muss
    wie gesagt ich hab keine ahnung wie coden geht etc.

    gar keine ahnung

    ich kann damit leider nix anfangen :(


    vielen dank

    DaCoxxxA
  • Na toll wenn du noch nichtmal die 2 Zeilen verstehst dann bringt es dir auch nichts wenn dir hier jetzt einer in 5min nen kleines Programm hinzaubert.

    Diese 2 Zeilen sind quasi das Herzstück deines Programms. Der Rest (eingabe, Ausgabe, buntes Fenstcherchen etc...) sind nur das drumherum...

    Mit der 1. Zeile wandelst du eine ganze Zahl in eine Kommazahl um und mit der 2. Zeile machste genau das Gegenteil...

    Ciao :lego:
    [SIZE=1]Dumme Antworten sind rein zufällig und auf einen Fehler in der Speicherverwaltung zurückzuführen
    [/SIZE]
  • er möchte aber keine kommazahlen, sondern dualzahlen (also binär).
    Jedoch muss ich chicken rechtgeben...
    dein lehrer wird dir doch dann kaum abkaufen, dass du das erstellt hast?
    und dann bekommst vielleicht noch eins aufn deckel...

    naja, hier gibt's z.B. nen quellcode mit dem man dualzahlen in dezimalzahlen umrechnet:
    h**p://www.supernature-forum.de/vbb/showthread.php?s=&threadid=31180

    musst dich halt ein wenig einarbeiten - viel erfolg! :)



    gruss
    Danyo
  • So erstmal was grundsätzliches, Zahl ist Zahl, egal ob dual/dezimal/hexadezimal/Base-64/Base-256 es ist alles das selbe! Die Zahl wird halt nur unterschiedlich interpretiert.

    Hier mal ein Beispiel wie ich es machen würde:

    Quellcode

    1. string input;
    2. cin << input;
    3. int i = input.length(), zahl;
    4. while (i)
    5. zahl = zahl | ((input[--i] - '0') << (input.length()-i-1));
    6. cout >> zahl;
    Habs nicht getestet, sollte aber so funktionieren, vorrausgesetzt ich hab nicht irgendwo nen Denkfehler drinne. Zur Erklärung: input[--i] ist das i-te Zeichen des strings, rechnet man das - '0' erhält man 0 oder 1, vorrausgesetzt natürlich man gibt auch tatsächlich ne Dualzahl ein, sonst kommt Blödsinn raus. Tjo und damit diese 0 bzw 1 auch an die richtige Stelle kommt schieben wir selbige um die entsprechende Stelle nach links, nur halt von der anderen Seite gezählt (zur Erinnerung: i zählt von hinten runter, die Stelle zählt logischerweise von hinten rauf). Der Rest dürfte klar sein. Auch, dass auf 32bit Systemen, wie der Name ja schon verlauten lässt, nicht mehr als 32 Stellen eingegeben werden können. Aber um sowas abzusichern bist du ja dann da. ;)
  • ähm ?! ich versteh deinen ansatz nicht so ganz mg-tx ;)

    du müsstest ja erstmal überhaupt binär zahlen in dual umrechnen
    beim string den liest du halt zeichen für zeichen von hinten ein und berechnest die int zahl ungefähr so

    ich schreib das jetzt aber mal alles einfach so hin ob da jetzt n fehler drin ist oder nicht .. ;D

    binär -> int

    Quellcode

    1. int bintoint(string sbinary)
    2. {
    3. int nlength = sbinary.length();
    4. nlength = nlength-1;
    5. //aufpassen die letzte stelle des strings ist /0 das darfste natürlich nicht zu
    6. zählen
    7. int nint = 0;
    8. int ncharat = 0;
    9. for(int n = 0, n < nlength, n++)
    10. {
    11. nint = nint + string.charat(ncharat)*pow(10, (nlength -n));
    12. ncharat++;
    13. }
    14. }
    Alles anzeigen


    also mein hintergedanke dabei ist folgender
    ich hab ne binärzahl z.b. 01010101
    als string abgespeichert =01010101/0

    jetzt nehme ich das erste zeichen (stelle = 0) = 0
    multipliziere es mit 10*7 (da das ding ja an 7ter stelle steht)
    und addiere es zu meinem int wert
    dann nehm ich die nächste stelle (stelle = 1) = 1 multipliziere es mit 6 (länge des strings -1(fürs schlusszeichen) -1)

    dann müsste ich ansich am schluss mal was richtiges da stehen haben.. ;D

    den ansatz für int nach binär musst dir aber selber überlegen, alles schreib dich dir nicht vor...

    kleiner tip, dann checkst du das auch alles schau dir mal das hornerschema an!


    grüße und viel spass beim proggen
  • Ahh ja aber sicher doch beASt, und 1000000 in binär sind dann also 1*10^7 also 1000000?! Da irrst du aber gewaltig. ;)

    Nene, mein Ansatz ist doch ganz einfach (übrigens hätte ich besser "zahl" mit 0 initialisieren sollen bevor ich sie benutze, fällt mir gerade auf):
    Man geht die Zahl von hinten durch, wie du ja schon gesagt hast. Da das aktuelle Zeichen ja nur '0' oder '1' sein kann (zu beachten sind die ' !!), subtrahiert man einfach '0' von dem Zeichen und erhält nun tatsächlich 0 oder 1. Und diesen Wert schiebt man nun um die entsprechende Stelle nach links und schaltet dann das errechnete Bit ein (oder auch nicht, bei 0). Daher das linksschieben << und das OR | (OR = Einschaltoperator, zur Erinnerung). Manch anderer würde einfach + nehmen, aber da muss ich leider entschuldigen, dass ich (völlig überzogen) performance-orientiert progge. :cool:

    Ach ja und linksschieben um n ist Multiplikation mit 2^n. Um sich das zu verdeutlichen einfach ans 10er System denken, schiebt man z.B. 103 um 1 nach links, erhält man 1030 - kurzum, man hat mit 10^1 multipliziert. Umgekehrt ist rechtsschieben halt dividieren durch 2^n.

    edit: Und um verwechslungen auszuschließen sei nochmal gesagt: der Prozessor schiebt natürlich immer im 2er-System, d.h. also wenn man 103 tatsächlich 1 nach links schieben würde, kommt natürlich NICHT 1030 heraus, sondern 103*2 also 206! Das mit dem 10er-System sollte nur verdeutlichen, dass man sich fast alles was im 2er-System vorkommt, im 10er-System deutlich machen kann.
  • mg-tx

    ok gewonnen ;D umwandeln vom binär system ins dezimale geht natürlich mit 2^n nicht mit 10^n ;)


    mir kommt aber was viel wichtigeres.. das haben wir beide vergessen :))

    wir hätten wohl noch die atoi funktion nutzen sollen, meinste nicht ? :)
  • hm bei meinem beispiel aber schon ;)

    weil ichs ja ganz einfach mit hornerschema ausrechne und da benutz ich ja ansich charat(x)*2^n

    also dan eben atoi(charat(x))*2^n

    sicherlich könnte man das anders auch noch schreiben, da ist deine methode schon wesentlich eleganter ich glaube aber kaum das der lehrer im die abkauft :)
  • Hmm nee das find ich ja gar nich gut, atoi wandelt ja egtl ansi-strings in ints um, aber wenn es darum geht, '0' und '1' in 0 oder 1 umzuwandeln, würde ich wirklich auf jeden Fall charat(x)-'0' nehmen. Übrigens, string.charat(x) ist das gleiche wie string[x]. ^^
  • Hehe naja das -'0' bezieht sich auf den ASCII-Zeichensatz. ASCII ist ja sozusagen das Base-256 Zahlensystem, kurzum jede Zahl von 0 bis 255 (was halt genau ein BYTE sind, daraus ergibt sich 0 bis 255) hat ein entsprechendes Zeichen. So ist Zeichen 65 z.B. ein großes A, Zeichen 100 ist ein kleines d, Zeichen 10 ist \n (neue Zeile) usw. Und genauso haben auch die Ziffern nen bestimmten Wert, die 0 ist z.B. 48, die 1 ist 49 und so gehts weiter bis 9. Nachzulesen ist sowas in jeder ASCII-Tabelle.

    Kurzum, überall wo du im string ein A zu stehen hast, steht der Zahlenwert 65, und überall wo ne 0 steht, steht der Zahlenwert 48. Übrigens wandelt der Compiler schon beim compilen diese '0' in 48 um. Parallel würde er auch 'A' in 65 umwandeln. D.h. du machst egtl nichts weiter, als das Zeichen bei string[x] bzw string.charat(x) - 48 zu rechnen. Angenommen da steht nun ne '0' im string, würde er also 48 - 48 rechnen und des is ja bekanntlich 0. Steht dort ne '1', rechnet er halt 49 - 48, und das ist 1.

    So das war eine kleine Information über ANSI-Strings. ^^ Man sollte halt wissen, dass jedes Zeichen ein BYTE lang ist. Denn der Datentyp "char" entspricht einem BYTE. Es ist halt nur so, dass man solche BYTE-Sequenzen verschieden "lesen" kann. Im Hex-Editor z.B. werden BYTES meist hexadezimal gelesen. Im Feld rechts daneben (was die meisten Hex-Editoren haben) wird die selbe Sequenz meist nochmal Base-256 gelesen, also als ANSI-String.

    Und um die Sache abzuschließen, es gibt auch noch Unicode-Strings. Die Sache ist ganz simpel, dort sind die Zeichen nämlich nicht 1 byte lang, sondern 2 bytes (= 1 WORD). Die komplette Win32-Registry ist in Unicode gespeichert (frag mich nicht warum).

    Soll mal reichen zu Strings. ;)
  • öhm wenn die frage gestattet ist. wieso verlangt dein lehrer von dir n prog mit c++ zu erstenn, wenn ihr offensichtlich sowas noch kein stückchen im unterricht besprochen habt ?
    falls die frage net gestattet ist, einfach uebergehen. interessiert mich nur mal :)
  • erstmal dankeschön für eure posts !!!
    ich werds ma alles versuchen zu machen......

    @ Ooooomga
    mein lehrer hat gesagt das ich ne 2 krieg, wenn ich so ein progg erstellen kann....
    hat nichtmal gefragt ob ichs kann oder ned.....

    by DaCoxxxA
  • hallo

    ich habs :D

    habs mir coden lassen.....


    C-Quellcode

    1. #include <iostream.h>
    2. #include <windows.h>
    3. #include <stdio.h>
    4. int bindez();
    5. int dezbin();
    6. void textcolor(WORD color)
    7. {
    8. SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color);
    9. }
    10. int main()
    11. {
    12. textcolor(2);
    13. int wahl;
    14. unsigned char bEnde;
    15. bEnde = FALSE;
    16. while (!bEnde)
    17. {
    18. system("CLS");
    19. cout << "\n\n\n Zahlensystemrechner\n\n";
    20. cout << " MENU\n\n";
    21. cout << " 1__Dual -->Dezimal\n";
    22. cout << " 2__Dezimal -->Dual\n";
    23. cout << " 9__Beenden\n";
    24. cout << "Bitte wählen Sie aus :";
    25. cin >> wahl;
    26. switch (wahl){
    27. case 1: bindez();
    28. break;
    29. case 2: dezbin();
    30. break;
    31. case 9: bEnde = TRUE;
    32. break;
    33. default :
    34. {
    35. cout << "Nur zahlen von 0-9 eingeben";
    36. break;
    37. }
    38. }
    39. }
    40. return(0);
    41. }
    42. int bindez()
    43. {
    44. char bin[100];
    45. long int wert;
    46. int i;
    47. i=0;
    48. system("CLS");
    49. cout << "Geben Sie die binaere Zahl ein:";
    50. while(!(cin >> bin)){
    51. cin.clear();
    52. cin.ignore(1000,'\n');
    53. cerr << "Bitte nur Zahlen von 0 bis 1 eingeben";
    54. return(0);
    55. }
    56. for (wert=i=0; bin[i] != '\0'; i++)
    57. wert=wert+bin[i]^i;
    58. cout << "Dezimaler Wert:" << wert << endl;
    59. cout << "Weiter mit Return"<< endl;;
    60. getchar();
    61. return(0);
    62. }
    63. int dezbin()
    64. {
    65. int input;
    66. int i;
    67. int count = 0;
    68. int binary [32];
    69. system("CLS");
    70. cout<< "Geben Sie die dezimale Zahl ein:";
    71. while(!(cin >> input)){
    72. cin.clear();
    73. cin.ignore(1000,'\n');
    74. cerr << "Bitte nur Zahlen von 0 bis 9 eingeben, noch mal mir Return";
    75. getchar();
    76. dezbin();
    77. }
    78. do{
    79. i = input%2;
    80. binary[count] = i;
    81. input = input/2;
    82. count++;
    83. }
    84. while (input > 0);
    85. cout << "Binaere Zahl ist:";
    86. do{
    87. cout << binary[count - 1];
    88. count--;
    89. } while (count > 0);
    90. cout << "\nWeiter mit return\n";
    91. getchar();
    92. return(0);
    93. }
    Alles anzeigen



    danke nochmal für eure posts

    by DaCoxxxA
  • der das gecodet hat, kann nicht wirklich gut coden, oder?? Er hat es so gecodet wie wir Menschen denken, aber man sollte intelligenter denken und sich vor Augen führen dass der Computer ja die Zahen im Binärformat speichert und für uns automatisch wieder ins Dezimalsystem konvertiert...

    Hier ist mein Beispielprogramm: // Eingabefunktion muss man noch hinzufügen und dass die fehlenden Stellen mit Nullen ausgefüllt werden, also nur noch Kinderarbeit..hab dazu aber keine Lust...

    #include <windows.h>
    #include <iostream.h>
    #include <stdio.h>

    #define Check(v,f) (v & (1 << f))
    #define Set(v,f) (v |= (1 << f))

    void INT2bin(int zahl,char* binaer)
    {
    cout << zahl << endl;

    for(int i=31;i>=0;--i)
    {
    if(Check(zahl,i))
    binaer='1';
    else binaer[i]='0';
    }binaer[32]=0;
    }

    void BIN2int(int &zahl,char* binaer)
    {
    zahl=0;
    cout << binaer << endl;

    for(int i=31;i>=0;--i)
    {
    if(binaer[i]=='1')
    Set(zahl,i);
    }
    }

    void main()
    {
    int zahl=0;
    char str[32];

    INT2bin(10,str);
    cout << str << endl;

    BIN2int(zahl,str);
    cout << zahl << endl;

    Sleep(1000);
    }