고등학생들에게 C ++ 교육 : 선을 어디로 그릴 것인가?


35

FIRST Robotics Competition을 위해 고등학생 팀을 멘토링 할 예정입니다. 여기서 대부분의 팀은 C ++를 사용하여 로봇 소프트웨어를 개발합니다. 팀의 많은 학생들에게 이것은 프로그래밍에 대한 첫 번째 소개가 될 것입니다. 고등학생들에게 프로그래밍을 가르치기 위해 C ++을 선택하지 않았을 것입니다 (예 : Python 또는 Javascript가 더 쉬울 것입니다).

나는 그들에게 적절한 C ++ (즉, 혼합 C / C ++ 방언, 즉 C +를 피함)을 가르치고 싶지만 불필요한 복잡성으로 그들을 놀라게하고 싶지 않습니다. 그 문제에 대한:

  • 첫날부터 STL 사용을 시작해야합니까? vector아니면 표준 배열을 고수합니까? 배열을 도입하기는 쉽지만 포인터 오류를 잡기가 더 어려울 수 있습니다.
  • I / O의 경우 cout등을 고수해야합니까 아니면 printf배우기가 더 쉬울 것이라고 생각 하십니까?
  • 어린 학습자에게 적합한 C ++ 온라인 리소스가 있습니까?

감사!

편집 : 많은 훌륭한 답변을 주셔서 감사합니다. 많은 사람들이 제안한 Accelerated C ++ 외에도 C ++ For Everyone 이 훌륭한 텍스트 라는 것을 알았습니다 .


52
오 하나님, 제발 언어로 자바 스크립트를 가르치지 마십시오!
SoapBox

26
@SoapBox : 무엇과 반대로? Javascript는 제 1 언어로 훌륭하다고 생각합니다. 몇 줄의 코드로 흥미로운 일을 할 수 있으며 시작 오버 헤드 학습 컴파일러 및 IDE 등이 없으며 테스트 및 디버깅이 쉽고 OO 및 기능 프로그래밍을 모두 지원합니다. 무엇이 더 좋을까요?
kevin cline

7
왜 배열이 도입하기 쉽다고 말합니까? 포인터 나 그와 같은 복잡한 것을 생각할 필요가 없기 때문에 초보자에게는 벡터가 훨씬 직관적이라고 생각합니다.
케이시 패튼

19
고등학생들에게 C ++을 가르치고 있다면 이미 그 선을 넘었을 것입니다.
tylerl

7
C ++를 가르치는 대안은 COBOL이 아닙니다.
jhocking

답변:


40

배열과 포인터와 같이 언어가 내장 한 데이터 유형으로 시작해야하며 학생들이이를 이해하면 클래스와 OO로 이동 한 다음 STL로 이동하십시오.

그 이유는 변수와 기본 컴퓨터 아키텍처 외에 다른 많은 것을 이해하지 않고 배열을 이해하도록 사람들에게 가르 칠 수 있기 때문입니다 vector. 이동 중에 STL을 사용하는 경우 학생들은 vector정확히 어떻게 작동 하는지에 대한 단서가 없어도 살아야 합니다. 그런 다음 그 시점에 도달하면 포인터와 배열을 충분히 파악하지 못하고 자신의 벡터 클래스 작성, 링크 목록 클래스 작성 등 필요한 작업을 수행 할 때 얻을 수있는 것들이 충분하지 않습니다. 그 기능을 평가하고 활용합니다. 학생들이 "무슨 일이야?" 교사들은 "그것을 무시하면 나중에 배울 수 있습니다"라고 말합니다.

그리고 Demian 이 주석에서 지적했듯이 템플릿 오류에서 발생하는 상대적으로 암호화 된 메시지를 해독하는 것은 배열 / 템플릿이 아닌 구문에서 발생할 수있는 오류를 이해하는 것보다 훨씬 어렵습니다.

나는 약 같은 방식으로 생각하지 않습니다 coutprintf. cout연산자 오버로딩 을 사용 한다는 점을 제외하면 다른 것보다 낮은 수준은 아닙니다 .

이것은 어리석은 것처럼 보일 수 있지만 추상화로 넘어 가기 전에 사람들이 모든 것의 가장 기본적인 빌딩 블록을 이해하게하는 것에 대해 나는 완전히 광신적 입니다. 원시 포인터에 능숙해질 때까지, 배열 앞에 벡터가없고, 그런 종류의 것들이 될 때까지 스마트 포인터를 사용해서는 안됩니다.

나는 종종 이것을 말하지만 다시 말할 것입니다 : 학생들에게 먼저 긴 나눗셈을 가르치고 계산기를 사용하는 것이 계산기를 사용하도록 한 다음 나중에 긴 나누기를 가르치는 것이 좋습니다.

초보자에게 가르치는 책 은 훌륭한 C ++ 책마스터 목록을 참조하십시오 .


4
나는 실제로 같은 의견을 가지고 있었지만 Strousrup의 Teaching C ++ 서적 ( stroustrup.com/Programming )을 보았고 명시 적으로 vector배열 의 사용을 옹호합니다 . 나는 찢어졌다.
recipriversexclusion

4
@recipriversexclusion : 그냥 명백한 진술하지만, 씨 스트로브 스트 룹은 지금까지 고등학생에서)
데미안 브레히트

14
세상에 어떻게 세계 캔 누군가에있을 때, 그 수동으로 조작하는 동적으로 할당 된 배열은 C ++에 "가장 쉬운 첫 번째"경로가 될 수 있다고 생각 std::string하고 std::vector?! 32 명의 C 프로그래머가 투표를합니까? 저는 10 년 동안 C ++을 프로그래밍 초보자, 1 년 동안 Java를했던 학생들, 프로그래밍 전문가에게 가르치고 있습니다. 내가 사용 std::string하고 std::vector하루에 한에서. 내부에 상관없이 사용하기 쉽습니다. (VB의 현은 너무 복잡하기 때문에 VB의 현을 가르치는 데 주저하지 않겠습니까?)
sbi

18
당신의 downvote가 있습니다. 집에 사는 것의 혜택을 누리기 위해 집을 짓는 법을 배울 필요가 없습니다. std::vector사용하기 위해 글 을 쓸 필요는 없습니다 . 그리고 클래스는 C ++의 매우 기본적인 부분입니다. 기본이 아닌 것은 기본 배열과 포인터를 사용하여 발생하는 모든 오류를 디버깅하는 것입니다.
DeadMG

6
@DeadMG : 하우스 메타 포어가 작동하지 않습니다. 집에서 일단 기초가 세워지면 다시는 생각할 필요가 없습니다. 당신은 다른 모든 것을 계속해서 만들었습니다. C ++에서 순간 당신이 참조 new키워드, 당신은 메모리 관리 terrirory로 바로 돌아이야. 때로는 도서관에서 포인터를 요구하기 때문에 "소유권을 가져갈 것인가? 아니면 여전히 정리해야합니까?"라고 스스로에게 물어봐야합니다. 내 발 기초. 손톱이나 코크와 같은 것.
Chris Eberle

38

이것은 내 자신의 경험이다. 가치가있는 무엇이든 가져 가십시오.

프로그래밍을 시작했을 때를 되돌아 보면 메모리에 대해 먼저 배웠 으면 좋겠다 . 아니요, 흥미롭지 않습니다. 그것은 당신을 유약시킬 것입니다. 그러나 가르치는 것은 엄청나게 쉬운 개념입니다. 1D 테이블을 보여주고 몇 가지 정신 운동을하도록하십시오.

레슨 1 :
이것은 10 바이트의 메모리입니다. 이것은 셀 번호 3에 들어가는 문자 ​​"a"입니다. "a"는 값이고 3은 주소입니다. 승인? 이것은 셀 5에 들어가는 숫자 3입니다. 값은 3이고 주소는 5입니다. 이제 숫자 3은 무엇을 의미 할 수 있습니까? 그것은 단지 숫자 3 일 수도 있고 주소 3에 대한 참조 일 수도 있습니다. 1이 숫자 일 수도 있고 국가 코드 일 수도 있습니다. 그것은 단지 숫자이며, 우리가 그것을 어떻게 취급하는지에 달려 있습니다.

레슨 2 :
이진법으로 계산하는 법을 배우자. 이진 핑거 카운팅을 사용하여 10을 세겠습니다. 재미있는가요? 그게 네 손가락 만 필요한 걸 보시겠습니까? 따라서 우리는 단지 4 비트 (1/2 셀) 만 필요하다고 말합니다. 한 손으로 믿을 수있는 가장 높은 것은 무엇입니까 (답은 31). 두 손은 어떻습니까 (답은 1023입니다). 더 많은 비트가 더 높은 숫자 범위를 의미하는 방법을 설명하십시오. 메모리 셀이 8 비트라는 것을 상기 시키십시오. 숫자에 8 비트 이상이 필요한 경우 어떻게되는지 물어보십시오. 그들은 어떻게 멀티 바이트 숫자를 메모리에 논리적으로 넣을 것인가? 문자, 단락, 정수 및 길이를 소개하십시오.

레슨 3 :
C ++로 작성한 프로그램이 있습니다. 32 비트 정수를 사용합니다. 그리고 이것은 또한 숫자입니다. 그러나 이것은 포인팅에 사용되는 숫자입니다. 이 작은 별표를 사용함으로써 우리는 숫자가 포인팅에 사용될 것이라고 약속합니다. 그리고 우리가 첫 번째 숫자를 가리키는 방법은 다음과 같습니다. 작은 앰퍼샌드는 우리를 위해 가치를 채 웁니다. 깔끔해?

등. 기본 기억력이 떨어지면 다른 모든 것은 케이크입니다. 컴파일러가 가장 어려움을 겪는 마술 같은 일을하거나 메모리 관리에 대해 생각할 필요가 없다고 가정하는 것은 가난한 학생들입니다. 그리고 C ++는 어떤 것들이 자동적으로 정리되기 때문에 (즉, 법선 벡터) 다른 것들은 그렇지 않기 때문에 (즉 "new"를 사용하여 할당 된 벡터) C ++가 물을 흐릿하게 만듭니다. 그리고 심지어 문자열에서 시작하지 마십시오 (char * vs. std :: string-포인터 지식없이 설명해보십시오).

로봇 경쟁이 어떤 플랫폼을 대상으로할지 모르겠지만 메모리가 제한된 환경에서는 메모리 관리 기술이 중요합니다.

편집하다

일단 당신이 그들에게 기본을 가르쳤다면 그렇습니다. 기술적으로 그들은 단지 다른 라이브러리이지만, 둘 이상의 패러다임과 그것들을 혼동 할 필요는 없습니다. C ++ 도구 (포인터 및 배열 포함)를 제공하십시오.


그것은 좋은 반응입니다. 내가 생각하는 문제는 당신이 가르 칠 수 있다는 것입니다. 그러나 많은 아이들 (처음에는 관심 부족으로 인해 포인터 / 메모리 개념으로 어려움을 겪은 사람이었습니다)은 필요한 지식이지만 재미가 없기 때문에 그것을 조정합니다. C ++로 성공적으로 프로그래밍합니다.
Keith Layne

3
그렇습니다, 여기에는 논쟁이 없습니다. 같은 이유로 아이들은 수학과 지리학을 조정합니다. 나중에 야 그들은주의를 기울여야한다는 것을 깨닫게됩니다. 특정 문제가 여전히 해결되지 않았 음을 확신하십시오.
Chris Eberle

+1. C ++을 소개 한 후 메모리가 어떻게 작동했는지에 대한 이해를 종합 한 것을 기억합니다. 그래도 나는 그것을 사전에 이해할 수 있다고 생각하지 않습니다 (값이 표현되는 방법과 같은 실제적인 의미는 아닙니다).
카메론

+1, 이것이 내가 말하려는 것이지만 더 좋습니다. 기계를 훈련 때, 그들은 해야 당신이 그들을 전문가를 운전하기 전에 엔진을 이해합니다.
세스 카네기

예, 초보자가 이것을 파악할 수 있는지 여부에 관계없이 계속 나아갑니다. 너무 우스운 일이다. (그리고 갑자기 컴퓨터가 멍청한 기계가 아닌가?)라고 말하는 것을 발견 할 수 있지만, 앞으로 더 흥미 진진한 일에 대한 약속에주의를 기울여야한다. "큰 그림"을 보지 않으면 전반적인 접근 방식이 무의미합니다.
Chris Eberle

31

첫날부터 STL 사용을 시작해야합니까? 벡터 또는 표준 배열을 고수합니까? 배열을 도입하기는 쉽지만 포인터 오류를 잡기가 더 어려울 수 있습니다.

표준 라이브러리 유형을 사용하십시오. a std::string또는 std::vector이들이 자주 사용해야하는 것 (대부분의 구현)은 이러한 유형의 오류 감지 및 오류 처리를 제공하면서 학생들의 많은 복잡성을 추상화합니다.

메모리 구성 방법과 메모리 관리 방법 (C 스타일)을 가르치는 데 많은 시간을 할애하거나, 관용적 언어 유형을 사용하여 직접 작업 한 다음 필요한 경우 구현 세부 정보를 설명 할 수 있습니다 ( 배열이 무엇이고 어디에 사용되는지 더 잘 이해합니다).

std::vector(create / read / write) 의 구문은 C 배열보다 훨씬 복잡하지 않습니다. 이에 비해 수동 메모리 관리와 새로운 학습자가 C 어레이에 대해하는 모든 일반적인 오류는 배우고 가르치고 사용하기가 훨씬 더 어렵습니다.

I / O의 경우 cout 등을 고수해야합니까 아니면 printf를 배우기가 더 쉬울 것이라고 생각하십니까?

cout. 개인적 cout으로는 배우기가 더 쉽다고 생각 합니다. 더 중요한 cout것은 더 안전하고 다재다능하며 객체가 인쇄되는 방법을 정의 할 수 있기 때문에 선택해야합니다. 이는 이미 일부 표준 라이브러리 유형을 사용하여 기본 제공 기능 및 유형 안전성을 가지고 있음을 의미합니다. 마지막으로, cout뿐만 아니라 학습해야 할 수도 있음을 알면 혼합 프로그램으로 끝납니다 printf.

사실 Koenig와 Moo가 Accelerated C ++를 읽고 지시에 사용할 수 있다고 생각합니다 (질문 3에 간접적으로 대답). 이 책에서 그들은 std::cout바로 전에 return(3 페이지) 를 소개 하고, 10 장까지 포인터와 배열을 저장합니다. 만약 그 책의 서문을 복사하여 당신의 질문에 대한 답으로 붙여 넣을 수 있다면, 그렇게 할 것입니다. (참고 : C ++ 교육의 관점에서 읽으십시오.)

편집 은 서문입니다

어린 학습자에게 적합한 C ++ 온라인 리소스가 있습니까?

Accelerated C ++ (일반적으로 프로그래밍에 대한 배경 지식을 사용하지 않음)을 사용하지 않으려면 Eckel 's Thinking in C ++ 을 원할 것 입니다. 나는 그것을 읽지 않았지만 자유롭게 배포 된 C ++ 소개 텍스트입니다.


1
+1 ... 그리고 나는 "그들은 반환하기 직전에 std :: cout을 소개한다"(3 페이지)에 열심히 노력했다. :)
Felix Dombek

1
@Felix와 std::cout소개 직전에 중괄호가 도입되었습니다 =) (유비쿼터스 "Hello, World"의 간단한 해부입니다)
justin

1
나는 Koenig와 Moo의 책의 추천을 진심으로 두 번째로 생각합니다. 그것은 C ++과 프로그래밍을 가르치는 것을 목표로합니다. C ++에서의 Bruce Eckle의 사고는 주로 절차 적 언어 (C 또는 Basic과 같은)에 대한 경험이있는 사람들에게 C ++를 가르치는 것을 목표로합니다.
Stephen C. Steel

11

고려해야 할 한 가지는 전형적인 FIRST 코드에서 모든 형태 (구조, 클래스, 배열, 벡터, 목록)의 데이터 구조가 매우 작은 역할을한다는 것입니다. 일반적으로 매우 적은 양의 센서 데이터를 처리하고이를 사용하여 매우 작은 액츄에이터 움직임을 결정합니다.

그러나 않는 큰 역할을 할 수있는 매우 이해하기 어려운의 다른 형태 모두 제어 이동합니다.

그래서 저는 통제에 많은 중점을 두었습니다. 기본 시작 : if, for, while. 그들에게 많이 연습하게하십시오. 그들에게 그 사실을 알리십시오 ....

...하지만 힘들어집니다. 적당한 크기의 로봇 코드는 결국 더 까다로운 제어 패턴을 얻습니다.

  • 모든 것을 호출 하는 큰 "메인"루프

  • 상태 머신 (이것은 많이 나타납니다)

  • 이전 값 저장 / 카운터 실행 (PID와 같은)

초보자는 이해하기 어렵습니다. 프로그램이 이와 같은 코드를 통해 어떻게 움직이는 지 생각하는 것은 혼란 스럽지만 지금은 알지 못할 수도 있습니다. 그것은 학생들에게 언어 자체보다 더 많은 문제를 줄 것입니다.

또한 행운을 빕니다! 시즌이 잘되기를 바랍니다.


2
+1; 이것은 일반적인 데스크톱 환경이 아니라 실제 포함 된 코드입니다. 상태 머신은 std :: vector vs 배열보다 훨씬 중요합니다.
MSalters

8
  • 첫날부터 STL 사용을 시작해야합니까? vector아니면 표준 배열을 고수합니까? 배열을 도입하기는 쉽지만 포인터 오류를 잡기가 더 어려울 수 있습니다.

배열의 문제점은 간단한 교과서 예제를 제외하고 동적 크기의 배열이 필요하고 동적 크기의 배열이 필요한 순간이 std::vector훨씬 더 쉽다는 것입니다. 또한 동적으로 크기가 조정 된 배열을 안전하게 처리하는 유일한 방법은 자신의 클래스로 래핑하는 것 std::vector입니다.
설명 할 수없는 대중적인 신념과는 달리 학생들은 그러한 짐승을 어떻게 구현 해야할지 모르고 복잡한 역학을 구현해야하는 기능을 사용할있습니다 . 내가 주석에서 말했듯이 : 당신은 다른 언어로 문자열을 가르치지 않는 것을 고려하지 않을 것입니다. 단순히 구현이 복잡하기 때문입니까?

  • I / O의 경우 cout등을 고수해야합니까 아니면 printf배우기가 더 쉬울 것이라고 생각 하십니까?

왜 당신이 뭔가 잘못되는 순간 ( typedef일부 관련이없는 것으로 보이는 헤더에서 변경되는 순간에) 지붕을 통해 프로그램을 불어 넣는 일련의 고전 형식 문자열 규칙이 유형 안전성보다 선호 std::cout됩니까?

  • 어린 학습자에게 적합한 C ++ 온라인 리소스가 있습니까?

온라인이든 아니든 대부분의 C ++ 리소스는 나쁩니다. 그리고 읽기 어려운 글꼴이나 언어를 사용하는 것에 대해서는 이야기하지 않습니다. 눈에 띄게 사실적인 오류를 말하고 있습니다. 좋은 C ++ 리소스는 거의 없으며 주로 1 ~ 24 권의 책이 있습니다. 내가 아는 유일한 것은 온라인입니다. Bruce Eckel의 Thinking in C ++ 입니다.


10 년 동안 저는 Koenig / Moo의 Accelerated C ++ 를 기본으로 사용하는 매우 다른 배경을 가진 학생들에게 C ++을 가르쳤습니다 . 저의 과정은 그 10 년 동안 많이 바뀌 었습니다. 근본 원칙을 제외하고는 책 근처에 없습니다 . 처음부터 현대적이고 정확하고 안전한 관용구를 사용하십시오. 학생들에게 메모리를 수동으로 조작하는 방법을 가르치지 말고 나중에 안전한 관용구에 찬성하여 나중에 그것을 배우도록하십시오. 여기에 제공된 답변 중 일부에서 볼 수 있듯이 이것은 효과가 없습니다. 한 번 수동 방법을 먼저 가르친 사람들은 현대적이고 안전한 관용구의 이점을 거의 이해하지 못합니다.


7

C ++을 가르치고 싶다면 printf와 같은 C 하위 세트 대신 벡터 및 cout으로 C ++ 구문으로 직접 시작합니다.


7

첫날부터 STL을 사용해야합니까?

예. C ++에서 네이티브 배열을 사용하면 오류가 발생하기 쉬우 며 99 %의 시간이 안 좋은 연습입니다.

I / O의 경우 cout 등을 고수해야합니까?

예.

어린 학습자에게 적합한 C ++ 온라인 리소스가 있습니까?

그들은 젊지 않습니다. 프로그램을 배우는 데는 지혜가 필요하지 않고 동기 부여와 열린 마음이 필요합니다. 나는 지난 2 년 동안 고등학교에서 가르친 어떤 것도 학생이 프로그램을 배우도록 더 잘 준비시킬 것이라고 생각하지 않습니다. C ++ 의 Bruce Eckel 's Thinking 을 보았 습니까? 무료로 다운로드 할 수 있으며 잘 검토되었습니다. 인기 있지만 끔찍한 C ++ : 프로그래밍 방법 과 모든 Sam의 Teach Yourself C ++ ... 책은 피하십시오.


5

그것이 비록 내가, 제 프로그래밍 언어와 같은 고등학교에서 C ++을 배웠다 이었다 더 "C +"와 같은, 이제 당신이 그것을 언급; 우리 cout는 콘솔과 파일에 텍스트를 쓰는 데 사용 되었지만 C 함수도 상당히 getch()좋아했습니다.

기본을 가르치는 가장 효과적이고 (그리고 아마도 재미있는) 방법은 목표 지향 커리큘럼을 사용하는 것입니다. 물건 출력, 키보드 입력, 간단한 파일 I / O 등을 보여주는 것으로 시작하십시오. 간단한 텍스트로 진행하십시오. 기반 게임 (또는 로보틱스 등가물). 그런 다음 "어떻게 X를 수행합니까?"라고 물으면 이미 본 예제에서 X를 분류 할 수 있습니다. 예를 들어 "먼저 Z에서했던 것처럼 사용자로부터 입력을 받아야합니다. 3D 그래픽 ",하지만 당신은 여전히 어떻게 설명 할 수 있을까 ..."X 가능성이 그들이, 예를 수행하기 위해 추가 지식을 필요로 뭔가 때문에 (분명히이 실제로는 쉽지 않다 " 높은 수준에서 작동 방법).

당신이 보여준 예제는 블랙 박스 복사 붙여 넣은 마술로 시작하며, 프로그래밍 퍼즐 조각이 천천히 이해되면서 신비가 풀립니다. 예를 들어, 학생들은의 기초를 if매우 빨리 배우지 만 부울식이 독점적 인 if조건 (클래식 if (blah) return true; else return false;코드로 이어지는) 내에서만 사용하도록 제한되지 않는다는 것을 인식하지 못할 것입니다 .

배열 또는 벡터를 컨테이너로 선택하는지의 미묘한 점은 처음에는 학생들과 관련이없는 것 같습니다. 벡터 / 배열은 단순히 많은 변수를 하나의 변수로 색인을 통해 액세스 할 수있는 방법입니다. 할 수있는 곳에 고착하십시오. 나중에도 포인터를 이해하지 못합니다. 그것은 당신이 설명하지 말아야한다는 것을 말하는 것이 아닙니다. 한 번에 모든 것을 설명 할 수 없으며 설명하는 내용이 완전히 흡수되지는 않습니다. 인간은 선형이 아니라 유기적으로 학습합니다. 운영자 과부하가 무엇인지 제대로 이해하기 전에 cout년 동안 사용 했습니다 !

아, 그리고 반복을 두려워하지 마십시오. "이것은 우리가했던 Hello World 프로그램과 같습니다. 어떻게 콘솔에 텍스트를 썼는지 기억하십니까?" (아니 ...) "확실히하기 위해 다시 봅시다." ... 그리고 질문하십시오! 학생들에게 재미있는 예제와 많은 상호 작용을 계속하십시오.

C ++은 복잡한 언어이며, 무엇을 하든지 학생들의 복잡한 정도 (및 일반적으로 프로그래밍 기술의 상당 부분)를 잃게됩니다. 당신이 그들에게 보여주는 모든 것은 그들에게 새로운 것입니다; 그것의 대부분은 깊은 이해 수준에 빠지지 않을 것입니다 (적어도 즉시는 아닙니다). 메모리 작동 방식, PC 구성 요소의 상호 작용 방식, 스택 및 힙 구성 요소, 포인터, 클래스, 심지어 루프 및 if-else 체인 대다수 가 제대로 이해하지 못합니다 . 괜찮습니다! 그것들은 사용되는 것으로 이해 될 필요가 없습니다. 놀라운 4 개의 멋진 프로그램은 5 배의 중복 중복 if과 같은 이름의 43 개의 변수를 가진 아주 못생긴 1000 줄 함수로 작성 될 수 있습니다 x_2r. 중요한 것은 학생들이 끊임없이 배우고 개선하고 있다는 것입니다. 블랙 박스는 장기적으로 투명 해 지거나 (적어도 반투명 한 회색) 괜찮습니다. 과정이 끝나면 디자인 패턴이 무엇인지 알지 못할 수도 있지만 처음 몇 주 동안 작성한 프로그램을 되돌아보고 코드를 울릴 수 있어야 합니다. 그들은 그들이 작성한 첫 번째 프로그램이 실제로 어떻게 작동하는지에 대해 상당한 수준의 세부 사항을 이해해야합니다. 그러나 그들은 모든 것을 알지 못합니다 – 아직 .


5

나는 고등학교에서 대학에 이르기까지 인생에서 많은 프로그래밍 수업을 들었습니다. 나는 물건을 스트림에 인쇄하는 방법 이외의 첫 번째 C ++ 클래스에서 너무 많이 배우지 않았다고 말할 수 있습니다.

지난 몇 년간 개발자로서 실제 작업을해온 어린 학생으로서의 조언은 그것들을 어리석지 않게하는 것입니다. 그들이하고있는 일과 운영 체제 수준까지 어떻게 작동하는지 알려주십시오 (IMO에 들어 가지 않아도 됨).

나는 C를 가르치는 것이 더 좋은 방법이라고 생각합니다 (아시다시피 거의 항상 C ++로 컴파일됩니다). 터미널이 실제로 무엇인지, 프로그램이 상호 작용하는 방식, 문자열이 메모리에서 \ 0으로 끝나는 문자 배열, malloc이 무엇인지, C ++이 추상화하는 방법, char 및 int가 메모리에 저장되는 방법 .. 이런 것들이 누군가가 개발 과정에서 문제를 만났을 때 문제를 해결하는 방법을 실제로 알게하는 것입니다.

키즈 프로그램을 사용하고 주로 질문에 대답하는 것이 중요하다는 점을 강조 할 수 없습니다. 내 경험상, 당신은 그것을 사용함으로써 언어를 배웁니다. 책과 레슨은 도움이 될 수 있고 시작하는 데 필요하지만 결국 C / C ++ 파일을 제공한다고 말합니다. 이것은 X의 예입니다. Y를 수행하고 싶습니다. X를 해킹하여). 그들에게 매뉴얼 페이지 (* NIX를 사용하는 경우)를 사용하는 방법을 보여 주거나 cplusplus.com을 보여주고 std 라이브러리를 탐색하여 스스로 알아낼 수있게하십시오.

TL; DR 아이들이 스스로 가르치게하십시오. 구조를 제공하고 질문에 대답하기 위해 거기에 있습니다.

또한 : 링크 된 목록은 진실입니다!


4

일반적인 방법으로 프로그래밍을 가르치는 것이 아니라 로봇 등을 사용하여 일종의 임베디드 프로그래밍을 가르치는 것입니다. 내가 올바르게 이해한다면.

먼저, 사용할 라이브러리와 필요한 라이브러리를 확인해야한다고 생각합니다.

C 라이브러리를 사용하여 많은 포인터와 C 배열을 사용하거나 C와 비슷한 경우 사용 방법이나 사용 이유를 가르쳐 줄 방법이 필요하다고 생각합니다.

그러나 문자열과 벡터로 시작하는 간단한 코드를 보여줄 수 있습니다. 이것이 C ++의 작동 방식입니다. 그렇다고해서 그들에게 포인터를 가르 칠 수는 없습니다.

어쩌면 STL을 사용하여 C와 유사한 저수준 C ++와 고수준 C ++의 차이점을 분명히해야합니다. 초보자를위한 C ++에서 가장 어려운 점 중 하나는 C가 무엇인지, C ++이 무엇이며 다른 시스템 API가 무엇인지 확인하는 것입니다.

여기서 목표는 일반적인 프로그래밍을 배우는 것이 아니라 로봇 경쟁에 참여하는 것이기 때문에 이러한 방식으로 수업을 진행했습니다.


2

저는 작년 말에 학생들에게 C ++을 가르치기 시작했고 올 여름에도 FIRST Robotics Team을 위해 학생들을 가르치기 시작했습니다.

우리는 Stroustrup의 프로그래밍-원리와 C ++를 사용하는 연습을 사용하고 있습니다. 나는 그 책이 접근 가능하고 읽기 쉽고 잘 정리되어 있음을 발견했다. 우리는 약 6 명의 학생들이 스스로 장을 읽도록했습니다. 용어와 질문에 도움을 줄 수 있습니다. 그들은 책의 모든 연습을합니다.

나는 학생들에게 14 장을 공부하게했다. 스트림에서 장을 건너 뛰었다 (FRC 프로그래밍에는 유용하지 않음). 14 장을 통해 서브 클래스를 소개하므로 유용합니다. 그러나 서브 클래스와 관련된 생성자와 소멸자를 더 잘 이해하려면이 책에서 더 멀리 갈 필요가 있습니다.

학생들을 과소 평가하지 마십시오. 학생들은 책을 읽고, 읽고, 배우고, 연습하는 것을 기쁘게 생각합니다. 그리고 이것은 여름철에 그들 만의 시간이었습니다! 이해하지 못하는 많은 학생들이 있습니다. 그들은 다른 것으로 나아가 야한다. 모든 사람이 프로그래밍을 이해하는 것은 아닙니다.

가장 큰 장벽은 언어 나 책이 아닙니다. 개발 환경입니다. Visual Studio Express는 처음 사용하는 사용자에게는 곤란할 수 있습니다. 학생들이 환경보다는 프로그래밍에 집중할 수 있도록 도움을 줄 수 있습니다. 그러나 프로그래머가 새로운 개발 시스템에 적응하는 데 많은 시간을 소비하므로 환경을 배우는 것이 중요합니다.

행운을 빕니다.


+1 : 최고의 답변. 교과서의 탁월한 선택. 성공을 축하합니다.
kevin cline

1

C ++을 가르치고 싶지만 C 구조는 가르치지 않지만 먼저 알아야 할 대부분의 프로그래밍 구조는 모든 언어에 공통적이며 C ++ 버전은 C에 기반합니다.

  1. 이것은 프로그램을 만드는 방법입니다 [int main (..) {return 0; }]. 시험해 볼 프로그래밍 환경에 대한 기본 개요를 제공하십시오. 프로젝트를 작성하고 실제로 컴파일 / 실행하는 방법을 알아야합니다.

  2. 변수입니다. 변수는 데이터 (int, char, float 등)를 저장할 수 있습니다.

  3. 문자열 (C ++은 cin과 함께 사용하기가 더 쉽습니다).

  4. 데이터를 읽고 쓰는 방법입니다 (cin, cout). "안녕하세요, % s!"

  5. 조건부 (컴퓨터는 결정을 내려야합니다).

  6. 루프 (컴퓨터는 계속해서 똑같은 일을 잘합니다). while 및 for 루프를 표시하십시오.

한 시간에 두 번의 수업이 필요합니다. 실제 구성 요소에서 참조 할 수있는 간결한 메모 세트를 준비하십시오. 당신은 그것들을 훌륭한 프로그래머로 만들려고하지 않기 때문에 콘솔에서 읽고, 구조를 만드는 방법, 그리고 그들이해야 할 다른 모든 것들에 대한 예제를 제공합니다. 사용자 정의 유틸리티 라이브러리가 아닌 언어 지원 기능 만 사용하십시오. 당신은 그들을 더 혼란스럽게 할 것입니다.

시작부터 예를 들어서 잘 짜여진 코드의 예를 보여주십시오. 들여 쓰기는 가장 편한 스타일로 일관되고 괄호와 괄호가 정확해야합니다. 변수 이름은 의미가 있어야합니다. 예를 들어 슬로프를 표시하면 슬로프가 허용됨을 알게됩니다. 나쁜 출발점입니다. 올바르게 들여 쓰기를하는 것의 중요성을 강조하십시오. 제가 가르친 로트가 코드를 일관되게 들여 쓰기 할 때 그들이 어디에서 잘못되었는지 쉽게 알 수 있다는 것을 알았습니다. 그것은 대부분의 오류가 연산의 범위가 잘못 되었기 때문입니다 (루프 / 조건에 연산을 넣지 않았거나 그 반대).

그런 다음 실용적인 작업으로 넘어갑니다. 무언가를 배우는 가장 좋은 방법은 그것을 깨고 이유를 해결하는 것입니다. 코드를 컴파일하기 위해 사용하기 쉬운 환경이 있는지 확인하고 싶을 것입니다. 손으로 스크린 샷으로 문서화하십시오.

몇 가지 개념을 이해하는 데 도움이 된 좋은 예는 콜라 머신을 만드는 것입니다.

  • 항목 및 가격 메뉴를 출력합니다 (메뉴를 저장하는 것은 사용자 정의 구조의 배열이었습니다. C ++의 클래스 일 수 있음). 출력하려면 루프가 필요했습니다.
  • 사용자의 선택을 읽으십시오.
  • 사용자에게 돈을 요구하십시오. 그들은 단지 동전 단위로 센트 단위로 입력 할 수 있습니다 (Aus에서는 1, 5, 10, 20, 50, 100, 200). 알 수없는 명칭을 무시하십시오. 사용자가 충분한 돈을 넣지 않은 상태에서 계속 물어보십시오 (루프).
  • 가장 적은 수의 동전을 제공하여 필요한 변경 (모듈로 나누기)을 계산하십시오. 출력을 화면에 인쇄하십시오.
  • 다음 사용자를 기다립니다.

그 후에 C ++ 구문으로 넘어갈 수 있습니다. 그들이 최소한 기본 프로그램을 만들기 전에 너무 멀리 다이빙하고 싶지 않습니다.

그리고 무엇보다도 질문에 헌신 할 여가와 인내심이 많이 있습니다. 많은 사람들이있을 것이며, 그들 대부분은 사소한 것이기 때문에 대답이 분명하기 때문에 당신을 울게 할 것입니다.


1

C ++ 관점 ( "C ++ hello world")에서 문제를 가르치지 말고 문제 영역 (이 경우 로봇 공학)에서 사물을 가르쳐야한다고 생각합니다. 그래서 당신의 hello world는 led를 깜박이거나 모터를 운전할 것입니다.

물론 유형, 기능 및 IO 작업과 관련하여 개념적으로 의미있는 C ++ 작업이 증가함에 따라 각각의 작은 로봇 작업을 분해 할 수 있습니다.

나 자신에 관해서는, 나는 전문 프로그래머가 아니며 Java, C ++ 및 Python을 배우려고했습니다. 나는 정말로 (단순한) 해결할 문제가 있었을 때 무언가 (파이썬)을 달성하기 시작했습니다. 그것은 언어 자체의 부수적 인 구현 세부 사항에 대한 과도한주의를 피하면서 요점을 바로 잡았습니다.

그래서 저는 조언을 드릴 것입니다 : 언어 매뉴얼을 읽지 말고 당신이 선택한 언어로 일하는 법을 배우십시오. 그것이 사람들에게 동기를 부여하는 것이라고 생각합니다.


0

나는 엄격한 C ++을 가르 칠 것이다. printf를 작성할 때 작은 매개 변수 또는 잘못된 유형에 이상한 일이 발생하는 방법을 알고 있습니까? 잘못된 포인터를 사용하면 나쁜 일이 발생할 수 있습니까? 가르쳐주지 마십시오

첫날부터 나는 참조, STL을 사용하는 방법을 가르치고 포인터를 사용하기 위해 마크를 잃어 버렸다고 말합니다. 스마트 포인터도 가르치지 마십시오. 포인터를 사용하는 유일한 시점은 GUI를 수행하고 이미지 상자와 같은 객체가 존재해야하며 유효한 이미지이거나 null이어야합니다. 콘솔 프로그래밍의 경우 오랫동안 포인터 (스마트 또는 원시)를 사용하지 않았습니다.

그래서 간단히 말해서 그들에게 문제를 일으킬 수있는 것을 가르치지 마십시오. iostreams, 구조체를 가르치고 typecast에서 마크를 잃어 버리고 디자인을 가르치려고하지 마십시오. 당신은 누구나 노련한 전문가 가되기를 원하지 않습니다


0

C ++ 강의 시리즈는 아니지만 Richard Buckland의 COMP1917 은 C 프로그래밍에 대한 훌륭한 강의 시리즈입니다 ( COMP1927 , 데이터 구조).

제 생각에 C ++은 신입생에게는 너무 복잡하지만 C는 세상이 더 단순하고 새로운 C ++ 프로그래머들에게는 종종 부족한 시스템 프로그래밍의 훌륭한 토대를 제공합니다.


0

나는 상당수의 상용구 코드로 시작하여, 프로그래밍으로 바로 "멋진 일을하도록"도와주고 시간이 지남에 따라 어떻게 작동하는지에 대한 이해를 구체화 할 것이다. LED 깜빡임을 만들기 위해 C ++의 모든 복잡성을 이해하거나 이해할 필요는 없습니다. "이 코드를 넣으면 LED가 깜박입니다." 그리고 나서 "이봐, 루프가 무엇인지에 대해 이야기 해 봅시다. 루프를 작성하면 50 줄의 코드를 쓰지 않고도 LED를 50 번 깜박일 수 있습니다. 멋지지 않습니까?" 이제 사용자가 컨트롤 박스에서 버튼 A를 눌렀을 때 공압을 활성화하여 깃발을 올리려고합니다. 여기에 코드를 추가하는 방법이 있습니다. 또는 컨트롤 박스의 스위치 2가 켜진 경우 드릴 모터를 정방향이 아닌 역방향으로 실행합니다.

관심있는 문제를 해결하기 위해 "충분히"가르치는 데 초점을 맞추면 훨씬 덜 압도적이고 접근하기 쉬워집니다. 그들이 정말로 관심이 있고 복잡성을 이해하고 싶다면 아마도 현지 JC에서 프로그래밍이나 여름 학교 코스를 수강하는 포괄적 인 책을 읽을 것입니다.

로봇에서 "제어 할 수있는 것들"의 목록을 작성하고 각각을 하나의 교훈으로 바꾸십시오.

  • 스위치가 특정 설정에있는 경우 "시원하게"무언가를 수행합니까?
  • 공압 밸브에 개폐를 지시하십시오 (예 : 그래버 부착)?
  • 드릴 모터를 켜고 끄십시오 (구동 트레인의 경우)?
  • 장애물 감지 센서가 활성화 된 경우 로봇 방향을 변경합니까?
  • 로봇이 2 륜 대 4 륜 구동 모드로 전환합니까?
  • 조이스틱의 감도를 조정 하시겠습니까?
  • 기타

형식 지정자를 믹싱하는 것이 매우 쉽고 잘못된 지정자가 종종 프로그램을 중단시키는 자동 레시피이기 때문에 printf를 통해 cout을 가르치는 것처럼 가장 바보 같은 구성 요소를 가르치는 것을 고수 할 것입니다. 마찬가지로 벡터는 일부 메모리 관리 복잡성을 난독 화합니다. 작동 방식 또는 STL 라이브러리에 대한 모든 세부 사항에 대해 걱정하지 마십시오. X를 달성하기 위해 알아야 할 최소한의 정보 (예 : STL 라이브러리 데이터 구조를 사용해야 할 수도 있음)


0

Deitel과 Deitel의 C ++ 프로그래밍 방법을 사용하십시오 . 내 의견으로는 우수 교과서.

초보자에게 프로그래밍 방법을 가르치고 동시에 고급 레벨에서 프로그래밍하도록하는 것처럼 들립니다. 당신이 그들에게 어떤 원숭이를 주길 원한다면 원숭이가 코드 조각을 이해하지 않고 코딩하는 것을 보게되면 실패 할 운명입니다.

초보자를위한 STL을 피하십시오.

로봇에 대한 코딩 솔루션이 있거나 로봇의 모양에 대한 매우 좋은 아이디어가 있다면 교과서의 수업을 로봇의 코딩 작업에 "매핑"할 수 있습니다. 그러나 교과서가 학습을 주도하게하십시오.

코딩을 강요하고 학생들에게 매우 좁은 수업과 언어에 대한 노출을 제공하면 작성한 코드의 바다가 점점 커짐에 따라 방금 개를 젓는 법을 배우는 것과 같을 것입니다. 필요합니다.

"그들은 cout이나 printf를 배워야합니까?"라는 질문이 아닙니다. 주어진 로봇 프로그래밍 작업을 위해 코드를 작성하는 방법에 대한 통찰력을 충분히 얻을 수있는 충분한 학습 문제입니다.

이것이 읽기 과제라면, 그들이 알고있는 모든 것이 단순한 주제 동사 문장이고 당신이 알고 있는 어휘의 절반 만이 요구된다면 결과는 어떻게 될까요 ?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.