我目前在为Coordinate系统制作代码时遇到问题。 在我正在进行的练习中,我想创建一个带有纵坐标/横坐标和定义字母的坐标系(例如点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;
}
}
答案 0 :(得分:0)
您的代码存在一些大问题。
首先,语法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 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;
是不好的做法,那就很好地解释here。但是,我必须承认我个人仍然使用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>
会更好。所有在C中以.h
结尾的标准库都可以在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;
}
}