• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Các đề tài, cuộc thi, chủ đề chung của diễn đàn

Điều hành viên: Điều hành

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

[Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » CN 03/10/2010 3:58 pm

Chào các bạn,

Nhằm giúp làm sôi động thêm diễn đàn và góp phần giúp các bạn nâng cao kỹ năng lập trình cho các thành viên Câu lạc bộ VB, đặc biệt là VB.NET, mình quyết định mở một loạt các chủ đề về lập trình để các thành viên có thể thi đấu với nhau.

Mục đích: Giúp thành viên vận dụng kiến thức lập trình của mình để giải quyết những vấn đề thực tế do đề bài đưa ra, từ đó nâng cao kĩ năng.
Đối tượng: Tất cả thành viên diễn đàn, trừ BQT (Admin, SMOD, MOD). Advance Member được quyền tham gia. Tuy nhiên, Admin, SMOD, MOD vẫn có thể gửi đáp án để làm cơ sở nhận xét. Advance Member được tham gia, nhưng nếu có kết quả hòa giữa Advance Member và thành viên thường thì sẽ ưu tiên cho thành viên.
Quy định:
- Các bài giải sẽ được gửi cho MOD vo_minhdat2007 bằng chức năng nhắn tin của diễn đàn hoặc email vo_minhdat2007@yahoo.com.vn . Mục đích là để các bạn tự suy nghĩ ra cách giải tốt nhất đối với mình.
- Sau vài ngày, MOD sẽ đưa các bài giải của các bạn lên và nhận xét, chấm điểm và xếp hạng. Các bạn sẽ tiếp tục thảo luận nếu có giải pháp hay hơn, hoặc đưa ra các nhận xét. Vài ngày sau thì bắt đầu kì mới.
- Chú ý: Trong phần tính điểm có tính cả điểm xử lí tình huống lỗi, kể cả lỗi dữ liệu đầu vào!

Đáp án:
Mỗi đề bài đưa ra sẽ bao gồm yêu cầu, kèm theo 1 form mẫu (ở đây dùng VS2008, các bạn dùng bản cũ hơn thì xem cách downgrade ở box Thắc mắc VB.NET & C#) nếu các bạn không muốn thiết kế lại form. Khi gửi đáp án các bạn có 2 cách:
- Gửi cả project qua email hoặc chức năng nhắn tin (đã ghi ở mục trên).
- Chỉ gửi code bằng chức năng nhắn tin của diễn đàn, code được cho vào thẻ code tương ứng, và phải chạy được khi mình copy vào form mẫu đã post.

Giải thưởng:
Sau vài kì, mình sẽ tổng kết một lần, và có một phần quà nhỏ khuyến khích các bạn tham gia. Ngoài ra, các bạn sẽ được thể hiện và học hỏi kĩ năng thông qua cuộc thi, và BQT sẽ chú ý xem xét đưa các bạn giỏi vào các nhóm như Support, Advanced Member.




KÌ 4: MÁY ATM


Tình huống:

Hiện nay thì thẻ ATM là một dụng cụ vô cùng tiện lợi dành cho mọi người. Nếu một ngân hàng nhờ bạn lập trình một máy ATM, có chức năng giúp người dùng rút tiền một cách tiện lợi thì sao?

Yêu cầu:

Chương trình có giao diện như hình (các bạn tải project mẫu về hoặc tự thiết kế lại).

Hình ảnh


Khi nhấn nút Nhập, chương trình hiển thị 1 hộp thoại chọn tập tin (có định dạng KNLT). Tập tin có dạng như sau (tập tin tương ứng với dữ liệu hình ảnh ở trên):



Mỗi dòng tương ứng với một mệnh giá tiền (2 dòng khác nhau sẽ có mệnh giá khác nhau, không có 2 dòng cùng 1 mệnh giá). Giá trị đầu cho biết mệnh giá của tiền, và giá trị thứ 2 cho biết số tờ tiền trong máy còn. Nếu giá trị thứ 2 là 0 thì xem như có vô số tờ tiền mệnh giá này. Đưa ra danh sách các mệnh giá tiền như trong hình minh họa (nếu có vô số tờ tiền thì ghi kí tự ∞).

Sau đó, nhập số tiền cần rút (dữ liệu vào là kiểu số nguyên dương) và nhấn Tìm. Chương trình đưa ra cách rút tiền sao cho số tờ tiền phải nhận ra là ít nhất và có:

Hình ảnh


Ghi chú: Phải thêm vào dòng cuối: Tổng cộng số tờ. Nếu không thể đưa ra được cách rút thì ghi "Không có cách rút"

Chúc các bạn may mắn ;)




ĐÁP ÁN


Kì này có lẽ do diễn đàn bị sự cố giữa chừng nên số lượng bài thi chi dừng lại ở con số 2. Tuy nhiên, theo nhận xét thì chất lượng bài của 2 bạn lại tốt hơn so với các kì trước, một phần cũng do đề kì này tương đối dễ hơn!

Các test:

Hình ảnh
Hình ảnh
Hình ảnh
Hình ảnh
Hình ảnh

Xếp hạng:
1. lungocqua (8/10)
2. htpc (6/10)
Tập tin đính kèm
KNLT_Ki4_DapAn.rar
(62.64 KiB) Đã tải 617 lần



Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi lungocqua » CN 03/10/2010 5:02 pm

Sao Mod không gửi cái project mẫu lên? :-/
Cái đề này mình làm được mỗi cái kiểm tra. Cái nút tìm cũng không dễ tí nào. Có tính toán là nhấc cả đầu! ~X(
Sửa lần cuối bởi lungocqua vào ngày CN 03/10/2010 8:05 pm với 1 lần sửa.
Ta đã trở lại và quên hết tất cả! :D

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » CN 03/10/2010 6:11 pm

Ồ, xin lỗi :D Quên tai hại quá :P

htpc

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi htpc » CN 03/10/2010 10:27 pm

Cái này chắc thuộc loại đề dễ wá :D

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 12/10/2010 9:41 pm

Khởi động lại kì 4 nào, tiếp tục nhận bài của các bạn do forum bị lỗi thời gian qua :D

Ghi chú: các bạn dùng kiểu dữ liệu Long (Int64) trong bài làm nha :)

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 22/10/2010 5:33 pm

Bài của bạn htpc:

Code:

Form1

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10.  
  11. namespace KNLT_Ki4
  12. {
  13.     public partial class frmMain : Form
  14.     {
  15.         public ATM atm;
  16.  
  17.         public frmMain()
  18.         {
  19.             InitializeComponent();
  20.         }
  21.  
  22.         private void Button1_Click(object sender, EventArgs e)
  23.         {
  24.             try
  25.             {
  26.                 OpenFileDialog ofd = new OpenFileDialog();
  27.                 ofd.Filter = "Ki nang lap trinh (*.KNLT) | *.KNLT";
  28.                 if (ofd.ShowDialog() == DialogResult.OK)
  29.                 {
  30.                     atm = new ATM(File.ReadAllLines(ofd.FileName), lstNotes);
  31.                 }
  32.             }
  33.             catch
  34.             {
  35.                 lstNotes.Items.Clear();
  36.                 MessageBox.Show("Kiểm tra dữ liệu vào!");
  37.             }
  38.         }
  39.  
  40.         private void Button2_Click(object sender, EventArgs e)
  41.         {
  42.             try
  43.             {
  44.                 long n = Convert.ToInt64(TextBox1.Text);
  45.                 if (n < 0)
  46.                     throw new Exception();
  47.                 atm.Find(n, lstWithdraw);
  48.             }
  49.             catch
  50.             {
  51.                 MessageBox.Show("Kiểm tra dữ liệu vào!");
  52.             }
  53.         }
  54.  
  55.         private void frmMain_Load(object sender, EventArgs e)
  56.         {
  57.         }
  58.     }
  59. }
  60.  


ATM

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Windows.Forms;
  7.  
  8. namespace KNLT_Ki4
  9. {
  10.     public class ATM
  11.     {
  12.         Dictionary<long, long> notes;
  13.  
  14.         public ATM(string[] n, ListBox lb)
  15.         {            
  16.             notes = new Dictionary<long, long>();
  17.             lb.Items.Clear();
  18.  
  19.             foreach (string line in n)
  20.             {
  21.                 string[] s = line.Split(' ');
  22.                 string unlimit = (s[1] == "0") ? "∞" : s[1];
  23.                 lb.Items.Add(s[0] + " (" + unlimit + ")");
  24.                 notes.Add(Convert.ToInt64(s[0]), Convert.ToInt64(s[1]));
  25.             }            
  26.         }
  27.  
  28.         public void Find(long amount, ListBox lb)
  29.         {
  30.             Dictionary<long, long> temp = new Dictionary<long, long>(notes);
  31.             var items = from k in temp.Keys orderby k descending select k;
  32.             long total = 0, c = 0;
  33.             bool yn = false, CurrentUnLimited = false;
  34.  
  35.             lb.Items.Clear();
  36.  
  37.             long[] it = items.ToArray();
  38.  
  39.             for (long k = 0; k < it.Length; k++)
  40.             {
  41.                 yn = false;
  42.                 c = 0;
  43.                 CurrentUnLimited = false;
  44.  
  45.                 if (temp[it[k]] == 0)
  46.                     CurrentUnLimited = true;
  47.  
  48.                 while ((amount >= it[k]) && (amount > 0))
  49.                 {
  50.                     if (temp[it[k]] == 0 && !CurrentUnLimited)
  51.                         break;
  52.  
  53.                     if (!CurrentUnLimited)
  54.                         temp[it[k]] -= 1;
  55.  
  56.                     if ((k == it.Length - 2) && (amount % it[k] != 0))
  57.                         if (((amount - it[k]) % it[k + 1] != 0))
  58.                             break;
  59.  
  60.                     yn = true;
  61.                     amount -= it[k];
  62.                     total++;
  63.                     c++;
  64.                 }
  65.  
  66.                 if (yn)
  67.                 {
  68.                     lb.Items.Add(it[k].ToString() + " (" + c + ")");
  69.                 }
  70.             }
  71.             if (amount == 0)
  72.                 lb.Items.Add("Tổng cộng: " + total.ToString() + " tờ");
  73.             else
  74.             {
  75.                 lb.Items.Clear();
  76.                 lb.Items.Add("Không có cách rút");
  77.             }
  78.         }
  79.     }
  80. }
  81.  


Test:

Test 1: Sai (Đưa ra: 7 tờ 2)
Test 2: OK
Test 3: OK
Test 4: OK
Test 5: Sai (Đưa ra: không có cách rút)

Điểm: 3/5

Nhận xét:

Nhìn chung, bạn không đọc đề kĩ (hoặc không hiểu ý đề?), vì test 1 là test dễ nhất dùng để tránh mất điểm. Thuật toán của bạn dựa trên tính chia hết nên chạy tốt ở các test 3 và 4. Ngoài ra, bạn kiểm tra dữ liệu vào khá tốt!

Điểm: 3/5

Tổng cộng: 6/10

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 22/10/2010 5:33 pm

Bài của bạn lungocqua:

Code:

  1. Imports System.IO
  2. Public Class Form1
  3.     Dim cacmenhgiatien_soto As New Dictionary(Of Long, Long), cacmenhgia As New List(Of Long)
  4.  
  5.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.         Dim motep As New OpenFileDialog
  7.         motep.Title = "Mở một tệp Kĩ Năng Lập Trình"
  8.         motep.Filter = "Kĩ Năng Lập Trình|*.knlt|Toàn bộ tệp|*.*"
  9.         With motep
  10.             .FileName = ""
  11.             If .ShowDialog = Windows.Forms.DialogResult.OK Then
  12.                 Dim arr As New ArrayList
  13.                 If Path.GetExtension(.SafeFileName).ToLower = ".knlt" Or Path.GetExtension(.SafeFileName).ToLower = ".txt" Then
  14.                     Button2.Enabled = True
  15.                     'Xóa dữ liệu trên lstNotes đã thêm vào từ lần trước
  16.                     lstNotes.Items.Clear()
  17.                     arr.Clear()
  18.                     cacmenhgiatien_soto.Clear()
  19.                     cacmenhgia.Clear()
  20.                     'Cắt rời từng dòng và thêm vào mảng
  21.                     arr.AddRange(Split(My.Computer.FileSystem.ReadAllText(.FileName), vbNewLine))
  22.                     'Nếu tệp trống
  23.                     If arr.Count = 1 AndAlso arr(0).ToString.Trim = "" Then
  24.                         Button2.Enabled = False
  25.                         lstNotes.Items.Add("[Không tìm thấy dữ liệu]")
  26.                     Else
  27.                         For i As Long = 0 To arr.Count - 1
  28.                             Dim mon As New ArrayList
  29.                             mon.AddRange(Split(arr(i), " "))
  30.                             If mon.Count >= 2 Then
  31.                                 If (IsNumeric(mon(0)) AndAlso IsNumeric(mon(1))) AndAlso (Long.TryParse(mon(0), Long.MaxValue) AndAlso Long.TryParse(mon(1), Long.MaxValue)) AndAlso (mon(0) > 0 AndAlso mon(1) > -1) Then
  32.                                     'Kiểm tra mệnh giá các loại tiền
  33.                                     If cacmenhgiatien_soto.ContainsKey(mon(0)) = False Then
  34.                                         'Nếu mệnh giá chưa có trong danh sách thì sẽ được thêm vào danh sách
  35.                                         cacmenhgia.Add(mon(0))
  36.                                         cacmenhgiatien_soto.Add(mon(0), mon(1))
  37.                                         'Lấy số tờ lớn nhất của mỗi mệnh giá
  38.                                     ElseIf cacmenhgiatien_soto(mon(0)) <> 0 AndAlso cacmenhgiatien_soto(mon(0)) < mon(1) Or mon(1) = 0 Then
  39.                                         cacmenhgiatien_soto.Item(mon(0)) = mon(1)
  40.                                     End If
  41.                                 End If
  42.                             End If
  43.                         Next
  44.                     End If
  45.                     'Thêm dữ liệu lên lstNotes.
  46.                     For i As Long = 0 To cacmenhgiatien_soto.Count - 1
  47.                         'Nếu số tờ là 0 thì sẽ hiện là "∞".
  48.                         If cacmenhgiatien_soto(cacmenhgia(i)) = 0 Then
  49.                             lstNotes.Items.Add(cacmenhgia(i) & " (∞)")
  50.                         Else
  51.                             lstNotes.Items.Add(cacmenhgia(i) & " (" & cacmenhgiatien_soto(cacmenhgia(i)) & ")")
  52.                         End If
  53.                     Next
  54.                     If cacmenhgiatien_soto.Count > 0 Then
  55.                         TextBox1.Select()
  56.                     End If
  57.                 Else
  58.                     lstNotes.Items.Clear()
  59.                     Button2.Enabled = False
  60.                     lstNotes.Items.Add("[Dữ liệu không phù hợp]")
  61.                 End If
  62.             End If
  63.         End With
  64.     End Sub
  65.  
  66.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  67.         lstWithdraw.Items.Clear()
  68.         'Nếu chưa nhập kí tự
  69.         If Trim(TextBox1.Text).Length = 0 Then
  70.             lstWithdraw.Items.Add("Bạn chưa nhập số tiền cần rút!")
  71.             TextBox1.SelectAll()
  72.             TextBox1.Select()
  73.             Exit Sub
  74.         End If
  75.         'Nếu kí tự không phải là số
  76.         If IsNumeric(TextBox1.Text) = False Then
  77.             lstWithdraw.Items.Add("Bạn vui lòng nhập Số cho số tiền cần rút!")
  78.             TextBox1.SelectAll()
  79.             TextBox1.Select()
  80.             Exit Sub
  81.         End If
  82.         'Nếu như số quá lớn
  83.         If Val(TextBox1.Text) > Long.MaxValue Then
  84.             lstWithdraw.Items.Add("Số tiền bạn cần rút quá lớn")
  85.             lstWithdraw.Items.Add("nên không thể thực hiện được!")
  86.             TextBox1.Select()
  87.             Exit Sub
  88.         End If
  89.         'Nếu kí tự không phải là số nguyên dương
  90.         If Long.TryParse(TextBox1.Text, Nothing) = False Then
  91.             lstWithdraw.Items.Add("Số tiền bạn cần rút không hợp lệ")
  92.             lstWithdraw.Items.Add("Số tiền phải là số nguyên dương!")
  93.             TextBox1.SelectAll()
  94.             TextBox1.Select()
  95.             Exit Sub
  96.         End If
  97.         'Sắp xếp các phần tử trong biến cacmenhgia (chiều tăng dần)
  98.         cacmenhgia.Sort()
  99.         'Nếu số quá bé so với mệnh giá tiền thấp nhất
  100.         If Val(TextBox1.Text) < cacmenhgia(0) Then
  101.             For i As Long = 0 To cacmenhgia.Count - 1
  102.                 lstWithdraw.Items.Add(cacmenhgia(i) & " (0)")
  103.             Next
  104.             lstWithdraw.Items.Add("Tổng số: 0 tờ")
  105.             lstWithdraw.Items.Add("**********")
  106.             lstWithdraw.Items.Add("Tiền cần rút bé hơn mệnh giá thấp nhất")
  107.             lstWithdraw.Items.Add("hiện có nên không thể thực hiện được!")
  108.             TextBox1.Select()
  109.             Exit Sub
  110.         End If
  111.         'Tính tổng tiền, tổng tờ, và vô số tiền
  112.         Dim tongtien, tongto As Long, thieutien As Boolean
  113.         For n As Long = 0 To cacmenhgia.Count - 1
  114.             tongtien += cacmenhgia(n) * cacmenhgiatien_soto(cacmenhgia(n))
  115.             tongto += cacmenhgiatien_soto(cacmenhgia(n))
  116.             If cacmenhgiatien_soto(cacmenhgia(n)) = 0 Then
  117.                 thieutien = True
  118.             End If
  119.         Next
  120.         'Nếu tiền cần rút nhiều hơn tiền hiện có
  121.         If Val(TextBox1.Text) > tongtien AndAlso thieutien = False Then
  122.             lstWithdraw.Items.Add("Số tiền cần rút lớn hơn số tiền hiện có")
  123.             lstWithdraw.Items.Add("nên không thể đáp ứng được yêu cầu")
  124.             TextBox1.Select()
  125.             Exit Sub
  126.         End If
  127.         Dim tien_soto_serut As New Dictionary(Of Long, Long) 'Lưu mệnh giá tiền (mgt) +  Số tờ sẽ rút của mgt đó
  128.         Dim tien_serut As New List(Of Long) 'Lưu giữ các mgt sẽ rút
  129.         Dim tiencanrut As Long = Val(TextBox1.Text)
  130.         Dim ds As New List(Of Long) 'Lưu giữ danh sách tạm thời các mệnh giá tiền
  131.         ds.Clear()
  132.         'Sao chép danh sách từ biến cacmenhgia vào biến ds
  133.         ds.AddRange(cacmenhgia)
  134.         'Kiểm tra tcr so với mệnh giá tiền + Số tờ tiền hiên có của mgt đó
  135.         Do
  136.             ds.Sort()
  137.             'Duyệt từ phần tử trong biến ds
  138.             For i As Long = 0 To ds.Count - 1
  139.                 'Nếu giá trị của phần tử lớn hơn giá trị tiền cần rút (tcr) và tcr phải lớn hơn 0
  140.                 If ds(i) > tiencanrut AndAlso tiencanrut > 0 Then
  141.                     Dim menhgia As Long = ds(i - 1) '<-*
  142.                     'Lấy phần số nguyên mà sau khi tcr chia cho giá trị của phần tử đó
  143.                     Dim sodu As Long = (tiencanrut - (tiencanrut Mod menhgia)) / menhgia
  144.                     'Nếu số tờ của mgt là vô số
  145.                     If cacmenhgiatien_soto(menhgia) = 0 Then
  146.                         'Thêm vào danh sách mệnh giá tiền sẽ rút
  147.                         tien_serut.Add(menhgia)
  148.                         'Thêm vào số tờ sẽ rút của mgt đó
  149.                         tien_soto_serut.Add(menhgia, sodu)
  150.                         'Số tiền còn dư lại sau khi đã rút tổng mgt phía trên
  151.                         tiencanrut = tiencanrut - (menhgia * sodu)
  152.                         'Thoát vòng lặp For tiếp tục vòng lặp Do
  153.                         Exit For
  154.                     End If
  155.                     'Nếu số tờ của mgt đó là một số xác định
  156.                     If cacmenhgiatien_soto(menhgia) > 0 Then
  157.                         'Nếu phần nguyên của số tcr lớn hơn với tổng số tờ của mgt
  158.                         If sodu > cacmenhgiatien_soto(menhgia) Then
  159.                             tien_serut.Add(menhgia)
  160.                             'Thêm vào số tờ hiện có của mgt đó
  161.                             tien_soto_serut.Add(menhgia, cacmenhgiatien_soto(menhgia))
  162.                             'Số tiền còn dư sẽ bằng số tcr trừ đi tổng giá trị của mgt vừa thêm
  163.                             tiencanrut = tiencanrut - (tien_soto_serut(menhgia) * menhgia)
  164.                         End If
  165.                         'Nếu phần nguyên của số tcr bé hơn hoặc bằng với tổng số tờ của mgt
  166.                         If sodu <= cacmenhgiatien_soto(menhgia) Then
  167.                             tien_serut.Add(menhgia)
  168.                             tien_soto_serut.Add(menhgia, sodu)
  169.                             tiencanrut = tiencanrut - (menhgia * sodu)
  170.                         End If
  171.                         'Xóa mgt đã thêm vào danh tiền sẽ rút
  172.                         If ds.Contains(menhgia) Then
  173.                             ds.Remove(menhgia)
  174.                         End If
  175.                         Exit For
  176.                     End If
  177.                     Exit For
  178.                 End If
  179.                 'Nếu số tcr lớn hơn mệnh giá tiền lớn nhất hiện có
  180.                 If i = ds.Count - 1 AndAlso tiencanrut > 0 Then
  181.                     Dim menhgia As Long = ds(ds.Count - 1) '<-**
  182.                     Dim sodu As Long = (tiencanrut - (tiencanrut Mod menhgia)) / menhgia
  183.                     If cacmenhgiatien_soto(menhgia) = 0 Then
  184.                         tien_serut.Add(menhgia)
  185.                         tien_soto_serut.Add(menhgia, sodu)
  186.                         tiencanrut = tiencanrut - (menhgia * sodu)
  187.                         Exit For
  188.                     End If
  189.                     If cacmenhgiatien_soto(menhgia) > 0 Then
  190.                         If sodu > cacmenhgiatien_soto(menhgia) Then
  191.                             tien_serut.Add(menhgia)
  192.                             tien_soto_serut.Add(menhgia, cacmenhgiatien_soto(menhgia))
  193.                             tiencanrut = tiencanrut - (tien_soto_serut(menhgia) * menhgia)
  194.                         End If
  195.                         If sodu <= cacmenhgiatien_soto(menhgia) Then
  196.                             tien_serut.Add(menhgia)
  197.                             tien_soto_serut.Add(menhgia, sodu)
  198.                             tiencanrut = tiencanrut - (menhgia * sodu)
  199.                         End If
  200.                         If ds.Contains(menhgia) Then
  201.                             ds.Remove(menhgia)
  202.                         End If
  203.                         Exit For
  204.                     End If
  205.                     Exit For
  206.                 End If
  207.             Next
  208.             'Nếu tcr bằng 0 hoặc bé hơn mệnh giá tháp nhất của mgt hoặc tcr lớn hơn giá trị thấp nhất hiện có mà giá trị thấp nhất thì lại hết
  209.         Loop Until tiencanrut = 0 Or tiencanrut < cacmenhgia(0) Or tiencanrut >= cacmenhgia(0) AndAlso ds.Contains(cacmenhgia(0)) = False
  210.         tien_serut.Sort()
  211.         Dim soto, tongso As Long
  212.         'Thêm dữ liệu lên lstWithdraw
  213.         For i As Long = 0 To tien_serut.Count - 1
  214.             lstWithdraw.Items.Add(tien_serut(i) & " (" & tien_soto_serut(tien_serut(i)) & ")")
  215.             soto += tien_soto_serut(tien_serut(i))
  216.             tongso += tien_serut(i) * tien_soto_serut(tien_serut(i))
  217.         Next
  218.         lstWithdraw.Items.Add("Tổng số: " & soto & " tờ")
  219.         'Nếu số các mệnh giá tiền hiện có không đáp ứng được nhu cầu
  220.         If Val(TextBox1.Text) > tongso Then
  221.             Dim sodu As Long = Val(TextBox1.Text) - tongso
  222.             lstWithdraw.Items.Add("**********")
  223.             lstWithdraw.Items.Add("Chỉ đáp ứng được " & CDec(tongso / Val(TextBox1.Text) * 100) & "%")
  224.             lstWithdraw.Items.Add("so với nhu cầu tiền cần rút, tức là " & String.Format("{0:00,0}", tongso) & "đ")
  225.         End If
  226.         TextBox1.Select()
  227.     End Sub
  228.  
  229.     Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
  230.         If Button2.Enabled AndAlso e.KeyData = Keys.Enter Then
  231.             e.SuppressKeyPress = True
  232.             Button2_Click(Nothing, Nothing)
  233.         End If
  234.     End Sub
  235.  
  236.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  237.         Button2.Enabled = False
  238.     End Sub
  239.  
  240.     Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
  241.         lstNotes.SetBounds(lstNotes.Location.X, lstNotes.Location.Y, Me.Width - 38, Me.Height / 2 - 69)
  242.         Button1.SetBounds(Me.Width / 2 - 41.5, Me.Height / 2 - 38, Button1.Width, Button1.Height)
  243.         Label2.SetBounds(Me.Width / 2 - 120.5, Me.Height / 2 - 12, Label2.Width, Label2.Height)
  244.         TextBox1.SetBounds(Me.Width / 2 - 117.5, Me.Height / 2 + 4, TextBox1.Width, TextBox1.Height)
  245.         Button2.SetBounds(Me.Width / 2 - 41.5, Me.Height / 2 + 30, Button2.Width, Button2.Height)
  246.         lstWithdraw.SetBounds(lstWithdraw.Location.X, Me.Height / 2 + 59, Me.Width - 38, Me.Height / 2 - 108)
  247.     End Sub
  248. End Class


Test:

Test 1: OK
Test 2: Sai (vẫn nhập tập tin với 99 tờ 5)
Test 3: OK
Test 4: OK
Test 5: OK

Điểm: 4/5.

Nhận xét:

Nhìn chung, chương trình của bạn xét khá nhiều trường hợp và vì vậy, "bắt" được tất cả các test đưa ra. Lần này code của bạn rất tốt cả về hình thức lẫn kết quả. Nên cố gắng phát huy. Nhưng rất tiếc bạn không xét lỗi dữ liệu vào.

Điểm: 4/5.

Tổng cộng: 8/10.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 22/10/2010 5:33 pm

Đã cập nhật đáp án và kết quả. Mời các bạn thảo luận vài ngày trước khi có đề mới :)

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 4: Máy ATM

Gửi bàigửi bởi lungocqua » T.Sáu 22/10/2010 6:25 pm

Àh! Bài của mình thiếu là thiếu kiểm tra cái tập tin không hợp lệ đó hả? :D Tại mình có kiểm tra dòng nào của tập tin đó không hợp lệ thôi. Chứ không có kiểm tra dòng nào của tập tin đó mà không hợp lệ thì sẽ báo tập tin đó không hợp lệ luôn! :)
Ta đã trở lại và quên hết tất cả! :D


Quay về “Đề tài chung”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách