PRG1-2013-2-Engenharia Programação 1 - Engenharia

De MediaWiki do Campus São José
Revisão de 09h46min de 21 de agosto de 2013 por Eraldo (discussão | contribs) (→‎AULAS)
Ir para navegação Ir para pesquisar

PRG1 - PROGRAMAÇÃO I

DADOS DA DISCIPLINA

CARGA HORÁRIA

TOTAL: 72 HORAS (4 HORAS/SEMANA)

TEÓRICA: 36 HORAS

LABORATÓRIO: 36 HORAS

DIAS COM AULA: 36 (18 semanas)

PRÉ REQUISITOS: LÓGICA

EMENTA

Introdução a lógica de programação e algoritmos. Constantes, variáveis e tipos de dados. Operadores aritméticos, relacionais e lógicos. Concepção de fluxograma e pseudocódigo. Estruturas de decisão e estruturas de repetição. Introdução a linguagem de programação c. Vetores de caracteres e multidimensionais. Ponteiros e aritmética de ponteiros. Funções: chamada por valor e por referência. Chamada recursiva de funções. Tipos de dados compostos. Operação com arquivos textos e binários.

Bibliografia Básica

  • SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953

Bibliografia Básica

  • SCHILDT, Herbert. C Completo e Total - 3.ed. [S.l.]: Makron, 1997. 830p. ISBN 978-8534605953

Referências Complementares

AULAS

AULA 1 DIA 15/08/2013

AULA 1 DIA 15/08/2013

Como fazer um churrasco

Vamos observar atentamente este vídeo para iniciarmos o nosso curso de programação:

EmbedVideo received the bad id "U0xSYIXE9vo#!" for the service "youtube".
O que tem o churrasco com a nossa aula??
Trata-se de uma sequência de passos para execução  
de um objetivo.
EXERCÍCIO: Na forma textual, descrever as etapas
para fazer um bom churrasco.

O que é um algoritmo

Um algoritmo pode ser visto como uma sequência de instruções ou operações que resolvem um dado problema.

A receita de um bom churrasco corresponde 
a um algoritmo.

Como representar um algoritmo ?

Uma forma é representar na forma textual ordenada:

1.Comprar a carne
2.Colocar carvão na churrasqueira
3.Acender o carvão
4.Cortar a carne (picanha)
5.Espetar a carne
6.Salgar a carne
7.Colocar a carne na churrasqueira
8.Aguardar a carne ficar no ponto desejado
9.Bater a carne
10.Servir a carne

Outras formas são mais apropriadas para o uso no meio computacional:

  • pseudo-código
  • fluxogramas
A PENSAR: É possível mudar a ordem das instruções?
É possível paralelizar algumas instruções?

O problema da raposa, do milho e da galinha

EmbedVideo received the bad id "yifW9XueSaI#!" for the service "youtube".


EXERCÍCIO 1: Descrever na forma de etapas um 
solução para o problema da raposa, do milho e da galinha.
Note que somente é possível escrever o algoritmo se tivermos uma solução para o problema.
EXERCÍCIO 2: Descrever na forma de etapas uma 
solução para o problema dos canibais/padres.

Torres de Hanoi

Veja este jogo:

EmbedVideo received the bad id "hLnuMXO95f8#!" for the service "youtube".
EXERCÍCIO 3: Escrever na forma de etapas numeradas a solução para o problema 
das torres de Hanói usando 3 discos.
EXERCÍCIO 4: Escrever na forma de etapas numeradas a solução para o problema 
das torres de Hanói usando 4 discos.

E para quem são os algoritmos?

Uma receita de bolo é apropriada para ser executada 
por um ser humano. 
Um procedimento de como trocar um pneu também. 
Mas muitas vezes  queremos que o algoritmo seja executado 
por uma máquina! O computador é perfeito para isto!
Neste curso vamos nos concentrar no desenvolvimento de
algoritmos simples,  desde a sua concepção até  a sua  
implementação através de uma LINGUAGEM DE
PROGRAMAÇÃO -  a linguagem C , por exemplo.
Um PROGRAMA implementa um algoritmo. É o algoritmo 
materializado na forma de uma sequência de instruções.

Neste sentido, vamos entender minimamente o funcionamento de um computador (próxima aula)

A Descrição de Algoritmos usando Fluxogramas

Um fluxograma é uma linguagem semi-gráfica que pode ser utilizada 
para descrição de algoritmos.

Exemplo: O algoritmo de cálculo da média de dois números:

FluxogramaMediaDoisNumeros.jpg

Pontos fortes:

  • permite fácil entendimento do algoritmo, mesmo para pessoas leigas;

Ponto fraco:

  • a descrição das estrutura dos dados inexiste. O usuário deve descrevê-los a parte;
Observe no exemplo anterior que nada é dito sobre as variáveis NUM1, NUM2 e MEDIA.

Símbolos de um Fluxograma

TabelaSimbolosFluxograma.jpg

Teste de Mesa

TesteMesaMediaDoisNumeros.jpg

Constantes, Variáveis

Algoritmos operam sobre dados. O que podem ser estes dados?

Variáveis e Constantes

No exemplo anterior podemos identificar três variáveis NUM1, NUM2 e MEDIA Também podemos identificar uma CONSTANTE. O número 2.

  • Tipo de Variáveis:
    • Numéricas: reais e inteiras
Ex: NUM1 = 5.5 /* NUM1 é uma variável real */
    • Booleanas: true ou false
Ex: RES = TRUE /* RES é uma variável booleana */ 
    • caracter:
Ex: LETRA = 'A'
    • alfanumérica
Ex: FRASE = "ALO MUNDO"
E como estas variáveis armazenam os dados?? Depende da linguagem usada. Vamos passar
uma primeira noção do C

Expressões

Expressões sentenças que relacionam variáveis e constantes através de operadores matemáticos
e que RESULTAM em um valor.

A instrução do algoritmo:

MEDIA = (NUM1 + NUM2) / 2 

será considerada como uma expressão, que usa os operadores '+', '/' e '='

O operador '=' é um OPERADOR DE ATRIBUIÇÃO e indica que a expressão do lado direito
do '=' será atribuída a variável do lado esquerdo.
Neste curso, para mantermos coerência com a Linguagem C, consideraremos que a expressão
como um todo resulta no valor que é atribuído a variável.

Operadores Aritméticos

Os operadores aritméticos que usaremos neste curso serão os disponíveis no C:

Operador Significado
+ adição
- subtração
* multiplicação
/ divisão
% resto

O único operador desconhecido aqui é o resto, cujo significado é o resto entre dois númerosinteiros. Exemplo, se B possui o valor 9, então o resultado da atribuição na expressão:

A = B%2

será 1.

Representando o algoritmo com pseudo-código

ALGORITMO MEDIA VARIAVEIS

  NUM1: INTEIRO
  NUM2: INTEIRO
  MEDIA: REAL

INICIO

  LER NUM1
  LER NUM2
  MEDIA = (NUM1+NUM2)/2
  MOSTRAR MEDIA

FIM </syntaxhighlight>

Representando o algoritmo em linguagem C

#include <stdio.h>

main()
{
  int num1,num2;
  float media;

  scanf("%d",&num1);
  scanf("%d",&num2);
  media = (num1+num2)/2.0;
  prinft("media = %f\n", media);
}

Exercícios

1.Fazer um algoritmo na forma de fluxograma para calcular o valor y de uma função de uma reta dado x. Identifique quem são as variáveis e constantes do problema.

2.Fazer um algoritmo na forma de fluxograma para calcular o DELTA de uma equação do segundo grau, dados os coeficientes a e b. OBS:

3.Implementar um algoritmo na forma de fluxograma para calcular o ponto de intersecção de duas retas dados: a1,b1,a2 e b2.

4.Implementar um algoritmo na forma de pseudocódigo para calcular a conversão de CELSIUS para Farenheit.

5.Implementar um algoritmo na forma de pseudo-código para calcular a corrente sobre um resistor, dado a tensão V aplicada sobre ele. Considere um resistor com R constante de 1K ohm.

6.Incremente o exercício 5 para computar também a potência dissipada sobre o resistor.

7.Implementar um algoritmo na forma de pseudo-código para converter um ângulo em radianos para graus.


AULA 2 DIA 19/08/2013

AULA 2 DIA 19/08/2013

Objetivos

O aluno deverá saber utilizar expressões com:

  • Operadores Relacionais e Lógicos
  • Comandos de Decisão
  • Comandos de decisão com aninhamento

Operadores relacionais

Os operadores relacionais permitem realizar comparações entre dois operandos. Os operadores são os seguintes:

Operador Significado
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que
== igual a (se o operando a esquerda é maior que o da direita)
!= diferente de (se o operando a esquerda é diferente do da direita)

Note que com operadores lógicos podemos construir expressões tais como indicado no exemplo abaixo:

Exemplo: O algoritmo abaixo lê dois número inteiros para dentro das variáveis A e B e atribue a variável X o resultado da comparação do primeiro com o segundo. Se


ALGORITMO exemplo VARIÁVEIS:

  A: inteiro
  B: inteiro
  X: booleana

INÍCIO

  LER A
  LER B
  X = A>B
  MOSTRAR "A expressão A>B é ", X

FIM </syntaxhighlight>

Exercício: Fazer um fluxograma para o algoritmo acima.

Operadores Lógicos

É possível construir expressões ainda mais completas usando os operadores lógicos, apresentados abaixo:

Operador Significado
&& AND (E)
|| OR (OU)
! NOT (NÃO)


Uma expressão lógica tem como resultado da sua avaliação um valor VERDADEIRO ou FALSO. Para manter a coerência com a linguagem C qualquer expressão que resultar em 0 será considerada FALSA e se resultar em algo diferente de 0 será considerada verdadeira.

Exemplo: Considere uma variação do exercício anterior onde se compara 3 números inteiros: o primeiro com o segundo e o primeiro com o terceiro.

ALGORITMO exemplo VARIÁVEIS:

  A: inteiro
  B: inteiro
  C: inteiro
  X: booleana

INÍCIO

  LER A
  LER B
  LER C
  X = A>B E A < C
  MOSTRAR "A expressão A>B E A<C é ", X

FIM </syntaxhighlight>

Sheldon e o fluxograma da amizade

Vamos observar o fluxograma da amizade do Sheldom da série de TV "Big Bang Theory"

EmbedVideo received the bad id "VAX4jLlNo-Q#!" for the service "youtube".

Observe que a caixa no formato de LOSANGO permite testar uma condição: é uma caixa de decisão.

Controle do Fluxo de Execução: Estruturas de Decisão

Você deve ter observado que instruções simples (retângulo) possuem uma entrada e uma saída indicando que o fluxo de saída está claramente determinado.

Em algumas situações é necessário realizar algum teste sobre uma expressão e neste caso a execução é condicional. O teste da expressão pode resultar em VERDADEIRO e neste caso uma sequência de ações é realizada. Se o resultado for FALSO, uma outra sequência é realizada.

Seja o problema:

Problema do Controle de Acesso

PROBLEMA: Controlar o acesso a uma porta usando uma senha pré-configurada no sistema.

DADO DE ENTRADA: SENHA (variável alfanumérica)

DADO DE SAÌDA: porta aberta (simulado com msg "PORTA ABERTA") ou mensagem de "SENHA NAO CONFERE"

VARIÁVEIS: SENHA (tiipo alfanumérica)

Algoritmo usando Fluxograma

FluxogramaControleAcessoI.jpg

Algoritmo usando Pseudo-código

ALGORITMO ControleAcesso VARIÁVEIS

  SENHA: alfanumérica

INICIO

  LER SENHA 
  SE SENHA=="alfa" ENTÃO
         "Abrir a porta"
  SENÃO
         "Senha não confere"
  FIMSE
  IR PARA INICIO

FIM </syntaxhighlight>

Aninhamento de estruturas de decisão

Note que é possível aninhar estruturas de decisão. Seja o exemplo ebaico que lê três lados de um possível triângulo e imprime se NÂO é um triângulo, ou, caso seja, imprime se é EQUILÁTERO, ISÓSCELES ou ESCALENO.

ALGORITMO trangulo VARIAVEIS

 lado1,lado2,lado3: real

INICIO

 SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO
     MOSTRAR "não é triângulo"
 SENÃO
     SE lado1==lado2 E lado1==lado3 ENTÃO
        MOSTRAR "equilatero"
     SENAO
        SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO
            MOSTRAR "isósceles"
        SENÃO
            MOSTRAR "escaleno"
     FIMSE
 FIMSE

FIM </syntaxhighlight>

Exercícios

EXERCÍCIO 1:

Elaborar um fluxograma para o o problema de controle de acesso prevendo um procedimento para modificar a senha de acesso. Neste caso a senha deverá ser armazenada em uma variável. Para tanto, assuma a existência de uma senha de administrador fixa (por exemplo, "ADMIN"). Se a senha do administrador for fornecida, mostrar uma mensagem de ENTRE COM A NOVA SENHA de senha.

Prg1-ControleAcessoEx1.jpg

EXERCÍCIO 2:

Inserir a noção de UserID. Para abrir a porta o usuário entra com o UserId e com a senha. De fábrica o UserId é "alfa" e a senha "alfa". O UserId do admin é "admin" e a senha "beta".

EXERCÍCIO 3:

Inserir a noção de bloqueio do usuário. Se o usuário comum tentar 3 vezes e errar ele é bloqueado. A mudança de UserId deve desbloquear o usuário.

AULA 3 DIA 23/08/2013

AULA 3 DIA 23/08/2013

Objetivos

O aluno devera ser capaz de:

  • descrever o processo de compilação;
  • diferenciar código fonte, objeto e executável;
  • compilar, executar pequenos programa em C usando o gcc;
  • declarar e usar variáveis locais inteiras e reais;
  • usar as funções de entrada e saída: scanf() e printf.

Possíveis linguagens de programação

Na prática, é inviável desenvolver programas complexos em
LINGUAGEM DE MÁQUINA.
Em geral, utilizamos linguagens de ALTO NÍVEL que podem, de
alguma forma, serem traduzidas (compiladas) para a linguagem
de baixo nível ou interpretadas em tempo de execução.

Exemplo:

  • Linguagem C
  • Fortran
  • Basic
  • C++
  • Pascal
  • Java
  • Python
 Neste curso utilizaremos a linguagem C. Por que? 
 É uma linguagem muito usada na implementação de produtos 
 eletrônicos, incluindo àqueles voltados as Telecomunicações.

Introdução a linguagem C


EmbedVideo received the bad id "rGCbvqz6Kt4#!" for the service "youtube".

Visão geral do processo de compilação com gcc

  • Linguagens compiladas (ex: C) versus linguagens interpretadas (ex: Basic)

ProcessoCompilacao.jpg


Compilando um programa C

Neste curso usaremos o compilador da coleção gcc do projeto GNU. O manual completo do gcc pode ser encontrado aqui.

O processo de desenvolvimento do programa envolve:

  • Editar o programa com um editor de texto tal como o vi ou gedit;
  • Salvar o programa com a terminação ".c" (ou ".h" se for um cabeçalho);


NOTA: crie um diretório para trabalhar nos exercícios que se seguem:

mkdir ExerciciosC
cd Exercicios

Exemplo: salve o programa abaixo como teste.c

 

#include <stdio.h>

main()
{
  printf("Alo Mundo\n");
}
  • Compilar/gerar executável do programa usando o gcc:
 gcc teste.c -o teste
  • Testar o programa:
./teste
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out

É possível somente compilar (gerar código objeto):

 gcc -c teste.c

Observe os subprodutos listando com detalhes:

 ls -l


O conceito de variáveis e constantes

No exemplo anterior criamos três variáveis dar suporte ao programa: num1, num2 e num3. Variáveis podem ser vistas como um lugar que pode armazenar um valor. Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor. A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a natureza dos valores que podemos armazenar na CAIXA:

 +-----+
 | 1.5 |  num1
 +-----+

A variável num1 é do tipo float e, portanto, está apta a armazenar valores reais.

No C, para que possamos usar uma variável temos que definí-la. A forma de fazer isto é:

 float num1;

Declarando variáveis inteiras e reais locais

No "c" temos que declarar as variáveis que serão utilizadas no programa. Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente (escopo local). Este conceito será estendido para blocos de códigos posteriormente.

 
#include <stdio.h>

main()
{
  /* aqui começam as declarações de variáveis */
  int x; /* declaração de uma variável inteira */
  float y;  /* declaração de uma variável real */

  /* aqui começam as instruções do programa principal */ 
  x=5;   /* atribuindo o valor 5 (constante) a variável x */
  y=6.5; 
}

Funções de entrada e saída de dados

No "c" não existe instrução especialmente para leitura ou saída de dados. Este procedimento é realizado através de funções da biblioteca. Na sequência são mostradas duas funções "clássicas" de entrada e saída de dados.


 
#include <stdio.h>

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

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

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

  printf ("O valor de x é %d\n",x);
  printf ("O valor de y é %f\n",y); 
}

Comandos de decisão if() e if() else

 

#include <stdio.h>

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

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

  printf ("Entre com o valor de y ");
  scanf("%d",&y);

  if (y>x)
     printf("MSG1:y é maior que x\n");


  if (y>x)
     printf("MSG2:y é maior que x\n");
  else
     printf("MSG3:y é igual ou menor que x\n");
 
}

Outro exemplo, usando blocos:

 
#include <stdio.h>

main()
{
 
  int x,y,z; /* declaração de uma variável inteira */

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

  printf ("Entre com o valor de y ");
  scanf("%d",&y);

  if (y>x) {
     printf("MSG1: y é maior que x\n");
     z = y-x;
     printf("MSG2: Neste caso z =  %d\n", z);
  } else {
     printf("MSG3: y é igual ou menor que x\n");
     z = x-y;
     printf("MSG4: Neste caso z =  %d\n", z);
  }
 
}

Operador de Atribuição

#include <stdio.h>

main()
{
  int x,y,w;
  
  x=1;
  w=y=x+1;
  printf("x=%d y=%d w=%d\n", x,y,w);
  
  w=2*(y=x+1);
  printf("x=%d y=%d w=%d\n", x,y,w);

}

NOTE que:

 w=2*y=x+1;

produz um erro de compilação:

erro: lvalue required as left operand of assignment

Ver conceito de lvalue e rvalue aqui.

Operadores aritméticos

Já temos vistos expressões aritméticas com operadores básicos (+,-,*,/). Além destes operadores temos os seguintes:

Operador Significado
% resto de uma divisão
++ incrementa o operando em uma unidade
-- decrementa o operando em uma unidade

Exemplo 1

#include <stdio.h>
main()
{
   int x,y;
   printf("Entre com x\n");
   scanf("%d", &x);
   y=x%2;
   printf("resto x divido por 2 =%d\n",y);
}

Exemplo 2


#include <stdio.h>

main()
{
   int x,y;
   printf("Entre com x\n");
   scanf("%d", &x);
   y=x++;
   printf("Valor de y =%d e o valor de x = %d\n",y, x);
   x=1;
   y=++x;
   printf("Valor de y =%d\n",y);
}

Exemplo 3

#include <stdio.h>
main()
{
   int x,y;
   printf("Entre com x\n");
   scanf("%d", &x);
   y=x--;
   printf("Valor de y =%d\n",y);
}

Note que existe uma diferença entre

 y = x--;

e

 y = --x;

Exemplo 4

#include <stdio.h>

main()
{
  int x,y;

  x=1;
  y = x+++x++;
  printf("x=%d y=%d\n", x,y);

  x=1;
  y = ++x+x++;
  printf("x=%d y=%d\n", x,y);
}

Operadores Relacionais e Lógicos

Ver Operadores Relacionais e Lógicos

Tipo Char

Uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte.

Exemplo

#include <stdio.h>
 
main ()
{
  char x='A',y=65,w=0x41,z;
 
  scanf("%c",&z);
  printf("Caracter lido = %c\n",z);
  printf("Caracter lido = %d\n",z);
  printf("Caracter lido = %x\n",z);
  if (z==x)
      printf("Iguais 1\n");
  if (z==y)
      printf("Iguais 2\n");
  if (z==w)
      printf("Iguais 3\n");
}

ExercícioS

  1. Implementar um programa calculadora em que são fornecidos dois números reais e a operação na forma de um operador +,-,x e /. O programa deve mostrar o resultado da operação.
  2. Implementar uma função em C que recebe 5 caracteres e retorna o número de ocorrência do caracter 'a'.
  3. Implementar uma modificação da função do exercício anterior em que o caracter a ser verificado nas ocorrências, é repassado como sexto parâmetro.

Limpando sujeira do teclado

Indentação

Indentação Estilos

Exercícios

  1. Implementar uma FUNÇÂO que converte temperaturas de graus Fahrenheit (passado como parâmetro) para Celsius (retornado).
  2. Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.
  3. Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
  4. Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.
  5. Implementar duas FUNÇÕES em C para receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.
  6. Dado o código de cores dos resistores, fazer um programa que permite mostrar o valor de resistência em Kilo - ohms.Tabela de Cores
  7. Faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Para sair do programa o usuário deve digitar um número negativo. Valores inexistentes devem ser ignorados. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.
  8. Incrementar o programa anterior para calcular o total em reais equivalente as moedas lidas.
  9. Incrementar o programa anterior para que no final do programa uma mensagem seja dada para o usuário que possui mais do que 5 moedas de 50 e 3 moedas de 25 e mais do que 2 reais. A mensagem deve mandar o usuário comprar um X-salada.
  10. Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada;