2016-03-08 15 views
8

Sto provando a creare un programma che calcola i voti forniti dall'input dell'utente. Sto anche cercando di impostare un limite su quanto alto o basso l'input dell'utente può essere (cioè 0 < = o> = 100). Ma quando uso decimale che continua a darmi questo errore, "Operatore '<' non può essere applicato a operandi di tipo 'decimali' e 'doppia'" suffissoL'operatore '<' non può essere applicato agli operandi di tipo 'decimal' e 'double'

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

Si prega di inviare la linea esatta di codice che sta gettando l'errore. –

+1

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

+0

La maggior parte delle volte questo errore viene causato da un problema di trasmissione. Se si incolla il codice, possiamo dare esattamente una risposta giusta. – Sasa1234

risposta

13

Ci sono almeno quattro problemi che ho notato nel codice.

In primo luogo, come detto, è necessario utilizzare M suffisso per dire al compilatore C# che si tratta di un decimal per il confronto accettato:

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

Ma secondo luogo, utilizzare || invece di |, perché si vogliono fare OR operazione, non Bitwise-OR

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

E in terzo luogo , penso molto importante per voi sapere questo: si non avrebbe bisognodecimal tipo di dati per marchio d'esame (a meno che il vostro marchio esame può essere di formato 99,123456789- che è del tutto impossibile).

decimal viene normalmente utilizzato per i numeri che richiedono un'elevatissima precisione (ad esempio il calcolo money nella banca) con una precisione superiore a 16 cifre. Se il tuo voto d'esame non lo richiede, lo non utilizzare usa decimal, è overkill. Basta usare double o int o float per il tuo Exams e probabilmente sei sulla strada giusta.

In quarto luogo, sulla tua gestione degli errori, questo è il modo errato di farlo:

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()); 

dovuto a due ragioni:

  1. tuo Exam_1 è al di fuori del blocco (là isn' t parentesi {})
  2. È possibile utilizzare mentre è necessario utilizzare while

Questo è il modo giusto per farlo:

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 

Nel linguaggio C#, il rientro non significa scoping, a differenza di linguaggio come Python.

+0

Il ciclo funzionerebbe comunque? – Abdulhamid

+0

@Abdulhamid no ... la gestione degli errori ("loop" nel tuo termine, ma in realtà non lo è) sembra essere un altro problema ... purtroppo .. – Ian

+0

Possa far luce sul problema, quindi non lo faccio imbattersi in esso in futuro? – Abdulhamid

1

Per decimali si deve aggiungere "M" per il valore per dire al computer che è un decimale. Altrimenti il ​​computer lo considererà un doppio.

yourDecimal < 98,56 M;

1

Come altri hanno già sottolineato. Per confrontare un tipo decimal utilizzando gli operatori maggiore o minore di quello necessario è necessario confrontarlo con un altro tipo decimal. Per dichiarare un numero letterale come decimale, è necessario il suffisso M o m. Ecco il MSDN sul tipo decimal come riferimento.

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

Here's a .NET fiddle with the fix.

Problemi correlati