Mudanças entre as edições de "PRG1-2014-1-Engenharia Programação 1 - Engenharia"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 1 561: Linha 1 561:
 
}
 
}
  
</syntaxhighlight>{{collapse top|AULA 7 DIA 6/03/2014}}
+
</syntaxhighlight>
 +
{{collapse bottom}}
 +
 
 +
{{collapse top|AULA 7 DIA 6/03/2014}}
  
 
== AULA 7 DIA 6/03/2014==
 
== AULA 7 DIA 6/03/2014==

Edição das 17h02min de 6 de março de 2014

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)

AVALIAÇÂO

Avaliações Semanais

Toda semana nas quinta feiras (aproximadamente 16 avaliações) - conceito se possível na hora

  • meses de avaliação (março a junho)
  • a última avaliação do mês terá caráter de recuperação
  • não será permitida a consulta na avaliação

PROJETO FINAL

  • grupos com 3 alunos;
  • avaliação individual.

RECUPERAÇÃO FiNAL

  • Ficará para recuperação o aluno que não conseguiu obter o conceito mínimo para passar em pelo menos uma das etapas avaliadas (mês) OU não obteve o sucesso no PROJETO FINAL
  • última aula do semestre
  • recuperação toda matéria

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.

CRONOGRAMA DE AULAS

Aula Data Horas Conteúdo Recursos
1 13/2 2 Aula introdução a lógica de programa. Conceito de algoritmos. Representação de algoritmos. Fluxograma. Variáveis e constantes. Expressões com operadores aritméticos e de atribuição.
2 14/2 2 Estruturas de decisão. Expressões com operadores lógicos e relacionais.
3 20/2 2 Introdução a programação C. Declaração de variáveis inteiras, reais e char no C. Uso do compilador gcc. Estruturas de decisçao com if e i eles. Expressões com operadores aritméticos, lógicos e relacionais. Operador de atribuição.
4 21/2 2 Lógica de programação: estruturas de repetição usando fluxogramas
5 27/2 2 Estruturas de repetição com a linguagem C: while, do while, for, goto. Uso do break e do continue. Uso do gdb em linha de comando.
6 28/2 2 Exercícios de Fixação
7 6/3 2 Estruturas de decisão. Comando switch. Outros comandos. Precedência de operadores no C.
8 7/3 2 Exercícios de Fixação.
9 13/3 2 Lógica de programação: quebrando problemas em subproblemas. Uso de subrotinas. Funções no C. Passagem de parâmetro e retorno de valor. AVALIAÇÂO 1
10 14/3 2 Conceito de vetores. Vetores no C
11 20/3 2 Exercícios de vetores. AVALIAÇÂO 2
12 21/3 2 Strings no C. Processamento de Strings. Exercícios
13 27/3 2 Strings no C. Processamento de Strings. AVALIAÇÂO 3
14 28/3 2 Strings no C. Processamento de Strings. Exercícios
15 3/4 2 Exercícios de Fixação; AVALIAÇÂO 4
16 4/4 2 RECUPERAÇÃO I
17 10/4 2 Operação com Matrizes no C
18 11/4 2 Exercícios com matrizes. AVALIAÇÃO 5
19 17/4 2 Estruturas
20 24/4 2 Exercícios. AVALIAÇÂO 6
21 25/4 2 Estruturas e vetores (Tabelas com estruturas). Typedef
22 8/5 2 Exercícios. AVALIAÇÃO 7
23 9/5 2 RECUPERAÇÃO II
24 15/5 2 Tópicos adicionais: diretivas de préprocessamento. Compilação condicional;
25 16/5 2 Ponteiros – parte 1
26 22/5 2 Exercícios. AVALIAÇÃO 8
27 23/5 2 Ponteiros – parte 2
28 29/5 2 Exercícios. AVALIAÇÃO 9
29 30/5 2 Uso do make. Apresentação do Projeto Final.
30 5/6 2 Operação com arquivos – parte 1
31 6/6 2 Exercícios. AVALIAÇÃO 10
32 12/6 2 Operação com arquivos – parte 2
33 13/6 2 Exercícios. AVALIAÇÂO 11
34 26/6 2 RECUPERAÇÃO III
35 27/6 2 Projeto Final – Avaliação
36 3/7 2 Aula de Recuperação
37 4/7 2 Aula de Recuperação
38 10/7 2 Aula de Recuperação
39 11/7 2 RECUPERAÇÂO FINAL
40 /
TOTAL 78

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 13/02/2014

AULA 1 DIA 13/03/2014

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?


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: .

2A.Apresente uma variação de solução do exercício (2) usando apenas duas variáveis para armazenamento de dados.

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.

8.O problema da raposa, do milho e da galinha

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


EXERCÍCIO 8A: 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 8B: Descrever na forma de etapas uma 
solução para o problema dos canibais/padres.

9.Torres de Hanoi

Veja este jogo:

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

10.Implementar um fluxograma para computar a área e o comprimento de uma circunferência dado o RAIO.

11.Implementar um fluxograma para ler um número complexo (ler por partes) no formato retangular e apresentar o módulo e o ângulo EM GRAUS do mesmo (formato polar). Suponha que você dispõe de uma função ATG() que calcula o arco em radianos de uma dada tangente.

12.Implementar um fluxograma para apresentar a velocidade no instante T (a ser fornecido) de um corpo de massa 1Kg que está inicialmente parado (em T=0) e submetido a força F também fornecida como entrada. Despreze atrito.

      Vi=0
      O--> 
      m=1Kg    F=1N
AULA 2 DIA 14/02/2014

AULA 2 DIA 14/02/2014

Objetivos

O aluno deverá saber utilizar comandos e expressões em pseudo-código e fluxogramas usando:

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

Expressões com operadores relacionais

Na aula anterior estudamos como construir expressões usando operadores aritméticos e o operador de atribuição. Vamos continuar este tópico aumentando o poder das expressões através dos operadores relacionais e lógicos.

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 à variável X o resultado da comparação do primeiro com o segundo. Observe que a variável X é do tipo booleano.


ALGORITMO exemplo VARIÁVEIS:

  A: inteiro
  B: inteiro
  X: booleana

INÍCIO

  LER A
  LER B
  X = A>B
  MOSTRAR "A condiçã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>

Exercício: Implementar em pseudo-código um algoritmo para ler um número inteiro positivo e imprimir TRUE ou FALSE se o número estiver dentro da faixa 5 e 10.

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.

EXERCÍCIO 4:

Implementar em pseudocódigo um algoritmo que lé dois números reais e imprime uma mensagem dizendo que a média entre estes dois números é maior que 5.


AULA 3 DIA 22/02/2014

AULA 3 DIA 22/02/2014

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

Estrutura do Programa em C

Um programa em C pode ser visto como um conjunto de uma ou mais funções:

 

#include <stdio.h>

main()
{
  printf("Alo Mundo\n");
}

No programa acima temos uma única função: a função main() Uma função é um pedaço de código delimitado por chaves e com um nome. Todo programa C bem comportado deve ter um função main. A primeira instrução desta função é o ponto de entrada do código do usuário.

A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o printf(). Esta função permite mostrar dados no terminal.

 Não é possível colocar instruções fora de funções!

Vamos ver algumas variações do Alo Mundo:

#include <stdio.h>
 
main()
{
  printf("Alo Mundo 1\n");
  printf("Alo Mundo 2\n");
  printf("Alo Mundo 3\n");
  printf("Alo Mundo 4\n");
  printf("Alo Mundo 5\n");
}

e

#include <stdio.h>

main()
{
  printf("Alo Mundo 1");
  printf("Alo Mundo 2\n");
  printf("Alo Mundo 3\n\n");
  printf("Alo Mundo 4\n");
  printf("Alo Mundo 5\n");
}

Observe nestes exemplos a ordem de execução das instruções e o uso do caracter de nova linha.

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; 
}

No exemplo anterior criamos duas variáveis : x e y. Lembrando que 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:

 +-----+
 | 5   |  x
 +-----+

A variável x é do tipo int e, portanto, está apta a armazenar valores inteiros. Já a variável y é do tipo float e está apta a receber valores reais.

 +-----+
 | 6.5 |  y
 +-----+

Observe que as instruções de atribuição acima envolvem constantes também.

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: o printf() - já apresentado - e o scanf(). Esta última função permite entrada 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); 
}

Uma variação do uso do printf neste exemplo é:

#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 e o valor de y é %f\n",x, y);
}

Construindo expressões no C

Operador de Atribuição

O operador de atribuição = é amplamente usado para atribuir valores para variáveis. Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis x e y e a média é calculada e colocada na variável média.

#include <stdio.h>

main()
{
  float x,y;
  float media;

  printf("Entre com x\n");
  scanf("%f", &x);
  printf("Entre com y\n");
  scanf("%f", &y);
  media = (x+y)/2;
  printf("Valor de media = %f\n",media);
}

Um diferencial do C com relação a outras linguagens é que a atribuição pode ser realizada várias vezes dentro de uma mesma instrução. Veja o exemplo:

#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 o código:

 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.

O problema é que A ESQUERDA do sinal de atribuição sempre deve existir uma referência a uma área de memória (normalmente uma variável). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.

Operadores aritméticos

Os operadores aritméticos básicos são àqueles apresentados na aula anterior.

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


Exercícios

  1. Implementar um programa 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.
    #include <stdio.h>
    
    main()
    {
     float r1,r2,r_serie,r_paralelo;
     
     printf("Entre com o resistor 1\n");
     scan("%f",&r1);
    
     printf("Entre com o resistor 2\n");
     scan("%f",&r2);
    
     r_serie = r1 + r2;
     r_paralelo = (r1+r2)/(r1*r2);
    
     printf("Equivalente série é %f e paralelo é %f\n", r_serie, r_paralelo);
    }
    
  2. Implementar um programa C que lê dois números inteiros para dentro de duas variáveis alfa e beta. O programa deve trocar os conteúdos destas variáveis(o que estiver em alfa para beta e vice-versa).
  3. Implementar um programa C que converte graus Farenheit em Celsius.
  4. Implementar um programa C que lê dois números inteiros e imprime o resto da média entre os dois.
  5. Implementar um programa C que calcula a área e comprimento de uma circunferência dado o raio.


AULA 4 DIA 21/02/2014

Objetivos

  • Utilizar os operadores relacionais e lógicos na programação C
  • Utilizar o comando de decisão if else

Operadores Relacionais e Lógicos

Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.

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)


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

Ver Operadores Relacionais e Lógicos

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);
  }
 
}
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.

Exemplo:

  if (2)
      printf("expressão sempre VERDADEIRA");
  if ('2')
      printf("expressão sempre VERDADEIRA");      
  if (1-1)
      printf("expressão sempre FALSA");
  if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
      printf("expressão sempre VERDADEIRA");

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");
}


Limpando sujeira do teclado

Indentação

Indentação Estilos

Exercícios

  1. Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.
  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. 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. Implemente o algoritmo na forma de um programa C.
  6. Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).
  7. Implementar um programa C para converter um ângulo em radianos para graus.
  8. Implementar um programa C que recebe os 3 coeficientes de uma equação do segundo grau e então determina as raízes da mesma.
AULA 5 DIA 27/02/2014

AULA 6 DIA 29/08/2013

Objetivos

O aluno deverá ser capaz de colocar estruturas de repetição especificadas em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.

Estruturas de Repetição

Existem 4 estruturas/comandos que permitem implementar loops ou repetições de blocos de código:

  • while()
  • do while()
  • for()
  • goto label
NOTA 1: Observe que repetir o código siginifica voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.

O comando while():teste da repetição no começo

O comando while permite implementar loops com controle no início:

#include <stdio.h>
main() 
{
  int contador;
  
  contador=0;
  while (contador<5) {  
     printf("valor do contador =  %d\n", contador);
     contador=contador+1;
  }
}

Variação do exemplo anterior:

#include <stdio.h>
main() 
{
  int contador;
 
  contador=0;
  while (contador<5) {  
	 printf("valor da expressão =  contador < 5 é %d\n", contador<5);  
     printf("valor do contador =  %d\n", contador);
     contador=contador+1;
  }
  printf("NO FINAL a expressão  contador < 5 é %d\n", contador<5);
}

A estrutura do comando, informalmente, é:

while (expressão)
  instrução_simples;

ou

while (expressão) {
  lista_de_instruções
} 

Vamos ver a correspondência do comando while com um fluxograma:

Fluxograma C Comentário
Fluxo5.jpg
while(contador<5) {
   printf("Entre com x\n");
   scanf("%f",&x);
   soma=soma+x;
   contador = contador + 1;
}
comando while() aplicado sobre um bloco de instruções. Note que se for uma instrução simples, as chaves podem ser omitidas.
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.

Comando do while: controle do loop no final

O comando do while() permite a repetição de uma ou mais instruções, com controle do loop no final. Isto permite que o bloco seja executado pelo menos uma vez.

#include <stdio.h>
main() 
{
  int contador;
  
  contador=0;
  do {  
     printf("valor do contador =  %d\n", contador);
     contador=contador+1;
  } while (contador<5);
}

A estrutura do comando, informalmente, é:

do 
  instrução_simples;
while (expressão);

ou

do {
  lista_de_instruções
} while (expressão); 
 
Fluxograma C Comentário
FluxoDoWhile-Eraldo.jpg
contador = 0;
do {
        scanf("%d",&x);
        soma=soma+x;
        if (soma>150) 
           y=z+x;
        contador++;
} while(contador<5);
Note que instruções while e if são tratadas como instruções normais que podem ser aninhadas normalmente em outros comandos.

Comando for()

O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição.

#include <stdio.h>

main()
{
  int i;
  
  for (i=0;i<10;i=i+1)
      printf("i =%d\n",i);
}

A estrutura do comando é:

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco)
    instrução_simples;

ou

for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) {
    lista_de_instruções
}
Fluxograma C Comentário
FluxogramaComandoFor-Eraldo.jpg
for(i=0; i<10; i++) {
  printf("Laço de número %d\n", i);
  if (i==5)
      printf("Este é o laço 5\n");
}
Observe que a expressão i=0 é executada SEMPRE e uma única VEZ, no início do comando.

A expressão i<10 é o controle do loop. Se FALSA o loop é encerrado. Ela é executada após a expressão de inicialização e, na sequência, no início de cada loop. A expressão i++ é executada no final de cada loop.

Aninhamento de loops

#include <stdio.h>
main()
{
  int i,j;
 
  for (i=0;i<3;i++) {
     for (j=0;j<4;j++) {
         printf("valor de j = %d\n", j);
     }
     printf("valor de i = %d\n", i);
  }
}

Comando goto

O comando goto é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.

Exemplo:

main()
{
   int i;

   i=0;

PONTO1:
   printf("Laço de número %d\n", i);
   i++;
   if (i<10)
       goto PONTO1;
}
Devido a ser uma instrução "desestruturante", em geral NÂO se recomenda o uso deste comando.

Em alguns casos de tratamento de erro pode ser interessante o uso do goto.

Leia um pouco mais sobre o goto aqui.

Loop Infinito

É possível implementar loops infinitos com qualquer uma das instruções acima.

Exemplo com comando for:

main()
{
   for(;;) {
        /* Este bloco se executará infinitamente */
   }
}

ou com o comando while:

main()
{
   while(1) {
        /* Este bloco se executará infinitamente */
   }
}
  1. Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.
  aaaaaaaaaa
  a        a
  aaaaaaaaaa


AULA 6 DIA 28/02/2014

Exercícios

1.Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.

  aaaaaaaaaa
  a        a
  aaaaaaaaaa
#include <stdio.h>

main()
{
  int i, j,num_linhas, num_colunas, margem;


  printf("Entre com linhas\n");
  scanf ("%d",&num_linhas);

  printf("Entre com colunas\n");
  scanf ("%d",&num_colunas);

  printf("Entre com margem\n");
  scanf ("%d",&margem);


  /* subproblema 1 */

  for (i=0;i<margem;i=i+1)
        printf(" ");
  for (i=0;i<num_colunas;i=i+1)
	printf("A");
  printf("\n");

  /*subproblema 3 */
  for(j=0;j<num_linhas-2;j++) {

        /*subproblema 2 */

  	for (i=0;i<margem;i=i+1)
		printf(" ");
  
  	printf("A");
  
  	for(i=0;i<num_colunas-2;i=i+1)
		printf(" ");

  	printf("A");
        printf("\n");
  }

  /* subproblema 1 */

  for (i=0;i<margem;i=i+1)
        printf(" ");
  for (i=0;i<num_colunas;i=i+1)
	printf("A");
  printf("\n");
  	
}

2.Construa um programa para desenhar a seguinte figura de forma parametrizável:

  AAAAAAAAAAAAAAAA
  AAAAAAAAAAAAAA
  AAAAAAAAAAAA
  AAAAAAAAAA
  AAAAAAAA
  AAAAAA
  AAAA
  AA
  BB
  BBBBB
  BBBBBBBB
  BBBBBBBBBBB
  BBBBBBBBBBBBBB
  BBBBBBBBBBBBBBBBB
  BBBBBBBBBBBBBBBBBBBB
  BBBBBBBBBBBBBBBBBBBBBBB

3.#Estude o programa (referência) abaixo:

/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
      int iSecret, iGuess;

      /* initialize random seed: */
        srand ( time(NULL) );

      /* generate secret number: */
       iSecret = rand() % 10 + 1;

      do {
          printf ("Guess the number (1 to 10): ");
          scanf ("%d",&iGuess);
          if (iSecret<iGuess) 
              printf ("The secret number is lower\n");
          else {
              if (iSecret>iGuess) 
                 printf ("The secret number is higher\n");
          }
      } while (iSecret!=iGuess);

      printf ("Congratulations!\n");
      return 0;
}
Estude também o significado das instruções:
 srand ( time(NULL) );
 iSecret = rand() % 10 + 1;

4.Sobre o exercício 3, implemente uma versão usando o comando while().

5.Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número.


AULA 7 DIA 6/03/2014

AULA 7 DIA 6/03/2014

Objetivos

  • Uso do break e do while;
  • uso do gdb
  • uso da biblioteca matemática.

Uso de break para sair de loops

Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada. É possível sair de um loop na força bruta usando a instrução break:

#include <stdio.h>
main()
{
  int i,j;

  for (i=0;i<10;i++) {
     if (i==5)
       break;
  }
  printf("valor de i=%d\n", i);
}
AULA 7 DIA 6/03/2014

AULA 7 DIA 6/03/2014

Note que o break sempre sai do loop mais próximo a ele.

#include <stdio.h>
main()
{
  int i,j;

  for (i=0;i<3;i++) {
     for (j=0;j<4;j++) {
         if (j==1) { 
             break;
         }
         printf("valor de j = %d\n", j);
     }
     if (i==2)
         break;
     ("valor de i = %d\n", i);
  }

}

Uso do continue para prosseguir no início do loop

#include <stdio.h>
main()
{
  int i,j;

  for (i=0;i<3;i++) {
     if (i==1) { 
         continue;
     }
     printf("valor de j = %d\n", j);
     for (j=0;j<4;j++) {
         if (j==1) { 
             continue;
         }
         printf("valor de j = %d\n", j);
     }
  }

}

Usando o gdb para depurar programas

È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro. A GNU desenvolveu o debugger gdb que é hoje amplamente utilizado por desenvolvedores.

Documentação do GDB

Seja o programa armazenado no arquivo teste.c:
#include <stdio.h>

main()
{
  int x,y;
  
  x = 2;
  y = 0;
  while (y<5)
     x++;
  printf ("Valor de x = %d\n",x);
}

Para que um programa possa ser depurado, devemos compilá-lo da forma:

 gcc -g teste.c -o teste


O flag -g garante que seja incorporada informação simbólica e textual para a depuração.

O gdb pode então ser chamado da forma:

 gdb teste

Um breakpoint pode ser colocado em qualquer linha ou entrada de função do programa. Para colocar um breakpoint na entrada da função pode-se fazer:

 b main

Para executar o programa basta fazer o comando run:

 r

A execução para no breakpoint. A instrução mostrada ainda vai ser executada.

Para acompanhar o valor de variáveis pode-se colocá-las em display:

 display x
 display y

Para execução passo a passo pode-se utilizar o comando next:

 n

Para ver o

Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:

print x

Usando funções da biblioteca matemática

Para usar as funções matemáticas da biblioteca padrão, fazer os seguintes passos:

  • No arquivo-fonte incluir o header math.h da biblioteca matemática:
 
#include <stdio.h>
#include <math.h>

main()
{
 
  float x,y; /* declaração de duas variáveis reais */

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

  y = sqrtf(x);
  printf ("Raiz de x = %lf", y);
}

NOTA: a maior parte de parâmetros e valores de retorno das funções matemáticas são reais de dupla precisão (double).

  • Compilar e linkar o arquivo da forma:
 gcc ex1.c -o ex1 -lm

EXERCÍCIOS

  1. Faça uma versão "politicamente incorreta" do programa de adivinhação da aula passada, Faça um loop infinito com o do while() e use uma instrução goto para sair do loop.
    /* rand example: guess the number */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main ()
    {
          int iSecret, iGuess;
     
          /* initialize random seed: */
          srand ( time(NULL) );
     
          /* generate secret number: */
          iSecret = rand() % 10 + 1;
    
          do {
              printf ("Guess the number (1 to 10): ");
              scanf ("%d",&iGuess);
              if (iSecret<iGuess) 
                  printf ("The secret number is lower\n");
              else {
                  if (iSecret>iGuess) 
                     printf ("The secret number is higher\n");
              }
              if (iSecret==iGuess) /* se acertou salta para FIM */
                  goto FIM;
          } while(1); 
     
    FIM:  printf ("Congratulations!\n");
          return 0;
    }
    
  2. Ainda sobre o exercício 1, implemente uma versão usando o comando while().
    /* rand example: guess the number */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main ()
    {
          int iSecret, iGuess;
     
          /* initialize random seed: */
          srand ( time(NULL) );
     
          /* generate secret number: */
          iSecret = rand() % 10 + 1;
    
          /* coloca um valor em iGuess que nunca será inserido pelo usuário */
          iGuess = -1;
    
          while (iSecret!=iGuess) {
              printf ("Guess the number (1 to 10): ");
              scanf ("%d",&iGuess);
              if (iSecret<iGuess) 
                  printf ("The secret number is lower\n");
              else {
                  if (iSecret>iGuess) 
                     printf ("The secret number is higher\n");
              }
          } 
     
          printf ("Congratulations!\n");
          return 0;
    }
    
  3. Ainda sobre o exercício 1, implemente uma versão usando loop infinito e o comando break;
    /* rand example: guess the number */
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    int main ()
    {
          int iSecret, iGuess;
     
          /* initialize random seed: */
          srand ( time(NULL) );
     
          /* generate secret number: */
          iSecret = rand() % 10 + 1;
    
          do {
              printf ("Guess the number (1 to 10): ");
              scanf ("%d",&iGuess);
              if (iSecret<iGuess) 
                  printf ("The secret number is lower\n");
              else {
                  if (iSecret>iGuess) 
                     printf ("The secret number is higher\n");
              }
              if (iSecret==iGuess) /* se acertou sai do loop */
                  break;
          } while(1); 
     
          printf ("Congratulations!\n");
          return 0;
    }
    
AULA 8 DIA 7/03/2014

AULA 8 DIA 7/03/2014