Tài liệu gồm 2 phần lý thuyết và bài tập lý thuyết các câu hỏi chính yếu trong nội dung học môn lập trình hướng đối tượng bài tập có nhiều dạng về sửa sai các code, viết hàm thuật toán cho Main chạy được, hay xây dựng nguyên một lớp theo đề bài cho.
1 ÔN TẬP THI GIỮA KỲ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (Lớp DHTH) Nguyễn Thị Bích Ngân I. LÝ THUYẾT - Chương 2: Các thành phần cơ sở của C# + Các kiểu dữ liệu. + Thành phần biến, hằng. + Cú pháp các câu lệnh cơ bản. + Toán tử. + Xử lý chuỗi. + Mảng: mảng 1 chiều, 2 chiều, mảng răng cưa và mảng động. - Chương 3: Lớp và đối tượng. + Phân biệt lớp và đối tượng. + Cú pháp xây dựng lớp. + Các loại phương thức có thể tạo khi xây dựng lớp. Ý nghĩa, cú pháp từng loại phương thức. + Ý nghĩa các quyền truy xuất thuộc tính và phương thức trong lớp. + Các thành phần tĩnh (static). + Hàm chồng (overloading) + Nạp chồng toán tử (operator) Một số câu hỏi ôn tập: 1. Trình bày một số đặc điểm của phương thức khởi tạo. Cho ví dụ. 2. Trình bày một số đặc điểm của các thuộc tính trong lớp. Cho ví dụ. 3. Trình bày khái niệm overload (hàm chồng). Cho ví dụ minh họa. 4. Trình bày khái niệm và nêu cú pháp operator (chồng toán tử). Cho ví dụ minh họa. 5. Phân biệt các từ khóa chỉ phạm vi truy xuất sau: public, private, protected. Từ khóa public, private thường được dùng để khai báo thành phần nào của lớp. 6. Cấu trúc của một lớp (class) trong lập trình hướng đối tượng gồm mấy phần? Nêu vài trò của từng phần. 7. Nêu 5 loại ứng dụng của lập trình hướng đối tượng. 8. Trình bày một số đặc điểm của thuộc tính và phương thức static. 9. Nêu ý nghĩa là cú pháp của thuộc tính truy cập (get/set). 10. Nêu ý nghĩa và cú pháp của hàm hủy (destructor). II. BÀI TẬP Bài 1. Xem xét các đoạn code sau, nếu có lỗi thì chữa cho đúng. a) Đoạn code 1. string[] students = new string[3]; students[1] = “Hung";students[2] = “Lan";student [3] = “Nga"; int[] a = new int [3]{3,6,8,31}; b) Đoạn code 2. class PhanSo { 2 int tu, mau; public int Tu (){ get{ return tu; } set{ tu = value; }} public static int Mau () { get{ return mau; } set{ mau = value; } } public void PhanSo (int tu, int mau){ this.Tu = tu; this.Mau = mau; } public PhanSo 2phanSoCong (PhanSo &y){ return new phanso (this.Tu * y.Mau + this.Mau * y.Tu, this.Mau * y.Mau); }} c) Đoạn code 3. public PhanSo operator/(PhanSo a, Phanso b) { Phanso kq = new phanso(0,0); kq.tu = a.Tu*b.Mau; kq.mau = a.Mau*b.Tu; return kq;} public bool operator > (PhanSo a, Phanso b) { return a.Tu*b.Mau>b.Tu * a.Mau;} d) Đoạn code 4 class Test { public int t = 15; } static void Main(string[] args) { ArrayList a = new ArrayList(); a.Add("Main"); a.Add('a'); a.AddRange(5); a.Add(DateTime.Now); Test t = new Test(10); a.Add(t); foreach (int i = 0; i < a.Count; i++)//(int i in a) if ((Test)a[i] is Test) Console.writeLine("a[i]: {0}", ((Test)a[i]).T); else Console.writeLine("a[i]: {0}", a[i]); } e) Đoạn code 5. class C_Time { int hour; int minute; int second; public int Hour { get { hour = value; set return hour; } } public int Minute { get { value = minute; set return value; } } public int Second { get { value = second; set return second; } } } f) Đoạn code 6 class C_Time { //… tiếp đoạn code 5 static public int doiRaGiay () { return this.second + this.minute *60 + this.hour*3600; } static private void doiRaGiay_c2 (C_Time t) { return t.Second + t.Minute*60 + t.Hour*3600; } //… 3 } g) Đoạn code 7 using namespace System; public class Person () { string ten, dc=“Khong co”; } public Person(string Ten) { this.ten = Ten; dc =””;} Public void Person(string Ten,out string dc) { this.ten = Ten; this.dc = dc; } public void SayName() { Console.WriteLine(“Ht: {1:0} Dc {2:000}",Ten,dc); } } h) Đoạn code 8. public class HoaDon { string tenKH; static float tongTien; // public static int tongSoHD; public static float tongHD; public void HoaDon(string ten, int tien) {tenKH = ten; tongTien = tien; tongSoHD++; tongHD +=tien;} public void xuatTTHD () { Console.ReadLine(" Ten KH: “ + tenKH + “ Tong tien; {1}”,tongtien); } static public void thongKe(int tongsoHD, float tongHD) { Console.ReadLine(" Tong so HD: {0}",tongSoHD); Console.ReadLine(" Tong tien cac HD: {0}",tongHD); } } static void Main(string[] args) { HoaDon a = new HoaDon("Nguyen",345F); a.xuatTTHD(); HoaDon.thongKe(a.tongSoHD, a.tongHD); } i) Đoạn code 9 public class @Person { static public string ten; static public string dchi = ”Khong co”; public Person() { this.ten = hoten; } public void Person(string Ten, string dc) { this.ten = Ten; this.dc = dc; } public string @Person(Person a) { this.ten = a.Ten; this.dchi = a.Dchi; } public void SayName() { Console.WriteLine(“Ht: {1} Dc {2}",ten,dchi); } } j) Đoạn code 10. public static class KeywordTestClass () { static string KeyName = ""; 4 string KeyID = ""; public static void KeywordTestClass() { KeyName = "KeywordTest"; } public static string GetKeyName() { return KeyName; } public string GetID() { return KeyID; } } k) Đoạn code 11 (bổ sung phần còn thiếu) class Diem3D{ private static int x, y, z; public int X{ get { return x; } set { x = value; } } public int Y{ get{ return y; } set{ y = value; } } public int Z{ get{ return z; }set{ z = value; } } public Diem3D (){ x = y = z = 0; } public Diem3D (int x, int y, int z){ this.X = x; this.Y = y; this.Z = z; } public Diem3D (Diem3D p){ X = p.x; y = p.Y; Z = p.Z; } } l) Đoạn code 12. class Program { static void Main(string[] args) { int a = 10; int b=6; counter_2(ref a, ref b); Console.WriteLine("a sau khi khoi ham 2 {0} \n b sau khi khoi ham 2 : {0}", a, b); counter_1(out a, out b); Console.WriteLine("a sau khi khoi ham 1 {1} \n b sau khi khoi ham 1 : {1}", a, b); Console.ReadLine(); } static int counter_1(int a, out int b) { b = 20; a += b; } void counter_2(int a, int ref b) { b = 50; a++; b ; } } m) Đoạn code 13. class Program { static void Main(string[] args) { int x ; int y; counter_1(ref int x, out int y); Console.WriteLine("x sau khi khoi ham 1 {0} \ n y sau khi khoi ham 1 : {1}", x, y); counter_2(ref x, out y); 5 Console.WriteLine("x sau khi khoi ham 2 {0} \ n y sau khi khoi ham 2 : {1}", x, y); Console.ReadLine(); } static int function1 (ref int a, out int b) { b = 20; a += b; } static void funtion2 (out int a, ref int b) { a++; b ; } } n) Đoạn code 14 using System; public class Date { private int Year; private int Month; private int Day; public void Display( ) { Console.Write("{0}/{1}/{2}", Day, Month, Year); } public Date(1900,1,1) { Console.WriteLine("Constructor khong tham so!"); Year = 1900; Month = 1; Day = 1; } // constructors with DateTime argument public Date(System.DateTime dt) { Console.WriteLine("Constructor voi tham so la mot doi tuong DateTime!"); Year = this.Year; Month = this.Month; Day = this.Day; } // constructors with 3 int arguments public Date(int D, int M, int Y) { Console.WriteLine("Constructor co 3 tham so!"); this.Year = Y; this.Month = M; this.Day = D; } // copy constructors public Date(Date ExistingDate) { Console.WriteLine("Copy constructor!"); Year = ExistingDate.Year; Month = ExistingDate.Month; Day = ExistingDate.Day; } } class DateOverLoadConstructorApp { static void Main(string[] args) { System.DateTime currentTime = System.DateTime.Now; Date t1 = new Date();// t1 = 1/1/1900 Console.Write("t1: {0}"); t1 = t1.Display(); Date t2 = new Date(30, 4, 2000); Console.Write("t2: {0}"); t2.Display( ); Date t3 = new Date(currentTime); Console.Write("t3: {0}", t3.Display( )); 6 Date t4 = new Date(t3); Console.Write("t4: {0}"); t4=Display(t4); } } o) Đoạn code 15. class Program () { public void Main(string[] args) { int[] n = new int[3] ( 20, 30, 50, 60 ); khong_dung_Params(params n); } static void khong_dung_Params(int[3] n) { Console.WriteLine("Mảng trước khi công: "); foreach (int i=0; i<n.Length; i++) Console.WriteLine("{0} ", i); // cong them moi phan tu 1 don vi for (int i in n) n[i]++; Console.WriteLine("Mảng sau khi công"); foreach (int i=0; i<n.Length; i++) Console.WriteLine("{1} ", i); } } Bài 2. Xây dựng lớp hình chữ nhật có các thành phần sau: - Các thuộc tính mô tả chiều dài, chiều rộng. - 3 hàm khởi tạo: không có và có tham số. - Hàm tính chu vi. - Hàm tính diện tích. - Hàm tính đường chéo. - Hàm nhập/xuất thong tin hình chữ nhật. - Hàm thay đổi kích thước hình chữ nhật (overload): + void changeSize (int tx, int ty); //kích thước HCN tăng lên them tx và ty. + void changeSize (CRectangle a); // kich thước HCN cộng thêm kích thước HCN a. - Viết chương trình nhập vào kích thước 1 HCN, xuất ra chu vi, diện tích và đường chéo. - Nhập vào các kích thước để thay đổi HCN Bài 3. Xây dựng lớp Time chứa các thành phần sau: - Các thuộc tính giờ, phút, giây. - 3 hàm khởi tạo. - Nhập/xuất thời gian theo dạng 24 giờ. - Nhập/xuất thời gian theo dạng 12 giờ (AM và PM). - Hàm kiểm tra giờ có hợp lệ không? - Viết hàm tăng/giảm giờ (overload): + void tanggio (int sogiay); tăng giờ thông thường theo 24h 7 + void tanggio (int sogiay, string kieuGio); kết quả ra dạng giờ 24 tiếng nếu kiểu giờ là 24, kết quả dạng 12 tiếng kèm AM/PM nếu kiểu giờ là 12. + tương tự cho hàm giảm giờ. - Viết các operator: +, - , , ++, >=,<=,==,!= - Viết chương trình nhập/xuất giờ (24/12 tiếng), nhớ có kiểm tra dữ liệu nhập vào phải hợp lệ. - Nhập thời gian để tăng giảm giờ. Bài 4. Xây dựng lớp chứa thông tin của các vận động viên chạy đua trong 1 cuộc đua, gồm những thuộc tính và thành phần sau: - Mã số, họ tên, số áo, thời gian bắt đầu, thời gian kết thúc, thành tích (số giờ chạy). - 3 hàm khởi tạo. - Hàm nhập/xuất thông tin. - Hàm tính thành tích. - Hàm kiểm tra thời gian nhập vào bắt đầu và kết thúc có hợp lệ không? - Hàm chuyển giờ về dạng hợp lệ (số phút và giây về dạng <60) Ví dụ: 00:3:85 00:4:25 - Viết chương trình nhập/xuất thông tin vận động viên. Lưu ý: không nhập thành tích vì thuộc tính này lấy kết quả từ thời gian bắt đầu và kết thúc. Bài 5. Xây dựng lớp phân số, trong đó lớp phân số chứa các thuộc tính và phương thức: - thuộc tính tử số, mẫu số (cần kiểm tra đầu vào mẫu phải khác 0). - 3 phương thức khởi tạo. - phương thức nhập/xuất thông tin phân số - rút gọn phân số - Các hàm: cộng, trừ, nhân, chia, so sánh 2 phân số. - Các operator: + - * / , >, <, >=, <=, ==, !=, ép kiểu số nguyên sang phân số, phân số thành số nguyên. Viết chương trình nhập/xuất thông tin và gọi các hàm đã viết. Bài 6.Hãy viết chương trình xây dựng lớp Diem3D trong hệ tọa độ Oxyz. Trong đó, lớp Diem3D được xây dựng như sau: - 3 tọa độ x,y, z xác định 1 điểm trên hệ tọa độ Oxyz cùng các biến thành viên. - 3 phương thức khởi dựng lần lượt là phương thức khởi dựng không tham số, phương thức khởi dựng 1 tham số và phương thức khởi dựng 3 tham số. - 1 phương thức tính khoảng cách 2 điểm trong hệ họa độ Oxyz theo công thức sau: 222 )()()( BABABA zzyyxx Bài 7. Hãy xây dựng lớp phân số sao cho hàm main chạy được: 8 static void Main(string[] args) { PhanSo x= new PhanSo (3,4); PhanSo y = new PhanSo (4); PhanSo z = new PhanSo(); X = x + 5; z = x.Cong(y); //z là tong của 2 phân số x,y. PhanSo u=new PhanSo(24,16); u=x-5; u +=3; u=u*7; u/=8 u.XuatPS(); PhanSo y = new PhanSo (); y = x.ToiGian(); // z là kết quả tối giản của phân số x. Console.WriteLine(“Ket qua toi gian la: ”); u.XuatPS(); } Bài 8. Hãy xây dựng lớp CTime sao cho hàm main chạy được như sau: static void Main(string[] args) { CTime x= new CTime (2, 35, 20) ; CTime y= new CTime (0, 40, 55) ; int t = 25; //số giây CTime u = new CTime(0,0,0 ); CTime v = new CTime(0,0,0 ); u = x.tangGio (y); //tính tổng thời gian của x và y. v = x.tangGio (t); //tính tổng thời gian của x và t. } Bài 9. Xây dựng lớp Date sao cho hàm main chạy được như sau: static void Main(string[] args) { CDate x= new CDate (22, 12, 2013) ; CDate y= new CDate (31, 4, 2012) ; x.kiemTraNgayHopLe(); //kết quả x hợp lệ y.kiemTraNgayHopLe();//kết quả y không hợp lệ } Bài 10. Hãy xây dựng lớp TamGiac chứa các thuộc tính và phương thức sau: Cho lớp Point: class Point{ private int x, y, z; public int X{get{}set{}} public int Y{get{}set{}} public int Z{get{}set{}} public Point(){} public Point(int x, int y, int z){} public Point(Point p){} public float KC(Point p1){}//phương thức tính khoảng cách 2 điểm } - 3 điểm A, B, C kiểu Point là 3 đỉnh của tam giác. 9 - 1 phương thức khởi tạo có 3 tham số là giá trị của 3 đỉnh. - 1 phương thức chu vi tam giác. Bài 11. Cho lớp điểm với các phương thức được xây dựng sẵn như sau: class Point{ private int x, y, z; public int X{get{}set{}} public int Y{get{}set{}} public int Z{get{}set{}} public Point(){} public Point(int x, int y, int z){} public Point(Point p){} public float KC(Point p1){}//phương thức tính khoảng cách 2 điểm } class HinhTron{ Point a, b; //AB là đường kính hình tròn public static float PI=3.14; public Point A{get{}set{}} public Point B{get{}set{}} public HinhTron(){} public HinhTron(Point a, Point b){} public HinhTron(HinhTron x){} public float CV(){}//phương thức tính chu vi hình tròn public float DT(){}//phương thức tính diện tích hình tròn } Hãy viết chương trình xây dựng lớp hình nón trên hệ tọa độ đề-các Oxyz. Trong đó, lớp hình nón được xây dựng như sau: - 1 thuộc tính hình tròn và 1 điểm point (là đỉnh của hình nón) - 3 phương thức khởi dựng lần lượt là phương thức khởi dựng không tham số, phương thức khởi dựng 1 tham số và phương thức khởi dựng 2 tham số. - 1 phương thức tính diện tích xung quanh hình nón. (gợi ý bằng:(chu vi đáy chia 2) nhân với đường sinh. Trong đó, đường sinh là khoảng cách từ đỉnh hình nón tới 1 điểm point nằm trên đường viền hình tròn. Bài 12. Hãy xây dựng lớp Nhân Viên sao cho hàm main chạy được: void main(){ NV a = new NV (“Le Van A”, “NV01”, 29); /* Nhân viên Lê Văn A có mã số NV01, số ngày được chấm công trong tháng là 29 ngày.*/ Console.WriteLine (“Ket qua xep loai thi dua cua {0} la {1} : “, a.Hoten, a.XepLoai); /* Kết quả xếp loại thi đua dựa thi đua dựa vào qui đinh: - Số ngày công >26 : loại A - 26 > = Số ngày công > = 22 : loại B - Số ngày công <22 : loại C */ 10 a.xuatTTNV (); //xuất thông tin nhân viên. } Bài 13. Số phức là số có dạng c=a+bi (a, b là các số thực). xây dựng các Operator cho lớp số phức (SoPhuc) a. Toán tử cộng 2 số phức b. Toán tử nhân 2 số phức c. Toán tử so sánh bằng 2 số phức. d. Toán tử hiệu 2 số phức e. Toán tử so sánh khác (!=) 2 số phức. Với lớp số phức được khai báo như sau: Bài 14. Xây dựng lớp (TinhTienDien) để tính số điện đã sử dụng và tiền điện (TĐ) cho các hộ gia đình trong một khu dân cư. Thông tin gồm họ tên chủ hộ, mã số công tơ điện, chỉ số cũ, chỉ số mới. TĐ của các hộ gia đình sẽ được tính theo công thức sau: Nếu số điện sử dụng (SĐSD) nhỏ hơn định mức (ĐM) thì TĐ = SĐSD* đơn giá trong định mức (ĐGTĐM) ngược lại giá tiền mỗi số điện vượt định mức sẽ được tính gấp rưỡi so với ĐGTĐM. ĐM và ĐGTĐM có thể thay đổi theo thời gian. Yêu cầu: Phương thức tính số điện phải được viết dưới dạng property của lớp. Bài 15. Một thí sinh (ThiSinh) gồm có các thông tin sau: Số báo danh, họ và tên, điểm môn 1, điểm môn 2, điểm môn 3. Một thí sinh sẽ trúng tuyển nếu có tổng điểm lớn hơn điểm chuẩn và không có môn nào dưới 2.0. Điểm chuẩn có thể thay đổi theo thời gian. Hãy xây dựng lớp ThiSinh với property tính tổng điểm và property xét kết quả biết rằng kết quả trả về true nếu thí sinh đậu, ngược lại trả về false. Bài 16. Xây dựng lớp NgayThang mô tả thông tin về ngày tháng trong thế giới thực với các phương thức cho biết số ngày của tháng (SongayCuaThang) và kiểm tra năm nhuận (KtraNamnhuan). Bài 17. Một hình tròn được đặc trưng bởi thuộc tính bán kính (R). Xây dựng lớp hình tròn như sau: a. Thiết kế lớp và thuộc tính b. Xây dựng thuộc tính truy cập (get/set) c. Xây dựng phương thức khởi tạo mặc định. d. Xây dựng phương thức khởi tạo sao chép [...]... (VND)=thành tiền * tỉ giá (tỉ giá là chung cho tất cả các hóa đơn) Bài 19 Xây dựng lớp DinhThucCap2 mô tả một định thức cấp 2 trong toán học bao gồm: Thuộc tính là một mảng 2 (2 dòng , 2 cột) lưu các số nguyên Phương thức khởi tạo không tham số, tạo định thức mà cả 4 thành phần đều bằng 0 Phương thức khởi tạo sao chép Phương thức tính định thức Bài 20 Xây dựng lớp ngăn xếp Stack lưu trữ dữ liệu số thực...e Xây dựng phương thức tính chu vi hình tròn Xây dựng phương thức tính diện tích hình tròn Bài 18 Xây dựng lớp (HoaDon) mô tả thông tin của một hóa đơn gồm mã hóa đơn, người mua, ngày mua, tổng tiền (đơn vị là USD) Trong đó mã số hóa đơn là số thứ tự hóa đơn đã tạo Viết phương thức khởi tạo với các tham số người... xếp Stack lưu trữ dữ liệu số thực (double) bằng mảng với các thao tác cơ bản như: Boolean Push(double x): đưa một số thực x vào stack, thành công trả về true, ngược lại trả về false Boolean Pop (ref double x): lấy số thực ở đầu stack gán vào x, nếu thành công trả về true, ngược lại trả về false Boolean isFull(): trả về true nếu stack đầy, ngược lại trả về false Boolean isEmpty(): trả về true nếu . { Console.ReadLine(" Ten KH: “ + tenKH + “ Tong tien; {1}”,tongtien); } static public void thongKe(int tongsoHD, float tongHD) { Console.ReadLine(" Tong so HD: {0}",tongSoHD);. Console.ReadLine(" Tong tien cac HD: {0}",tongHD); } } static void Main(string[] args) { HoaDon a = new HoaDon("Nguyen",345F); a.xuatTTHD(); HoaDon.thongKe(a.tongSoHD,. static float tongTien; // public static int tongSoHD; public static float tongHD; public void HoaDon(string ten, int tien) {tenKH = ten; tongTien = tien; tongSoHD++; tongHD +=tien;} public