Ensinar C ++ para alunos do ensino médio: onde traçar a linha?


35

Estarei orientando uma equipe de estudantes do ensino médio para a PRIMEIRA Competição de Robótica, a maioria das equipes aqui desenvolve [seu software de robô usando C ++. Para muitos dos alunos da equipe, esta será sua primeira introdução à programação. Eu não teria escolhido C ++ para ensinar programação para estudantes do ensino médio (por exemplo, Python ou Javascript seria mais fácil, eu acho), mas a escolha está definida.

Quero ensiná-los C ++ adequado (ou seja, evitar um dialeto C / C ++ misto, ou seja, C +), mas também não quero assustá-los com complexidade desnecessária. Para esse assunto:

  • Devo começar a usar o STL desde o primeiro dia, esp. vectorou apenas ficar com matrizes padrão? As matrizes são mais fáceis de introduzir, mas os erros do ponteiro podem ser mais difíceis de detectar.
  • Para E / S, devo seguir coutetc., ou você acha printfque seria mais fácil aprender?
  • Existem recursos on-line para C ++ adequados para esses jovens alunos?

Obrigado!

EDIT : Obrigado por tantas excelentes respostas. Além do C ++ acelerado , sugerido por muitas pessoas, descobri que o C ++ para todos é um excelente texto.


52
Oh Deus, por favor, não ensine ninguém javascript como primeira língua!
SoapBox 12/09

26
@SapapBox: em oposição a quê? Eu acho que o Javascript é ótimo como primeira língua. Você pode fazer coisas interessantes com algumas linhas de código, não há compiladores de sobrecarga de inicialização e IDEs, etc., é fácil testar e depurar e suporta programação OO e funcional. O que poderia ser melhor?
kevin cline

7
Por que você diz que matrizes são mais fáceis de introduzir? Eu acho que os vetores são muito mais intuitivos para os iniciantes, pois você não precisa pensar em ponteiros ou em algo complexo como esse.
Casey Patton

19
Se você está ensinando C ++ a estudantes do ensino médio, já passou dos limites.
tylerl

7
A alternativa para o ensino de C ++ não é COBOL.
Jhocking

Respostas:


40

Eu acho que você deve começar com os tipos de dados que a linguagem incorporou, como matrizes e ponteiros, e quando seus alunos os compreenderem, passe para as aulas e o OO, depois o STL.

O motivo é que você pode ensinar as pessoas a entender matrizes sem entender muito mais além das variáveis ​​e da arquitetura subjacente do computador, mas não pode ensiná-las a entender vectorsem antes ensinar as aulas. Se você usar o STL desde o início, seus alunos terão que apenas viver sem ter uma idéia de como vectorfunciona exatamente. E então, quando você chegar nesse ponto, eles não terão uma compreensão suficiente de ponteiros, matrizes e coisas que você obtém ao fazer coisas como escrever sua própria classe de vetores, escrever sua própria classe de lista vinculada, etc., que serão necessários apreciar e explorar seus recursos. Me incomoda quando os alunos dizem "o que é isso?" e os professores dizem "apenas ignore, você aprenderá mais tarde".

E como Demian apontou nos comentários, decifrar as mensagens relativamente enigmáticas que você recebe dos erros de modelo é significativamente mais difícil do que entender os erros que você pode obter de estruturas de matrizes / não de modelos.

Eu não sinto o mesmo sobre coute printf. Nenhum dos níveis é inferior ao outro, exceto que coututiliza sobrecarga do operador.

Isso pode parecer estúpido, mas sou absolutamente fanático por fazer as pessoas entenderem os blocos de construção básicos de tudo antes de passar para as abstrações. Você não deve usar ponteiros inteligentes até ter conhecimento de ponteiros brutos, sem vetores antes de matrizes, esse tipo de coisa.

Costumo dizer isso, mas vou repetir: é melhor ensinar aos alunos a divisão longa primeiro e depois deixá-los usar uma calculadora do que deixá-los usar uma calculadora e depois ensinar a divisão longa depois.

Quanto aos livros para ensinar iniciantes, consulte a lista principal de bons livros em C ++ .


4
Na verdade, eu tinha a mesma opinião, mas olhei para o livro de ensino C ++ da Strousrup ( stroustrup.com/Programming ) e ele defende explicitamente o uso de vectormais de matrizes. Estou dividido.
recipriversexclusion 12/09/11

4
@recipriversexclusion: Apenas dizendo o óbvio, mas o Sr. Stroustrup é longe de um estudante do ensino médio;)
Demian Brecht

14
AMD. Como no mundo alguém pode pensar que manipular manualmente matrizes alocadas dinamicamente pode ser a rota "mais fácil primeiro" para C ++, quando há std::stringe std::vector?! Aqueles programadores de 32 C estão votando? Eu ensino C ++ há uma década, para iniciantes em programação, para estudantes que tiveram um ano de Java e para profissionais de programação. Eu uso std::stringe std::vectordesde o primeiro dia. Eles são fáceis de usar, independentemente de suas entranhas. (Você não seria tímido volta de ensinar corda do VB, porque é muito complexo no interior?)
SBI

18
Aqui está o seu voto negativo. Você não precisa aprender a construir uma casa para aproveitar os benefícios de viver em uma casa. Você não precisa escrever std::vectorpara poder usá-lo. E as classes são uma parte extremamente básica do C ++. O que não é básico é depurar todos os erros que eles receberão usando matrizes e ponteiros nativos.
DeadMG

6
@DeadMG: A metaphore da casa não funciona. Em uma casa, depois que a fundação é construída, você nunca mais precisa pensar nela. Você continua construindo tudo o resto. No C ++, no instante em que você vê a newpalavra - chave, você volta ao território de gerenciamento de memória. E, muitas vezes, as bibliotecas pedem dicas e você precisa se perguntar: "isso vai se apropriar? Ou ainda preciso limpá-lo?". Fundação meu pé. Mais como uma unha ou calafetar ou algo assim.
Chris Eberle 12/09

38

Esta é a minha própria experiência. Leve-o para o que vale a pena.

Olhando para trás, quando comecei a programar, realmente gostaria de ter aprendido sobre a memória primeiro . Não, não é emocionante. Isso fará você olhar por cima. Mas é um conceito ridiculamente fácil de ensinar. Apenas mostre uma tabela 1-D e faça-a passar por alguns exercícios mentais:

Lição 1:
são 10 bytes de memória. Essa é a letra "a" sendo colocada no número da célula 3. "a" é o valor e 3 é o endereço. OK? Este é o número 3 que está sendo colocado na célula 5. Seu valor é 3 e seu endereço é 5. Agora, o que o número 3 pode significar? Bem, poderia ser apenas um número 3 - ou - poderia ser uma referência para o endereço 3. Assim como 1 pode ser um número ou pode ser um código de país. É apenas um número, tudo depende de como tratamos.

Lição 2:
Vamos aprender a contar em binário. Vamos contar até 10 usando a contagem binária de dedos. Interessante não? Veja como isso só precisava de 4 dedos? Por isso, dizemos que são necessários apenas 4 bits (1/2 célula). Qual é o valor mais alto que você pode contar por um lado (resposta é 31). Que tal 2 mãos (resposta é 1023). Explique como mais bits significa intervalos de números mais altos. Lembre-os de que uma célula de memória tem 8 bits. Pergunte o que acontece quando um número precisa de mais de 8 bits. Como eles colocariam um número de vários bytes na memória (de uma maneira lógica)? Apresente-os a caracteres, shorts, números inteiros e longs.

Lição 3:
Aqui está um programa que escrevi em C ++. Ele usa números inteiros de 32 bits. E isso aqui também é um número. Mas este é um número usado para apontar. Ao usar esse pequeno asterisco, estamos prometendo que o número será usado para apontar. E aqui está como apontamos para o primeiro número. O pequeno e comercial preenche o valor para nós. Neat hein?

etcetera. Depois de baixar a memória básica, tudo o resto é bolo. Os alunos pobres que presumem que o compilador está fazendo algo mágico (ou que nunca precisam pensar em gerenciamento de memória) são os que mais sofrem. E o C ++ atrapalha as águas porque algumas coisas são limpas automaticamente (ou seja, um vetor normal) enquanto outras não (ou seja, um vetor alocado usando "novo"). E nem me inicie em strings (char * vs. std :: string - tente explicar isso sem o conhecimento do ponteiro).

Não sei em qual plataforma sua concorrência de robôs será direcionada, mas se for um ambiente de memória limitada, as habilidades de gerenciamento de memória serão cruciais.

EDITAR

Depois de ensinar os fundamentos, sim, eu digo: vá em C ++ todo o caminho. Tecnicamente, são apenas bibliotecas diferentes, mas sim, não faz sentido confundi-las com mais de um paradigma. Dê a eles ferramentas C ++ (que incluem ponteiros e matrizes).


Essa é uma resposta bem colocada. O problema que eu acho é que você pode ensinar que, mas muitas crianças (eu era uma das que lutaram primeiro com os conceitos de ponteiro / memória devido à falta de interesse) simplesmente ajustam o problema, porque não é divertido, mesmo que seja o conhecimento necessário programar com êxito em C ++.
Keith Layne

3
Sim, nenhum argumento aqui. Pela mesma razão, as crianças desafiam matemática e geografia. Só mais tarde eles percebem que deveriam estar prestando atenção. Certamente esse problema em particular ainda não foi resolvido.
Chris Eberle

+1. Lembro-me de reunir meu entendimento de como a memória funcionava por um bom tempo depois que fui apresentado ao C ++. Eu não acho que eu poderia ter entendido isso de antemão, mas não em nenhum sentido prático, como a forma como os valores são representados.
Cameron

+1, é o que eu estava tentando dizer, mas melhor. Ao treinar mecânicos, eles precisam entender o mecanismo antes de torná-los especialistas em direção.
Seth Carnegie

Sim, eu vou e volto para saber se os iniciantes podem ou não entender isso. É ridiculamente fácil (e de repente você se vê dizendo "uau, os computadores são máquinas profundamente estúpidas, não é?"), No entanto, exige que prestem atenção e se mantenham na promessa de coisas mais emocionantes por vir. Não ver o "quadro geral" torna a abordagem geral um pouco entorpecente.
precisa saber é o seguinte

31

Devo começar a usar STL desde o primeiro dia, esp. vetor ou apenas ficar com matrizes padrão? As matrizes são mais fáceis de introduzir, mas os erros do ponteiro podem ser mais difíceis de detectar.

definitivamente vá direto ao uso de tipos de biblioteca padrão. um std::stringou std::vectoré o que eles costumam usar e (a grande maioria das implementações de) esses tipos oferecem alguma forma de detecção e tratamento de erros, enquanto abstraem muitas das complexidades dos alunos.

você pode gastar uma boa parte do tempo ensinando aos alunos como a memória é estruturada e como gerenciar a memória (estilo C), ou pode trabalhar diretamente usando os tipos idiomáticos do idioma e, em seguida, explicar os detalhes da implementação, se necessário (e quando melhor entendimento do que é uma matriz e de onde é usada).

a sintaxe de std::vector(criar / ler / escrever) não é muito mais complicada que a de uma matriz C. Em comparação, o gerenciamento manual de memória e todos os erros comuns que os novos alunos cometem com as matrizes C são muito mais difíceis de aprender, ensinar e usar.

Para E / S, devo ficar atento, etc., ou você acha que printf seria mais fácil de aprender?

cout. pessoalmente, acho que couté mais fácil aprender. talvez mais importante, você deve escolher coutporque é mais seguro, versátil e permite definir como um objeto é impresso, o que significa que você já possui funcionalidades e segurança de tipo incorporadas usando alguns tipos de biblioteca padrão. finalmente, você acabará com programas mistos quando perceber que eles também precisam aprender coutalém printf.

de fato, acho que você deve ler Accelerated C ++, de Koenig e Moo, e possivelmente usá-lo para obter instruções (respondendo à pergunta 3 indiretamente). no livro, eles são apresentados um std::coutpouco antes return(página 3) e salvam ponteiros e matrizes até o capítulo 10. Se eu pudesse copiar e colar o prefácio desse livro como resposta à sua pergunta, eu o faria. (nota: eu recomendo que você o leia para a perspectiva de ensinar c ++).

Editar Aqui está o Prefácio

Existem recursos on-line para C ++ adequados para esses jovens alunos?

se você não quiser usar o Ac ++ Accelerated (que assume alguma experiência com a programação em geral), talvez você queira o Eckel's Thinking in C ++ . Eu não li, mas é um texto de introdução C ++ distribuído gratuitamente.


11
+1 ... e eu LOL'D duro "que introduzem std :: cout pouco antes da volta (página 3)" gotta espiada no que se :)
Felix Dombek

11
@Felix e diretamente antes std::coutda introdução, chaves são introduzidas =) (é uma simples dissecação do onipresente "Olá, Mundo")
justin

11
Em segundo lugar, recomendo vivamente a recomendação do livro de Koenig e Moo. Seu objetivo é ensinar C ++ e programação. O Pensamento de Bruce Eckle em C ++ tem como objetivo principal ensinar C ++ àqueles com experiência anterior em uma linguagem processual (como C ou Básica).
Stephen C. Steel

11

Uma coisa a considerar é que, na estrutura típica de dados do PRIMEIRO código, de qualquer forma (estruturas, classes, matrizes, vetores, listas) desempenham um papel muito pequeno. Você normalmente lida com uma quantidade muito pequena de dados do sensor e os utiliza para decidir uma quantidade muito pequena de movimentos do atuador.

Mas o que desempenha um papel enorme e pode ser muito difícil de entender são todas as diferentes formas de controle que ocorrem .

Então, eu enfatizava bastante o controle. Comece com o básico: if, for, while. Faça com que eles pratiquem muito isso. Faça-os conhecer bem aqueles ....

... mas depois fica mais difícil. Qualquer código de robô de tamanho moderado acaba atingindo alguns padrões de controle mais complicados:

  • Grande laço "principal", que chama tudo

  • Máquinas de estado (elas aparecem muito)

  • Salvando valores anteriores / contador de execução (como no PID)

Estes são difíceis de entender para iniciantes. Pensar em como um programa se move através de código como esse é confuso, talvez você não perceba agora, mas é. Isso dará a seus alunos muito mais problemas do que o próprio idioma.

Além disso, boa sorte! Espero que a temporada corra bem.


2
+1; esse não é um ambiente de área de trabalho comum, mas um código incorporado real. Máquinas de estado são muito mais importantes que std :: vector vs arrays.
MSalters

8
  • Devo começar a usar o STL desde o primeiro dia, esp. vectorou apenas ficar com matrizes padrão? As matrizes são mais fáceis de introduzir, mas os erros do ponteiro podem ser mais difíceis de detectar.

O problema com matrizes é que qualquer coisa, exceto exemplos simples de livros didáticos, exige matrizes de tamanho dinâmico, e o momento em que você precisa de matrizes de tamanho dinâmico std::vectoré muito mais fácil. Além disso, a única maneira de lidar com segurança com matrizes de tamanho dinâmico é agrupá-las em sua própria classe, o que seria um problema std::vector.
Ao contrário da crença inexplicavelmente popular, os alunos podem usar recursos que exigem que mecânicas complexas sejam implementadas sem saber como implementar essas bestas. Como eu disse em um comentário: você nem pensaria em não ensinar strings em outros idiomas, apenas porque a implementação deles é complexa, certo?

  • Para E / S, devo seguir coutetc., ou você acha printfque seria mais fácil aprender?

Por que um conjunto de convenções de cadeias de formato arcaico que fazem seu programa explodir no teto no momento em que algo está errado (o que acontece no momento em que você muda um typedefcabeçalho aparentemente não relacionado) é preferível à segurança de tipo std::cout?

  • Existem recursos on-line para C ++ adequados para esses jovens alunos?

A maioria dos recursos de C ++, online ou não, é ruim. E não estou falando sobre o uso de fontes ou linguagem difíceis de ler. Estou falando de erros factuais flagrantemente óbvios. Existem muito poucos recursos C ++, principalmente uma ou duas dúzias de livros . O único que eu sei que está online é o Pensamento de Bruce Eckel em C ++ .


Por uma década, ensinei C ++ a estudantes com formação muito diferente usando o C ++ acelerado da Koenig / Moo como base. Meu curso mudou muito nessa década, está longe de ser o livro, exceto pelo princípio subjacente: use os idiomas modernos, corretos e seguros desde o início. Não ensine seus alunos a manipular manualmente a memória, apenas para depois desaprenderem isso em favor de idiomas mais seguros. Como você pode ver em algumas das respostas fornecidas aqui, isso não funciona: quem ensinou as maneiras manuais primeiro raramente entenderá a vantagem de usar expressões modernas e seguras.


7

Se você deseja ensinar C ++, eu começaria diretamente com construções C ++ como vetor e cout, em vez do subconjunto C como printf.


7

Devo começar a usar o STL desde o primeiro dia ...?

Sim. O uso de matrizes nativas em C ++ é propenso a erros e simplesmente pratica mal em 99% do tempo.

Para E / S, devo me ater ao cout, etc ...?

Sim.

Existem recursos on-line para C ++ adequados para esses jovens alunos?

Eles não são tão jovens. Aprender a programar não requer sabedoria, apenas motivação e mente aberta. Não consigo pensar em nada ensinado nos últimos dois anos do ensino médio que melhor preparasse um aluno para aprender a programar. Você já viu o Pensamento de Bruce Eckel em C ++ ? Está disponível para download gratuito e muito bem revisado. Evite o popular, mas horrível C ++: Como programar e todos os livros de Sam, Teach Yourself C ++ ...


5

Eu aprendi C ++ no ensino médio como a primeira linguagem de programação, embora fosse mais parecida com "C +", agora que você mencionou; usamos coutpara escrever texto no console e nos arquivos, mas também algumas funções C ( getch()era a minha favorita).

Eu acho que a maneira mais eficaz (e possivelmente divertida) de ensinar o básico é usar um currículo orientado a objetivos: comece mostrando como produzir coisas, depois insira o teclado, depois E / S simples de arquivos, etc. Progresso para um texto simples jogo baseado (ou o equivalente em robótica). Então, quando perguntarem: "Como faço para X?", Você pode dividir X em termos de exemplos que eles já viram, por exemplo: "Primeiro, você precisará obter a entrada do usuário, como fizemos em Z, depois ..."(obviamente, não é tão fácil na prática, desde X provavelmente será algo que eles precisam conhecimento adicional, a fim de fazer, por exemplo, 'gráficos 3D', mas você ainda poderia explicar como ele iria trabalhar em um alto nível maneira).

Os exemplos que você mostra a eles começam como magia colada em caixa-preta, cujos mistérios são desvendados à medida que as peças do quebra-cabeça de programação são lentamente descobertas. Por exemplo, seus alunos aprenderão o básico de ifs rapidamente, mas provavelmente não perceberão que uma expressão booleana não se limita exclusivamente ao uso dentro ifda condição de uma (levando ao if (blah) return true; else return false;código clássico ).

As sutilezas de escolher uma matriz ou vetor como contêiner parecerão irrelevantes para os alunos a princípio. Um vetor / array será simplesmente uma maneira de ter muitas variáveis ​​como uma variável, acessíveis através de um índice. Atenha-se a um onde você puder. Ponteiros não serão compreendidos até mais tarde também. Isso não quer dizer que você não deva explicar as coisas; apenas que você não pode explicar tudo de uma vez, e as coisas que você explica não serão completamente absorvidas. Os seres humanos aprendem organicamente, não linearmente. Eu estava usando couthá alguns anos antes de entender corretamente o que era sobrecarga de operador!

Ah, e não tenha medo de repetição. "É como o programa Hello World que fizemos - lembra como escrevemos texto para o console?" (não ...) "Vamos passar por isso novamente apenas para ter certeza." ... E faça perguntas! Mantenha os alunos envolvidos com exemplos divertidos e muita interação.

C ++ é uma linguagem complexa e, não importa o que você faça, uma quantidade significativa dessa complexidade (e da arte da programação em geral) será perdida para seus alunos. Tudo o que você mostrar a eles será novo para eles; a maior parte não vai afundar em um nível profundo de entendimento (pelo menos, não imediatamente). Como a memória funciona, como os componentes de um PC interagem, o que são a pilha e o heap, ponteiros, classes e até loops e cadeias if-else não serão entendidos adequadamente pela maioria. Tudo bem! Eles não precisam ser entendidos para serem usados ​​- uma quantidade incrível de programas legais pode ser escrita com funções super feias de 1000 linhas, com redundantes aninhados em quintuplo ife 43 variáveis ​​denominadas coisas como x_2r. O importante é que os alunos estejam constantemente aprendendo e melhorando. As caixas pretas ficam bem desde que se tornem transparentes (ou pelo menos cinza translúcido) a longo prazo. No final do curso, eles podem não saber o que são os padrões de design, mas devem poder olhar para os programas que escreveram nas primeiras semanas e se estremecer com o código. Eles devem entender com um nível significativo de detalhes como o primeiro programa que eles escreveram realmente funciona (enquanto que quando o escreviam, eles não tinham idéia). Mas eles não sabem tudo - ainda .


5

Tive várias aulas de programação em minha vida, do ensino médio à faculdade. Posso dizer que realmente não aprendi muito com minha primeira aula de c ++, além de como imprimir coisas em um fluxo.

Meu conselho, como um jovem estudante, que apenas nos últimos anos teve algum trabalho real como desenvolvedor, é não emburrecer as coisas. Diga a eles o que estão fazendo e como ele funciona no nível do sistema operacional (não é necessário entrar no IMO da empresa).

Eu acho que ensiná-los C é a melhor maneira de fazer isso (ele quase sempre será compilado como C ++, como você sabe). Ensinando a eles o que realmente é o terminal, como o programa interage com ele, que uma string é uma matriz de caracteres terminados com \ 0 na memória, o que é malloc e como o C ++ o abstrai, como um char e um int são armazenados na memória , ect ... Essas coisas são o que faz alguém realmente saber como resolver um problema quando o encontra no desenvolvimento.

Não posso enfatizar a importância de deixar as crianças programarem e estarem lá principalmente para responder perguntas. Na minha experiência, você aprende um idioma usando-o. Livros e lições podem ser úteis e necessários para começar, mas, no final, digo que forneça um arquivo C / C ++ e diga: Este é um exemplo de X, gostaria que você fizesse Y (o que pode ser feito cortando X). Mostre a eles como usar as páginas de manual (se estiverem usando o * NIX) ou mostre a cplusplus.com e deixe-os explorar as bibliotecas std para descobrir as coisas por conta própria.

TL; DR Deixe as crianças ensinarem a si mesmas. Esteja lá para fornecer estrutura e responder a perguntas.

Além disso: listas vinculadas são a verdade!


4

Você não está ensinando a eles programação de uma maneira geral, está ensinando a eles um tipo de programação incorporada usando robôs e coisas do tipo. Se eu entendi corretamente.

Primeiro, acho que você deve verificar quais bibliotecas você vai usar e o que precisa.

Se tiver uma biblioteca C para usar ou semelhante a C com muitos ponteiros e matrizes C, acho que você precisaria de uma maneira de ensiná-los a usá-la ou por que usá-la.

Porém, você pode mostrar a eles alguns códigos simples para começar com strings e vetores, é assim que o C ++ funciona. Isso não significa que você não possa ensinar a eles dicas.

Talvez você deva deixar claro as diferenças entre C ++ de baixo nível (que se assemelha a C) e C ++ de alto nível com o STL. Uma das coisas mais difíceis em C ++ para iniciantes é ver o que é C, o que é C ++ e quais são as diferentes APIs do sistema.

Como o objetivo aqui não é aprender programação geral, mas participar de uma competição de robôs, eu havia orientado o ensino dessa maneira.


2

Comecei a ensinar aos alunos C ++ no final do ano passado e neste verão também para nossa PRIMEIRA Equipe de Robótica.

Estamos usando a programação da Stroustrup - princípios e práticas usando C ++ . Eu achei o livro acessível, legível e bem organizado. Tivemos cerca de 6 alunos lendo os capítulos por conta própria. Estou lá para ajudá-los com terminologia e perguntas. Eles fazem todos os exercícios do livro.

Eu pedi aos alunos que trabalhassem no capítulo 14. Ignorando os capítulos nos fluxos (não é útil para a programação FRC). Através do capítulo 14 é útil porque eles obtêm uma introdução às subclasses. No entanto, eles provavelmente precisam ir mais longe no livro para entender melhor os construtores e destruidores relacionados às subclasses.

Não subestime seus alunos. Os alunos ficam felizes em ter o livro, ler, aprender e fazer os exercícios; e isso foi durante o verão em seu próprio tempo! Existem muitos estudantes que não vão entender. Eles devem passar para outra coisa; nem todo mundo entende de programação.

A maior barreira não é a linguagem ou o livro; é o ambiente de desenvolvimento. O Visual Studio Express pode ser assustador para os usuários iniciantes. Você pode ser valioso ao ajudar os alunos a se concentrarem na programação e não no ambiente. No entanto, aprender o ambiente é valioso, pois os programadores passam bastante tempo se adaptando aos novos sistemas de desenvolvimento.

Boa sorte.


+1: melhor resposta de longe. Excelente escolha de livro de texto. Parabéns pelo seu sucesso.
Kevin cline

1

Você diz que deseja ensiná-los C ++, mas não ensinar nenhuma construção C, mas a maioria das construções de programação que eles precisam saber primeiro são comuns a todas as linguagens e as versões C ++ estão enraizadas em C:

  1. É assim que você cria um programa [int main (..) {return 0; }] Dê uma visão geral básica do ambiente de programação que você deseja que eles testem também. Eles precisam saber como criar um projeto e realmente compilar / executá-lo.

  2. Esta é uma variável. Variáveis ​​podem armazenar dados (int, char, float, etc).

  3. Strings (C ++ são mais fáceis de usar com cin).

  4. É assim que você lê e grava dados (cin, cout). "Olá,% s!"

  5. Condicionais (os computadores precisam tomar decisões).

  6. Loops (os computadores são bons em fazer a mesma coisa repetidamente). Mostrar enquanto e para loops.

Isso deve levar cerca de duas lições de uma hora cada. Certifique-se de preparar um conjunto conciso de notas que possam ser consultadas no componente prático. Você não está tentando torná-los programadores brilhantes; portanto, dê exemplos de como ler no console, criar estruturas e tudo o mais que eles precisariam fazer. Use apenas recursos compatíveis com o idioma, não bibliotecas de utilitários personalizados. Você só os confundirá mais.

Desde o início, lidere pelo exemplo e mostre a eles exemplos de código bem definido. Os recuos devem estar corretos, entre parênteses e parênteses consistentes no estilo com o qual você se sente mais confortável. Nomes de variáveis ​​devem ser significativos. Se você mostrar slop como exemplo, eles aprenderão que slop é aceitável. É um mau ponto de partida. Saliente a importância de obter o recuo correto - descobri que, quando as coisas que eu ensinei recuavam seu código de forma consistente, eram mais capazes de ver onde estavam errando. Isso ocorreu porque a maioria de seus erros tinha escopo incorreto para operações (colocando operações em loops / condicionais que não deveriam ser, ou o inverso).

Em seguida, passe para o trabalho prático. A melhor maneira de aprender algo é quebrá-lo e descobrir o porquê. Você deseja garantir que eles tenham um ambiente fácil de usar para compilar seu código. Documente com capturas de tela em suas mãos.

Um bom exemplo que me ajudou a entender alguns dos conceitos foi construir uma máquina de Coca-Cola:

  • Saída de um menu de itens e preços (armazenar o menu era uma matriz de uma estrutura definida pelo usuário. Poderia ser uma classe em C ++). A saída exigia um loop.
  • Leia na seleção do usuário.
  • Peça dinheiro ao usuário. Eles poderiam simplesmente inserir a denominação da moeda em centavos (1, 5, 10, 20, 50, 100, 200 em Aus). Ignore denominações desconhecidas. Enquanto o usuário não tiver investido dinheiro suficiente, continue perguntando (loops).
  • Calcule a alteração necessária (divisão do módulo), dando o menor número de moedas. Imprima a saída na tela.
  • Aguarde o próximo usuário.

Depois disso, você pode passar para construções em C ++; você não quer se aprofundar muito antes que eles possam pelo menos criar um programa básico.

E, acima de tudo, tenha muito tempo livre e paciência para se dedicar a perguntas. Haverá muitos, e a maioria deles fará você se encolher porque são tão triviais que a resposta é óbvia para você.


1

Eu acho que você não deve ensinar coisas do ponto de vista do C ++ ("C ++ hello world"), mas do domínio do problema - neste caso, robótica - do ponto de vista. Então, seu olá mundo estaria piscando um led ou dirigindo um motor.

É claro que você pode / deve decompor cada pequena tarefa de robótica em um subconjunto de ações C ++ conceitualmente crescentes, envolvendo tipos, funções e operações de E / S.

Quanto a mim, não sou um programador profissional e tentei aprender Java, C ++ e Python. Eu realmente comecei a conseguir algo (Python) quando tinha problemas reais (simples) para resolver. Isso me levou direto ao ponto, evitando atenção excessiva aos detalhes incidentais da implementação da própria linguagem.

Por isso, aconselho: não leia o manual de um idioma, mas aprenda a fazer as coisas com o idioma de sua escolha. É isso que mantém as pessoas motivadas, eu acho.


0

Eu ensinaria C ++ estrito. Você sabe como quando você escreve printf e o entrega a pequenos parâmetros ou o tipo errado acontece algo estranho? e se você usar ponteiros inválidos coisas ruins podem ocorrer? NÃO ENSINAR QUE

Desde o primeiro dia, eu ensinaria como usar referências, STL e diria que você perde marcas por usar ponteiros. Também não ensine indicadores inteligentes. A única vez em que percebo que uso ponteiros é quando faço GUI e objetos (como uma caixa de imagem) devem existir e ser uma imagem válida ou nula. Para programação de console, não uso ponteiros (inteligentes ou não processados) há muito tempo.

Portanto, em resumo, não ensine nada a eles que possa causar problemas. Ensine iostreams, structs, diga a eles que eles também perdem as notas no typecast e não tentam ensinar design. Você não quer que ninguém se torne um profissional experiente


0

Não é uma série de palestras em C ++, mas o COMP1917 de Richard Buckland é uma série de palestras excelente sobre programação em C (seguida pelo COMP1927 , estruturas de dados).

Na minha opinião, C ++ é muita complexidade para novos alunos, mas C é um mundo mais simples e fornece uma boa base na programação de sistemas que os novos programadores de C ++ frequentemente não têm.


0

Eu começaria com pedaços significativos de código padrão, os ajudaria a "fazer algo legal" com a programação imediatamente e refinaria sua compreensão de como as coisas funcionam com o tempo. Eles não precisam apreciar ou entender todos os meandros do C ++ para fazer um LED piscar. Eles só precisam saber "se você colocar esse código lá, o LED piscará". E então "ei, vamos falar sobre o que é um loop agora, se você escrever um loop, poderá fazer o LED piscar 50 vezes sem precisar escrever 50 linhas de código, não é legal?" Agora vamos falar sobre condicionais, quando o usuário pressiona o botão A na caixa de controle, queremos ativar a pneumática para levantar uma bandeira, eis como adicionamos código para fazer isso. Ou, se o interruptor 2 da nossa caixa de controle estiver ativado, acionamos o motor de perfuração em sentido inverso, em vez de para frente.

Se você mantiver as coisas focadas em ensiná-las "apenas o suficiente" para resolver os problemas nos quais elas estão interessadas, as coisas ficarão muito menos impressionantes e mais acessíveis. Se eles estiverem realmente interessados ​​e quiserem entender os meandros, provavelmente voltarão e lerão um livro abrangente sobre programação ou cursarão a escola de verão no JC local.

Faça uma lista das "coisas que eles querem poder controlar" no robô e transforme cada uma delas em uma lição ... o que é o mínimo que elas precisam saber ...?

  • fazer algo "legal" se um switch estiver em uma configuração específica?
  • diga a uma válvula pneumática para abrir ou fechar (por exemplo: um acessório de garra)?
  • ligar e desligar os motores de perfuração (para o sistema de transmissão)?
  • fazer o robô mudar de direção se um sensor de detecção de obstáculos estiver ativado?
  • fazer o robô alternar entre os modos de tração 2 x 4 rodas?
  • ajustar a sensibilidade do joystick?
  • etc.

Eu continuaria ensinando os métodos que são mais infalíveis, como ensinaria cout over printf, porque os especificadores de formato são muito fáceis de misturar e um especificador incorreto geralmente é uma receita automática para travar seu programa. Da mesma forma, o vetor ofusca algumas das complexidades de gerenciamento de memória. Não se preocupe com todos os detalhes sobre como as coisas funcionam ou o que é a biblioteca STL, apenas o mínimo que eles precisam saber para realizar o X (o que pode exigir o uso de uma estrutura de dados da biblioteca STL, por exemplo)


0

Use Como programar C ++ por Deitel e Deitel. Excelente livro na minha opinião.

Parece que você está tentando ensinar aos novatos como programar e depois programá-los em algum nível avançado ao mesmo tempo. Se você espera dar a eles algum macaco, veja trechos de codificação de macaco sem entender que você está fadado ao fracasso.

Fique longe da STL para uma aula para iniciantes.

Se você já possui uma solução de codificação para o seu robô - ou uma IDEIA MUITO BOA com a aparência, talvez seja possível "mapear" as lições do livro para as tarefas de codificação do robô. Mas deixe o livro guiar o aprendizado.

Se você forçar a codificação, dando aos alunos lições e exposição muito estreitas ao idioma, acho que à medida que o oceano de código que você escreve se torna cada vez maior, será como ter aprendido a remar e você se afogará porque a natação REAL É necessário.

Não se trata de "eles deveriam aprender cout ou printf?" É uma questão de aprender o suficiente para ter uma ideia de como escrever código para resolver determinadas tarefas de programação de robôs.

Se fosse uma tarefa de leitura, quais seriam os resultados se todos eles soubessem que eram simples frases sujeito-verbo e apenas metade do vocabulário que VOCÊ SABE é necessário.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.