Introdução à Programação B (2017/2018)

Aulas teóricas

Artur Miguel Dias



Teórica 03 (09/out/2017)

Elementos que se podem escrever nos programas: Definições de entidades; Expressões; Instruções.

Atividades que ocorrem durante a execução dum programa: Avaliação de expressões; Execução de Ações

Variáveis e Atribuições.
Constantes.

Aula de hoje

A aula de hoje fornece-nos conceitos que ajudam a aprofundar a compreensão dos programas que vimos nas aulas anteriores. Também nos vai ajudar a escrever os próximos programas.

Convém estudar esta aula e seguir o seu texto, examinando ao mesmo tempo os programas das aulas anteriores.



Elementos que se podem escrever nos programas: Definições de entidades; Expressões; Instruções

A linguagem C é relativamente grande, mas convém que se perceba que o que a linguagem oferece são construções para ajudar o programador a:

Estes três tipos de elementos cobrem quase tudo o que pode aparecer escrito num programa em C. Vamos estudá-los, em sucessão, começando pelas definições.


Entidades

Uma entidade é um conceito individualizado que o programador usa para exprimir as suas ideias e organizar um programa.

As categorias de entidades mais importantes suportadas pela linguagem C são as seguintes:

Cada entidade que o programador decida usar precisa de ser definida usando sintaxe própria.

Além disso, o programador tem de dar um nome a essa entidade: em C, todas as entidades têm nome.

Eis algumas definições de entidades, neste caso de algumas variáveis tipo inteiro e de tipo real:


Expressões

Uma expressão é um pedaço de código que pode ser avaliado para produzir um resultado. O conceito de avaliação está ligado às expressões.

Exemplos de expressões:

Em C, para além de produzirem resultados, algumas expressões também executam ações. Se avaliarmos a expressão abaixo, o resultado é 34. Mas, durante a avaliação também é executada a ação de colocar o valor 33 na variável v:


Instruções

Uma instrução (ou comando) é um pedaço de código que executa ações. Uma instrução nunca produz um resultado, só executa ações, como por exemplo mudar o valor duma variável, fazer uma escrita no ecrã, fazer uma leitura do teclado

Exemplos de instruções:

Vamos agora ver alguns detalhes gerais sobre a sintaxe das instruções em C:

O terminador ;

Todas as instruções que não terminam por '}' são terminadas por um ponto e vírgula ';'. É obrigatório!

O terminador ';' também serve para converter uma expressão numa instrução. Para exemplificar, considere a seguinte expressão:

Esta expressão executa uma ação (altera o valor da variável r) e, ao mesmo tempo, produz um resultado (o valor 3.14159).

Mas, colocando um ';' no final, obtém-se uma instrução pura, assim:

Esta instrução não produz resultado. Só executa a ação de alterar o valor da variável r. Podemos dizer que, neste caso, o ';' obriga a ignorar o resultado.

Instrução vazia

Em C é possível escrever uma instrução vazia, que não faz nada. Faz-se assim: No seguinte exemplo, o ciclo for executa repetidamente a instrução vazia até descobrir o próximo ano bissexto a partir de 2014: Ainda outra maneira de escrever a instrução vazia:

Instrução composta (bloco)

É possível criar uma instrução composta a partir de duas ou mais instruções, usando chavetas {}.

A uma instrução composta também se pode chamar bloco.

No seguinte exemplo, o uso das chavetas é essencial. Retirando as chavetas, o comportamento do código mudaria completamente. Explique!

Instruções de controlo

São instruções que exprimem a tomada de decisões ou a execução de ciclos. Já vimos algumas delas nos exemplos da aula anterior. Exemplos:

O return também é considerado uma instrução de controlo.


Exercício

No seguinte programa, identifique as entidades, as expressões e as instruções:

Atividades que ocorrem durante a execução dum programa: Avaliação de expressões; Execução de Ações

Uma coisa é saber o que se pode escrever num programa: entidades, expressões e instruções. Outra coisa é saber o significado desse programa, ou seja o que acontece quando um programa é executado.

Durante a execução dum programa em C há dois tipos de atividade que ocorrem:

Nada mais acontece durante a execução dum programa.

Exercício

Explique, a passo a passo, quais as atividades que ocorrem durante a execução do programa anterior, que contém a função hipotenusa.



Variáveis e Atribuições

O objetivo desta secção é explicar de forma exaustiva o que são variáveis em C, para que servem, e como se usam!

Você já conhece a noção de variável da Matemática. Em Matemática uma variável representa um valor, que pode ou não estar concretizado, ser ou não ser conhecido.

Mas, na linguagem C, uma variável é um conceito mais complexo, que demora mais tempo a explicar. Vamos a isso!

Variáveis

Os programas processam dados armazenados na memória do computador.

Uma variável é uma zona de memória e tem um nome e um tipo associados. Numa variável podem guardar-se valores, todos do mesmo tipo. Por exemplo, numa variável inteira podem guardar-se valores inteiros, numa variável real podem guardar-se valores reais, etc.

Eis algumas definições de variáveis. Como pode observar, é possível inicializar o valor duma variável no momento da sua definição. (Se não se inicializar uma variável, ela fica com um valor aleatório.)

Espaço ocupado por uma variável

Valores de tipo diferente necessitam de uma quantidade de espaço em memória diferente. A linguagem C especifica restrições mínimas para cada tipo de valores, embora normalmente as implementações concretas excedam esses mínimos:

Valor duma variável

Em cada momento da execução de um programa, chamamos valor de uma variável ao valor contido na zona de memória que lhe corresponde.

Alterar o valor duma variável: leituras e atribuições

O valor de uma variável pode ser alterado em qualquer momento, de diversas formas. Eis as duas formas mais diretas de alterar o valor duma variável: Como se pode ver atrás, as atribuições têm a forma geral: O operador = chama-se operador de atribuição.

Atribuições sucessivas

Uma expressão de atribuição altera o valor duma variável, mas também produz um resultado: o resultado é o valor que ficou na variável atribuída. É por isso que, em C, são possíveis atribuições sucessivas, em cascata, como no seguinte exemplo que atribui o valor 10 a todas as variáveis indicadas: O operador = é associativo à direita, o que significa que a expressão anterior é equivalente a:

Operadores de atribuição

Para além do operador =, o C tem mais operadores de atribuição. Aqui estão eles: Estes operadores constituem simples abreviaturas, que combinam o operador básico de atribuição = com um conjunto limitado de operações binárias. Por exemplo, a expressão é uma simples abreviatura de Por exemplo, o seguinte código é equivalente a

Operadores de incremento e decremento

Para incrementar e decrementar variáveis pode fazer-se assim ou assim ou ainda assim O C oferece dois operadores específicos para incrementar e decrementar: Vamos analisar primeiro o operador de incremento. Para incrementar uma variável v usando ++, podem usar-se duas formas distintas: pré-incremento ou pós-incremento Ambas as formas somam uma unidade ao valor da variável v. Mas há uma diferença subtil entre as duas formas. As duas expressões produzem um resultado, e é aí que reside a diferença: Por exemplo, o seguinte código produz os valores 7 5 7 Tudo o que se disse se aplica, com as devidas alterações às duas formas de usar o operador --: pré-decremento ou pós-decremento:

Variáveis locais e variáveis globais

Uma variável local é uma variável definida dentro duma função. Só é conhecida dentro dessa função, desde o ponto da definição, até ao final da função. Até agora, nos nossos exemplos, temos definido apenas variáveis locais.

Uma variável global é uma variável definida fora de qualquer função. Pode ser usada do ponto da definição em diante, inclusivamente dentro de várias funções.

Eis um pequeno programa onde se usa uma variável global g. Qual a saída deste programa?

Só devemos usar definir uma variável global se existir uma forte razão para isso. Como as variáveis globais podem ser lidas e alteradas em praticamente qualquer parte do programa, elas tendem a diminuir a legibilidade dos programas, já que fica complicado abarcar todas as suas utilizações.

É melhor que as funções comuniquem umas com as outras através de parâmetros, em vez de ser através de variáveis globais partilhadas.

Exemplo duma situação em que pode valer a pena definir uma variável global: num jogo de xadrez, é defensável guardar o tabuleiro do jogo numa variável global, pois quase todas as funções do programa precisam de mexer no tabuleiro.

Inicialização

Quando uma variável é definida e inicializada no ponto da definição, assim o seu valor fica definido. Isto aplica-se tanto a variáveis locais como a variáveis globais.

Também podemos inicializar uma variável usando a operação de leitura scanf e a operação de atribuição.

Variáveis com valor indefinido

Quando uma variável é definida mas não inicializada no ponto da definição, assim o que acontece depende do género de variável: Indefinido quer dizer que o valor da variável é desconhecido e não podemos assumir nada acerca do valor dessa variável.

O valor duma variável indefinida não deve ser consultado em caso algum, por seu um valor imprevisível e desconhecido, sem interesse nenhum!

Um programa que muda o valor de variáveis

Enunciado

Desenvolva um programa que calcule o fatorial dum número não negativo.

Solução

Eis a evolução do valor das variáveis i e fact, durante a execução da função fatorial, assumindo que esta foi chamada com o argumento 5.

Constantes

Em C, chama-se constante a um valor fixo ao qual tenha sido dado um nome. (Um valor fixo sem nome, por exemplo 12.567, é tecnicamente designado de "literal").

As constantes são definidas globalmente, usando a diretiva #define do pré-processador do C.

Convém que o nome das constantes seja escrito usando apenas letras maiúsculas. Esta é uma convenção habitual que permite identificar imediatamente o uso das constantes no meio do código.

Eis alguns exemplos de definição de constantes:

Repare uma constante pode ser definida com base noutras constantes.

A definição de constantes num programa é importante, porque ajuda a tornar os programas mais legíveis. Em geral, dar nomes às coisas, ajuda a tornar os programas mais legíveis (desde que os nomes sejam bem escolhidos).

Também facilita a futura mudança dum valor que é usado em várias partes do programa. Por exemplo, para aumentar o grau de precisão de 3.1415926, seria muito complicado andar à procura desse valor em todo o programa, para fazer a modificação. É muito mais prático mudar o valor da constante, no ponto da sua definição.

Um programa que usa uma constante

Enunciado

Desenvolva um programa que calcule a área dum círculo, a partir do seu raio.

Solução



#100