2013-10-12 1 views
0

사용자가 클럽 회원인지 아닌지를 결정한 다음 나이를 기준으로 할인 금액을 표시하는 프로그램을 만들려고합니다. 필자는 프로그램을 작성했지만 해결책을 찾을 수없는 몇 가지 오류를 제공하고 있습니다. 나는이 사이트와 다른 사람들이 내가 뭘 잘못하고 있는지 발견하려고 노력했지만 모든 문제를 해결하지 못했습니다. 나는 배우는 프로그래머이기 때문에 정말 실종되었다는 것을 확신합니다. 문제에 대한 모든 의견은 크게 감사하겠습니다. 왜 현재 컨텍스트에 존재하지 않는 나이에 대한 오류가 발생하는지 알고 있습니다. '나이'가 올바르게 처리되도록 코드에서 누락 된 내용을 이해하지 못합니다.이름 '나이'가 현재 컨텍스트에 없습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace PA05 
{ 
    class DiscountApp 
    { 
     public static void Main(string[] args) 
     { 
      DisplayTitle(); 
      InputMembershipStatus(age); 
      DetermineDiscount(age); 
      TerminateProgram(); 
     } 

     public static void DisplayTitle() 
     { 
      Console.WriteLine("Programming Assignment 5 - Determine Discount\n\tProgrammer: "); 
      Console.WriteLine(); 
      DrawLine(); 
     } 

     public static void InputMembershipStatus(int age) 
     { 
      Console.WriteLine("Are you a Club Member? <Y or N>: "); 
      string aValue = Console.ReadLine(); 
      if (aValue == "Y" || aValue == "y" || aValue == "Yes" || aValue == "yes") 
      { 
       age = InputAge(); 
      } 
      else if (aValue == "N" || aValue == "n" || aValue == "No" || aValue == "no") 
      { 
       Console.WriteLine("Sorry, discounts apply to Club Members only."); 
       TerminateProgram(); 
      } 

     } 

     public static int InputAge() 
     { 
      int age; 
      Console.Write("Please enter the customer's age: "); 
      age = Convert.ToInt32(Console.ReadLine()); 
      return age; 

     } 

     public static double DetermineDiscount(int age) 
     { 
      double discountAmount; 
      if (age <= 10 || age >= 60) 
      { 
       discountAmount = .15; 
       Console.WriteLine("The discount is a {0:P2}", discountAmount); 
      } 
      else 
      {     
       discountAmount = .1; 
       Console.WriteLine("The discount is b {0:P2}", discountAmount); 
      } 
      return discountAmount; 
     } 

     public static void DrawLine() 
     { 
      Console.WriteLine("_________________________________________________________"); 
     } 

     public static void TerminateProgram() 
     { 
      DrawLine(); 
      Console.WriteLine("Press any key to terminate the program..."); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

'Main' 메소드는 아무 곳에도 정의되지 않았더라도'age' 변수를 사용합니다.'age' 매개 변수의 실제 값을 전달해야합니다. –

+0

그 정도는 이해하지만, 메인 메소드에서 변수를 선언하더라도 두 메소드 'InputMembershipStatus()'및 'DertermineDiscount()'와 관련된 오류가 발생합니다. 정말 알아야 할 것은 어떻게 생각합니까? '연령'변수를 올바르게 처리하려면 처리해야합니다. –

답변

1

문제는 C#의 변수 범위가 제한되어 있다는 것입니다. 당신이하려고하는 것처럼 다른 함수 안에서 선언 된 변수에 접근 할 수 없습니다.

나이를 InputMembershipStatus으로 설정하려는 것 같습니다.

public static void Main(string[] args) 
{ 
    DisplayTitle(); 
    // this age variable is declared inside Main 
    // and receives its value from InputMembershipStatus 
    int age = InputMembershipStatus(); 
    DetermineDiscount(age); 
    TerminateProgram(); 
} 

// this function now returns an int instead of having a parameter 
public static int InputMembershipStatus() 
{ 
    int age = 0; 
    Console.WriteLine("Are you a Club Member? <Y or N>: "); 
    string aValue = Console.ReadLine(); 
    if (aValue == "Y" || aValue == "y" || aValue == "Yes" || aValue == "yes") 
    { 
     age = InputAge(); 
    } 
    else if (aValue == "N" || aValue == "n" || aValue == "No" || aValue == "no") 
    { 
     Console.WriteLine("Sorry, discounts apply to Club Members only."); 
     TerminateProgram(); 
    } 

    return age; 
} 

내가 variable scopereturning values from methods에 읽을 것입니다 : 당신이 원하는 것은 반환 변수입니다.

+0

이것은 내 문제를 해결하고 프로그램은 지금 잘 실행 중입니다, 감사합니다! 하지만 내 문제를 어떻게 해결했는지 더 잘 이해할 수 있기를 원합니다. 솔루션에 대해 자세히 설명해 주시겠습니까? –

+0

@ user2864614 프로그램의 Main()에서'int age' = 8을 선언하면'age'는 main의 범위에서만 사용 가능합니다. 귀하의 다른 기능은 그것을 액세스 할 수 없습니다. 이 두 가지 가능한 솔루션은 위의 솔루션이며, 이것이 내가 권하는 것입니다. 이 리턴 값은 InputMembershipStatus가 값을 age로 설정 한 main 값을 리턴하도록합니다. 또 다른 해결책은 클래스 외부에서 int 나이를 선언하는 것입니다. 이렇게하면 모든 기능이 액세스 할 수 있습니다. – Kyle

+0

@ user1308743 프로그램 작성시 두 번째 솔루션이 작동하지 않습니다. 'InputMembershipStatus'에 대한 'age' 매개 변수는'age' 클래스 멤버보다 우선하므로'InputMembershipStatus'의 밖에서 선언 된'age'는 영향을받지 않을 것입니다. –

0

Main 담기 :

변수 ageInputMembershipStatus(age);에 호출에 처음으로 사용
int age = 22; //initialize it 
0

그래서 컴파일러는 거기 선언 존재한다고 가정 여기

내 코드입니다 로컬 변수 또는 전역 클래스 수준에서 사용할 수 있지만 해당 변수에 대한 로컬 또는 전역 선언이 없으므로 오류 메시지가 나타납니다.

프로그램을 수정하기 위해 가장 먼저해야 할 일은 age (실제로 필요하지 않음)에서 전달 된 InputMembershipStatus을 삭제하고 사용자에게 요청한 값을 반환하는 것입니다. 기존 값 -1은 사용자가 올바른 연령 값을 입력하지 않았다는 신호를 보내는 방법으로 사용됩니다.

public static int InputMembershipStatus() 
    { 
     int age = -1; 
     Console.WriteLine("Are you a Club Member? <Y or N>: "); 
     string aValue = Console.ReadLine(); 
     if (aValue == "Y" || aValue == "y" || aValue == "Yes" || aValue == "yes") 
     { 
      age = InputAge(); 
     } 
     else if (aValue == "N" || aValue == "n" || aValue == "No" || aValue == "no") 
     { 
      Console.WriteLine("Sorry, discounts apply to Club Members only."); 
      TerminateProgram(); 
     } 
     return age; 
    } 

당신은 다시이 값을 얻을 수 있도록 main 기능을 수정하고 마지막으로, 또 다른 중요한 수정이 InputAge 방법이 필요합니다 DetermineDiscount

// Ask the age to the user and store it in a local variable here 
int age = InputMembershipStatus(); 

// If we have received a valid value for age, 
// pass that local value to the DetermineDiscount function 
if(age != -1) 
    DetermineDiscount(age); 

TerminateProgram(); 

에 전달할 수 있습니다. (중요한 문제와 관련이 없지만 중요 함에도 불구하고)

public static int InputAge() 
    { 
     int age; 
     Console.Write("Please enter the customer's age: "); 
     if(int.TryParse(Console.ReadLine(), out age)) 
      return age; 
     else 
      return -1; 

    } 

여기에서 사용자 입력을 확인해야합니다. 숫자가 아닌 입력에 Convert.ToInt32을 사용하면 예외없이 프로그램이 중단됩니다 (입력없이 Enter 키를 누르면 빈 문자열이 같은 효과를 갖습니다). 대신 Int32.TryParse은 유효한 정수 값으로 입력을 변환하려고 시도하고 성공하면 전달 된 인수에 true 값과 변환 된 수를 반환합니다. 다시 기존 값 -1을 반환하여 유효하지 않은 나이 입력을 나타내며 프로그램을 종료합니다.

관련 문제