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

Aulas teóricas

Artur Miguel Dias



Teórica 03 (08/out/2018)

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

Atividades que decorrer 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 pela definição de entidades.


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á exclusivamente 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 '}' têm de ser 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:

Como veremos melhor mais tarde, quando estudarmos as variáveis, 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 de atribuição não produz resultado. Só executa a ação de alterar o valor da variável r.

Na prática, os programadores de C costumam alterar os valores das suas variáveis usando instruções de atribuição e não expressões de atribuição. Fica menos confuso. Por exemplo, compare os dois seguintes pedaços de código. Eles são equivalentes, mas o segundo é um tudo nada mais difícil de perceber por causa da expressão de atribuição interna.

Ainda mais uma explicação sobre a instrução anterior. Repare que ela implementa duas atribuições e uma avaliação de expressão: primeiro a variável a recebe 14; depois faz-se a conta 14+5, finalmente a variável b recebe 19.

Instrução vazia

Em C é possível escrever uma instrução vazia, que não faz nada. Assim: Em algumas situações, não muito frequentes, é útil usar uma instrução vazia. Por exemplo, por vezes interessa-nos escrever um ciclo for com corpo vazio. O seguinte ciclo for procura o primeiro ano bissexto que se segue a 2014: 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 {}.

Uma instrução composta também se pode chamar de bloco.

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

Instruções de controlo

As instruções de controlo permitem exprimir a tomada de decisões e a execução de ciclos. Ou seja, permitem dizer qual o fluxo de execução do programa, ou seja controlar a ordem pela qual as coisas acontecem. Já usámos algumas instruções de controlo nos exemplos da aula teórica anterior, concretamente as instruções if, for e return.

Exemplos:


Exercício

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

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

Como vimos, o texto dum programa em C é constituído essencialmente pela definição de entidades, por expressões e por instruções. É isso que as regras sintáticas do C prevêm.

Agora, tendo nós um programa já escrito de acordo com as regras sintáticas do C, surge a questão de saber quais são os efeitos da execução desse programa.

Temos de saber que, durante a execução dum programa em C, há apenas dois tipos de atividade que decorrem:

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

Exercício

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



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 concreto ou um valor abstrato (i.e. que não é relevante conhecer). Além disso, em Matemática trabalha-se com equivalências intemporais.

Por seu lado, na linguagem C, uma variável é um conceito mais complexo, que demora mais tempo a explicar. Para começar, em C uma variável possui sempre um valor concreto. Além disso, existe a noção de passagem de tempo e o valor duma variável pode ir mudando ao longo do tempo.

Variáveis

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

Uma variável é uma pedaço de memória e tem um nome e um tipo associados. Numa variável podem guardar-se valores dum dado 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 se pode observar, é possível inicializar o valor duma variável no momento da sua definição. Se não se inicializar a variável, ela fica com um valor aleatório. Em ambos os casos, a variável fica com um valor.

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 duas formas: As atribuições têm a forma geral: e o operador = chama-se operador de atribuição.

A seguinte função exemplificativa efetua várias atribuições para calcular a seguinte soma alternada com n parcelas: 0 - 1 + 2 - 3 + 4 - 5 + .... Identifique todas as inicializações e atribuições dentro da funçã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. Todos estes operadores também são associativos à direita.

Por exemplo, a expressão genérica

é uma simples abreviatura de 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 Como se vê no terceiro caso, o 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 estranho 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 usar variáveis globais partilhadas.

Exemplo duma situação em que pode valer a pena definir uma variável global: num jogo de xadrez, é aceitá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 é aleatório e desconhecido e não podemos assumir nada acerca do valor dessa variável.

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

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 factorial, assumindo que esta foi chamada com o argumento 5.

Constantes

Em C, chama-se constante a um valor fixo ao qual foi 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.

Repare que uma constante é uma entidade, e como tal tem de ter um nome. A diretiva #define é mais um mecanismo de definição de entidades que estamos agora a aprender.

Convém que o nome das constantes seja escrito usando apenas letras maiúsculas. Esta é uma convenção tradicional no C, 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.

Porquê definir 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 a capacidade duma tabela, seria muito complicado andar à procura de todas as ocorrências do valor 256 para trocar por outro maior. É muito mais prático mudar o valor da constante no ponto da sua definição, sem ter de alterar mais nada no resto do programa.

Números mágicos

Chama-se número mágico a um número que aparece no meio do código sem que se perceba o seu significado.

Devemos evitar usar números mágicos.

Valores com significado especial no programa, devem ser definidos como constantes. Se lhes dermos um nome, o leitor do código já vai perceber o seu significado.

Um programa que usa uma constante

Enunciado

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

Solução

Qualificador const

Usar a diretiva #define para definir constantes em C é a forma clássica e funciona em todas as versões do C, mesmo as mais antigas.

Mas, na norma C90, foi introduzida uma outra forma de definir constantes, usando uma a nova palavra reservada const. Para definir uma constante desta forma, define-se primeiro uma variável global inicializada e depois acrescenta-se const antes da indicação do tipo.

Veja os seguintes exemplos:

É possível definir variáveis das duas formas, embora nos exemplos das aulas os docentes costumem usar a forma clássica.



#120