2016-09-18 3 views
2

이 코드에서는 2 권의 책을 추가하고 1 권과 2 권을 삭제하려고하면 1 호가 삭제되고 2 권은 삭제되지 않습니다. 다음에 3 권의 책을 추가하고 하나씩 삭제할 때 2 장을 삭제하면 1 장이 삭제되고 2 장과 3 장은 누락됩니다. 삭제되지 않은 책은 2 장과 4 장을 추가 할 때 삭제됩니다.C# 라이브러리 관리 콘솔 프로그램

내 코드 (나는 C#에서 초보자 해요, 그래서 나는 연수생 해요) 당신이 책을 제거 할 때 책이 더 이상 반영하지 IDS 있도록

using System; 
using System.Collections.Generic; 

namespace LibraryManagement 
{ 
    //Defining a class Book 
    class Book 
    { 
     public int bookId; 
     public string bookName; 
     public int bookPrice; 
     public int bookCount; 
     public int x; 
    } 
    //Defining a class Borrow 
    class BorrowDetails 
    { 
     public int userId; 
     public string userName; 
     public string userAddress; 
     public int borrowBookId; 
     public DateTime borrowDate; 
     public int borrowCount; 
    } 

    class Program 
    { 
     static List<Book> bookList = new List<Book>(); 
     static List<BorrowDetails> borrowList = new List<BorrowDetails>(); 
     static Book book = new Book(); 
     static BorrowDetails borrow = new BorrowDetails(); 

     //Password verfication and Menu 
     static void Main(string[] args) 
     { 
      Console.Write("Welcome !!!\nEnter your password :"); 
      string password = Console.ReadLine(); 

      if (password == "sync") 
      { 
       bool close = true; 
       while (close) 
       { 
        Console.WriteLine("\nMenu\n" + 
        "1)Add book\n" + 
        "2)Delete book\n" + 
        "3)Search book\n" + 
        "4)Borrow book\n" + 
        "5)Return book\n" + 
        "6)Close\n\n"); 
        Console.Write("Choose your option from menu :"); 

        int option = int.Parse(Console.ReadLine()); 

        if (option == 1) 
        { 
         GetBook(); 
        } 
        else if (option == 2) 
        { 
         RemoveBook(); 
        } 
        else if (option == 3) 
        { 
         SearchBook(); 
        } 
        else if (option == 4) 
        { 
         Borrow(); 
        } 
        else if (option == 5) 
        { 
         ReturnBook(); 
        } 
        else if (option == 6) 
        { 
         Console.WriteLine("Thank you"); 
         close = false; 
         break; 
        } 
        else 
        { 
         Console.WriteLine("Invalid option\nRetry !!!"); 
        } 
       } 
      } 
      else 
      { 
       Console.WriteLine("Invalid password"); 
      } 
      Console.ReadLine(); 
     } 

     //To add book details to the Library database 
     public static void GetBook() 
     { 
      Book book = new Book(); 
      Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1); 
      Console.Write("Book Name:"); 
      book.bookName = Console.ReadLine(); 
      Console.Write("Book Price:"); 
      book.bookPrice = int.Parse(Console.ReadLine()); 
      Console.Write("Number of Books:"); 
      book.x = book.bookCount = int.Parse(Console.ReadLine()); 
      bookList.Add(book); 
     } 

     //To delete book details from the Library database 
     public static void RemoveBook() 
     { 
      Book book = new Book(); 
      Console.Write("Enter Book id to be deleted : "); 

      int Del = int.Parse(Console.ReadLine()); 

      if (bookList.Exists(x => x.bookId == Del)) 
      { 
       bookList.RemoveAt(Del - 1); 
       Console.WriteLine("Book id - {0} has been deleted", Del); 
      } 
      else 
      { 
       Console.WriteLine("Invalid Book id"); 
      } 

      bookList.Add(book); 
     } 

     //To search book details from the Library database using Book id 
     public static void SearchBook() 
     { 
      Book book = new Book(); 
      Console.Write("Search by BOOK id :"); 
      int find = int.Parse(Console.ReadLine()); 

      if (bookList.Exists(x => x.bookId == find)) 
      { 
       foreach (Book searchId in bookList) 
       { 
        if (searchId.bookId == find) 
        { 
         Console.WriteLine("Book id :{0}\n" + 
         "Book name :{1}\n" + 
         "Book price :{2}\n" + 
         "Book Count :{3}", searchId.bookId, searchId.bookName, searchId.bookPrice, searchId.bookCount); 
        } 
       } 
      } 
      else 
      { 
       Console.WriteLine("Book id {0} not found", find); 
      } 
     } 

     //To borrow book details from the Library 
     public static void Borrow() 
     { 
      Book book = new Book(); 
      BorrowDetails borrow = new BorrowDetails(); 
      Console.WriteLine("User id : {0}", (borrow.userId = borrowList.Count + 1)); 
      Console.Write("Name :"); 

      borrow.userName = Console.ReadLine(); 

      Console.Write("Book id :"); 
      borrow.borrowBookId = int.Parse(Console.ReadLine()); 
      Console.Write("Number of Books : "); 
      borrow.borrowCount= int.Parse(Console.ReadLine()); 
      Console.Write("Address :"); 
      borrow.userAddress = Console.ReadLine(); 
      borrow.borrowDate = DateTime.Now; 
      Console.WriteLine("Date - {0} and Time - {1}", borrow.borrowDate.ToShortDateString(), borrow.borrowDate.ToShortTimeString()); 

      if (bookList.Exists(x => x.bookId == borrow.borrowBookId)) 
      { 
       foreach (Book searchId in bookList) 
       { 
        if (searchId.bookCount >= searchId.bookCount - borrow.borrowCount && searchId.bookCount - borrow.borrowCount >= 0) 
        { 
         if (searchId.bookId == borrow.borrowBookId) 
         { 
          searchId.bookCount = searchId.bookCount - borrow.borrowCount; 
          break; 
         } 
        } 
        else 
        { 
         Console.WriteLine("Only {0} books are found", searchId.bookCount); 
         break; 
        } 
       } 
      } 
      else 
      { 
       Console.WriteLine("Book id {0} not found", borrow.borrowBookId); 
      } 
      borrowList.Add(borrow); 
     } 

     //To return borrowed book to the library 
     public static void ReturnBook() 
     { 
      Book book = new Book(); 
      Console.WriteLine("Enter following details :"); 

      Console.Write("Book id : "); 
      int returnId = int.Parse(Console.ReadLine()); 

      Console.Write("Number of Books:"); 
      int returnCount = int.Parse(Console.ReadLine()); 

      if (bookList.Exists(y => y.bookId == returnId)) 
      { 
       foreach (Book addReturnBookCount in bookList) 
       { 
        if (addReturnBookCount.x >= returnCount + addReturnBookCount.bookCount) 
        { 
         if (addReturnBookCount.bookId == returnId) 
         { 
          addReturnBookCount.bookCount = addReturnBookCount.bookCount + returnCount; 
          break; 
         } 
        } 
        else 
        { 
         Console.WriteLine("Count exists the actual count"); 
         break; 
        } 
       } 
      } 
      else 
      { 
       Console.WriteLine("Book id {0} not found", returnId); 
      } 
     } 
    } 
} 

답변

0

문제는, 당신의 booklist가 다시 정렬되는 것을 그들이 당신을 추가했을 때의 위치. 예. bookList에는 2 권의 책 (bookList [0] 및 bookList [1])이 있습니다. 1 권의 책을 삭제하면 booklist [0]가 남게되므로 다음 책을 삭제하려고 할 때 (코드가 있으면 del -1을 사용하여 위치를 알 수 있음) 배열에서 삭제하려고합니다. bookList [1] 물론 존재하지 않습니다.

0

bookId 이상을 사용하여 개체의 고유 ID로 books을 제거해야합니다. 게시 된 코드는 책의 위치를 ​​사용하여 목록에서 코드를 제거합니다. bookId이있는 유일한 목적은 books의 숫자로 책을 식별 한 다음 코드를 사용하여 책을 신속하게 조작하는 것입니다.

어떤 식 으로든 도움이되는 객체 지향 프로그래밍 (OOP)에 대해 알려 드리겠습니다. 모든 개체는 세 가지 기능이 있습니다

  1. 신원

여기에 동작, 정체성 (을 선택하는 데 사용할 수있는 bookId 같은 독특한 무언가)는 것은입니다 당신은 객체의 위치가 아닌 객체 (책)를 조작해야합니다.

충분한 이론은, 코드

bookList.RemoveAt(Del - 1); 

에서 범인입니다. bookId을 기반으로 작동하도록 변경하면 문제가 해결됩니다.

주셔서 감사합니다 코드에서

0

당신은 ListArray 데이터 구조를 혼합하고 있습니다. 자세히 살펴 보겠습니다.

if (bookList.Exists(x => x.bookId == Del)) 

여기에서 책 목록의 반복 검색을 사용하고 있습니다. 우선, 추가 사전을 추가하면 더 빨리 처리 할 수 ​​있으므로 프로그램이 더 빨라집니다. 예상대로

bookList.RemoveAt(Del - 1); 

왜이 작동되지 않습니다 둘째,이 후,이 책의 id을 얻고,이 목록은 아니므로, 이전의 책을 제거 할 수 있지만 배열이다?그것은 당신이 세 권의 책을 추가 한 것을 말할 수, 간단하고 (화살표가 여기에 귀하의 목록에있는 책 사이의 링크입니다)처럼 목록 같습니다

1 --> 2 --> 3 

목록이 보이는 두 번째 책 삭제 후 :

1 --> 3 

다른 책을 추가하면 ID는 3과 같습니다. 때문에 (여기에 2 bookList.Count 같음)이 라인의 :

Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1); 

그래서 목록은 다음과 같습니다

1 --> 3 --> 3 

그래서 당신은 당신의 책에 대한 고유 식별을위한 추가 카운터를 유지해야합니다. 또 다른 한가지는 목록에서 쉽게 삭제할 수있는 RemoveAll, 목록에서 쉽게 검색 할 수있는 Find 등과 같이 사용할 수있는 추가 LINQ 메서드를 배워야한다는 것입니다. LINQ here에 대한 조언을 찾을 수 있습니다.

0

도서 ID에 문제가 있습니다. 올바른 책을 식별하려면 목록에서 고유해야합니다.

다음은 빠른 수정입니다.

프로젝트에 Linq에 네임 스페이스를 추가

using System.Linq; 

수정 GetBook() 메소드는 고유의 bookID로서을 생성하기 위해 목록에서 최대 책 ID 번호를 사용하여

var bookId = bookList.Count> 0 ? bookList.Max(b => b.bookId) : 0; 
Console.WriteLine("Book Id:{0}", book.bookId = bookId + 1);