Introdução à Programação em C (I) IAED Tagus, 2009/2010
Organização de Ficheiros em C Organização Típica de Ficheiros em C Inclusão de bibliotecas de sistema Inclusão de bibliotecas locais Definição de tipos e constantes Variáveis globais Funções As funções são normalmente definidas de forma Bottom-Up dado que têm que estar definidas antes de serem utilizadas Podem existir variações desta organização 2 IAED Tagus,2009/2010
Resumo Diferenças na Sintaxe entre Scheme e 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 3 IAED Tagus,2009/2010
Factorial Definição de função para cálculo de factorial Scheme (define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1))))) C int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); 4 IAED Tagus,2009/2010
Factorial int factorial (int n) if (n == 1) return 1; else return n*factorial(n-1); Novidades em C Linguagem tipificada Notação infixa Operador de comparação de igualdade é == Operador = é usado para atribuição 5 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
Réplica do Z3, considerado o primeiro computador programável completamente automático Deutsches Museum, Munique 10 IAED Tagus,2009/2010
Construir um programa que escreve uma tabela de conversão de temperaturas da escala Fahrenheit para escala Celsius 0-17 20-6 40 4 5 T Celsius = ( TFahrenheit 9 32)... 260 126 280 137 300 148 11 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () 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; 16 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () int fahr, celsius; int inferior, superior, passo; Comentários Texto entre /* e */ 17 IAED Tagus,2009/2010
main () int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Declaração de variáveis 18 IAED Tagus,2009/2010
main () int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; Instruções de atribuição de um valor a uma variável Sintaxe: <variável> = <expressão> 19 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 IAED Tagus,2009/2010
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 22 IAED Tagus,2009/2010
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 23 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () int fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = inferior; while (fahr <= superior) celsius = 5 * (fahr-32) / 9; printf("%3d\t%6d\n", fahr, celsius); fahr = fahr + passo; 24 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = inferior; while (fahr <= superior) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + passo; 25 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = inferior; while (fahr <= superior) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + passo; 26 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () float fahr, celsius; int inferior, superior, passo; inferior = 0; superior = 300; passo = 20; fahr = 0; while (fahr <= 300) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + 20; 27 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ main () float fahr, celsius; fahr = 0; while (fahr <= 300) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + 20; Má prática utilizar valores explícitos Alternativa: utilização de constantes, com #define 28 IAED Tagus,2009/2010
#include <stdio.h> /* Conversao Fahrenheit-Celsius */ #define INFERIOR 0 #define SUPERIOR 300 #define PASSO 20 main () float fahr, celsius; fahr = INFERIOR; while (fahr <= SUPERIOR) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + PASSO; 29 IAED Tagus,2009/2010
while ( ) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); for ( ; ; ) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); 30 IAED Tagus,2009/2010
fahr = INFERIOR; while ( ) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); for (fahr = INFERIOR; ; ) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); 31 IAED Tagus,2009/2010
fahr = INFERIOR; while (fahr <= SUPERIOR) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); for (fahr = INFERIOR; fahr <= SUPERIOR; ) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); 32 IAED Tagus,2009/2010
fahr = INFERIOR; while (fahr <= SUPERIOR) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + PASSO; for (fahr = INFERIOR; fahr <= SUPERIOR; fahr = fahr + PASSO) celsius = (5.0/9.0) * (fahr-32); printf("%3.0f\t%6.1f\n", fahr, celsius); Inicialização de variáveis: fahr = INFERIOR Teste: fahr <= SUPERIOR Incremento: fahr = fahr + PASSO 33 IAED Tagus,2009/2010
Exercicio para Casa (1) 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 34 IAED Tagus,2009/2010
Exercicio para Casa (2) 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??? 35 IAED Tagus,2009/2010
Exercicio para Casa (3) Implemente uma nova versão da função factorial, mas não use recursão. Utilize a estrutura de controlo while. 36 IAED Tagus,2009/2010
Resumo 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 37 IAED Tagus,2009/2010