让我介绍一下我是如何解决这个问题的......好吧,我知道一点FORTRAN,现在我正在学习C ++。 当我读到开头时,我(重新)创建了一个我用FORTRAN编写的旧程序。 它做了封闭多边形地形测量的计算部分。
好吧,我正在阅读“编程:使用C ++的原理和实践”一书,它说在C ++中,我们更愿意让每个函数做最少的事情。现在,我有类似的东西(我忽略了所有其他功能):
int main(){
//Starting the program and reading all variables
try
{
//Program beginning
cout << "Hello. Welcome to the 'Topography Program'\n\n\n";
//Reading all the information needed
reading_is_fundamental();
//Testing the angular tolerance
ang_tolerance_test (number_of_points); } ...there's more subroutines' calls
catch (runtime_error& e)
{
cerr << "error:" << e.what()<<'\n';
return 1;
}
return 0;}
“reading_is_fundamental()”是子程序的调用。在那里,我阅读了所需的所有信息。我的问题在于第二个子程序“ang_tolerance_test(number_of_points)”。
在FORTRAN中,我滥用了太多的全局变量,现在,在本书中,我们必须避免使用全局变量。
故事结束,我有两个问题:
1 - 这个逻辑是正确的还是我误解了这本书?我应该在main函数中进行一些计算(或者至少读取输入变量,因为它们将出现在所有子例程中),还是应该只用它来调用我的子例程?
2 - 如果这是我们在C ++中应该做的事情(在一个函数中分离每个动作),有人可以解释我如何获取在第一个子例程中写入并发送给其他子例程的变量,如“ ang_tolerance_test“一个?
非常感谢提前!
修改
函数“reading_is_fundamental()”是我通过键盘读取所有值的地方。我知道如何通过FORTRAN中的文本文件读取值,在这种情况下,它是一个很大的优势,因为有很多数字需要读取。但是,我还不知道如何在C ++中这样做,所以,请忽略我用键盘读了很多变量,我正在研究它!实际上,我读取变量的方式并不重要,关键在于我想要那些双打,int和其他soubroutines中的向量......
嗯,这是“reading_is_fundamental:
//This subroutine reads all the variables
void reading_is_fundamental (){
cout << "What is the linear tolerance?\n";
double lin_tolerance;
cin >> lin_tolerance;
cout << "\nHow many points did you study?\n";
int number_of_points;
cin >> number_of_points;
cout << "\nWhat's the distance between each point?\n";
vector <double> distances;
for (double dist; cin >> dist;)
distances.push_back(dist);
if (distances.size() != number_of_points) error ("The number of distances must be equal to the number of points");
cout << "\nWhat's each horizontal degree angle?\n";
vector <double> horizontal_degrees;
for (double horizontal_degree; cin >> horizontal_degree;)
horizontal_degrees.push_back(horizontal_degree);
if (horizontal_degrees.size() != number_of_points) error ("The number of angles must be equal to the number of points");
cout << "\nWhat's each horizontal minute angle?\n";
vector <double> horizontal_minutes;
for (double horizontal_minute; cin >> horizontal_minute;)
horizontal_minutes.push_back(horizontal_minute);
if (horizontal_minutes.size() != number_of_pointsint) ("The number of angles must be equal to the number of points");
cout << "\nWhat's each horizontal second angle?\n";
vector <double> horizontal_seconds;
for (double horizontal_second; cin >> horizontal_second;)
horizontal_seconds.push_back(horizontal_second);
if (horizontal_seconds.size() != number_of_points) error ("The number of angles must be equal to the number of points");
cout << "\nWhat's the first azimuth degree?\n";
double first_az_degree;
cin >> first_az_degree;
cout << "\nWhat's the first azimuth minute?\n";
double first_az_minute;
cin >> first_az_minute;
cout << "\nWhat's the first azimuth second?\n";
double first_az_second;
cin >> first_az_second;
cin >> number_of_points;}
我写这篇文章时我不知道的一件事是,在这个函数中放入void是否正确。我的思维方式是,我不想要一个回归,但有些变量已归档。
第二个功能是“ang_tolerance_test()”。它还没有准备好,所以,我不会在这里复制。问题是当我在main()中调用这个函数时,我想把它的参数放在从“reading_is_fundamental()”发送的一个值(即“number_of_points”)。
我希望这能使我的问题更清楚。
答案 0 :(得分:0)
尝试从reading_is_fundamental
函数返回值,您可以将其传递给其他函数,如:
int number_of_points = reading_is_fundamental();
//Testing the angular tolerance
ang_tolerance_test (number_of_points);
定义如下函数:
int reading_is_fundamental() {
....
return number;
}
定义一个类:
class Record
{
private:
double lin_tolerance;
int number_of_points;
public:
int getNumberOfPoints() { return number_of_points; }
void setNumberOfPoints(int v) { number_of_points = v; }
double getLinTolerance() { return lin_tolerance; }
void setLinTolerancedouble v) { lin_tolerance = v; }
};
当你读取值时,创建一个Record实例,继续填充记录中的值,最后返回该值,以便将它传递给ang_tolerance_test。就像上面的int类似,现在你将从函数中获取Record对象。