Mudanças entre as edições de "AULA 5 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(39 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
 
===Objetivos===
 
===Objetivos===
 
----
 
----
O aluno devera ser capaz de:
+
O aluno será capaz de:
  
 
* Descrever o processo de compilação.
 
* Descrever o processo de compilação.
Linha 56: Linha 56:
 
facilidade de uso.<br>
 
facilidade de uso.<br>
 
Fonte: [ftp://ftp.unicamp.br/pub/apoio/treinamentos/linguagens/c.pdf] - Centro de Computação - UNICAMP
 
Fonte: [ftp://ftp.unicamp.br/pub/apoio/treinamentos/linguagens/c.pdf] - Centro de Computação - UNICAMP
 
  
 
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico Completo]
 
*[http://pt.wikipedia.org/wiki/C_%28linguagem_de_programa%C3%A7%C3%A3o%29#Hist.C3.B3ria Histórico Completo]
Linha 70: Linha 69:
 
[[imagem:prog1_graduacao_fluxograma1.png|540px]]
 
[[imagem:prog1_graduacao_fluxograma1.png|540px]]
  
;Funcionamento
+
<b>Funcionamento:</b>
Quando o <b>gcc</b> é chamado, ele normalmente realiza
+
:Quando o <b>gcc</b> é chamado, ele normalmente realiza<br>
quatro etapas para gerar o código executável:
+
:quatro etapas para gerar o código executável:<br>
pré-processamento, compilação, montagem e ligação.
+
:pré-processamento, compilação, montagem e ligação.<br>
Sempre nesta ordem.
+
:Sempre nesta ordem.<br>
Os primeiros três estágios são feitos com base no
+
:Os primeiros três estágios são feitos com base no<br>
arquivo fonte de entrada. No final produz um
+
:arquivo fonte de entrada. No quarto estágio ele <br>
arquivo objeto.
+
:produz um arquivo objeto.<br>
  
  
Linha 84: Linha 83:
 
=== Compilando um  programa C===
 
=== Compilando um  programa C===
 
----
 
----
Neste curso usaremos o compilador da coleção [http://en.wikipedia.org/wiki/GNU_Compiler_Collection gcc] do [http://en.wikipedia.org/wiki/GNU_Project projeto GNU].
+
Usaremos 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].  
 
O manual completo do gcc pode ser encontrado [http://gcc.gnu.org/ aqui].  
  
Linha 93: Linha 92:
  
  
NOTA: crie um diretório para trabalhar nos exercícios que se seguem:
+
<b>NOTA</b>: crie um diretório para trabalhar nos exercícios que se seguem:
 
<code>
 
<code>
mkdir ExerciciosC
+
mkdir Exercicios
 
cd Exercicios
 
cd Exercicios
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Exemplo: Crie o programa abaixo o salve como teste.c  
+
<b>Exemplo:</b> Crie o programa abaixo o salve como teste.c  
  
 
<syntaxhighlight lang=c>  
 
<syntaxhighlight lang=c>  
Linha 112: Linha 111:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
*Compilar/gerar executável do programa usando o gcc:
+
<b>Compilar:</b> Gerar executável do programa usando o gcc:
  
 
   gcc teste.c -o teste
 
   gcc teste.c -o teste
  
*Testar o programa:
+
<b>Testar o programa:</b>
  
 
  ./teste
 
  ./teste
  
Nota: o atributo -o permite que se forneça um nome para o executável diferente de a.out
+
:Nota: o atributo <b>-o</b> permite que se forneça um nome para o executável diferente de <b>a.out</b>
  
 
É possível somente compilar (gerar código objeto):
 
É possível somente compilar (gerar código objeto):
Linha 131: Linha 130:
  
 
===Estrutura do Programa em C===
 
===Estrutura do Programa em C===
 
+
----
 
Um programa em C pode ser visto como um conjunto de uma ou mais funções:
 
Um programa em C pode ser visto como um conjunto de uma ou mais funções:
  
Linha 146: Linha 145:
  
 
No programa acima temos uma única função: a função ''main()''
 
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.  
+
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>
  
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.
+
:Nota: Não é possível colocar instruções fora de funções!
 
 
  Não é possível colocar instruções fora de funções!
 
  
 
Vamos ver algumas variações do Alo Mundo:
 
Vamos ver algumas variações do Alo Mundo:
Linha 185: Linha 186:
  
 
===Declarando variáveis inteiras e reais locais===
 
===Declarando variáveis inteiras e reais locais===
 
+
----
No "c" temos que declarar as variáveis que serão utilizadas no programa.  
+
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  
+
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.
+
(escopo local). Este conceito será estendido para blocos de códigos posteriormente.<br>
  
 
<syntaxhighlight lang=c>  
 
<syntaxhighlight lang=c>  
Linha 206: Linha 207:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
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:
+
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:
  
 
   +-----+
 
   +-----+
Linha 212: Linha 217:
 
   +-----+
 
   +-----+
  
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.
+
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.
  
 
   +-----+
 
   +-----+
Linha 221: Linha 227:
  
 
===Funções de entrada e saída de dados===
 
===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>
  
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.
 
  
  
Linha 246: Linha 256:
  
 
</syntaxhighlight>
 
</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="background: #ffdead;" | Código
 +
! style="background: #ffdead;" | 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 é:
 
Uma variação do uso do ''printf'' neste exemplo é:
Linha 269: Linha 310:
  
 
===Construindo expressões no C===
 
===Construindo expressões no C===
 +
----
 +
;Operador de Atribuição
  
====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>
O operador de atribuição ''='' é amplamente usado para atribuir valores para variáveis.
+
a média é calculada e colocada na variável média.
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.
 
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 292: Linha 334:
 
</syntaxhighlight>
 
</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. Veja o exemplo:
+
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>
 
<syntaxhighlight lang=c>
Linha 318: Linha 361:
 
Ver conceito de lvalue e rvalue [http://en.wikipedia.org/wiki/Value_%28computer_science%29 aqui].
 
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). A semântica da atribuição é copiar o valor computado a direita PARA a área referenciada a esquerda.
+
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====
+
;Operadores aritméticos
  
 
Os operadores aritméticos básicos são àqueles apresentados na aula anterior.
 
Os operadores aritméticos básicos são àqueles apresentados na aula anterior.
  
{| border="1" cellpadding="2"
+
{| border="1" cellpadding="5" cellspacing="0"  
!Operador
+
! style="background: #ffdead;" | Operador
!Significado
+
! style="background: #ffdead;" | Significado
|-
+
|-
| +
+
! style="text-align: center;" | +
|adição
+
|adição
|-
+
|-
| -
+
! style="text-align: center;" | -
|subtração
+
|subtração
|-
+
|-
|*
+
! style="text-align: center;" | *
|multiplicação
+
|multiplicação
|-
+
|-
|/
+
! style="text-align: center;" | /
|divisão
+
|divisão
|-
+
|-
|%
+
! style="text-align: center;" | %
|resto
+
|módulo
 +
|-
 +
! style="text-align: center;" | ++
 +
|incremento
 +
|-
 +
! style="text-align: center;" | --
 +
|decremento
 +
 
 
|}
 
|}
  
 
===Usando o gdb para depurar programas===
 
===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.  
+
È possível controlar a execução de um programa usando um outro programa, chamado depurador (debugger), para controlar a execução do primeiro.<br>
 +
A GNU desenvolveu o ''debugger gdb'' que é hoje amplamente utilizado por desenvolvedores.  
  
 
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]
 
[http://www.gnu.org/software/gdb/documentation/ Documentação do GDB]
Linha 370: Linha 422:
  
  
O flag -g garante que seja incorporada informação simbólica e textual para a depuração.
+
O flag <b>-g</b> garante que seja incorporada informação simbólica e textual para a depuração.
  
 
O gdb pode então ser chamado da forma:
 
O gdb pode então ser chamado da forma:
Linha 379: Linha 431:
 
um breakpoint na entrada da função pode-se fazer:
 
um breakpoint na entrada da função pode-se fazer:
  
  b main
+
(gdb) b main
  
 
Para executar o programa basta fazer o comando run:
 
Para executar o programa basta fazer o comando run:
  
  r
+
(gdb) r
  
 
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.
 
A execução para no ''breakpoint''. A instrução mostrada ainda vai ser executada.
Linha 389: Linha 441:
 
Para acompanhar o valor de variáveis pode-se colocá-las em display:
 
Para acompanhar o valor de variáveis pode-se colocá-las em display:
  
  display x
+
(gdb) display x
  display y
+
(gdb) display y
 +
 
  
 
Para execução passo a passo pode-se utilizar o comando next:
 
Para execução passo a passo pode-se utilizar o comando next:
  
  n
+
(gdb) n
  
Para ver o
 
  
 
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:
 
Para ver o conteúdo de uma variável pode-se ainda fazer o comando print:
  
  print x
+
  (gdb) print x
  
Exercícios
+
Podemos setar também o valor das variáveis com o comando <b>set variable</b> da seguinte maneira:
  
#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.
+
(gdb) set variable y=10
#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).
+
 
#Implementar um programa C que converte graus Farenheit em Celsius.
+
Para sair do gdb:
#Implementar um programa C que lê dois números inteiros e imprime o resto da média entre os dois.
+
 
#Implementar um programa C que calcula a área e comprimento de uma circunferência dado o raio.
+
(gdb) q
 +
 
 +
Confirme com ''Yes''.
 +
 
 +
<b>Exercícios - Implementar um programa em C para:</b>
 +
 
 +
#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.
 +
#Ler dois números inteiros e imprimir o resto da média entre os dois.
 +
#Calcular a área e comprimento de uma circunferência dado o raio.
 +
 
 +
 
 +
 
 +
{| border="1" cellpadding="5" cellspacing="0"
 +
! style="background: #cdc5bf;" | [[AULA 4 - Programação 1 - Graduação | << ]]
 +
! style="background: #cdc5bf;" | AULA 5
 +
! style="background: #cdc5bf;" | [[AULA 6 - Programação 1 - Graduação | >> ]]
 +
|}

Edição atual tal como às 09h39min de 11 de março de 2015

Objetivos


O aluno 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.

Exemplos:

  • Linguagem C
  • Fortran
  • Basic
  • C++
  • Pascal
  • Java
  • Python
  • PHP


Por que utilizaremos a linguagem C ?

É uma linguagem muito usada na implementação de produtos
eletrônicos, incluindo àqueles voltados às Telecomunicações.

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

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


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


Prog1 graduacao fluxograma1.png

Funcionamento:

Quando o gcc é chamado, ele normalmente realiza
quatro etapas para gerar o código executável:
pré-processamento, compilação, montagem e ligação.
Sempre nesta ordem.
Os primeiros três estágios são feitos com base no
arquivo fonte de entrada. No quarto estágio ele
produz um arquivo objeto.


Compilando um programa C


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 Exercicios cd Exercicios </syntaxhighlight>

Exemplo: Crie o programa abaixo o salve 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.

Nota: 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); 
}
A função printf() tem a seguinte forma geral


printf(string_de controle,lista_de_argumentos);


Código Significado
%d Interio
%f Float
%c Caractere
%% Coloca um % na tela


A função scanf() tem a seguinte forma geral


scanf(string_de controle,lista_de_argumentos);


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 = é utilizado 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
% módulo
++ incremento
-- decremento

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:

(gdb) b main

Para executar o programa basta fazer o comando run:

(gdb) 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:

(gdb) display x
(gdb) display y


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

(gdb) n


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

(gdb) print x

Podemos setar também o valor das variáveis com o comando set variable da seguinte maneira:

(gdb) set variable y=10

Para sair do gdb:

(gdb) q

Confirme com Yes.

Exercícios - Implementar um programa em C para:

  1. Receber a resistência em ohms de 2 resistores e então calcular a resistência série e paralela dos mesmos.
  2. 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).
  3. Converter graus Farenheit em Celsius.
  4. Ler dois números inteiros e imprimir o resto da média entre os dois.
  5. Calcular a área e comprimento de uma circunferência dado o raio.


<< AULA 5 >>