O documento introduz conceitos básicos de programação como variáveis, estruturas de controle e o primeiro programa "Olá Mundo". Explica o que é uma variável e como trocar valores entre variáveis através de atribuições diretas ou expressões matemáticas.
O documento introduz conceitos básicos de programação como variáveis, estruturas de controle e o primeiro programa "Olá Mundo". Explica o que é uma variável e como trocar valores entre variáveis através de atribuições diretas ou expressões matemáticas.
O documento introduz conceitos básicos de programação como variáveis, estruturas de controle e o primeiro programa "Olá Mundo". Explica o que é uma variável e como trocar valores entre variáveis através de atribuições diretas ou expressões matemáticas.
A R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos
os primeiros conceitos de programação, existentes em todas as linguagens de programação
modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. PaA R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos os primeiros conceitos de programação, existentes em todas as linguagens de programação modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. PaA R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos os primeiros conceitos de programação, existentes em todas as linguagens de programação modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. PaA R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos os primeiros conceitos de programação, existentes em todas as linguagens de programação modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. PaA R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos os primeiros conceitos de programação, existentes em todas as linguagens de programação modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. PaA R T E I – V A R I Á V E I S E E S T R U T U R A S D E C O N T R O L O Na Parte I são introduzidos os primeiros conceitos de programação, existentes em todas as linguagens de programação modernas. A leitura atenta e pausada é essencial para a compreensão destes conceitos que embora aparentemente simples, a sua não compreensão tem consequências em todo o resto do texto, mas que poderá detectar de imediato no final da Parte I ao não conseguir resolver alguns dos exercícios propostos. Após a realização desta parte, fica com as bases para programar em qualquer linguagem de programação simples, para implementação de pequenas funcionalidades, como Javascript para adicionar dinamismo a uma página Web, VBA para programar macros no Microsoft Excel, ou Linguagem R para realizar cálculos esta 1. Primeiro Programa 7 1. PRIMEIRO PROGRAMA Um programa é uma sequência de instruções, dirigidas a um computador, para que este execute uma determinada função pretendida. A actividade de programar consiste na elaboração dessa sequência de instruções numa determinada linguagem de programação, que satisfaz o que é pretendido. A linguagem de programação tem que seguir uma sintaxe rígida, de forma a poder ser convertida em instruções que o computador possa compreender, mas por outro lado deve ser facilmente escrita e lida por uma pessoa. Há diferentes linguagens de programação, utilizaremos a linguagem C, no entanto não será a sintaxe da linguagem o mais relevante a aprender, mas sim competências que são independentes da linguagem. A linguagem C é uma linguagem imperativa, cada instrução é uma ordem para o computador. Existem outros paradigmas de programação, mas fora do âmbito deste texto. Manda a tradição que o primeiro programa a desenvolver numa linguagem, seja o olá mundo. Não a vamos quebrar, este é o programa mais curto possível, apenas escreve um texto e termina. 1 #include 2 3 int main() 4 { 5 printf("Ola Mundo!"); 6 } Programa 1-1 Olá Mundo O programa acima está escrito em linguagem C, e pode ser executado pelo computador. No entanto o computador não entende directamente a linguagem C, apenas ficheiros executáveis (no Windows com extensão exe). No entanto, através de um programa chamado de Compilador, podemos converter o código C acima num executável. Esse executável contém já instruções em código máquina, cujo computador pode executar. Vamos ver em que consiste o código acima: • Existe numeração das linhas e cores, que são apenas para nossa conveniência. A numeração das linhas não faz parte do ficheiro C, e as cores são colocadas pelo editor. Um programa em C é um ficheiro de texto plano, com a extensão .c e pode ser editado num editor de texto plano como o Notepad, sem qualquer cor ou numeração das linhas. • Linha 1: começa por um # (cardinal), pelo que esta linha é uma instrução não para o computador mas sim para o compilador. Essas instruções chamam-se de comandos de préprocessamento, dado que são executadas antes do processamento. • O comando #include instrui o compilador a incluir o ficheiro indicado de seguida. Esse ficheiro é uma biblioteca standard do C (existe em todos os compiladores de C), stdio.h, e consiste na declaração de funções de entrada e saída. Estas funções podem ser utilizadas de seguida no programa, sendo utilizada neste caso a função printf. • Linha 2: esta linha não tem nada. Podem existir quantas linhas em branco o programador quiser, o compilador não ficará atrapalhado, nem fará nada com elas, mas tal pode ser útil 8 Parte I – Variáveis e Estruturas de Controlo para espaçar os comandos e tornar mais legível o programa. O mesmo é válido para os espaços ou tabs numa linha de código, como por exemplo os espaços da linha 5 que antecedem o printf. • Linha 3: começa a implementação da função main. O programa começa sempre na função main. Para já, vamos deixar por explicar o int, e os parênteses vazios. Realçar que as instruções que dizem respeito à função main, e portanto ao que o programa tem de fazer, estão limitadas por duas chavetas a abrir na linha 4 e a fechar na linha 6. Todas as instruções entre estas chavetas, pertencem à função main. • Linha 5: nesta linha está a única instrução. Existe uma chamada à função printf, e sabemos que é uma função porque após o seu nome tem uns parênteses a abrir. Dentro dos parênteses colocam-se os argumentos a passar à função. Neste caso colocamos o texto que queremos imprimir: "Ola mundo!". O texto coloca-se entre aspas, para não se confundir com instruções. Se não o fez já, crie e execute o programa acima. Veja as instruções para instalar um compilador no anexo “Compilador e Editor de C”. É tudo. Acabou de dar o primeiro passo no mundo da programação, editou e compilou o primeiro programa. Houve conceitos referidos aqui que não compreende agora completamente: bi 2. Variáveis 9 2. VARIÁVEIS Uma variável num programa é uma entidade que tem um valor a cada instante, podendo esse valor ao longo do programa ser utilizado e/ou alterado. É nas variáveis que se guarda a informação necessária para realizar a função pretendida pelo programa. Podem existir quantas variáveis forem necessárias, mas cada uma utiliza memória do computador. O programa seguinte tem por objectivo trocar o valor de duas variáveis: 1 #include 2 3 int main() 4 { 5 /* declaração de três variáveis inteiras */ 6 int x=3; 7 int y=7; 8 int aux; 9 10 /* trocar o valor de x com y */ 11 aux=x; 12 x=y; 13 y=aux; 14 15 /* mostrar os valores em x e em y */ 16 printf("x: %d, y: %d",x,y); 17 } Programa 2-1 Troca o valor de duas variáveis Comentários: • Este programa tem uma estrutura inicial idêntica ao Programa 1-1, nomeadamente nas linhas 1 a 4, e linha 17. • A linha 5, 10 e 15 têm comentários ao código. Os comentários são todo o texto entre /* e */, sendo ignorados pelo compilador. O objectivo é que seja possível ao programador colocar texto explicativo de partes mais complexas do programa, não para que o compilador o melhor entenda, mas para que um outro programador que leia o código, ou o próprio programador mais tarde, compreenda mais facilmente o código. Os comentários ficam a cor verde, dado que o editor identifica que o conteúdo dessas linhas será ignorado pelo compilador1. • Nas linhas 6 a 8, estão declaradas as variáveis x, y e aux. As variáveis x e y são não só criadas, como também inicializadas. Ao ficarem com um valor inicial, podem desde já ser utilizadas. Na linguagem C, todas as variáveis utilizadas têm de ser declaradas no início da função2. • Nas linhas 11 a 13, estão comandos que são atribuições. Numa atribuição, coloca-se uma variável do lado esquerdo da igualdade, e uma expressão do lado direito. Neste caso, todas as atribuições têm expressões com uma só variável. 1 A linguagem C++ tem os comentários até ao final da linha, após duas barras: “//”. A maior parte dos compiladores de C também permite este tipo de comentários. 2 A linguagem C++ bem como a generalidade dos compiladores de C permitem a declaração fora do início das funções, mas pelos motivos referidos no erro “Declaração de variáveis fora do início das funções”, do anexo “Erros Comuns” esta restrição será mantida. 10 Parte I – Variáveis e Estruturas de Controlo • Na linha 16, é mostrado o valor das variáveis. Notar que a função printf tem 3 argumentos separados por vírgulas. O primeiro é uma string, em que começa com aspas e acaba nas aspas seguintes, o segundo uma expressão com a variável x, seguido de uma expressão com a variável y. Na string existem dois %d. Em cada %d o printf em vez de mostrar no ecrã %d coloca o valor da variável seguinte na sua lista de argumentos. No primeiro %d vai colocar x, e no segundo %d vai colocar o y. • Notar que cada instrução acaba com um ponto e vírgula, sendo esta uma característica do C. Execução do programa: C:\>troca x: 7, y: 3 Os valores estão correctamente trocados, mas vamos ver com mais detalhe qual o valor das variáveis a cada momento, na execução passo-a-passo, à direita. A execução passo-a-passo tem em cada linha da tabela um passo. Em cada passo é indicada a linha de código correspondente, e a respectiva instrução por vezes encurtada como no passo 7. A coluna resultado mostra o resultado da instrução, excepto se tratar de uma declaração, em que uma ou mais variáveis ocupam a coluna seguinte disponível, ou uma atribuição, em que a respectiva variável fica com o valor atribuído. Para poder-se escrever a linha de um determinado passo, é suficiente a informação da linha do passo anterior. A pergunta "Qual o valor de x?" não tem muito sentido, a não ser que se identifique o instante. No passo 3 ou no final do programa? Uma variável tem um valor até que lhe seja atribuído outro. Vamos agora resolver o mesmo problema, troca dos valores de duas variáveis, mas sem utilizar uma variável auxiliar: 1 #include 2 3 int main() 4 { 5 /* declaração de duas variáveis inteiras */ 6 int x=3, y=7; 7 8 /* trocar o valor de x com y */ 9 x=x+y; 10 y=x-y; 11 x=x-y; 12 13 /* mostrar os valores em x e em y */ 14 printf("x: %d, y: %d",x,y); 15 } Programa 2-2 Troca o valor de duas variáveis sem variável auxiliar A diferença para o exemplo anterior é que não se declarou uma variável aux, e declarou-se ambas as variáveis x e y num só comando. As atribuições utilizam agora expressões com duas variáveis, incluindo a própria variável que está a ser atribuída. 2. Variáveis 11 Embora este programa pareça confuso, o certo é que tem a mesma funcionalidade que o anterior como se comprova de seguida, vendo a execução passo-a-passo. No passo 2, o valor de x utilizado na expressão é o que existia antes do passo 2, o valor 3, passando a ser o valor 10 após a execução do passo 2. Não há qualquer problema em colocar a variável x de um lado e do outro de uma atribuição. A variável x à esquerda, significa que ficará com o resultado da expressão, e a variável x à direita, significa que se deve utilizar o valor da variável x antes desta instrução. Os tipos de dados utilizados podem não ser apenas variáveis inteiras. Os tipos elementares da linguagem C são os seguintes: • char - um carácter, ou um inteiro muito pequeno (guarda apenas 256 valores distintos) • short - inteiro pequeno (pouco utilizado) • int - tipo standard para inteiros • long - inteiro longo • float - número real (pode ter casas decimais) • double - número real com precisão dupla (igual ao float mas com mais precisão) Pode-se nos tipos inteiros (char a long), anteceder com as palavras unsigned ou signed, para indicar que o número inteiro tem ou não sinal. Se omitir, é considerado que têm sinal. Pode-se também considerar o tipo long long para um inteiro muito longo3, ou o long double, mas esses tipos nem sempre estão implementados. Quais os valores máximos/mínimos que podemos atribuir às variáveis de cada tipo? Isso depende do espaço reservado para cada tipo de variável, que por sua vez depende tanto do compilador, como do computador em que o programa for compilado e executado. Para saber quanto espaço é necessário para guardar cada variável, pode-se utilizar o operador sizeof. O resultado de sizeof(int) retorna o número de bytes que uma variável do tipo inteiro ocupa na memória. 1 #include 2 3 int main() 4 { 5 printf("sizeof(int): %d",sizeof(int)); 6 } Programa 2-3 Imprime o número de bytes que um inteiro ocupa Execução do programa: C:\>sizeofint sizeof(int): 4 Execute este programa para ver quantos bytes ocupa um inteiro no seu compilador e computador. Para que os resultados sejam idênticos na resolução dos exercícios, é importante que todos utilizem inteiros do mesmo tamanho. Se o resultado não for no seu caso 4, experimente o sizeof(short) ou sizeof(long), e utilize o tipo que tiver tamanho 4 para todas as variáveis inteiras nos exercícios das actividades formativas. As variáveis do tipo char e float/double, não utilizam a mesma string de formatação no printf da que os inteiros. Para os inteiros, utiliza-se o %d na string do primeiro argumento, mas esse 3 O tipo long long não faz parte da norma inicial da linguagem C, actualmente a generalidade dos compiladores implementa-o com um inteiro de 64 bits. A string de formatação varia: %I64d; %lld. Pa