PRG29002 - Programação I - Eng.Telecom 2018-1

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
A versão imprimível não é mais suportada e pode ter erros de renderização. Atualize os favoritos do seu navegador e use a função de impressão padrão do navegador.

Dados importantes

  • Professor da Disciplina: Heron Eduardo de Lima Ávila
  • Email: heron.avila@ifsc.edu.br
  • Atendimento paralelo: quartas das 14:30 às 15:30 na Sala dos Professores de Tele II

Substituído por:

  • Professor da Disciplina: Eraldo Silveira e Silva
  • Email: [1]
  • Atendimento paralelo:
    • quartas das 10:45 às 11:45 na Sala dos Professores de Tele I
    • quintas das 15:30 às 16:30 na Sala dos Professores de Tele I

Dados da Disciplina

Algoritmos utilizando fluxograma

Introdução aos algoritmos utilizando fluxograma

Introdução aos algoritmos utilizando fluxograma

Aula Introdução

Fluxogramas

  • Ementa disponível nos slides disponibilizados no moodle.
  • Conceito de Algoritmo: Sequência ordenada de passos para resolução de um dado problema.
  • Para que serve e como abordaremos?
    • Algoritmos estão associados a automação de processos, permitem descrever os passos que uma máquina (mecânica ou eletrônica) irá realizar geralmente de maneira repetitiva (garantindo repetibilidade). Vídeo What is an Algorithm
    • Trabalharemos neste curso com problemas bem definidos que possuem objetivos, caminhos de solução e expectativa de solução claros.
  • Formas de representação
    • Descrição narrativa: Descrição informal de uma situação e passos para solução de um problema
    • Fluxograma: Operações são representadas por formas geométricas
    • Pseudo-código: Representação de comportamento e ações por meio de regra predefinida
    • Códigos de programação: Um PROGRAMA implementa um algoritmo. É o algoritmo materializado na forma de uma sequência de instruções.
  • Descrição narrativa
    • Trata-se de um texto livre mas é sugerido organizar em tópicos como os seguintes:
      • Cenário;
      • Problema;
      • Dados de entrada e saída;
      • Solução esperada;
      • Etapas;
      • Solução proposta.
    • Exemplos comuns são receitas de culinária, mas pode-se descrever de forma narrativa qualquer tipo de algoritmo.
      • Descreva o algoritmo para fazer um ovo frito
      • Descreva o algoritmo para cozinhar macarrão instantâneo
  • Fluxogramas
    • Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada para descrição de algoritmos.
    • Existem diferentes padrões, aqui utilizaremos o ANSI.
    • Para desenvolver um algoritmo utilizaremos operações basicamente as seguintes operações:
      • Sinalização de início e fim do algoritmo (ovalado): representam quando o programa é instanciado e quando é destruído
      • Processamento (Instrução): são ações gerais, podem ser processamentos matemáticos, ações físicas de movimentação e muitas outras. Há outros símbolos de fluxograma que especificam mais ações como gravar em banco de dados, gerar relatório, neste caso aqui podemos usar o símbolo de processamento para representar estas ações bastando especificá-las.
      • Entrada de dados: representa algo que o programa lê, alguma informação vinda, normalmente do usuário, que está sendo inserida no programa.
      • Saída de dados: representa alguma informação que o programa gerou ao usuário, pode ser uma mensagem na tela, uma luz piscando, etc.
      • Decisão: Este bloco representa a tomada de decisão, a resposta a uma pergunta que normalmente pode ser SIM ou NÃO. Terá portanto duas flexas de saída. Observe que o programa poderá tomar cursos diferentes a partir deste bloco.
      • Processo pré-definido (subrotina): Usado na abstração de alguns processos que seriam melhor descritos isoladamente. O início e fim de uma subrotina utiliza os mesmos blocos início e fim descritos acima (utilizando o nome da subrotina para especificar).
      • Terminador (início/fim) redondo: representa normalmente um concentrador de fluxo, quando vários caminhos chegam a um certo ponto. Pode também ser usado na paginação numerando términos parciais para representação em outra área do desenho.

Ansi flowchart.jpg

  • No libreoffice utilize a ferramenta Libreoffice Draw, há uma paleta específica para fluxogramas.

Flowchart libreoffice.png

  • Exemplos de algoritmos (como seriam os fluxogramas destes algoritmos?):
    • Calcula média de dois números
      Media de dois numeros.jpg
    • Observar uso de Terminador de inicio, Entrada de dados: NUM1, Entrada de dados: NUM2, Calcula, Exibe a média e Terminador de fim
  • Outros exemplos de algoritmos para exercitar fluxogramas (pode-se abstrair e fazer de modo simplificado na forma de uma série de processos ou modo mais completo com condicionais):
    • Fritar um ovo
    • Trocar o pneu de um carro
    • Enviar um e-mail
    • Pegar um livro na biblioteca
    • Calcular a área de um cômodo
    • Cozinhar macarrão instantâneo
    • Cozinhar miojo com ovo Vídeo Manual do Mundo
  • Outros conceitos trabalhados
    • abstração
    • estruturas de dados

Desenvolvendo algoritmos na forma de fluxogramas

Desenvolvendo algoritmos na forma de fluxogramas

Exercícios para resolver em sala de aula:

  • Desenvolva um algoritmo na forma de fluxograma que calcula a média de consumo de um veículo. Deve obter a distância que um veículo percorreu e a quantidade de litros consumida, exibindo em tela o consumo médio em km/l.
  • Desenvolva um algoritmo na forma de fluxograma que lê dois valores inteiros e apresenta qual é o valor maior
  • Desenvolva um algoritmo na forma de fluxograma que lê dois valores inteiros e apresenta a diferença do maior para o menor
  • Desenvolva um algoritmo na forma de fluxograma que obtém a nota do aluno e mostra em tela o conceito sabendo que A >= 9.0, 9.0 > B >= 7.5, 7.5 > C >= 6.0, e D < 6.0
  • Desenvolva um algoritmo na forma de fluxograma que obtém do usuário 10 valores, calcula a média e exibe (utilize uma estrutura de repetição)
  • Desenvolva um algoritmo na forma de fluxograma que implementa a técnica de pomodoro na forma de um aplicativo, mostrando ao usuário o cronômetro e mensagens de quando deve fazer pausas (Siga os passos descritos aqui
    • Solicitar ao usuário digitar o nome da tarefa que ele vai se concentrar
    • Iniciar o cronômetro em 25 minutos para realizar o pomodoro.
      • Mostrar o cronômetro decrescente até alcançar 0:00.
    • Não fez os 4 pomodoros ainda?
      • Iniciar o cronômetro em 5 minutos para o "break".
        • Mostrar o cronômetro decrescente até alcançar 0:00.
        • Repetir o pomodoro
    • Se não (caso já tenha feito 4 pomodoros)
      • Colocar o cronômetro para um "long break" de 15 minutos.
      • Mostrar o cronômetro decrescente até alcançar 0:00.
      • Fim do programa
  • Desenvolva um algoritmo na forma de fluxograma que exibe todos os números pares de 1 a 100

Pseudo-código

Pseudo-código utilizando Portugol - Introdução e condicionais

Pseudocódigo

  • Slides sobre pseudocódigo disponibilizados no moodle.

Ver exemplos de códigos Portugol dentro do software portugol (menu Arquivo->Abrir exemplo)

Desenvolvendo algoritmos na forma de pseudo-código - condicionais

Exercícios para resolver em sala de aula:

  • Desenvolve um algoritmo na forma de pseudo-código para cálculo da média de dois números fracionários exibindo o resultado
  • Desenvolva um algoritmo na forma de pseudo-código que calcula a média de consumo de um veículo. Deve obter a distância que um veículo percorreu e a quantidade de litros consumida, exibindo em tela o consumo médio em km/l.
  • Desenvolva um algoritmo na forma de pseudo-código que lê dois valores inteiros e apresenta qual é o valor maior
  • Desenvolva um algoritmo na forma de pseudo-código que lê dois valores inteiros e apresenta a diferença do maior para o menor
  • Desenvolva um algoritmo na forma de pseudo-código que obtém a nota do aluno e mostra em tela o conceito sabendo que A >= 9.0, 9.0 > B >= 7.5, 7.5 > C >= 6.0, e D < 6.0
Desenvolvendo algoritmos na forma de pseudo-código - repetição
  • Desenvolva um algoritmo na forma de pseudo-código que obtém do usuário 10 valores, calcula a média e exibe (utilize uma estrutura de repetição)
  • Desenvolva um algoritmo na forma de pseudo-código que exibe todos os números pares de 1 a 100
Exercícios - Pseudocodigo (série 0)

Exercícios - Pseudocodigo (série 0):

  1. Implemente por fluxograma e pseudocódigo um controlador de acesso que verifica se a senha digitada é igual a senha padrão “1234” abrindo a porta. O sistema deve sinalizar tanto no caso de acesso liberado ou negado. (id:0.07)
  2. Implemente um pseudocódigo que converte “celsius para fahrenheit” ou “fahrenheit para celsius” conforme opção que deve ser apresentada pelo algoritmo. (id:0.09)
  3. Desenvolva um algoritmo na forma de pseudocódigo que obtenha três números inteiros distintos e escreva na tela os valores do menor para o maior. (id:0.10)
  4. Desenvolva um algoritmo na forma de pseudocódigo que obtenha duas datas fornecidas pelo usuário (três números inteiros cada: dia, mês e por último ano com 4 dígitos) e mostra como resultado qual das duas datas é cronologicamente maior. (id:0.13)
  5. Implementar em pseudocódigo um algoritmo que através do valor ôhmico dado diz qual é a sequencia de cores de um resistor. Considere apenas resistores de 4 bandas de cores incluindo a tolerância, porém neste exercício ignore a tolerância. Desconsidere resistores de precisão, aqueles com multiplicadores ouro e prata. Considere que o multiplicador máximo é de 10MOhm (violeta). (id:0.12)
  6. Implementar em pseudocódigo um algoritmo que através de uma sequencia de cores de um resistor dado dá o valor ôhmico do resistor. Considere apenas resistores de 4 bandas de cores incluindo a tolerância, porém neste exercício ignore a tolerância. Desconsidere resistores de precisão, aqueles com multiplicadores ouro e prata. Considere que o multiplicador máximo é de 10MOhm (violeta). (id. 0.17)
  7. Implemente em pseudocódigo o algoritmo descrito no fluxograma abaixo (clique na imagem para ampliar) (id:0.08):
    Bhaskara.png
  8. Implementar em pseudocódigo algoritmo que imprime em tela o ranking de países através das medalhas obtidas nas olimpíadas. Sabendo que fica melhor colocado no ranking o país que soma mais medalhas de ouro, caso haja empate aquele que soma mais prata entre os empetados e caso haja empate na quantidade de prata também será melhor colocado no ranking o que tiver mais bronzes. O algoritmo deve ser capaz de armazenar e ranquear três países. Dica: crie as variáveis paisA_ouro, paisA_prata e paisA_bronze como numéricas para armazenar as medalhas obtidas pelo país A, da mesma forma para o país B e país C. Você pode limitar a quantidade de medalhas total e determinar pesos para obter um valor absoluto de pontuação. (id:0.18)
  9. Implemente um algoritmo que solicita ao usuário entrar com 10 temperaturas, o algoritmo deve usar um laço de repetição para isso. No final deve mostrar a maxima, minima e média das temperaturas (id:0.16)

Pseudo-código utilizando Portugol - repetições

Exercícios - Pseudocodigo (série 1)

Exercícios - Pseudocodigo (série 1):

  1. Implemente um algoritmo que solicita ao usuario entrar com um numero negativo qualquer. O algoritmo deve mostrar todos os números impares e pares de 0 até este negativo indicado. Utilize a estrutura para, verifique qual o passo adequado para resolver esta questão. (id:1.07)
  2. Desenvolva uma algoritmo para marcar o placar de um jogo de futebol, deve solicitar ao usuário digitar A ou B, ao digitar A é somado um gol a equipe A e o mesmo para a B. Se digitado F deve encerrar e mostrar o placar final. (id:1.11)
  3. Implemente um algoritmo que obtém um número do usuário e utilizando laço para verifica se um número primo. Valide seu algoritmo comparando com a lista de primos Lista de números primos (id:1.14)
  4. Implemente um algoritmo que obtém dois números inteiros positivos do usuário e utilizando laço de repetição realização a multiplicação destes dois números através de operações de soma. (id:1.09)
  5. Implemente um algoritmo que obtém dois números inteiros positivos do usuário e utilizando laço de repetição realização a divisão destes dois números através de operações de subtração. (id:1.10)
  6. Faça um algoritmo que apresente a sequencia de Fibonacci dado um valor “n” que representa a quantidade de números em série que se deseja exibir. (id:1.15)
  7. Implemente um algoritmo que utiliza uma estrutura "PARA" afim de desenhar uma moldura com 10 colunas e "n" linhas. A quantidade de linhas "n" deve ser obtida do usuário. Se o usuário digitar 6 ficaria conforme mostrado a seguir:

XXXXXXXXXX X X X X X X X X XXXXXXXXXX </syntaxhighlight>

Exercícios - Pseudocodigo (série 2)

Exercícios - Pseudocpodigo (série 2):

  1. Rode e teste o exemplo do "Quadro 42 - Exemplo de uso de vetores em Portugol" do TCC de Antônio Medeiros, compare com a implementação de teste de números primos feito na lista anterior. Com o uso de vetores o que mudou?
  2. Implemente um algoritmo que solicita do usuário 10 números, após a leitura mostra ao usuários os números na ordem inversa em que foram digitados
  3. Escreva um algoritmo que solicita ao usuário digitar 6 números para uma aposta na megasena. O algoritmo deve utilizar a estrutura repita, gravar em um vetor cada número que deve estar entre 1 e 60. Deve garantir que os 6 números são diferentes entre si e no final mostrar os números digitados
  4. Implemente o pseudocódigo de uma calculadora que realiza operações de soma ou subtração de dois números. A calculadora deve operar em um laço infinito encerrando sua operação se o usuário digitar "q"
  5. Implemente o pseudocódigo de um programa que solicita o nome e idade de 5 pessoas gravando em dois vetores distintos (um literal e outro numérico). No final imprime em tela o indice de memória de cada usuário e seus dados como no exemplo a seguir "O nome do usuário '1' é 'Joao' e tem 40 ano(s)" (Neste exemplo o usuário digitou nome: Joao, Idade: 40). Utilize estrutura de repetição REPITA.
  6. Implemente o pseudocódigo de um programa que utiliza uma matriz para armazenar informações NUMERICAS de um estoque de produtos. Cada linha desta matriz representa um produto, usaremos o limite de 5 produtos para este exercicio. A matrriz deve ter 3 colunas, a primeira representará a quantidade em estoque, a segunda o valor de custo e a terceira o preço de venda. O programa deve apresentar uma entrada de dados para receber do usuário parâmetros destes 5 produtos. No final um relatório deve ser apresentado mostrando a quantidade em estoque e o lucro bruto em % que está sendo aplicado para cada produto. Utilize estrutura de repetição ENQUANTO.
  7. Implemente em pseudocódigo um programa que obtém o nome de 10 alunos e suas 4 notas para cada aluno. No final deve imprimir um relatório mostrando cada aluno por nome, a média de suas notas e sua situação final (aprovado se a média for >= 6). Utilize vetores, matrizes e estruturas de repetição PARA.
  8. Desenvolva uma algoritmo na forma de pseudocódigo para calcular o consumo médio de energia de uma casa ao longo de 12 meses. Para isso implemente um loop principal que solicita ao usuário que digite os valores de potencia em kWh consumidos em cada mês. Armazene em uma matriz 3x4, onde cada linha representa uma estação do ano. Apresente a média de consumo em cada estação, exibindo nome da estação e valor. Deve também exibir a média geral do ano no final. Considere verão os meses 12, 1 e 2; Outono 3, 4 e 5; Inverno 6, 7 e 8 e Primavera 9, 10 e 11.
  9. Implemente em pseudocódigo o código descrito no fluxograma abaixo:
    Fluxograma Mediana.png

Exercícios complementares:

  • Sessão 12.5 (página 294) de Araújo, Everton Coimbra de. Algoritmos: fundamento e prática; 3ª ed. [S.l]:Visual Books, 2007. 414p. ISBN 9788575022092.

Pseudo-código utilizando Portugol - sub-rotinas e registros

Exercícios - Pseudocodigo (série 3)

Exercícios - Pseudocodigo (série 3):

  1. Execute o código do TCC do Antonio Medeiros, "Quadro 49 - Exemplo de passagem de parâmetros por referência em Portugol"
  2. Execute o código do TCC do Antonio Medeiros, "Quadro 50 - Exemplo de uso de sub-rotina que retorna valor em Portugol"
  3. Implemente um algoritmo que realiza análises combinatórias pelo uso de uma sub-rotina de cálculo de fatorial. Neste caso o usuário deve entrar com um inteiro e o algoritmo deve retornar o número de possíveis combinações para aquele dado realizando análise de Permutações Simples. (id:3.01)
  4. Implemente um algoritmo que utilizando as sub-rotinas pré-definidas do portugol (seno e cosseno) criando outras sub-rotinas para cálculos da tangente, arco-seno, arco-coseno e arco-tangente. Neste caso utilizando angulos em radianos
  5. Implemente um algoritmo anterior agora aceitando angulos em graus
  6. Execute o código do TCC do Antonio Medeiros, "Quadro 56 - Exemplo de uso de vetor de registros em Portugol"
  7. Desenvolva uma algoritmo para marcar o placar de um jogo de futebol, deve solicitar ao usuário digitar o nome das equipes A e B, guardando esta informação em campos de registros bem como deve possuir campos para armazenar o placar de cada equipe. Depois que o usuário digitar os nomes deve aguardar o anúncio de gols. Ao digitar A é somado um gol a equipe A e o mesmo para a B. Se digitado F deve encerrar e mostrar o placar final mostrando os nomes das equipes.
  8. Implemente o pseudocódigo de um programa que solicita o nome e idade de 5 pessoas gravando em uma estrutura de dados tipo registro com dois campos (um literal e outro numérico). No final imprime em tela o indice de memória de cada usuário e seus dados como no exemplo a seguir "O nome do usuário '1' é 'Joao' e tem 40 ano(s)" (Neste exemplo o usuário digitou nome: Joao, Idade: 40).
  9. Implemente um algoritmo em pseudocódigo para cálculo de pagamento de horas trabalhadas e análise de produtividade de funcionários. Os dados estão fornecidos na tabela a seguir, responda aos seguintes itens:
    1. Crie uma estrutura na forma de registro com os campos “Salario_hora”, “Horas_trabalhadas” e “produzidos” todos numéricos. Obtenha do usuário os dados, no final imprima os dados capturados.
    2. Calcule e imprima quanto cada trabalhador faturou na semana
    3. Calcule e imprima o total de salários pagos
    4. Calcule e imprima a quantidade total de dispositivos fabricados
    5. Calcule e imprima o custo médio por dispositivo, ou seja, de acordo com a produtividade de cada trabalhador qual é o custo unitário de produção e em seguida a média destes custos
Trabalhador 1 Trabalhador 2 Trabalhador 3 Trabalhador 4 Trabalhador 5
Salário por hora ($) 5,00 5,50 6,50 6,00 6,25
Horas de trabalho (h) 40 43 37 50 45
Produção (dispositivos) 1000 1100 1000 1200 1100

Parte da implementação do problema das funções trigonométricas algoritmo

 declare angulo,s,c,t numerico
 escreva "Digite um angulo: "
 leia angulo
 s <- arredonda(seno(angulo))
 escreva "O seno do angulo ",angulo," é: ",s
 c <- arredonda(cosseno(angulo))
 escreva "O cosseno do angulo ",angulo," é: ",c
 t <- arredonda(tangente(angulo))
 escreva "O tangente do angulo ",angulo," é: ",t

fim_algoritmo

sub-rotina tangente (x numerico)

 declare aux numerico
 aux <- seno(x) / cosseno(x)
 retorne aux

fim_sub_rotina tangente </syntaxhighlight>

Projeto final

O aluno deve propor ao professor um projeto de sua preferência que respeite os requisitos mínimos. Sendo aceito deverá desenvolver o projeto e apresentá-lo.

Requisitos mínimos

  • Utilizar funções (ao menos três além do main, sendo que devem receber argumentos e possuir retorno);
  • Apresentar menu utilizando switch case e conter laço infinito;
  • Utilizar Structs ou Unions;
  • Utilizar bibliotecas (além da stdio.h);
  • Utilizar diretivas de pré-compilação;
  • Utilizar comentários;
  • Utilizar Ponteiros;
  • Aceitar argumento de entrada no programa;
  • Realizar acesso a arquivo, lendo e escrevendo informações (busque requisitos que requerem persistência de dados);
  • Gravar informações de operações em log;

Modelo

  • Trabalho individual

Metodologia

  1. Apresentar a proposta de projeto ao professor
  2. Opcional: Documentar o escopo do projeto utilizando descrição narrativa (descrição simples)
    1. Cenário
    2. Problema
    3. Dados de entrada e saída
    • O planejamento do cronograma não será cobrado porém cabe ao aluno se organizar quanto ao tempo para entrega no prazo
  3. Desenvolver o projeto
  4. Apresentar individualmente ao professor
    • Serão realizados testes diversos, arguido sobre o funcionamento, possibilidades de alterações, etc

Algumas ideias de projetos

  • Sugestão geral: veja em outras disciplinas que processos podem ser automatizados e proponha um projeto que realiza esta tarefa como de cálculos diversos de eletrônica, de rádio transmissão, etc.
  • Implementar o jogo Pedra, papel ou tesoura. Neste jogo dois ou mais jogadores em diferentes computadores devem rodar um aplicativo que fará a leitura de um arquivo compartilhado. O algoritmo deve tratar as etapas do jogo (Setup do aplicativo, entrada na sala, escolha da figura e apresentação do resultado)
  • Implementar o jogo da velha escrevendo em arquivo. Neste jogo dois jogadores em diferentes computadores devem rodar um aplicativo que fará a leitura de um arquivo compartilhado. O algoritmo deve tratar as etapas do jogo (Setup do aplicativo, entrada na sala, seleção das casas e apresentação do resultado)
  • Implementar controle de empréstimo de objetos. Neste software o usuário poderá digitar nomes de objetos que emprestou, a pessoa a quem emprestou e automaticamente o software guarda a data. Deve haver uma opção para gerar relatório dos itens emprestados e opção para marcar a devolução (podendo manter o registro em histórico ou apagando o registro).
  • Implementar software gerador de lista de compras. Neste software o usuário poderá digitar itens de supermercado com nome e quantidade. O software escreve num arquivo que poderá depois ser impresso. O software também pode ter função de numa segunda execução já trazer a antiga listagem digitada e permitir que o usuário apenas selecione novas quantidades ou inclua novos itens.
  • Implementar software para realização de cálculos de eletrônica. Neste software um menu apresenta várias opções de cálculo como de potencia através de tensão e corrente, como obtenção do valor de um resistor, como solução de equivalência de paralelo de vários resistores e outras. Num arquivo texto pode ser armazenado um histórico de operações realizadas.
  • Implementação de software para apostas na mega sena. Neste software são dadas sugestões de números para apostas de acordo com o número do sorteio da mega sena. Com este histórico armazenado é possível então entrar com um número de sorteio e digitar quais foram os números verdadeiramente sorteados na loteria federal checagem os acertos.

Referências

Referências bibliográficas
  • Araújo, Everton Coimbra de. Algoritmos: fundamento e prática; 3ª ed. [S.l]:Visual Books, 2007. 414p. ISBN 9788575022092.
  • KERNIGHAN, Brian W.; RITCHIE, Dennis M C: a linguagem de programação padrão ANSI; 1ª ed.[S.l]:Campus, 1989. 304p. ISBN 9788570015860.
  • SCHILDT, Herbert C Completo e Total; 3ª ed. [S.l]:Makron Books, 2009. 827p. ISBN 9788534605953.
  • FORBELLONE, Andre L. Lógica de Programação; 3ª ed. [S.l]:Makron Books, 2005. 197p. ISBN 9788576050247.
  • KING, K.N. C Programming: A Modern Approach; 2ª ed. [S.l]:W. W. Norton & Company, 2008. 832p. ISBN 9780393979503.
  • MANZANO, Jose Augusto Navarro Garcia Estudo Dirigido em Linguagem C. ; 16ª ed. [S.l]:Erica, 2012. 216p. ISBN 9788571948877.
  • NEVES, Júlio Cézar Programação Shell Linux; 5a ed. Rio de Janeiro:Brasport, 2005. 408p. ISBN 8574522031.
  • VEIGA, Roberto G. A. Comandos do Linux: guia de consulta rápida; ed. São Paulo:Novatec, 2004. 144p. ISBN 85-7522-060-8.
Ferramentas úteis
  • VisualG3: Uma IDE para desenvolvimento de programas em pseudocódigo (freeware), permite editar e compilar programas utilizando uma sintaxe própria de pseudocódigo muito parecida com a que trabalhamos em sala. Muito útil para verificar o funcionamento real dos algoritmos. Ver exemplos de códigos visualG3 em Exemplos VisualG3
  • LibreOffice: O LibreOffice é um programa gratuito (freeware) e de código aberto (opensource). Além de editor de textos, planilhas e apresentações tem a ferramenta Draw que permite a criação de fluxogramas.
  • VirtualBox: O Oracle VirtualBox é um programa gratuito (freeware) que permite criar e instanciar máquinas virtuais. O uso de máquinas virtuais é bastante interessante quando desejamos ter diferentes sistemas operacionais em um computador bem como quando se está realizando ensaios e deseja-se isolar estes experimentos do sistema principal.
  • Debian: O Debian, é umas das distribuições Linux mais estáveis existentes, suportando atualmente 12 arquiteturas de processador. É software livre e de código aberto e mantido por uma ampla comunidade com mais de 18000 desenvolvedores. Sua versão atual é a 8.5 (codinome Jessie, do filme Toy Story).
  • Ubuntu: O Ubuntu é uma distribuição linux (freeware e opensource) bastante estável e com uma comunidade bastante ativa que está sempre atualizando o sistema e presente nos foruns e redes sociais para dirimir dúvidas.
  • LinuxMint: O LinuxMint é uma distribuição linux (freeware e opensource) bastante estável e confortável aos usuários windows, pois traz um gerenciador de janelas configurado de uma forma mais natural para estes usuários e vem com um conjunto de programas pré-instalados que consegue atender a maior parte das demandas inicias.
  • dbDesigner4: O dbDesigner é uma ferramenta gratuita para elaboração de diagramas de bancos de dados relacionais. Não trabalhamos com bancos na disciplina PRG29002, porém trabalhamos com dados, esta ferramenta é útil para organizá-los em diagramas.
  • coliru: Compilador online

Plano de aula

Aula Data Horas Conteúdo Recursos
1 15/2 2 Aula inaugural, apresentação do professor e turma, apresentação da disciplina e introdução aos algoritmos Sala 10
2 19/2 2 Prática de fluxogramas Lab. Informática, Turma A [13:30 às 15:20], Turma B [15:40 às 17h30] (máximo 11 alunos por turma)
3 22/2 2 Exercícios de fluxogramas Sala 10
4 26/2 2 Introdução ao pseudocódigo até condicionais com resolução de exercícios Lab. Informática, Turma A [13:30 às 15:20], Turma B [15:40 às 17h30] (máximo 11 alunos por turma)
5 1/3 2 Resolução de problemas em pseudocódigo e fluxogramas (declaração de variáveis, leia e escreva, uso de condicionais e biblioteca portugol): Exercícios de preparação para a prova Sala 10
6 5/3 2 Avaliação1a: Introdução a algoritmos (fluxograma e pseudocódigo) Lab Redes 1
7 8/3 2 Correção da Avaliação 1a Lab Redes 1
8 12/3 2 Pseudocódigo: Uso de vetores e sub-rotinas com resolução de exercícios Lab Redes 1
9 15/3 2 Pseudocódigo: Registros e revisão geral Lab Redes 1
10 22/3 2 Avaliação1b: Pseudocódigo: vetores, sub-rotinas e registros Lab Redes 1
11 26/3 2 Correção da Avaliação 1b Lab Redes 1
12 29/3 2 Recuperação1? / Introdução ao C, primeiros conceitos de compilação, variáveis, controle de fluxo, entrada e saída de dados Lab Redes 1
13 2/4 2 Continuação C, condicionais, operadores relacionais, operadores lógicos. Prática: Controle de fluxo em C, entrada e saída de dados Lab Redes 1
14 5/4 2 Prática C Lab Redes 1
15 9/4 2 Continuação C: estruturas de repetição Lab Redes 1
16 12/4 2 Prática: estruturas de repetição Lab Redes 1
17 16/4 2 Continuação C: funções Lab Redes 1
18 19/4 2 Prática: Funções em C Lab Redes 1
19 23/4 2 Avaliação2: C até funções Lab Redes 1
20 26/4 2 Correção da prova Lab Redes 1
21 3/5 2 Recuperação2? / Prática para resolução de exercícios Lab Redes 1
22 7/5 2 Introdução a vetores e matrizes em C. Lab Redes 1
23 10/5 2 Resolução de exercícios de vetores Prática: Resolução de exercícios de fixação de vetores. Lab Redes 1
24 14/5 2 Structs e Unions Lab Redes 1
25 17/5 2 Prática: Structs e unions Lab Redes 1
26 21/5 2 Prática: Structs e unions / Compreendendo melhor a função main e exit, gerando números pseudo-aleatórios, defines e operadores e precedências Lab Redes 1
27 24/5 2 Ponteiros Lab Redes 1
28 28/5 2 Prática: Exercicios ponteiros Lab Redes 1
29 4/6 2 Vetor de Ponteiros e Ponteiro Para Estruturas, typedef, recursividade, apresentação do projeto Lab Redes 1
30 7/6 2 Prática de Ponteiros e structs Lab Redes 1
31 11/6 2 Avaliação: C até structs e ponteiros Lab Redes 1
32 14/6 2 Prática: Correção da Avaliação / Desenvolvimento do projeto Lab Redes 1
33 18/6 2 Apresentação do projeto. Prática: Desenvolvimento do Projeto Lab Redes 1
34 21/6 2 Recuperação3? / Prática: Desenvolvimento do Projeto Lab Redes 1
35 25/6 2 Prática: Desenvolvimento do Projeto Lab Redes 1
36 28/6 2 Prática: Desenvolvimento do Projeto Lab Redes 1
37 2/7 2 Avaliação4: Apresentação do projeto Lab Redes 1
38 5/7 2 Encerramento da disciplina / Recuperação4? Lab Redes 1
TOTAL 76

AULA 08 - DIA 12/03/2018

  • Revisão Pseudicódigo
  • Uso do Portugol
  • Declaração de variáveis e atribuição
  • Operadores aritméticos, relacionais e lógicos
  • Comandos Condicionais
  • Comandos de Repetição

Material de Referência

  • Slides Cleber/Heron;

Exercícios

  1. Desenvolve um algoritmo na forma de pseudo-código para que 3 números seja lidos para as variáveis A,B e C. Na sequência os valores das variáveis devem ser trocados. O que estava em A vai para B, o que estava em B colocar C e o que estava em C em A. Imprimir os valores de A,B,C para conferir.

algoritmo

 declare A,B,C,AUX numerico
 escreva "Entre com A"
 leia A
 escreva "Entre com B"
 leia B
 escreva "Entre com C"
 leia C
 AUX<-B
 B<-A
 A<-C
 C<-AUX
 escreva "VALOR DE A = ", A
 escreva "VALOR DE B = ", B
 escreva "VALOR DE C = ", C

fim_algoritmo </syntaxhighlight>

  1. Desenvolve um algoritmo na forma de pseudo-código para cálculo da média de dois números fracionários exibindo o resultado

algoritmo

 declare NUM1, NUM2,MEDIA numerico
 escreva "Entre com NUM1"
 leia NUM1
 escreva "Entre com NUM2"
 leia NUM2
 MEDIA <- (NUM1+NUM2)/2
 escreva " media de ", NUM1, " com ", NUM2, " é ", MEDIA

fim_algoritmo </syntaxhighlight>

  1. Desenvolva um algoritmo para calcular o DELTA de uma equação do segundo grau:

algoritmo

 declare DELTA, A,B,C numerico
 escreva "Entre com A"
 leia A
 escreva "Entre com B"
 leia B
 escreva "ENTRE COM C"
 leia C  
 DELTA <- B * B - 4 * A * C
 escreva " DELTA é ", DELTA

fim_algoritmo </syntaxhighlight>

  1. Desenvolva um programa para calcular as raízes de uma equação do segundo grau. Trata-se da aplicação de um comando CONDICIONAL

algoritmo

 declare DELTA, A,B,C,RAIZ1,RAIZ2 numerico
 escreva "Entre com A"
 leia A
 escreva "Entre com B"
 leia B
 escreva "ENTRE COM C"
 leia C  
 DELTA <- B * B - 4 * A * C
 escreva " DELTA é ", DELTA
 se DELTA < 0 entao
    escreva "raízes imaginárias"
 senao se DELTA = 0 entao
 	inicio
 	RAIZ1 <- -b/2*a 
 	escreva "raizes iguais com valor ", RAIZ1
 	fim
 senao
    inicio
    RAIZ1 <- (-B+raiz_quadrada(DELTA))/2*A
    RAIZ2 <- (-B-raiz_quadrada(DELTA))/2*A
 	escreva "raiz um igual a  ", RAIZ1  
 	escreva "raiz um igual a  ", RAIZ2    
    fim

fim_algoritmo</syntaxhighlight>. Consulte o TCC passado como referência para o cálculo da raiz.

  1. Desenvolva um programa para calcular o e-nésimo termo de uma progressão aritmética dados o primeiro termo (A1) e a razão (R).

</syntaxhighlight>

  1. Modifique o programa anterior para calcular a SOMA dos n primeiros termos, dados o primeiro termo (A1) e a razão (R). NÃO USAR a fórmula da soma e USAR o comando PARA.
  2. Desenvolva um programa para abrir uma porta caso a senha seja "ABCD". Se não for a senha correta uma mensagem será dada. Não precisa usar repetição. O código se executa uma única vez

algoritmo

 declare SENHA literal
 SENHA <- ""
 escreva "entre com a senha"
 leia SENHA
 se SENHA = "ABCD" entao      
    escreva "Abra a porta"
 senao
    escreva "Nao abra a porta" 

fim_algoritmo </syntaxhighlight>

  1. Modificar o programa para validar a abertura da porta com o nome do usuário e com a senha.
  2. Modificar o programa para que se a pessoa errar a SENHA ela seja solicitada novamente.
  3. Desenvolver um programa para calcular a hipotenusa de um triângulo retângulo dado os catetos. Validar as entradas para garantir que os valores sejam positivos.
  4. Desenvolver um programa para desenhar um retângulo configurável da forma que se segue. O número de linhas com 'A' e o número de 'A's deve ser fornecido como entrada.
  • AAAAAAAAAAAAAAAAAA*
  • AAAAAAAAAAAAAAAAAA*

</syntaxhighlight>

AULA 9 - DIA 15/03/2018

Introdução a Programação C

TAREFA

AULA 10 - DIA 22/03/2018

Instruções Condicionais

AULA 11 - DIA 26/03/2018

Instruções de Repetição

AULA 12 - DIA 29/03/2018

Objetivos

  • Revisão na forma de um exercício
  • Instruções de Repetição

Exercício

  1. Fazer programa em C (sem copiar nada da wiki) que lê 5 números e mostra a quantidade de números lidos que é maior que a média destes números.

OBS1: lembrar que ainda não vimos vetores etc.

OBS2: Usar uma variável contador de apoio.

Instruções de Repetição

Instruções de Repetição


AULA 13 - DIA 2/04/2018

Objetivos

  • Instruções de Repetição: finalização da aula anterior
  • Exercícios

Exercício Sem Consulta

Exercícios Adicionais

1.Faça um programa para desenhar um gráfico de barras para um conjunto de 3 valores inteiros, conforme a saída abaixo

Gráfico de Barras para grandezas


AULA 14 - DIA 5/04/2018

Objetivos da Aula

  • Conceito de Funções
  • Divisão de Problemas em Subproblemas

Conteúdo da Aula

AULA 15 - DIA 9/04/2018

Objetivos da Aula

  • Exercícios de Preparação para Avaliação

QUESTÃO 1

Implementar uma função que calcula através de um loop a soma de todos os números naturais (inteiros começando em zero) até um dado número (inclusive) passado como parâmetro. A equação matemática, o esqueleto da função e um código de teste é dado abaixo:

  1. include <stdio.h>

int soma_naturais(int numero) {

 int soma_nat=0;
 int i;
    
 /* implementar aqui*/
 return soma_nat; 

}

main() {

 printf("Para numero = %d tem=se soma = %d\n", 3, soma_naturais(3));
 printf("Para numero = %d tem=se soma = %d\n", 10, soma_naturais(10));
 printf("Para numero = %d tem=se soma = %d\n", 8, soma_naturais(8));

} </syntaxhighlight>

Prog Soma Naturais

QUESTÃO 2

Observe que a soma de números naturais é um problema conhecido: Ver https://pt.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF Reimplemente a função acima usando a fórmula fornecida no link.

QUESTÃO 3

Implementar uma função que calcula o quadrado da soma de naturais conforme abaixo.

  1. include <stdio.h>

int quad_soma_naturais(int numero) {

/* implementar aqui */

}

main() {

 printf("Para numero = %d tem=se quad_soma = %d\n", 3, quad_soma_naturais(3));
 printf("Para numero = %d tem=se quad_soma = %d\n", 10, quad_soma_naturais(10));
 printf("Para numero = %d tem=se quad_soma = %d\n", 8, quad_soma_naturais(8));

} </syntaxhighlight>

Prog Quadrado Soma Naturais

QUESTÃO 4

Implementar uma função que calcula através de um loop a soma de todos os números naturais (inteiros começando em zero) até um dado número (inclusive) passado como parâmetro. A equação matemática, o esqueleto da função e um código de teste é dado abaixo:

  1. include <stdio.h>

int soma_naturais(int numero) {

/* implementação aqui */

}

int quad_soma_naturais(int numero) {

/* implementação aqui */

}

int dif_soma_quad(int numero) {

 /* implementação aqui - reusar as funções já desenvolvidas

}

main() {

 printf("Para numero = %d tem=se dif_quad_soma = %d\n", 3, dif_soma_quad(3));
 printf("Para numero = %d tem=se dif_quad_soma = %d\n", 10, dif_soma_quad(10));
 printf("Para numero = %d tem=se dif_quad_soma = %d\n", 8, dif_soma_quad(8));

}

</syntaxhighlight>

Prog Diferença Quadrado Soma Naturais

QUESTÃO 5

Implemente um jogo de adivinhação em que o usuário deve adivinhar a soma de dois dados lançados pelo computador. O valor da cada dado deve ser mostrado e a soma dos mesmo no momento que o usuário adivinhar ou após três chances de adivinhação. Use o comando do while e a função rand. Todo o teste para encerramento de loop deve estar na condição do while. Um esqueleto do programa é dado como apoio.

  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <time.h>

int main () {

   int dado1,dado2, soma, adivinhacao, tentativas=1;

   /* initialize random seed: */
   srand ( 0 /*time(NULL)*/ );
   /* gera dado 1: */
   dado1 = rand() % 6 + 1;
   /* gera dado 2: */
   dado2 = rand() % 6 + 1;
   soma=dado1+dado2;
   /* implementar aqui */

} </syntaxhighlight>


AULA 16 - DIA 12/04/2018

Objetivos da Aula

  • Exercícios

Exercício 1 - NÃO USAR FUNÇÕES

Três pessoas fizeram um churrasco. Cada uma delas comprou no mercado alguns dos produtos, gastando um determinado valor. Faça um programa que permita entrar com o valor gasto por cada uma das pessoas. Na sequência o programa deve calcular e mostrar o total de gastos, a média por pessoa e o quanto cada uma delas deve receber ou pagar. O programa deve dizer por exemplo: pessoa 1 deve pagar xxx, pessoa 2 deve receber xxx, pessoa 3 não precisa pagar.

Exercício 2

Melhorar o programa anterior fazendo uma função que permita verificar se uma pessoa precisa pagar ou receber, substituindo o código no programa principal nesta parte. A função deve imprimir a mensagem devidamente. A função deve também retornar o valor a receber ou pagar (negativo se for valor devido).

 int testar_pessoa (float media_valor, float valor_pago, int pessoa) 

Exercício 3

Considere a fórmula para cálculo de combinações com N (ver https://pt.wikipedia.org/wiki/Combina%C3%A7%C3%A3o_(matem%C3%A1tica)#F%C3%B3rmula):

Elaborar duas funções: (i) uma que calcula e retorna o fatorial de um número e (ii) outra que utiliza a função do fatorial para calcular e retornar a combinação N k a k. Segue esqueleto do programa:

  1. include <stdio.h>

int fatorial(int numero) { } int combinacao(int N, int k) { }

main() {

 printf("Combinações 4 2 a 2 = %d\n", combinacao(4,2));
 printf("Combinações 5 2 a 2 = %d\n", combinacao(5,2));
 printf("Combinações 10 2 a 2 = %d\n", combinacao(10,2));
 printf("Combinações 10 5 a 5 = %d\n", combinacao(10,5));

} </syntaxhighlight> Combinatoria Saída

Exercício 4

Implementar uma função para calcular e retornar a soma de todos os números pares (positivos) compreendidos em uma dada faixa (inclusive os limites). A função deve retornar -1 caso o limite 2 seja menor que o limite 1. Ver protótipo abaixo:

  1. include <stdio,h>

int soma_pares(int lim1, lim2) { } main() {

 printf("Soma dos pares na faixa de 1 a 10 é %d\n", soma_pares(1,10));
 printf("Soma dos pares na faixa de 1 a 9 é %d\n", soma_pares(1,9));
 printf("Soma dos pares na faixa de 5 a 9 é %d\n", soma_pares(5,9));
 printf("Soma dos pares na faixa de 2 a 70 é %d\n", soma_pares(2,70));

} </syntaxhighlight>

Soma dos Pares

Exercício 5

Implementar uma função que calcula numericamente (usando loop) a integral definida da função da reta (ver [2]). Usar um comando while. A função deve ter o seguinte aspecto:

 float integral_reta (float a, float b, float lim_inf, float lim_sup, float step)
 {
 }

</syntaxhighlight> onde

a-> coeficiente angular
b-> coeficiente linear
lim_inf -> limite inferior da integração
lim_sup -> limite superiot da integração
step -> passo da integração

Exercícios Adicionais

Exercícios Adicionais


A fórmula de Heron permite calcular a área de um triângulo dado os 3 lados (a, b e c) :

onde

Construa uma função que permita calcular e retornar a área do retângulo dado os 3 lados. Use a função matemática sqrtf para calcular a raiz de um float (fazer man sqrtf para obter o manual.

  1. include <math.h>

float area_triang(float a, float b, float c) {

   /* Implementar aqui */

} main() {

   printf ("area para os lados 4.5 7.8 9.6 é %f\n" area_triang(4.5,7.8,9.6));

} </syntaxhighlight>

AULA 17 DIA 16/04/2018

  • AVALIAÇÃO 2 - Introdução a Programação C

AULA 18 DIA 19/04/2018

AULA 19 DIA 23/04/2018

Objetivos

  • uso do DEFINE
  • Exercícios sobre Vetores de Float e Inteiros

USO de DEFINE

O define é um comando do pré-processador do C. Observe abaixo como ele pode ser usado

 
#include <stdio.h>
#define PI 3.1416

main()
{
 
  float x; /* declaração de uma variável real */
  float y;  /* declaração de uma variável real */

  printf ("Entre com o valor de x ");
  scanf("%f",&x);

  y = 2*PI*x;
}
Observe que o define PI NÃO é uma variável. É simplesmente um texto que será substituído pelo número 3.1416 ANTES da compilação, em um processo que chamamos de PRÉ-COMPILAÇÃO.

Exercícios

  1. Considere que em um sistema de controle de acesso, as senhas de 11 alunos que acessam um laboratório são armazenadas em vetor de inteiros. O aluno para acessar fornece o seu identificador (user_id) que é um número inteiro de 0 a 10. No vetor está armazenada a senha de cada aluno na posição indexada pelo user_id. Faça no programa principal um programa que lê a senha e abre a porta caso a senha seja correta. Simule o abrir porta com um printf. Segue esqueleto do código. Considere que o vetor é inicializado de fábrica. Considere que o programa se encerra em uma sessão de acesso
    #include <stdio.h>
    
    int vetor_senhas[11]={234,210,149,21,5,78,97,535,1023,476,123};
    
    main()
    {
      int user_id, /* variável para armazenar o user_id fornecido */
          senha;   /* variável para armazenar a senha fornecida */
    
      printf("Entre com o user_id \n");
      scanf("%d", &user_id);
    
      printf("Entre com a senha \n");
      scanf("%d", &senha);
    
      
      /* fazer aqui o código que confere a senha - testar o limite do vetor antes de acessar!! */ 
    }
    
  2. Melhore o exercício anterior da seguinte forma:
    1. o programa permanece em loop infinito até que seja fornecido -1 quando ele se encerra.
    2. encapsular a função de leitura de user_id/senha e verificação e abertura da porta em uma função. Segue esqueleto do programa:
      #include <stdio.h>
        
      int vetor_senhas[11]={234,210,149,21,5,78,97,535,1023,476};
      
      /* Esta função recebe como parâmetro o user_id e verifica se deve abrir ou não a porta */
      /* esta função deve retornar de imediato caso o user_id seja inválido (fora da faixa) */
      void controlar_acesso(int user_id)
      {
       /* implementar a lógica de controle de acesso aqui */
      }
      
      main()
      {
        int user_id; /* variável para armazenar o user_id fornecido */ 
      
        do {
          printf("Entre com o user_id \n");
          scanf("%d", &user_id);
          controlar_acesso(user_id); 
        } while ( /* implementar condição*/ ); 
      }
      
  3. Melhorar o programa anterior prevendo um modo de funcionamento para administrar o vetor de senhas. Caso o user_id fornecido seja -2 ele entra em modo de administração de senhas. Ela deve permitir entrar com todo o vetor de senhas.
    #include <stdio.h>
      
    int vetor_senhas[11]={234,210,149,21,5,78,97,535,1023,476};
    
    /* Esta função recebe como parâmetro o user_id e verifica se deve abrir ou não a porta */
    /* esta função deve retornar de imediato caso o user_id seja inválido (fora da faixa) */
    void administrar_senhas()
    {
     /* implementar a lógica de controle de acesso aqui */
    }
    
    /* esta função deve permitir atualizar todo o vetor de senha */
    void controlar_acesso(int user_id)
    {
     /* implementar a lógica de controle de acesso aqui */
    }
    
    main()
    {
      int user_id; /* variável para armazenar o user_id fornecido */ 
    
      do {
        printf("Entre com o user_id \n");
        scanf("%d", &user_id);
        switch (user_id){
        case -1: break;
        case -2: administrar_senhas();
                 break;
        default: controlar_acesso(user_id);
                 break;
        }
      } while ( /* implementar condição de saída do loop  */ ); 
    }
    
  4. Considere que as notas de matemática de alunos de uma escola são armazenadas por bimestre em 4 vetores: bim1, bim2,bim3 e bim4. Suponha que um aluno é identificado por um número inteiro que servirá como índice destes vetores. Construir funções que retornam: (1) a média anual da turma, (2) o desvio padrão das médias anuais da turma, (3) a média anual de um aluno dado seu índice na tabela. Na função main imprimir a média de cada aluno, a média da turma e o desvio padrão () da turma.
    #define NUM_ALUNOS 6
    float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};
    float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};
    float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};
    float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};
    
    float media_aluno(int aluno)
    {
    
    }
    
    
    float media_turma()
    {
    }
    
    float desvio_padrao()
    {
    }
    
    main()
    {
     /* chamar aqui as funções e imprimir os retornos */
    
    }
    
  5. Para o exercício anterior, construir na função main um código que calcula o número de alunos que estão dentro da faixa determinada pelo desvio padrão.
soluções

ex.4

Solução:
#include <math.h>
#include <stdio.h>

#define NUM_ALUNOS 6
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};
 
float media_aluno(int aluno)
{
  float media;
  
  media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;
  
  return media;
}
 
 
float media_turma()
{
  int i;
  float media;
  
  media = 0;
  for (i=0;i<NUM_ALUNOS;i++)
      media = media + media_aluno(i);
      
  media = media/NUM_ALUNOS;
  
  return media; 
}
 
float desvio_padrao()
{
   float media, prod;
   int i;
      
   media = media_turma();
   
   prod=0;
   for (i=0;i<NUM_ALUNOS;i++)
     prod = powf(media_aluno(i)-media_turma(),2) + prod;
   prod = sqrt(prod/NUM_ALUNOS);
   
   return prod;
}
 
main()
{
   /* chamar aqui as funções e imprimir os retornos */
   printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));
   printf("Media Anual da Turma -> %.2f\n", media_turma());
   printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao());    
}

ex.5

main()
{
   float desvp,lim_sup,lim_inf,media,aux;
   int i,cont;
   /* chamar aqui as funções e imprimir os retornos */
   printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));
   printf("Media Anual da Turma -> %.2f\n", media=media_turma());
   printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());
    
   cont=0;
   lim_sup=media+desvp;
   lim_inf=media-desvp;
   for(i=0;i<NUM_ALUNOS;i++){
      aux = media_aluno(i);
      if (aux <= lim_sup && aux >= lim_inf)
          cont++;
   }
   printf("Número de alunos dentro da faixa do desvio -> %d\n",cont);   
}
soluções

ex.1

Solução:
#include <math.h>
#include <stdio.h>

#define NUM_ALUNOS 6
float bim1[NUM_ALUNOS]={5.5,3.7,10.0,8.5,9.6,6.6};
float bim2[NUM_ALUNOS]={4.5,2.3,9.0,7.5,9.3,7.0};
float bim3[NUM_ALUNOS]={5.5,1.7,10.0,8.0,9.0,7.6};
float bim4[NUM_ALUNOS]={6.5,1.2,10.0,7.8,9.6,5.6};
 
float media_aluno(int aluno)
{
  float media;
  
  media = (bim1[aluno]+bim2[aluno]+bim3[aluno]+bim4[aluno])/4;
  
  return media;
}
 
 
float media_turma()
{
  int i;
  float media;
  
  media = 0;
  for (i=0;i<NUM_ALUNOS;i++)
      media = media + media_aluno(i);
      
  media = media/NUM_ALUNOS;
  
  return media; 
}
 
float desvio_padrao()
{
   float media, prod;
   int i;
      
   media = media_turma();
   
   prod=0;
   for (i=0;i<NUM_ALUNOS;i++)
     prod = powf(media_aluno(i)-media_turma(),2) + prod;
   prod = sqrt(prod/NUM_ALUNOS);
   
   return prod;
}
 
main()
{
   /* chamar aqui as funções e imprimir os retornos */
   printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));
   printf("Media Anual da Turma -> %.2f\n", media_turma());
   printf("Desvio Padrão da Turma -> %.2f\n", desvio_padrao());    
}

ex.2

main()
{
   float desvp,lim_sup,lim_inf,media,aux;
   int i,cont;
   /* chamar aqui as funções e imprimir os retornos */
   printf("Media Anual do aluno 0 -> %.2f\n", media_aluno(0));
   printf("Media Anual da Turma -> %.2f\n", media=media_turma());
   printf("Desvio Padrão da Turma -> %.2f\n", desvp=desvio_padrao());
    
   cont=0;
   lim_sup=media+desvp;
   lim_inf=media-desvp;
   for(i=0;i<NUM_ALUNOS;i++){
      aux = media_aluno(i);
      if (aux <= lim_sup && aux >= lim_inf)
          cont++;
   }
   printf("Número de alunos dentro da faixa do desvio -> %d\n",cont);   
}

AULA 20 DIA 26/04/2018

Objetivos

  • Conceituar e operar strings através da indexação

Material de Referência


AULA 21 DIA 3/05/2018

Objetivos

  • Arranjos Multidimensionais no C

Material de Referência

AULA 22 DIA 7/05/2018

Objetivos

  • Arranjos Multidimensionais no C
  • exercícios

AULA 23 DIA 10/05/2018

Objetivos

  • Arranjos Multidimensionais no C
  • exercícios

Exercícios Adicionais

1.Implementar uma função para multiplicar duas matrizes 5x5. São fornecidos mA e mB e o resiltado é colocado em mC.

 void multiplicar_mat(float mA[5][5], float mB[5][5],float mC[5][5])

AULA 24 DIA 14/05/2018

Objetivos

  • estruturas

Linka para aula

https://wiki.sj.ifsc.edu.br/index.php/AULA_13_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

AULA 25 DIA 17/05/2018

  • Avaliação 3 - Funções, Vetores, Strings e Matrizes

AULA 26 DIA 21/05/2018

Objetivos

  • estruturas

Linka para aula

https://wiki.sj.ifsc.edu.br/index.php/AULA_13_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

AULA 27 DIA 24/05/2018

  • Introdução aos ponteiros

Material de Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_17_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

AULA 28 DIA 4/06/2018

Objetivos

  • Vetor de Ponteiros, Ponteiros para estruturas e Vetor de Ponteiros;

Aula de Referência

https://wiki.sj.ifsc.edu.br/index.php/AULA_19_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

AULA 29 DIA 7/06/2018

Objetivos

  • Alocação Dinâmica de Mempória
  • Exercícios sobre Ponteiros;

Referência

Aula Alocação Dinâmica

AULA 30 DIA 11/06/2018

  • Aula de Exercícios

Exercícios Selecionados

Exercícios Adicionais

Exercício 0 - Implementar uma função para armazenar uma sequência de números reais a serem fornecidos pelo teclado. A quantidade de números fornecidos é inicialmente fornecida na linha de comando. A função deve armazenar os números em uma tabela dinamicamente criada e deve computar a quantidade de números acima da média. Esta quantidade de números deve ser retornada pela função.


Exercício 1 - Verificar qual o erro do código abaixo. Propor uma solução SEM e COM alocação dinâmica de memória para resolver o problema.

main()
{
 struct TTeste {
    int x;
    int y;
 } *teste;

 t->y = 5;

}

O código correto está mostrado abaixo:

solução
#include  <stdio.h>

void main()
{
 struct TTeste {
    int x;
    int y;
}teste;

teste.y = 5;
printf("Valor de y %d\n",teste.y);

}

Exercício 2 - Qual o valor a ser impresso no printf do programa abaixo.

#include <stdio.h>
 
struct TTeste {
    int x;
    int y;
    struct TTeste *p;
}; 
 
main()
{
 
 struct TTeste x = {4,7,NULL};
 struct TTeste y = {10,8,NULL};
 
 struct TTeste *teste;
 
 x.p = &y;
 teste = &x;
 
 printf ("Valor = %d\n", teste->p->x);
}

Exercício 3

Considere uma tabela de usuários de um sistema de controle de acesso conforme código abaixo. Implemente as funções abaixo usando alocação dinâmica de memória. Observe que as entradas livres são iniciadas com NULL.

#include <stdio.h>

#define TAM_MAX 10

struct TEndereco {
  char *pRuaNumero;
  char *pCidade;
  char *pEstado;
};

struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */
{ 
  char *userID;
  char *senha;
  struct TEndereco *pEndereco;
} TabelaUsuarios[TAM_MAX]={
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                    };

/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */
/* ler dados com scanf */

int add_user()
{
}

/* remove o usuário - perguntar com scanf */
void del_user()
{
}

main()
{
 /* exemplo de uso */
 
}


solução
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define TAM_MAX 10
 
struct TEndereco {
  char *pRuaNumero;
  char *pCidade;
  char *pEstado;
};
 
struct TUsuario /* struct TUsuario é o nome do tipo que está sendo criado */
{ 
  char *userID;
  char *senha;
  struct TEndereco *pEndereco;
} TabelaUsuarios[TAM_MAX]={
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                   {NULL,NULL,NULL},
                    };
 
/* adiciona usuario - retorna 0 se tudo ok e -1 se não conseguiu alocar */
/* ler dados com scanf */
 
int add_user()
{
  char aux[100];
  int i;
  
  /* procurar a primeira entrada livre na tabela */
  for(i=0;i<TAM_MAX;i++) {
      if (TabelaUsuarios[i].userID==NULL)
          break;
  }
  
  if (i==TAM_MAX)
  	return -1;
  
  /* ler userid para variavel auxiliar */
  printf("Entre com o userID\n");
  scanf("%s", aux);  	
  
  if(   (TabelaUsuarios[i].userID = (char *) malloc(strlen(aux)+1))  == NULL) {
     return -1;
  }
  
  strcpy(TabelaUsuarios[i].userID, aux);

  printf("Entre com o senha\n");
  scanf("%s", aux); 
  
  if((TabelaUsuarios[i].senha = (char *) malloc(strlen(aux)+1)) == NULL) {
     free(TabelaUsuarios[i].userID);
     TabelaUsuarios[i].userID = NULL;
     return -1;
  }
       
  strcpy(TabelaUsuarios[i].senha, aux);

  if((TabelaUsuarios[i].pEndereco = (struct TEndereco *) malloc(sizeof(struct TEndereco))) == NULL) {
     free(TabelaUsuarios[i].userID);
     free(TabelaUsuarios[i].senha);  
     TabelaUsuarios[i].userID = NULL;
     TabelaUsuarios[i].senha = NULL; 
     return -1;    
  }
  
  printf("Entre com a rua\n");
  scanf("%s", aux); 

 if(  (TabelaUsuarios[i].pEndereco->pRuaNumero = (char *) malloc(strlen(aux)+1)) == NULL) {   
     free(TabelaUsuarios[i].userID);
     free(TabelaUsuarios[i].senha);  
     TabelaUsuarios[i].userID = NULL;
     TabelaUsuarios[i].senha = NULL; 
     free(TabelaUsuarios[i].pEndereco);
     TabelaUsuarios[i].pEndereco = NULL;   
     return -1;    
        
 } 
 strcpy(TabelaUsuarios[i].pEndereco->pRuaNumero, aux);   
 
 return 0;
}
 
/* remove o usuário - perguntar com scanf */
void del_user()
{
}
 
main()
{
 /* exemplo de uso */
}

Exercício 5

Seja a seguinte estrutura:

struct tipo_carro {
   char *marca;
   char *modelo;
   int  potencia;
};

typedef tipo_carro tcarro;


Implpementar as funções abaixo:

/* cria dinamicamente uma estrutura,
   preenche os dados dos campos
   e retorna um ponteiro para a estrutura criada
   Retorna NULL caso não consiga alocar área
 */
tcarro *ler_carro()
{
}

/*
  recebe dois ponteiros para estruturas do tipo carro e
  retorna -1 caso pelo menos um dos ponteiros seja NULL,
  retorna 0 se os modelos forem iguais
  e retorna 1 se os modelos forem diferentes */
int compara_modeloa(tcarro *p1, tcarro *p2)
{
}

/* libera a área da estrutura passada como parâmetro */
void deleta_estrutura(tcarro *p)
{
}

main()
{
  /*testar as funções aqui */
  /* criar dois carros */
  /* comparar o modelo dos dois carros. Testar o retorno */
  /* liberar a área das estruturas */
}

Exercício 6

Criar um programa para receber duas strings pela linha de comando. Elas devem ser armazenadas na estrutura fornecida abaixo. Use criação dinâmica para criar área de memória para estas strings.

struct tipo_param {
   char *ptr_arg1;
   char *ptr_arg2;
};

Exemplos Adicionais

https://www.programiz.com/c-programming/examples/dynamic-memory-allocation-largest

https://www.programiz.com/c-programming/examples/structure-dynamic-memory-allocation


AULA 31 DIA 14/06/2018

  • Objetivos

Avaliação 4: ponteiros, vetor de ponteiros, ponteiros para estruturas, alocação dinâmica de memória

AULA 32 DIA 18/06/2018

Objetivos

  • Uso de múltiplos arquivos no projeto;
  • Apresentação/Distribuição dos Projetos
  • Projetos com Múltiplos arquivos
  • Acesso ao sistemas de arquivos

Material de Referência

AULA 25 - Programação 1 - Engenharia

Apresentação/Distribuição dos Projetos

Sugestões Adicionais

Proposta 1

Considere um sistema de controle de ar condicionado que permite controlar salas de uma instituição. Elaborar uma estrutura para representar estas salas. Uma sala possui um nome e uma temperatura que deve ser controlada. Um administrador deve ter as seguintes funções:

  • inserir nova sala;
  • editar sala;
  • remover sala;
  • modificar temperatura da sala;

Duas salas não podem ter o mesmo nome. As temperaturas controladas somente podem estar na faixa de 0 a 30 graus.

Referências: https://wiki.sj.ifsc.edu.br/index.php/AULA_24_-_Programa%C3%A7%C3%A3o_1_-_Engenharia

Proposta 2

Construir um sistema de gerenciamento de estoques para o almoxarifado de tele. O sistema de ve permitir organizar componentes nas seguintes categorias:

  • CI, Transistor, Resistor, Capacitor, Indutor;
  • Dentro da categoria deve permitir descrever código (ex: BF547, 747 etc)
  • Quantidade de peças disponíveis

Proposta 3

Agenda pessoal de tarefas/reuniões;

Proposta 4

Lista de supermercado organizada em categorias

Proposta 5

Jogo da Velha com armazenamento de histórico de resultados.

Proposta 6

O que deve ter no Projeto

  • Deve ser registrado na Wiki. Os seguintes pontos devem ser abordados:
  • O programa deve usar acesso a arquivos;
  • O programa deve usar o conceito de struct/vetores e funções;
  • O programa deve subdividir problemas em subproblemas, encapsulando estes subproblemas em funções;
  • Utilizar diretivas de pré-compilação (por exemplo, defines);
  • Utilizar ponteiros e alocação dinâmica de memória;
  • Utilizar parâmetros em linha de comando;
  • Pelo menos 2 arquivos .c com .h e usar o make.

AULA 33 DIA 21/06/2018

  • Desenvolvimento do Projeto

AULA 34 DIA 25/06/2018

  • Desenvolvimento do Projeto
  • Acesso a arquivos;

AULA 22 - Programação 1 - Engenharia

AULA 35 DIA 28/06/2018

  • Desenvolvimento do Projeto
  • Recuperação parcial das avaliações anteriores;

AULA 36 DIA 2/07/2018

  • Apresentação/Defesa do Projeto

AULA 37 DIA 5/07/2018

  • Apresentação do Projeto

AULA 38 DIA 9/07/2018

  • RECUPERAÇÂO FINAL