2017-02-12 2 views
-2

Ich habe derzeit ein Problem mit der Erstellung eines Codes für ein Koordinatensystem. In der Übung, die ich mache, möchte ich ein Koordinatensystem mit einer Ordinate/Abszisse und einem definierten Buchstaben erstellen (zum Beispiel Punkt A) Ich muss Informationen für 25 Punkte setzen und es muss alle Punkte mit dem gleichen Buchstaben kontrollieren. Sie sollten in einem Kreis mit einem (0; 0) -Koordinatenanfang liegen. Wenn die Information, die über die 25 Punkte gegeben wird, die eingestellte Bedingung nicht erfüllt, müssen die ausgewählten Punkte erneut eingegebene Informationen haben, um die Bedingung zu erfüllen, ohne die gegebenen Werte der vorherigen Punkte zu ändern (welche die Erwartungen erfüllen). Es sollte auch alle Informationen für Punkte haben, die 2 positive Koordinaten haben Hier ist der Code, den ich gemacht habe. Ich wäre wirklich dankbar, wenn mir jemand helfen würde.Koordinatensystem mit einer Ordinate und Abszisse

#include <iostream> 
#include <cmath> 
#include <stdio.h> 

using namespace std; 

int main(){ 
    int dotX[23];//tri masiva 
    int dotY[23]; 
    char dotName[23]; 
    for (int i = 0; i<23; i++){// Cikal za vavejdane na masivite 
     cout << "Abscisa \t" << i + 1 << endl; 
     cin >> dotX[i]; 
     cout << "Ordinata \t" << i + 1 << endl; 
     cin >> dotY[i]; 
     cout << "Ime na tochkata" << endl; 
     cin >> dotName[i]; 

     if (i >= 1){//IF operatora i cikula za obhozhdane na masiva i presmqtane na distanciite 
      bool flag = true; 
      while (flag){ 
       double distance = sqrt(pow(dotY[i] - dotY[i - 1], 2) + pow(dotX[i] - dotX[i - 1], 2));//Formula za presmqtane na razstoqniqta 
       if (distance <= 6) { 
        char broi; 
        broi = broi++; 
        cout << "abscisa \t" << i + 1 << endl; 
        cin >> dotX[i]; 
        cout << "ordinata \t" << i + 1 << endl; 
        cin >> dotY[i]; 
       } 
       else{ 
        flag = false; 
       } 
      } 
     } 
    } 
    float i; 
    for (float i = 0; i > 10, i++;){ 
     float(dotX < 10); 
     cout << dotName[i] << endl; 
    } 
} 
+1

Willkommen Überlauf zu stapeln. Bitte nehmen Sie sich die Zeit, [The Tour] (http://stackoverflow.com/tour) zu lesen und beziehen Sie sich auf das Material aus der [Hilfe] (http://stackoverflow.com/help/asking), was und wie Sie können fragen Sie hier. –

+0

@ πάνταῥεῖ Ich habe tatsächlich versucht, nach etwas ähnlichem zu graben, damit ich mir helfen kann, aber leider konnte ich es nicht finden. Ich habe die Hilfe durchsucht, bevor ich sie gepostet habe, aber ich habe keine Informationen zu meinem Problem mit dem Koordinatensystem gefunden, sondern nur, wie man ein solches erstellt. :/ –

+0

Sie sollten lesen, wie Sie eine gute Frage stellen und auf welche Weise Sie verbessert werden können. Danach [bearbeiten] Sie Ihre Frage, um es besser zu machen. –

Antwort

0

Es gibt ein paar große Probleme mit Ihrem Code.

Zuerst ist die Syntax for (float i = 0; i > 10, i++;) völlig falsch. Es kompiliert, aber das ist nur ein Zufall. Der andere Befehl in der for-Schleifen-Kontrollstruktur sollte durch Semikolons getrennt sein (;), nicht Kommas (,). Der korrekte Code wäre dann for (float i = 0; i > 10; i++). Übrigens, Sie haben einen Tippfehler gemacht, ich glaube, Sie meinten for (float i = 0; i < 10; i++) (sonst läuft die for-Schleife nie, da i auf 0 initialisiert wird und 0 > 10 von Anfang an falsch ist).

Zweitens initialisieren Sie die Variable i zweimal: einmal mit float i; und einmal in der for-Schleife. Das sollte nicht kompiliert werden, obwohl dies bei einigen Compilern der Fall ist. Es gibt zwei Möglichkeiten, wie Sie vorgehen. Die erste Option ist die Variable außerhalb der for-Schleife zu erklären und es nur zuweisen, ohne sie in der for-Schleife zu initialisieren:

float i; 
for(i = 0; i < 10; i++){ 
    //some stuff 
} 

Die zweite Option ist es einfach für Schleife in die erklären, wie Sie in der ersten tat Schleife:

for(float i = 0; i < 10; i++){ 
    //some stuff 
} 

ein weiterer Fehler, den Sie i als float zu erklären gemacht ist, und versuchen Sie dann, den Zugang dotName[i]. Was auch immer Sie in die Klammern setzen, muss vom Typ int oder etwas ähnlichem sein (unsigned int, long, usw.). Setzen Sie eine float Variable in diese Klammern wird nicht einfach so kompiliert. Wenn Sie ein Array mit einem float indizieren möchten, müssen Sie dem Compiler mitteilen, dass Sie es wie folgt in ein int konvertieren möchten: dotName[(int)i] oder dotName[int(i)]. Dies wird als Besetzung bezeichnet. In Ihrem Fall würde ich jedoch empfehlen, i als int zu deklarieren.

Auch ist float(dotX < 10); völlig falsch, ich verstehe nicht wirklich, was Sie dort zu tun versuchen. Ich denke, Sie wollten float(dotX[i] < 10); tun, aber das macht immer noch keinen Sinn. Was Sie dort tun würden, würde eine bool in eine float konvertieren und dann nichts mit dem Ergebnis tun. Das kompiliert und ist nicht falsch, aber ist völlig nutzlos. Wie gesagt, ich verstehe nicht, was Sie dort machen wollen.

Auch broi = broi++; ist korrekt, aber nutzlos. broi++; ist genug. Der Operator ++ inkrementiert broi um eins und gibt dann das Ergebnis zurück.Was die ++ Betreiber intern tut, ist im Grunde diese:

int operator++(int &x){ 
    x = x + 1; 
    return x; 
} 

So erhöht es bereits die Variable automatisch, ohne dass Sie etwas zu tun. Was Sie getan haben, ist das gleiche wie dies zu tun:

broi = broi + 1; 
broi = broi; 

Hier stellt die erste Zeile den ++ Operator und die zweite Linie stellt den = Operator. Es ist klar, dass die zweite Zeile nutzlos ist, also kannst du sie einfach entfernen. Auf die gleiche Weise können Sie in Ihrem Code broi = entfernen und einfach broi++; verlassen.

Sie haben auch ein paar Dinge, die nicht empfohlen werden, aber funktionieren gut, da der C++ - Standard sie unterstützt.

Zuallererst ist using namespace std; schlechte Praxis. Es wird empfohlen, es wegzulassen und std:: vor cin, cout und endl hinzuzufügen. Wenn Sie wissen wollen, warum using namespace std; schlechte Praxis ist, ist es gut erklärt . Allerdings muss ich zugeben, dass ich persönlich immer noch using namespace std; benutze, da ich denke, dass es einfacher ist.

Zweitens, die main Funktion soll 0 zurückgeben, so wird empfohlen, return 0; am Ende der main Funktion hinzuzufügen. Der Rückgabewert der main-Funktion sagt aus, was das Programm geschlossen hat. Der Wert 0 bedeutet, dass das Programm geschlossen wurde, als es sollte. Alle anderen Werte bedeuten, dass das Programm abgestürzt ist. Eine vollständige Liste dessen, was jeder Rückgabewert bedeutet, ist verfügbar here. Beachten Sie, dass C++ das Auslassen von return 0; unterstützt und die meisten Compiler fügen es automatisch hinzu, wenn es weggelassen wird, aber es wird trotzdem empfohlen, es zu haben. Außerdem unterstützt C nicht das Auslassen von return 0; und in C wird es zurückgeben, was auch immer passiert, so dass es so aussah, als wäre das Programm abgestürzt, als es normal beendet wurde.

Auch #include <stdio.h> ist C und obwohl es in C++ funktioniert, wird es nicht empfohlen. In C++ ist es besser, #include <cstdio> zu verwenden. Alle Standardbibliotheken, die mit .h in C enden, können in C++ verwendet werden, indem .h entfernt und am Anfang ein c hinzugefügt wird. Das ist auch der Fall mit cmath: in C wäre es #include <math.h> und in C++ ist es #include <cmath>.

wäre eine gute Version Ihres Codes daher:

#include <iostream> 
#include <cmath> 
#include <cstdio> 

int main(){ 
    int dotX[23]; //tri masiva 
    int dotY[23]; 
    char dotName[23]; 
    for (int i = 0; i < 23; i++){ // Cikal za vavejdane na masivite 
     std::cout << "Abscisa \t" << i + 1 << std::endl; 
     std::cin >> dotX[i]; 
     std::cout << "Ordinata \t" << i + 1 << std::endl; 
     std::cin >> dotY[i]; 
     std::cout << "Ime na tochkata" << std::endl; 
     std::cin >> dotName[i]; 

     if (i >= 1){ //IF operatora i cikula za obhozhdane na masiva i presmqtane na distanciite 
      bool flag = true; 
      while (flag){ 
       double distance = sqrt(pow(dotY[i] - dotY[i - 1], 2) + pow(dotX[i] - dotX[i - 1], 2)); //Formula za presmqtane na razstoqniqta 
       if (distance <= 6) { 
        char broi; 
        broi++; 
        std::cout << "abscisa \t" << i + 1 << std::endl; 
        std::cin >> dotX[i]; 
        std::cout << "ordinata \t" << i + 1 << std::endl; 
        std::cin >> dotY[i]; 
       } 
       else{ 
        flag = false; 
       } 
      } 
     } 
    } 
    for (int i = 0; i < 10; i++){ 
     float(dotX[i] < 10); //Note that I don't understand what you're trying to do here, so I just changed it to something that compiles 
     std::cout << dotName[i] << std::endl; 
    } 
} 
Verwandte Themen