Introdução à Programação em C Tipos e Operadores Elementares Estruturas de Controlo Resumo Novidades em C Exemplo: Factorial Tipos de Dados Básicos Saltos Condicionais: if-then-else Valor de retorno de uma função: return Exemplo: Conversão de Temperaturas Definição de variáveis e atribuições Ciclos utilizando a estrutura de controlo while Ciclos utilizando a estrutura de controlo for Definição de constantes usando #define 2
Novidades em C def factorial(n): if n == 0 return 1 else: return n*factorial(n-1) int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Tipificação estática (C não permite dinâmica) Tipo de cada variável já definido na compilação 3 Novidades em C def factorial(n): if n == 0 return 1 else: return n*factorial(n-1) int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Tipificação estática (C não permite dinâmica) Tipo de cada variável definido na compilação Blocos delimitados por em vez de indentação Indentação é apenas utilizada para tornar o código mais legível Se o bloco só contém uma instrução as são opcionais 4
Novidades em C def factorial(n): if n == 0 return 1 else: return n*factorial(n-1) Assim também funciona! int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Tipificação estática (C não permite dinâmica) Tipo de cada variável definido na compilação Blocos delimitados por em vez de indentação Indentação é apenas utilizada para tornar o código mais legível Se o bloco só contém uma instrução as são opcionais 5 Factorial int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Tipo de dados do valor de retorno da função Precede o nome da função Tipos básicos: char, int, long int, double e float; Tipos complexos: estruturas, uniões, tabelas, ponteiros para tipos mais simples e funções 6
Factorial int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Tipo de dados do parâmetro n Todos os parâmetros são precedidos pelo seu tipo 7 Factorial int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Sintaxe da estrutura de controlo: if-then-else if (<condição>) <instrução1> else <instrução2> Se a condição é verdadeira, executa instrução1 Caso contrário, executa instrução2 8
Factorial int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Sintaxe da instrução return return <expressão>; Termina a execução da função Resultado da expressão é o valor de retorno da função 9 Réplica do Z3, considerado o primeiro computador programável completamente automático Deutsches Museum, Munique 10 2012/2013
Conversão de Temperaturas Construir um programa que escreve uma tabela de conversão de temperaturas da escala Fahrenheit para escala Celsius 5 T Celsius ( T 9 = Fahrenheit 32) 0-17 20-6 40 4... 260 126 280 137 300 148 11 Conversão de Temperaturas Algoritmo Inicia no limite inferior de temperatura na escala Fahrenheit Converte temperatura para escala Celsius Escreve linha da tabela com temperaturas Aumenta valor de temperatura na escala Fahrenheit 12
Conversão de Temperaturas Algoritmo Inicia no limite inferior de temperatura na escala Fahrenheit Converte temperatura para escala Celsius Escreve linha da tabela com temperaturas Aumenta valor de temperatura na escala Fahrenheit 13 Conversão de Temperaturas Algoritmo Inicia no limite inferior de temperatura na escala Fahrenheit Enquanto temperatura não fôr superior ao limite superior Converte temperatura para escala Celsius Escreve linha da tabela com temperaturas Aumenta valor de temperatura na escala Fahrenheit 14
Conversão de Temperaturas Algoritmo Inicia no limite inferior de temperatura na escala Fahrenheit fahr = inferior; Enquanto temperatura não fôr superior ao limite superior while (fahr <= superior) Converte temperatura para escala Celsius celsius = 5 * (fahr-32) / 9; Escreve linha da tabela com temperaturas printf("%d\t%d\n", fahr, celsius); Aumenta valor de temperatura na escala Fahrenheit fahr = fahr + passo; 15 Conversão de Temperaturas #include <stdio.h> /* Conversao Fahrenheit-Celsius */ int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + passo; return 0; Vamos analisar o código em detalhe 16
Comentários #include <stdio.h> /* Conversao Fahrenheit-Celsius */ int fahr, celsius; int inferior, superior, passo; Comentários: texto entre /* e */ 17 Declaração de Variáveis int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Síntaxe: <tipo> <variável> <tipo> <variável>,..., <variável> 18
Atribuição de Valor a uma Variável int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Síntaxe: <variável> = <expressão> 19 Ciclo while Algoritmo Inicia no limite inferior de temperatura na escala Fahrenheit fahr = inferior; Enquanto temperatura fôr inferior ao limite superior while (fahr <= superior) Converte temperatura para escala Celsius celsius = 5 * (fahr-32) / 9; Escreve linha da tabela com temperaturas printf("%d\t%d\n", fahr, celsius); Aumenta valor de temperatura na escala Fahrenheit fahr = fahr + passo; 20
Ciclo while fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + passo; Ciclo while Síntaxe: while (<expressao>) <instrução> Indentação ajuda a perceber estrutura do programa Erro frequente: while (i >= 0); i = i-1; 21 Output com printf fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + passo; printf permite efectuar escrita formatada %d inteiro decimal, \t caracter tabulação Melhorar formatação: printf("%3d\t%6d\n", fahr, celsius); Problema: 0 o F são -17,8 o C e não -17 o C 22
Divisão Inteira fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%d\t%d\n", fahr, celsius); fahr = fahr + passo; Divisão entre inteiros é divisão inteira Resultado é o quociente da divisão (número inteiro) Exemplo: 5/9 é 0 23 Divisão Inteira #include <stdio.h> /* Conversao Fahrenheit-Celsius */ int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Como resolver o problema da divisão inteira? fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%3d\t%6d\n", fahr, celsius); fahr = fahr + passo; return 0; 24
Divisão Inteira #include <stdio.h> /* Conversao Fahrenheit-Celsius */ float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Como resolver o problema da divisão inteira? fahr = inferior; while (fahr <= superior) fahr = fahr + passo; return 0; 25 Definição de Constantes #include <stdio.h> /* Conversao Fahrenheit-Celsius */ float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Estas variáveis todas são mesmo necessárias? fahr = inferior; while (fahr <= superior) fahr = fahr + passo; return 0; 26
Definição de Constantes #include <stdio.h> /* Conversao Fahrenheit-Celsius */ float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Têm sempre o mesmo valor! Estas variáveis todas são mesmo necessárias? fahr = inferior; while (fahr <= superior) fahr = fahr + passo; return 0; 27 Definição de Constantes #include <stdio.h> /* Conversao Fahrenheit-Celsius */ float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Podem ser constantes! Estas variáveis todas são mesmo necessárias? fahr = 0; while (fahr <= 300) fahr = fahr + 20; return 0; 28
Definição de Constantes #include <stdio.h> /* Conversao Fahrenheit-Celsius */ float fahr, celsius; fahr = 0; while (fahr <= 300) fahr = fahr + 20; return 0; Má prática utilizar valores explícitos Alternativa: utilização de constantes, com #define 29 Definição de Constantes #include <stdio.h> /* Conversao Fahrenheit-Celsius */ #define INFERIOR 0 #define SUPERIOR 300 #define PASSO 20 float fahr, celsius; Directivas para o pré-compilador não terminam com ; fahr = INFERIOR; while (fahr <= SUPERIOR) fahr = fahr + PASSO; return 0; 30
Ciclos while vs. for while ( ) for ( ; ; ) 31 Ciclos while vs. for fahr = INFERIOR; while ( ) for (fahr = INFERIOR; ; ) 32
Ciclos while vs. for fahr = INFERIOR; while (fahr <= SUPERIOR) for (fahr = INFERIOR; fahr <= SUPERIOR; ) 33 Ciclos while vs. for fahr = INFERIOR; while (fahr <= SUPERIOR) fahr = fahr + PASSO; for (fahr = INFERIOR; fahr <= SUPERIOR; fahr = fahr + PASSO) Inicialização de variáveis: fahr = INFERIOR Teste: fahr <= SUPERIOR Incremento: fahr = fahr + PASSO 34
O que sabemos até agora: O programa começa sempre pela função main() Inclusão de funções adicionais ao C através da directiva #include Cada bloco é definido por Tipos de dados básicos: char, int, float e double Definição de variáveis e atribuições Ciclos utilizando a estrutura de controlo while Ciclos utilizando a estrutura de controlo for Definição de constantes usando directivas de pré-compilador #define Já sabemos escrever para o terminal (stdout) através do comando printf. Mas como consigo interagir com o utilizador? 35 Exercicio 1: Tabela de Factoriais Usar a função factorial para construir um programa que escreve uma tabela com os valores do factorial de 1 a 10. 1 1 2 2 3 6 4 24... 10 3628800 36
Exercicio 2: Tabela de Factoriais Aumente o limite do programa anterior para mostrar o valor do factorial de 1 a 30. Observe o resultado. 1 1 2 2 3 6 4 24... 10 3628800...... 30??? 37 Exercicio 3: Factorial usando Ciclos Implemente uma nova versão da função factorial, mas não use recursão. Utilize a estrutura de controlo while. 38
Resumo 39 Sintaxe para definição de funções Definição de variáveis e atribuições Estruturas de controlo if-then e if-then-else Ciclos utilizando a estrutura de controlo while Ciclos utilizando a estrutura de controlo for Definição de constantes usando #define Super computador IBM BlueGene/P o computador mais rápido do mundo em Março de 2009 Argonne Leadership Computing Facility, USA 40 IAED, 2012/2013 2014/2015