Xây dựng lớp Queue không dùng Queue của collection dùng chứa đối tượng bất kỳ bằng mảng List hoặc ArrayList: - Hàm tạo, hàm tạo sao chép: khởi tạo Queue - Xây dựng các phương thức sau: E
Trang 1BÀI TẬP ÔN CHUYÊN ĐỀ CSHARP
-o0o -I N G ÔN N G Ữ L Ậ P TRÌ N H CS H A R P :
Bài 1 Xây dựng lớp Queue (không dùng Queue của collection) dùng chứa đối tượng bất kỳ bằng mảng
List<T> hoặc ArrayList:
- Hàm tạo, hàm tạo sao chép: khởi tạo Queue
- Xây dựng các phương thức sau:
Enqueue Thêm 1 phần tử vào đầu Queue
Dequeue Lấy 1 phần tử ở cuối ra khỏi Queue
PeakFront Lấy 1 phần tử ở đầu Queue
PeakRear Lấy 1 phần tử ở cuối Queue
IsEmpty Kiểm tra Queue rỗng
Hỗ trợ Queue sao cho có thể dùng lệnh for-each để duyệt toàn bộ Queue (kế thừ từ giao diện
IEnumerable)
class CQueue<T> : IEnumerable<T>
{
// khởi tạo danh sách kiểu đối tượng T
List<T> q = new List<T>();
// Thêm 1 phần tử vào đầu Queue
public void Enqueue(T a)
// Kiểm tra Queue rỗng
public bool IsEmpty()
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator()
Trang 2#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
//throw new NotImplementedException();
private string maSo;
private string hoTen;
private DateTime ngaySinh;
private LopHoc lopHoc;
…
}
class LopHoc
{
private string maLop;
private string tenKhoa;
private List <SinhVien> dsSinhVien;
… }
Giả sử có hàm Main được cài đặt như sau:
static void Main(string []args)
{
LopHoc lop1 = new LopHoc(“TM0101”,”CNTT”); LopHoc
Trang 3lop2 = new LopHoc(“MV0101”,”CNTT”);
lop1.themSinhVien(new SinhVien(“001”,”Nguyễn Văn A”,1989,2,18));
Kết quả xuất ra trong màn hình Console: (giả sử năm hiện tại của hệ thống là 2011)
Hãy cài đặt thêm để thỏa mãn hàm Main được khai báo như trên.
public class SinhVien
{
// khai bao cac bien thanh vien
private string maSo;
private string hoTen;
private DateTime ngaySinh;
private LopHoc lopHoc;
get { return maSo; }
set { maSo = value; }
}
public string HoTen // property cho HoTen
{
get { return hoTen; }
set { hoTen = value; }
}
public DateTime NgaySinh // property cho NgaySinh
{
get { return ngaySinh; }
set { ngaySinh = value; }
Trang 4set { lopHoc = value; }
// khai bao bien thanh vien
private string maLop;
private string tenKhoa;
private List<SinhVien> dsSinhVien = new List<SinhVien>();
// khoi tao constructor
// constructor sao chep
public LopHoc(string malop, string tenkhoa)
get { return maLop; }
set { maLop = value; }
}
public string TenKhoa // property ma lop
{
get { return tenKhoa; }
set { tenKhoa = value; }
Trang 5int i = 1;
foreach (SinhVien sv in dsSinhVien)
{
tmp = tmp + i + " " + sv.MaSo + " " + sv.HoTen + " " + sv.NgaySinh.ToString("dd/mm/yyyy") + " Tuoi: " + (DateTime.Today.Year - sv.NgaySinh.Year) + "\n";
LopHoc lop1 = new LopHoc("TM0101", "CNTT");
LopHoc lop2 = new LopHoc("MV0101", "CNTT");
lop1.themSinhVien(new SinhVien("001", "Nguyen Van A", 1989, 2, 18)); lop1.themSinhVien(new SinhVien("002", "Tran Thi B", 1989, 5, 2)); SinhVien sv = lop1.timSinhVien("002");
II WINDOWS FORM :
Bài 1: Cho chương trình Đặt báo được mô tả như hình 1, chứa biểu mẫu frmDatBao
Trang 6Hình 1 Giao diện biểu mẫu frmDatBao
Cho bảng mô tả các điều khiển trên frmDatBao
1 txtKhachHang TextBox Tên khách hàng đặt báo
2 txtDienThoai TextBox Điện thoại khách hàng
3 txtDiaChiNhan TextBox Địa chỉ nhận báo
4 cboLoaiBao ComboBox Danh sách các báo lựa chọn đặt
5 txtDonGia TextBox Giá báo tương ứng
7 datNgayBatDau DateTimePicker Ngày bắt đầu nhận báo
8 lvDanhSach ListView Danh sách báo chọn đặt
9 txtTongTien TextBox Tổng tiền các báo chọn đặt
10 btnDatBao Button Chức năng đặt báo
11 btnBoChon Button Chức năng bỏ chọn đặt báo
12 btnThoat Button Thoát chương trình
Biết bảng các phương thức xử lý sự kiện cho điều khiển trên frmDatBao:
1 txtKhachHang Validating txtKhachHang_Validating
2 txtDiaChiNhan Validating txtDiaChiNhan_Validating
3 txtDienThoai Validating txtDienThoai_Validating
4 txtSoKy Validating txtSoKy_Validating
6 cboLoaiBao SelectedIndexChanged cboLoaiBao_SelectedIndexChanged
Trang 710 frmDatBao FormClosing frmDatBao_FormClosing
* Khai báo lớp loại báo để phục vụ cho việc load cboLoaiBao:
public class LoaiBao
// lay property cho 2 thuoc tinh la tenBao va giaTien
public string TenBao
{
get { return tenBao; }
set { tenBao = value; }
}
public int GiaTien
{
get { return giaTien; }
set { giaTien = value; }
}
// override ToString de xuat ra theo y muon cua nguoi dung
public override string ToString()
{
return string.Format("{0}", TenBao);
}
}
a) Khi frmDatBao vừa mới hiển thị:
Khởi tạo giá trị cho cboLoaiBao chứa tên các báo với thông tin cho bên dưới: + Tuổi trẻ ngày 2700 Đ / kỳ
// dua du lieu vao cboLoaibao
cboLoaiBao.Items.Add(new LoaiBao("Tuoi tre ngay", 2700));
cboLoaiBao.Items.Add(new LoaiBao("Lam ban voi may tinh", 5400)); cboLoaiBao.Items.Add(new LoaiBao("PC Word (A)", 12000));
txtSoKy.Text = "1"; // khoi tao txtSoKy la 1
txtTongTien.Text = "0"; // khoi tao txtTongTien la 0
}
b) Khi chọn loại báo, hiển thị thông tin đơn giá tương ứng.
private void cboLoaiBao_SelectedIndexChanged(object sender, EventArgs e){
LoaiBao lb = (LoaiBao)cboLoaiBao.SelectedItem; // chon bao
// khi chon loai bao thi hien thi gia tien tuong ung
txtDonGia.Text = string.Format("{0} D", lb.GiaTien.ToString());}
Trang 8c) Thực hiện kiểm tra dữ liệu cho txtKhachHang, txtDiaChiNhan, txtDienThoai, txtSoKy theo mô
tả sau:
Tên khách hàng không được để trống.
Địa chỉ khách hàng không được để trống.
Số điện thoại không có ký tự khác ngoài ký số.
// đối với dạng số nhập vào fải >=0 thì dùng cách sau VD:
private void txtSoKi_Validating(object sender, CancelEventArgs e)
{
Trang 9int Int;
if (!int.TryParse(txtSoKi.Text, out Int))
MessageBox.Show("So ky phai la so nguyen");
MessageBox.Show("Điện thoại không được để trống và chỉ được nhập số!!",
"Thông báo lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
d) Khi nhấn vào nút Đặt báo:
Lấy thông tin đặt báo thêm vào lvDanhSach (Thành tiền = Đơn giá * Số kỳ).
// lay cot thu 4 la thanh tien ra
string thanhtien = lvDanhSach.Items[i].SubItems[4].Text.ToString(); // cat chuoi thanhtien dua vao mang chuoi x va cat nhau boi dau ' ' string []x = thanhtien.Split(' ');
// gan phan tu x[0] la giaTien vao chuoi tien
Trang 10// gan phan tu s[0] la gia tien dua vao chuoi gia
string gia = s[0];
// gan phan tu s[1] la don vi tien (' D') dua vao chuoi don vi
string donvi = s[1];
// cong thuc tinh thanh tien trong lvDanhSach
int Tien = int.Parse(txtSoKy.Text) * int.Parse(gia);
// dua thong tin vao lvDanhSach
ListViewItem item = new ListViewItem();
// cap nhat lai txtTongTien
txtTongTien.Text = string.Format("{0} D", TinhTien().ToString());
if (lvDanhSach.Items.Count == 0) // if trong lvDanhSach k con gi
MessageBox.Show("Khong con gi de xoa");
else if (lvDanhSach.SelectedIndices.Count == 0) // chua chon gi trong lvDanhSach MessageBox.Show("Chua chon sao xoa");
else
{
// xuat thong bao co muon xoa k
DialogResult xoa = MessageBox.Show("Ban co muon xoa khong?", "Thong bao",
// cap nhat lai txtTongTien
txtTongTien.Text = string.Format("{0} D", TinhTien().ToString());
}
}
}
f) Khi nhấn nút Thoát hay đóng chương trình: hiển thị xác nhận người dùng muốn đóng chương
trình Nếu đồng ý, thực hiện đóng biểu mẫu frmDatBao
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Ban co muon thoat khong?", "Thong bao",
MessageBoxButtons.YesNo) == DialogResult.Yes)
Trang 11KhachHang nvarchar(100) Tên khách hàng
LienLac nvarchar(255) Địa chỉ liên lạc
Bảng ChiTietHoaDon
M
Anh (chị) hãy thực hiện viết đoạn mã theo yêu cầu sau:
a Kết nối tới cơ sở dữ liệu BanHangDB, giả sử Server là SQLEXPRESS, chạy tại máy cục bộ.
b Giả sử có ComboBox cboMaHD, đưa dữ liệu MaHD trong bảng HoaDon vào cboMaHD.
c Giả sử có thêm TextBox txtLienLac, txtKhachHang, DateTimePicker NgayLap, hiển thị dữ liệu tương ứng với Mã hóa đơn chọn trong cboMaHD.
d Giả sử có thêm DataGridView dgBanHang, đưa dữ liệu trong bảng ChiTietHoaDon tương ứng với Mã hóa đơn chọn trong cboMaHD vào dgBanHang (có thêm cột Thành tiền = Số lượng *
Đơn giá).
* Khai báo:
using System.Data.SqlClient;
private SqlConnection m_cnn = null;
private SqlDataAdapter m_da_hd = null;
private DataSet m_ds = null;
private string sql = "select * from HoaDon";
private string sql1 = "select MatHang, MaHD, SoLuong, DonGia, SoLuong*DonGia as ThanhTien from ChiTietHoaDon";
// tao cau noim_cnn = new SqlConnection(cnnStr);
// mo ket noim_cnn.Open();
// kiem tra ket noi
if (m_cnn.State == ConnectionState.Open)
MessageBox.Show("Ket noi thanh cong");
}
catch(Exception ee)
{
if (m_cnn.State == ConnectionState.Closed)
MessageBox.Show("Ket noi that bai");
else
Trang 12// khoi tao data adapter
m_da_hd = new SqlDataAdapter(sql, m_cnn);
// do du lieu vao data set
m_da_hd.Fill(m_ds, "HoaDon");
// luu lai / tra ve data set bang Hoa don
return m_ds.Tables["HoaDon"];
// khoi tao data adapter
m_da_hd = new SqlDataAdapter(sql, m_cnn);
// do du lieu vao data set
dtpNgayLap.DataBindings.Add("Value", m_ds.Tables["HoaDon"], "NgayLap");
// luu lai / tra ve data set bang Hoa don
return m_ds.Tables["HoaDon"];
Trang 13// chon hien thi du lieu truong MaHD
// khoi tao data adapter
m_da_hd = new SqlDataAdapter("select MatHang, MaHD, SoLuong, DonGia,
SoLuong*DonGia as ThanhTien from ChiTietHoaDon where MaHD = '"+s+ "'", m_cnn);
// do du lieu vao data set
Bài 2 Giả sử có các lớp lưu trữ dữ liệu về quản lý nhân khẩu:
HoKhau
public string MaHoKhau { get; set; } Mã hộ khẩu public string ChuHo { get; set; } Mã chủ hộ, tham chiếu nhân khẩu public string DiaChi { get; set; } Địa chỉ hộ khẩu
public string CMND {get;set} Chứng minh nhân dân public string MaHoKhau { get; set; } Hộ khẩu thường trú DataContext public List<HoKhau> ListHK{ get; set; } Danh sách hộ khẩu
public List<NhanKhau> ListNK{ get; set; } Danh sách nhân khẩu
a Viết phương thức đọc dữ liệu trong DataContext: public static DataContext DocDuLieu(); để nạp dữ liệu trong cơ sở dữ liệu NhanKhauDB, giả sử Server là SQLEXPRESS, chạy tại máy cục
bộ với lược đồ dữ liệu:
HoKhau (MaHoKhau, ChuHo, DiaChi)
NhanKhau (MaNK, TenNK, NgaySinh, GioiTinh, LoaiCuTru, CMND, Ma H oKh a u )
FrmQLNK dùng để cho biết thông tin của Nhân khẩu tại địa phương có giao diện sau:
Trang 14Các điều khiển chính của FrmQLNK:
STT Tên đối tượng Kiểu đối tượng
Trong FrmQLNK đã định nghĩa biến sau:
Khai báo:
class HoKhau
{
// khai bao cac bien
private string maHoKhau;
Trang 15private string diaChi;
private string chuHo;
// thiet lap property cho cac thuoc tinh cua cac bien public string MaHoKhau
{
get { return maHoKhau; }
set { maHoKhau = value; }
}
public string ChuHo
{
get { return chuHo; }
set { chuHo = value; }
}
public string DiaChi
{
get { return diaChi; }
set { diaChi = value; }
}
}
class NhanKhau
{
// khai bao cac bien
private string maNhanKhau;
private string tenNhanKhau;
private DateTime ngaySinh;
private bool gioiTinh;
private string loaiCuTru;
private string cMND;
private string maHoKhau;
// thiet lap property cho cac thuoc tinh cua cac bien public string MaNhanKhau
{
get { return maNhanKhau; }
set { maNhanKhau = value; }
}
public string TenNhanKhau
{
get { return tenNhanKhau; }
set { tenNhanKhau = value; }
}
public DateTime NgaySinh
{
get { return ngaySinh; }
set { ngaySinh = value; }
}
public bool GioiTinh
{
get { return gioiTinh; }
set { gioiTinh = value; }
}
public string LoaiCuTru
{
get { return loaiCuTru; }
set { loaiCuTru = value; }
Trang 16public string MaHoKhau
{
get { return maHoKhau; }
set { maHoKhau = value; }
}
}
class DataContext
{
// khai bao cac bien
private List<HoKhau> listHoKhau;
private List<NhanKhau> listNhanKhau;
// thiet lap property cho cac thuoc tinh cua cac bien
public List<HoKhau> ListHoKhau
{
get { return listHoKhau; }
set { listHoKhau = value; }
}
public List<NhanKhau> ListNhanKhau
{
get { return listNhanKhau; }
set { listNhanKhau = value; }
// tao chuoi ket noi
string cnn_Str = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath; // tao cau noi
OleDbConnection m_cnn = new OleDbConnection(cnn_Str);
// mo ket noi
m_cnn.Open();
// kiem tra ket noi
if (m_cnn.State == ConnectionState.Open)
MessageBox.Show("Ket noi thanh cong");
// khoi tao cac doi tuong
DataContext datacontext_tmp = new DataContext();
List<HoKhau> hk_tmp = new List<HoKhau>();
List<NhanKhau> nk_tmp = new List<NhanKhau>();
string query = "SELECT * FROM HoKhau";
OleDbCommand cmd = new OleDbCommand(query, m_cnn);
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read()) // trong khi con doc duoc
{
// tao bien tam de luu
HoKhau hokhau_tmp = new HoKhau();
// lay du lieu dua vao tung cot, khi lay ve phai ep kieu tuong ung
hokhau_tmp.MaHoKhau = (string)dr["MaHoKhau"];
hokhau_tmp.ChuHo = (string)dr["ChuHo"];
hokhau_tmp.DiaChi = (string)dr["DiaChi"];
// dua du lieu vao list<HoKhau> hk_tmp
hk_tmp.Add(hokhau_tmp);
}
query = "SELECT * FROM NhanKhau";
cmd = new OleDbCommand(query, m_cnn);
Trang 17dr = cmd.ExecuteReader();
while (dr.Read()) // trong khi con doc duoc
{
// tao bien tam List<NhanKhau> nk_tmp
NhanKhau nhankhau_tmp = new NhanKhau();
// lay du lieu dua vao tung cot, khi lay ve phai ep kieu tuong ung
nhankhau_tmp.MaNhanKhau = (string)dr["MaNhanKhau"];
nhankhau_tmp.TenNhanKhau = (string)dr["TenNhanKhau"];
nhankhau_tmp.NgaySinh = (DateTime)dr["NgaySinh"];
nhankhau_tmp.LoaiCuTru = (string)dr["LoaiCuTru"];
nhankhau_tmp.CMND = (string)dr["CMND"];
nhankhau_tmp.MaHoKhau = (string)dr["MaHoKhau"];
nhankhau_tmp.GioiTinh = (bool)dr["GioiTinh"];
// dua du lieu vao List<NhanKhau> nk_tmp
OpenFileDialog open = new OpenFileDialog();
open.Title = "Chon du lieu";
// mo hop thoai
open.ShowDialog();
filepath = open.FileName;
// goi ham doc du lieu
m_data = DataContext.DocDuLieu();
List<HoKhau> hk_tmp = m_data.ListHoKhau;
// duyet cac phan tu trong ho khau
foreach (HoKhau hokhau in hk_tmp)
b) Khi chọn một hộ khẩu trong danh sách hộ khẩu, hiển thị danh sách các nhân khẩu trong hộ khẩu đó,
và thông tin hộ khẩu
private void lvHoKhau_SelectedIndexChanged(object sender, EventArgs e)
{
int index = lvHoKhau.SelectedIndices.Count;
if (index > 1)