tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
781
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    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
    
    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
     
    char sortdef(char kzahl[5])
    {
    char gzahl[5],temp;
        for (int i=1;i<=3;i++) {
    for (int j=i+1;j<=4;j++) {
    if(kzahl[j-1] < kzahl[i-1]) {
        temp=kzahl[i-1];
        kzahl[i-1]=kzahl[j-1];
        kzahl[j-1]=temp;
                } 
    }
    }
    for(i=1;i<=4;i++)
         gzahl[4-i]=kzahl[i-1];
        [color=red]return atoi(gzahl)-atoi(kzahl);[/color]
    }
     
    void main(void)
    {
    char azahl[5];
    cout << "Gebe die gewuenschte Zahl zum testen ein. ";
    cin >> azahl;
    while(azahl != "6174"){
         [color=red]azahl=sortdef(azahl);
    [/color]cout << azahl << "\n";
        }
    }


    Hier erstmal der Code, ich habe die 2 problematischen Zeilen makiert.
    Es ist mein 1. C++ Programm und wnen ich sonst irgendwas nichgt gut gemacht habe, könnt ihr das auch immer gerne schreiben

    Zum Problem ich habe ein Arraychar wo eine 4- Stellige Zahl drinne stehtdiese sortiere ich in der Funktion einmal aufsteigend und einmal absteigend.
    Dann ziehe ich die Aufsteigende(kleine) von der Absteigenden(großen) ab.
    Die differenz möchte ich dann(auch als char array) zurückgeben.

    Das ganze ist eine Zahlenspielerei von einem Herrn Kaprekar.
    Alle 4- Stelligen Zahlen (auch 0001) die nicht gleich sind ergeben nach diesem Muster (Sortierung- differenz) nach maximal 7 Schritten 6174


    So ich wäre froh wnen mir da jemand behilflich sein könnte



    Achso ich hab noch was vergessen, der Rückgabewert ist natürlich auch noch falsch, der ist integer und nicht char...
    Aber denke das hättet ihr auch so gesehen
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Und was genau ist dein Problem?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    Naja ist ja relativ gut zu sehen eigendlich

    Beim ersten roten ist der Rückgabewert integer und nicht string, da bräuchte man noch ne Wechselfunktion, das hab ich aber nicht hinbekommen/gefunden.

    Beim 2. sagt er
    "error C2440: '=' : 'char' kann nicht in 'char [5]' konvertiert werden
    Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt"

    is ja auch relativ klar, der rückgabetyp sollte char sein und die variable ist char array...
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Deine Sortierfunktion muss vom Typ int und nciht char sein. Dann ist das Problem schonmal gelöst.

    Aber das wird dann auch nciht sein was du genau suchst!

    Du solltest für den übergabe Parameter einen Pointer nehmen, dann kannst dir das ganze mit den Rückgaben ersparen!


    mfg
    umbrasaxum
     

  5. #5
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    könntest du mir das vielleicht machen?
    Weil ich hab mit Zeigern noch nicht so die Ahnung, wäre nett, dann hab ich da gleich ne Anwendung
     

  6. #6
    colt4ever Tutorials.de Gastzugang
    Hallo, dies ist mein Beispiel mit einem Pointer für die Differenz:
    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
    
    void sortdef(char *kzahl, int *differenz)
    {
    char gzahl[5]; //Aufsteigend sortiertes Array
    char help_zahl; //Hilfsvariable
    int count1 = 0;
    int count2 = 0;
     
    //sortiert kzahl von groß nach klein
    for(count1 = 0; count1 < 5; count1++)
    for(count2 = 0; count2 < 4; count2++)
    if(kzahl[count2] <= kzahl[count2+1])
    {
        help_zahl = kzahl[count2];
        kzahl[count2] = kzahl[count2+1];
        kzahl[count2+1] = help_zahl;
    }
     
    //sortiert genau umgekehrt
    for(count1 = 0; count1 < 4; count1++)
    gzahl[count1] = kzahl[3-count1];
    gzahl[4] = '\0';
     
    //differenz berechnen
    *differenz = atoi(kzahl) - atoi(gzahl); 
    }

    Und hier ist der Aufruf:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    void main()
    {
    char azahl[5];
    int differenz = 0;
     
    cout << "Gebe die gewuenschte Zahl zum testen ein. ";
    cin >> azahl;
     
    sortdef(azahl,&differenz);
    printf("%d",differenz*2);   //bin draufgekommen das man die differenz * 2 tut um 
    //das ergebnis zu erhalten (61..)
    system("pause");
    }

    ich hoffe es geht bei mir jedenfalls schon
    bei fehler sag es mir.
     

  7. #7
    colt4ever Tutorials.de Gastzugang
    ACHTUNG, WAR ZU VOREILIG:

    Bin auf Fehler draufgekommen,
    wenn man zB 9087 (aber mit 3214 gehts und 5647) eingibt gehts nicht, ich geh aber jetzt schlafen. Morgen kriegst du dein fertiges programm spätestens um diese Zeit, falls ich nicht vergesse
     

  8. #8
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Naja ist ja relativ gut zu sehen eigendlich
    Nicht wirklich.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  9. #9
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    ich glaub das reicht mir schon, ich werd dir mal nen beispiel geben, sagen wir du hast die Zahl 5472 dann geht das folgendermaßen:

    7542 - 2457 = 5085
    8550 - 0558 = 7992
    9972 - 2799 = 7173
    7731 - 1377 = 6354
    6543 - 3456 = 3078
    8730 - 0378 = 8352
    8532 - 2358 = 6174

    Den Vorgang simulier ich dann.
    Das kannst du mit allen beliebigen 4- stelligen Zahlen machen die eben net alle gleich sind.

    Das Beispiel hat jetzt die maximalschritte von 7 gebraucht.
     

  10. #10
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    So ich hab das Ding mit dem int Zeiger mal versucht und dann ist mir aufgefallen das das so nicht gehen kann, denn im Hauptprogramm muss ich ja eine Schleife machen die die Funktion so lange aufruft bis der String 6174 ist.

    Deswegen muss ich für den 1. Parameter immer den Wert des zeigers übergeben.
    Es würde jetzt gehen wenn ich nur den Zeiger von char da reingehe, aber dann muss ich den Rückgabewert auch in char haben und nicht wie jetzt in integer (mit atoi)
     

  11. #11
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Du machst dir das viel viel komplizierter als das eigentlich ist!


    Ich würde es wie folgt machen:
    1. Erste Zahl einlesen und zwar als int einlesen!
    2. Dann die Zahl einer Funktion übergeben.
    - Die dann die Zahl in einen Stringkonvertiert.
    - Den String umdreht.
    - In ein int konvertiert.
    - Und diesen int dann wieder zurückgibt.
    3. Jetzt hast du die erste int Variable und die zweite (umgedrehte) Variable die ihren Wert von der "umdreh" Funktion zurückbekommen hat.
    4. Die beiden Subtrahieren.
    5. Inner Schleife das so lange machen bis 6174 rauskommt.

    Vielleicht mach ich das nachher mal.


    mfg
    umbrasaxum
     

  12. #12
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Es erfüllt noch nicht alle deine Anforderungen, aber vielleicht bringt es dir was.

    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
    
    #include <iostream>
    #include <windows.h>
     
    using namespace std;
     
    int umkehrfunktion(int zahl);
     
    int main()
    {
        int erste = 0, zweite = 0;
     
        while( zweite != 6174 )
        {
            cin >> erste;
            zweite = umkehrfunktion(erste);
            cout<< erste << " - " << zweite << " = " << erste - zweite;
        }
     
        return 0;
    }
     
    int umkehrfunktion(int zahl)
    {
        char string[5];
        char ergebnis[5];
     
        int l=3;
     
        itoa(zahl, string, 10);
     
        for(int i=0; i<4; i++)
            ergebnis[l--] = string[i];
     
        ergebnis[4] = '\0';
     
        return atoi(ergebnis);
    }


    mfg
    umbrasaxum
     

  13. #13
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    Hey, danke, das hilft mir schonmal weiter, aber du hast das Problem auch noch nicht ganz verstanden
    In der Funktion wird nicht nur Umgekehrt, sondern ich Sortiere in der Funktion auf- und abwärts.
    Wenn ich es einmal aufwärts sortiere muss ich es natürlich nicht noch abwärts sortieren, deswegen dreh ich es nur um.

    Dann hab ich noch die differenz der großen und der kleinen zahl genommen.
    Und das will ich zurückgeben.

    Warte ich kopier dir mal den Code des Pascal programms, welches ich geschrieben hab, der genau das selbe macht.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    
    program uebung8;
    uses CRT;
    function str2val(chstr:string):integer;
    var code,chint : integer;
      begin
        val(chstr,chint,code);
        if code <> 0 then
          writeln('Fehler beim Konvertieren des Strings an Stelle ',code);
        str2val:=chint
      end;
    procedure sortieren(inzahl:string;var kzahl,gzahl:string);
      var i,j:integer;
          tmp:char;
      begin
          kzahl:=inzahl;
          gzahl:='';
          for i:=1 to 3 do
            begin
            for j:=i+1 to 4 do
              begin
              if kzahl[j]<kzahl[i] then
                begin
                  tmp:=kzahl[i];
                  kzahl[i]:=kzahl[j];
                  kzahl[j]:=tmp;
                end;
            end;
          end;
          for i:=1 to 4 do
            begin
             insert(kzahl[5-i],gzahl,i)
            end;
      end;
      procedure kaprekar(krzahl:string;var anz:integer);
      var kzahl,gzahl:string;
        begin
        anz:=0;
          while krzahl <> '6174' do
            begin
              inc(anz);
              sortieren(krzahl,kzahl,gzahl);
              str(str2val(gzahl)-str2val(kzahl),krzahl);
              if length(krzahl)<4 then
                begin
                  repeat
                    insert('0',krzahl,1);
                  until length(krzahl)=4
                end;
            end;
        end;
      var ausgangszahl:string;
          comp,zaehl:integer;
      const max=7;
      begin
      clrscr;
      ausgangszahl:='0';
      zaehl:=0;
        while str2val(ausgangszahl)<=9999  do
          begin
          str(str2val(ausgangszahl)+1,ausgangszahl);
          if length(ausgangszahl) < 4 then
                begin
                   repeat
                     insert('0',ausgangszahl,1);
                   until length(ausgangszahl)=4
                end;
            if str2val(ausgangszahl) mod 1111 = 0 then
            else
              begin
                kaprekar(ausgangszahl,comp);
                if comp=max then
                  begin
                    inc(zaehl);
                    {write(ausgangszahl,' ');}
                  end;
              end;
          end;
          writeln('die maximale Zahl der Schritte betr„gt: ',max);
          writeln('die Anzahl derer, die sich am laengsten wiedersetzen, betraegt: ',zaehl);
      readln
      end.

    Das Programm is sogar noch ein wenig komplexer da es die ganzen Zahlen von 1- 9998 durchgeht und guckt ob es die maximale schrittzahl vonn 7 erreicht.


    Aber danke dein Programm bringt mir auf jeden Fall schonmal was.
    Geändert von CLRS530 (29.01.05 um 02:38 Uhr)
     

  14. #14
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Aha, jetzt hab ich es verstanden.
    Ich lass mir das nochmal durchn Kopfgehen wenn ich wieder wach bin.


    mfg
    umbrasaxum
     

  15. #15
    CLRS530 CLRS530 ist offline Rookie
    Registriert seit
    Jan 2005
    Beiträge
    8
    Zitat Zitat von Kachelator
    Nicht wirklich.
    Naja wenn man den Text nur überfliegt und sich nicht die Zeit zum lesen nimmt, dann hast du wohl recht
     

Ähnliche Themen

  1. BCB Ansistring als Rückgabewert einer Funktion
    Von dern3ro im Forum Borland CBuilder und VCL
    Antworten: 2
    Letzter Beitrag: 22.03.10, 18:08
  2. Rückgabewert einer Funktion
    Von Dragonate im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 30.11.09, 14:57
  3. jQuery: $.post Rückgabewert als Rückgabewert der Funktion - geht das?
    Von Kryptaesthesie im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 15.01.09, 07:40
  4. jsp: Rückgabewert einer Funktion in variable?
    Von Layna im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 13.12.07, 11:17
  5. combobox, rückgabewert einer js-funktion
    Von rtd1978 im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 18.04.05, 14:12