2016-03-08 25 views
8

Tôi đang cố gắng tìm ra một chương trình tính toán điểm được đưa ra từ đầu vào của người dùng. Tôi cũng đang cố đặt giới hạn về mức độ đầu vào của người dùng cao hay thấp (ví dụ: 0 < = hoặc> = 100). Nhưng khi tôi sử dụng số thập phân nó giữ cho tôi lỗi này, "điều hành '<' không thể được áp dụng cho toán hạng của loại 'thập phân' và 'đôi'"Toán tử '<' không thể áp dụng cho các toán hạng kiểu 'thập phân' và '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

Xin vui lòng gửi chính xác dòng mã đó là ném lỗi. –

+1

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

+0

Hầu hết thời gian lỗi này xảy ra do sự cố truyền. Nếu bạn dán mã, chúng tôi có thể đưa ra câu trả lời chính xác. – Sasa1234

Trả lời

13

Có ít nhất bốn sự cố tôi đã nhận thấy trong mã của bạn.

Thứ nhất, như đã nói, bạn nên sử dụng M hậu tố để cho trình biên dịch C# rằng nó là một decimal để so sánh được chấp nhận:

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

Nhưng thứ hai, sử dụng || thay vì |, bởi vì bạn muốn thực hiện hoạt động OR, không phải Bitwise-OR

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

thứ ba, tôi nghĩ khá quan trọng để bạn có thể biết điều này: bạn sẽ không cầndecimal kiểu dữ liệu đối với nhãn hiệu thi (trừ khi đánh dấu kỳ thi của bạn có thể được định dạng 99,123456789- đó là khá bất khả thi).

decimal thường được sử dụng cho các số yêu cầu độ chính xác rất cao (chẳng hạn như money tính toán trong ngân hàng) lên tới độ chính xác hơn 16 chữ số. Nếu dấu kiểm tra của bạn không cần, không sử dụng decimal, nó là quá mức cần thiết. Chỉ cần sử dụng double hoặc int hoặc float cho số Exams của bạn và có thể bạn đang đi đúng hướng.

Thứ tư, về xử lý lỗi bạn, đây là cách không chính xác để làm việc đó:

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

do hai lý do:

  1. Exam_1 của bạn là bên ngoài của khối (có isn' t {} khung)
  2. Bạn sử dụng if trong khi bạn nên sử dụng while

Đây là cách đúng đắn để làm điều đó:

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 

Trong ngôn ngữ C#, thụt đầu dòng không có nghĩa Phạm vi, không giống như trong ngôn ngữ như Python.

+0

Liệu vòng lặp có hoạt động được không? – Abdulhamid

+0

@Abdulhamid không ... xử lý lỗi của bạn ("vòng lặp" trong thuật ngữ của bạn, nhưng thực sự nó không phải là) có vẻ là một vấn đề khác ... không may .. – Ian

+0

Bạn có thể làm sáng tỏ vấn đề vì vậy tôi không chạy vào nó trong tương lai? – Abdulhamid

1

Đối với số thập phân, bạn phải thêm chữ "M" hậu tố giá trị để báo cho máy tính đó là số thập phân. Nếu không, máy tính sẽ coi nó là một đôi.

yourDecimal < 98.56M;

1

Như người khác đã chỉ ra. Để so sánh loại decimal sử dụng số lớn hơn hoặc nhỏ hơn toán tử, bạn phải so sánh loại này với loại khác decimal. Để khai báo số thập phân dưới dạng số thập phân, nó yêu cầu hậu tố M hoặc m. Đây là MSDN trên loại decimal để tham khảo.

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

Here's a .NET fiddle with the fix.

Các vấn đề liên quan