kopiertes Array anzeigen



  • Hallo Leute!

    Ich habe folgendes Problem:

    Der user gibt ein array a ein. Man kann festlegen wieviele Zahlen man eingeben möchte, maximal jedoch 10.
    Dann kann man das array a in array b kopieren. Wenn man dann erneut array a eingibt kann man ja die Größe erneut festlegen und andere Zahlen eingeben, so dass man dann zwei verschiedene arrays hat.
    Allerdings habe ich bei meiner Lösung das Problem, dass in diesem Fall bei der Ausgabe für b entweder Zahlen fehlen, oder unsinnige Ausgaben angezeigt werden.

    case 1:
    
    			cout << "\n  Wieviele Zahlen moechten Sie einlesen? (max. 10)\n\n  ";	
    			cin >> m;																
    			system("cls");
    
    			f = m - (m - 1);														
    			while (m > 10)															
    			{
    				cout << "\n  zu hoch, bitte erneut eingeben:  " << endl;
    				cin >> m;														
    				system("cls");
    			}
    			cout << "\n  Geben Sie nun die ganzen Zahlen ein:\n\n  ";
    			for (int i = 0; i < m; i++)												
    			{
    
    				cout << "\n  " << f << ". Zahl:\n\n  ";								
    				cin >> a[i];
    				system("cls");
    				f++;																
    			}
    
    			break;
    
    case 4:
    
    			cout << "\n  Die kopierten Zahlen in Array b sind: ";
    
    			for (int w = 0; w < m; w++)											
    			{
    
    				cout << "" << b[w] << " ";										
    			}
    			cout << endl << endl;
    
    			break;
    

    Das m bezieht sich natürlich auf das m, dass in case 1 festgelegt wird, wenn sich das bei erneuter Eingabe ändert, ist ja klar, dass dann, wenn man b wieder anzeigen will das m für b nicht mehr stimmt.

    Ich hab überhaupt keine Idee wie ich das umgehen könnte. Ist das so überhaupt möglich?



  • Der Code ist gar nicht mal so gut. Erstens ist er nicht vollständig (wie sind a und b definiert) und zweitens fehlt die Kopieroperation des Arrays



  • ok entschuldige, ich dachte diese Informationen wären nicht wichtig daher habe ich sie weggelassen.

    #include <iostream>
    #include <windows.h>
    #include <string.h>
    using namespace std;
    int main()
    {
    	int a[10], b[10],f, m;
    
    	do
    	{
    		int input;
    		cout << "\n  Array a eingeben                 [1]\n";
    		cout << "\n  Array a anzeigen                 [2]\n";
    		cout << "\n  Array a in Array b kopieren      [3]\n";
    		cout << "\n  Array b anzeigen                 [4]\n";
    		cout << "\n  Array a und b in c mischen       [5]\n";
    		cout << "\n  Array c anzeigen                 [6]\n";
    		cout << "\n  Das Programm beenden:            [7]\n";
    		cout << "\n\n\n  Eingabe:                          ";
    		cin >> input;
    		system("cls");
    
    		switch (input)
    		{
    
    		case 1:
    
    			cout << "\n  Wieviele Zahlen moechten Sie einlesen? (max. 10)\n\n  ";	
    			cin >> m;																
    			system("cls");
    
    			f = m - (m - 1);														
    
    			while (m > 10)															
    			{
    				cout << "\n  zu hoch, bitte erneut eingeben:  " << endl;
    				cin >> m;															
    				system("cls");
    			}
    			cout << "\n  Geben Sie nun die ganzen Zahlen ein:\n\n  ";
    			for (int i = 0; i < m; i++)												
    			{
    
    				cout << "\n  " << f << ". Zahl:\n\n  ";								
    				cin >> a[i];
    				system("cls");
    				f++;																
    			}
    
    			break;
    
    		case 2:
    
    			cout << "\n  Die eingegebenen Zahlen in Array a sind: ";
    
    			for (int w = 0; w < m; w++)											
    			{
    
    				cout << "" << a[w] << " ";									
    			}
    			cout << endl << endl;
    
    			break;
    
    		case 3:
    
    			memcpy(b, a, sizeof(a));
    
    			break;
    
    		case 4:
    
    			cout << "\n  Die kopierten Zahlen in Array b sind: ";
    
    			for (int w = 0; w < m; w++)
    			{
    
    				cout << "" << b[w] << " ";										
    			}
    			cout << endl << endl;
    
    			break;
    
    		case 5:
    
    		case 6:
    
    		case 7:
    			cout << "\n  Vielen Dank, einen schoenen Tag noch!\n\n\n  ";
    			system("pause");
    			system("cls");
    			exit(0);
    			break;
    		default:
    			cout << "\n  Fehler, falsche Eingabe, Programm wird beendet.\n";
    			exit(0);
    			break;
    		}
    
    	} while (true);
    }
    

    Das wäre dann das vollständige Programm soweit wie ich es habe.



  • Ohne mir jetzt Dein Programm näher angesehen zu haben:
    Du brauchst natürlich für jedes Array die Größe. Sowohl beim einlesen als auch beim ausgeben.
    wenn Du zwei Arrays hast, brauchst Du also irgendwie sowas

    int a[10]; int size_a;
    int b[10]; int size_b;
    

    Das ist offensichtlich quatsch, weil das spätestens mit drei Arrays unangenehm wird.

    Eine Lösung wäre die Daten und die Größe als eine Einheit zu definieren:

    struct vector{
      int size;
      int data[10];
    };
    

    Die Ausgabe könnte dann z.B. so aussehen:

    void print(const vector& v){
      for(int i=0; i<v.size; ++i)
        std::cout << v.data[i];
      std::cout << '\n';
    }
    

    Eine Eingabefunktion könnte z.B. so aussehen:

    vector read_vec(int size){
      vector a{};
      a.size=size;
      // magie zum befüllen von a.data
      return a;
    }
    

    Als Bonus ist das kopieren mit der Klasse vector quasi geschenkt.



  • Musst du das mit C-Arrays lösen (Hausaufgabe etc.)? ANsonsten solltest du dir mal std::vector ansehen...



  • Patruschek schrieb:

    Das m bezieht sich natürlich auf das m, dass in case 1 festgelegt wird, wenn sich das bei erneuter Eingabe ändert, ist ja klar, dass dann, wenn man b wieder anzeigen will das m für b nicht mehr stimmt.

    Ich hab überhaupt keine Idee wie ich das umgehen könnte. Ist das so überhaupt möglich?

    Bestimmt. Du könntest z.B. zwei Variaben für "m" benutzen. Eins für a (ma) und eins für b (mb). Dann kannst Du aber auch gleich Vektoren einsetzen. Die wissen nämlich selbst schon, wie groß sie sind. Das Kopieren wäre dann auch ganz einfach: Einfach eine Zuweisung per Gleichzeichen.

    #include <iostream>
    #include <vector>
    
    using namespace std; // <-- sowas bitte nie in Header-Dateien packen
                         //     Es spart uns hier aber das std:: vor allen
                         //     Dingen aus der Standardbibliothek
    
    void zahlen_eingeben(vector<int> & wohin);
    {
        …
        wohin.clear();
        …
        {
            …
            wohin.push_back(aktuelle_zahl);
            …
        }
        …
    }
    
    void zahlen_anzeigen(vector<int> const& v)
    {
        …
    }
    
    int main() {
       vector<int> a;
       vector<int> b;
       …
          case 1: zahlen_eingeben(a); break;
          case 2: b = a; break; // alle Zahlen von a nach b kopieren
          case 4: zahlen_anzeigen(b); break;
       …
    }
    


  • Um ehrlich zu sein, schieße ich total übers Ziel hinaus, denn wir müssen dem user überhaupt gar nicht die Möglichkeit geben die Anzahl der Zahlen im Array festzulegen. In einer früheren Aufgabe sollten wir aber genau das tun, daher wollte ich alles was wir bisher gelernt haben auch benutzen.
    Vektoren behandeln wir überhaupt nicht, aber ich werde mich jetzt trotzdem damit beschäftigen.

    Vielen Dank für den Hinweis 🙂

    Wo packe ich denn das "using namespace std;" rein, wenn nicht in den Header?
    In unserem Skript steht das nämlich genau dort.



  • Patruschek schrieb:

    Vektoren behandeln wir überhaupt nicht, aber ich werde mich jetzt trotzdem damit beschäftigen.

    Beachte, dass ich mein struct auch vector genannt habe.
    Das ist aber was gänzlich anderes als std::vector , den zu benutzen kkaw und daddy_felix vorschlagen.



  • Patruschek schrieb:

    Wo packe ich denn das "using namespace std;" rein, wenn nicht in den Header?

    Vielelicht hast Du da auch nur etwas missverstanden. Mit "Header" meint man im C/C++ Kontext nicht den Anfang einer Datei, sondern eine Datei mit Endung .h, .hpp, .H oder .hxx statt .c, .cpp, .C oder .cxx. Header werden dafür benutzt, um größere Programme aus mehreren Dateien zusammenzusetzen. Wenn x.cpp und y.cpp benutzt werden soll, #inkludiert y.cpp eine x.hpp, worin das nötigste über x.cpp drin steht, so dass x.cpp in y.cpp genutzt werden kann.

    using namespace std; vermeidet man jetzt in Header-Dateien, weil dann automatisch nach einem solchen #include diese using-Direktive quasi im Rest einer .cpp-Datei dann auch "aktiv" ist. Und das will man vielleicht gar nicht.


Log in to reply