带有纵坐标和横坐标的坐标系

Coordinate system with an Ordinate and Abscissa

本文关键字:坐标系 横坐标 纵坐标      更新时间:2023-10-16

我目前在为坐标系编写代码时遇到问题。 在我正在做的练习中,我想创建一个带有纵坐标/横坐标和定义字母的坐标系(例如点 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;
}
}

你的代码有几个大问题。

首先,语法for (float i = 0; i > 10, i++;)是完全错误的。它编译了,但这只是一个巧合。for 循环控制结构中的不同命令应用分号 (;分隔),而不是逗号 (,)。然后,正确的代码将是for (float i = 0; i > 10; i++).顺便说一句,你打错了一个错字,我想你的意思是for (float i = 0; i < 10; i++)(否则 for 循环永远不会运行,因为i初始化为 0 并且从一开始就0 > 10是假的)。

其次,您将变量初始化i两次:一次使用float i;,一次在 for 循环中。这不应该编译,尽管对于某些编译器,它确实可以编译。关于如何做,有两种选择。第一个选项是在 for 循环之外声明变量,然后只分配它而不在 for 循环中初始化它:

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

第二个选项是简单地在 for 循环中声明它,就像在第一个循环中所做的那样:

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

您犯的另一个错误是将i声明为float,然后尝试访问dotName[i]。你放在括号里的任何内容都必须是int型或类似的东西(unsigned intlong等)。将float变量放在这些括号中不会像那样编译。如果要使用float索引数组,则需要告诉编译器要将其转换为如下所示的intdotName[(int)i]dotName[int(i)]。这称为强制转换。但是,在您的情况下,我建议您仅将i声明为int

另外,float(dotX < 10);完全错了,我真的不明白你想在那里做什么。我想你的意思是做float(dotX[i] < 10);,但这仍然没有任何意义。你要做的是将bool转换为float,然后对结果不做任何事情。编译并且没有错,但完全没用。正如我所说,我不明白你想在那里做什么。

此外,broi = broi++;是正确的,但毫无用处。broi++;就够了。++运算符自行将broi递增 1,然后返回结果。++运算符在内部所做的基本上是这样的:

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

因此,它已经自动递增变量,而无需您执行任何操作。您所做的与执行此操作相同:

broi = broi + 1;
broi = broi;

在这里,第一行表示++运算符,第二行表示=运算符。很明显,第二行是无用的,所以你可以删除它。同样,在您的代码中,您可以 删除broi =,只留下broi++;.

您还做了一些不推荐的事情,但由于C++标准支持它们,因此工作正常。

首先,using namespace std;是不好的做法。建议省略它,并在cincoutendl前面添加std::。如果你想知道为什么using namespace std;是不好的做法,这里解释得很好。但是,我必须承认,我个人仍然使用using namespace std;,因为我认为它更简单。

其次,main函数应该返回 0,因此建议在main函数的末尾添加return 0;main函数的返回值告诉是什么使程序关闭。值 0 表示程序在应该关闭时关闭。任何其他值都表示程序崩溃。此处提供了每个返回值含义的完整列表。请注意,C++ 支持省略return 0;,如果省略它,大多数编译器会自动添加它,但仍建议使用它。此外,C 不支持省略return 0;在 C 中它将返回内存中发生的任何内容,使程序在正常结束时看起来像崩溃。

此外,#include <stdio.h>是 C,虽然它可以在 C++ 中使用,但不建议这样做。在C++中,最好使用#include <cstdio>.所有以 C.h结尾的标准库都可以在 C++ 中使用,方法是删除.h并在开头添加ccmath也是如此:在 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;
}
}