2017-02-12 94 views
-2

У меня возникла проблема с созданием кода для системы координат. В упражнении, которое я делаю, я хочу создать систему координат с ординатой/абсциссой и определенной буквой (например, точкой A) Я должен поместить информацию для 25 точек, и она должна управлять всеми точками с одинаковой буквой. Они должны быть в круге с началом координат (0; 0). Если информация о 25 точках не соответствует установленному условию, выбранные точки должны иметь новую повторно введенную информацию для соответствия условию без изменения заданных значений предыдущих точек (которые соответствуют ожиданиям). Он также должен иметь всю информацию для точек, которые имеют 2 положительных координаты вот код, который я сделал. Я был бы очень благодарен, если бы кто-то помог мне.Система координат с ординатой и абсциссой

#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

Добро пожаловать на Stack Overflow. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

@ πάνταῥεῖ Я действительно пытался копать что-то подобное, поэтому я могу помочь себе, но, к сожалению, я не смог его найти. Прежде чем отправлять его, я искал справочный центр, но я не нашел никакой информации о моей проблеме с системой координат - только как ее создать. :/ –

+0

Вы должны прочитать, как задать хороший вопрос и каким образом ваши улучшения могут быть улучшены. После этого отредактируйте свой вопрос, чтобы сделать его лучше. –

ответ

0

Есть несколько больших проблем с вашим кодом.

Прежде всего, синтаксис for (float i = 0; i > 10, i++;) полностью ошибочен. Он компилируется, но это просто совпадение. Другая команда в структуре управления циклом цикла должна быть разделена точкой с запятой (;), а не запятыми (,). Тогда правильный код будет for (float i = 0; i > 10; i++). Кстати, вы сделали опечатку, я думаю, что вы имели в виду for (float i = 0; i < 10; i++) (иначе цикл for никогда не запускается, так как i инициализируется до 0, а 0 > 10 является ложным с самого начала).

Во-вторых, вы инициализируете переменную i дважды: один раз с float i; и один раз в цикле for. Это не должно компилироваться, хотя с некоторыми компиляторами это происходит. Есть два варианта, как это сделать. Первый вариант заключается в объявлении переменной вне для цикла и просто назначить его без его инициализации в течение цикла:

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

второй вариант просто объявить его в цикл, как вы делали в первом цикл:

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

Еще одна ошибка, которую вы сделали, чтобы объявить i как float, а затем попытаться получить доступ dotName[i]. Все, что вы положили внутри скобок, должно быть типа int или что-то подобное (unsigned int, long и т. Д.). Вставка переменной float внутри этих скобок не будет компилироваться именно так. Если вы хотите индексировать массив с помощью float, вам нужно сообщить компилятору, что вы хотите преобразовать его в int следующим образом: dotName[(int)i] или dotName[int(i)]. Это называется литой. Однако в вашем случае я бы рекомендовал просто объявить i как int.

Также, float(dotX < 10); совершенно неправ, я действительно не понимаю, что вы пытаетесь сделать там. Я думаю, вы хотели сделать float(dotX[i] < 10);, но это все равно не имеет никакого смысла. То, что вы делаете там, будет преобразовывать bool в float и затем ничего не делать с результатом. Это компилируется и не ошибается, но совершенно бесполезно. Как я уже сказал, я не понимаю, что вы хотите там сделать.

Также, broi = broi++; является правильным, но бесполезным. broi++; достаточно. Оператор ++ увеличивает один за другим broi, а затем возвращает результат.Что оператор ++ делает внутренне основном это:

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

Так это уже автоматически увеличивает переменную без необходимости делать что-либо. То, что вы сделали это так же, как это сделать:

broi = broi + 1; 
broi = broi; 

Здесь первая строка представляет собой оператор ++ и вторая строка представляет собой оператор =. Понятно, что вторая строка бесполезна, поэтому вы можете просто удалить ее. Точно так же в вашем коде вы можете удалить broi =, оставив просто broi++;.

Вы также сделали несколько вещей, которые не рекомендуется, но отлично работают, поскольку стандарт C++ поддерживает их.

Прежде всего, using namespace std; - плохая практика. Рекомендуется опустить его и добавить std:: перед cin, cout и endl. Если вы хотите знать, почему using namespace std; - это плохая практика, это хорошо объяснено. . Тем не менее, я должен признать, что я лично все еще использую using namespace std;, так как я думаю, что это проще.

Во-вторых, функция main должна возвращать 0, поэтому рекомендуется добавить return 0; в конце функции main. Возвращаемое значение функции main сообщает, что запустило программу. Значение 0 означает, что программа закрыта, когда предполагалось. Любые другие значения означают, что программа разбилась. Полный список значений каждого возвращаемого значения доступен here. Обратите внимание, что C++ поддерживает исключение return 0;, и большинство компиляторов добавляет его автоматически, если оно опущено, но по-прежнему рекомендуется его использовать. Кроме того, C не поддерживает опускание return 0;, а в C он вернет все, что происходит в памяти, что делает его похожим на то, что программа потерпела крах, когда она закончилась нормально.

Кроме того, #include <stdio.h> является C, и хотя он работает на C++, это не рекомендуется. В C++ лучше использовать #include <cstdio>. Все стандартные библиотеки, которые заканчиваются .h в C, могут быть использованы в C++ путем удаления .h и добавления c в начале. Это также относится к cmath: в C это будет #include <math.h>, а в C++ - #include <cmath>.

Хороший вариант кода будет поэтому быть:

#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; 
    } 
}