MCO018703 2018 2 AULA03: mudanças entre as edições

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Douglas (discussão | contribs)
Douglas (discussão | contribs)
Linha 179: Linha 179:
| Por padrão é o mesmo que int1
| Por padrão é o mesmo que int1
|}
|}
]
<!--
== Compilando um  programa C==
Poderíamos usar o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].<br>
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui].
:Porém, vamos utilizar o CodeBlocks para ser utilizado nos computadores com Windows.
:[https://www.ime.usp.br/~jose/codeblocks/codeblocksintro.html Introdução ao CodeBlocks]
O processo de desenvolvimento do programa, independente do SO, envolve:
*Editar o programa com um editor de texto (codeblocks)
*Salvar o programa com a terminação ".c"
;NOTA: Crie uma pasta no computador e depois salve seus códigos fontes num pendrive para trabalhar nos exercícios.
;Exemplo: Crie o programa abaixo no CodeBlocks (File >> New >> Empty File) e salve como teste.c
<syntaxhighlight lang=c>
#include <stdio.h>
main()
{
  printf("Alo Mundo\n");
}
</syntaxhighlight>
;Compilar e executar: Gerar executável do programa usando o CodeBlocks (Build >> Build and run)
;Depois de testar: Você deve fechar a janela de execução teclando qualquer tecla ou no botão <Fechar>
==Estrutura do Programa em C==
Um programa em C pode ser visto como um conjunto de uma ou mais funções:
<syntaxhighlight lang=c>
#include <stdio.h>
main()
{
  printf("Alo Mundo\n");
}
</syntaxhighlight>
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.<br>
Todo programa C bem comportado deve ter um função ''main''.<br>
A primeira instrução desta função é o ponto de entrada do código do usuário.<br>
A primeira instrução do programa acima é uma chamada a uma função da biblioteca: o ''printf()''.<br>
Esta função permite mostrar dados no terminal.<br>
:Nota: Não é possível colocar instruções fora de funções!
Vamos ver algumas variações do Alo Mundo:
<syntaxhighlight lang=c>
#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");
}
</syntaxhighlight>
e
<syntaxhighlight lang=c>
#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");
}
</syntaxhighlight>
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.<br>
Se estas variáveis forem declaradas DENTRO da função elas serão "vistas" somente localmente <br>
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br>
<syntaxhighlight lang=c>
#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;
}
</syntaxhighlight>
No exemplo anterior criamos duas variáveis : ''x'' e ''y''. <br>
Lembrando que variáveis podem ser vistas como um lugar que pode armazenar um valor. <br>
Para simplificar ainda mais, podemos imaginar a variável como uma CAIXA onde podemos armazenar um valor.<br>
A CAIXA possui um nome e um tipo. O nome IDENTIFICA a CAIXA enquanto o tipo da variável determina a <br>
natureza dos valores que podemos armazenar na CAIXA:
  +-----+
  <nowiki>|</nowiki> 5  |  x
  +-----+
A variável ''x'' é do tipo ''int'' e, portanto, está apta a armazenar valores inteiros. <br>
Já a variável y é do tipo float e está apta a receber valores reais.
  +-----+
  <nowiki>|</nowiki> 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.<br>
Este procedimento é realizado através de funções da biblioteca.<br>
Na sequência são mostradas duas funções "clássicas" de entrada e saída <br>
de dados: o ''printf()'' - já apresentado - e o ''scanf()''. <br>
Esta última função permite entrada de dados.<br>
<syntaxhighlight lang=c>
#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);
}
</syntaxhighlight>
;A função <b>printf()</b> tem a seguinte forma geral
::<i>printf(string_de controle,lista_de_argumentos)</i>;
{| border="1" cellpadding="5" cellspacing="0"
! style="color:white;background: #1E90FF;" | Código
! style="color:white;background: #1E90FF;" | Significado
|-
! style="text-align: center;" | %d
|Interio
|-
! style="text-align: center;" | %f
|Float
|-
! style="text-align: center;" | %c
|Caractere
|-
! style="text-align: center;" | %%
|Coloca um % na tela
|}
;A função <b>scanf()</b> tem a seguinte forma geral
::<i>scanf(string_de controle,lista_de_argumentos)</i>;
Uma variação do uso do ''printf'' neste exemplo é:
<syntaxhighlight lang=c>
#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);
}
</syntaxhighlight>
==Construindo expressões no C==
;Operador de Atribuição
O operador de atribuição ''='' é utilizado para atribuir valores para variáveis.<br>
Veja o exemplo abaixo. Dois números do tipo float são lidos para as variáveis ''x'' e ''y'' e <br>
a média é calculada e colocada na variável média.
<syntaxhighlight lang=c>
#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);
}
</syntaxhighlight>
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. <br>
Veja o exemplo:
<syntaxhighlight lang=c>
#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);
}
</syntaxhighlight>
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 [http://en.wikipedia.org/wiki/Value_%28computer_science%29 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).<br>
A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.<br>
;Operadores aritméticos
Os operadores aritméticos básicos são àqueles apresentados na aula anterior.
{| border="1" cellpadding="5" cellspacing="0"
! style="color:white;background: #1E90FF;" | Operador
! style="color:white;background: #1E90FF;" | Significado
|-
! style="text-align: center;" | +
|adição
|-
! style="text-align: center;" | -
|subtração
|-
! style="text-align: center;" | *
|multiplicação
|-
! style="text-align: center;" | /
|divisão
|-
! style="text-align: center;" | %
|módulo
|-
! style="text-align: center;" | ++
|incremento
|-
! style="text-align: center;" | --
|decremento
|}
=Exercícios - 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.
#Ler 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).
#Converter graus Farenheit em Celsius: C = 5/9*(F-32)
#Ler dois números inteiros e imprimir o resto da média entre os dois (use módulo da divisão: %)
#Calcular a área e comprimento de uma circunferência dado o raio (area=pi*r<sup>2</sup> e circ=2*pi*r)
-->


=Referências=
=Referências=

Edição das 18h23min de 13 de agosto de 2018

1 Objetivos

O aluno será capaz de:

  • Compilar, executar pequenos programa em C usando o CodeBlocks.
  • Declarar e usar variáveis locais inteiras e reais.
  • Usar as funções de entrada e saída: scanf() e printf().

2 Introdução a linguagem C

A linguagem C foi criada por Dennis Ritchie, em 1972, no centro de Pesquisas da Bell Laboratories. Sua primeira utilização importante foi a reescrita do Sistema Operacional UNIX, que até então era escrito em assembly. Em meados de 1970 o UNIX saiu do laboratório para ser liberado às universidades. Foi o suficiente para que o sucesso da linguagem atingisse proporções tais que, por volta de 1980, já existiam várias versões de compiladores C oferecidas por diversas empresas, não sendo mais restritas apenas ao ambiente UNIX, como também compatível a outros sistemas operacionais. O C é uma linguagem de propósito geral, sendo adequada à programação estruturada. No entanto é mais utilizada para escrever compiladores, analisadores léxicos, bancos de dados, editores de texto, e sistemas embarcados.

A linguagem C pertence a uma família de linguagens cujas características são: portabilidade, modularidade, compilação separada, recursos de baixo nível, geração de código eficiente, confiabilidade, regularidade, simplicidade e facilidade de uso.

Fonte: [1] - Centro de Computação - UNICAMP

2.1 Comentários

Os comentários no programa fonte não têm função nenhuma para o compilador e serve apenas para aumentar a legibilidade e clareza do programa, podem ser inseridos com “//” que valem de onde começam até o fim da linha ou com “/*” e “*/”, sendo considerado comentário tudo entre “/*” e “*/”.

2.2 Identificadores

Um identificador é um símbolo definido pelo usuário que pode ser um rótulo (label), uma constante, um tipo, uma variável, um nome de programa ou subprograma (procedimento ou função). Normalmente devem começar com um caractere alfabético e não podem conter espaços em branco, podendo ter no máximo 32 caracteres, não havendo distinção entre maiúsculas e minúsculas.

2.3 Endentação

A endentação também não tem nenhuma função para o compilador e serve para tornar a listagem do programa mais claro dando hierarquia e estrutura ao programa.

2.4 Constantes

Constantes são valores declarados no início do programa e que não se alteram na execução do programa. Podem ser expressas em qualquer base numérica.

2.5 Variáveis

Uma declaração de variável consiste do nome do tipo de dado seguido do nome da variável. Todas as variáveis devem ser declaradas antes de serem usadas. As variáveis devem ser declaradas no início de cada função, procedimento ou início do programa.

2.6 Elementos definidos pela linguagem C:

  • Letras (alfanuméricas) Aa até Zz;
  • Dígitos (numéricos) - 0 até 9;
  • Operadores;
  • Tipos de dados.

2.7 Operadores e Símbolos Especiais

Operador Significado Exemplo
* multiplicação a = b * c
/ divisão a = b / c
% resto a = 13 % 3, a = 1
+ adição a = b + c
- subtração a = b - c
= atribuição a = b
== comparação compara dois operandos if(a == 10)
< menor que a < b
<= menor ou igual a <= b
> maior que a > b
>= maior ou igual a >= b
!= diferente de a=10, Se( a != 3) então verdadeiro
<< deslocamento de bit a esquerda 3 (00000011) << 1 = 6 (00000110)
>> deslocamento de bit a direita 4 (00000100) >> 1 = 2 (00000010)
& lógica E bit a bit 00000011 & 00000110 = 00000010
&& lógica E (AND) a=2, Se(a>1 && a<3) então verdadeiro
^ OU exclusivo bit a bit 00001100 ^ 00000110 = 00001010
| OU inclusivo bit a bit 00001101 = 0001101
||
lógica OU (OR)
a=4, Se( a>3 || a<5) então verdadeiro
! lógica Não (NOT) Se( ! a ) equivalente a Se( a == 0)
~ complemento bit a bit ~00010101 = 11101010
" delimitador de string "Arduino"

2.8 Tipos de dados

Um Tipo de Dado define o conjunto de valores que uma variável pode assumir e as operações que podem ser feitas sobre ela. Toda variável em um programa deve ser associada a um tipo de dado, conforme a tabela abaixo.

Tipo Descrição do tipo
Static Variável global inicializada com 0
int1 De_ne um n_mero com 1 bit faixa 0 ou 1
int8 ou Int De_ne um n_mero com 8 bits faixa de 0 a 127
int16 ou Long De_ne um n_mero com 16 bits faixa de 0 a 32.767
int32 De_ne um n_mero com 32 bits faixa de 0 à 3.4 E38
Char De_ne um caractere com 8 bits faixa Aa à Zz
Float De_ne um n_mero com 32 bits faixa de 3.4 E-38 à 3.4 E38
Short Por padrão é o mesmo que int1

3 Referências

[1] http://ordemnatural.com.br/pdf-files/CartilhadoArduino_ed1.pdf

[2] http://xbot.com.br/externo/OpneMoniot/Programando_Microcontroladores_PIC_Linguagem_C.pdf