2014-09-24 56 views
-2

當我嘗試輸出方法調用時,我得到一個空白屏幕,當我按任意鍵時,顯示命名空間,然後控制檯關閉。任何人都可以看到我在這裏失蹤的內容控制檯不會打印出我的方法中的信息

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

namespace programming_2 
{ 
class Driver 
{ 
    static void Main(string[] args) 
    { 

     fraction frac = new fraction(); // we'll get 0/1 
     frac = new fraction(1, 5);  // we'll get 1/5 
     // frac = new fraction(25);  // we'll get 25/1 
     //frac = new fraction(9.25);  // we'll get 37/4 
     //frac = new fraction("6.25"); // we'll get 25/4 

     //frac = new fraction(System.Console.ReadLine()); 


     Console.Write(frac); 
     // displays the current value of frac object; 

     Console.WriteLine("Press any key to continue.."); 
     Console.ReadKey(); 
    } 
} 
} 

Fraction類

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

namespace programming_assignment_2 
{ 
class fraction : ICloneable, IEnumerable<fraction>, IEnumerator<fraction>, IComparer<fraction> 
{ 

     private int num, den; 

     // Constructors 

     public fraction() 
     { 
      Initialize(0, 1); 
     } 

     public fraction(int num) 
     { 
      CheckMinValue(num); 
      Initialize(num, 1); 
     } 

     public fraction(fraction f) 
     { 
      Initialize(f.num, f.den); 
     } 

     public fraction(int num, int den) 
     { 
      CheckDenominatorZero(den); 

      CheckMinValue(num); 
      CheckMinValue(den); 

      fraction f = new fraction((decimal)num, (decimal)den); 
      Initialize(f.num, f.den); 
     } 

     private static void CheckMinValue(int n) 
     { 
      if (n == int.MinValue) 
       throw new OverflowException(); 
     } 

     private void Initialize(int num, int den) 
     { 
      this.num = num; 
      this.den = den; 
     } 

     private fraction(decimal r1, decimal r2) 
     { 
      decimal gcd = GCD(Math.Abs(r1), Math.Abs(r2)); 

      int num = (int)(r1/gcd); 
      int den = (int)(r2/gcd); 

      CheckMinValue(num); 
      CheckMinValue(den); 

      if (r2 < 0) 
      { 
       num = -num; 
       den = -den; 
      } 

      this.num = num; 
      this.den = den; 
     } 



     public int Numerator 
     { 
      get { return this.num; } 
     } 

     public int Denominator 
     { 
      get { return this.den; } 
     } 

     // Overloaded Operators (+-*/^) 

     // Add 

     public static fraction operator +(fraction a, fraction b) 
     { 
      decimal d1 = (decimal)a.num * b.den + (decimal)b.num * a.den; 
      decimal d2 = (decimal)a.den * b.den; 
      return new fraction(d1, d2); 
     } 

     public static fraction operator +(fraction a, int b) 
     { 
      return a + new fraction(b); 
     } 

     public static fraction operator +(int a, fraction b) 
     { 
      return new fraction(a) + b; 
     } 


     // Substract 

     public static fraction operator -(fraction a, fraction b) 
     { 
      decimal r1 = (decimal)a.num * b.den - (decimal)b.num * a.den; 
      decimal r2 = (decimal)a.den * b.den; 
      return new fraction(r1, r2); 
     } 

     public static fraction operator -(fraction a, int b) 
     { 
      return a - new fraction(b); 
     } 

     public static fraction operator -(int a, fraction b) 
     { 
      return new fraction(a) - b; 
     } 


     // Multiply 

     public static fraction operator *(fraction a, fraction b) 
     { 
      decimal r1 = (decimal)a.num * b.num; 
      decimal r2 = (decimal)a.den * b.den; 
      return new fraction(r1, r2); 
     } 

     public static fraction operator *(fraction a, int b) 
     { 
      return a * new fraction(b); 
     } 

     public static fraction operator *(int a, fraction b) 
     { 
      return new fraction(a) * b; 
     } 



     // Divide 

     public static fraction operator /(fraction a, fraction b) 
     { 
      decimal r1 = (decimal)a.num * b.den; 
      decimal r2 = (decimal)a.den * b.num; 

      if (r2 == 0) 
       throw new DivideByZeroException(); 
      else 
       return new fraction(r1, r2); 
     } 

     public static fraction operator /(fraction a, int b) 
     { 
      return a/new fraction(b); 
     } 

     public static fraction operator /(int a, fraction b) 
     { 
      return new fraction(a)/b; 
     } 


     // Exponents 

     public static fraction operator ^(fraction a, int n) 
     { 
      return new fraction((decimal)Math.Pow(a.num, n), (decimal)Math.Pow(a.den, n)); 
     } 



     // Comparison operators 

     public static bool operator ==(fraction a, fraction b) 
     { 
      return (decimal)a.num * b.den == (decimal)b.num * a.den; 
     } 

     public static bool operator !=(fraction a, fraction b) 
     { 
      return (!(a == b)); 
     } 

     public static bool operator >(fraction a, fraction b) 
     { 
      return (decimal)a.num * b.den > (decimal)b.num * a.den; 
     } 

     public static bool operator >=(fraction a, fraction b) 
     { 
      return (!(a < b)); 
     } 

     public static bool operator <(fraction a, fraction b) 
     { 
      return (decimal)a.num * b.den < (decimal)b.num * a.den; 
     } 

     public static bool operator <=(fraction a, fraction b) 
     { 
      return (!(a > b)); 
     } 




     public static decimal GCD(decimal a, decimal b) 
     { 
      if (b == 0) 
       return a; 
      return GCD(b, a % b); 
     } 

     private static void CheckDenominatorZero(decimal den) 
     { 
      if (den == 0) 
       throw new ArithmeticException("The denominator can't be zero!!"); 
     } 



    } 




} 
+0

你沒有調用任何'frac'對象的方法。更好地向我們展示「分數」類的定義。 – Hassan 2014-09-24 00:40:07

+0

發佈'分數'類。 – 2014-09-24 00:42:03

+0

另外,如果最初得到一個空白屏幕,這是因爲您正在執行一個'System.Console.ReadLine()'(目前已被註釋掉,但不能在運行該程序時),而不顯示任何內容屏幕首先使用'Console.WriteLine()'。 – 2014-09-24 00:43:47

回答

1

什麼是部分類?它有一個ToString()方法可以打印出來嗎?

這適用於我。

static void Main(string[] args) 
     { 

      var frac = new fraction(1,5); 

      Console.WriteLine(frac); 
      Console.WriteLine("Press any key to continue.."); 
      Console.ReadKey(); 
     } 



public class fraction 
    { 
     public int nom { get; set; } 
     public int denom { get; set; } 
     public fraction(int n, int d) 
     { 
      nom = n; 
      denom = d; 

     } 

     public override string ToString() 
     { 
      return string.Format("{0}\\{1}", nom, denom); 
     } 
    } 
+0

是的,也有一個。我所有的方法和一切看起來都是按順序的,幾個星期前我剛剛開始使用C#,而且我似乎無法獲得控制檯上顯示的任何信息 – 2014-09-24 00:41:48

+0

@steveneck是否可以粘貼分數類的代碼? – Wjdavis5 2014-09-24 00:42:47

0

在你的代碼,它看起來像你有一個無限循環:

public fraction(int num, int den) 
{ 
    CheckDenominatorZero(den); 

    CheckMinValue(num); 
    CheckMinValue(den); 

    // You are creating a new instance in the creation of a new instance 
    fraction f = new fraction((decimal)num, (decimal)den); 
    Initialize(f.num, f.den); 
} 

試試這個:

// Remove this line: 
    fraction f = new fraction((decimal)num, (decimal)den); 
    // And change the next line to this: 
    Initialize(num, den); 

變更後:

public fraction(int num, int den) 
{ 
    CheckDenominatorZero(den); 

    CheckMinValue(num); 
    CheckMinValue(den); 

    Initialize(num, den); 
} 

此外,正如其他人有說過,你應該重寫ToString這樣你的控制檯輸出看起來不錯:

public override string ToString() 
    { 
     return string.Format("{0}\\{1}", this.num, this.den); 
    } 
+0

這個特殊的構造函數(用'int's)調用其他構造函數(接受'decimal's)之一,並且由於另一個構造函數不會創建另一個類的實例,它不會創建一個無限循環。 – 2014-09-24 00:56:23

+0

@GrantWinney啊,好點。我想這不是問題,但它仍然是一個很大的開銷。 :p – 2014-09-24 00:59:09