• 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

Kiểm tra độ thành thạo OOP của bạn

Nơi trao đổi, hỏi đáp về hướng đối tượng (OOP - Object-Oriented Programming), không giới hạn về ngôn ngữ lập trình
Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dazzlingvit » CN 20/05/2012 1:14 am

Xin phép mở topic này (bắt chước các tiền bối), hy vọng gạch đá ít, góp ý nhiều :)

Đoạn chương trình C/C++ sau:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int y = 5;
  7.     printf("%d\n", (++y) + (++y) + (++y));
  8.     system("pause");
  9.     return 0;
  10. }
  11.  

Kết quả hiện ra màn hình là bao nhiêu? Sau khi "chạy bằng tay", bạn chạy thử trên máy tính để kiểm tra kết quả nhé :)
//
Đoạn chương trình C# tương đương sau:
  1. using System;
  2.  
  3. namespace ConsoleApplication
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             int y = 5;
  10.             Console.WriteLine((++y) + (++y) + (++y));
  11.             Console.ReadKey();
  12.         }
  13.     }
  14. }
  15.  

Lại chạy bằng tay, xong chạy trên máy tính nhé.
//
2 câu trên bạn làm đúng những câu nào? Giải thích kết quả thu được :)


Dazzling V.I.T
Hãy gọi tôi là vịt :)

dandelion239
Thành viên chính thức
Thành viên chính thức
Bài viết: 24
Ngày tham gia: T.Sáu 04/05/2012 9:11 am
Been thanked: 3 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dandelion239 » T.Ba 22/05/2012 10:18 am

phải kq cả 2 câu là 21 ko nhỉ, vì theo mình nhớ thì C# với C++ tương tự nhau

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dazzlingvit » T.Bảy 26/05/2012 1:38 pm

Sao chủ đề ảm đạm thế nhỉ :(
Không phải 2 cái đều ra 21 đâu bạn ạ :)
Dazzling V.I.T
Hãy gọi tôi là vịt :)

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi Uzumaki Naruto » T.Bảy 26/05/2012 2:34 pm

Với C++ thì ++y sẽ làm thay đổi toàn bộ các biểu thức có chứa y, do đó việc tính tay của ta chính là tính toán tất cả những tiền tố có chứ biến y rồi mới thực hiện các phép tính khác -> 3 lần ++y tức cả ba biểu thức ++y đều mang giá trị là 8 sau khi thực hiện -> 8*3=24
Với C# biểu thức ++y nào thực hiện xong rồi thì sẽ luôn giữ nguyên giá trị, các biểu thức ++y đứng sau sẽ lấy giá trị hiện tại của y mà thực hiện phép toán -> giá trị thứ tự của 3 ++y là 6 7 8 -> biểu thức tổng là 6 + 7 + 8 = 21.
Mình diễn tả không được tốt. :D
Cause you're my special thing
I'm flying without wings

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dazzlingvit » CN 27/05/2012 10:30 am

Bạn nói gần đúng rồi, nhưng kết quả trên C++ không phải là 24. Và tại sao lại có sự khác biệt giữa C++ và C# (.NET) ? :)
Dazzling V.I.T
Hãy gọi tôi là vịt :)

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi Uzumaki Naruto » CN 27/05/2012 2:51 pm

Ơ vừa mới bỏ code vào test ra 24 mà ta :-? Còn vì sao thì mình không biết :))
Cause you're my special thing
I'm flying without wings

dandelion239
Thành viên chính thức
Thành viên chính thức
Bài viết: 24
Ngày tham gia: T.Sáu 04/05/2012 9:11 am
Been thanked: 3 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dandelion239 » CN 27/05/2012 3:27 pm

đề nghị chủ topic giải thích đi, hix, thực ra hồi đại học đc học mỗi C++, mà cũng chỉ học cơ bản, còn C# thì ra trg đi làm rùi mới tự học
nói thật là mình ko rõ bản chất vđề, chỉ biết code thui, cviệc đc giao là ggle rùi code, chả có time tìm hiểu kĩ bản chất vđề

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dazzlingvit » T.Hai 28/05/2012 5:33 pm

@Uzumaki Naruto: mình đã thử với GNU GCC và MSVC, đều không ra 24.
//
Các bạn nhớ lại chút kiến thức về nạp chồng toán tử trong C++ nhé, với phép ++ dạng tiền tố, kết quả trả về của hàm không phải giá trị mà là tham chiếu (khác với phép +, ++ dạng hậu tố).
Vì thế với phép toán: (++y) + (++y) + (++y) nó sẽ thực hiện như sau:
- Tính (++y) + (++y): với mỗi phép ++y nó tăng y lên 1 và trả về tham chiếu đến y (chứ không phải giá trị y nhé). Vì thế, sau bước ++y thứ nhất, y là 6, trả về &y, phép ++y thứ 2 nó tăng y lên 7, trả về &y. Ở đây &y là tham chiếu đến y, vì thế 2 số hạng trong phép toán này đều tham chiếu đến y, đang có giá trị 7. Kết quả trả về 7 + 7 = 14.
- Tính 14 + (++y) thì 14 + 8 = 22.
Dazzling V.I.T
Hãy gọi tôi là vịt :)

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi Uzumaki Naruto » T.Hai 28/05/2012 5:44 pm

Bạn thử bằng Visual Studio (C++) Win32 Application
Cause you're my special thing
I'm flying without wings

Hình đại diện của người dùng
dazzlingvit
Guru
Guru
Bài viết: 960
Ngày tham gia: T.Ba 18/01/2011 10:21 am
Đến từ: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 time
Been thanked: 112 time
Liên hệ:

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dazzlingvit » T.Hai 28/05/2012 9:18 pm

Cảm ơn bạn Uzumaki Naruto, mình vừa kiểm tra kỹ lại thì thấy có sự khác nhau giữa các trình biên dịch. Bài học rút ra là: khi viết chương trình không nên sử dụng các đoạn công thức phức tạp và dễ gây nhầm lẫn như thế này. Tốt nhất là viết tách biệt ra, nhìn có vẻ dài dòng, nhưng nhiều khi tối ưu về mặt tốc độ hơn :)
Dazzling V.I.T
Hãy gọi tôi là vịt :)

dandelion239
Thành viên chính thức
Thành viên chính thức
Bài viết: 24
Ngày tham gia: T.Sáu 04/05/2012 9:11 am
Been thanked: 3 time

Re: Kiểm tra độ thành thạo OOP của bạn

Gửi bàigửi bởi dandelion239 » T.Ba 29/05/2012 5:57 pm

Các bạn học sao để hiểu rõ bản chất vđề vậy
Mình cứ tự học, mà đc giao việc là ggle rùi code nên chẳng hiểu rõ đc nhiều thứ, nguy hiểm quá


Quay về “Lập trình hướng đối tượng (OOP)”

Đ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.1 khách