验证包含10位数的ISBN号ERD

时间:2010-08-29 14:58:19

标签: c# c#-3.0 c#-4.0

我正在尝试创建一个检查ISBN号的程序,看看它是否有正确的校验位,如果它没有校验位,它会添加一个校验位。我知道它将如何工作我只是无法弄清楚如何编码它,就像在彼此继承的类中一样。 这是一个不会被评分的课堂示例,只是让我们熟悉将我们的设计变为工作程序。这就是我到目前为止所知道的这是一个简单的控制台程序。

alt text

代码已更新

public class isbn
{   //attributes
     private string isbnNum;
     //method   
     public string GetIsbn()
     {
         return this.isbnNum;
     }
       //constructor
       public isbn()
       {
           Console.Write("Enter Your ISBN Number: ");
           this.isbnNum = Console.ReadLine();

       }//end default constructor

        //method
       public string displayISBN()
       {

           return  this.GetIsbn();

       }


   public static void Main(string[] args)
    {
        //create a new instance of the ISBN/book class

        isbn myFavoriteBook = new isbn();

        //contains the method for checking validity 
        bool isValid = CheckDigit.CheckIsbn(myFavoriteBook.GetIsbn());

        //print out the results of the validity.
        Console.WriteLine(string.Format("Your book {0} a valid ISBN",
                                   isValid ? "has" : "doesn't have"));

        Console.ReadLine();

    }//end main

这是教授在课堂上提供的校验位代码,我们只需要对其进行网格化即可使其工作。我知道这是在校验位类中,我不知道如何将它合并到代码中。

代码已更新

 public static class CheckDigit
{       // attributes
    public static string NormalizeIsbn(string isbn)
    {
        return isbn.Replace("-", "").Replace(" ", "");
    }
   public static bool CheckIsbn(string isbn) // formula to check ISBN's validity
    {
        if (isbn == null)
            return false;

        isbn = NormalizeIsbn (isbn);
        if (isbn.Length != 10)
            return false;

        int result;
        for (int i = 0; i < 9; i++)
            if (!int.TryParse(isbn[i].ToString(), out result))
                return false;

        int sum = 0;
        for (int i = 0; i < 9; i++)
            sum += (i + 1) * int.Parse(isbn[i].ToString());

        int remainder = sum % 11;
        if (remainder == 10)
            return isbn[9] == 'X';
        else
            return isbn[9] == (char)('0' + remainder);
    }

1 个答案:

答案 0 :(得分:1)

听起来类CheckDigit是ISBN号的业务规则验证器。

在那种情况下:

public static class CheckDigit
{
    public static bool CheckIsbn(string isbn)
    { 
       //implementation as in your question.
    }
}

现在编写一个使用两个类的新应用程序(这里是一个控制台应用程序)。

class MyConsoleApp
{
    static void Main(string[] args)
    {
        //create a new instance of the ISBN/book class. you're prompted as part
        //of the constructor.
        isbn myFavoriteBook = new isbn();

        //new class contains the method for checking validity 
        bool isValid = CheckDigit.CheckIsbn(myFavoriteBook.GetIsbn());

        //write out the results of the validity.
        Console.WriteLine(string.Format("Your book {0} a valid ISBN", 
                                   isValid ? "has" : "doesn't have"));

        Console.ReadLine();
    }
}

以下是发生的事情:

  • 我们创建了一个新的isbn / book实例。它的构造函数有Console.Readline命令来询问用户输入。然后它将用户的条目存储到this.isbnNum
  • 我们的新静态类CheckDigit只是任何给定字符串的验证器。它确定发送的参数是否是有效的ISBN号。它将返回一个布尔。我们发送了isbn.GetIsbn(),这是用户输入的内容。
  • CheckIsbn()返回的bool很好地显示在控制台中的用户的句子中。

所以真的有2个主要类 - isbnCheckDigit。其他Main(string[] args)可以从您的代码中删除。

这是entire console app in one file。粘贴到您的应用程序中,您可以看到正在发生的事情。

这是您正在寻找的帮助吗?无论哪种方式,请留下评论,我们可以为您整理出来。

<强>更新

  • CheckIsbn实际上只做一件事 - 返回第9个字符是X还是其他数字。它不会像现在这样修改用户的ISBN。如果您想维护该格式(删除破折号,空格),以及修改输入ISBN,则可以将ISBN指定为out参数。

如果您想要用户输入的ISBN,请重新定义您的方法,以保留方法CheckIsbn内所做的任何更改:

public static bool CheckIsbn(out string isbn)