Programação em C 2012 / 2013 Exercícios Funções ● Escreva uma função para cantar os parabéns #include <stdio.h> void Parabens(); int main() { Parabens(); return 0; } /* * Escreve os “parabens” no ecrã. * * Parâmetros: Nenhum * * Retorno: Nada */ void Parabens() { printf("Parabens a você\n"); printf("Nesta data querida\n"); printf("Muitas felicidades\n"); printf("Muitos anos de vida\n"); } Programação em C 2012 / 2013 Exercícios Funções ● Escreva uma função para escrever um valor real formatado com 2 casas decimais #include <stdio.h> void EscreverReal(double x); int main() { EscreverReal(); return 0; } /* * Escreve um real no ecrã com duas casas decimais. * * Parâmetros: * x – valor a escrever * * Retorno: Nenhum */ void EscreverReal(double x) { printf("%.2ld", x); } Programação em C 2012 / 2013 Funções ● Exercícios Escreva uma função que soma dois números #include <stdio.h> double Soma(double x, double y); int main() { int valor = Soma(23.4, 12.3); printf("A soma de 23.4 com 12.3 vale %d\n", valor); return 0; } /* * Devolve a soma dos dois valores passados como parâmetros. * * Parâmetros: * x, y – valores a somar * * Retorno: Soma dos dois valores passados como parâmetros. */ double Soma(double x, double y) { return x + y; } Programação em C 2012 / 2013 Exercícios – Triângulo Válido Funções ● Conceber uma função que permita determinar se três valores são potencialmente os lados de um triângulo – Revisão de Geometria: ● – Existe um triângulo com lados A, B e C se a soma de quaisquer dois lados é maior do que o terceiro Análise do Problema ● ● ● Decisão depende apenas da dimensão dos lados A função toma a decisão a partir dos três valores fornecidos. Resposta da função deve poder ser interpretada como valor lógico Programação em C 2012 / 2013 Exercícios – Triângulo Válido Funções ● Conceber uma função que permita determinar se três valores são potencialmente os lados de um triângulo – 1ª Versão int TrianguloValido(int a, int b, int c) { return (a + b > c); } – Como Testar? ● Conceber programa de teste – ● Escolher cuidadosamente dados de teste – ● Forma simples de fornecer dados de teste à função a testar Testar todos os casos possíveis Comparar resultados do teste com resultados esperados Programação em C 2012 / 2013 Funções ● Exercícios – Triângulo Válido Programa de Teste (exemplo) int main() { double a, b, c; printf(“Validade de printf(“Comprimento scanf(“%lf”, &a); printf(“Comprimento scanf(“%lf”, &b); printf(“Comprimento scanf(“%lf”, &c); um triangulo a partir dos comprimentos dos lados”); do lado A: ”); do lado B: ”); do lado C: ”); if (TrianguloValido(a, b, c)) { printf(“Valido\n”); } else { printf(“Invalido\n”); } } Melhor seria ler dados de teste de um ficheiro! Programação em C 2012 / 2013 Exercícios – Triângulo Válido Funções ● Dados de Teste – Triângulos podem ser retos, agudos e obtusos ● ● – Relevante para a implementação? Não custa inclui-los nos testes 3 6 7 agudo 5 12 13 retângulo 5 12 15 obtuso Triângulos inválidos têm lado muito grande ● ● Ordem não deveria importar Incluir condições fronteira – Onde surgem erros com mais frequência 3 6 10 6 10 inválido 3 inválido 10 3 6 inválido 3 5 8 limite 5 8 3 limite 8 3 5 limite Programação em C 2012 / 2013 Exercícios – Triângulo Válido Funções ● Resultados do Teste e Conclusões – Resultados ● ● – Corretos para triângulos válidos Incorretos para alguns triângulos inválidos Conclusões ● ● ● ● 3 6 7 válido 5 12 13 válido 5 12 15 válido 3 6 10 inválido 6 10 3 válido 10 3 6 válido Implementação não considera reordenação 3 5 8 inválido 5 8 3 válido Tipo de erro muito frequente 8 3 5 válido Em geral apenas detetado no teste Pode facilmente passar sem deteção se dados de teste não forem adequados Programação em C 2012 / 2013 Exercícios – Triângulo Válido Funções ● 2ª Versão int TrianguloValido(int a, int b, int c) { return ( (a + b > c) && (a + c > b) && (b + c > a) ); } ● Resultados do Teste – – Note que não prova que funciona sempre! Apenas prova que funciona com os dados testados 3 6 7 válido 5 12 13 válido 5 12 15 válido 3 6 10 inválido 6 10 3 inválido 10 3 6 inválido 3 5 8 inválido 5 8 3 inválido 8 3 5 inválido