2016-03-08 41 views
8

Próbuję wymyślić program, który oblicza oceny podane z danych wejściowych użytkowników. Próbuję również ustalić, jak wysoki lub niski może być sygnał wejściowy użytkownika (tj. 0 < = lub> = 100). Ale kiedy używać przecinku trzyma daje mi ten błąd: „Operator«<»nie może być stosowany do argumentów typu«dziesiętnym»i«podwójne»”Operatora "<" nie można zastosować do argumentów typu "dziesiętny" i "podwójny"

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

proszę pisać dokładną linię kodu, który rzuca błąd. –

+1

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

+0

W większości przypadków ten błąd pojawia się z powodu problemu z przesyłaniem. Po wklejeniu kodu możemy dokładnie podać poprawną odpowiedź. – Sasa1234

Odpowiedz

13

W kodzie znalazły się co najmniej cztery problemy.

pierwsze, jak wspomniano, należy użyć M przyrostek powiedzieć kompilatora C#, że jest to decimal zaakceptowanych porównania:

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

Ale drugie, wykorzystać || zamiast |, bo chcesz wykonać operację OR, a nie Bitwise-OR

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

I trzecie, myślę, że bardzo ważne, aby wiedzieć, to: ty nie musiałbydecimal typ danych dla znaku egzamin (chyba, że ​​znak egzamin może być formatu 99.123456789- co jest zupełnie niemożliwe).

decimal jest zwykle używany do numerów wymagających bardzo dużej dokładności (takich jak obliczenia money w banku) do ponad 16-cyfrowej dokładności. Jeśli Twój egzamin nie wymaga tego, nie użyć decimal, to jest przesada. Po prostu użyj double lub int lub float dla swojego Exams i jesteś prawdopodobnie na dobrej drodze.

czwarte, o swojej obsługi błędów, to jest nieprawidłowy sposób to zrobić:

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

z dwóch powodów:

  1. Twój Exam_1 jest poza blokiem (tam isn” t {} wspornik)
  2. Używasz if, a powinieneś używać while

Jest to dobry sposób, żeby to zrobić:

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 

W języku C#, wcięcie nie znaczy scopingu, w odróżnieniu od języka jak Python.

+0

Czy pętla działa? – Abdulhamid

+0

@Abdulhamid no ... obsługa błędów ("pętla" w twoim terminie, ale tak naprawdę nie jest) wydaje się być innym problemem ... niestety .. – Ian

+0

Możesz rzucić światło na - problem, więc nie wpaść na nią w przyszłości? – Abdulhamid

1

Dla przecinku trzeba dodać „M” przyrostek wartość informująca komputer o wartości dziesiętnej. W przeciwnym razie komputer uzna to za podwójne.

yourDecimal < 98,56M;

1

Jak inni już podkreślili. Aby porównać typ decimal za pomocą operatorów o wielkości większej lub mniejszej, należy porównać go z innym typem decimal. Aby zadeklarować liczbę literalną jako liczbę dziesiętną, wymagany jest przyrostek M lub . Oto MSDN dla typu decimal w celach informacyjnych.

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

Here's a .NET fiddle with the fix.