Dạy C ++ cho học sinh trung học lần đầu tiên: Vẽ đường thẳng ở đâu?


35

Tôi sẽ tư vấn cho một nhóm học sinh trung học cho Cuộc thi Robotics ĐẦU TIÊN, hầu hết các đội ở đây phát triển [phần mềm robot của họ sử dụng C ++. Đối với nhiều sinh viên trong nhóm, đây sẽ là phần giới thiệu đầu tiên của họ về lập trình. Tôi đã không chọn C ++ để dạy lập trình cho học sinh trung học (ví dụ như Python hoặc Javascript sẽ dễ dàng hơn tôi nghĩ) nhưng sự lựa chọn đã được đặt ra.

Tôi muốn dạy cho họ C ++ thích hợp (nghĩa là tránh một phương ngữ hỗn hợp C / C ++, tức là C +) nhưng tôi không muốn làm họ sợ với sự phức tạp không cần thiết. Cho vẫn đề đó:

  • Tôi có nên bắt đầu sử dụng STL từ ngày đầu tiên không, đặc biệt. vectorhoặc chỉ gắn bó với mảng tiêu chuẩn? Mảng dễ giới thiệu hơn nhưng các lỗi con trỏ có thể khó bắt hơn.
  • Đối với I / O, tôi có nên bám vào cout, v.v. hoặc bạn nghĩ printfsẽ dễ học hơn?
  • Có tài nguyên trực tuyến nào cho C ++ phù hợp để sử dụng cho những người học trẻ như vậy không?

Cảm ơn!

EDIT : Cảm ơn rất nhiều câu trả lời xuất sắc. Ngoài Gia tốc C ++ , được đề xuất bởi nhiều người, tôi đã thấy rằng C ++ Dành cho mọi người là một văn bản tuyệt vời.


52
Trời ơi làm ơn đừng dạy ai javascript làm ngôn ngữ đầu tiên!
SoapBox

26
@SoapBox: trái ngược với những gì? Tôi nghĩ Javascript là ngôn ngữ đầu tiên tuyệt vời. Bạn có thể làm những điều thú vị với một vài dòng mã, không có trình biên dịch và IDE học tập khởi động, v.v., thật dễ dàng để kiểm tra và gỡ lỗi, và nó hỗ trợ cả OO và lập trình chức năng. Những gì có thể tốt hơn?
kevin cline

7
Tại sao bạn nói rằng mảng dễ giới thiệu hơn? Tôi nghĩ rằng vectơ trực quan hơn nhiều đối với người mới vì bạn không phải suy nghĩ về con trỏ hoặc bất cứ điều gì phức tạp như thế.
Casey Patton

19
Nếu bạn đang dạy C ++ cho học sinh cấp ba, thì bạn đã vượt qua giới hạn.
tylerl

7
Thay thế cho việc dạy C ++ không phải là COBOL.
jhocking

Câu trả lời:


40

Tôi nghĩ bạn nên bắt đầu với các kiểu dữ liệu mà ngôn ngữ đã xây dựng như mảng và con trỏ, và khi học sinh của bạn hiểu chúng, hãy chuyển sang các lớp và OO, sau đó là STL.

Lý do là bạn có thể dạy mọi người hiểu các mảng mà không cần hiểu nhiều thứ khác ngoài các biến và kiến ​​trúc máy tính cơ bản, nhưng bạn không thể dạy chúng hiểu vectormà không cần dạy chúng trước. Nếu bạn sử dụng STL ngay từ đầu, sinh viên của bạn sẽ phải sống mà không có manh mối về cách vectorhoạt động chính xác. Và sau đó khi bạn đạt đến điểm đó, họ sẽ không nắm bắt được đủ về con trỏ và mảng và những thứ bạn có được từ việc làm các công việc như viết lớp vectơ của riêng bạn, viết lớp danh sách liên kết của riêng bạn, v.v. để đánh giá cao và khai thác các tính năng của nó. Nó làm tôi khó chịu khi học sinh nói "cái gì vậy?" và giáo viên nói "chỉ cần bỏ qua nó, bạn sẽ học nó sau."

Và như Demian đã chỉ ra trong các bình luận, việc giải mã các thông điệp tương đối khó hiểu mà bạn nhận được từ các lỗi mẫu khó hơn đáng kể so với việc hiểu các lỗi bạn có thể nhận được từ các mảng / cấu trúc không phải mẫu.

Tôi không cảm thấy như vậy về coutprintf. Không có mức nào thấp hơn mức khác, ngoại trừ việc coutsử dụng quá tải toán tử.

Điều này có vẻ ngu ngốc, nhưng tôi hoàn toàn cuồng nhiệt về việc mọi người hiểu các khối xây dựng rất cơ bản của mọi thứ trước khi chuyển sang trừu tượng. Bạn không nên sử dụng con trỏ thông minh cho đến khi bạn thành thạo với con trỏ thô, không có vectơ trước mảng, đại loại thế.

Tôi thường nói điều này, nhưng tôi sẽ nói lại lần nữa: tốt hơn là dạy học sinh phân chia dài trước và sau đó cho chúng sử dụng máy tính hơn là để chúng sử dụng máy tính sau đó dạy chúng phân chia dài sau đó.

Đối với sách để dạy cho người mới bắt đầu, hãy xem danh sách chính của những cuốn sách C ++ hay .


4
Tôi thực sự có cùng quan điểm nhưng đã xem cuốn sách Dạy học C ++ của Strousrup ( stroustrup.com/Programming ) và ông rõ ràng ủng hộ việc sử dụng các vectormảng. Tôi đang bị rách
trừ dòng chảy

4
@recipriversex Loại trừ: Chỉ cần nói rõ ràng, nhưng ông Stroustrup khác xa với một học sinh trung học;)
Demian Brecht

14
CHÚA ƠI. Làm thế nào trên thế giới mọi người có thể nghĩ rằng thao tác thủ công các mảng được phân bổ động có thể là con đường "đầu tiên dễ dàng nhất" đến C ++, khi có std::stringstd::vector?! Là 32 lập trình viên nâng cấp? Tôi đã dạy C ++ trong một thập kỷ, cho những người mới bắt đầu lập trình, cho những sinh viên có một năm học Java và cho các chuyên gia lập trình. Tôi sử dụng std::stringstd::vectortừ ngày đầu tiên. Chúng rất dễ sử dụng, không có vấn đề gì với bộ phận bên trong của chúng. (Bạn sẽ không ngại dạy về chuỗi VB vì bên trong nó quá phức tạp phải không?)
sbi

18
Đây là downvote của bạn. Bạn không cần phải học cách xây dựng một ngôi nhà để tận hưởng những lợi ích của việc sống trong một ngôi nhà. Bạn không cần phải có khả năng viết std::vectorđể có thể sử dụng nó. Và các lớp học là một phần cực kỳ cơ bản của C ++. Điều không cơ bản là gỡ lỗi tất cả những lỗi mà họ sẽ sử dụng mảng và con trỏ riêng.
DeadMG

6
@DeadMG: Siêu hình nhà không hoạt động. Trong một ngôi nhà, một khi nền tảng được xây dựng, bạn không bao giờ phải suy nghĩ về nó nữa. Bạn chỉ cần tiếp tục xây dựng mọi thứ khác. Trong C ++, ngay khi bạn nhìn thấy newtừ khóa, bạn sẽ quay lại lãnh thổ quản lý bộ nhớ. Và thường thì các thư viện yêu cầu con trỏ và bạn cần phải tự hỏi mình, "đó có phải là quyền sở hữu không? Hay tôi vẫn cần phải dọn sạch nó?". Nền tảng chân của tôi. Giống như một cái đinh hoặc caulk hoặc một cái gì đó.
Chris Eberle

38

Đây là kinh nghiệm của riêng tôi. Mang nó cho bất cứ điều gì nó có giá trị.

Nhìn lại khi tôi bắt đầu lập trình, tôi thực sự ước mình sẽ học về trí nhớ trước . Không, nó không thú vị. Nó sẽ làm cho bạn sáng lên. Nhưng đó là một khái niệm dễ dạy một cách nực cười. Chỉ cần hiển thị bảng 1-D và làm cho họ trải qua một vài bài tập tinh thần:

Bài học 1:
Đây là 10 byte bộ nhớ. Đây là chữ "a" được đặt vào ô số 3. "a" là giá trị và 3 là địa chỉ. ĐƯỢC? Đây là số 3 được đưa vào ô 5. Giá trị của nó là 3 và địa chỉ của nó là 5. Bây giờ số 3 có nghĩa là gì? Chà, nó có thể chỉ là số 3 - hoặc nó có thể là một tham chiếu đến địa chỉ 3. Giống như 1 có thể là một số hoặc có thể là mã quốc gia. Đó chỉ là một con số, tất cả phụ thuộc vào cách chúng ta đối xử với nó.

Bài 2:
Hãy học cách đếm nhị phân. Hãy đếm đến 10 bằng cách sử dụng đếm ngón tay nhị phân. Thú vị không? Xem làm thế nào mà chỉ cần 4 ngón tay? Vì vậy, chúng tôi nói rằng chỉ cần 4 bit (1/2 ô). Những gì cao nhất bạn có thể đếm đến một mặt (câu trả lời là 31). Làm thế nào về 2 tay (câu trả lời là 1023). Giải thích làm thế nào nhiều bit có nghĩa là phạm vi số cao hơn. Nhắc nhở họ rằng một ô nhớ là 8 bit. Hỏi điều gì xảy ra khi một số cần nhiều hơn 8 bit. Làm thế nào họ sẽ đặt một số nhiều byte vào bộ nhớ (một cách hợp lý)? Giới thiệu cho họ về ký tự, quần short, số nguyên và dài.

Bài học 3:
Đây là một chương trình tôi đã viết bằng C ++. Nó sử dụng số nguyên 32 bit. Và đây cũng là một con số. Nhưng đây là một số được sử dụng để chỉ. Bằng cách sử dụng dấu hoa thị nhỏ này, chúng tôi hứa rằng số này sẽ được sử dụng để trỏ. Và đây là cách chúng tôi chỉ nó ở số đầu tiên. Các ký hiệu nhỏ và lấp đầy giá trị trong chúng ta. Không gọn gàng?

vân vân. Một khi bạn có được bộ nhớ cơ bản, mọi thứ khác là bánh. Đó là những sinh viên nghèo, người cho rằng trình biên dịch đang làm một điều gì đó kỳ diệu (hoặc họ không bao giờ phải nghĩ về quản lý bộ nhớ), những người có xu hướng đấu tranh nhiều nhất. Và C ++ làm vấy bẩn vùng biển vì một số thứ sẽ tự động được dọn sạch (tức là một vectơ bình thường) trong khi những thứ khác thì không (tức là một vectơ được phân bổ sử dụng "mới"). Và thậm chí đừng để tôi bắt đầu trên chuỗi (char * vs. std :: string - hãy thử giải thích điều đó mà không có kiến ​​thức về con trỏ).

Tôi không biết cuộc thi robot của bạn sẽ nhắm mục tiêu vào nền tảng nào, nhưng nếu đó là môi trường bộ nhớ hạn chế, kỹ năng quản lý bộ nhớ là rất quan trọng.

CHỈNH SỬA

Khi bạn đã dạy họ những nguyên tắc cơ bản, thì tôi đồng ý đi C ++ mọi cách. Về mặt kỹ thuật, chúng chỉ là những thư viện khác nhau, nhưng vâng, không có lý do gì để nhầm lẫn chúng với nhiều hơn một mô hình. Cung cấp cho họ các công cụ C ++ (bao gồm các con trỏ và mảng).


Đó là một phản ứng tốt. Vấn đề tôi nghĩ là bạn có thể dạy điều đó nhưng nhiều đứa trẻ (lúc đầu tôi là người phải vật lộn với các khái niệm con trỏ / bộ nhớ do không quan tâm) sẽ chỉ điều chỉnh nó, bởi vì nó không vui, mặc dù đó là kiến ​​thức cần thiết để lập trình thành công trong C ++.
Keith Layne

3
Đúng, không có tranh luận ở đây. Vì lý do tương tự, trẻ em điều chỉnh toán học và địa lý. Chỉ sau này họ mới nhận ra rằng họ nên được chú ý. Khá chắc chắn rằng vấn đề cụ thể vẫn chưa được giải quyết.
Chris Eberle

+1. Tôi nhớ tập hợp sự hiểu biết của tôi về cách bộ nhớ hoạt động khá lâu sau khi tôi được giới thiệu về C ++. Mặc dù vậy, tôi không nghĩ rằng tôi có thể hiểu được nó trả trước (không phải trong bất kỳ ý nghĩa thực tế nào, như cách các giá trị được thể hiện).
Cameron

+1, đây là những gì tôi đã cố gắng nói, nhưng tốt hơn. Khi đào tạo cơ khí, họ phải hiểu động cơ trước khi bạn khiến họ lái xe chuyên gia.
Seth Carnegie

Vâng tôi đi đi lại lại về việc người mới bắt đầu có thể nắm bắt được điều này hay không. Thật là quá dễ dàng (và bạn đột nhiên thấy mình nói "wow, máy tính là những cỗ máy cực kỳ ngu ngốc phải không?"), Tuy nhiên, điều đó đòi hỏi họ phải chú ý và giữ lời hứa về những điều thú vị hơn sẽ đến. Không nhìn thấy "bức tranh lớn" làm cho cách tiếp cận tổng thể trở nên khó chịu.
Chris Eberle

31

Tôi có nên bắt đầu sử dụng STL từ ngày đầu tiên không, đặc biệt. vector hay chỉ gắn bó với mảng tiêu chuẩn? Mảng dễ giới thiệu hơn nhưng các lỗi con trỏ có thể khó bắt hơn.

chắc chắn đi đúng vào việc sử dụng các loại thư viện tiêu chuẩn. a std::stringhoặc std::vectorlà những gì họ nên thường sử dụng và (phần lớn các triển khai) các loại này cung cấp một số hình thức phát hiện lỗi và xử lý lỗi, trong khi trừu tượng hóa nhiều sự phức tạp từ các sinh viên.

bạn có thể dành nhiều thời gian để dạy học sinh cách cấu trúc bộ nhớ và cách quản lý bộ nhớ (kiểu C) hoặc bạn có thể bắt đầu làm việc bằng cách sử dụng các loại thành ngữ của ngôn ngữ sau đó giải thích chi tiết triển khai nếu cần (và khi chúng có hiểu rõ hơn về một mảng là gì và chúng được sử dụng ở đâu).

cú pháp của std::vector(tạo / đọc / ghi) không phức tạp hơn nhiều so với mảng C. so sánh, quản lý bộ nhớ thủ công và tất cả các lỗi phổ biến người học mới mắc phải với mảng C khó khăn hơn nhiều để học, dạy và sử dụng.

Đối với I / O, tôi có nên bám vào cout, v.v. hay bạn nghĩ printf sẽ dễ học hơn?

cout. cá nhân, tôi nghĩ rằng cout'sa dễ học hơn. có lẽ quan trọng hơn, bạn nên chọn coutvì nó an toàn, linh hoạt hơn và cho phép bạn xác định cách in đối tượng, có nghĩa là bạn đã tích hợp sẵn các chức năng và an toàn kiểu sử dụng một số loại thư viện chuẩn. cuối cùng, bạn sẽ kết thúc với các chương trình hỗn hợp khi bạn nhận ra rằng họ cũng có thể cần phải học coutthêm printf.

thực tế, tôi nghĩ bạn nên đọc Gia tốc C ++, bởi Koenig và Moo và có thể sử dụng nó để hướng dẫn (trả lời câu hỏi 3 một cách gián tiếp). trong cuốn sách, họ giới thiệu std::coutngay trước đó return(trang 3), và lưu các con trỏ và mảng cho đến chương 10. nếu tôi có thể sao chép và dán lời nói đầu của cuốn sách đó như một câu trả lời cho câu hỏi của bạn, tôi sẽ làm thế. (lưu ý: tôi khuyên bạn nên đọc nó cho quan điểm giảng dạy c ++).

Chỉnh sửa Đây là Lời nói đầu

Có tài nguyên trực tuyến nào cho C ++ phù hợp để sử dụng cho những người học trẻ như vậy không?

nếu bạn không muốn sử dụng Gia tốc C ++ (giả định một số nền tảng với lập trình nói chung), thì có lẽ bạn sẽ thích Suy nghĩ của Eckel trong C ++ . Tôi chưa đọc nó, nhưng nó là một văn bản giới thiệu C ++ được phân phối tự do.


1
+1 ... và tôi đã rất cố gắng "họ giới thiệu std :: cout ngay trước khi trở về (trang 3)" phải nhìn trộm vào đó :)
Felix Dombek

1
@Felix và trực tiếp trước khi std::coutgiới thiệu, niềng răng xoăn được giới thiệu =) (đó là một cách mổ xẻ đơn giản của "Xin chào, Thế giới")
justin

1
Tôi chân thành thứ hai giới thiệu cuốn sách của Koenig và Moo. Nó nhắm mục tiêu giảng dạy cả C ++ và lập trình. Tư duy trong C ++ của Bruce Eckle chủ yếu nhằm mục đích dạy C ++ cho những người có kinh nghiệm trước đây với ngôn ngữ thủ tục (như C hoặc Cơ bản).
Stephen C. Steel

11

Một điều cần xem xét là trong các cấu trúc dữ liệu mã FIRST điển hình dưới mọi hình thức (cấu trúc, lớp, mảng, vectơ, danh sách) đóng một vai trò rất nhỏ. Bạn thường xử lý một lượng rất nhỏ dữ liệu cảm biến và sử dụng nó để quyết định một lượng rất nhỏ chuyển động của bộ truyền động.

Nhưng những gì không đóng một vai trò rất lớn, và có thể là rất khó hiểu là tất cả các hình thức khác nhau của kiểm soát mà đi vào.

Vì vậy, tôi rất chú trọng đến việc kiểm soát. Bắt đầu với vấn đề cơ bản: if, for, while. Có họ thực hành những điều đó rất nhiều. Làm cho họ biết rõ những điều đó ....

... nhưng sau đó nó trở nên khó khăn hơn. Bất kỳ mã robot nào có kích thước vừa phải cuối cùng cũng có một số mẫu điều khiển phức tạp hơn:

  • Vòng lặp "chính" lớn, gọi tất cả mọi thứ

  • Máy nhà nước (những máy này hiện lên rất nhiều)

  • Lưu các giá trị trước đó / bộ đếm đang chạy (như đối với PID)

Đây là những khó khăn cho người mới bắt đầu để hiểu. Suy nghĩ về cách một chương trình di chuyển qua mã như thế này là khó hiểu, bạn có thể không nhận ra nó bây giờ, nhưng nó là. Nó sẽ mang đến cho sinh viên của bạn nhiều rắc rối hơn chính ngôn ngữ.

Ngoài ra, chúc may mắn! Hy vọng mùa giải diễn ra tốt đẹp.


2
+1; đây không phải là một môi trường máy tính để bàn thông thường, mà là mã nhúng thực sự. Máy trạng thái quan trọng hơn nhiều so với std :: vector vs mảng.
MSalters

8
  • Tôi có nên bắt đầu sử dụng STL từ ngày đầu tiên không, đặc biệt. vectorhoặc chỉ gắn bó với mảng tiêu chuẩn? Mảng dễ giới thiệu hơn nhưng các lỗi con trỏ có thể khó bắt hơn.

Vấn đề với mảng là bất cứ điều gì ngoại trừ các ví dụ trong sách giáo khoa đơn giản sẽ yêu cầu các mảng có kích thước động và thời điểm bạn cần các mảng có kích thước động, std::vectorsẽ dễ dàng hơn nhiều. Ngoài ra, cách duy nhất để xử lý các mảng có kích thước động một cách an toàn là bọc chúng trong lớp của riêng bạn, đây sẽ là một sự std::vectorlột xác kém .
Trái với niềm tin phổ biến không thể giải thích, sinh viên có thể sử dụng các tính năng đòi hỏi cơ học phức tạp phải được thực hiện mà không biết cách tự thực hiện những con thú như vậy. Như tôi đã nói trong một bình luận: Bạn thậm chí sẽ không nghĩ đến việc xem xét việc không dạy các chuỗi trong các ngôn ngữ khác, chỉ vì việc triển khai chúng rất phức tạp, phải không?

  • Đối với I / O, tôi có nên bám vào cout, v.v. hoặc bạn nghĩ printfsẽ dễ học hơn?

Tại sao một tập hợp các quy ước chuỗi định dạng cổ xưa làm cho chương trình của bạn nổ tung ngay khi bạn gặp sự cố (điều này xảy ra ngay khi bạn thay đổi một typedeftiêu đề dường như không liên quan) có thể thích hợp hơn với loại an toàn std::cout?

  • Có tài nguyên trực tuyến nào cho C ++ phù hợp để sử dụng cho những người học trẻ như vậy không?

Hầu hết các tài nguyên C ++, trực tuyến hoặc không, là xấu. Và tôi không nói về việc sử dụng các phông chữ hoặc ngôn ngữ khó đọc. Tôi đang nói về những lỗi thực tế rõ ràng. Có rất ít tài nguyên C ++ tốt, chủ yếu là một hoặc hai chục cuốn sách . Người duy nhất tôi biết là trực tuyến là Thinking của Bruce Eckel trong C ++ .


Trong một thập kỷ, tôi đã dạy C ++ cho các sinh viên có nền tảng rất khác nhau bằng cách sử dụng Gia tốc C ++ của Koenig / Moo làm cơ sở. Khóa học của tôi đã thay đổi rất nhiều trong thập kỷ đó, không ở đâu gần cuốn sách, ngoại trừ nguyên tắc cơ bản: Sử dụng các thành ngữ hiện đại, chính xác, an toàn ngay từ đầu. Đừng dạy học sinh của bạn cách thao tác bộ nhớ theo cách thủ công, chỉ để sau này chúng không biết rằng có lợi cho các thành ngữ an toàn hơn. Như bạn có thể thấy ở một số câu trả lời được cung cấp ở đây, điều này không hiệu quả: Những người từng được dạy cách thủ công trước tiên sẽ hiếm khi hiểu được lợi thế của việc sử dụng các thành ngữ hiện đại, an toàn.


7

Nếu bạn muốn dạy C ++, tôi sẽ bắt đầu trực tiếp với các cấu trúc C ++ dưới dạng vector và cout, thay vì tập con C như printf.


7

Tôi có nên bắt đầu sử dụng STL từ ngày đầu tiên không ...?

Vâng. Sử dụng mảng gốc trong C ++ dễ bị lỗi và đơn giản là thực hành xấu 99% thời gian.

Đối với I / O, tôi có nên dính vào cout, v.v ...?

Vâng.

Có tài nguyên trực tuyến nào cho C ++ phù hợp để sử dụng cho những người học trẻ như vậy không?

Họ không còn quá trẻ. Học lập trình không đòi hỏi sự khôn ngoan, chỉ cần động lực và một tinh thần cởi mở. Tôi không thể nghĩ ra bất cứ điều gì được dạy trong hai năm cuối của trường trung học sẽ chuẩn bị tốt hơn cho một học sinh học lập trình. Bạn đã xem Tư duy của Bruce Eckel trong C ++ chưa? Nó có sẵn để tải về miễn phí và được đánh giá rất tốt. Xin vui lòng tránh C ++ phổ biến nhưng khủng khiếp : Cách lập trình và tất cả các cuốn sách Dạy về bản thân C ++ của Sam .


5

Tôi được dạy C ++ ở trường trung học như một ngôn ngữ lập trình đầu tiên, mặc dù nó giống như "C +", bây giờ mà bạn đề cập đến nó; chúng tôi đã sử dụng coutđể viết văn bản vào bàn điều khiển và các tập tin, nhưng cũng có khá nhiều chức năng C ( getch()là sở thích của tôi).

Tôi nghĩ rằng cách dạy cơ bản hiệu quả nhất (và có thể thú vị) là sử dụng chương trình giảng dạy hướng mục tiêu: bắt đầu bằng cách hiển thị cách xuất nội dung, sau đó nhập bàn phím, sau đó nhập / xuất tệp đơn giản, v.v. trò chơi dựa trên (hoặc tương đương robot). Sau đó, khi họ hỏi, "Làm thế nào để tôi làm X?", Bạn có thể chia nhỏ X về các ví dụ họ đã thấy, ví dụ: "Trước tiên, bạn sẽ cần nhận đầu vào từ người dùng như chúng tôi đã làm trong Z, sau đó ..."(rõ ràng nó không phải là dễ dàng này trong thực tế kể từ X có thể sẽ là một cái gì đó mà họ cần bổ sung kiến thức để làm được, ví dụ như 'đồ họa 3D', nhưng bạn vẫn có thể giải thích làm thế nào nó sẽ làm việc trong một cấp cao đường).

Các ví dụ bạn cho thấy chúng sẽ bắt đầu như ma thuật dán bản sao hộp đen, những bí ẩn được làm sáng tỏ khi các mảnh của câu đố lập trình đang dần được tìm ra. Ví dụ, sinh viên của bạn sẽ học những điều cơ bản ifkhá nhanh, nhưng họ có thể sẽ không nhận ra rằng biểu thức boolean không chỉ giới hạn sử dụng trong ifđiều kiện (dẫn đến if (blah) return true; else return false;mã cổ điển ).

Sự tinh tế cho dù bạn chọn một mảng hoặc vectơ làm vật chứa sẽ có vẻ không liên quan đến các sinh viên lúc đầu. Một vectơ / mảng đơn giản sẽ là một cách có nhiều biến là một biến, có thể truy cập thông qua một chỉ mục. Dính vào một nơi mà bạn có thể. Con trỏ sẽ không được hiểu cho đến sau này. Điều đó không có nghĩa là bạn không nên giải thích mọi thứ; chỉ là bạn không thể giải thích mọi thứ cùng một lúc, và những điều bạn giải thích sẽ không được hấp thụ hoàn toàn. Con người học một cách hữu cơ, không tuyến tính. Tôi đã sử dụng coutmột vài năm trước khi tôi hiểu chính xác quá tải toán tử là gì!

Oh, và đừng sợ lặp lại. "Đây giống như chương trình Hello World mà chúng tôi đã làm - nhớ cách chúng tôi viết văn bản lên bàn điều khiển?" (không ...) "Chúng ta hãy đi qua nó một lần nữa để đảm bảo." ... Và đặt câu hỏi! Giữ cho các sinh viên tham gia với các ví dụ thú vị và nhiều tương tác.

C ++ là một ngôn ngữ phức tạp và bất kể bạn làm gì, một lượng đáng kể độ phức tạp đó (và của nghề lập trình nói chung) sẽ bị mất đối với các sinh viên của bạn. Tất cả mọi thứ bạn cho họ thấy sẽ là mới đối với họ; hầu hết nó sẽ không chìm trong một mức độ hiểu biết sâu sắc (ít nhất, không phải ngay lập tức). Bộ nhớ hoạt động như thế nào, các thành phần của PC tương tác như thế nào, stack và heap là gì, con trỏ, lớp, thậm chí các vòng lặp và chuỗi if-if khác sẽ không được đa số hiểu đúng . Không sao đâu Chúng không cần phải được sử dụng - một số lượng lớn các chương trình tuyệt vời có thể được viết bằng các hàm 1000 dòng siêu xấu với các số dư thừa được lồng vào nhau ifvà 43 biến được đặt tên như thế x_2r. Điều quan trọng là các sinh viên không ngừng học hỏi và cải thiện. Hộp đen vẫn ổn miễn là chúng trở nên trong suốt (hoặc ít nhất là màu xám mờ) trong thời gian dài. Đến cuối khóa học, họ có thể không biết những gì patters thiết kế đang có, nhưng họ sẽ có thể nhìn lại những chương trình họ đã viết trong vài tuần và đầu tiên cringe tại mã của họ. Họ nên hiểu ở mức độ chi tiết đáng kể về cách chương trình đầu tiên họ viết thực sự hoạt động (trong khi họ viết nó thì họ không biết gì). Nhưng họ sẽ không biết tất cả mọi thứ - chưa .


5

Tôi đã tham gia một loạt các lớp học lập trình trong đời từ trung học đến đại học. Tôi có thể nói rằng tôi thực sự đã không học được quá nhiều từ lớp c ++ đầu tiên của mình ngoài cách in mọi thứ lên luồng.

Lời khuyên của tôi, khi còn là một sinh viên trẻ, người chỉ mới trong vài năm qua đã có bất kỳ công việc thực sự nào là một nhà phát triển, là đừng làm mọi thứ trở nên tồi tệ. Nói với họ những gì họ đang làm và làm thế nào nó hoạt động xuống cấp độ hệ điều hành (Không cần phải vào comp eng IMO).

Tôi nghĩ rằng dạy họ C là một cách tốt hơn để làm điều đó (nó sẽ vẫn luôn luôn được biên dịch thành C ++ như bạn biết). Dạy cho họ biết thiết bị đầu cuối thực sự là gì, chương trình của họ tương tác với nó như thế nào, rằng một chuỗi là một chuỗi ký tự kết thúc với \ 0 trong bộ nhớ, malloc là gì và cách C ++ trừu tượng hóa nó, cách lưu trữ char và int trong bộ nhớ , ect ... Những điều này là những gì làm cho ai đó thực sự biết cách giải quyết vấn đề khi họ phát hiện ra nó.

Tôi không thể nhấn mạnh tầm quan trọng của việc để trẻ em lập trình và chủ yếu ở đó để trả lời các câu hỏi. Theo kinh nghiệm của tôi, bạn học một ngôn ngữ bằng cách sử dụng nó. Sách và bài học có thể hữu ích và cần thiết để bắt đầu, nhưng cuối cùng, tôi nói hãy cho họ một tệp C / C ++ và nói: Đây là một ví dụ về X, tôi muốn bạn làm Y (có thể được thực hiện bằng cách hack X). Chỉ cho họ cách sử dụng các trang man (nếu họ đang sử dụng * NIX) hoặc hiển thị cho họ cplusplus.com và để họ khám phá các lib std để tự mình tìm ra mọi thứ.

TL; DR Hãy để những đứa trẻ tự dạy mình. Có mặt để cung cấp cấu trúc và trả lời câu hỏi.

Ngoài ra: Danh sách liên kết là sự thật!


4

Bạn không dạy họ lập trình một cách chung chung, bạn đang dạy họ một loại lập trình nhúng bằng Robot và như vậy. Nếu tôi hiểu không lầm thì.

Đầu tiên, tôi nghĩ bạn nên kiểm tra thư viện nào bạn sẽ sử dụng và những gì bạn cần.

Nếu bạn tình cờ có một thư viện C để sử dụng hoặc giống như C với rất nhiều con trỏ và mảng C, thì tôi đoán bạn cần một cách để dạy họ cách sử dụng nó hoặc tại sao bạn sử dụng nó.

Nhưng, bạn có thể chỉ cho họ một số mã đơn giản để bắt đầu với chuỗi và vectơ, đó là cách C ++ hoạt động. Điều đó không có nghĩa là bạn không thể dạy họ gợi ý.

Có lẽ bạn nên làm rõ sự khác biệt giữa C ++ cấp thấp (tương tự C) và C ++ cấp cao với STL. Một trong những điều khó khăn nhất trong C ++ cho người mới bắt đầu là xem C là gì, C ++ là gì và các API hệ thống khác nhau là gì.

Vì mục tiêu ở đây không phải là học lập trình chung mà là tham gia một cuộc thi Robot, tôi đã định hướng việc dạy theo cách này.


2

Tôi đã bắt đầu dạy sinh viên C ++ vào cuối năm ngoái và mùa hè này cũng cho Đội Robotics ĐẦU TIÊN của chúng tôi.

Chúng tôi đang sử dụng Lập trình của Stroustrup - Nguyên tắc và Thực hành bằng C ++ . Tôi đã tìm thấy cuốn sách có thể tiếp cận, dễ đọc và được tổ chức tốt. Chúng tôi đã có khoảng 6 sinh viên tự đọc qua các chương. Tôi ở đó để giúp họ với thuật ngữ và câu hỏi. Họ làm tất cả các bài tập trong cuốn sách.

Tôi đã cho các sinh viên làm việc qua chương 14. Bỏ qua các chương về luồng (không hữu ích cho lập trình FRC). Qua chương 14 rất hữu ích vì họ có được phần giới thiệu về các lớp con. Tuy nhiên, có lẽ họ cần phải đi xa hơn trong cuốn sách để hiểu rõ hơn về các hàm tạo và hàm hủy liên quan đến các lớp con.

Đừng đánh giá thấp học sinh của bạn. Các sinh viên rất vui khi có sách, đọc, học và làm bài tập; và đây là vào mùa hè vào thời gian riêng của họ! Có nhiều sinh viên sẽ không hiểu. Họ nên chuyển sang một thứ khác; không phải ai cũng hiểu lập trình.

Rào cản lớn nhất không phải là ngôn ngữ hay cuốn sách; đó là môi trường phát triển. Visual Studio Express có thể gây nản lòng cho người dùng lần đầu. Bạn có thể có giá trị trong việc giúp sinh viên tập trung vào lập trình hơn là môi trường. Tuy nhiên, học môi trường có giá trị khi các lập trình viên dành nhiều thời gian để thích nghi với các hệ thống phát triển mới.

Chúc may mắn.


+1: Câu trả lời hay nhất cho đến nay. Sự lựa chọn tuyệt vời của sách giáo khoa. Chúc mừng thành công của bạn.
kevin cline

1

Bạn nói rằng bạn muốn dạy họ C ++ nhưng không dạy họ bất kỳ cấu trúc C nào, nhưng hầu hết các cấu trúc lập trình họ sẽ cần biết trước tiên là chung cho tất cả các ngôn ngữ và các phiên bản C ++ được bắt nguồn từ C:

  1. Đây là cách bạn tạo một chương trình [int main (..) {return 0; }]. Cung cấp một cái nhìn tổng quan cơ bản về môi trường lập trình mà bạn muốn họ cũng thử. Họ sẽ cần biết cách tạo một dự án và thực sự biên dịch / chạy nó.

  2. Đây là một biến. Các biến có thể lưu trữ dữ liệu (int, char, float, v.v.).

  3. Chuỗi (những người C ++ dễ sử dụng hơn với cin).

  4. Đây là cách bạn đọc và ghi dữ liệu (cin, cout). "Xin chào,% s!"

  5. Có điều kiện (máy tính cần đưa ra quyết định).

  6. Vòng lặp (máy tính rất giỏi làm điều tương tự lặp đi lặp lại). Hiển thị trong khi và cho các vòng lặp.

Điều đó sẽ mất khoảng hai bài học mỗi giờ. Hãy chắc chắn chuẩn bị một bộ ghi chú súc tích mà họ có thể tham khảo trong thành phần thực tế. Bạn không cố gắng biến họ thành những lập trình viên xuất sắc để đưa ra ví dụ về cách đọc từ bảng điều khiển, tạo cấu trúc và mọi thứ khác họ cần làm. Chỉ sử dụng các tính năng hỗ trợ ngôn ngữ, không phải thư viện tiện ích tùy chỉnh. Bạn sẽ chỉ nhầm lẫn chúng nhiều hơn.

Từ việc di chuyển, dẫn dắt bằng ví dụ và chỉ cho họ các ví dụ về mã được trình bày tốt. Các vết lõm phải chính xác, giằng và dấu ngoặc phù hợp với kiểu bạn cảm thấy thoải mái nhất. Tên biến nên có ý nghĩa. Nếu bạn hiển thị slop làm ví dụ thì họ sẽ học được rằng slop có thể chấp nhận được. Đó là một điểm khởi đầu tồi tệ. Nhấn mạnh tầm quan trọng của việc thụt lề chính xác - Tôi thấy rằng khi nhiều người tôi đã dạy thụt mã của họ một cách nhất quán, họ sẽ dễ dàng nhận ra họ đã sai ở đâu. Đó là bởi vì hầu hết các lỗi của họ là phạm vi hoạt động không chính xác (đưa các hoạt động vào các vòng lặp / điều kiện không có nghĩa là hoặc nghịch đảo).

Sau đó chuyển sang làm việc thực tế. Cách tốt nhất để học một cái gì đó là phá vỡ nó và tìm ra lý do tại sao. Bạn sẽ muốn đảm bảo rằng họ có một môi trường dễ sử dụng để biên dịch mã của họ. Tài liệu với ảnh chụp màn hình trong tay của bạn.

Một ví dụ điển hình giúp tôi tìm hiểu một số khái niệm là xây dựng máy Coke:

  • Xuất ra một menu các mặt hàng và giá cả (lưu trữ menu là một mảng của cấu trúc do người dùng định nghĩa. Có thể là một lớp trong C ++). Đầu ra nó yêu cầu một vòng lặp.
  • Đọc trong lựa chọn của người dùng.
  • Hỏi người dùng tiền. Họ chỉ có thể nhập mệnh giá tiền xu bằng xu (1, 5, 10, 20, 50, 100, 200 bằng tiếng Úc). Bỏ qua các mệnh giá chưa biết. Trong khi người dùng chưa bỏ đủ tiền, hãy tiếp tục hỏi (vòng lặp).
  • Tính toán thay đổi cần thiết (chia modulo), cho số lượng xu ít nhất. In đầu ra ra màn hình.
  • Chờ người dùng tiếp theo.

Sau đó, bạn có thể chuyển sang các cấu trúc C ++; bạn không muốn lặn quá xa trước khi họ ít nhất có thể thực hiện một chương trình cơ bản.

Và trên hết, có nhiều thời gian rảnh rỗi và sự kiên nhẫn để dành cho các câu hỏi. Sẽ có rất nhiều, và hầu hết trong số họ sẽ khiến bạn co rúm lại vì chúng quá tầm thường đến nỗi câu trả lời là hiển nhiên đối với bạn.


1

Tôi nghĩ bạn không nên dạy mọi thứ theo quan điểm của C ++ ("C ++ xin chào thế giới"), mà từ lĩnh vực vấn đề - trong trường hợp này, robotics - quan điểm. Vì vậy, thế giới xin chào của bạn sẽ nhấp nháy đèn led hoặc lái xe máy.

Tất nhiên, bạn có thể / nên phân tách từng tác vụ robot nhỏ trong một tập hợp con tăng các hành động C ++ có ý nghĩa về mặt khái niệm, liên quan đến các loại, chức năng và hoạt động IO.

Đối với bản thân tôi, tôi không phải là một lập trình viên chuyên nghiệp và đã cố gắng học Java, C ++ và Python. Tôi thực sự bắt đầu đạt được một cái gì đó (Python) khi tôi có vấn đề thực sự (đơn giản) để giải quyết. Điều đó đưa tôi đến đúng điểm, tránh sự chú ý quá mức đến các chi tiết triển khai ngẫu nhiên của chính ngôn ngữ.

Vì vậy, tôi sẽ khuyên: đừng đọc hướng dẫn sử dụng ngôn ngữ, mà thay vào đó hãy học cách làm mọi thứ với ngôn ngữ bạn chọn. Đó là những gì giữ cho mọi người có động lực, tôi nghĩ.


0

Tôi sẽ dạy C ++ nghiêm ngặt. Bạn biết làm thế nào khi bạn viết printf và đưa nó cho các thông số nhỏ hoặc loại sai một cái gì đó kỳ lạ xảy ra? và nếu bạn sử dụng con trỏ không hợp lệ những điều xấu có thể xảy ra? KHÔNG DẠY

Từ ngày đầu tiên, tôi sẽ dạy cách sử dụng tài liệu tham khảo, STL và nói rằng bạn MẤT NHIỀU để sử dụng con trỏ. Đừng dạy con trỏ thông minh. Lần duy nhất tôi nhận thấy tôi sử dụng con trỏ là khi tôi làm GUI và các đối tượng (như hộp hình ảnh) phải tồn tại và là hình ảnh hợp lệ hoặc null. Để lập trình giao diện điều khiển, tôi đã không sử dụng con trỏ (thông minh hoặc thô) trong một thời gian dài.

Vì vậy, trong ngắn hạn không dạy họ bất cứ điều gì có thể gây rắc rối cho họ. Dạy iostreams, structs, nói với họ rằng họ cũng bị mất điểm trên typecast và đừng cố dạy thiết kế. Bạn không muốn bất cứ ai trở thành một chuyên gia dày dạn


0

Đây không phải là một chuỗi bài giảng C ++, nhưng COMP1917 của Richard Buckland là một chuỗi bài giảng được thực hiện xuất sắc về lập trình trong C (tiếp theo là COMP1927 , cấu trúc dữ liệu).

Theo ý kiến ​​riêng của tôi, C ++ quá phức tạp đối với sinh viên mới, nhưng C thì thế giới đơn giản hơn và cung cấp nền tảng tốt trong lập trình hệ thống mà tất cả các lập trình viên C ++ mới thường thiếu.


0

Tôi sẽ bắt đầu với những đoạn mã nồi hơi đáng kể, giúp họ "làm điều gì đó tuyệt vời" với lập trình ngay lập tức và tinh chỉnh sự hiểu biết của họ về cách mọi thứ hoạt động theo thời gian. Họ không cần đánh giá cao hoặc hiểu tất cả những điều phức tạp của C ++ để làm cho đèn LED nhấp nháy. Họ chỉ cần biết "nếu bạn đặt mã này ở đó, nó sẽ làm cho đèn LED nhấp nháy." Và sau đó "này, hãy nói về vòng lặp bây giờ là gì, nếu bạn viết một vòng lặp, bạn có thể làm cho đèn LED nhấp nháy 50 lần mà không phải viết 50 dòng mã, điều đó có tuyệt không?" Bây giờ hãy nói về các điều kiện, khi người dùng nhấn nút A trên hộp điều khiển, chúng tôi muốn kích hoạt pneumatics để giương cờ, đây là cách chúng tôi thêm mã để làm điều đó. Hoặc nếu công tắc 2 trên hộp điều khiển của chúng tôi được bật sang, chúng tôi sẽ chạy mô tơ khoan ngược lại thay vì tiến lên.

Nếu bạn giữ mọi thứ tập trung vào việc dạy chúng "vừa đủ" để giải quyết các vấn đề họ quan tâm, nó sẽ khiến mọi thứ trở nên ít áp đảo hơn và dễ tiếp cận hơn. Nếu họ thực sự quan tâm và muốn hiểu những điều phức tạp, có lẽ họ sẽ quay lại và đọc một cuốn sách toàn diện về lập trình hoặc tham gia một khóa học hè tại JC địa phương.

Lập một danh sách "những điều họ muốn có thể điều khiển" trên robot của họ và biến mỗi người thành một bài học ... điều tối thiểu họ cần biết là gì ...?

  • làm một cái gì đó "nhìn mát mẻ" nếu một công tắc trong một cài đặt cụ thể?
  • nói với một van khí nén để mở hoặc đóng (ví dụ: một phụ kiện kẹp)?
  • bật và tắt động cơ khoan (cho hệ thống truyền động)?
  • làm cho robot thay đổi hướng nếu một cảm biến phát hiện chướng ngại vật được kích hoạt?
  • Làm robot chuyển đổi giữa chế độ lái 2 bánh vs 4 bánh?
  • Điều chỉnh độ nhạy của cần điều khiển?
  • v.v.

Tôi sẽ gắn bó với việc dạy các điều kiện dễ hiểu nhất, như tôi sẽ dạy cout qua printf, bởi vì các công cụ định dạng rất dễ trộn lẫn và một công cụ xác định không chính xác thường là một công thức tự động để làm hỏng chương trình của bạn. Tương tự như vậy, vector làm xáo trộn một số phức tạp quản lý bộ nhớ. Đừng lo lắng về mọi chi tiết về cách mọi thứ hoạt động, hoặc thư viện STL là gì, chỉ cần ít nhất họ cần biết để thực hiện X (ví dụ có thể yêu cầu sử dụng cơ sở hạ tầng thư viện STL)


0

Sử dụng Cách lập trình C ++ của Delist và Delist. Sách giáo khoa TUYỆT VỜI theo ý kiến ​​của tôi.

Âm thanh giống như bạn đang cố gắng dạy người mới cách lập trình và sau đó cho họ lập trình ở cấp độ nâng cao cùng một lúc. Nếu bạn hy vọng cung cấp cho họ một số con khỉ, hãy xem khỉ làm đoạn mã hóa với sự hiểu biết bạn sẽ phải chịu thất bại.

Tránh xa STL cho một lớp học mới bắt đầu.

Nếu bạn đã có một giải pháp mã hóa cho robot của mình - hoặc một Ý TƯỞNG RẤT TỐT về nó sẽ trông như thế nào thì có lẽ bạn có thể "ánh xạ" các bài học trong sách giáo khoa sang các nhiệm vụ mã hóa cho robot. Nhưng hãy để sách giáo khoa thúc đẩy việc học.

Nếu bạn ép buộc mã hóa thức ăn, cho học sinh những bài học rất hẹp và tiếp xúc với ngôn ngữ thì tôi nghĩ khi đại dương mã bạn viết ngày càng lớn hơn, nó sẽ giống như vừa học chèo thuyền và bạn sẽ chết đuối vì bơi THỰC SỰ bắt buộc.

Đây không phải là câu hỏi "họ nên học cout hay printf?" Đó là một câu hỏi về việc học đủ để có cái nhìn sâu sắc về cách viết mã cho các nhiệm vụ lập trình robot được đưa ra để giải quyết.

Nếu đây là một bài tập đọc, kết quả sẽ là gì nếu tất cả những gì họ biết là những câu động từ chủ đề đơn giản và chỉ một nửa từ vựng bạn BIẾT sẽ được yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.