Desenvolvimento de um sistema web com autojudge para o auxílio na aprendizagem de programação

índice

  1. 1. Resumo
  2. 2. Introdução
  3. 3. Métodos didáticos de ensino de programação
    1. 3.1 O Ensino de Lógica de Programação
      1. 3.1.1 Pensamento Computacional
      2. 3.1.2 Ferramentas para ensinar Lógica de Programação
    2. 3.2 Algoritmos
      1. 3.2.1 Descrição Narrativa
      2. 3.2.2 Fluxograma
      3. 3.2.3 Pseudocódigo
  4. 4. Sistemas de auxílio a aprendizagem assistidos por computador
    1. 4.1 Juízes Online
      1. 4.1.1 SPOJ
      2. 4.1.2 Uva Online Judge
      3. 4.1.3 BOCA
      4. 4.1.4 URI Online Judge
  5. 5. Pesquisa
  6. 6. 5 Seven Online Judge
    1. 6.1 Banco de dados
    2. 6.2 Ferramentas utilizadas
      1. 6.2.1 Flask
      2. 6.2.2 HTML
      3. 6.2.3 Bootstrap
      4. 6.2.4 MySQL
      5. 6.2.5 SQL Alchemy
      6. 6.2.6 CSS
      7. 6.2.7 JavaScript
      8. 6.2.8 Flask Log
      9. 6.2.9 Ubuntu
    3. 6.3 Funcionamento do sistema
    4. 6.4 Módulos
      1. 6.4.1 Módulo iniciante
      2. 6.4.2 Módulo intermediário
      3. 6.4.3 Módulo avançado
    5. 6.5 Exercícios e resultados da submissão
  7. 7. Conclusão
  8. 8. Referências bibliográficas
  9. 9.  Apêndice A
    1. 9.1 Exercícios Módulo 1 – Hello World
    2. 9.2 Exercício 2 – Somar dois números
    3. 9.3 Exercício 3 – Converter dois números
    4. 9.4 Exercício 4 – Quadrado de um número
    5. 9.5 Exercício 5 – Boletim Escolar
    6. 9.6 Exercício 6 – Cara ou Coroa
    7. 9.7 Exercício 7 – Calculadora (4 operações)
    8. 9.8 Exercício 8 – Calculadora (Utilizando Switch case)
    9. 9.9 Exercício 9 – Tabuada
    10. 9.10 Exercício 10 – Números primos
    11. 9.11 Exercício 2 – Função simples
    12. 9.12 Exercício 3 – Função que retorna nada
    13. 9.13 Exercício 4 – Calculo da área de uma esfera
    14. 9.14 Exercício 5 – Função que gera números aleatórios
    15. 9.15 Exercício 6 – Vetor
    16. 9.16 Exercício 7 – Produto Escalar
    17. 9.17 Exercício 8 – Calcula a média de cinco notas (matriz)
    18. 9.18 Exercício 9 – Matriz de mais de uma dimensão
    19. 9.19 Exercício 10 – Gerar matriz com números aleatórios
  10. 10. Apêndice C
    1. 10.1 Exercícios Módulo 3 - Exercício 1
    2. 10.2 Função recursiva
    3. 10.3 Exercício 2 – BubbleSort
    4. 10.4 Exercício 3 – InsertionSort
    5. 10.5 Exercício 4 – Ponteiros Constantes
    6. 10.6 Exercício 5 – Ponteiros Variáveis
    7. 10.7 Exercício 6 – Operações com ponteiros
    8. 10.8 Exercício 7 – Matriz transposta
    9. 10.9 Exercício 8 – Malloc
    10. 10.10 Exercício 9 – Ordenando números inteiros
    11. 10.11 Exercício 10 – Operador shift
Imprimir Texto -A +A
icone de alerta

O texto publicado foi encaminhado por um usuário do site por meio do canal colaborativo Monografias. Brasil Escola não se responsabiliza pelo conteúdo do artigo publicado, que é de total responsabilidade do autor . Para acessar os textos produzidos pelo site, acesse: https://www.brasilescola.com.

1. Resumo

O ensino da programação atualmente foca na apresentação algorítmica de um problema e na reprodução de códigos, principalmente, na fase inicial de aprendizado. Diversas abordagens são apresentadas desde a criação de algoritmos através de linguagens mais próximas ao cotidiano humano como o PORTUGOL que se utiliza da verbalização em português para o entendimento da lógica de programação sem a necessidade do formalismo de uma linguagem efetivamente adotada, e até a criação de fluxogramas para facilitar o entendimento de toda a lógica que deve ser empregada na programação. A diversidade de abordagens nem sempre garante uma forma eficiente de aprendizagem, pois o número de reprovações na área de programação é relativamente alto, o que mostra a necessidade de se revisar a forma de abordar o tema. Ferramentas de auxilio são adotadas geralmente num estágio mais avançado como, por exemplo, os sistemas de julgamento automático (autojudge), cujo princípio básico é comparar as respostas de um código fonte criado com um resultado esperado. Nessa linha encontram-se os sistemas URI Online Judge, Uva Online Judge, SPOJ (Sphere Online Judge), BOCA Online Contest Administrator, entre outros, cujo principal foco é na preparação de competições de programação que tratam não só do conhecimento em programação, mas também do trabalho em equipe. O primeiro se difere dos demais, pois possui uma parte exclusiva de problemas básicos para serem resolvidos e, mesmo sem o foco, se torna uma primeira abordagem didática em um sistema automático. A partir dessa constatação, percebeu-se que é possível explorar mais as técnicas adotadas em sala de aula para o aprendizado da programação nesse tipo de sistema, ou seja, a motivação desse trabalho se dá exatamente em usar sistemas automáticos de avaliação como uma forma continuada e assistida para a aprendizagem na área de programação. Para a realização dessa tarefa, o objetivo do trabalho foi a criação de um sistema que além do julgamento de códigos, fosse um sistema para o auxílio a aprendizagem de programação desde os níveis mais básicos até os mais avançados. A criação do sistema, mostrou que essa abordagem pode ajudar de forma bastante positiva o ensino de programação de forma em geral.

Palavras-chave: Autojudge, Sistema de Submissão, Materiais didáticos, Juízes Online, Programação

Abstract

The teaching of programming currently focuses on the algorithmic presentation of a problem and on the reproduction of codes, mainly in the initial phase of learning. Several approaches have been presented since the creation of algorithms through languages ​​closer to the human quotidian year such as PORTUGOL that uses Portuguese verbalization to understand programming logic without the need for formalism of an effectively adopted language, and even the creation of flowcharts to facilitate the understanding of all the logic that should be employed in programming. The diversity of approaches does not always guarantee an efficient form of learning, since the number of disapprovals in the programming area is relatively high, which shows the need to revise how to approach the subject. Aid tools are generally adopted at a more advanced stage, such as autojudge systems, whose basic principle is to compare the responses of a created source code with an expected result. In this line are the Online Judge, Online Judge, SPOJ (Online Judge), BOCA Online Contest Administrator, among others, whose focus is in the preparation of programmingtion competitions that deal not only with programming knowledge, but also of teamwork. The first one differs from the others because it has a unique part of basic problems to be solved, and even without the focus, it becomes a first didactic approach in an automatic system. Based on this observation, it was realized that it is possible to explore more the techniques adopted in the classroom to learn programming in this type of system, that is, the motivation of this work is exactly in using automatic evaluation systems as a continuous and assisted learning in the area of ​​programming. In order to accomplish this task, the objective of the work was to create a system that, in addition to judging codes, would be a system to aid programming learning from the most basic to the most advanced levels. The creation of the system has shown that this approach can very positively help the teaching of programming in a general way.

Keywords: Autojudge, Submission System, Teaching materials, Online Judges, Programming

2. Introdução

Disciplinas que envolvem algoritmos e programação de computadores são fundamentais para diversos cursos de graduação (Valentim, 2005) como, por exemplo, em cursos de engenharia, pois abordam o desenvolvimento de habilidades relacionadas ao pensamento computacional, que nada mais é do que uma série de habilidades e técnicas para resolução de problemas sejam eles computacionais ou não (Santos, 2015). Essas disciplinas apresentam, em sua maioria, consideráveis horas práticas com a utilização de computadores, sendo um desafio para o professor atender de maneira apropriada as necessidades individuais de cada estudante, pois cada aluno tem o seu ritmo e forma de aprender (VI Congresso Brasileiro de Engenharia de Produção, 2016). Somando-se a isso, as disciplinas de programação possuem um alto grau de reprovação, pois o raciocínio lógico exigido nem sempre é alcançado pelos alunos. As estatísticas mostram que mesmo em cursos específicos de computação a lógica é um dos maiores desafios para o aprendizado (Schimiguel, 2014). Os dados divulgados pelo Instituto Nacional de Estudos e Pesquisas Educacionais, revelam um acréscimo acentuado na taxa de desistência do curso de ingresso em programação, na avaliação de trajetória dos alunos entre 2010 e 2014. Em 2010, 11,4% dos alunos abandonaram o curso para o qual foram admitidos. Em 2014, esse número chegou a 49% (INEP, 2014).

Todas essas características indicam que utilizar ferramentas para auxiliar no ensino da programação podem ser uma abordagem interessante para diminuir o grau de reprovação e, consequentemente, melhorar tanto a assimilação desse assunto por parte dos alunos quanto o suporte as aulas adotadas pelos docentes.

Já existem diversas ferramentas que tentam auxiliar o aprendizado da programação como o Scratch cuja característica principal é passar comandos para direcionar um objeto em tela, VisuAlg que apresenta um ambiente de programação usando a linguagem Portugol com foco no algoritmo e não em detalhes de uma linguagem específica, entre diversas outras. A restrição principal nesses programas é apenas apresentar uma forma mais simples de escrever o algoritmo proposto e não mostrar como criá-lo. De outro lado existem sistemas voltados para a prática de resolução de exercícios quando já se tem conhecimento básico de programação. Essas ferramentas são os juízes online, cuja característica principal é avaliar as respostas de submissões de códigos fontes prontos com uma base pré-definida.

Segundo Amaral et al. (2011), os juízes online têm sido utilizados visando auxiliar o aprendizado, buscando reduzir índices de reprovação e evasão em disciplinas de programação. Porém, a abordagem não foca a parte inicial da aprendizagem, ou seja, adotar esse tipo de ferramenta na fase inicial do ensino de programação não é habitual devido à complexidade inerente do assunto.

Para minimizar este problema, o objetivo do sistema vai além de apenas fornecer os resultados finais de certo ou de errado para agregar o ensino da programação nesse tipo de sistema fornecendo material de apoio, dicas, sugestões, informando com mais detalhes o tipo de erro (sintaxe, compilação, etc.) cometido para que o usuário possa saber o que deve estudar e, consequentemente, assimilar melhor o conteúdo e resolver o problema com mais segurança, levando-o a um tipo de ensino incremental no ritmo que o próprio usuário se adapte melhor.

No capítulo 2 descreve-se os métodos didáticos mais usados no ensino de programação como forma aprendizagem do aluno, tais como lógica de programação, algoritmos e linguagens naturais e de programação. Já no capítulo 3 são apresentados os sistemas de auxílio a aprendizagem assistidos por computador, na qual descreve os sistemas existentes e como a tecnologia evoluiu para o aprendizado do aluno, além de retratar os principais juízes online existentes no mercado. O capítulo 4 mostra-se a pesquisa realizada antes das pessoas terem conhecimento sobre o sistema. No capítulo 5 apresenta-se o sistema Seven Online Judge, foco desse trabalho, que consiste de um sistema web com autojudge com problemas a serem desenvolvidos com o auxílio do computador. Para cada problema existe uma solução cadastrada e material de apoio indicando caminhos para a resolução do problema. Por fim, no capítulo 6 são apresentadas as considerações finais e propostas de trabalhos futuros.

3. Métodos didáticos de ensino de programação

Em pesquisas realizadas nos últimos anos, como mostram Pereira e Rapkiewicz (2004), observa-se uma preocupação crescente com o processo de ensino/aprendizagem de programação. Tais estudos são motivados, sobretudo, pela importância dos conceitos de programação na vida acadêmica dos cursos de computação.

Existem várias possibilidades de origem das dificuldades no ensino de programação, como destaca Raabe e Silva (2005), seja pela exigência lógico-matemático predominante na disciplina, ou mesmo pela dificuldade de apreensão, por parte do professor, ritmo de aprendizagem de cada aluno. No que diz respeito ao ritmo de aprendizagem é importante destacar que o andamento da disciplina não necessariamente é conduzido no ritmo de assimilação de cada aluno, fator que pode ter como consequência o desinteresse pelo conteúdo ministrado, ou até mesmo certa aversão a disciplina. É comum observar pesquisas apontando casos de evasão de curso, fato que tem relação íntima com as dificuldades de aprendizagem (Castro et al., 2003).

Um fator importante é a difícil tarefa do professor em identificar, em uma turma, as dificuldades individuais de cada aluno, tornando-se o aprendizado passível de falhas. A não identificação dos níveis de dificuldade dos educandos pode implicar em muitas dificuldades futuras, pois à medida que se iniciam atividades mais complexas envolvendo programação, ou conteúdos de alguma forma relacionados (Estrutura de Dados, Análise de Algoritmos, etc.), a dependência de boa desenvoltura nos conceitos básicos aumenta significativamente (Rocha et al., 2010).

Na literatura encontram-se diversas ferramentas desenvolvidas para o ensino de programação. Um dos métodos utilizados é o uso do pseudocódigo, uma forma genérica de escrever um algoritmo, utilizando uma linguagem mais informal, podendo ser entendida por qualquer pessoa, sem necessidade de conhecer a sintaxe de nenhuma linguagem de programação. O uso do pseudocódigo também pode auxiliar a escrever um programa menor e mais fácil de ser entendido. Nesta categoria, Almeida et al. (2004) descreve o ambiente AMBAP (Ambiente de apoio ao aprendizado de programação), concebido com o objetivo de auxiliar os alunos na aprendizagem de programação. O programa oferece ao aluno a oportunidade de trabalhar com uma linguagem algorítmica, mais simples do que as linguagens de programação reais. A utilização de pseudocódigo também apresenta uma desvantagem, a qual é a falta de padronização.

Dada a sua natureza não estruturada, é um tanto difícil de padroniza-lo, logo, um programador pode não entender a lógica de um programa escrito por outra pessoa (Halstead, 2007).

Uma das maiores dificuldades de um estudante de programação é entender cada passo da execução do programa. Aprender a gramática de uma linguagem de programação, consertar erros de sintaxe em um programa, desenvolver novos algoritmos, escrever um novo programa, depurar e consertar erros em um programa são as principais dificuldades de um estudante que inicia um curso de programação, em ordem crescente de dificuldade (Miyadera, 1999).

O ensino da programação não é fácil e, devido a isso, muitas universidades discutem com frequência seus currículos em busca de alternativas para diminuir o índice de evasões. É comum observar pesquisas que apontam o grande número de evasões neste curso, fato que tem relação com as dificuldades de aprendizagem (CASTRO et al., 2013).

Segundo Pereira (2013), a Lógica de Programação deveria andar junto com outras disciplinas do ensino básico, tais como Biologia, Química e Física. Neste contexto, o ensino de programação para crianças poderia desenvolver o pensamento computacional e passos lógicos para a resolução automatizada de problemas (KAFAI; BURKE, 2013).

Uma das grandes preocupações das instituições de ensino superior é a evasão dos alunos que ocorre, geralmente, nos primeiros semestres após o ingresso nos cursos da área de informática. A evasão causa, tanto para o setor público como para o setor privado, grandes prejuízos, tais como a ociosidade dos professores, funcionários e infraestrutura (SLHESSARENKO et al., 2014). As causas consideradas relevantes à evasão seriam:

  • Mudança de interesse do aluno;

  • Indecisão profissional;

  • Expectativas não atendidas em relação ao curso;

  • Dificuldades de acompanhamento do curso.

No tópico a seguir é abordado o ensino de lógica de programação, uma vez que para aprender programação é necessário que o aluno aprenda lógica.

3.1. O Ensino de Lógica de Programação

Os processos de ensino e de aprendizagem da Lógica de Programação não são triviais, pois exigem que se tenha conhecimento de uma linguagem especifica e da lógica envolvendo os programas. O que ocorre, na maioria das vezes, é que alunos acabam desistindo do curso de Computação devido às dificuldades encontradas no aprendizado da Lógica de Programação, fazendo com que os mesmos sejam reprovados, diminuindo sua autoestima, gerando uma aversão diante do conteúdo ensinado. Problemas como estes fazem parte dos grandes desafios da Educação na Informática (FERREIRA et al., 2010).

Atualmente, tem-se reconhecido a necessidade de introduzir conceitos computacionais desde as séries iniciais, focando principalmente no ensino da Lógica de Programação, já que a mesma pode auxiliar no desenvolvimento do poder cognitivo das crianças (ARAÚJO et al., 2015).

Muitos autores apontam que o uso de ferramentas lúdicas é uma forma de atrair a atenção dos alunos, para que eles aprendam com mais facilidade e consigam desenvolver mais facilmente suas habilidades. Para Macedo et al. (2015) a utilização de ferramentas lúdicas para o ensino e aprendizagem possuem as seguintes qualidades:

  • Tornam as tarefas prazerosas;

  • São desafiadoras;

  • Possuem dimensão simbólica;

  • Não limitam as possibilidades.

3.1.1. Pensamento Computacional

Pensamento Computacional é o conjunto de habilidades para resolução de problemas desenvolvida ao estudar conteúdos provenientes da ciência da computação. O Pensamento Computacional deve ser uma habilidade fundamental para todas as pessoas e não somente para aqueles da área da computação. Além da leitura e escrita deve-se acrescentar o pensamento computacional às habilidades analíticas das crianças (WING, 2006).

A Sociedade Brasileira de Computação (SBC) acredita que o pensamento computacional é o processo cognitivo usado pelos seres humanos para resolver problemas. Este processo habilita aos estudantes a organizar a solução de problemas a partir de habilidades como abstração, refinamento, modularização e recursão, mudando a forma do indivíduo se relacionar com o mundo. Além disso, o ensino do Pensamento Computacional não necessita de computadores e pode ser efetivado através de outros materiais que remetem este conhecimento (SBC, 2016).

Para Vargas et al. (2012), o raciocínio lógico faz com que as pessoas desenvolvam suas próprias resoluções para os problemas e não se baseiam em conceitos pré-definidos formando assim seu próprio pensamento.

Resnick et al. (2009), dizem que o estudo de programação de computadores é uma forma de compreender as ideias relacionadas ao Pensamento Computacional, pois aprimoram as habilidades de raciocínio e pensamento lógico. A seguir, apresenta-se algumas ferramentas para ensinar lógica de programação.

3.1.2. Ferramentas para ensinar Lógica de Programação

Como ferramenta para ensinar lógica de programação, pode-se citar o SCRATCH, o qual ajuda os jovens a aprender a pensar criativamente, a argumentar de forma sistemática e a trabalhar em colaboração.

Wangenheum et al., (2014) relata que o SCRATCH possibilita a criação de animações, jogos, imagens e sons, entre outras possibilidades. Essa ferramenta foi desenvolvida pelo Lifelong Kindergarten Group no MIT Media Lab.

Segundo Oliveira et al., (2014), o SCRATCH é uma linguagem gráfica de programação, com o objetivo de auxiliar a aprendizagem de programação de maneira lúdica e criativa, que pode ser usada por crianças a partir de oito anos de idade e por pessoas que não possuem nenhum conhecimento em programação. As atividades são desenvolvidas a partir de blocos que se encaixam e são divididas em categorias como: movimento, aparência, som, canetas, sensores, controle, operadores e variáveis. A figura 1 apresenta a interface do SCRATCH.

Figura 1 - Interface do SCRATCH


Fonte: GOOGLE.COM, 2017

Na figura 1 mostra-se a interface do SCRATCH, a qual conta com uma tela para o estudante enviar seus scripts, que são roteiros seguidos por sistemas computacionais e trazem informações que são processadas e transformadas em ações efetuadas por um programa principal (Pereira, 2012), e do lado direito ele pode movimentar o personagem de acordo com o script enviado.

Uma outra ferramenta bastante utilizada no Brasil para ensino de programação é o VisuAlg. O VisuAlg foi criado pela empresa Apoio Informática e pode ser muito útil para estudantes que estão iniciando os estudos na área de programação de computadores, pois os comandos utilizados nesta ferramenta são todos em português. Também é possível acompanhar o funcionamento do programa por meio do comportamento das variáveis (APOIO INFORMÁTICA, 2016). A figura 2 apresenta a interface do VisuAlg.

Figura 2 - Interface do VisuAlg


Fonte: GOOGLE.COM, 2017

A figura 2 representa a interface do VisuAlg, onde é possível que o aluno faça seus algoritmos respeitando a hierarquia do programa. Na tela há a representação de um algoritmo feito dentro do programa, onde na primeira linha deve-se dar o nome ao algoritmo, que neste exemplo é “semnome”, logo abaixo há os comentários para que se informe a função, o autor, a data e a seção de declarações, depois tem o campo var, onde o usuário deve informar quais variáveis o seu algoritmo irá utilizar. Após isso tem o comando “início”, o qual é responsável por iniciar o algoritmo e para finalizar, utiliza-se o comando “fimalgoritmo”.

A seguir, apresenta-se a ferramenta Alice, que também é uma outra ferramenta para ensinar lógica de programação.

Cooper et al. (2003), apresenta a ferramenta Alice, que fornece animação 3D e manipulação direta dos elementos de uma linguagem de programação. A ferramenta remove a necessidade de os alunos terem que escrever código e ligar com a sintaxe, permitindo que eles se concentrem em conceitos de aprendizagem. A ferramenta Alice permite o uso de uma linguagem gráfica, introduzindo conceitos de animação, auxiliando os alunos a aprender sobre construções e estilos de programação. A figura 3 apresenta a interface do Alice.

Figura 3 - Interface do Alice


Fonte: GOOGLE.COM, 2017

A figura 3 mostra o funcionamento do Alice, onde é possível o usuário criar um mundo virtual formado pelos seguintes objetos 3D:

  • Cenários;

  • Atores;

  • Modelo em Segundo Plano.

No tópico seguinte, descreve-se outro método de ensino, os algoritmos.

3.2. Algoritmos

Um algoritmo pode ser definido como uma sequência finita de passos (instruções) para resolver um determinado problema. Sempre que se desenvolve um algoritmo estamos estabelecendo um padrão de comportamento que deverá ser seguido (uma norma de execução de ações) para alcançar o resultado de um problema (Ferrari; Cechinel, 2007). Serve como modelo para programas, pois sua linguagem é intermediária a linguagem humana e as linguagens de programação, sendo então, uma ferramenta na validação da lógica de tarefas a serem automatizadas.

Para o desenvolvimento de um algoritmo eficiente é necessário obedecer algumas premissas básicas no momento de sua construção.

  • Definir ações simples e sem ambiguidade;

  • Organizar as ações de forma ordenada;

  • Estabelecer as ações dentro de uma sequência finita de passos.

Os algoritmos são capazes de realizar tarefas como:

  • Ler e escrever dados;

  • Avaliar expressões algébricas, relacionais e lógicas;

  • Tomar decisões com base nos resultados das expressões avaliadas;

  • Repetir um conjunto de ações de acordo com uma condição.

Um algoritmo quando programado num computador é constituído por 3 partes, sendo elas:

  • Entrada de dados;

  • Processamento de dados;

  • Saída de dados.

Na entrada, são fornecidas as informações necessárias para que o algoritmo possa ser executado (Da Silva, 2011). Estas informações podem ser fornecidas no momento em que o programa está sendo executado ou podem estar embutidas dentro do mesmo.

Na parte do processamento são avaliadas todas as expressões algébricas (Dias, 2011), relacionais e lógicas assim como todas as estruturas de controle existentes no algoritmo (condição e/ou repetição).

Na saída, todos os resultados do processamento (ou parte deles) são enviados para um ou mais dispositivos de saída (Cechinel, 2009), como: monitor, impressora, ou até mesmo a própria memória do computador. A figura 4 ilustra as partes básicas de um algoritmo.

Figura 4 - Partes básicas de um algoritmo


Fonte: Google, 2017

A figura 4 mostra que todo algoritmo deve ter uma entrada, um processamento e uma saída.

Existem diversas formas de representação de algoritmos, mas não há um consenso com relação a melhor delas (Alves, 2004).

O critério usado para classificar hierarquicamente estas formas está diretamente ligado ao nível de detalhe ou, inversamente, ao grau de abstração oferecido.

Algumas formas de representação de algoritmos tratam os problemas apenas em nível lógico, abstraindo-se de detalhes de implementação muitas vezes relacionados com alguma linguagem de programação especifica.

Dentre as formas de representação de algoritmos mais conhecidos pode-se citar:

  • Descrição Narrativa;

  • Fluxograma;

  • Pseudocódigo.

3.2.1. Descrição Narrativa

Na descrição narrativa a representação dos algoritmos é na forma de linguagem natural. Esta representação é pouco usada na prática, pois o uso da linguagem natural muitas vezes dá oportunidade a más interpretações, ambiguidades e imprecisões (Ramos, 2014). Para exemplificar essa forma de abordagem são apresentados 3 exemplos. A figura 5, trata de uma receita de bolo.

Figura 5 - Receita de bolo


A figura 5 enumera os passos de preparação de forma hierárquica de um bolo.

A figura 6 trata de um algoritmo que realiza o dobro de um número.

Figura 6 - Dobro de um número


A figura 6 enumera a sequência para gerar o dobro de um número.

A figura 7 exemplifica os passos para levantar da cama e ir trabalhar.

Figura 7 - Levantar da cama para ir trabalhar


Para essa descrição são usados 9 passos sempre começando por uma entrada e terminando com o resultado esperado.

O tópico a seguir trata de uma outra forma de representar algoritmos, o chamado fluxograma.

3.2.2. Fluxograma

Fluxograma é uma representação de um processo que utiliza símbolos gráficos para descrever passo a passo a natureza e o fluxo deste processo. O objetivo é mostrar de forma descomplicada o fluxo das informações e elementos, além da sequência operacional que caracteriza o trabalho que está sendo executado (Citisystems, 2016).

As etapas do fluxograma são apresentadas utilizando-se figuras geométricas que podem ser círculos, losangos, retângulos, setas, etc. sendo que cada símbolo possui um significado, conforme é visualizado na tabela 1:

Tabela 1 - Símbolos e significados do Fluxograma




Adaptado de: vinki.com.br, 2016.

O item a seguir trata de mais uma forma de representação de algoritmos, intitulado pseudocódigo.

3.2.3. Pseudocódigo

É uma forma de representação de algoritmos, é praticamente um programa escrito em português que, depois, podemos passar para o computador (Embarcados, 2016). É rica em detalhes, como a definição dos tipos das variáveis usadas no algoritmo. Por assemelhar-se bastante a forma em que os programas são escritos, encontra muita aceitação (Alves, 2004).

Para escrever códigos com pseudocódigo, é necessário conhecer alguns comandos básicos na tabela 2.

Tabela 2 - Comandos do Pseudocódigo

Comando

Descrição

Escreva (“ ”)

comando usado para imprimir uma mensagem na tela

Leia ( )

comando usado para ler valores digitados no teclado

<-

comando de atribuição

Início

palavra usada para iniciar o programa

Fim ou Fimalgoritmo

palavra usada para finalizar o algoritmo

Var

palavra usada para declarar variáveis

Algoritmo

palavra usada para indiciar o início do programa

É possível observar na tabela 2 que a quantidade de comandos é pequena e se assemelha a uma linguagem de programação. Para exemplificar seu uso, são apresentados programas simples e suas representações usando o pseudocódigo.

Para o problema de ler 2 números e informar como resposta a sua soma é apresentada na figura 8.

Figura 8 - Algoritmo para ler dois números

Pode-se observar, na figura 8, que o pseudocódigo descreve passo a passo os procedimentos a serem realizados em ordem. Na linha 1 a palavra-chave algoritmo é utilizada para começar o algoritmo. Observa-se que em seguida há um nome entre as aspas duplas, indicando o nome a ser dado ao programa. A linha 2 possui apenas a palavra var que indica o bloco de variáveis para serem declaradas. Na linha 3 são declaradas as variáveis, com seus indicadores e tipos. Nota-se que primeiro vem o nome (identificador) da variável que armazenará o resultado da operação. A linha 4 utiliza a palavra-chave inicio indica que a partir deste ponto, tem-se o início do programa. Já na linha 5, o comando escreva é usado para que seja impresso na tela do usuário um texto. Neste caso, está sendo impresso na tela um texto de solicitação para que o usuário digite um número. Na linha 6, o comando leia é empregado para que o valor digitado pelo usuário no teclado, seja armazenado na variável correspondente. Portanto, será atribuído a variável n1 o valor que o usuário digitar. As linhas 7 e 8 funcionam de forma idêntica, respectivamente as linhas 5 e 6, porém para a variável n2. Enquanto que na linha 9 é realizada uma operação matemática utilizando o comando <- a fim de que seja atribuído a variável soma o resultado da soma entre os valores armazenados em n1 e n2. Nas linhas 10, 11 e 12, utiliza-se o comando escreva para imprimir na tela as variáveis n1, n2 e soma. Para encerar o algoritmo, na linha 13, usa-se o comando fim. Essa palavra-chave força a saída do programa, fechando a janela e liberando o espaço de memória que estavam reservados para as variáveis.

O segundo exemplo é um problema de cálculo do salário de um empregado. O problema consiste em calcular o salário juntamente com as horas extras feitas pelo trabalhador e mostrar o salário final na tela.

A figura 9 ilustra o pseudocódigo.

Figura 9 - Salário de um empregado

Observa-se na figura 9, que o pseudocódigo segue a mesma sequência do exemplo anterior. A principal diferença está na operação envolvida no cálculo do salário definido na linha 11.

No capítulo 3, aborda-se os sistemas assistidos pelo computador, onde descreve-se os juízes online.

4. Sistemas de auxílio a aprendizagem assistidos por computador

A tecnologia computacional tem mudado a prática de quase todas as atividades, das cientificas às de negócio até às empresariais, e o conteúdo e prática educacionais também seguem essa tendência. Os primeiros usos do computador em educação surgiram ainda no final da década de cinquenta, o conjunto de programas auxiliares ao ensino eram extremamente limitados e representavam as possiblidades tecnológicas da época. Treinamento Baseado em Computadores (CBT – Computer Based Training) e Instruções Auxiliadas por Computadores (CAI – Computer Aided Instruction), eram basicamente programas de perguntas e respostas, sendo que o computador dava ao estudante uma pergunta e este lhe dava uma resposta, cabendo ao computador retornar se esta estava correta ou não, foram os primeiros sistemas desenvolvidos como tentativas de ensino por computador, (Beck et al., 1998). Os sistemas gerados funcionavam como um livro digital, não havendo distinção alguma entre os vários níveis de conhecimento dos alunos, tampouco a geração de problemas e comentários diferenciados (Feigenbaum; Barr, 1982).

No final da década de 1960 e início da de 1970, muitos pesquisadores passaram a desenvolver sistemas que alteravam o fornecimento de novos materiais de acordo com o histórico de respostas dos estudantes. Conhecidos como Drill & Pratice, estes foram os primeiros sistemas a modelarem a forma de aprendizado do aluno, embora esta modelagem fosse apenas comportamental e não de seus estados de conhecimento (Urban-Lurain, 1996).

No final da década de 1970, surgiu uma nova geração de programas educacionais. Contribuições substanciais de áreas como Inteligência Artificial e Psicologia Cognitiva fazem com que as lições já não mais fossem apresentadas seguindo sempre um mesmo procedimento de ensino. Em outras palavras, o domínio a ser ensinado ganha independência e foi apresentado de diversas formas, seguindo estratégias de ensino diferentes. Tais sistemas passaram a se chamar ICAI (Intelligent Computer Assisted Instruction). Em 1982, segundo Urban-Lurain (1996), Sleeman e Brown foram os primeiros a usar o termo Sistema Tutores Inteligentes (STI) para descrever tais sistemas, enquanto que Konzen (1999) define os STI como sistemas computacionais que incorporam técnicas de áreas como Inteligência Artificial e Psicologia Cognitiva.

Os STI são programas de computador com propósitos educacionais e que incorporam técnicas de Inteligência Artificial (IA), geralmente utilizando-se da tecnologia dos sistemas especialistas, os quais podem ser definidos como um conjunto de elementos, materiais ou ideias, entre os quais se possa encontrar um definir alguma relação (Carvalho, 2006).

Santos (1997) cita alguns aspectos desejáveis na interface de STI, entre eles: ser fácil de usar, o que significa que ele deve minimizar o número de ações necessárias para que o sistema possa se comunicar com o aluno; apresentar dados em diversos formatos e representações, enriquecendo, portanto, o retorno do sistema.

Os sistemas continuaram a evoluir, incorporando avanços tecnológicos, principalmente na área de IA, que possibilitaram uma sofisticação nos sistemas computacionais (Valente, 1999). Estes sistemas foram cada vez mais se aperfeiçoando tendo por base diferentes correntes psicológicas de aprendizagem e a ajuda dos estudos em IA, onde a máquina passa a ser considerada um instrumento de ensino a ser usado para facilitar o desenvolvimento e desempenho dos alunos.

O objetivo desses sistemas é encorajar o estudante a tomar a iniciativa e o aprendizado é entendido não como mera aquisição de conhecimento, mas como uma evolução em direção a especialização (Cumming; Self, 1990).

O ensino assistido ou auxiliado por computador parte do pressuposto de que a informação é a unidade fundamental no ensino e, portanto, preocupa-se com os processos de como adquirir, armazenar, representar e principalmente transmitir informação. Nesse sentido, o computador é visto como uma ferramenta poderosa de armazenamento, representação e transmissão da informação (Baranauskas, 1997).

A utilização dessas tecnologias tem sido de suma importância para auxiliar professores e alunos. Essas ferramentas, aplicadas a tais disciplinas, podem facilitar o aprendizado de programação, reduzindo os índices de reprovação e o mau desempenho em outras matérias que tenham programação como pré-requisito.

No sentido de melhorar esta situação, a utilização da Tecnologia de Informação e de Comunicação (TIC) permite dinamizar as aulas, estimular o senso crítico, a criatividade em função de uma educação para a autonomia, descobrindo novos paradigmas, que ajudam os professores, atrai os alunos, aproxima a sala de aula do cotidiano (Laerth, 2013). As TIC podem ser definidas como tecnologia e instrumento usadas para compartilhar, distribuir e reunir informações, bem como para comunicar-se umas com as outras, individualmente ou em grupo, mediante o uso de computadores e redes de computadores interconectados. O uso das TIC no incremento do trabalho pedagógico, é relevante na construção do conhecimento.

O uso das TIC no ambiente escolar como formas de mediação pode contribuir para melhorar a aprendizagem devido a versatilidade de linguagens envolvidas. Elas podem ser usadas para integrar vários conteúdos, ensinando, revisando, corrigindo e reforçando conhecimentos, usando diferentes tipos de representações que são trabalhadas por diferentes estilos de aprendizagem e diferentes talentos. Isso porque revestem os processos educativos com movimentos, cores, sons, emoções, relacionamentos com pessoas e dados concretos, além de permitirem que a aprendizagem se constitua por meio de outras abordagens. (CORTELAZZO, 1996, p.57)

Um exemplo a ser citado é a utilização dos Ambientes Virtuais de Aprendizagem (AVA), categoria que tem segundo Kumar et al. (2011) como forte representante o Moodle (Modular Object Oriented Distance Learning). Desenvolvido pelo australiano Martin Dougiamas em 1999, o Moodle é utilizado por instituições de ensino em todo o mundo, apresentando uma grande comunidade composta por membros com diferentes objetivos, desde manutenção e aperfeiçoamento do sistema a discussões referentes a estratégias pedagógicas para um bom aproveitamento do ambiente para o ensino (O uso do Moodle no apoio de ensino de programação para alunos iniciantes, 2007).

A figura 10 expõe o diagrama do Moodle.

Figura 10 - Diagrama esquemático dos Módulos e Ferramentas do Moodle


Fonte: Google, 2017

A figura 10 apresenta o diagrama, cuja visão é batizada pelas ferramentas do AVA e suas integrações. Nesta abordagem não foram especificados os conceitos de banco de dados e sim os módulos de trabalho do ambiente.

No que diz respeito à avaliação de atividades de programação (atividades práticas de codificação), existem sistemas voltados para esse fim ou se pode usar os sistemas de Juízes Online, pois possuem um amplo repositório de questões e pelo seu processo de avaliação automática de correção, (ZHIGANG et al., 2012).

Como parte das TIC, na seção a seguir, descreve-se os juízes online.

4.1. Juízes Online

Os sistemas de autojudge online ou juízes online são ferramentas utilizadas para avaliação automática de exercícios voltados para disciplinas de programação, administrando o fornecimento e correção de tais exercícios (Kurnia, 2001). Para o desenvolvimento e resolução dos programas, o usuário envia o código fonte para o sistema, este é compilado, executado e testado com o objetivo de verificar se o aluno acertou ou não o problema proposto (Zhigang et al., 2012). Durante a execução do código do programa, os juízes online utilizam dados formatados como entrada do programa. Em seguida, esses dados são processados e é realizada a comparação dos resultados obtidos com os resultados esperados, dando uma resposta apropriada com base nestas comparações (certo, errado, erro de execução, erro de compilação).

A seguir, descreve-se alguns juízes online.

4.1.1. SPOJ

O SPOJ (SPhere Online Judge, 2011), doravante SPOJ, é um repositório que tem por objetivo disponibilizar os problemas de regionais, seletivas e de olimpíadas de programação em português. Algumas de suas características mais importantes incluem:

  • Suporte para mais de 45 linguagens de programação e compiladores, incluindo C, C++, Pascal, JAVA, C#, Perl, Python, Ruby, Haskell, Ocaml.

  • Um conjunto com cerca de 13000 tarefas disponíveis para a prática, 24 horas por dia (em inglês, polonês, vietnamita, português e outras línguas), incluindo muitas tarefas originais preparadas pela comunidade de especialistas associados a comunidade.

  • Mais de 2400 concursos organizados a partir de 2012, que vão desde desafios instantâneos a longos cursos de e-learning1.

O SPOJ tem como planos incrementar o site com problemas de provas passadas, em forma de competições, assim como traduzir os problemas da sessão “Classical” do SPOJ original, sistema principal do qual a versão brasileira é baseada, e criar competições para ajudar nos treinos de equipes tanto para Maratona de Programação, quanto para a Olimpíada de Programação.

A figura 11 mostra o funcionamento do SPOJ.

Figura 11 - Funcionamento do SPOJ

A figura 11 descreve como o usuário utiliza o SPOJ, começando pelo cadastro do sistema, depois ele pode escolher o exercício que deseja e por fim, envia-se o código para avaliação.

4.1.2. Uva Online Judge

O Uva Online Judge (Uva Online Judge, 2011) suporta linguagens como C, C++, Java, Pascal e Python. É principalmente utilizado em maratonas de programação. Possui ranking de competidores, além de disponibilizar diversos exercícios. Entretanto, está disponível apenas em inglês. A Figura 12 mostra a página inicial do Uva Online Judge.

Na figura 12 é mostrado alguns membros do Uva e também é descrito que há milhares de problemas a serem resolvidos e que eles são semelhantes as maratonas de programação.

O Uva Online Judge foi desenvolvido para treinamentos e competições pela Universidade de Valadolid na Espanha. Contém um grande acervo de problemas, estes organizados somente em volumes (BEZ, 2014).

Embora o Uva tenha um grande número de exercícios, todos os problemas se encontram em único repositório, sem separação por nível de dificuldade ou assunto, o que acaba desestimulando os estudantes que estão iniciando.

4.1.3. BOCA

BOCA Online Contest Administrator (Campos, 2011) é uma plataforma utilizada em seletivas regionais e nacionais de maratonas de programação do Brasil e da América Latina. Permite a simulação de uma competição de programação com a criação de equipes de programação, envio de solução de exercícios, controle de tempo e resposta quanto às soluções enviadas ao sistema em tempo real, mostra o placar entre as equipes e, por ser baseado em sistema web, permite a criação de maratonas com equipes separadas fisicamente em diversos lugares.

O sistema BOCA foi criado por Cassio Polpo de Campos e desenvolvido para ser usado na Maratona de Programação da Sociedade Brasileira de Computação (SBC). O sistema pode ser usado também no apoio a disciplinas em que se faça uso de submissão e correção de trabalhos durante as aulas.

Na competição, a correção dos programas enviados pelos times é feita de forma online, e o resultado deve ser transmitido ao time o mais breve possível. Desenvolvido com uma interface web, o BOCA é um sistema de entrega de exercícios, com autenticação, controle de tempo e disponibilização de resultados, tudo em tempo real. A figura 13 ilustra a interface do BOCA.

Figura 13 - Interface do time para enviar submissões


Fonte: BOCA, 2004

Na figura 13 é possível visualizar os problemas, qual a linguagem usada para a submissão, bem como a resposta dada, se foi compilado com erro, se foi aceito e se ainda não foi respondido.

4.1.4. URI Online Judge

URI Online Judge (Tonin; Bez, 2013) é um projeto desenvolvido pelo Departamento de Ciência da Computação da Universidade URI (Universidade Regional Integrada – Campus de Erechim). A plataforma conta com um banco de dados de exercícios, separados em 8 níveis de dificuldade, solução em diferentes linguagens de programação (C, C++, JAVA, Python e Ruby), organização sistemática das atividades, além de acesso à evolução dos alunos nas listas de exercícios. A figura 14 mostra a tela inicial do URI.

Figura 14 - Tela inicial do URI


Fonte URI, 2017

Na figura 14 é apresentada a área de login no centro da tela, no lado esquerdo há descrição do site e o repositório de problemas, enquanto que no lado direito da figura é possível acessar o ranking e também a parte acadêmica.

O URI foi desenvolvido em três ambientes: um para acesso dos alunos, um ambiente do professor e um espaço para fóruns. No ambiente dos alunos, possui o juiz automático de correção dos exercícios em tempo real. Nela os exercícios são dispostos em categorias de problemas (figura 15), o que auxilia o aluno a resolver os exercícios de acordo com seu grau de conhecimento. No ambiente do professor (URI Online Judge Academic2) é possível criar grupos com os alunos e listas de exercícios com data para entrega. Com isso, pode-se observar o progresso dos alunos e auxiliar os que estiverem com mais dificuldade. O fórum é também, dividido por exercício, e possui tópicos de moderadores que tiram dúvidas e auxiliam na resolução do problema.

Figura 15 - Níveis de dificuldade do URI


Fonte: URI, 2017

A figura 15 mostra os níveis de dificuldade existentes no sistema, sendo eles: Beginner (Iniciante), Ad-Hoc, Strings, Data Structures and Libraries (Estruturas e Bibliotecas), Mathematics (Matemática), Paradigms (Paradigmas), Graph (Grafos) e Computational Geometry (Geometria Computacional). Também exibe as opções de Recommended (exercícios recomendados), que são exercícios sugeridas pelo sistema ao estudante; Authors (Autores), o qual agrupa todos os problemas por autor; List All (Listar Todos), opção que lista todos os problemas em um só lugar; Origins (Origens), o qual agrupa todos os problemas por competições ou eventos.

O URI é indicado para o ensino por diversos motivos, entre eles, pode-se elencar: a divisão dos exercícios por categorias e dificuldades; disponibilidade em português, inglês e espanhol; possuir ambientes para aluno e professor; dispor um ranking global de resolução de exercícios por aluno e instituição; conter mais de 1200 exercícios; apresentar um fórum de discussões que auxilia os usuários; entre outras características.

Além de possuir algumas funcionalidades semelhantes ao SPOJ e Uva, como repositórios de problemas de maratonas de programação, disponibiliza um módulo para professores onde pode criar disciplinas limitando, ou não, seu acesso a determinando grupo.

O portal também é disponibilizado em língua inglesa, o que possibilita a sua internacionalização, permitindo a sua utilização tanto por estudantes de países estrangeiros ao mesmo tempo em que incentiva os usuários brasileiros a praticarem o idioma que é fundamental na formação de estudantes de Computação (Tonin, 2014).

Dentro do sistema, o aluno pode escolher o exercício que deseja fazer, para cada problema existe uma breve descrição do que é pedido, há também o descritivo da entrada e da saída esperada pelo sistema, bem como os exemplos de entrada e de saída, para que o usuário possa situar do que se trata o problema. Na figura 16 há um exemplo de um problema no URI.

Figura 16 - Problema: Soma Simples


Fonte: URI, 2017

A figura 16 mostra o título do problema proposto, com um breve descritivo, também ilustra o que se pede de entrada e a saída esperada, por fim a figura coloca uma tabela com exemplos de entrada e saída para ajudar o usuário a entender como a saída deve ser.

Sempre que o estudante submete uma solução para um problema, recebe como resposta a mensagem “Código recebido! Sua submissão está na fila para ser julgada...”. Para receber o retorno do sistema, o estudante precisa ir ao menu de submissões e verificar na lista de submissões, se a sua solução foi avaliada e qual o resultado da avaliação como é visto na figura 17.

Figura 17 – Tela de submissões


Fonte: URI, 2017

A figura 17 ilustra a tela de submissões de código, onde o estudante pode filtrar por exercícios que foram aceitos, por número e por linguagem em que foi resolvido o problema. Também é mostrado a data em que o exercício foi enviado e o seu tempo de execução.

O estudo dos sistemas baseados em juízes foi o suporte para entender que sistemas automáticos podem ser usados de forma mais efetiva para a aprendizagem de programação. A base de respostas para os códigos submetidos é uma parte importante, mas não única, em um sistema mais abrangente e que possa ser usado tanto em sala de aula como de forma autônoma. Para complementar o estudo dos sistemas baseados em juízes, foi realizada uma pesquisa sobre o grau de facilidade e familiaridade dos entrevistados com linguagem de programação.

5. Pesquisa

A pesquisa realizada consistiu de 8 perguntas e um texto descritivo para situar os entrevistados sobre o assunto.

Figura 18 - Texto descritivo

O descritivo elaborado é apresentado na figura 18.

As perguntas elaboradas são enumeradas a seguir:

  1. “Você já teve algum contato com alguma linguagem de programação? ”

  2. “Caso a resposta escolhida em 1 tenha sido ‘sim’, qual foi a sua maior dificuldade em aprender programação? “

  1. Os comandos da linguagem;

  2. A sintaxe da linguagem;

  3. O método de ensino aplicado pelo professor;

  4. Outro.

  1. “Qual o seu nível de interesse em aprender programação? “

a) Alto;

b) Médio;

c) Baixo;

d) Nenhum.

  1. “Na sua opinião, qual seria o melhor método de aprendizagem de programação? “
    a) Somente aulas presenciais;

b) Leitura de livros sobre o tema;

c) Sistemas de ensino online que indica quais erros o aluno cometeu;

d) Uma mistura de aulas presenciais com sistemas de ensino online.

  1. “Entre os itens abaixo, quais você conhece? “

  1. Banco de dados;

  2. Lógica de Programação;

  3. Linguagem de Programação.

  1. “Tratando-se de sistemas com autojudge, você prefere sistemas competitivos (URI Online Judge, UVA Online Judge) ou um sistema que auxilie o aluno na aprendizagem de programação?

  2. “Os sistemas de autojudge online ou juízes online são ferramentas utilizadas para avaliação automática de exercícios voltados para disciplinas de programação. Qual a sua opinião sobre o uso desses sistemas no aprendizado? “

  3. “De 0 a 10, quanto você julga importante o uso de sistemas com autojudge, com material didático de apoio, no processo de aprendizagem do aluno? “

Ao todo, 69 pessoas responderam ao questionário e os resultados são apresentados nos gráficos a seguir.

O gráfico da figura 19 mostra a porcentagem dos entrevistados com acesso a alguma linguagem de programação.

Figura 19 - Gráfico da questão 1


Fonte: Google Forms, 2017

A figura 19 mostra que 73,9% responderam sim, ou seja, a maioria das pessoas entrevistadas devem ser da área. Um bom indicativo para uma avaliação mais precisa, pois o sistema proposto é voltado ao ensino de programação.

A pergunta 2 foi respondida apenas por quem escolheu “sim” na questão 1.

Contando com 4 questões, dentre elas:

  • Os comandos da linguagem;

  • A sintaxe da linguagem;

  • O método de ensino aplicado pelo professor;

  • Outro.

A opção “Outro” dá a oportunidade ao usuário escrever qual foi a sua maior dificuldade no processo de aprendizagem de programação, caso o mesmo não encontrasse dentro das opções disponíveis.

A seguir, o gráfico da figura 20 evidencia o resultado.

Figura 20 – Gráfico da questão 2


Fonte: Google Forms, 2017

A figura 20 mostra que 43,1% dos usuários responderam que o maior problema foi o método de ensino aplicado pelo professor, 27,5% disseram que a maior dificuldade foi os comandos da linguagem, 19,6% replicaram que a sintaxe da linguagem foi o maior problema. Para a escolha da opção outro, se deu a liberdade de escrever qualquer texto.

A figura 21 mostra o nível de interesse dos entrevistados em aprender programação.

Figura 21 - Gráfico da questão 3


Fonte: Google Forms, 2017

É possível observar que 43,5% das pessoas tem alto interesse em aprender programação, 24,6% possuem médio interesse, 21,7% reportam baixa relevância ao assunto e 10,1% não tem nenhum interesse em aprender programação. O gráfico mostra que a maioria dos entrevistados tem interesse em programação.

Já o gráfico da figura 22 mostra qual o melhor método de aprendizagem, segundo os entrevistados, mediante 4 opções.

Figura 22 - Gráfico da questão 4


Fonte: Google Forms, 2017

A figura 22 ilustra o resultado obtido da questão 4, sendo que:

  • 72,5% dos usuários apontam que uma mistura de aulas presenciais com sistemas de ensino online é o melhor método de aprendizagem.

  • 17,4% das pessoas acreditam que sistemas de ensino online que indica quais erros o aluno cometeu seja o melhor caminho de estudo.

  • 8,7% dos que responderam à questão pensam que somente aulas presenciais é o melhor método.

  • A opção de leitura de livros foi a menos referenciada.

A constatação que o uso de livros não é atrativo, é muito interessante, pois a base de todo curso de programação está pautada em livros em conformidade ao recomendado pelo Ministério da Educação.

O gráfico da figura 23 mostra quais itens os entrevistados conhecem dentro do âmbito de informática, essa questão foi proposta para saber se os usuários conhecem ou já tiveram contato com algum dos itens da questão.

Figura 23 - Gráfico da questão 5


Fonte: Google Forms, 2017

A figura 23 indica que 79% das pessoas conhecem banco de dados, 67,7% identificam lógica de programação e 75,8% dos usuários compreendem Linguagem de Programação, ou seja, ao menos 79% dos entrevistados conhecem pelo menos um dos itens relacionadas a informática e mais da metade todos os itens.

O gráfico da figura 24 mostra os resultados da preferência dos entrevistados a sistemas competitivos ou sistemas de auxílio de aprendizagem.

Figura 24 - Gráfico da questão 6


Fonte: Google Forms, 2017

Interessante que 82,6% dos entrevistados preferem sistemas de auxílio a aprendizagem, o que respalda a motivação de se desenvolver um sistema para esse fim.

Na questão de número 7, foi deixado um espaço livre aos entrevistados, para que possam deixar a sua opinião a respeito dos sistemas que utilizam autojudge no ensino.

As respostas mais relevantes são listadas a seguir.

  • Muito importante para o desenvolvimento profissional do aluno de hoje. ”

  • Toda e qualquer forma de ajuda no aprendizado é bastante válida. ”

  • Muito bom para o ensino, indicando ao aluno onde se encontra o erro, para que assim a aprendizagem se torne mais rápida e de maneira dinâmica. “

  • Apesar da ideia inicial competitiva creio no auxilio prático e eficaz na aprendizagem por meio da correção automática, onde se explane claramente os itens incorretos, assim indicando para entendimento e aperfeiçoamento do código. “

  • Não aprecio qualquer forma de avaliação cem por cento sistêmica, acredito na necessidade de uma somatória de pontos de vista, incluindo o de material humano. “

  • Tudo hoje em dia está voltado a tecnologia, e cada vez mais estão ligados a praticidade, qualidade e tempo, assim como esses sistemas. Acredito que esses sistemas podem oferecer esses requisitos, se utilizados de maneira correta, pois o feedback dessa avaliação tem que ser a mais precisa, clara e objetiva possível. “

  • É uma excelente ferramenta, possibilita o aprendizado imediato do aluno, pois já avalia e ajuda a lapidar onde está tendo dificuldades. Na minha opinião é um sistema que deveria estar em rede escolar. “

  • O uso desses sistemas é essencial para a aprendizagem da programação. “

  • Facilita na autocorreção de erros simples como um comando mal escrito, porém em uma sintaxe mais complicada e variada, acredito que seja válida a presença também de um professor. “

  • Facilitaria o aprendizado, principalmente para pessoas leigas no assunto. “

É possível observar que todas as respostas refletem o desejo de uma nova abordagem para o ensino de programação.

Por último, a questão 8 pede para o entrevistado avaliar a importância do sistema de autojudge. O gráfico da figura 25 ilustra o resultado obtido.

Figura 25 - Gráfico da questão 8


Fonte: Google Forms, 2017

Observou-se que 73,8% acreditam no uso de sistemas automáticos para o auxílio a aprendizagem mesmo não existindo sistemas construídos para esse fim. O que reforça ainda mais a criação de um sistema nesses moldes.

6. 5 Seven Online Judge

O Seven Online Judge foi o sistema desenvolvido neste trabalho. Ele é um sistema web voltado para o auxílio de aprendizagem de programação, com principal foco em disponibilizar dicas de resolução dos exercícios e material didático referente ao tema tratado, parte não encontrada nos sistemas atuais.

O sistema possui uma estrutura diferenciada, pois não apresenta os problemas somente por categoria ou dificuldade. O sistema pode ser usado como um sistema de treinamento para maratona como a forma atual dos sistemas semelhantes, mas também 2 diferenciais importantes: Para cada problema disponibiliza-se material de estudo e dicas de resolução sobre o assunto tratado ou um método interativo no qual um roteiro de aprendizado é proposto apresentando um material didático por assunto e problemas relacionados para treinamento. Este último é a parte didática mais importante do sistema e que o mais difere dos demais.

Na resolução dos problemas, é possível acessar material de estudo ou dicas de resolução dependendo do julgamento do código submetido, ou seja, a cada passo no sistema existe uma forma de ajuda para tentar apoiar a resolução dos problemas propostos e, em consequência, auxiliar a aprendizagem de programação.

O sistema possui 3 partes que podem ser acessadas a partir da página principal: Exercícios, estudos e motivações da criação do sistema.

A figura 26 mostra o fluxo de ações disponíveis no sistema.

Figura 26 - Fluxo de ações

É possível observar que o usuário tem liberdade de escolha do que deseja estudar, seja os estudos interativos, ou os exercícios propostos, e que o mesmo necessita de poucos passos para praticar.

No caso específico de resolução de problemas, parte central de verificação do aprendizado, cada um possui uma apresentação e as formas de entrada a serem lidas e resultados que devem ser gerados. O usuário pode liberar as ajudas pré-definidas como o tema a ser estudado para resolvê-lo ou dicas de implementação, material didático cadastrado referente ao problema ou simplesmente não ativar nenhuma ajuda para a resolução dos problemas propostos.

O Seven Online Judge possui três módulos (iniciante, intermediário e avançado) na parte de aprendizado assistido onde o estudante irá solucionar os exercícios utilizando dicas e podendo consultar o material de apoio existente para cada módulo do sistema.

A figura 27 mostra o funcionamento básico do sistema através de um infográfico.

Figura 27 - Infográfico do sistema

Na figura 27, em 1, o usuário pode escolher o método de estudo que deseja fazer, ou seja, pode utilizar o módulo de estudo ou apenas a resolução de problemas. Em 2, após o usuário finalizar seu programa, envia sua solução para o sistema checá-lo. Já em 3, o servidor recebe o código fonte do usuário e envia para um programa especifico que fará os testes necessários com código referente a execução. Em 4, um script3 compara a saída do código do usuário com a saída esperada já cadastrada no sistema. Por fim, em 5, após a comparação, o script retorna a resposta para o usuário através do navegador, informando o status da avaliação da solução proposta pelo usuário. Caso o usuário tenha submetido um código com erro, este último será tratado e dicas serão exibidas para ajudar o usuário a conseguir o status de sucesso.

A parte do sistema que trata o código fonte retorna um status para o usuário. Cada um é apresentado a seguir:

  • 1-> Erro de sintaxe (Syntax error): São erros de digitação (sintaxe de linguagem) ou outro erro que bloqueia a execução do script. Como, por exemplo, falta de um ponto-e-vírgula no final de uma instrução em linguagem C.

  • 2-> Erro de resposta (Wrong answer): Acontece quando a resposta enviada pelo usuário é diferente da resposta padrão do sistema, como, por exemplo, a realização de uma soma entre dois números e o código gera um valor diferente do esperado. Neste caso, caracteriza-se o erro de resposta.

  • 3-> Tempo excedido (Overflow): Ocorre quando o tempo de processamento excede o tempo limite do problema. Geralmente usado para condicionar a resolução de um problema por um algoritmo específico que usa um tempo menor para ser executado do que um método genérico.

  • 4-> Erro de apresentação (Presentation error): Caracteriza-se um erro de apresentação quando a resposta está correta, mas o usuário não formata a saída exatamente como se pede. Por exemplo, colocar um espaço a mais no final de uma linha.

  • 5-> Código aceito (Code accepted): Corresponde que o código submetido contém a forma correta de solução do problema proposto.

O objetivo do Seven Online Judge vai além de apenas fornecer uma resposta positiva ou negativa, mas sim ajudar o aluno durante o processo de aprendizado, caso o estudante receba algum status diferente de 5, dicas são mostradas para que o mesmo possa entender e solucionar o problema tentando novamente.

O sistema foi desenvolvido com a linguagem Python tanto na parte web como nos scripts, para a parte web foi adotado o framework Flask. O Seven permite que a submissão seja feita com a linguagem C e usa o banco de dados MySQL para cadastrar as submissões, entradas e saídas dos problemas e também faz o gerenciamento dos usuários.

O tópico seguinte trata do banco de dados do sistema.

6.1. Banco de dados

O desenho do banco de dados do Seven Online Judge possui 6 tabelas, conforme mostra a figura 28

Figura 28 - Banco de Dados do Seven Online Judge

A figura 28 mostra as tabelas e suas relações. A parte do gerenciamento de usuários cadastra informações pessoais e cria chaves primárias, responsáveis por identificar cada usuário e se relacionar com as tabelas user_plans, user_attempts e exercises. A tabela 3 descreve cada tabela do sistema.

Tabela 3 - Funcionalidade de cada tabela do sistema

Nome da Tabela

Função

users

Responsável por armazenar o cadastro do estudante, com o nome, ultimo nome, senha, username, e-mail, gênero, data de criação e nível do usuário. Relaciona-se com as tabelas judges, users_attempts e users_plans.

users_attempts

Armazena o número de tentativas que o usuário tentou realizar determinado exercício e recebe as chaves estrangeiras id_exercises e id_user. Relaciona-se com as tabelas users e exercises.

users_plans

Relaciona-se com as tabelas users e studies. É responsável por armazenar o status do plano de estudo do usuário. Recebe as chaves estrangeiras id_user e id_study

exercises

Tabela responsável por armazenar os exercícios do sistema, o número do exercício, nome, descrição, nível, data de criação, descrição da entrada, descrição da saída, entrada, saída, quantidade de tentativas, quantidade de julgamentos e quantidade de não julgados. Relaciona-se com as tabelas judges e users_attemps.

judges

Reflete o código e a linguagem de cada exercício. Relaciona-se com as tabelas exercises e users.

studies

Tabela que armazena um id e nome referente aos estudos do aluno. Relaciona-se com a tabela users_plans

A tabela 3 detalha cada tabela do sistema, mostrando os seus relacionamentos e os dados que cada uma armazena.

6.2. Ferramentas utilizadas

Neste tópico são descritas as ferramentas utilizadas no desenvolvimento do sistema.

6.2.1. Flask

É um micro framework web feito na linguagem Python para desenvolvimento de aplicações de pequeno, médio ou grande porte. A palavra “Micro” não limita o framework à aplicações pequenas. O framework contém apenas as funcionalidades básicas, mas pode incorporar diferentes módulos até o tornar o quão complexo que se queira.

6.2.2. HTML

O acrônico HTML significa em inglês: Hyper Text Markup Language (em português: Linguagem de Marcação de Hipertexto). É a linguagem responsável por exibir a informação na tela para o usuário.

6.2.3. Bootstrap

Bootstrap é um conjunto de ferramentas de código aberto para desenvolvimento com HTML, CSS E JavaScript (JS). Ele cria projetos responsivos e móveis de primeira linha na web utilizando biblioteca de componentes front-end.

6.2.4. MySQL

O MySQL é um sistema gerenciador de banco de dados relacional de código aberto (Pedro Pisa, 2012). O serviço utiliza a linguagem SQL (Structure Query Language – Linguagem de Consulta Estruturada).

No desenvolvimento do sistema foi utilizada a ferramenta MySQL Workbench, a qual fornece modelagem de dados, desenvolvimento de SQL e ferramentas de administração abrangentes para configuração de servidor, administração de usuário e backup (MySQL.COM, 2017).

6.2.5. SQL Alchemy

É um ORM (Object-relational Mapping), a qual funciona como um “tradutor” de comandos SQL. Nada mais é que um “facilitador” de comandos SQL, deixando mais simples, direto e rápido a manipulação dos dados usando Python.

6.2.6. CSS

CSS é uma linguagem que descreve o estilo de um documento HTML e como os elementos do HTML devem ser exibidos. Comparando-se ao corpo humano, CSS é a maquiagem, roupa, etc, que utilizamos.

6.2.7. JavaScript

JavaScript (JS) é uma linguagem de programação interpretada. É a ferramenta responsável por trazer “interatividade” nas páginas web, criando animações e eventos na página.

6.2.8. Flask Log

É uma extensão do Flask extremamente útil para entender como o programa tem se comportado com relação às entradas e saídas que são recebidas e geradas em nossa aplicação. É extremamente simples de configurar, gerando um arquivo de log para cada submissão realizada no sistema, sendo salvo em um diretório específico para consulta, caso seja necessário.

6.2.9. Ubuntu

Ubuntu é um sistema operacional de código aberto. Sua proposta é oferecer um sistema que qualquer pessoa possa utiliza-lo sem dificuldades. Neste trabalho foi utilizado como servidor do sistema por ser rápido, seguro, de fácil utilização, estável e totalmente gratuito.

6.3. Funcionamento do sistema

Ao entrar no sistema, o usuário realiza o seu cadastro, informando o seu nome, e-mail, usuário e também informa uma senha para acesso ao sistema. A figura 29 mostra a tela de cadastro do sistema.

Figura 29 - Tela de cadastro do Seven Online Judge

Na figura 29, o estudante realiza o cadastro no sistema, informando os dados pedidos. Em seguida, são mostradas algumas perguntas para que o sistema possa apresentar um plano de estudo e exercícios propostos mediante o nível de conhecimento do usuário

A figura 30 mostra os itens que o usuário deseja estudar.

Figura 30 - Tela de perguntas ao usuário

Na figura 30, o aluno deve responder se conhece quais dos itens deseja estudar, antes de continuar. Isso ajudará o Seven a fazer um plano de estudo mediante as respostas dadas pelo usuário.

Em seguida o sistema apresenta a tela de estudos interativos como é ilustrado na figura 31.


Figura 31 - Estudos Interativos!

Na figura 31, o sistema dá as boas-vindas ao usuário e o introduz aos estudos interativos que ele pode escolher qual método deseja estudar, ou se preferir, pode escolher os dois, como mostra a figura 32


Figura 32 - Escolha do método de estudo

Ao escolher o método interativo, o usuário é direcionado para uma página em que o sistema explica os exemplos de métodos de estudos existentes. A figura 33 ilustra essas descrições.


Figura 33 - Exemplos de estudos

Na figura 33, o sistema descreve quatro métodos de estudos, sendo eles:

  • Através de Leitura: Existem pessoas que, simplesmente lendo um material, conseguem absorver o conteúdo e pôr em prática futuramente sem dificuldades, o conhecimento adquirido;

  • Através da Escrita: Existem pessoas que absorvem melhor o conteúdo estudado quando anotam, escrevem;

  • Através de Exemplos: Existem pessoas que, através de exemplos, conseguem assimilar melhor o conteúdo proposto;

  • Através da Prática: Existem pessoas que, conforme praticam os novos conhecimentos, absorvem o conteúdo proposto.

Em seguida, o aluno tem acesso aos itens que selecionou na figura 30 (Tela de perguntas ao usuário) para poder estudá-los. A figura 34 ilustra os planos de estudos.

Figura 34 - Plano de Estudos!

O plano de estudo enumera os assuntos selecionados e o status referente se cumpriu ou não cada tópico. Em opções, o usuário pode remover ou adicionar itens que deseja estudar.

Ao escolher o estudo que deseja realizar, o sistema direciona o aluno a uma página, na qual explica-se como funciona o estudo interativo, como evidencia a figura 35.

Figura 35 - Como funciona o estudo interativo?

Na figura 35, é apresentado o caso de o usuário selecionar a primeira opção “Variáveis e Constantes”. Em todo tópico é apresentado um breve descritivo sobre o assunto e, em sequência, colocar o conhecimento adquirido em teste com a resolução de exercícios, conforme mostra a figura 36.

Figura 36 - Exercício - Estudo interativo

No primeiro exercício, no exemplo apresentado na figura anterior, é pedido para o usuário declarar cinco variáveis (Nome, ­E-mail, Idade, Celular e CPF). Para resolução deste item, pode-se escolher se deseja ver dicas de resolução ou não, como ilustra a figura 37.

Figura 37 - Dicas para resolução

Na figura 37 há dicas de como o usuário pode resolver o problema pedido, indicando como se declara as variáveis nome e e-mail, as quais são do tipo char e a variável idade, a qual é do tipo inteiro (int).

Após a declaração das variáveis, o Seven analisa se a resposta foi a esperada ou não, como mostram as figuras 38 e 39.

Figura 38 - Estudos interativos aceitos

Na figura 38, todos os itens foram validados, conforme o pedido pelo sistema, ou seja, o código criado é válido.

Figura 39 - Estudos interativos erro

Na figura 39 é simulado um código com erros para mostrar a resposta do sistema. No caso específico, apenas um item dos cinco que foi apresentado de forma correta.

Em ambos os casos, uma mensagem aparece para o usuário lhe informando, se acertou ou errou o que se pede.

A qualquer momento que desejar, o estudante pode ter acesso ao seu dashboard4 como ilustra a figura 40.

Na figura 40, o estudante poderá escolher 3 opções, as quais são:

Figura 40 - Dashboard do estudante

  • Prepare-se para os desafios futuros com os Estudos que preparamos para você!

  • Ponha em prática os conhecimentos adquiridos com nossos Exercícios.

  • Saiba as motivações, bases e objetivos do Seven Online Judge!

No primeiro item, o usuário tem acesso aos estudos interativos e as apostilas, no segundo ele tem acesso aos módulos do sistema, o qual é descrito na seção seguinte. Por fim, no terceiro item, o usuário tem acesso as motivações e objetivos do sistema.

6.4. Módulos

Seven Online Judge é dividido em 3 módulos (iniciante, intermediário e avançado), que abordam assuntos dos mais simples como, por exemplo, a definição de funções que imprime uma mensagem na tela até algoritmos específicos com alta complexidade de implementação. Para a implementação do sistema optou-se por fixar em assuntos relacionados ao aprendizado de uma linguagem, pois seria necessário validar os conteúdos propostos antes de adicionar assuntos mais complexos.

A figura 41 mostra os módulos iniciais existentes no sistema.

Figura 41 - Módulos do sistema

Os três níveis de aprendizado existentes no Seven Online Judge: Iniciante, Intermediário e Avançado.

6.4.1. Módulo iniciante

No primeiro módulo, o estudante terá acesso a uma breve descrição da história do computador, a sua arquitetura e a algoritmos. Tudo isso para que ele possa entender o porquê de estar aprendendo programação e ver como funciona o computador.

Durante este módulo, será apresentado os assuntos:

  • Variáveis;

  • Constantes;

  • Tipos de Dados;

  • Como utilizar a função de escrita;

  • Como utilizar a função de leitura;

  • Tomada de decisão utilizando if/else;

  • Laços de repetição (for/while);

  • Switch case.

Dentro do material de apoio é apresentado a estrutura de um programa feito em C, as suas diretivas e as bibliotecas utilizadas pela linguagem. Define-se o que é uma variável, uma constante, apresenta-se ao usuário os operadores (lógicos, aritméticos, de atribuição, bit a bit e relacionais) que existem na linguagem C. Também são mostrados os tipos de erros (sintaxe, resposta, tempo excedido e erro de apresentação) que podem ocorrer depois da submissão do código. Todo o material é voltado para auxiliar o aluno no aprendizado de programação.

A figura 42 apresenta os exercícios cadastrados no módulo 1.

Figura 42 - Exercícios módulo 1

São listados 10 problemas, que vão desde escrever uma simples frase na tela “Hello, world!!!”, passando pela soma de dois valores, calculadoras até o crivo de Erastóstenes, o qual calcula números primos.

6.4.2. Módulo intermediário

Neste módulo são apresentados os assuntos funções, vetores e matrizes divididos nos seguintes módulos.

  • Como chamar uma função;

  • Função simples;

  • Função que retorna nada;

  • Vetores e operação com vetores;

  • Matriz

A figura 43 mostra os exercícios cadastrados no sistema, neste módulo.

Figura 43 - Exercícios módulo 2

O módulo intermediário é composto por dez exercícios, os quais começam com uma simples chamada de função, passando por funções simples, vetores e matrizes.

6.4.3. Módulo avançado

Módulo com os assuntos mais complexos no estudo da linguagem C. Durante o estudo são apresentados os seguintes tópicos.

  • Função recursiva;

  • Alocação de memória;

  • Operações com matrizes;

  • Ponteiros e operações com ponteiros;

  • Algoritmos de ordenação

A figura 44 mostra os exercícios cadastrados no Seven, neste módulo.

Figura 44 - Exercícios módulo 3

O módulo é composto por dez exercícios envolvendo ponteiros, funções recursivas e operações com matrizes.

6.5. Exercícios e resultados da submissão

Ao escolher o exercício, um breve descritivo do que o problema pede é mostrado ao usuário, conforme apresentado na figura 45 para o primeiro problema do módulo iniciante.

Figura 45 - Descrição do Exercício

A descrição do primeiro problema do Seven conduz o usuário a escrever um programa que imprima na tela a frase “Hello, World!!!”. Após a confecção do código, deve-se clicar no link “Julgar esse exercício”. O sistema direciona para a página de submissão do código (figura 46).

Figura 46 - Tela de submissão

O espaço central, em branco, é o local para inserir o código de resolução do problema proposto e, em sequência é necessário a submissão para avaliação. Na figura 47 mostra-se as respostas possíveis do sistema. Sendo que para cada tipo de erro, há dicas para resolvê-lo.

Figura 47 - Status do sistema

A figura 47 apresenta os cinco possíveis status de resposta do sistema.

Como resultado, o sistema cumpre o seu propósito que é ser um sistema com autojudge voltado para o ensino, diferente dos sistemas existentes no mercado, os quais são voltados para a competição.

7. Conclusão

No decorrer desse trabalho foram estudadas as formas de ensino de programação e identificadas as principais necessidades que os alunos dessas matérias apontam como limitantes do seu aprendizado. Foram estudadas também uma nova linguagem (Python) e ferramentas para a criação de um sistema web e a compreensão mais profunda do funcionamento do sistema Linux para poder compilar, executar e avaliar a resposta dos programas gerados. Essas etapas possibilitaram compreender melhor as etapas de desenvolvimento de um sistema completo.

Neste trabalho foi implementado e apresentado o sistema de submissão Seven Online Judge, o qual tem por objetivo ser um sistema de aprendizado de programação ao invés de apenas um sistema automático de correção. Essa abordagem o difere dos demais sistemas o tornando único.

O Seven Online Judge vem com a proposta de auxiliar o professor e o aluno no ensino de programação e atinge esse objetivo através do protótipo implementado. Embora, mais conteúdos sejam necessários para validar completamente o sistema.

Conclui-se que o sistema pode ter uma boa aceitação, principalmente entre os alunos de graduação e os interessados no aprendizado de programação, sendo indicado como uma ferramenta de apoio à matérias ligadas a aprendizagem de programação.

Como proposta futura, sugere-se a liberação para testes de forma mais ampla publicando o sistema em algum servidor na internet para detectar possíveis correções e sugestões de melhorias. Propõe-se incluir outras linguagens de programação tais como: C++, Python, Java e Ruby. Estas associadas a materiais didáticos específicos. Como última proposta, tem-se a criação de um módulo avançado que possa traçar perfis de usuário com técnicas de inteligência artificial para identificar quais tópicos são os mais complexos ou que possam ser melhores explicados pelo sistema. Seria um módulo administrativo voltado aos elaboradores de conteúdo.

8. Referências bibliográficas

V Congresso Brasileiro de Informática na Educação (CBIE 2016). Francisco, Rodrigo Elias; Junior, Cleon X. Pereira; Ambrósio, Ana Paula. Juiz Online no ensino de Programação Introdutória – Uma Revisão Sistemática de Literatura, 2016. Disponível em:
<https://www.researchgate.net/publication/309778045_Juiz_Online_no_Ensino_de_Programacao_Introdutoria_-_Uma_Revisao_Sistematica_da_Literatura>. Acesso em: 11. Mar 2017

VI Congresso Brasileiro de Engenharia de Produção (Ponta Grossa, PR, 2016). Guedes, Karoline; Marcussi, Leticia Dejavite; Filho, Rafael Germano Dal Molin; Filho, Robertino Mendes Santiago; Junior, Carlos Roberto Beleti. Ferramenta de apoio ao Ensino de Programação: Um estudo de caso, 2016. Disponível em: <http://aprepro.org.br/conbrepro/2016/down.php?id=2629&q=1>. Acesso em: 19. Mar 2017

A COMPUTAÇÃO. Engenho Analitico, 2008. Disponível em: <http://a-computcao.wikidot.com/engenho-analitico>. Acesso em: 01. Ago 2017

Algoritmo e Lógica de Programação (Algoritmos – Parte 1), 2004. Disponível em: <http://www.dca.ufrn.br/~affonso/DCA800/pdf/algoritmos_parte1.pdf>.
Acesso em: 10. Jul 2017

Algoritmos, 2017. Disponível em: <https://pt.khanacademy.org/computing/computer-science/algorithms>. Acesso em: 22. Mai 2017

ALMEIDA, ELIANA S. DE; COSTA, EVANDRO DE B.;SILVA, KLEBSON DOS S.; PAES, RODRIGO DE B.; ALMEDIA, ANDRÉ ATANASIO M.; BRAGA, JULIAN D. HERRERA. AMBAP: Um Ambiente de Apoio ao Aprendizado de Programação. Disponível em: <http://www.lbd.dcc.ufmg.br/colecoes/wei/2002/006.pdf>. Acesso em: 31. Out 2017

ALVES, CARLA. Noção de Algoritmo. Disponível em: <http://www.ipb.pt/~cmca/algor1.pdf>. Acesso em: 01. Nov 2017

AMARIZ, LUIZ CARLOS. Linguagem de Programação de Alto Nível, 2017. Disponível em: <https://www.infoescola.com/engenharia-de-software/linguagem-de-programacao-de-alto-nivel/>. Acesso em: 01. Nov 2017

ANASTACIO, BRUNO. Linguagem C – Bibliotecas, Funções main, printf, scanf e mais – Drops I, 2011. Disponível em: <https://blogdecodigo.wordpress.com/2011/07/12/linguagem-c-bibliotecas-funcoes-main-printf-scanf-e-mais-drops-i/>. Acesso em: 06. Out 2017

Aprendendo a Programar em Linguagem C do básico ao avançado – Alfredo Boente. Editora Brasport, 2003.

As Teorias de Aprendizagem e a Evolução dos Programas de Ensino Mediado por Computador. Disponível em:
<http://titosena.faed.udesc.br/Arquivos/Artigos_aprendizagem/Aprendizagem%20e%20Computador.pdf>. Acesso em: 11. Abr 2017

ATOM BI. O que é Dashboard?, 2015. Disponível em: <http://www.atomsail.com/pt/o-que-e-dashboard-saas-atomsail.php>. Acesso em: 02. Nov 2017

BARNAUSKAS, CALANI, MARIA CECILIA; Rocha, Heloísa Vieira da; Martins, Maria Cecília; d´Abreu. Uma Taxonia para Ambientes de Aprendizado Baseados no Computador, 1999. Disponível em: <http://www.pucrs.br/famat/viali/tic_literatura/capitulos/cap3-taxion.pdf>.
Acesso em: 22. Mar 2017

BARRETTO, ELBA SIQUEIRA DE SÁ; PINTO, REGINA PAHIM; MARTINS, ANGELA MARIA; DURAN, MARILIA CLARET GERAES. Avaliação na Educação Básica nos Anos 90 Segundo os Periódicos Acadêmicos, 2001. Disponível em: < http://www.scielo.br/pdf/cp/n114/a03n114.pdf>.
Acesso em: 21. Abr 2017

BERTOL, OMERO FRANCISCO. SPOJ BRASIL: Treinando para Competições de Programação, 2013. Disponível em: <https://profomero.wordpress.com/2013/12/07/spoj-brasil-treinando-para-competicoes-de-programacao/>. Acesso em: 12. Mar 2017

BEZ, JEAN LUCA; TONIN, Neilor A. URI ONLINE JUDGE E A INTERNACIONALIZAÇÃO DA UNIVERSIDADE, 2014. Disponível em: <http://www.reitoria.uri.br/~vivencias/Numero_018/artigos/pdf/Artigo_21.pdf>. Acesso em: 30. Out 2017

BOCA Online Contest Administrator – Sistema de submissão, 2010. Disponível em: <https://www.ime.usp.br/~cassio/boca/boca/doc/html/manualteam.pt_br.html>. Acesso em: 23. Out 2017

BORGES, ROSEMARY PESSOA; MARQUES, CARLA KATARINA DE MONTEIRO MARQUES; DE LIMA, ROMMEL WLADIMIR. Ferramentas online que apoiam o ensino e a aprendizagem de linguagens de programação na educação a distância, 2016. Disponível em: <http://www.editorarealize.com.br/revistas/conedu/trabalhos/TRABALHO_EV056_MD1_SA19_ID11229_17082016183046.pdf>. Acesso em: 23. Out 2017

Bootstrap, 2017. Disponível em: <http://tableless.github.io/iniciantes/manual/html/>. Acesso em: 03. Out 2017

BYRRO, LUIZ. Linguagens de Programação. Disponível em:,<http://homepages.dcc.ufmg.br/~luizbyrro/lp.html>. Acesso em: 11. Jul 2017

CASSIO, P. DE CAMPOS; CARLOS, E. FERREIRA. BOCA: um sistema de apoio a competições de programação, 2010. Disponível em: <https://www.ime.usp.br/~cassio/boca/campos-ferreira-wei2004.pdf>. Acesso em 24. Out 2017

CARVALHO, GUILHERME. Para que servem as bibliotecas <stdio.h> e <stdlib.h>, 2012. Disponível em: <http://programando-ads.blogspot.com/2012/02/para-que-servem-as-bibliotecas-e.html>. Acesso em: 16. Ago 2017

CECHINEL, CRISTIAN. Linguagens de Programação, 2009. Disponível em: <http://www.cristiancechinel.pro.br/my_files/algorithms/bookhtml/node20.html>.
Acesso em: 11. Jul 2017

CECHINEL, CRISTIAN. Partes de Um Algoritmo, 2009. Disponível em: <http://www.cristiancechinel.pro.br/my_files/algorithms/bookhtml/node13.html>.

Acesso em: 14. Jul 2017

CEDRIC, LUIZ DE CARVALHO. Sistemas Especialistas, 2006. Disponível em: <http://www.inf.ufg.br/~cedric/ia/grad/AI-Aula11-Sistemas%20Especialistas.pdf>.

Acesso em: 29. Out 2017

CHAVES, JOSÉ OSVALDO; CASTRO, ANGÉLICA; LIMA, ROMMEL; LIMA, MARCOS VINICIUS; FERREIRA, KARL HANSIMULLER ALELAF. Uma Ferramenta Baseada em Juízes Online para Apoio às Atividades de Programação de Computação no Moodle, 2013. Disponível em
<http://seer.ufrgs.br/index.php/renote/article/viewFile/44366/28028>.
Acesso em: 11. Mar 2017

CITISYSTEMS. Fluxograma de Processo – O que é, como elaborar e benefícios, 2017. Disponível em: <https://www.citisystems.com.br/fluxograma/>. Acesso em: 06. Jul 2017

COMPUTATIONAL JOURNALISM. Creating Multiple Routes and Dynamic Content in Flask, 2016. Disponível em: <http://www.compjour.org/lessons/flask-single-page/multiple-dynamic-routes-in-flask/>. Acesso em: 26. Out 2017

COSTA, EVANDRO; FECHINE, JOSEANA; SILVA, PRISCYLLA; ROCHA, HEMILIS. Modelos de Feedback para estudantes em Ambientes Virtuais de Aprendizagem, 2016. Disponível em: <http://www.br-ie.org/pub/index.php/pie/article/download/6594/4505>. Acesso em: 22. Mar 2017

COSTA, MACÁRIO. Sistemas Tutores Inteligentes. Disponível em: <http://www.nce.ufrj.br/ginape/publicacoes/trabalhos/t_2002/t_2002_raimundo_ose_macario_costa/Sti.htm>. Acesso em 22. Out 2017

COYIER, CHRIS. CSS-Tricks, 2014. Disponível em: <https://css-tricks.com/snippets/css/a-guide-to-flexbox/>. Acesso em: 25. Out 2017

DA SILVA, ANDRÉ TAVARES. Algoritmos. Disponível em: <http://www.joinville.udesc.br/portal/professores/andretavares/materiais/AGT0001_Aula03_algoritmo.pdf>. Acesso em: 14. Jul 2017

DE OLIVEIRA, RODRIGO. SócrateS – Sistema de Ensino-Aprendizado Inteligente para Internet com Adoção Dinâmica de Estratégias de Ensino Híbridas usando MBTI, 2004.  Disponível em: <http://www.ic.unicamp.br/~oliveira/doc/MasterDissertation_RodrigoDeOliveira.pdf>.
Acesso em: 21. Abr 2017

DE SOUZA, RODRIGO ROCHA RIBEIRO. O Alcance das TICs na Prática Pedagógica. Disponível em: <http://www.pucpr.br/eventos/educere/educere2006/anaisEvento/docs/CI-116-TC.pdf>. Acesso em 02. Abr 2017

DIAS, CLAUDINEI. Programação para Engenharia II. Disponível em: <http://www.joinville.udesc.br/portal/professores/claudinei/materiais/PRE_slide_02_Introducao_a_Programacao.pdf>. Acesso em: 14. Jul 2017

FERRARI, FABRICIO; CECHINEL, CRISTIAN. Introdução a Algoritmos e Programação. Disponível em: <http://www.ferrari.pro.br/home/documents/FFerrari-CCechinel-Introducao-a-algoritmos.pdf>. Acesso em: 06. Jul 2017

FERRAZ, TARCISIO RUAS. Linguagens de programação, para que servem? Disponível em: <http://www.digitaldev.com.br/linguagens-de-programacao/>. Acesso em: 11. Jul 2017

FILITTO, DANILO. Introdução À Lógica De Programação Orientada A Objetos Utilizando A Ferramenta Alice, 2015. Disponível em: <https://www.dfilitto.com.br/c/introducao-a-logica-de-programacao-orientada-a-objetos-utilizando-a-ferramenta-alice-parte-1/>. Acesso em: 01. Nov 2017

Flask-Login. Disponível em: <https://flask-login.readthedocs.io/en/latest/>. Acesso em: 25. Out 2017

Flask web development, one drop at a time. Disponível em: <http://flask.pocoo.org/>. Acesso em: 25. Out 2017

Formas de Representação de um Algoritmo. Disponível em: <http://www.celiomoliterno.eng.br/Arquivos/Santa/PDFteoria/Algoritmo.pdf>.
Acesso em: 10. Jul 2017

FUNDAÇÃO BRADESCO. Microinformática. Disponível em: <http://www.fundacaobradesco.org.br/vv-apostilas/mic_pag3.htm>.
Acesso em: 01. Ago 2017

GARLET, DANIELA; BIGOLIN, NARA MARTINI; SILVEIRA, SIDNEI RENATO. Uma Proposta para o Ensino de Programação de Computadores na Educação Básica. Disponível em: <http://w3.ufsm.br/frederico/images/DanielaGarlet.pdf>. Acesso em: 13. Jul 2017

GATTO, ELAINE CECILIA. Pseudocódigo. Disponível em: < https://www.embarcados.com.br/pseudocodigo/>. Acesso em: 18. Mai 2017

Gerando números aleatórios em C: rand, srand e seed. Disponível em: <http://www.cprogressivo.net/2013/03/Como-gerar-numeros-aleatorios-em-C-com-a-rand-srand-e-seed.html>. Acesso em: 12. Out 2017

GITHUB. O que é HTML? Disponível em: <http://tableless.github.io/iniciantes/manual/html/>. Acesso em: 03. Out 2017

GRINBERG, MIGUEL. The Flask Mega-Tutorial, Part I: Hello World!, 2012. Disponível em: <https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world>. Acesso em: 25. Out 2017

GUGIK, GABRIEL. A história dos computadores e da computação, 2009. Disponível em: <https://www.tecmundo.com.br/tecnologia-da-informacao/1697-a-historia-dos-computadores-e-da-computacao.htm>. Acesso em: 01. Ago 2017

HENRIQUE, PAULO. Método Bolha (Bubble Sort), 2011. Disponível em: <https://codigofonte.uol.com.br/codigos/metodo-bolha-bubble-sort>. Acesso em: 28. Out 2017

Iterating over multiple lists in python – flask – jinja2 templates. Disponível em: <https://stackoverflow.com/questions/21306134/iterating-over-multiple-lists-in-python-flask-jinja2-templates>. Acesso em: 26. Out 2017

Jeff Knupp. Using Flask-Login for User Management With Flask, 2014. Disponível em: <https://realpython.com/blog/python/using-flask-login-for-user-management-with-flask/>. Acesso em: 24. Out 2017

J.O.M. CHAVES, A.F. CASTRO, R.W. LIMA, M.V.A. LIMA e K.H.A FERREIRA. MOJO: Uma ferramenta para integrar juízes online ao moodle no apoio ao ensino e aprendizagem de programação. Disponível em: <http://www.redalyc.org/html/4815/481547174022/>. Acesso em: 23. Out 2017

JUNIOR, CICERO JULIÃO DA SILVA. Tomada de decisão, 2008. Disponível em: <https://www.vivaolinux.com.br/artigo/Programacao-Tomada-de-decisao>.
Acesso em: 14. Set 2017

JÚNIOR, JOSÉ CARLOS ROCHA PEREIRA; RAPKIEWICZ, CLEVI ELENA; DELGADO, CARLA; XEXEO, JOSÉ ANTONIO MOREIRA. Ensino de Algoritmos e Programação: Uma experiência no Nível Médio. Disponível em: <http://www.lbd.dcc.ufmg.br/colecoes/wei/2005/008.pdf>. Acesso em: 01. Mai 2017

LAERTH, SANDRO DOS SANTOS FILHO; GONDIM, FELIPE EDUARDO FERREIRA MARTA; PIRES, ROBERTO GONDIM. As tecnologias da informação e comunicação como ferramentas do processo ensino-aprendizagem na disciplina Educação Física escolar, 2013. Disponível em: <http://www.efdeportes.com/efd179/as-tecnologias-da-informacao-e-comunicacao.htm>. Acesso em: 29. Out 2017

Login authentication with Flask, 2017. Disponível em: <https://pythonspot.com/en/login-authentication-with-flask/>. Acesso em: 25. Out 2017

MAINART, DOMINGOS DE A.; SANTOS, CIRO M. A Importância da Tecnologia no Processo Ensino-Aprendizagem. Disponível em:
<http://www.convibra.com.br/upload/paper/adm/adm_1201.pdf>. Acesso em: 21. Abr 2017

MARATHONCODE. Crivo de Erastóstenes, 2014. Disponível em: <http://marathoncode.blogspot.com.br/2012/03/numeros-primos-iii.html>.
Acesso em 01. Set 2017

MARTINS, DANIELA. Introdução à programação. Disponível em: <https://prezi.com/dsgmhsrulxof/introducao-a-programacao/>. Acesso em: 10. Jul 2017

MARTINS, RICARDO. Linguagem Máquina. Disponível em: <http://knoow.net/ciencinformtelec/informatica/linguagem-maquina/>.
Acesso em: 11. Jul 2017

MATTHIESEN, RENATO CIVIDINI. Análise do Uso de Redes Sociais para Comunicação e Auxílio no Processo Ensino-Aprendizagem de Alunos de Curso Superior.  Disponível em: <http://www.pgsskroton.com.br/seer/index.php/educ/article/viewFile/1839/1747>. Acesso em: 14. Abr 2017

MEDINA, MARCO; FERTIG, CRISTINA. Algoritmos e Programação Teoria e Prática. Disponível em: <https://s3.novatec.com.br/capitulos/capitulo-857522073X.pdf>. Acesso em: 01. Nov 2017

MINISTÉRIO DA EDUCAÇÃO. Altos índices de desistência na graduação revelam fragilidade do ensino médio, avalia ministro. Disponível em:
<http://portal.mec.gov.br/component/tags/tag/32044-censo-da-educacao-superior>. Acesso em: 02. Abr 2017

MONNERAT, LÚCIA PATRICIA. Uma Abordagem para a Melhoria do Processo de Ensino-Aprendizagem em Desenho Técnico Utilizando Métodos e Técnicas da Computação. Disponível em: <http://www.dpi.ufv.br/arquivos/ppgcc/dissertacoes/2012-ms-L%C3%BAcia_Patr%C3%ADcio_Monnerat.pdf>. Acesso em: 16. Abr 2017

MOTA, MARCELLE PEREIRA; PEREIRA, LIS W. KANASHIRO; FAVERO, ELOI LUIZ. JAVATOOL: Uma Ferramenta para Ensino de Programação. Disponível em: <http://www.lbd.dcc.ufmg.br/colecoes/wei/2008/0014.pdf>. Acesso em: 01. Mai 2017

MySQL Workbench 6.3, 2017. Disponível em: <https://www.mysql.com/products/workbench/>. Acesso em: 03. Out 2017

O porquê do e-learning. Disponível em: <http://www.prof2000.pt/users/acr/materiais/ead/elearn2.htm>. Acesso em: 23. Out 2017

O que é programação? Disponível em: <http://www.idocode.com.br/blog/2016/09/12/o-que-e-programacao/>. Acesso em 13. Jul 2017

O Uso do Moodle no Apoio de Ensino de Programação Para Alunos Iniciantes, 2007. Disponível em: <http://www.abed.org.br/congresso2007/tc/416200741348PM.pdf>. Acesso em: 30. Out 2017

PEREIRA, ANA PAULA. O que é algoritmo?, 2009. Disponível em: <https://www.tecmundo.com.br/programacao/2082-o-que-e-algoritmo-.htm>. Acesso em: 06. Jul 2017

PEREIRA, ANDRÉ LUIZ. O que é script?, 2012. Disponível em: <https://www.tecmundo.com.br/programacao/1185-o-que-e-script-.htm>. Acesso em: 01. Nov 2017

PEREIRA, BERNADETE TEREZINHA. O Uso das Tecnologias da Informação e Comunicação na Prática Pedagógica da Escola. Disponível em: <http://www.diaadiaeducacao.pr.gov.br/portals/pde/arquivos/1381-8.pdf>. Acesso em: 07. Abr 2017

PAES, RODRIGO. Projeto Ambap. Disponível em: <https://sites.google.com/site/ldsicufal/softwares/projeto-ambap>. Acesso em: 31. Out 2017

PIERI, GIOVANI. Projeto e implementação de uma linguagem de programação, 2007. Disponível em: <https://projetos.inf.ufsc.br/arquivos_projetos/projeto_660/tcc.pdf>. Acesso em: 01. Nov 2017

PISA, PEDRO. O que é e como usar o MySQL? , 2012. Disponível em: <http://www.techtudo.com.br/artigos/noticia/2012/04/o-que-e-e-como-usar-o-mysql.html>. Acesso em: 03. Out 2017

PONTIFICIA UNIVERSIDADE CATÓLICA. Algoritmos e Pseudocódigo. Disponível em: <http://www.inf.puc-rio.br/~inf1005/material/slides/backup/2010_2/tema02_algoritmos.pdf>. Acesso em: 06. Jul 2017

PORTAL TERRA. Overflow, 2014. Disponível em: <http://tecnologia.terra.com.br/noticias/0,,OI500595-EI15607,00-Overflow.html>. Acesso em 10. Set 2017

RAFAEL, AISLAN. Algoritmo e Programação, 2007. Disponível em: <https://pt.slideshare.net/aislan/aula-04-logica-de-programacao>. Acesso em: 23. Set 2017

ROCHA, PAULO SANTANA; FERREIRA, BENEDITO; MONTEIRO, DIONNE; NUNES, DANIELLE DA SILVA COSTA; GÓES, HUGO CEZAR DO NASCIMENTO. Ensino e Aprendizagem de Programação: Análise da Aplicação de Proposta Metodológica Baseada no Sistema Personalizado de Ensino. Disponível em: <http://www.seer.ufrgs.br/renote/article/viewFile/18061/10649>. Acesso em: 21. Abr 2017

RODRIGUES, JOSÉ. Introdução a Programação, 2013. Disponível em: <http://www.academia.edu/31094557/Introdu%C3%A7%C3%A3o_%C3%A0_Programa%C3%A7%C3%A3o_IP>. Acesso em: 16. Ago 2017

ROGERIO. A Linguagem de Programação do VisuAlg. Disponível em: <http://eletrica.ufpr.br/~rogerio/visualg/Help/linguagem.htm>. Acesso em: 28. Out 2017

RONACHER, ARMIN. Flask-SQLAlchemy, 2014. Disponível em: <http://flask-sqlalchemy.pocoo.org/2.1/>. Acesso em: 27. Out 2017

RONACHER, ARMIN. Select. Insert, Delete, 2014. Disponível em: <http://flask-sqlalchemy.pocoo.org/2.1/queries/>. Acesso em: 27. Out 2017

ROSANI, IZABEL LUVISON. Informática na Educação: uma análise do PROINFO. Disponível em: <http://www.histedbr.fe.unicamp.br/revista/revis/revis16/art8_16.pdf>. Acesso em: 10. Abr 2017

RYERSON. Ábaco: Breve introdução, 2004. Disponível em: <http://www.ee.ryerson.ca/~elf/abacus/portugues/intro.html>. Acesso em: 01. Ago 2017

SANTOS, ALISSON. Estrutura de Repetição: C++. Disponível em: <http://www.devmedia.com.br/estrutura-de-repeticao-c/24121>. Acesso em: 23. Set 2017

SANTOS, MARCELA. Pensamento computacional: o novo ler e escrever!, 2015. Disponível em: <https://ajornadadetchellita.wordpress.com/2015/12/01/1-pensamento-computacional-uma-introducao/>. Acesso em 22. Out 2017

SCHIMIGUEL, JULIANO. Fluxogramas, diagrama de blocos e de Chapin no desenvolvimento de algoritmos, 2013. Disponível em: <http://www.devmedia.com.br/fluxogramas-diagrama-de-blocos-e-de-chapin-no-desenvolvimento-de-algoritmos/28550>.
Acesso em: 23. Set 2017

SCRATCH.MIT. Disponível em: <https://scratch.mit.edu/>. Acesso em: 01. Nov 2017

SEBASTIÃO, GUSTAVO. Estrutura de um programa em linguagem C. Disponível em: <http://web.ist.utl.pt/ist153068/ficheiros/teoricas/Programacao_I_Cap_2_Estrutura_basica_de_um_programa_em_linguagem_C.pdf>. Acesso em: 16. Ago 2017

SILVA, MARIA HELYNNE LIMA. Soft Skills do Programador de Software: Abordagem Conceitual e Definição de Métricas para Identificação Automática no Contexto de um Sistema de Juiz Online, 2015. Disponível em: <http://www.repositorio.ufal.br/bitstream/riufal/1726/1/Soft%20skills%20do%20programador%20de%20software%3A%20abordagem%20conceitual%20e%20defini%C3%A7%C3%A3o%20de%20m%C3%A9tricas%20para%20identifica%C3%A7%C3%A3o%20autom%C3%A1tica%20no%20contexto%20de%20um%20sistema%20de%20juiz%20online.pdf>. Acesso em: 30. Out 2017

SILVA, TATHIANA E. Algoritmo e Programação. Disponível em: <https://view.officeapps.live.com/op/view.aspx?src=http://www.inf.aedb.br/faculdades/eng/Downloads/Algoritmo%20e%20Programa%C3%A7%C3%A3o_Conceitos.ppt>. Acesso em: 10. Jul 2017

SÓ MATEMÁTICA. Vetores. Disponível em: <http://www.somatematica.com.br/emedio/vetores/vetores6.php>. Acesso em: 06. Out 2017

SOSTER. RODRIGO ANDRÉ. Redução de oscilações de frequência com o uso de carga “dump” em micro centrais elétricas isoladas, 2012. Disponível em: <http://repositorio.roca.utfpr.edu.br/jspui/bitstream/1/4091/1/PB_COELT_2012_1_04.pdf>. Acesso em: 16. Ago 2017

Sphere Online Judge, 2017. Disponível em: <http://br.spoj.com/embed/info>. Acesso em: 30. Out 2017

SPOJ BRASIL, 2017. Disponível em: <http://www.spoj.com/info/>. Acesso em: 26. Mar 2017

STANDARDLIBS. Bibliotecas entandardizadas. Disponível em: <http://www.di.ubi.pt/~operativos/praticos/pdf/6-standardlibs.pdf>. Acesso em: 16. Ago 2017

Tecnologia de Linguagem Natural. Disponível em: <https://www.inbenta.com/pt/tecnologia/tecnologia-de-linguagem-natural/>. Acesso em: 10. Jul 2017

TIPOGRAFOS. Charles Babbage, 2012. Disponível em: <http://www.tipografos.net/internet/babbage.html>. Acesso em: 01. Ago 2017

TREINAMENTO EM LINGUAGEM C 2ª Edição – Victorine Viviane Mizrahi. São Paulo. Editora Pearson. 2008.

TUTORIALS POINT. C Library - <stdio.h>. Disponível em: <https://www.tutorialspoint.com/c_standard_library/stdio_h.htm>. Acesso em: 16. Ago 2017

TUTORIALS POINT. Computador – Terceira geração, 2016. Disponível em: https://www.tutorialspoint.com/pg/computer_fundamentals/computer_third_generation.htm> Acesso em: 01. Ago 2017

UNICAMP. Compiladores, 2003. Disponível em: <http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node37.html>. Acesso em: 15. Ago 2017

UFPA. História da informática e da internet. Disponível em: <http://www.ufpa.br/dicas/net1/int-h180.htm>. Acesso em: 01. Ago 2017

Unidade A – Conceito e Desenvolvimento de algoritmos. Disponível em: <http://uab.ifsul.edu.br/tsiad/conteudo/modulo1/lop/lop_ua/lop_02.html>. Acesso em: 10. Jul 2017

UNIVASF. Linguagem C: diretivas, compilação separada. Disponível em: <http://www.univasf.edu.br/~criston.souza/algoritmos/arquivos/aula16.pdf>.
Acesso em: 16. Ago 2017

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE. Algoritmo e Lógica de Programação. Disponível em: <http://www.dca.ufrn.br/~affonso/DCA800/pdf/algoritmos_parte1.pdf>. Acesso em: 18. Jul 2017

Uri Online Judge, 2017. Disponível em: <https://www.urionlinejudge.com.br/judge/en/login>. Acesso em: 30. Mar 2017

VALADARES, CARLOS MURILO DA SILVA. Ambiente de educação a distância sobre a linguagem de programação Java. Disponível em: <http://www.tise.cl/volumen2/TISE2006/01.pdf>. Acesso em: 31. Out 2017

VENKI. 23 Significados de símbolos do fluxograma de processos. Disponível em: <http://www.venki.com.br/blog/significados-simbolos-fluxograma-de-processos/>. Acesso em: 06. Jul 2017

VIANA, LUCAS. Variáveis globais e locais – Linguagem C/C++, 2011. Disponível em: <http://blog.masterdaweb.com/programacao-1/linguagem-c/variaveis-globais-e-locais-linguagem-cc/>. Acesso em 23. Ago 2017

W3SCHOOLS - CSS Tutorial. Disponível em: <http://tableless.github.io/iniciantes/manual/html/>. Acesso em: 03. Out 2017

WIKI ACCEPTED. Juízes Online, 2013. Disponível em: <http://wiki.maratona.dcc.ufmg.br/index.php/Ju%C3%ADzes_Online>. Acesso em: 23. Out 2017

WIKI PARA PROGRAMAÇÃO EM C. Comentários, 2009. Disponível em: <http://www.br-c.org/doku.php?id=comentarios>. Acesso em: 17. Ago 2017

WIKIPEDIA. Crivo de Erastóstenes, 2017. Disponível em: <https://pt.wikipedia.org/wiki/Crivo_de_Erat%C3%B3stenes>. Acesso em: 01. Set 2017

WIKIPEDIA. Insertion Sort, 2017. Disponível em: <https://pt.wikipedia.org/wiki/Insertion_sort>. Acesso em: 28. Out 2017

WIKIPEDIA. Sieve of Eratosthenes, 2017. Disponível em: <https://en.wikipedia.org/wiki/Eratosthenes>. Acesso em: 28. Ago 2017

WING, JEANNETTE M. Pensamento computacional. Disponível em: <https://www.cs.cmu.edu/afs/cs/usr/wing/www/ct-portuguese.pdf>. Acesso em 22. Out 2017

ZAPALOWSKI, VINICIUS. Análise quantitativa e comparativa de linguagens de programação, 2011. Disponível em: <https://www.tecmundo.com.br/programacao/1185-o-que-e-script-.htm>. Acesso em: 01. Nov 2017

ZUCHI, IVANETE. O Desenvolvimento de um Protótipo de Sistema Especialista Baseado em Técnicas de RPG para o Ensino de Matemática. Disponível em: <https://repositorio.ufsc.br/bitstream/handle/123456789/78717/170113.pdf?seque>. Acesso em: 20. Abr 2017

_______________________

1 E-learning é uma modalidade de ensino a distância que possibilita a autoaprendizagem, com a mediação de recursos didáticos sistematicamente organizados, apresentados em diferentes suportes tecnológicos de informação, utilizados isoladamente ou combinados, e veiculado através da internet (Rodrigues, 1999).

2 https://www.urionlinejudge.com.br/academic

3 Scripts são “roteiros” seguidos por sistemas computacionais e trazem informações que são processadas e transformadas em ações efetuadas por um programa principal (Pereira, 2012).

4 Dashboard ou Painel de Controle é a apresentação visual das informações mais importantes e necessárias para alcançar um ou mais objetivos de negócio, consolidadas e ajustadas em uma tela para fácil acompanhamento do seu negócio (Atom BI, 2015).

9.  Apêndice A

9.1. Exercícios Módulo 1 – Hello World

Vamos começar, seu primeiro programa será dizer “Hello World!!”. Faça um programa que imprima a frase “Hello World!!” sem aspas, seguido de um end of line (terminador de linha).

Saída

Hello World!!

9.2. Exercício 2 – Somar dois números

Hora de somar dois números. Implemente um programa que leia 2 números e imprima apenas o resultado da soma entre eles. Dica: Utilize 3 variáveis para o seu programa.

Entrada

Saída

2 5

O resultado da soma e: 7

7 7

O resultado da soma e: 14

9.3. Exercício 3 – Converter dois números

Crie um programa capaz de converter a temperatura de Celsius para Fahrenheit.

A fórmula de conversão é TF = TC * 9 / 5 + 32, onde:

TF = Temperatura em Fahrenheit

TC = Temperatura em Celsius

Lembre-se de utilizar 2 variáveis do tipo float. Imprima a temperatura em Fahrenheit

Entrada

Saída

50

122.00

77

170.60

9.4. Exercício 4 – Quadrado de um número

Certa vez, deparei-me com um estranho método de encontrar o quadrado de um número. O algoritmo é o seguinte:

O quadrado de um número positivo n é igual a soma dos n primeiros números ímpares.

Por exemplo:

32 = 1 + 3 + 5

52 = 1 + 3 + 5 + 7 + 9

72 = 1 + 3 + 5 + 7 + 9 + 11 + 13

Esse algoritmo pode ser traduzido na seguinte fórmula matemática, facilmente demonstrada por indução finita.

Implemente o programa que faça o quadrado de um número utilizando o algoritmo mostrado acima. Utilize 3 variáveis (tipo inteiro) para resolução deste problema. Você também irá utilizar um laço for e uma tomada de decisão if. Lembre-se, caso o usuário insira um número negativo, faça esse número se torna positivo, uma vez que qualquer número elevado ao quadrado, o produto da potência é positivo.

Entrada

Saída

3

9

7

49

9.5. Exercício 5 – Boletim Escolar

Crie um boletim escolar, que receba as 4 notas do aluno, calcule a média do aluno. Imprima a média do aluno e a situação do aluno. Para a situação do aluno, imprima reprovado se a média do aluno for menor do que 4, se a média do aluno for maior ou igual a 4 e menor do que 6, imprima em recuperação, se a nota for maior do que 6, imprima aprovado. Não se esqueça de utilizar end of line dentro do print.

Entrada

Saída

7 7 7 7

A média do aluno e: 7.0
Aprovado

5 5 5 5

A média do aluno e: 5.0
Em recuperação

3 3 3 3

A média do aluno e: 3.0
Reprovado

9.6. Exercício 6 – Cara ou Coroa

Faça um programa que simule o jogo cara ou coroa. Para isso utilize 5 variáveis (todas do tipo inteiro). Leia a resposta do usuário e quantas vezes ele pretende jogar. Imprima quantas vezes o usuário ganhou e quantas perdeu.

Entrada

Saída

2 0 1

No. de jogos que você ganhou: 1
No. de jogos que você perdeu: 1

7 0 0 0 1 1 1 1

No. de jogos que você ganhou: 2
No. de jogos que você perdeu: 5

9.7. Exercício 7 – Calculadora (4 operações)

Calculadora de 4 operações. Crie um programa que seja uma calculadora simples, capaz de realizar as 4 operações básicas da matemática (soma, subtração, multiplicação e divisão) entre 2 números. Utilize 7 variáveis para resolução do problema e também tomada de decisão para cada operação. Não se esqueça de pedir para que o usuário entre com os valores e a operação que ele deseja realizar. Imprima o resultado da operação.

Entrada

Saída

2 5 +

O resultado da soma e: 7

14 7 -

O resultado da subtração e: 7

7 7 *

O resultado da multiplicação e: 49

14 7 /

O resultado da divisão e: 2

9.8. Exercício 8 – Calculadora (Utilizando Switch case)

No exercício 7, fizemos uma calculadora simples utilizando tomada de decisão, neste exercício você irá fazer outra calculadora, porem desta vez terá que usar switch case para resolução do problema, utilize 4 variáveis para solução do problema. Imprima o resultado da operação na tela. O usuário tem que informar qual operação deseja realizar e colocar os números.

Entrada

Saída

2 5 +

7

14 7 -

7

7 7 *

49

14 7 /

2

9.9. Exercício 9 – Tabuada

Escreva um programa que faça a tabuada do 2 ao 9. A tabuada tem que ser impressa conforme o exemplo abaixo:

Dica: Utilize-se 3 variáveis e 2 loops for para implementar a sua tabuada. Um loop servirá para imprimir a frase “Tabuada do número” e outro fará o cálculo da tabuada.

Saída

Tabuada do 2 Tabuada do 3 Tabuada do 4 Tabuada do 5

2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 5 x 1 = 5

2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10

2 x 3 = 6 3 x 3 = 9 4 x 3 = 12 5 x 3 = 15

2 x 4 = 8 3 x 4 = 12 4 x 4 = 16 5 x 4 = 20

2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25

2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30

2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35

2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40

2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45

Tabuada do 6 Tabuada do 7 Tabuada do 8 Tabuada do 9

6 x 1 = 6 7 x 1 = 7 8 x 1 = 8 9 x 1 = 9

6 x 2 = 12 7 x 2 = 14 8 x 2 = 16 9 x 2 = 18

6 x 3 = 18 7 x 3 = 21 8 x 3 = 24 9 x 3 = 27

6 x 4 = 24 7 x 4 = 28 8 x 4 = 32 9 x 4 = 36

6 x 5 = 30 7 x 5 = 35 8 x 5 = 40 9 x 5 = 45

6 x 6 = 36 7 x 6 = 42 8 x 6 = 48 9 x 6 = 54

6 x 7 = 42 7 x 7 = 49 8 x 7 = 56 9 x 7 = 63

6 x 8 = 48 7 x 8 = 56 8 x 8 = 64 9 x 8 = 72

6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81

9.10. Exercício 10 – Números primos

O crivo de Erastóstenes é um algoritmo e um método simples e prático para encontrar números primos até um certo valor limite.

Para exemplificá-lo, vamos determinar a lista de números entre 1 e 30.

  • Inicialmente, determina-se o maior número a ser checado. Ele corresponde à raiz quadrada do valor limite, arredondado para baixo. No caso, a raiz de 30, arredondada para baixo, é 5.

  • Crie uma lista de todos os números inteiros de 2 até o valor limite: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, e 30.

  • Encontre o primeiro número da lista. Ele é um número primo, 2.

  • Remova da lista todos os múltiplos do número primo encontrado. No nosso exemplo, a lista fica: 2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27 e 29.

  • O próximo número da lista é primo. Repita o procedimento. No caso, o próximo número da lista é 3. Removendo seus múltiplos, a lista fica: 2, 3, 5, 7, 11, 13, 17, 19, 23, 25 e 29. O próximo número, 5, também é primo; a lista fica: 2, 3, 5, 7, 11, 13, 17, 19, 23 e 29. 5 é o último número a ser verificado, conforme determinado inicialmente. Assim, a lista encontrada contém somente números primos.

Saída

1 2

2 3

3 5

4 7

5 11

6 13

7 17

8 19

9 23

10 29

11 31

12 37

13 41

14 43

15 47

16 53

17 59

18 61

19 67

20 71

21 73

22 79

23 83

24 89

25 97

26

Apêndice B – Exercícios Módulo 2

Exercício 1 – Chamando uma função

Escreva um programa que faça o quadrado de um número n. Lembrando-se que o quadrado de um número é ele vezes ele mesmo (n * n). Para a resolução deste problema, deve-se utilizar apenas uma variável como entrada e a saída deverá ser o resultado do quadrado (n * n).

Entrada

Saída

2

4

7

49

9.11. Exercício 2 – Função simples

Função simples

Escreva um programa que se declare uma função chamada celsius do tipo float. Receba a temperatura em Fahrenheit e transforme em Celsius. Imprima a temperatura em Celsius. Lembrando que a fórmula de conversão é C = (F – 32) * 5.0/9.0
Onde:
C = Temperatura em Celsius
F = Temperatura em Fahrenheit

Não esqueça de definir a função fora do main, você deve apenas chama-la dentro do main.

Entrada

Saída

50

10.00

77

25.00

9.12. Exercício 3 – Função que retorna nada

Função que não retorna nada (void)

Uma função que não retorna é batizada como função do tipo void. Este exercício desenha uma linha com um certo número de blocos.

Neste exercício, você deve envolver um texto por uma moldura (Consulte a apostila para mais informações). Você deve prototipar uma função fora do main e depois declara-la fora do main. Dentro do main, você deverá chama-la.
A linha deste exercício deve ser do tamanho 20, e na tela deverá ser impressa a seguinte frase:
Um programa em C.

A saída do seu programa ficará assim:

9.13. Exercício 4 – Calculo da área de uma esfera

Crie uma função do tipo float chamado área, fora do main, declare a função área, a qual retorna (4 * PI * r *r). Use PI = 3.14159. Receba o valor do raio, e imprima o valor da área na saída.

Entrada

Saída

10

1256.64

7

615.75

9.14. Exercício 5 – Função que gera números aleatórios

Prototipe uma função chamada unsigned rand a qual recebe um void, fora do main, crie a função. Dentro dela coloque static unsigned semente = 1.

A formula magica é semente = (semente * 25173 + 13849)%65536

Dentro do main você deverá utilizar um laço for para imprimir 5 valores, não se esqueça de chamar a função rand dentro do for.

Saída

39022

61087

20196

45005

3882

9.15. Exercício 6 – Vetor

Neste exercício você deve receber um vetor de tamanho n, receber a sequência dele, e através do laço for, fazer a inversão de leitura dele, conforme o exemplo abaixo:

Entrada

Saída

5
1 2 3 4 5

5 4 3 2 1

7
14 21 28 7 2 4 12

12 4 2 7 28 21 14

9.16. Exercício 7 – Produto Escalar

Dados os vetores u=(a,b) e v=(c,d), definimos o produto escalar entre os vetores u e v, como o número real obtido por:

u.v = a.c + b.d

Exemplos:

O produto escalar entre u=(3,4) e v=(-2,5) é:

u.v = 3.(-2) + 4.(5) = -6+20 = 14

O produto escalar entre u=(1,7) e v=(2,-3) é:

u.v = 1.(2) + 7.(-3) = 2-21 = -1

Seguindo o exemplo acima, crie um programa que faça o produto escalar entre dois vetores. Seu programa deve receber o tamanho dos vetores e o valor dos seus componentes. Sua saída deverá imprimir o produto escalar desses vetores.

Entrada

Saída

Tamanho dos vetores: 2
u: 3 5
v: 4 7

47.00

Tamanho dos vetores: 7
u: 7 7 7 7 7 7 7
v: 7 7 7 7 7 7 7

343

9.17. Exercício 8 – Calcula a média de cinco notas (matriz)

Faça um programa que receba cinco notas (utilize o laço for para recebimento das notas), some as notas na variável media, fora do loop, calcule a media, divido-a por 5.

Entrada

Saída

2 8 9 10 7

7.20

7 7 10 5 9

7.60

9.18. Exercício 9 – Matriz de mais de uma dimensão

Neste exercício você deverá fazer uma matriz de 2 dimensões para gerar jogos aleatórios da mega sena, na primeira dimensão você irá gerar valores para a matriz, utilizando dois loops for para isso (utilize a função rand para gerar números aleatórios de 1 a 60).

Na segunda dimensão imprima a frase Combinação, juntando com o número da combinação + o valor vindo da matriz.

Saída

Combinação 1: 42 48 35 41 30 5
Combinação 2: 19 27 23 45 6 18
Combinação 3: 2 28 4 12 56 3
Combinação 4: 28 37 52 25 3 34
Combinação 5: 53 23 22 57 39 36

9.19. Exercício 10 – Gerar matriz com números aleatórios

Gere uma matriz quadrada de números aleatórios de tamanho TAM. Utilize loops for para percorrer a matriz e inserir os números. Imprima a matriz.
A saída deverá ser como no exemplo abaixo, onde foram geradas duas matrizes de 10 x 10

Saída

2210.00 12991.00 15115.00 20403.00 1225.00 22859.00 22951.00 4955.00 22677.00 2519.00

11120.00 15865.00 6677.00 7560.00 4871.00 7539.00 15910.00 23063.00 4689.00 29422.00

27880.00 17528.00 25221.00 31381.00 31342.00 1721.00 21123.00 8341.00 22458.00 27948.00

24424.00 1900.00 4072.00 16072.00 15199.00 17252.00 9641.00 29901.00 14010.00 28506.00

25843.00 5543.00 16193.00 32452.00 31991.00 14101.00 27081.00 28915.00 30292.00 27530.00

14857.00 18837.00 22922.00 7892.00 7338.00 29309.00 6577.00 9723.00 18333.00 27303.00

5995.00 1644.00 29873.00 26230.00 20503.00 14422.00 10853.00 17729.00 3399.00 26709.00

1786.00 14.00 10356.00 31822.00 16845.00 30109.00 14065.00 24474.00 22244.00 14249.00

12830.00 23142.00 4295.00 15722.00 28638.00 30809.00 25745.00 8030.00 32587.00 17016.00

21574.00 16457.00 15784.00 20551.00 19303.00 1915.00 14230.00 29745.00 10692.00 4177.00

2315.00 29260.00 29712.00 3997.00 3611.00 17442.00 24246.00 9586.00 26760.00 2389.00

6387.00 17274.00 26993.00 12755.00 26892.00 5302.00 22118.00 22847.00 30504.00 28548.00

32728.00 21398.00 14176.00 26472.00 7117.00 27922.00 14869.00 11275.00 14552.00 24910.00

22150.00 22916.00 23881.00 19884.00 25505.00 7639.00 9889.00 8948.00 29466.00 22459.00

32073.00 23101.00 17083.00 4769.00 12419.00 28945.00 22523.00 1009.00 3744.00 28876.00

31185.00 28055.00 19828.00 1349.00 31946.00 2494.00 22279.00 26288.00 5466.00 25563.00

20109.00 6851.00 9327.00 17134.00 24984.00 20760.00 12876.00 2309.00 14733.00 24275.00

2965.00 11265.00 8532.00 7556.00 13478.00 11164.00 13140.00 12623.00 10025.00 10411.00

9119.00 31306.00 3560.00 417.00 31337.00 13606.00 29407.00 6229.00 21183.00 3858.00

5014.00 9477.00 29046.00 12508.00 20398.00 15002.00 18529.00 1369.00 26041.00 24621.00

10. Apêndice C

10.1. Exercícios Módulo 3 - Exercício 1

10.2. Função recursiva

Fatorial é um número natural inteiro positivo, o qual é representado por n!

O fatorial de um número é calculado pela multiplicação desse número por todos os seus antecessores até chegar ao número 1. Note que nesses produtos, o zero (0) é excluído.

O fatorial é representado por:

n! = n * (n – 1) * (n – 2) * (n – 3)!

Fatorial de 0: 0! (lê-se 0 fatorial)

0! = 1

Fatorial de 1: 1! (lê-se 1 fatorial)

1! = 1

Fatorial de 7: 7! (lê-se 7 fatorial)

7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040

Neste exercício iremos utilizar o recurso da função recursiva, que é quando dentro da função, chamamos ela novamente, para a resolução deste exercício, crie uma função responsável por calcular o fatorial de um número fora do main. Dentro do main, chame esta função para o cálculo do número que você deseja.

Entrada

Saída

7

5040

5

120

10.3. Exercício 2 – BubbleSort

bubble sort, ou ordenação por flutuação (literalmente "por bolha"), é um algoritmo de ordenação dos mais simples. A ideia é percorrer o vetor diversas vezes, e a cada passagem fazer flutuar para o topo o maior elemento da sequência.

No melhor caso, o algoritmo executa {displaystyle n}n operações relevantes, onde n {displaystyle n}representa o número de elementos do vector. No pior caso, são feitas {displaystyle n^{2}} n2  operações. A complexidade desse algoritmo é de ordem quadrática. Por isso, ele não é recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.

Escreva um programa que ordene um vetor de tamanho TAM = 7, e imprima na tela o vetor ordenado em ordem crescente.

Entrada

Saída

Vetor [i] = 5 8 12 3 7 4 1

Vetor [i] = 1 3 4 5 7 8 12

Vetor [i] = 49 14 7 21 28 35 12

Vetor[i] = 7 12 14 21 28 45 49

10.4. Exercício 3 – InsertionSort

Insertion Sort, ou ordenação por inserção, é o algoritmo de ordenação que, dado uma estrutura (array, lista) constrói uma matriz final com um elemento de cada vez, uma inserção por vez. Assim como algoritmos de ordenação quadrática, é bastante eficiente para problemas com pequenas entradas, sendo o mais eficiente entre os algoritmos desta ordem de classificação.

Implemente um programa capaz de ordenar um vetor de n elementos utilizando o algoritmo de ordenação Insertion Sort.

Entrada

Saída

Número de elementos: 7

12 8 14 7 21 6 1

1 6 7 8 12 14 21

Número de elementos: 14
18 32 5 8 7 14 2 3 6 9 11 23 15 17

2 3 5 6 7 8 9 11 14 15 17 18 23 32

10.5. Exercício 4 – Ponteiros Constantes

Neste exercício iremos ver o funcionamento de um ponteiro constante. Faça um programa que leia 3 variáveis inteiras, sendo elas v, r e h e imprima o seu respectivo endereço, como mostra a tabela de exemplo.

Saída

Endereco de v = 000000000062FE4C

Endereco de r = 000000000062FE48

Endereco de h = 000000000062FE44

10.6. Exercício 5 – Ponteiros Variáveis

Hora de ver o funcionamento de ponteiros variáveis. Escreva uma função do tipo void, que reajusta o preço atual em 7%. Imprima o preço novo e o valor do aumento do produto. Lembrando que esta função deve estar fora do main, e você deve chama-la dentro main para realizar a operação de reajuste.

Entrada

Saída

Preço atual: 7

O preço novo e: 7.49

O aumento foi de: 0.49

Preço atual: 9

O preço novo e: 9.63
O aumento foi de: 0.63

10.7. Exercício 6 – Operações com ponteiros

Vamos fazer uma troca simples entre dois ponteiros do tipo inteiro. Escreva uma função do tipo void chamada troca, que receba dois ponteiros e faça a troca entre eles. Dentro do main, leia dois inteiros. Chame a função troca para realizar a troca entre os dois inteiros. Imprima os ponteiros. Dica, esse exercício só possui saída.

Saída

x = 1

y = 0

10.8. Exercício 7 – Matriz transposta

matriz transposta, indicada pela letra t, é um tipo de matriz que apresenta os mesmos elementos entre duas matrizes.

Entretanto, há uma inversão da ordem. Ou seja, os elementos da coluna de uma são iguais aos elementos da linha de outra.

Ou ainda, os elementos da linha da primeira são iguais aos elementos da coluna da segunda.

Exemplo:

Considere uma matriz A = (aij)m x n a transposta de A é At = (a’jin x m. Note que a matriz A é de ordem m x n, enquanto sua transposta At é de ordem n x m.

Escreva um programa que faça a transposição de uma matriz [n] [m] e imprima a matriz transposta.

Entrada

Saída

8 12 23 7
14 21 18 12
10 11 8 7

8 14 10
12 21 11
23 18 8

7 12 7

1 2 3 4

5 6 7 8

9 10 11 12

1 5 9

2 6 10

3 7 11

4 8 12

10.9. Exercício 8 – Malloc

Alocação de memória em C. Para programas grandes, feitos em C, é necessário alocar memória para que o mesmo posso ser executado sem que trave ou seja interrompido antes de terminação sua execução. Neste exercício, veremos a utilização do comando malloc, o qual é utilizado para fazer a alocação de memória.

Escreva um programa capaz de ler um vetor de tamanho n, aloque memória utilizando um ponteiro e o comando malloc, imprima esse vetor utilizando um for que comece i = 0 e vá até que i seja menor ou igual ao tamanho do vetor.

Entrada

Saída

Tamanho do vetor: 7

0 1 2 3 4 5 6 7

Tamanho do vetor: 5

0 1 2 3 4 5

10.10. Exercício 9 – Ordenando números inteiros

A função de biblioteca-padrão qsort() executa a ordenação de uma matriz por meio da implementação do algoritmo “quick-sort”. A função é do tipo void e recebe quatro argumentos: o primeiro é o endereço da matriz a ser ordenada, o segundo é um inteiro com o número de elementos de da matriz, o terceiro é o tamanho em bytes de um elemento da matriz e o último é o endereço de uma função com o seguinte protótipo:

Int compara(const void *, const void *);

A partir disto, crie um programa que ordene números inteiros de uma matriz utilizando a função qsort(). Chame esta função dentre do main e não se esqueça de passar os parâmetros para a função.

Entrada

Saída

Tab [] = {234, 760, 162, 890, -23, 914, 567, 888, 398, -45}

-45 -23 162 234 398 567 760 888

10.11. Exercício 10 – Operador shift

O operador SHIFT direito: >> e >>= é um operador binário, mas que age somente no operando da esquerda. Executa um deslocamento para a direita, conforme o número de posições especificando no segundo operando.

Exemplo:

unsigned short x = 5 // 00000000 00000101

unsgined short z = x>>1 // 00000000 00000010

Para exemplificar o uso desse operador, escreva um programa que pede a entrada de um número em hexadecimal e o converte para binário.

Entrada

Saída

7

00000000—00000000-00000000-00000111

7777777

00000111—01110111-01110111-01110111

77

00000000—00000000-00000000-01110111


Por Marcus Vinicius Siqueira Vogado e Rogério Vilela Bonfim 


Publicado por: Marcus Vinicius Sirqueira Vogado

icone de alerta

O texto publicado foi encaminhado por um usuário do site por meio do canal colaborativo Monografias. Brasil Escola não se responsabiliza pelo conteúdo do artigo publicado, que é de total responsabilidade do autor . Para acessar os textos produzidos pelo site, acesse: https://www.brasilescola.com.