2016-09-27 29 views
-4

私は入力ファイルの値を扱うプログラムを作成しています。私の変数には合計、税額、小計などが含まれています。&は既に宣言され、初期化されていますが、「初期化されていないローカル変数 '小計'が使用されました」という変数と「taxtotal」変数に2つのエラーメッセージがあります。 ソースコード:初期化されていないローカル変数が実際に初期化されていますか?

#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でtotalを初期化

double price, taxtotal, subtotal, total = 0; 

だけ

+3

_ "すでに宣言され、初期化されています" _これらの変数は初期化されていません。 –

+1

試してみてC++を習得しようとしないでください。代わりに良い本から系統的に学ぶ。 –

+1

私がC++をどのように学んでいるかを前提にしないでください。仮定はどこにもありません。私は実際にクラスを取って、良い本を参照して、2人のメンターを持っています。ありがとう、結構です。 –

答えて

4

は、それはあなたここにあなたの文でsubtotalを宣言したように見えます

subtotal = subtotal + price; 

複数の項目を初期化するには、「=」を明示的に追加するだけです。 例:この宣言において

double price = 0, taxtotal = 0, subtotal = 0, total = 0; 
+0

それは動作します!私は実際にその点を試してみましたが、適切な結果を得るために私が得た別のエラーがありました。 C++にはまだまだ新しいので、トラブルシューティングを手伝ってくれてありがとう! :) –

6

double price, taxtotal, subtotal, total = 0; 

型名doubleは、すべて4つの変数に適用されるが、= 0初期化のみtotalに適用されます。 (0を使用すると、完全に有効であることを

double price = 0.0; 
double taxtotal = 0.0; 
double subtotal = 0.0; 
double total = 0.0; 

注:

double price = 0, taxtotal= 0, subtotal = 0, total = 0; 

が、それは独自の行に各変数を宣言するためのより良いスタイルだ:他の人が言ったように

、最も直接的な修正がありますintの値は暗黙的にdoubleの値0.0に変換されますが、浮動小数点定数を使用する方がより明示的です。

(私は縦に初期化子を揃えることにしました。いくつかはそれをしないほうがよい場合もあります。)

を、私はあなたがまだポインタをもらっていない推測しています。そうすると、各変数をそれぞれの行に宣言する別の理由があります。これ:

int* x, y, z; 
int*

が、しかしintとしてyzとしてx定義。 1行につき1つの宣言を使用して、上記初期化子と同様に、エラーと混乱のためにこの機会を回避:

int* x; 
int* y; 
int* z; 

あなたのコードをコンパイルするために取得したら、あなたはこの回線に問題があるでしょう:

name, price, isTaxed = 0; 

これは有効なステートメントですが、それはあなたが思うものではありません。

,は、カンマオペレータです。それは左と右のオペランドを順に評価し、左のオペランドの値を破棄して右のオペランドの値を生成します。この文は現在の値nameを評価して破棄し、次に現在の値priceを評価して破棄し、値0isTaxedに割り当てます。 (これを指摘するためにuser4581301に感謝します。)

あなたがこれを書くことができます:

// name = 0; 
price = 0.0 
isTaxed = false; 
:として、より簡単に、(割り当てが割り当てられた値を生成するため)または

name = price = isTaxed = 0; 

私はnameへの割り当てをコメントアウトしました。これは配列なので配列オブジェクトに値を代入することはできません。私はあなたがここで何をしようとしているのか分からないので、修正版を表示しません。

提案:小さなコードを始めて単純なままにしておき、新しいコードを追加する前にコードであることを各ステップで確認してください。一度にあまりにも多くのコードを書こうとしたと思います。コンパイルされていない100行ほどのコードがあります。私はの時間が長くての時間をプログラミングしていました。コンパイルして実行することを確認せずにその多くのコードを書きませんでした。

関連する問題