下面你将发现我创建用户定义函数的惨淡尝试。我正在尝试进行一项任务,计算安装各种形状的地毯的面积和成本。我也想要保持他们的总数。另外,赋值要求我使用已使用的已定义函数。现在它所做的就是接受1的输入并询问“边的长度:”。然后它循环回到选择菜单。它不会计算总量的总量。在创建用户定义的函数时我做错了什么?如何将其合并以保持运行总计直到它们退出?
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;
void square(double);
const double UNIT_PRICE = 2.59;
const double LABOR_COST = 32.5;
const double PIE = 3.14;
const double TAX = .0825;
int main() {
int selection;
int sqrSide = 0;
// declare and initialize the variables for the shape
int sqrTot = 0;
do {
// get input from user as to what they want to do
cout << "Carpet Area Shape" << endl;
cout << "1. Square" << endl;
cout << "2. Rectangle" << endl;
cout << "3. Circle" << endl;
cout << "4. Triangle" << endl;
cout << "5. Done" << endl;
cout << "Type a number to continue: ";
cin >> selection;
cout << endl;
// loop through the solutions based on the user's selection
switch (selection) {
case 1:
cout << "What is the length of the side: ";
cin >> sqrSide;
square(sqrSide);
if (sqrTot > 0) {
cout << "Shape: Square" << endl;
cout << "Side: " << sqrSide << endl;
cout << "Area: " << sqrTot << endl;
}
cout << endl;
system("pause");
break;
case 2:
case 3:
case 4:
case 5: // exit
system("cls");
break;
default:
"You have made an invalid selection. Please choose a number from the "
"list.";
cout << endl;
}
// loop through if the user is still making a valid selection
} while (selection != 5);
system("pause");
return 0;
}
void square(double) {
double sqrSide = 0;
double sqrTot = 0;
double sqrArea;
sqrArea = sqrSide * 4;
// get the total area and store it as a variable
sqrTot += sqrArea;
if (sqrTot > 0) {
cout << "Shape: Square" << endl;
cout << "Side: " << sqrSide << endl;
cout << "Area: " << sqrTot << endl;
}
}
答案 0 :(得分:2)
当你声明函数的原型时,你可以省略参数,但在实现中你必须放置它。
变化:
void square(double)
{
double sqrSide = 0;
double sqrTot = 0;
double sqrArea;
sqrArea = sqrSide * 4;
//get the total area and store it as a variable
sqrTot += sqrArea;
if (sqrTot > 0) {
cout << "Shape: Square" << endl;
cout << "Side: " << sqrSide << endl;
cout << "Area: " << sqrTot << endl;
}
}
为:
void square(double sqrSide)
{
double sqrTot = 0;
double sqrArea;
sqrArea = sqrSide * 4;
//get the total area and store it as a variable
sqrTot += sqrArea;
if (sqrTot > 0) {
cout << "Shape: Square" << endl;
cout << "Side: " << sqrSide << endl;
cout << "Area: " << sqrTot << endl;
}
}
也改变了:
case 1:
cout << "What is the length of the side: ";
cin >> sqrSide;
square(sqrSide);
if (sqrTot > 0) {
cout << "Shape: Square" << endl;
cout << "Side: " << sqrSide << endl;
cout << "Area: " << sqrTot << endl;
}
cout << endl;
system("pause");
break;
为:
case 1:
cout << "What is the length of the side: ";
cin >> sqrSide;
square(sqrSide);
system("pause");
break;
答案 1 :(得分:1)
正如πάνταῥεῖ在评论中所提到的,似乎你对变量范围,参数和返回值有一些误解。让我们看看我们是否能够消除其中的一些。
首先,我们来谈谈范围。当我们在用{
和}
分隔的块中声明变量时,该变量仅存在于该块内。块后面的代码无法访问变量。
所以,这没关系:
int a = 3;
int b = 2;
int c = a*b;
但是,这不是,因为a和b的值不再可用:
{
int a = 3;
int b = 2;
}
int c = a*b;
接下来,我们来谈谈参数。这些是函数将用于完成其任务的函数的输入。虽然他们的名字是无关紧要的,而且基本上没有意义,但它肯定会帮助你和你的其他人给他们有意义的名字。一些编程语言,实际上某些学科的学生不遵循这个格言,并且可以生成比它需要的更难以遵循的代码。在20岁的德州仪器计算器和物理学家中发现Basic的实现,我正在看你!
考虑以下功能,(为简洁起见,我已将其身体省略):
double calcArea(double a)
{
...
}
double calcArea(double b)
{
...
}
他们都很糟糕。什么是a
代表什么,b
怎么样?
更好的一对可能类似于:
double calcArea(double radius)
{
...
}
double calcArea(double sideLenOfSquare)
{
...
}
最后,让我们谈谈返回值。在前面4个函数中的每一个函数中,声明都以double
开头。这意味着我们可以期望从函数中获取double类型的值。然而,这只是编码 - 没有魔法,因此,我们需要让编译器知道这个值是什么。扩展前两个函数,我们可能会得到以下内容:
double calcArea(double radius)
{
return 3.1415926535 * (radius * radius);
}
double calcArea(double sideLenOfSquare)
{
return sideLenOfSquare * sideLenOfSquare;
}
现在事实证明 - 即使是这两个简单的功能也不是他们所能完成的所有功能。也就是说,第一个函数使用常量 - π(Pi或3.141 ....)math.h
头文件中已经存在(并且远比我使用的更精确) 。如果包含此文件,则我们可以访问#define
d常量M_PI
。
接下来,这两个函数具有相同的名称,并采用相同类型的相同数量的参数。编译器不可能知道您要调用哪一个。至少,他们应该有不同的名字。也许类似于calcCircleArea
和calcSquareArea
。现在,编译器知道你所指的是哪个函数,并且很乐意编译这部分代码。错误可能存在于其他地方,但这些是另一回事。
对function overloading
的一点研究将提供可以解释问题的资源和具有相同名称的函数的解决方案远比我能够并且倾向于尝试的更好。 :)