2015-03-27 2 views
-5

Я пытаюсь создать консольное приложение, которое преобразует сантиметров до метров Вот мои целиC Конструкторы # и Contexes

  1. Магазин количество сантиметров, введенных в атрибуте
  2. Используйте конструктор по умолчанию для хранения нуля в атрибут, который хранит введенное количество сантиметров
  3. Используйте первичный конструктор, чтобы принять и сохранить введенное количество сантиметров.
  4. A getMeters вызова функции возвращает количество метров
  5. Функция называется относящимся получить число сантиметрового содержания обвиняемых после преобразования
  6. Функции называются распечатки, которая будет отображать результаты

Приложение должна продолжать принимать значения для преобразования до тех пор, пока пользователь не решит его прекратить.

То, что я до сих пор:

using System; 

namespace Conv 
{ 

public class Centimeter 
{ 
    public int cmvar; 
    public Centimeter() 
    { 
     cmvar = 0; 
    } 
} 

//primary const to be added 


public class MeterToCenti 
{ 
    public static void Main() 
    { 
      char choice; 
      char n = 'n'; 

      do 
      { 
      Console.WriteLine("Do you want to continue? (y/n)"); 
      //choice = Console.ReadLine(); 
      choice = Console.ReadKey().KeyChar; 
      Centimeter c = new Centimeter(); 
      Console.WriteLine("enter value in centimeters"); 
      c.cmvar = int.Parse(Console.ReadLine()); 
      Printout(); 
      } 
      while(choice.CompareTo(n) == 0); 
    } 


public static void getMeterst() 
    { 
    int meters = c.cmvar/100; 
    } 


public static void Remainder() 
    { 
     int cmremain = c.cmvar % 100; 
    } 


public static void Printout() 
    { 
     Console.WriteLine("{0} Meters and {1} Centimeters", meters, cmremain); 
    } 

} 


} 

Я получаю ошибки относительно:

prog.cs(24,5): warning CS0168: The variable `meters' is declared but never used 
prog.cs(41,11): error CS0103: The name `c' does not exist in the current context 
prog.cs(41,2): error CS0103: The name `meters' does not exist in the current context 
prog.cs(47,24): error CS0103: The name `c' does not exist in the current context 
prog.cs(53,61): error CS0103: The name `meters' does not exist in the current context 
prog.cs(53,69): error CS0103: The name `cmremain' does not exist in the current contex 

Любая помощь будет оценена.

+2

Не могли бы вы решить, какую версию C# вы используете? Существует огромная разница между C# 2.0 и C# 5.0 ... – BoltClock

+4

Эти ошибки очень прямые вперёд и говорят вам ТОЧНО, что не так и где. Вы должны прочитать их. – MyCodeSucks

+4

Похоже, вам нужно научиться искусству отладки. И концепция переменной области – Jonesopolis

ответ

2

у вас есть много проблем с областью действия в коде, когда вы объявить что-то, он может (как правило) доступен только в любом наборе скобок, в котором вы его объявляете, поэтому, когда вы пытаетесь получить доступ к c и cmremain и тому подобное, не указав их местоположение или получив их правильно, вы получите такие ошибки.

У меня есть рабочий код ниже, но вы можете задать дополнительные вопросы относительно того, почему это работает.

using System; 

namespace Conv 
{ 

public class Centimeter 
{ 
    public int cmvar; 
    public Centimeter() 
    { 
     cmvar = 0; 
    } 
} 

//primary const to be added 


public class MeterToCenti 
{ 
    public static void Main() 
    { 
     char choice; 
     char n = 'n'; 

     do 
     { 
      Centimeter c = new Centimeter(); 
      Console.WriteLine("enter value in centimeters"); 
      c.cmvar = int.Parse(Console.ReadLine()); 
      Printout(c); 
      Console.WriteLine("Do you want to continue? (y/n)"); 
      choice = Console.ReadKey().KeyChar; 
      Console.WriteLine(); 
     } 
     while (choice != n); 
    } 


public static int getMeters(Centimeter c) 
    { 
     int meters = c.cmvar/100; 
     return meters; 
    } 


public static int Remainder(Centimeter c) 
    { 
     int cmremain = c.cmvar % 100; 
     return cmremain; 
    } 


public static void Printout(Centimeter c) 
    { 
     Console.WriteLine("{0} Meters and {1} Centimeters", getMeters(c), Remainder(c)); 
    } 

} 


} 
+0

Спасибо @ConnorLSW. Мое понимание ООП отсутствует. Я учусь, однако я понял, что вы здесь написали. Мой вопрос: как включить конструктор по умолчанию, который будет хранить 0 в переменной? Кроме того, основной конструктор? Я понимаю, что он не работает, как я ожидал бы, т. Е. Когда пользователь не вводит значение, код терпит неудачу: ** Строка ввода не была в правильном формате ** – user3317524

+0

вы можете использовать 'Int.TryParse()', чтобы сделать убедитесь, что пользователь правильно вводит номер. и 'cmvar = 0' является конструктором по умолчанию для этой переменной, так как вы получаете доступ к нему только через свой' сантиметровый' объект, 'int cmvar = 0' будет обычно конструктором по умолчанию, но здесь здесь больше или меньше нужно из-за вашего макета:) – ConnorLSW

5

В некоторых языках программирования, контекст обычно определяется { и }, что означает, что с учетом этого:

{ 
    int a = ... 
} 

a существует именно в рамках этого блока. Если предположить, что ни одна другая переменная с именем a не был объявлен вне скобок, делать что-то вроде этого:

{ 
    int a = ... 
} 
print(a) 

не приведет к неисправности, так как a больше не существует.

В вашем случае, например, вы объявляете следующую переменную: Centimeter c = new Centimeter();. Обратите внимание, что это заключено в область do...while, поэтому оно существует только там. Таким образом, когда вы пытаетесь получить доступ к своей переменной из другого метода, у которого есть своя область , вы получаете исключение, которое получаете.

Чтобы приступить к решению вопроса, вы должны переместить 3 метода getMeterst, Remainder и Printout в их соответствующем классе, который Centimeter.

Я бы порекомендовал вам начать с изучения некоторых учебных пособий, так как у вас есть другие проблемы с вашим кодом.

Как указано пользователем @ user2864740, разные языки рассматривают области по-разному. Принимая во внимание Javascript:

 function hello() 
     { 
      { 
       var i = 44; 
      } 
      { 
       alert(i); 
      } 
     } 

Уступает предупреждение со значением 44.

Однако приведенный ниже код не компилируется в C#:

private static void Hello() 
    { 
     { 
      int i = 0; 
     } 
     { 
      Console.WriteLine(i); //The name i does not exist in the current context. 
     } 
    } 
1

вам нужно научиться ориентированное программирование объекта перед программированием на любом языке ООП. Basic это хорошо, но polute своего ума, не думая объект, но sequencial ...

Вот ваш код фиксированной

using System; 
namespace Conv 
{ 
    public class Centimeter 
    { 
     public int cmvar; 
     public Centimeter() 
     { 
      cmvar = 0; 
     } 
     public Centimeter(int mm) 
     { 
      cmvar = mm; 
     } 
     public int getMeterst() 
     { 
      return cmvar/100; 
     } 
     public int Remainder() 
     { 
      return cmvar % 100; 
     } 
     public void Printout() 
     { 
      Console.WriteLine("{0} Meters and {1} Centimeters", this.getMeterst(), this.Remainder()); 
     } 
    } 
    public class MeterToCenti 
    { 
     public static void Main() 
     { 
      char choice; 
      char n = 'n'; 
      do 
      { 
       Console.WriteLine("Do you want to continue? (y/n)"); 
       choice = Console.ReadKey().KeyChar; 
       Console.WriteLine(); // for pure design needs 
       Centimeter c = new Centimeter(); 
       Console.WriteLine("enter value in centimeters"); 
       c.cmvar = int.Parse(Console.ReadLine()); 
       c.Printout(); 
      } 
      while (choice != n); 
     } 
    } 
} 
+0

Спасибо @Xavius ​​Pupuss. Мое понимание ООП отсутствует. Я учусь, однако я понял, что вы здесь написали. Мой вопрос: как включить конструктор по умолчанию, который будет хранить 0 в переменной? Кроме того, основной конструктор? Я понимаю, что он работает не так, как я ожидал бы. Если пользователь не введет значение, код не сработает: ** Строка ввода не была в правильном формате ** – user3317524

Смежные вопросы