[C/C++] Array statisch / dynamisch & wie übergeben

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Thecell, 16. November 2012 .

  1. 16. November 2012
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Array statisch / dynamisch & wie übergeben

    Hallo zusammen
    Spoiler
    Ich habe mittlerweile etwas ahnung in sachen Programmieren mit C++, jedoch hängts bei mir bei den Arrays. Am besten ich erklärs mit offenen Karten da es kein Geheimnis ist:
    Erklärung
    Ich bin über die Webseite ProjectEuler (About - Project Euler) gestolpert und hab mich direkt ans Problemlösen gemacht.
    Bin nun bei Problem 4 ich könnts auch ohne ausgelagerter Funktion machen, jedoch möchte ich auch etwas Programmieren Üben und nicht nur das Problem in einer riesigen Funktion lösen.
    Nun habe ich angefangen damit und habe erstmal eine Funktion geschrieben die mir sagt, wie viel Stellen meine Zahl besitzt. Klappt alles.
    Hab nun Eine Funktion die kontrolliert ob meine errechnete Zahl auch ein Palindrom ist.
    Für diese Funktion benötige ich aber ein Array, welches jede Zahl Stelle einer Zahl in einen Platz im Array schreibt, damit ich diese später einfach umdrehen kann und vergleichen.

    Hier klemmts. Das Problem bei dem Ihr mir evtl helfen könntet
    Wie kann ich eine Funktion schreiben, welche die Zahl & die Anzahl Stellen der Zahl übergeben bekommt, diese dann in ein Array schreibt und das Array dann zurückgibt?
    Wie rufe ich dies nacher in meiner Hauptfunktion auf bzw was für einer Variable muss ich den rückgabewert nacher übergeben?


    Könnt ihr mir da eventuell unter die Arme greifen bzw tipps geben ich möchte auf keinen fall die Problemlösung sondern nur die Arrayfrage geklärt haben!

    Mein Programmcode sieht momentan wiefolgt aus:
    Code:
    // Problem4.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace System;
    using namespace std;
    
    //Funktionsprototypen
    
    bool palindrom(int zahl, int stellen);
    int stellen(int zahl);
    
    //Hauptschleife
    int main(array<System::String ^> ^args)
    {
     bool test;
     int anzstellen;
     int palindromtest = 9009;
     int testconst = 4;
     anzstellen = stellen(palindromtest);
     test = palindrom(palindromtest, anzstellen);
     cout << anzstellen << "\n"; //Kontrolle ob Variable den Richtigen wert erhalten hat
     cout << test << "\n";//Kontrolle ob Variable den Richtigen wert erhalten hat
    
     //hier bastle ich gerade und will dies nacher mit variabeln erstellen + in eine Funktion packen
     cout << "\n\n\n\n\n\nModulotest:\n\n";
     int zahl = 14728;
     int array[5]; 
    
     array[0]= zahl % 100000 / 10000;
     array[1]= zahl % 10000 / 1000;
     array[2]= zahl % 1000 / 100;
     array[3]= zahl % 100 / 10;
     array[4]= zahl % 10;
    
     for(int i = 0; i<5; i++)
     {
     cout << array[i] <<"\n";
     }
    
     //Ende test
    
     system("PAUSE");
     return 0;
    }
    
    //Palindrom kontrolle
    bool palindrom(int zahl, int stellen)
    {
     //dynamisches Array initialisieren
     int* dummyarray = NULL;
     dummyarray = new int[stellen];
     //array füllen
     for(int i = 0; i<stellen; i++)
     {
     dummyarray[i];
     }
     //array wieder löschen
     delete [] dummyarray;
     dummyarray = NULL;
     return true;
    }
    
    //Stellen zaehlen
    int stellen(int zahl)
    {
     double arbeit = zahl;
     int stellen = 0;
     do
     {
     arbeit /= 10;
     stellen++;
     }
     while(arbeit > 9);
     return stellen;
    }

    €:
    Ich hab etwas weitergebastelt.

    Meine Funktion sieht nun so aus:

    Code:
    [B]XXX[/B] zahlToArray(int zahl, int stellen)
    {
     int* zahlenarray = NULL;
     zahlenarray = new int[anzstellen];
     int modulofaktor = 1;
     int divisor = 1;
     //Modulofaktor
     for(int q = 0; q < anzstellen-1; q++)
     {
     modulofaktor *= 10;
     divisor *= 10;
     }
     modulofaktor *= 10;
    
     //Kontrolle
     cout << "Modulofaktor: " << modulofaktor;
     cout << " divisor: " << divisor << "\n\n\n";
    
     //Zahl ins Array schreiben
     for (int j = 0; divisor != 1; j++)
     {
     zahlenarray[j] = palindromtest % modulofaktor / divisor;
     modulofaktor /= 10;
     divisor /= 10;
     }
     zahlenarray[anzstellen-1] = palindromtest % modulofaktor;
     
     //Zahlen ausgeben
     for(int k = 0; k<anzstellen; k++)
     {
     cout << zahlenarray[k] <<"\n";
     }
     return zahlenarray;
     delete [] zahlenarray;
     //Funktion fertig
    }
    Nun muss ich noch der Funktion einen Datentyp zuweisen und den Funktionsprototypen erstellen.
    Dann müsste ich nurnoch wissen wie ich diese Funktion in eine Variable(Array) schreibe (Also was davon zurückkommt (nämlich ein Array))

    Ist im prinzip wie
    Code:
    // arrays as parameters
    #include <iostream>
    using namespace std;
    
    void printarray (int arg[], int length) {
     for (int n=0; n<length; n++)
     cout << arg[n] << " ";
     cout << "\n";
    }
    
    int main ()
    {
     int firstarray[] = {5, 10, 15};
     int secondarray[] = {2, 4, 6, 8, 10};
     printarray (firstarray,3);
     printarray (secondarray,5);
     return 0;
    }
    nur dass ich es umgekehrt will: also erst 2 Zahlen übergeben und ein Array dann zurück (return)
     
  2. 16. November 2012
    Zuletzt bearbeitet: 16. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Hallo,

    Einen Array kannst du nur mittels Zeigern zurückgeben.
    Würd' dir generell aber empfehlen das anders zu regeln, denn einen Zeiger zurückzugeben hat Nachteile. Zum einen passiert es sehr schnell mal, dass auf Speicher zugegriffen wird, der "außerhalb" der Funktion nicht mehr existert. Zum Anderen, und das ist hier der Fall, merkt man oft nicht gleich, wann eine Funktion dynamischen Speicher reserviert. Wenn du jetzt also in deine Funktion als Rückgabetyp einen Zeiger einbaust, musst du den Speicher auch nachher wieder freigeben.

    Deshalb mein Vorschlag, bau weitere Parameter mit ein und Arbeite mit Referenzen/Zeigern. "Pseudocodemäßig" also ungefähr so:

    Code:
    // Deklaration
    zahlToArray(int zahl, int* arr, int size);
    
    // Aufruf
    array = new int[AnzahlStellen];
    zahlToArray(zahl, array, AnzahlStellen);
    // ..irgendwas machen...
    // und dann natürlich den Speicher später wieder freigeben
    delete array;
     
    1 Person gefällt das.
  3. 16. November 2012
    Zuletzt bearbeitet: 16. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Oha.

    Ich weiß ehrlich gesagt garnicht wo ich anfangen soll. Das ist eine Baustelle. Eine Große.

    In welcher Sprache möchtest Du denn nun programmieren? C++, C++/CLI, C++/CLI .Net? Du verwendest da einiges und bringst dich offensichtlich durcheinander.

    Was nach einem 'return' kommt, ist gleichzusetzen mit nichts, denn diese Zeilen werden ignoriert, es sei denn Du arbei.. (Das erwähne ich lieber nicht).

    Da gibt es noch so vieles, aber ich habe gerade keine Zeit und Nerven alles zu verbessern, ich kann dir nur raten einiges lieber aufzuholen und mit simpleren Aufgabenstellungen zu lernen.

    Zu deiner Frage: [G]Call-by-Reference[/G], dass ist auch genau das, was mein Vorposter andeutet. Verzichte allerdings auf direkte Speicherzugriffe per Zeiger und arbeite mit den in C++ ggb. Mitteln (std::vector, ..). Ein Beispiel:

    Code:
    void blablubb(int x, std::vector<int>::reference a);
     
    1 Person gefällt das.
  4. 16. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Danke euch beiden ich werde da wie gesagt dann mal "weiterbasteln"

    @TerraNova danke, dass du mich mal etwas zusammenschnautzt sowas brauchte ich. (wirklich keine ironie!)
    Wir hatten leider nur die absoluten Grundlagen (sprich deklaration, datentypen (die gängisten), initialisierung, schleifen und das Auslagern von einfachen Funktionen)
    Ich habe leider keine Ahnung was denn jetzt reines C++ ist und was zu C++/CLI, C++/CLI .Net gehört.
    Gut zu wissen, dass alles nach dem return ignoriert wird kommt auf die notiert und nie wieder vergessen Liste.

    Kannst du mir den Tipps geben, wo ich am besten anfange zum aufholen (also welche lektüre / Webseiten / Aufgabenstellungen)

    Danke für euer Verständniss.
     
  5. 16. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Am besten kaufst Du dir erstmal ein Buch (c++.de :: Bücher) und arbeitest das erstmal durch. Zwischendrin überlegst Du dir was Du mit deinem Wissen anfangen könntest und wie Du es in das nächste Kapitel mit einbringst. So hab ich es jedenfalls damals gemacht.

    Es bringt einfach nichts, wenn man Unwissen mit Unwissen mischt (klingt härter als ich es meine). Irgendwann wird es zu viel und die Motivation geht flöten.

    Ansonsten lohnt sich auch ein Blick in den Sticky!

    Falls es mal nebensächliche Fragen gibt, gibts im Jabber auch 'n extra Channel: #rr-coding
     
  6. 16. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Danke für die Info nehms mir vor und werd mir wohl ein Buch kaufen.
    Man wird mich dann evtl im Jabber finden ab und zu mal
     
  7. 17. November 2012
    Zuletzt bearbeitet: 17. November 2012
    AW: Array statisch / dynamisch & wie übergeben

    Hey!

    Schoene Aufgabe. Es hat mich motiviert, das ganze mal schnell in C zu implementieren. Das sollte so, oder so aehnlich, auch in C++ dann laufen. Lass dich nicht verwirren, vielleicht kannst du dann mal spaeter zum Loesungsvergleich reinspicken ;-) Bis auf den "Brute-Force"-Suchalgorithmus in der etwas unsauberen main-Funktion hab ich versucht es moeglichst geschmeidig zu loesen.

    Spoiler
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    
    
    static int is_palindrom (char *arr, int arr_len);
    static char int_len (int number);
    static char* int_to_array (int number, char len);
    
    
    typedef struct _Result
    {
     int max;
     int a;
     int b;
    } Result;
    
    
    int main (void)
    {
     int a = 0, b = 0, product = 0;
     char len = 0;
     int palindrom = 0;
     char *arr = NULL;
     Result result = { 0, 0, 0 };
    
     // Let's put our CPU to work!
     // Attention: highly inefficient
     for (a = 999; a > 100; a--)
     {
     for (b = 999; b > 100; b--)
     {
     product = (a * b);
    
     len = int_len (product);
     arr = int_to_array (product, len);
    
     palindrom = is_palindrom (arr, len);
    
     if (palindrom == EXIT_SUCCESS)
     {
     if (product > result.max)
     {
     result.max = product;
     result.a = a;
     result.b = b;
     }
     }
    
     free (arr);
     }
     }
    
     printf ("The largest palindrome made from the product of two 3-digit numbers is:\n"
     "%i * %i = %i\n", result.a, result.b, result.max);
     return EXIT_SUCCESS;
    }
    
    
    // EXIT_FAILURE = no
    // EXIT_SUCCESS = yes
    static int
    is_palindrom (char *arr, int arr_len)
    {
     int i = 0;
    
     if (arr == NULL)
     return EXIT_FAILURE;
    
     for (i = 0; i < (arr_len / 2); i++)
     {
     if (arr[i] != arr[(arr_len - i - 1)])
     return EXIT_FAILURE;
     }
    
     return EXIT_SUCCESS;
    }
    
    
    static char
    int_len (int number)
    {
     char len = 0;
     
     do {
     number = number / 10;
     len++;
     } while (number != 0);
     
     return len;
    }
    
    
    // free!
    static char*
    int_to_array (int number, char len)
    {
     char *result = NULL;
     int i = 0;
    
     if (len == 0)
     return NULL;
     
     result = malloc (len * (sizeof (char)));
     if (result == NULL)
     {
     perror ("Error allocating memory");
     return NULL;
     }
     
     for (i = 0; i < len; i++)
     {
     result[i] = (char)(number % 10);
     number = number / 10;
     }
     
     return result;
    }
    
    
    

    Edit: Meine Loesung funktioniert uebrigens fuer beliebige Zahlen (bis irgendwann mal INT_MAX fuer das Produkt erreicht ist) Ich hab gesehen, du hast das eher statisch geloest; das sollte man vermeiden.

    Mfg,

    Kolazomai
     
    1 Person gefällt das.
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.