2016-03-08 8 views
8

Ich versuche ein Programm zu finden, das die von den Benutzern eingegebenen Werte berechnet. Ich versuche auch, eine Grenze dafür zu setzen, wie hoch oder niedrig die Benutzereingabe sein kann (d. H. 0 < = oder> = 100). Aber wenn ich dezimal verwenden es hält mich diesen Fehler geben, „Operator‚<‘kann nicht auf Operanden vom Typ‚Dezimal‘angewendet werden, und‚double‘“Der Operator '<' kann nicht auf Operanden vom Typ 'dezimal' und 'doppelt' angewendet werden.

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

namespace Grade_Program 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string First; 
      string Last; 
      First = "Cristiano"; 
      Last = " Ronaldo"; 
      Console.Write("Please enter student name <First Last>: "); 
      Console.WriteLine(First + Last); 

      Console.WriteLine(" "); 

                Console.WriteLine("*************NOTE**********************************************"); 
     Console.WriteLine("*** Be sure to include decimal point for scores.   ***"); 
     Console.WriteLine("***  !!!All score should range from 0.00 to 100.00 !! ***"); 
     Console.WriteLine("***               ***"); 
     Console.WriteLine("*** For example : 80.50          ***"); 
     Console.WriteLine("***************************************************************"); 

     Console.WriteLine(" "); 

     decimal Exam_1; 
     decimal Exam_2; 
     decimal Exam_3; 
     decimal Assignment_1; 
     decimal Assignment_2; 

     Console.Write("Please enter score for Exam 1 <Example: 100.0>: "); 
     Exam_1 = Convert.ToDecimal(Console.ReadLine()); 

     if (Exam_1 < 0.0 | Exam_1 > 100.0) 
      Console.Write("Exam score cannot be less than 0. or greater than      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:"); 
      Exam_1 = Convert.ToDecimal(Console.ReadLine()); 

     Console.Write("Please enter score for Exam 2 <Example: 0.0>: "); 
     Exam_2 = Convert.ToDecimal(Console.ReadLine()); 
+1

Bitte senden Sie die genaue Codezeile, die den Fehler ist zu werfen. –

+1

Versuchen Sie '0M <= myDecimal || 100M> = myDecimal' (ref: https://msdn.microsoft.com/en-us/library/364x0z75.aspx) – souldzin

+0

Die meiste Zeit kommt dieser Fehler wegen des Casting-Problems. Wenn Sie den Code einfügen, können wir genau die richtige Antwort geben. – Sasa1234

Antwort

13

Es gibt mindestens vier Probleme, die ich in Ihrem Code festgestellt habe.

Zum einen, wie bereits erwähnt, sollten Sie M Suffix verwenden Sie den C# -Compiler zu sagen, dass es ein decimal für akzeptierte Vergleich:

if (Exam_1 < 0.0M | Exam_1 > 100.0M) 

Aber zweitens, || statt | verwenden, da Sie wollen OR Betrieb tun, nicht Bitwise-OR

if (Exam_1 < 0.0M || Exam_1 > 100.0M) //change | to || 

Und drittens, ich denke, ganz wichtig, dass Sie dies wissen: Sie nichtdecimal Datentyp für Prüfung Zeichen benötigen würde (es sei denn, Ihre Prüfung Marke von Format 99,123456789sein kann - was ganz unmöglich ist).

decimal wird normalerweise für Zahlen verwendet, die eine sehr hohe Genauigkeit erfordern (wie money Berechnung in der Bank) bis zu einer Genauigkeit von mehr als 16 Stellen. Wenn Ihr Prüfzeichen das nicht benötigt, nichtdecimal verwenden, ist es Overkill. Verwenden Sie einfach double oder int oder float für Ihre Exams und Sie sind sehr wahrscheinlich in der richtigen Spur.

viertens, über Ihre Fehlerbehandlung, ist dies eine falsche Art und Weise tun:

if (Exam_1 < 0.0 | Exam_1 > 100.0) 
    Console.Write("Exam score cannot be less than 0. or greater than      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:"); 
    Exam_1 = Convert.ToDecimal(Console.ReadLine()); 

aus zwei Gründen:

  1. Ihre Exam_1 außerhalb des Blocks (dort isn‘ t {} Klammer)
  2. Sie verwenden if, während Sie while
  3. verwenden sollten

Dies ist der richtige Weg, es zu tun:

double Exam_1 = -1; //I use double to simplify 

Console.Write("Please enter score for Exam 1 <Example: 100.0>: "); 
Exam_1 = Convert.ToDouble(Console.ReadLine()); 

while (Exam_1 < 0.0 || Exam_1 > 100.0) { //see the curly bracket 
    Console.Write("Exam score cannot be less than 0. or greater than      100.0. Please re-enter the score for Exam 1 <Example: 95.0>:"); 
    Exam_1 = Convert.ToDouble(Console.ReadLine()); 
} //see the end curly bracket 

In C#, Einzüge, bedeutet nicht, Scoping, anders als in der Sprache wie Python.

+0

Würde die Schleife funktionieren? – Abdulhamid

+0

@Abdulhamid nein ... Ihre Fehlerbehandlung ("Schleife" in Ihrem Begriff, aber eigentlich ist es nicht) scheint ein anderes Problem zu sein ... leider .. – Ian

+0

Können Sie Licht auf das Problem werfen, so dass ich nicht in die Zukunft hineinlaufen? – Abdulhamid

1

Für dezimal müssen Sie „M“ Suffix hinzufügen der Wert, der dem Computer mitgeteilt wird, dass es sich um eine Dezimalzahl handelt. Andernfalls wird der Computer es als ein Doppel betrachten.

yourDecimal < 98,56M;

1

Wie andere schon darauf hingewiesen haben. Um einen decimal Typ mit den Operatoren größer als oder kleiner als zu vergleichen, müssen Sie ihn mit einem anderen decimal Typ vergleichen. Um eine Literalzahl als Dezimalzahl zu deklarieren, ist das Suffix M oder m erforderlich. Hier ist der MSDN auf den decimal Typ als Referenz.

if (Exam_1 < 0.0m || Exam_1 > 100.0m) 

Here's a .NET fiddle with the fix.

Verwandte Themen