Skip to content

FNakano/IP-Apostila

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IP-Apostila

Apostila de FNakano para IP

Preâmbulo

"Tudo pode mudar..."

Compreender algo é um processo que acontece progressivamente, por partes e depende do aspecto (desse algo) que atrai mais atenção do agente (que quer compreender). Considerando algo um objeto (acredito que seja uma consideração verdadeira...)

O objeto da representação não pode ser outra coisa senão uma representação da qual a primeira representação é um interpretante. Mas uma série infinita de representações, cada qual representando a que está atrás de si, pode ser concebida como tendo um objeto no seu limite. O significado de uma representação não pode ser senão uma representação. De fato, não é nada mais do que a representação, ela mesma, concebida como despida de roupagem irrelevante. Mas essa roupagem não pode ser nunca completamente despida; ela só é trocada por algo mais diáfano. Há, assim, uma regressão infinita aí (1.339) (J. Ransdell, 1966, pp. 34-5 APUD Lucia Santaella, A Teoria Geral dos Signos, 2000, ISBN 85-221-0224-4)

Se a afirmação citada acima for verdadeira, ensinar/aprender, compreender e processos afins são infinitos e (quase) sempre há uma resposta diferente e aceitável a perguntas: "Como?" ou "Por quê?" em sequência.

No que se refere a programas (de computador), estes frequentemente contém/manipulam representações de objetos e despir de roupagem irrelevante equivale a abstrair (abstract out).

O "tom" da conversa nas aulas

Peço a todos que considerem as aulas Uma conversa gentil tratando os assuntos com ceticismo científico.

A conversa gentil refere-se a:

A gentileza nas conversas é uma qualidade humana fundamental que transforma a comunicação em um ambiente de respeito, empatia e acolhimento. Ser gentil ao falar envolve o uso de amabilidade, delicadeza e atenção, indo além do simples comportamento educado para criar conexões verdadeiras. (Gerado por IA do Google)

O ceticismo científico refere-se a:

Ceticismo científico é uma postura de questionamento e exigência de evidências robustas, baseada no método científico, para validar afirmações, combatendo pseudociências, superstições e charlatanismo, sem negar tudo, mas sim buscando provas, como defendiam divulgadores como Carl Sagan, para proteger o pensamento crítico e o avanço do conhecimento. Ele exige teste e revisão constante de hipóteses, diferenciando-se do negacionismo que apenas rejeita fatos, mantendo a mente aberta para o novo, mas com rigor. (Gerado por IA do Google)

Sugestões e comentários sobre este material, não sobre questões administrativas, podem ser feitos através das discussões do repositório: https://github.com/FNakano/IP-Apostila/discussions . Cópias da apostila podem ser feitas por fork ou por clone, comandos do Git. Pedidos de correção do material podem ser solicitados nos issues https://github.com/FNakano/IP-Apostila/issues e serão analisados. Pull requests podem ser aceitos mas a chance é pequena.

Confesso que usei a IA para gerar o texto sobre termos que eu já sabia(?) o significado mas não queria usar meu tempo elaborando o texto. Revisei o texto gerado, achei que expressa o que eu desejo expressar. Deixo registrada a citação porque ela pode mudar (é gerada por IA) e a fonte.

O texto gerado por IA baseia-se em textos já escritos, seja por pessoas, seja por IA no processo de geração do texto final. Por enquanto, analisar o processo de geração até chegar aos textos e autores originais com qualidade desejada para que o texto gerado seja um texto científico, não foi feito.

As explicações em aula

(P: Por que começar assim, com "longas" explicações em assuntos que parecem não ser próximos a programação de computadores? R.: Para saber "onde estamos" e "para onde iremos", tentando não "nos perder" e nem perder a motivação de estudar.)

nota: Uso explicações e definições apresentadas na Wikipedia pois há pouca divergência na informação apresentada nela em relação a livros didáticos e acadêmicos nos assuntos que abordo, até onde sei.

Acho que narrativas são inevitáveis na comunicação entre pessoas... e elas são importantes no ensino-aprendizagem. Não tenho o conhecimento dos (seus) professores em filosofia e comunicação (que geralmente dão aulas em disciplinas do ciclo básico), mas empresto do conhecimento (deles?):

Os seres humanos geralmente afirmam entender os eventos quando conseguem formular uma história ou narrativa coerente explicando como eles acreditam que o evento foi gerado. (https://pt.wikipedia.org/wiki/Narrativa#Abordagens_das_ci%C3%AAncias_sociais)

... então preparem-se para ouvir e contar histórias ...

Minha primeira história tem a ver com como entender um curso de graduação: Podemos pensar um curso de graduação como um conjunto de disciplinas interrelacionadas e apresentadas aos alunos para formar seu conhecimento. As disciplinas podem abordar um mesmo assunto, cada disciplina com enfoque diferente ou com nível de detalhamento diferente. Por exemplo, na disciplina Introdução à Programação ensina-se o que é ordenação e, en geral, apresenta-se um algoritmo de ordenação com detalhamento suficiente para Introdução à Programação. Na disciplina Análise de Algoritmos o assunto é retomado e expandido, apresentando vários algoritmos diferentes e analisando sua complexidade de tempo e de espaço.

Vamos restringir o escopo para a disciplina de Introdução à Programação e criar uma narrativa na direção do Problem Based Learning - PBL. Isto implica em problematizar (https://pt.wikipedia.org/wiki/Problematiza%C3%A7%C3%A3o) a disciplina de Introdução à Programação: O problema/desafio é aprender/ensinar programação de computadores.

Considerações iniciais

(poderia chamar requisitos da solução...)

Temos entre 17 e 19 semanas para resolver esse problema/desafio. O processo de resolução pode ser considerado uma atividade, que pode ser dividida em várias sub-atividades - é o que se chama Work Breakdown Structure - WBS (https://en.wikipedia.org/wiki/Work_breakdown_structure).

Podemos, também, consider as atividades por fazer como tarefas. Atividade não é (perfeitamente) equivalente a tarefa. Tarefa geralmente é uma descrição documental e atividade é o que, de fato, é feito. Considerando o relatório como descrição (documental) de atividades, quando tarefa, atividade e relatório tratam da mesma coisa, espera-se que tarefa seja menos detalhado e feito antes da atividade e o relatório seja mais detalhado e feito depois da atividade. Citando um texto ilustrativo:

Trabalho: tarefa e atividade

Uma dúvida que sempre aparece para os trabalhadores é a diferença entre sua função e sua atividade de trabalho. Parece pouca coisa, mas existe uma enorme diferença entre essas duas coisas. Em ergonomia definimos a função ou a tarefa para a qual o empregado foi contratado como sendo o trabalho prescrito, ou seja, aquilo que a empresa descreve como sendo o trabalho que ele deve fazer. Assim, um operador de máquinas multifuncional tem como função o trabalho de operar máquinas de alguns tipos, um torneiro CNC opera tornos de controle numérico, um estoquista faz controle de estoques, apontamentos recebimento e entrega de materiais, e assim por diante. Desta forma, a tarefa ou trabalho prescrito são apenas uma indicação documental do que o trabalhador deve fazer. A atividade de trabalho é uma coisa totalmente diferente. É exatamente o que o trabalhador realiza no dia a dia. É também chamada de trabalho real, ou seja, aquilo que realmente o trabalhador faz para cumprir as obrigações prescritas na tarefa. Portanto, aí já se nota que a tarefa é algo coletivo. Várias pessoas podem ser contratadas para a mesma função. Por exemplo, um auxiliar administrativo ou operador de máquinas terem a mesma tarefa. A atividade, por sua vez, é individual porque diz respeito àquilo que cada trabalhador realiza na realidade. Isso implica, em primeiro lugar, na interação entre as características físicas, mentais e psicológicas do trabalhador com o seu trabalho, envolvendo aí coisas como as ferramentas, os meios tecnológicos, o ambiente de trabalho, a organização e a gestão. Significa, portanto, que uma mesma tarefa de operação de máquinas pode se mostrar como atividades diferentes. (https://smabc.org.br/a-diferenca-entre-tarefa-e-atividade/)

Voltando à específica tarefa de aprender/ensinar programação de computadores, alguns assuntos constam da ementa da disciplina (https://uspdigital.usp.br/jupiterweb/obterDisciplina?nomdis=&sgldis=ach2001). Espera-se que sejam apresentados, entre outros motivos, pela formação/organização de conhecimento, por influenciar outros assuntos dentro da disciplina e por abordar assuntos que serão tratados ou usados em outras disciplinas. Tomei a liberdade de organizar os assuntos da ementa em uma lista hierárquica, os índices da lista serão usados para referenciá-los:

Lista de assuntos na ementa
  1. Noções de organização de computadores:
    1. modelo de von Neumann, (por uma questão do Markdown, precisei notar assim. Na enumeração dos ítens, considere equivalente o uso de números, algarismos romanos e letras do alfabeto pois, dependendo da escolha do site para renderização de markdown isso muda...)
    2. linguagens,
      1. interpretação e compilação, (por uma questão do Markdown, precisei notar assim, mas este é o item 1.2.1)
    3. representação interna dos dados.
  2. Resolução de problemas e desenvolvimento de algoritmos,
    1. análise de problemas,
    2. estratégias de solução, representação e documentação.
  3. Tipos de dados: escalares, arranjos, matrizes, cadeias de caracteres.
  4. Passagem de parâmetros.
  5. Linguagem de programação e transcrição de algoritmos.
  6. Introdução a uma linguagem imperativa.
  7. Depuração (debugger) e documentação de programas.
  8. Testes unitários.
  9. Introdução a algoritmos de busca e ordenação.
  10. Manipulação de referências.

Passo a enunciar o problema como: "Aprender/ensinar programação de computadores em 17 a 19 semanas, abordando os assuntos listados na ementa o suficiente para avançar para as disciplinas que dependem desta".

Estratégias de ensino/aprendizagem

É possível ir de item em item na ementa e expor os assuntos, conceitos e exercitá-los. Começaríamos com uma breve história da computação, seguiríamos por computadores atuais, linguagens de programação em geral, linguagem C em específico, projetos (ié como dividir um programa em vários arquivos), depuração e teste de programas. No final do prazo, busca e ordenação (para conectar com Análise de Algoritmos) e manipulação de referências (para conectar com Algoritmos e Estruturas de Dados). Há pessoas que estão melhor adaptadas a esta organização e já vi livros didáticos com essa organização.

Também é possível partir de algo que a nós, seres humanos, é familiar: a linguagem.

Uma linguagem é um sistema estruturado para comunicação que é composto de gramática e vocabulário. É a forma predominante de comunicação entre humanos tanto de forma falada como, através de símbolos, de forma escrita.(...) (https://en.wikipedia.org/wiki/Language)

Uma linguagem de programação é uma linguagem usada para expressar programas de computador (https://en.wikipedia.org/wiki/Programming_language)

Programas de computador são ou uma sequência, ou um conjunto de instruções escritos em uma linguagem de programação para um computador executar (https://en.wikipedia.org/wiki/Computer_program)

O computador executar, em computação, é o processo em que um programa de computador é processado para o computador desempenhar as ações codificadas no programa. (https://en.wikipedia.org/wiki/Execution_(computing))

Note que aquilo que está contido em um programa de computador é executado e esse conteúdo é composto por instruções para o computador.

nota: Talvez exista um raciocínio longo, talvez tortuoso, que conclua que a afirmação HTML é uma linguagem de programação seja verdadeira. Entretanto, entre profissionais da computação, no mínimo convencionalmente, HTML não é uma linguagem de programação. HTML é uma linguagem de marcação.

A linguagem C é uma linguagem de programação. C possui vocabulário e gramática logo, em uma abordagem construtivista, seria esperado que vocabulário e gramática fossem apresentados... mas poucos aprendem uma linguagem estudando primeiro as regras de formação... mesmo na norma técnica que define a linguagem C (https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf) , a gramática formal é apresentada em um apêndice. No resumo (do draft) da norma o autor já informa que esse documento deve ser de conhecimento de programadores e implementadores de compiladores mas não é um tutorial.

Há uma porção de cursos e outras apostilas que se propõe a ensinar linguagem C. O conteúdo das que vi segue um roteiro comum: palavras reservadas, constantes, variáveis, operações lógicas e aritméticas, pré-processador, comandos, funções, ponteiros, estruturas de dados. Essa sequência está na trilha principal desta apostila mas não pretendo copiar ou traduzir informação que já está nesse material. Pretendo "desafiar" o aluno/leitor com "problemas" (assunto que já passou pela etapa de problematização e pode ser fraseado como um problema), orientar a solução, apresentar referências à norma e outras fontes, enriquecer a informação, acrescentar exemplos.

nota: mais sobre o uso de linguagens em computação, taxonomias de linguagens e lista de linguagens em linguagensEmComputação.md

Eu gostaria que vocês trocassem impressões com colegas e comigo sobre o que aprenderam, como aprenderam e se há pontos fortes/fracos nas estratégias de ensino.

Acredito que seres humanos, como nós, aprendemos linguagens a partir de exemplos e praticando exemplos e variações. Sobre essa base é apresentada, depois, a teoria e os desdobramentos. É claro que essa maneira de aprender tem seus problemas. Em analogia ao estudo de linguas, frequentemente sabemos alguns tempos verbais antes de saber que são tempos verbais e sabemos conjugar alguns verbos sem saber o que é conjugação de verbos. Por outro lado, somos capazes de nos expressar (escrever programas).

Este é o objetivo desta apostila. Ao final da prática dos exercícios, quem seguiu as orientações contidas nela deve conseguir expressar-se usando a linguagem C. Expressar-se significa escrever programas de computador nessa linguagem.

Ser capaz de escrever programas implica que se é capaz de sintetizar/gerar (muito mais que alguns) programas. A comprovação, acredito que definitiva, da capacidade de sintetizar/gerar programas é gerá-los todos. Uma tarefa impossível para uma pessoa.

Como essa pessoa conseguiria saber que é capaz de escrever programas? Como uma outra pessoa poderia avaliar a capacidade da primeira?

Acho que é aí que entram os indicadores: avaliações, exercícios, notas, ...

O processo de ensinar/aprender e testar através de indicadores, mesmo para um não-pesquisador no assunto (como eu), tem falhas. Argumentar que "é o melhor que se tem", por ser usado há séculos, por "dar resultado", ... não me satisfaz, em termos do tal ceticismo científico, mas a necessidade prática sempre urge, então "o melhor que se tem" é o que acabo usando...

O indicador que usarei para balizar o processo de ensinar/aprender (mas não o de avaliar) é "Compreender e criticar/melhorar, com detalhes e vocabulário suficiente para Introdução a Programação, um específico programa e a forma como foi desenvolvido." O prazo ideal para isto é 3/4 do semestre. Acredito que isto indicará que aprendeu-se o suficiente para compreender os programas/algoritmos que serão apresentados nas próximas disciplinas, sem ocupar-se em demasia com aspectos de programação como sintaxe, declaração de variáveis e outros - ocupar-se em aprender o aspecto do assunto apropriado na próxima disciplina. Por exemplo, em análise de algoritmos, dado um programa/algoritmo, perguntar-se qual a complexidade assintótica ao invés de perguntar-se onde as variáveis precisam ser declaradas.

Caso o objetivo fosse compreender o específico programa, eu acharia adequado partir para sua análise até o nível de detalhamento necessário, mas esta seria uma estratégia de mínimo esforço para satisfazer o indicador, que é algo muito limitado. O objetivo é construir nosso conhecimento para compreender o específico programa e outros que virão durante nossa vida. Na próxima seção, inicia-se o processo de contrução.

Antes de iniciar, usar Large Language Models - LLMs como ChatGPT, Gemini, Copilot, ... é inevitável pois eles estão amplamente disponíveis. Se alguém usar o buscador Google será exposto a uma resposta gerada por Gemini... mas saiba usar os modelos para ampliar seu conhecimento pois esse uso não é facilmente automatizável. Fazer tarefas automatizáveis aumenta a chance se sermos considerados dispensáveis. Estou exagerando em alguns pontos da história mas a preocupação em tornar-se dispensável não é exagero... Veja como pretendo usar LLMs na disciplina em https://github.com/FNakano/IP-Apostila/tree/main/UsarLLMs

Preparação

Em geral, as apostilas que apresentam alguma linguagem de programação concentram-se em apresentar a linguagem de programação, sem orientar o leitor a respeito de como criar sua área de trabalho, como usar a área de trabalho, como lidar com as atividades propostas. A esses elementos chamarei preparação.

Àrea de trabalho é o nome que dou ao espaço físico e computacional onde aprende-se a programar. A área de trabalho de referência contém, entre outras coisas, um desktop ou um notebook e programas como compilador, editor de texto e interface de linha de comando. A interface de referência é um ambiente em modo texto, mesmo que esteja embarcada em um ambiente gráfico, em que uma pessoa digita comandos e estes são executados pelo computador. Usaremos os termos Command Line Interface - CLI ou prompt de comando ou terminal ou shell para designar esse ambiente. Alguns comandos úteis para navegar na linha de comando são apresentados em https://github.com/FNakano/IP-Apostila/tree/main/ShellLinux .

Considerando que o público-alvo deste material seja de estudantes que acabaram de entrar na graduação, é de se esperar que quase todos tenham telefone celular mas nem todos tenham desktop ou notebook, logo, se for possível usar o telefone celular como área de trabalho, diminui-se a urgência em ter à disposição um desktop ou notebook.

O trabalho de criar/configurar áreas de trabalho pode ser abreviado, por exemplo usando compiladores on-line como https://www.onlinegdb.com/online_c_compiler ou usando ambientes de aprendizagem como https://www.w3schools.com/c/index.php . As duas formas abreviadas têm limitações e podem não atender a todas as necessidades, por outro lado, permitem que se aprenda a programar em C até usando uma smart TV.

Tutoriais são documentos que apresentam a sequência de passos usada para atingir certo objetivo. Espera-se que quem os siga seja capaz de, num segundo momento, decompor a informação nos tutoriais e recompô-la para a finalidade que escolher.

Tutoriais mostrando como construir diferentes áreas de trabalho enriqueceriam esta apostila. Para apresentar um tutorial útil:

  • É possível usar o telefone celular no lugar do desktop/notebook na área de trabalho. O tutorial que mostra como fazer, em telefones com sistema Android, é https://github.com/FNakano/IP-Apostila/tree/main/InstalarTermux vai da instalação do app através da loja Google até a execução de um programa escrito em linguagem C.
  • Code:Blocks é um ambiente integrado de desenvolvimento que pode ser usado para escrever programas em C. Em https://www.w3schools.com/c/c_getstarted.php W3Schools ofrece alguma instrução sobre como usá-lo.

Sequência de assuntos a abordar em aula (revisado em 2026-05-08)

  1. O primeiro programa em C (https://en.wikipedia.org/wiki/C_(programming_language)#%22Hello,_world%22_example)
    1. header file (#include)
      1. pré-processador
        1. substituição de texto;
    2. main() - o que é
      1. funções (primeiro contato)
        1. declaração de função;
        2. protótipo (assinatura) de função;
        3. corpo da função;
        4. chamada de função;
    3. puts(...) - o que é
      1. o argumento de puts(...) - o que é
      2. constante imediata (contrapor com constante declarada para o pré-processador e com constante declarada com palavra reservada const);
      3. constante imediata do tipo string;
      4. a existência de variáveis tipadas e o tipo char;
    4. como strings são construídas a partir de char;
    5. printf(...) - o que é
      1. os argumentos de printf - o que são
      2. constante imediata do tipo string
      3. especificadores de formato
      4. variáveis - atribuição é diferente de equivalência matemática;
    6. existem outros tipos de variáveis;
    7. melhorar o programa incluindo perguntar o nome e escrever o nome;
      1. declarar variáveis
      2. por que declarar string é feito com char s[n]
      3. complicações: codificação de caracteres
      4. a função scanf(...)
        1. os argumentos de scanf(...)
        2. spoiler: quando usa string scanf(...) esconde o conceito de ponteiros, que é importante em C.
        3. mas quando usa tipos primitivos, o uso de ponteiros aparece;
    8. Comentários e documentação do código-fonte
  2. Tarefa: criar uma calculadora de quatro operações interativa
    1. apresentar tipos de dados numéricos: int, float, double
      1. falar sobre truncamento, arredondamento e propagação de erros
      2. conversão implícita
      3. type cast
      4. funções de conversão de tipos (ex.: atof())
    2. tipos primitivos estendidos
    3. falar sobre string de formato e valor de retorno do scanf, mencionar parsing
    4. falar sobre string de formato do printf
    5. apresentar o comando de seleção if
    6. apresentar o comando de repetição do..while
    7. explicar, de forma simples, a necessidade do & no scanf ou o uso de atof, conforme o caso.
      1. o esperado é usar double v; scanf ("%lf", &v);
    8. Erros, mensagens e depuração
      1. Em muitas funções os valores de retorno indicam erros - teste-os;
        1. por exemplo, veja scanf();
        2. por exemplo, veja fopen() e perror();
      2. Use mensagens puts, printf, ...;
      3. C não tem try...catch;
      4. IDEs costumam oferecer break points;
      5. A ferramenta de depuração de GCC chama-se gdb;
  3. Simulador - Monty's game (com quatro portas);
  4. Numéricos - raiz quadrada ;
  • Bissecção (prefiro a grafia muito muito antiga, reconheço que, pelas normas vigentes, está errada...)
  • Newton
  1. Memória, structs e unions, malloc, arquivos - memoria.md, funções - segundo contato;
  2. Expositivo: buscar e ordenar;
    1. arrays de números inteiros;
    2. dados-satélite e estruturas de dados;
    3. insertion-sort, de acordo com o livro de Análise de Algoritmos;
  3. Código-fonte em vários arquivos;
    1. por quê? ... para organizar melhor e entender mais rápido!;
    2. make;
  4. Compreender o Balizador;
  5. Tarefa: comparar tempo de execução de diferentes algoritmos de ordenação.
    1. a função qsort da biblioteca stdlib;
    2. ponteiro para funções;
  6. Tarefa: ajustar o Balizador para a função de ordenação poder ser usada em qualquer array (ié, fazer igual a qsort(...))

Método

Inicia-se propondo que os estudantes executem um programa (ié, uma tarefa). O programa é fornecido em um arquivo, seja documentação, seja código-fonte. Após o sucesso na execução, ou os estudantes ou o professor usam LLM para aprender o que o programa faz e possam melhorar (avaliar, criticar, acrescentar informação) as respostas apresentadas pelo LLM, bem como aprimorar seus conhecimentos usando a resposta do LLM.

Em seguida são propostos desafios (tarefas) para incrementar os programas, é possível usar qualquer apoio disponível, inclusive e principalmente o apoio do docente. Também é importante mostrar a compreensão sobre os ajustes que fez no programa. Quando todos os desafios forem concluídos com sucesso, ou o tempo de aula tiver se esgotado, a atividade é terminada.

O processo que inicia no recebimento da tarefa e termina no sucesso da execução também é denominado ciclo de vida do programa (https://en.wikipedia.org/wiki/Program_lifecycle_phase). Acredito que esse entendimento era o mais comum até lá pela década de 1980. Depois disso houve uma popularização da construção de software (programas), empresas construindo programas cada vez mais sofisticados e a larga adoção de métodos de engenharia de software para a construção dos programas. O entendimento mais comum passou a ser o apresentado em https://en.wikipedia.org/wiki/Systems_development_life_cycle .

FONTE: o autor captura de tela de https://en.wikipedia.org/wiki/Program_lifecycle_phase, para fins documentais pois está cada vez mais difícil acessar esse conteúdo.

Considerando a definição mais antiga de ciclo de vida de um programa durante as tarefas vamos:

  1. editar o código-fonte numa versão inicial, consertar erros, acrescentar funcionalidades
  2. compilar o código-fonte, linkar o código-objeto, criar o programa executável
  3. distribuir, instalar, carregar, executar o programa executável e
  4. repetir esses passos até que a execução do programa apresente um resultado satisfatório.

Haverá tarefas que requerem explicações mais longas para serem compreendidas. Nestes casos, inicia-se com uma aula rápida (briefing) e segue-se o processo anterior.

Haverá provas presenciais no estilo tradicional: papel e lápis, sem consulta, duração de 1h30min.

Tabela de cruzamento de referências (ainda não revisado em 2026-05-08)

https://docs.google.com/spreadsheets/d/1KvNanKVZJ57i2kJhjOUuWH68qgjsg99MMEVAcrzuT4g/edit?usp=sharing Nesta tabela, os assuntos a abordar em aula (https://github.com/FNakano/IP-Apostila?tab=readme-ov-file#sequ%C3%AAncia-de-assuntos-a-abordar-em-aula) são associados:

Versão anterior da tabela mantida para documentar a evolução da apostila - esta não é mais atualizada

awk -v n=20 '{ print "| <pre>" substr($0, 1, n) "...</pre>| ementa | n3220 | GCC | W3Schools |"; }' toCut.txt

abordar em aula ementa n3220 GCC W3Schools
0. O primeiro progra...
ementa n3220 GCC W3Schools
  1. header file (#i...
ementa n3220 GCC W3Schools
    1. pré-processad...
ementa n3220 GCC W3Schools
      1. substituiçã...
ementa n3220 GCC W3Schools
  2. main() - o que ...
ementa n3220 GCC W3Schools
    1. funções...
ementa n3220 GCC W3Schools
      1. declaração ...
ementa n3220 GCC W3Schools
      2. protótipo (...
ementa n3220 GCC W3Schools
      3. corpo da fu...
ementa n3220 GCC W3Schools
      4. chamada de ...
ementa n3220 GCC W3Schools
  3. puts(...) - o q...
ementa n3220 GCC W3Schools
    1. o argumento d...
ementa n3220 GCC W3Schools
    2. constante ime...
ementa n3220 GCC W3Schools
    3. constante ime...
ementa n3220 GCC W3Schools
    4. a existência ...
ementa n3220 GCC W3Schools
  4. como strings sã...
ementa n3220 GCC W3Schools
  5. printf(...) - o...
ementa n3220 GCC W3Schools
    1. os argumentos...
ementa n3220 GCC W3Schools
    1. constante ime...
ementa n3220 GCC W3Schools
    2. especificador...
ementa n3220 GCC W3Schools
    3. variáveis - a...
ementa n3220 GCC W3Schools
  6. existem outros ...
ementa n3220 GCC W3Schools
  7. melhorar o prog...
ementa n3220 GCC W3Schools
    1. declarar vari...
ementa n3220 GCC W3Schools
    2. por que decla...
ementa n3220 GCC W3Schools
    3. complicações:...
ementa n3220 GCC W3Schools
    4. a função `sca...
ementa n3220 GCC W3Schools
      1. os argument...
ementa n3220 GCC W3Schools
      2. spoiler: qu...
ementa n3220 GCC W3Schools
      3. mas quando ...
ementa n3220 GCC W3Schools
1. Tarefa: criar uma...
ementa n3220 GCC W3Schools
  1. apresentar tipo...
ementa n3220 GCC W3Schools
  2. falar sobre tru...
ementa n3220 GCC W3Schools
  3. falar sobre str...
ementa n3220 GCC W3Schools
  4. falar sobre str...
ementa n3220 GCC W3Schools
  5. apresentar o co...
ementa n3220 GCC W3Schools
  6. apresentar o co...
ementa n3220 GCC W3Schools
  7. explicar, de fo...
ementa n3220 GCC W3Schools
    1. o esperado é ...
ementa n3220 GCC W3Schools
2. Tarefa: automatiz...
ementa n3220 GCC W3Schools
  1. começar com uma...
ementa n3220 GCC W3Schools
    1. atribuir pont...
ementa n3220 GCC W3Schools
      1. caracteres ...
ementa n3220 GCC W3Schools
        1. Por que é...
ementa n3220 GCC W3Schools
          1. Modelo ...
ementa n3220 GCC W3Schools
          2. Memória...
ementa n3220 GCC W3Schools
    2. usar comandos...
ementa n3220 GCC W3Schools
  2. testar, por exe...
ementa n3220 GCC W3Schools
  3. melhorar o prog...
ementa n3220 GCC W3Schools
  4. o & nos argum...
ementa n3220 GCC W3Schools
    1. um modelo abs...
ementa n3220 GCC W3Schools
      1. entendendo ...
ementa n3220 GCC W3Schools
      2. (spoiler) e...
ementa n3220 GCC W3Schools
      3. entender is...
ementa n3220 GCC W3Schools
    2. asterisco *...
ementa n3220 GCC W3Schools
    3. asterisco *...
ementa n3220 GCC W3Schools
    4. O operador `&...
ementa n3220 GCC W3Schools
    5. imprimindo po...
ementa n3220 GCC W3Schools
2. aplicar várias qu...
ementa n3220 GCC W3Schools
  1. notar a **repet...
ementa n3220 GCC W3Schools
  2. eliminar a **re...
ementa n3220 GCC W3Schools
    1. funções...
ementa n3220 GCC W3Schools
      1. passagem de...
ementa n3220 GCC W3Schools
        1. tipos de ...
ementa n3220 GCC W3Schools
          1. tipo de...
ementa n3220 GCC W3Schools
        2. quando o ...
ementa n3220 GCC W3Schools
        3. quando o ...
ementa n3220 GCC W3Schools
      2. escopo de v...
ementa n3220 GCC W3Schools
    2. arrays de str...
ementa n3220 GCC W3Schools
      1. usar arrays...
ementa n3220 GCC W3Schools
      2. malloc, `...
ementa n3220 GCC W3Schools
  3. trocar as quest...
ementa n3220 GCC W3Schools
    1. caso 1: com a...
ementa n3220 GCC W3Schools
    2. caso 2: acres...
ementa n3220 GCC W3Schools
    3. caso 3: fazer...
ementa n3220 GCC W3Schools
3. Expositivo: busca...
ementa n3220 GCC W3Schools
  1. arrays de númer...
ementa n3220 GCC W3Schools
  2. dados-satélite ...
ementa n3220 GCC W3Schools
  3. insertion-sort,...
ementa n3220 GCC W3Schools
4. Código-fonte em v...
ementa n3220 GCC W3Schools
  1. por quê? ... pa...
ementa n3220 GCC W3Schools
  2. make;...
ementa n3220 GCC W3Schools
5. Compreender o Bal...
ementa n3220 GCC W3Schools
6. Tarefa: comparar ...
ementa n3220 GCC W3Schools
  1. a função qsort ...
ementa n3220 GCC W3Schools
  2. ponteiro para f...
ementa n3220 GCC W3Schools

Anotações diversas


r
├── Zks3cmJmQ2xrLUtqREhUUA [title=Em que ferramentas fazer/praticar programação?]
├── b2dHdS1vcjl6eFJjV0lzSA [title=Sistema de arquivos, interface de linha de comando, comandos de linha de comando]
├── VFhHRzFWRW5xd0M5VWdHUQ [title=C tem vários implementadores e às vezes eles não seguem a norma]
├── amNkd2pjSl8wNkYwRmVYQg [title=C tem norma]
├── VHhhV0xaMlRDbUVyN0Z1Zw [title=Tipos primitivos- crud]
│   ├── U3pHd0RXekFuTFY1WUVSQQ [title=números em ponto flutuante, limitação na precisão, de onde vem]
│   ├── cUZfWFZTTTVabGNZWDFTNw [title=Ponteiros - aritmética, abstração da memória do computador]
│   ├── c052aS1tbXhBTThDZjFEMA [title=Float e double - aritmética, lógica e bit a bit]
│   ├── NklUSE1uQkxsMXItLVdUMw [title=Int e variações - aritmética, lógica e bit a bit]
│   ├── TFp0VmlhWFF5TUpSSTJPVQ [title=Warning e erros associados]
│   ├── aDJ0eTZkeEUyVl9WTzB2YQ [title=Type cast]
│   └── VjN5UzMwbEpRei1oVGVpQg [title=Char]
├── VDV0X2ZUNHRnOTVHZHRpRA [title=Github, wikiversity, wikibooks, ... onde hospedar?]
├── Z1gwODVrRjdCRTNPZ1VWQQ [title=Abstração - definição formal; minha opinião (uma maneira de prosseguir sabendo o mínimo). O que me incomoda: saber "o suficiente", aprender os detalhes até ficar satisfeito; esforço e tempo usado para aprender. Arbitrar "quanto é suficiente" sempre resulta em incerteza pois depende, também, da interpretação, do contexto da construção do conhecimento, ... por isso define-se uma forma de avaliação, que deve ser seguida]
├── VGhHZGZBb013X1d1dTZKbg [title=Símbolos e significados - em matemática comparado com conversas comuns. Ex. um grafo é uma tripla {N, A, f} ...]
├── N1NqRlpzMWRXTnNDVUxONw [title=Critérios de avaliação]
├── VW9nb0JwRzF2ZjB0LWVJWA [title=Testes (unitários e de integração)]
├── TERYSlRUdmZvdS1BczJYdw [title=Funções]
│   └── b21oUU9nczZLbTR4cHBmZQ [title=Argumentos (de chamada), variáveis, escopo de variáveis]
├── WnBWQ0h6a0pkdDZIeU1tRw [title=Tipos derivados: estruturas de dados: struct e union, objetos]
│   └── R0RwV1ZDVXE2ajdlQzd4UQ [title=Timespec]
├── TlI2eTVhbjhSWG1sbmJqMA [title=Palavras reservadas : Comandos, operadores]
├── QjVtV1dNclYwVmZGQTd4cA [title=Palavras: reservadas (comandos, operadores),  constantes, identificadores]
│   └── aFUyeVhycG1GbU1ZTm9tNg [title=Identificadores: palavras que, no contexto de uma linguagem de programação,  você define como se escreve e o que significam.]
├── UWh5QjlhckZ3aXM0MGZWSw [title=Header files (pre-processador)]
├── LWwzb3VaZ0dRTld5czlleg [title=Tutoriais (Exemplos)]
│   ├── VDAyajhEY0NBelFhRXBoeQ [title=Busca e ordenação]
│   ├── YkRaU3BkZ1VGS0VnV0JPag [title=Investimento]
│   └── ZVM2VE1oWkFQQlFtMmp2bg [title=Questionário]
├── WmpKZWtLODhLUXB1ZWp5ag [title=Modularização em funções,  em arquivos, header,  make ( npm, maven, pip, requirements, cmake)]
├── X2ZMejJETjZGcUFQWGZhWA [title=Warnings e erros de compilação e de execução]
├── NVQtRE5NSWZmdWNCOGJnTg [title=Comandos de repetição: while,  do-while,  for]
├── NmdwTlV5SVhDOTJwbF80Rw [title=Arrays - crud]
├── N1ppY3Q1VWtSN0FlSFNjTw [title=Como praticar: beecrowd]
├── Qnc2S0VQd2lybXQ3X1o3Rw [title=Comandos em sequência, comandos aninhados]
├── YzkzcWtCa2hGZE5nU0RLNQ [title=Outras maneiras de aprender: w3schools]
├── ZUJSeWlVWjFaTlV3cXNIQg [title=Comandos de seleção: if, switch]
├── S2JDQndFdDBpNzVMT2o0ZA [title=Sequência de execução e entry point]
├── M1RlcFdsemtFYzBvRGhBbA [title=Documentação: C tem padrão,  embora os desenvolvedores possam não segui-lo. A Documentação do padrão é o que usaremos como descrição do funcionamento esperado]
├── THlUb1dEUjNXOXNJWnduQQ [title=Primeiro programa]
│   ├── UktGSWwtS3JVVkxuZHNIcQ [title=O primeiro programa é um projeto tão pequeno que as atividades notáveis são editar, compilar e executar. Dependendo do contexto,  editar e executar]
│   ├── c3NUS3VYS3VWSlB6OWtncg [title=Ciclo de vida em grandes projetos: há vários, engenharia de software https://en.wikipedia.org/wiki/Software_development_process, por exemplo, sdlc: https://en.wikipedia.org/wiki/Systems_development_life_cycle uma variação que inclui a operação do sistema é devops: https://en.wikipedia.org/wiki/DevOps . Agile e scrum são técnicas usadas no sdlc]
│   └── X2N3ZjlGWURlTDBjNW1xOQ [title=Ciclo de vida em pequenos projetos: editar, compilar, linkar, distribuir, instalar, carregar, executar https://en.wikipedia.org/wiki/Program_lifecycle_phase]
├── YU5aSUJfQXBaWHJaZjFZbg [title=Objetivo principal da disciplina : Introduzir o aluno aos conceitos básicos de computação e lógica de programação, sob o paradigma imperativo.]
│   ├── VTUyMG05WExhTDc3U3J5NA [title=Outras linguagens, como python, Java, Java script,  ... tem muita semelhança com C]
│   └── dFZuTHE0cHR1LUFIMnVGSA [title=Em um curso de graduação,  disciplinas são coordenadas para fornecer uma formação para o aluno. Para isso, grupos de disciplinas têm elementos em comum. Para IP, AED1 e AED2, um desses elementos é a linguagem de programação,  que é C.]
├── MzFfMEZFazBoYmVDYXhkZQ [title=Na graduação,  disciplinas são coordenadas de maneira a prover uma formação aos alunos. Para conseguir isso alguns elementos em comum são definidos. Um deles é a linguagem de programação. IP]
├── WnBsTktmaVZZUmM4ZHk1Nw [title=Usar computadores para executar o que você definir]
├── U3pHd0RXekFuTFY1WUVSQQ [title=números em ponto flutuante, limitação na precisão, de onde vem]
├── b21oUU9nczZLbTR4cHBmZQ [title=Argumentos (de chamada), variáveis, escopo de variáveis]
├── cUZfWFZTTTVabGNZWDFTNw [title=Ponteiros - aritmética, abstração da memória do computador]
├── c052aS1tbXhBTThDZjFEMA [title=Float e double - aritmética, lógica e bit a bit]
├── NklUSE1uQkxsMXItLVdUMw [title=Int e variações - aritmética, lógica e bit a bit]
├── R0RwV1ZDVXE2ajdlQzd4UQ [title=Timespec]
├── VDAyajhEY0NBelFhRXBoeQ [title=Busca e ordenação]
├── YkRaU3BkZ1VGS0VnV0JPag [title=Investimento]
├── ZVM2VE1oWkFQQlFtMmp2bg [title=Questionário]
├── TFp0VmlhWFF5TUpSSTJPVQ [title=Warning e erros associados]
├── aDJ0eTZkeEUyVl9WTzB2YQ [title=Type cast]
├── VjN5UzMwbEpRei1oVGVpQg [title=Char]
├── aFUyeVhycG1GbU1ZTm9tNg [title=Identificadores: palavras que, no contexto de uma linguagem de programação,  você define como se escreve e o que significam.]
├── UktGSWwtS3JVVkxuZHNIcQ [title=O primeiro programa é um projeto tão pequeno que as atividades notáveis são editar, compilar e executar. Dependendo do contexto,  editar e executar]
├── VTUyMG05WExhTDc3U3J5NA [title=Outras linguagens, como python, Java, Java script,  ... tem muita semelhança com C]
├── dFZuTHE0cHR1LUFIMnVGSA [title=Em um curso de graduação,  disciplinas são coordenadas para fornecer uma formação para o aluno. Para isso, grupos de disciplinas têm elementos em comum. Para IP, AED1 e AED2, um desses elementos é a linguagem de programação,  que é C.]
├── c3NUS3VYS3VWSlB6OWtncg [title=Ciclo de vida em grandes projetos: há vários, engenharia de software https://en.wikipedia.org/wiki/Software_development_process, por exemplo, sdlc: https://en.wikipedia.org/wiki/Systems_development_life_cycle uma variação que inclui a operação do sistema é devops: https://en.wikipedia.org/wiki/DevOps . Agile e scrum são técnicas usadas no sdlc]
└── X2N3ZjlGWURlTDBjNW1xOQ [title=Ciclo de vida em pequenos projetos: editar, compilar, linkar, distribuir, instalar, carregar, executar https://en.wikipedia.org/wiki/Program_lifecycle_phase]

About

Apostila de FNakano para IP

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors