Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Feldelemente verschieben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.01.2014, 10:48 Uhr
surge



Hallo,
ich möchte eine Zahlenfolge in einem Feld abspeichern:

C++:
    cout<<"Wieviele Zahlen moechten Sie eingeben?\n";
    cin>>el;                                                      // Elementeanzahl abfragen und einlesen
    }while (el <0 || el>90);

    for (int i=0;i<el;i++)
    {
        cout<<"Bitte Elemente Nr. "<<i<<" eingeben: ";
        cin>>Feld[i];
    }



und anschließend soll es möglich sein die Startzahl, also das erste gespeicherte Element im Feld, zu ändern.

C++:
    cout<<"Neue Startzahl?\n";
    cin>>Feld[0];    



Wenn ich es so programmiere, überschreibe ich die erste Zahl, wie aber kann ich das erste Elemente auf den Index des zweiten verschieben (also Element mit Index Zähler 0 -> Element mit Index Zähler 1, usw...)?

Habe es mal so versucht:

C++:
        i=0; // Zähler auf null setzen
    while (i<el+1) // Solange Zähler kleiner Elementezahl+1
    {
    Feld[i]=Feld[i+1];
    i++;
    }



Es wird dann die Startzahl geändert, aber die restlichen Feldelemente sind irgendwelche Zahlen und nicht die vorher eingegebenen, scheinbar werden die einfach überschrieben.

Weiß jemand Rat?

Danke im Voraus,
surge
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.01.2014, 13:05 Uhr
Tommix



Hallo,
Du schiebst verkehrt herum. Aber davon abgesehen wäre wohl einfacher die Werte von vorn herein an der richtigen Stelle abzulegen:

C++:
    cin >> Feld[i+1];



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2014, 09:05 Uhr
~surge
Gast



Zitat von Tommix:
Hallo,
Du schiebst verkehrt herum. Aber davon abgesehen wäre wohl einfacher die Werte von vorn herein an der richtigen Stelle abzulegen:

C++:
    cin >> Feld[i+1];



Gruß, Tommix



Aber, wenn ich es so schreibe, bekomme ich die neue Startzahl nicht angezeigt, alle Elemente verschieben sich um einen Platz nach vorne. Also von 1 auf 0 usw.
In der Aufgabenstellung heißt es weiter, dass man die Summe aller Elemente berechnen und im Feld als letztes Element abspeichern soll und diese dann mit ausgeben


C++:
        case 2: // Summe berechnen
                    su=0;
                    i=0;
                    while (i<el)
                    {
                    su += Feld[i];
                    i++;
                    }
                    



Letztem Feldelement zuweisen:


C++:
Feld[el+1]=su;
el++;



Scheint so nicht zu funktionieren
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2014, 09:18 Uhr
ao

(Operator)


Bitte mal die Aufgabenstellung posten. Und den kompletten Code, nicht nur Stückchen.

Und wenn du die Werte von Feld[0] bis Feld[el-1] aufsummierst, dann gehört die Summe nach Feld[el], nicht nach Feld[el+1].

Und natürlich kann man die Summe mit einer while-Schleife berechnen, aber ich finde eine for-Schleife passender, wenn die Anzahl der Wiederholungen vorgegeben ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2014, 12:48 Uhr
surge



Aufgabe:
Programmieren Sie ein Konsolenprogramm, dass eine Zahlenfolge von der Tastatur einliest, die Zahlenfolge ausgibt, die Summe der Zahlenfolge berechnet und als letztes Feldelement ausgibt. Die Startzahl soll veränderbar sein.
Die Funktion zur Berechnung der Summe soll ausgelagert werden (s. Funktionsaufruf)
Sie dürfen von einer Feldgröße von 90 ausgehen. (Also müsste das Feld eigentlich die Größe 89 haben, wenn ich das richtig sehe?)


C++:
#include "iostream"
using namespace std;

void main ()
{
    int opt,i, su, Feld[90],el;

    cout<<"Programm zum Arbeiten mit einer Zahlenfolge\n";
    el=0;
        do
        {
        cout<<"Wieviele Zahlen moechten Sie eingeben?\n";
        cin>>el;
        }while (el <0 || el>90);

            for (int i=0;i<el;i++)
            {
            cout<<"Bitte Elemente Nr. "<<i<<" eingeben: ";
            cin>>Feld[i];
            }
    do
    {

    cout<<"\nBitte waehlen Sie aus:\n";
    cout<<"1 - Zahlenfolge ausgeben\n2 - Summe aller Elemente der Folge berechnen und als letztes Element ausgeben\n";
    cout<<"3 - Eine neue Startzahl (kleiner gleich null) festlegen\n4 - Das Programm beenden\n";
    cin>>opt;

    switch (opt)
    {
    case 1:
        cout<<"Folgende Zahlen sind gespeichert:\n";  // Gespeicherte Zahlenfolge ausgeben ohne Summe aller Elemente
        for ( i=0;i<el;i++)
        {
            cout<<"Element Nr."<<i<<" : "<<Feld[i]<<endl;
        }
        break;
                
                case 2: // Summe berechnen
                    su=0;
                    for (i=0;i<el;i++)
                    {
                    su += Feld[i];
                    }
                                
                    Feld[i]=su; // Summe aller Zahlen berechnen und als letztes Feldelement ausgeben
                    el++;
                    
                    cout<<"Summe aller Zahlen im Feld: "<<Feld[i];
                    break;
                    
                case 3: //Neue Startzahl
                    
                    for (i=0;i<el+1;i++)
                    {
                        Feld[i]=Feld[i+1];
                    }
                    cout<<"Neue Startzahl?\n";
                    cin>>Feld[i+1];
                    
                
                    cout<<"Neue Folge: \n"; // Neue Folge ausgeben
                        for (i=0;i<el+1;i++)
                        {
                        cout<<"Element Nr."<<i<<" : "<<Feld[i]<<endl;
                        }
                break;
                    
                    
                case 4:
                    break;
            default:
            cout<<"Ungueltige Option!\n";
                    break;
    }
                
    }
    while (opt != 4);
}


Dieser Post wurde am 20.01.2014 um 13:04 Uhr von surge editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2014, 16:39 Uhr
ao

(Operator)


OK. Mir ist nicht klar, was "Die Startzahl soll veränderbar sein" genau bedeutet. Beschreib mal, was da passieren soll, vielleicht mit einem Beispiel. Angenommene Ausgangssituation:

Code:

el = 4 (4 Zahlen eingegeben)
Feld[] = { 1  2  3  4  10  x  x  x  x  ..... }  ( 4 eingegebene Zahlen
                 von 1 bis 4, 10 ist die Summe
                 und der Rest vom Array ist undefiniert )


jetzt ruft jemand Menüpunkt 3 auf und gibt als neue Startzahl eine 5 ein. Wie ist der Zustand danach?

Dieser Post wurde am 20.01.2014 um 16:40 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2014, 17:19 Uhr
surge



Entweder el = 4 bleibt und die erste Zahl wird überschrieben, z.B. mit 9


C++:
Feld[] = { 9  2  3  4  x  x  x  x  x  ..... }



oder 9 wird die erste Zahl der Folge und el = 5


C++:
Feld[] = { 9  1  2  3  4  x  x  x  x  ..... }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2014, 23:51 Uhr
ao

(Operator)


Gut. Im ersten Fall musst du einfach nur Feld[0] mit einem neuen Wert überschreiben.

Im zweiten Fall musst du zuerst alle bestehenden Elemente um einen Platz weiterrücken, von Feld[i] nach Feld[i+1], dabei beim letzten Element anfangen und rückwärts in Richtung Anfang arbeiten, sonst überschreibst du Daten. Wenn du damit fertig bist, Feld[0] neu setzen.

Abläufe wie diese hier sind für Anfänger nicht leicht zu überblicken, und dann macht man Indexfehler, läuft einen Schritt zu weit oder hört zu früh auf. Mach es dir zur Angewohnheit, Programmlogik im Einzelschrittverfahren im Debugger zu überprüfen. Oder, wenn du mit einer Umgebung arbeiten musst, die das nicht hergibt, dann bau zumindest Debug-Ausgaben ein und kontrollier damit den Ablauf.

Zum Beispiel könntest du in jedem Schleifendurchlauf das ganze Feld einmal ausgeben und so überwachen, wie sich das Programm verhält: Ob in jedem Durchlauf ein Wert verschoben wird, ob die Anzahl stimmt usw.

Mach dir bewusst, das "richtige" Programme um ein Vielfaches komplexer sind; wenn man die einfach nur losrasen lassen würde und schauen, was passiert, würde man mit der Fehlersuche nie fertig. Das Einkreisen von Fehlern durch gezieltes Untersuchen von Zuständen ist eine wichtige Technik dabei.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.01.2014, 15:07 Uhr
surge




Zitat von ao:
Gut. Im ersten Fall musst du einfach nur Feld[0] mit einem neuen Wert überschreiben.



Also so:

C++:
cout<<"Neue Startzahl?\n";
cin>>Feld[0];




Zitat von ao:

Im zweiten Fall musst du zuerst alle bestehenden Elemente um einen Platz weiterrücken, von Feld[i] nach Feld[i+1], dabei beim letzten Element anfangen und rückwärts in Richtung Anfang arbeiten, sonst überschreibst du Daten. Wenn du damit fertig bist, Feld[0] neu setzen.



Als erstes kam mir folgendes in den Sinn, funktioniert aber leider nicht:

C++:
    
for (i=el;i<=0;i--)
{
Feld[i]=Feld[i+1];
}
el++;
cout<<"Neue Startzahl?\n";
cin>>Feld[0];




Zitat von ao:

Abläufe wie diese hier sind für Anfänger nicht leicht zu überblicken, und dann macht man Indexfehler, läuft einen Schritt zu weit oder hört zu früh auf. Mach es dir zur Angewohnheit, Programmlogik im Einzelschrittverfahren im Debugger zu überprüfen. Oder, wenn du mit einer Umgebung arbeiten musst, die das nicht hergibt, dann bau zumindest Debug-Ausgaben ein und kontrollier damit den Ablauf.



Gerade mit Feldern habe ich es leider nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.01.2014, 16:40 Uhr
ao

(Operator)



Zitat von surge:
Als erstes kam mir folgendes in den Sinn, funktioniert aber leider nicht:

C++:
    
for (i=el;i<=0;i--)
{
Feld[i]=Feld[i+1];
}
el++;
cout<<"Neue Startzahl?\n";
cin>>Feld[0];






C++:
for (i=el;i<=0;i--)


i = el ist schon mal gut, das ist der Index von dem ersten x. Da soll ja die letzte Zahl hin.
i-- stimmt auch, damit du von hinten nach vorn übers Feld läufst.
Die Bedingung in der Mitte ist aber falsch. Die Schleife soll weiter ausgeführt werden, solange was gilt?

Und die Kopier-Anweisung (Feld[i]=Feld[i+1]; ) ist auch nicht richtig. Du fängst an mit i auf dem ersten x und willst die 4 (den Vorgänger) dorthin kopieren. Der Kopierbefehl lautet also wie?

Nur Mut, du schaffst das

---
Edit: Ein Leerzeichen in die Codeerklärung eingebaut, damit der Smilie dort verschwindet.

Dieser Post wurde am 22.01.2014 um 00:05 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: