所以我正在编写一个程序来处理输入文件中的值。我的变量包括总数,taxtotal,小计等。&它们已经被声明和初始化,但我收到两条错误消息:"未初始化的局部变量' subtotal'使用"对于变量" taxtotal"同样如此。 源代码:
#include "stdafx.h"
#include<stdio.h>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
ifstream shoppingBasketFile;
shoppingBasketFile.open("HW3_Data.txt");
bool isTaxed = false;
char taxValue = 0;
char inPrice[64];
char name[128];
double price, taxtotal, subtotal, total = 0;
if (shoppingBasketFile.is_open())
{
// display the header info:
cout << "o Thank you for shopping at StuffMart" << endl;
cout << setw(3) << left << "o "
<< setw(20) << left << "Item"
<< setw(12) << "Unit Price"
<< setw(4) << "Tax"
<< endl
<< "o -------------------------------------" << endl;
// parse the input file until end of file;
while (!shoppingBasketFile.eof())
{
// parse the item name:
shoppingBasketFile >> name;
cout << "Name = " << name << endl;
if (name == NULL)
{
// what should we really do here?
continue;
}
// parse the price:
shoppingBasketFile >> price;
if (price < 0 || price > 100000000000) {
continue;
}
cout << "Price = " << price << endl;
// parse the isTax flag:
shoppingBasketFile >> isTaxed;
shoppingBasketFile >> taxValue;
cout << "Is taxed? = " << taxValue << endl;
// if end of file break out of this loop:
if (!shoppingBasketFile.good()) break;
if (isTaxed == true) {
taxtotal = taxtotal + (.085 * price);
taxValue = 'Y';
}
else {
taxValue = 'N';
}
//display tax as Y instead of T/1
if (isTaxed == true) {
cout << "Tax: Y" << endl;
}
else {
cout << "Tax: N" << endl;
}
//compute the subtotals
subtotal = subtotal + price;
// display the item info:
cout << "name" << name << ", price: $" << price << ", is taxed: " << taxValue << endl;
// reset input values:
name, price, isTaxed = 0;
// end of while loop
}
//compute the final total:
total = subtotal + taxtotal;
//output the totals
cout << "o" << setw(37) << "---------------" << endl
<< "o " << setw(26) << "Subtotal $" << fixed << setprecision(2) << right << subtotal << endl
<< "o " << setw(26) << "Tax (8.5%) $" << fixed << setprecision(2) << right << taxtotal << endl
<< "o " << setw(26) << "Total $" << fixed << setprecision(2) << right << total << endl;
}
shoppingBasketFile.close();
return 0;
}
任何提示都将不胜感激!
答案 0 :(得分:7)
在此声明中:
double price, taxtotal, subtotal, total = 0;
类型名称double
适用于所有4个变量,但= 0
初始化仅适用于total
。
正如其他人所说,最直接的解决方法是:
double price = 0, taxtotal= 0, subtotal = 0, total = 0;
但是在每条线上声明每个变量的风格更好:
double price = 0.0;
double taxtotal = 0.0;
double subtotal = 0.0;
double total = 0.0;
请注意,使用0
完全有效(int
值将隐式转换为double
值0.0
),但使用浮点常量更多明确的。
(我已选择垂直对齐初始化程序。有些人可能不愿意这样做。)
我猜你还没有指点。当你这样做时,你会遇到另一个在自己的行上声明每个变量的理由。这样:
int* x, y, z;
将x
定义为int*
,将y
和z
定义为int
。对于上面的初始化程序,每行使用一个声明可以避免错误和混淆的机会:
int* x;
int* y;
int* z;
一旦你的代码被编译,你就会遇到这个问题:
name, price, isTaxed = 0;
这是一份有效的陈述,但它并没有按照您的想法行事。
,
是逗号运算符。它按顺序计算其左右操作数,并产生右操作数的值,丢弃左操作数的值。该语句评估并丢弃name
的当前值,然后评估并丢弃price
的当前值,然后将值0
分配给isTaxed
。 (感谢user4581301指出这一点。)
您可以将其写为:
name = price = isTaxed = 0;
(因为赋值会产生已分配的值),或者更简单地说,为:
// name = 0;
price = 0.0
isTaxed = false;
我已将作业注释掉name
,因为它是一个数组而您无法为数组对象赋值。我没有显示更正版本,因为我不知道你在这里做了什么。
建议:从小处开始,保持简单,并在添加新代码之前在每一步确认您的代码正常工作。我想你曾经尝试过多写代码。你有近100行代码甚至无法编译。我已经为很长的时间编程了,我不会编写那么多代码而不确定它是否编译并运行。
答案 1 :(得分:4)
您的声明中似乎声明了 subtotal
:
double price, taxtotal, subtotal, total = 0;
但只有初始化 total
且值为0,导致在分配的右侧使用它来触发错误:
subtotal = subtotal + price;
要初始化多个项目,只需添加&#34; =&#34;明确。 示例:
double price = 0, taxtotal = 0, subtotal = 0, total = 0;