2014-01-15 4 views
-1

안녕하세요. 저는 간단한 임금 응용 프로그램을 작성 중입니다. 다음 코드는 switch 문을 사용하는 두 개의 옵션 메뉴를 포함합니다. 이 코드는 "shop-account"라는 텍스트 파일에도 연결됩니다. 파일에는 단순히 값 100이 포함됩니다.함수를 사용하여 파일에서 읽고 쓰는 중

옵션 1의 경우 사용자는 파일에서 금액을 전송할 수 있다고 가정합니다. 사용자는 계정을 과도하게 사용하지 않고 원하는만큼 많은 이전을 할 수 있어야합니다. 그리고 코드는 현재 잔액을 출력 할 수 있어야합니다. 나는 void 함수를 사용하고 있다고 생각하지만, 전에는 사용하지 않았고 정말 고심하고 있습니다. 나는 누군가가 코드를보고 내가 어디로 잘못 가고 있는지를 알기를 바랬다. 감사합니다

int read_balance (void); 
void write_balance (int balance); 

using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 

    int selection; 
    int total; 
    int balance; 
    int NewAmount; 

    do { 
      cout << "1. Transfer an amount" <<endl; 
      cout << "2. Quit" << endl; 
      cout << "Please enter menu number"<<endl; 
      cin >> selection; 

      switch(selection) 
      { 
       case 1: 
        cout << "You have choosen to transfer an amount" << endl; 
        cout << "How much do you wish to transfer from the shop account?"<<endl; 
        cin >> NewAmount; 
        balance -= NewAmount; 
        write_balance (balance); 
        cout << balance << endl; 
        break; 

       case 2: 
       return 0; 
       break; 

       default: 
       cout << "Ooops, invalid selection!" << endl; 
       break; 
       } 

     }while(selection != 2); 

    system("pause"); 
    return 0; 
} 


int read_balance (void) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 
    f >> balance; //error: "balance" is unidentified 
    f.close(); 
    return balance; 
} 


void write_balance (int balance) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 
    f << balance; 
    f.close(); 
} 
+0

내가 코드를보고 잘못 생각한 부분을 알려주기를 바랍니다. 덕분에 –

+0

도 도움이 찾고있는 유일한 조각은 실제로 파일에서 금액을 전송하는 방법입니다, 내가 이것을 이해하고 나면 나머지를 직접 시도하고 나머지를 할 것입니다. – user3057816

+2

들여 쓰기가 누락되어 있으며 사실이 아닙니다. 컴파일 할 수있는 예제 계정이 "어디로 잘못 가고 있습니까?" - 당신의'read_balance'에서,'balance'는 어디에 있습니까? 아니. 함수에'int balance;'를 추가하십시오. – ShinTakezou

답변

1

귀하의 기능에 균형이 잡혀 있지 않습니다! 당신은 다른 사람이 언급 한 것처럼

int read_balance(void) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 

    int balance; 
    f >> balance; //now it's defined 
    f.close(); 
    return balance; 
} 
+0

이것은 문제의 절반 만 답변합니다. OP가 프로그램을 원한다고 가정하면 ... _makes sense_ – sehe

+1

일부 스트림 오류 검사가 좋을 것입니다. – zoska

+4

@zoska : 이것이 너무 많이 생각하지 않습니까? –

3
  1. , 당신이 (이 경우, 기능 수준 범위) 권리 범위에 int balance를 선언하지 않은 함수에 균형 선언을 추가해야합니다. 당신이 alltogether read_balance 전화를 잊고, 그래서 balance에 당신의 계산 Undefined Behaviour불확정 값을 예전처럼

    는 사실, 그것은 보인다.

  2. 다음 코드는 하위 요소로 코드 조각을 추출하려고 할 때이 모든 상황을 방지하고 변수가 사용되는 곳을보다 쉽게 ​​파악할 수있게 변수를 선언합니다. 결과적으로 코드가 올바른지 쉽게 알 수 있습니다.

  3. 다음 : 오류 처리. 아무 것도 없으면 프로그램은 쓸모가 없습니다. 사실, 위의 문제를 해결하는 경우에도,

    • 는 단순히 루프를 실행하고 바로 계정 잔액 에서 불확정 값을 substracting 유지하는 것 한 번 잘못된 입력을 입력하고 디스크에 그 값이 잘못 작성. 아마 당신이 원하는 것이 아닙니다. 만드는

    • shop-account.txt 읽기 전용 (결코 그것을 확인 이후) 파일의 균형 잘못된 생각을 갖는 파일

    • 를 업데이트하지 않고

      • 전송을 무제한으로 프로그램을 속이기에 충분했다 여기

는 청소 업 버전입니다 최소한의 금액을 확인하고 '계좌 잔액을 확인'하는 옵션을 추가합니다. 유용하다고 보였습니다.

Live On Coliru

나는이 중 일부는 도움이되기를 바랍니다를 참조하십시오.우선, 선생님이 대부분의 내용을 언급하기를 바랍니다./

int read_balance(void); 
void write_balance(int balance); 

#include <iostream> 
#include <limits> 

int main() 
{ 
    while(std::cin.good()) 
    { 
     std::cout << "0. Request balance"  << std::endl; 
     std::cout << "1. Transfer an amount" << std::endl; 
     std::cout << "2. Quit"     << std::endl; 
     std::cout << "Please enter menu number" << std::endl; 

     int selection = 2; 
     if(std::cin >> selection) 
     { 
      std::cout << "DEBUG: selection:" << selection << "\n"; 
      switch(selection) 
      { 
      case 0: 
       std::cout << "The current account balance is " << read_balance() << std::endl; 
       break; 

      case 1: 
       { 
        std::cout << "You have choosen to transfer an amount" << std::endl; 
        std::cout << "How much do you wish to transfer from the shop account?"<<std::endl; 

        int amount = 0; 
        if (std::cin >> amount) 
        { 
         std::cout << "DEBUG: amount:" << amount << "\n"; 
         int balance = read_balance(); 
         if(amount<=0) 
         { 
          std::cout << "Amount must be positive\n"; 
         } 
         else if(balance < amount) 
         { 
          std::cout << "Insufficient funds\n"; 
         } 
         else 
         { 
          int new_balance = balance - amount; 
          write_balance(new_balance); 
          std::cout << "New account balance: " << new_balance << std::endl; 
         } 
        } else 
        { 
         // bad input cleared outside the switch 
        } 
       } 
       break; 

      case 2: 
       return 0; 
       break; 

      default: 
       std::cout << "Ooops, invalid selection!" << std::endl; 
       break; 
      } 
     } 

     if(std::cin.eof()) 
     { 
      std::cout << "Bye\n"; 
      return 0; 
     } 
     if(std::cin.fail()) 
     { 
      std::cin.clear(); 
      std::cin.ignore(99999, '\n'); 
      std::cout << "Invalid input\n"; 
      // note eof() can be true here 
     } 
    } 
} 

#include <fstream> 

int read_balance(void) 
{ 
    std::ifstream f; 
    f.exceptions(std::ios::failbit | std::ios::badbit); 
    f.open("shop-account.txt"); 
    int balance; 
    f >> balance; 
    f.close(); 
    return balance; 
} 

void write_balance(int balance) 
{ 
    std::ofstream f; 
    f.exceptions(std::ios::failbit | std::ios::badbit); 
    f.open("shop-account.txt"); 
    f << balance; 
    f.close(); 
} 
+0

너무 많이 생각하지 않습니까? OP는 함수에 대한 변수를 제대로 초기화 할 수 없기 때문에 명확하게 프로그래밍에 대해 알지 못합니다. 그리고 지금 당신은 그에게 예외를 던지고 있습니다. 그리고이 "무시하기 전에 :"- 당신의 의도가 여기에 무엇인지는 분명하지 않습니다. (아시다시피, 프로그래머가 알게 되겠지요?) – zoska

+0

@ zoska 의견이 약간 우스꽝스럽지 않습니까? 그들은 프로그램을 배우고 있습니다. C++에서. 물론 C++ 사용 방법을 알려줍니다. 프로그램하기. (물론 그 디버그 왼쪽 - 오버를 제거합니다. 당신이 볼 수 있듯이, 나는 _test 내 대답을 잘 :) :) – sehe

+1

@ zoska : 얼마나 많이입니까? 누군가가 좋은 코드를 보지 못했기 때문에 허위 코드를 제공하고 싶습니까? 좋은 코드를보기 시작해야한다고 생각하면? –

관련 문제