Hilfe bei eindimensionalen Feldern

Thaelisin

Mitglied
Hallo Leute,
ich hab ein paar Probleme mit einer meiner Vorbereitungsaufgaben, für eine Prüfung. Insgesamt bekamen wir 10 Aufgaben, die ersten vier konnte ich glücklicherweise, und mit Hilfe, lösen. Bei der fünften, bei der es sich um eindimensionale Felder dreht, bin ich aber etwas ratlos.
Ich verwende Visual Studio Community 2015.

Die Aufgabe habe ich mal als Bild hochgeladen:
aufgabe5.png


Bisher habe ich nicht sehr viel aber mal mein erster Ansatz. Unser Skript ist nicht unbedingt aufklärend.

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln = 0, i = 0;
    double n[1000];

    do
    {

        cout << "Bitte geben sie die Menge der zu pruefenden Zahlen ein: " << endl;
        cin >> n[i];

        anzahln = i;
    } while (n >= 2 || n <= 1000);

    cout << "Ihre Eingabe:" << n << endl;
}

Es wäre schön wenn ihr mich bei der Lösung mit Tipps und Hilfen unterstützt. Ein fertiges Programm, würde mir wahrscheinlich nicht sehr weiter helfen.

Danke schon mal und viele Grüße

Edit: Also im Moment ist mein erstes Problem, das die while-Schleife nicht richtig ist. bei >=2 || <= 1000 steht Operandentypen sind inkompatibel.
 
Zuletzt bearbeitet:

sheel

I love Asm
Hi

du scheinst da mit den Variablen etwas durcheinanderzukommen. n sind hier 1000 Kommazahlen. Für den derzeitigen Schritt brauchst du noch keine 1000 Zahlen. .... Zurzeit liest du (derzeit) die Anzahl der gewünschten Zahlen in die erste Kommazahl ein, und vergleichst dann alle 1000 Zahlen ob sie >=2 usw. sind (zumindest schaut es so aus; der Fehler ist dass man nicht einfach so 1000 Zahlen mit einer vergleichen kann).

Lösch am besten alle unnötigen Variablen einmal weg. Du willst eine Anzahl, hast eine Variable anzahln, und damit können i und n weg. Dann alles mit anzahln, und schon ists besser...

Ein weiteres, logisches Problem: Der Benutzer muss so lang Zahlen eingeben, solang die Zahl >= 2 oder <=1000 ist. Erstens ist jede reelle Zahl >=2 oder <=1000, und zweitens soll man die Eingabe wiederholen wenn es nicht in dem Bereich ist. Mit anderen Worten, wiederholen, wenn <2 oder >1000.

...

Wenn der Schritt passt kann man zum nächsten weiter gehen...
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Hi

Es wäre schön wenn ihr mich bei der Lösung mit Tipps und Hilfen unterstützt.
Ok.

1) Dein Ansatz ist schonmal nicht korrekt. Wenn du es laufen lassen würdest, wirst du feststellen, dass der Loop nie enden kann. n ist ein Array, kein Wert. Du kannst ihn nicht so überprüfen.
Du sollst als erste Eingabe anzahln einlesen, also muss zumindest etwas wie "std::cin >> anzahln;" vorkommen.
Du sollst du anzahln (nicht n!) auf Gültigkeit prüfen (also anzahln >= 2 && anzahln <= 1000).
Du brauchst 2 Arrays (für x und y), nicht nur einen.
Und dann kannst du als Loop (for(i = 0; i < anzahln; i++)) die einzelnen Werte mit "std::cin >> nx[i];" und dasselbe für y in derselben Loopiteration einlesen.

2) Die Formeln für A und B hast du ja schon gegeben, ich weiss nicht, was man da gross helfen kann. Ausser vielleicht: Da die Summenblöcke recht häufig vorkommen und die Multiplikation sowie die Addition Kommutativ und assoziativ sind, kannst du \sum_{i=0}^{n-1}(x_i) (und analog y_i) im Voraus berechnen und dann einfach einsetzen.

3) Als Tipp fürs Testen: Schreibe die Daten
Code:
5
1.0 -2.5
1.5 -1.0
2.0 -1.5
3.5 0.5
4.0 1.5
so in eine Textdatei.
Dann gehe in VS zu Projekt->Projekteigenschaften->Konfiguration->Debugging->CommandArguments und fülle "< dateiname" ein, wobei "dateiname" der volle Pfad der Datei ist, die du soeben erstellt hast.

Gruss
cwriter
 

Thaelisin

Mitglied
Ah vielen Dank euch beiden.
Was ich nicht verstehe ist, wie ich jetzt welche Felder anlegen muss. ich sitze jetzt seit 3 Tagen an dieser verfluchten Aufgabe.

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln;
  
    double nx, ny;

    cout << "Bitte geben sie die Menge der zu pruefenden Zahlen ein: " << endl;

    do
    {      
        cin >> anzahln;      
    }
    while (anzahln >= 2 && anzahln <= 1000);
  
    cout << "Ihre Eingabe:" << anzahln << endl;
}

So wie das Programm jetzt aussieht, macht er doch nichts anderes als eine Variable anzahln einzugeben und zu prüfen ob sie zwischen 2 und 1000 liegt. Ich benötige nx und ny um später die verschiedenen Werte für x und y darin abzulegen. Also muss ich aus nx und ny Felder machen? Und selbst wenn ich da richtig liege, wie wird aus anzahln die Menge der einzugebenen x und y Werte?
 

sheel

I love Asm
Die Schleifenbedingung ist noch immer nicht ganz richtig.
Zurzeit prüfst du, ob die eingegebene Zahl gültig ist. Und genau in dem Fall soll die Eingabe ja "nicht" wiederholt werden. Das, was in while() steht, ist aber, wann es wiederholt wird.
Daher entweder
C++:
while (!(anzahln >= 2 && anzahln <= 1000));
also das Gegenteil der gesamten Bedingung, oder
C++:
while (anzahln < 2 || anzahln > 1000);
was eigentlich das Selbe ist, nur anders hingeschrieben.

...

Dass nx und ny dann Felder (Arrays) sein sollten stimmt. Für 1000 Elemente eben zB. so:
C++:
double nx[1000], ny[1000];
Dass man statt einer fixen Anzahl den Wert von anzahln hernimmt ist (eigentlich) nicht ganz so einfach (statt 1000 einfach anzahln hinschreiben wird zwar in manchen Compilern erlaubt, ist aber nicht wirklich C++ ... man bräuchte zB. vector oder new/delete)

...aber: Das ist bei dir auch gar nicht nötig. Es sind bei dir maximal 1000 Zahlen erlaubt, nicht beliebige Anzahlen, also kannst du einfach 1000 nehmen ... wenn anzahln weniger als 1000 ist hast du eben ein paar double zu viel, ist nicht so schlimm (es braucht etwas mehr Speicher, aber es soll ja auch nur zum Üben sein...).

Jetzt kannst du dann, in einer Schleife mit int i von 0 bis <anzahln, die Zahlen nx[i] und ny[i] einlesen.

edit: Sorry cwriter, schon wieder schneller :p
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
So wie das Programm jetzt aussieht, macht er doch nichts anderes als eine Variable anzahln einzugeben und zu prüfen ob sie zwischen 2 und 1000 liegt. Ich benötige nx und ny um später die verschiedenen Werte für x und y darin abzulegen.
Das ist korrekt.

Also muss ich aus nx und ny Felder machen?
Ja, je 1000 Elemente gross.

Und selbst wenn ich da richtig liege, wie wird aus anzahln die Menge der einzugebenen x und y Werte?
Du brauchst die Anzahl, um zu wissen, welche Werte gültig sind (die ersten 10, 42, etc.)

Gruss
cwriter
 

sheel

I love Asm
...hier weiter:

Und wenn dann alle 1000 Zahlenpaare eingelesen sind:

Ich bin mir nicht sicher, was genau mit der aufsteigenden Reihenfolge gemeint ist. Soll das im Programm überprüft werden, oder bedeutet es dass man sich einfach drauf verlassen kann (dass der Benutzer das so macht)? ... Und für die Formelberechnung ist es sowieso egal ob das aufsteigend oder nicht ist.
 

Thaelisin

Mitglied
Vielen Dank!

Bisher bin ich soweit, allerdings funktionieren meine for-Schleifen nicht so wie ich mir das gedacht habe. Ich kann jeweils nur eine Zahl eingeben, sollte er es nicht wiederholen bis i < anzahln ist? Er macht es aber jeweils nur ein mal?

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln;
    int i = 0;
    double nx[1000], ny[1000];

    cout << "Bitte geben sie die Anzahl der x und y Werte ein: " << endl;

    do
    {
        cin >> anzahln;
       
    }while (!(anzahln >= 2 && anzahln <= 1000));
    anzahln = i;
        for (i = 0; i < anzahln; i++);
        {
            cout << "Geben sie die x werte ein: " << endl;
            cin >> nx[i];
        }
        for (i = 0; i < anzahln; i++);
        {
            cout << "Sie die y werte ein; " << endl;
            cin >> ny[i];
        }

   
}
 

cwriter

Erfahrenes Mitglied
sollte er es nicht wiederholen bis i < anzahln ist? Er macht es aber jeweils nur ein mal?
i ist hier immer 0. Du löschst also quasi direkt die Eingabe. Weg mit dieser Zeile.

Und deine Loops sind ein bisschen seltsam.
Normalerweise werden Punkte ja als (x1, y1), (x2, y2), ... und nicht als x1, x2, ..., y1, y2, ... angegeben.

Wenn das die Aufgabe so verlangt, geht das natürlich auch, aber warum liest du nicht in derselben Loopiteration beide Ordinaten ein?

Gruss
cwriter
 

Thaelisin

Mitglied
Hmm, aber selbst wenn ich anzahln=i entferne, passiert das gleiche.

Ach so, das stimmt natürlich. Meinst du so?

C++:
#include <iostream>
#include <cmath>

using namespace std;

void main(void)

{

    int anzahln;
    int i = 0;
    double nx[1000], ny[1000];

    cout << "Bitte geben sie die Anzahl der x und y Werte ein: " << endl;

    do
    {
        cin >> anzahln;
       
    }while (!(anzahln >= 2 && anzahln <= 1000));

        for (i = 0; i < anzahln; i++);
        {
            cout << "Geben sie die x Werte ein: " << endl;
            cin >> nx[i];
            cout << "Sie die y Werte ein; " << endl;
            cin >> ny[i];
        }

   
}