You are on page 1of 3

/******************************************************************************

* Universidade Aberta *
* Licenciatura em Informática *
* Programação 2008/2009 - Turma 1 *
* *
* e-Fólio A *
* *
* Este programa lê um número inteiro positivo e escreve todas as somas de 3 *
* parcelas distintas, a+b+c, cujo resultado é esse número e cujas somas *
* diferem, pelo menos, num número, independentemente da posição que ocupa. *
* *
* David Pires - Aluno nº 800255 *
* *
* Novembro 2008 *
******************************************************************************/

/******************************************************************************
* Declaração das bibliotecas a serem chamadas ao longo do programa *
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/******************************************************************************
* Pré-declaração das funções utilizadas no programa, para evitar que elas *
* sejam assumidas automaticamente como sendo do tipo inteiro *
******************************************************************************/

int menu ();


void resolver ();
void pausa ();

/******************************************************************************
* Inicialmente declaramos duas variáveis globais, por serem utilizadas em *
* mais do que uma função do programa: a variável "introducao" que recebe a *
* introdução do utilizador e, caso esta última tenha sido correcta; a *
* variável "numero", na qual é armazenada a conversão para inteiro da string *
* introduzida. *
******************************************************************************/

char introducao[100];
int numero;

/******************************************************************************
* Function / Função : main *
* Author / Autor : David Pires *
* Last change / Última modificação : 10/11/2008 *
* Description / Descrição : Função principal do programa. Chama a *
* função menu e, em função da introdução do utilizador, decide se irá pedir *
* nova introdução ao utilizador (no caso de ter sido errada); se faz o *
* cálculo do valor introduzido (no caso de ter sido correcto); ou se abandona *
* o programa (no caso de ter sido introduzido o número 0 (zero)). *
* Parameters / Parâmetros : Não recebe quaisquer parâmetros *
* Return / Retorna : Retorna 0 (zero) ao sistema, no final do *
* programa, apenas por uma questão de cumprir com o standard da linguagem C. *
******************************************************************************/

int main ()
{
int opcao;

system ("chcp 1252");


do
{
opcao = menu ();
switch (opcao)
{
case 0 : printf ("\nObrigado e até à próxima...\n");
pausa ();
break;
case 1 : resolver ();
break;
case 2 : printf ("\nIntrodução errada...\7\n");
pausa ();
break;
}
}
while (opcao != 0);
return 0;
}

/******************************************************************************
* Function / Função : menu *
* Author / Autor : David Pires *
* Last change / Última modificação : 10/11/2008 *
* Description / Descrição : Função que efectua a validação dos dados *
* introduzidos pelo utilizador que, sendo correctos, faz a respectiva *
* conversão de uma string para um número inteiro. Então, verifica se o *
* inteiro é maior que 6, pois esta é a mínima soma possível com 3 parcelas *
* diferentes: 1 + 2 + 3 = 6 *
* Parameters / Parâmetros : Não recebe quaisquer parâmetros *
* Return / Retorna : Retorna 0 (zero) caso a opção tenha sido *
* a saída do programa; retorna 2 (dois) no caso de uma introdução inválida; *
* ou retorna 1 (um) no caso de uma introdução válida para o cálculo *
******************************************************************************/

int menu ()
{
int i;

system ("cls");
printf ("\n\nM E N U\n\n");
printf ("Por favor introduza um número inteiro maior que 5 (Introduza 0");
printf (" para sair)... \n\n"); // Continuação da linha anterior
printf ("\n\nNúmero: ");
scanf ("%s", &introducao);
// Serve apenas para limpar o buffer para a próxima introdução
while (getchar () != '\n') continue;
// Verifica se é introduzido apenas o carácter zero (0)
if ((strlen (introducao) == 1) && (introducao [0]) == 48) return 0;
for (i=0; introducao[i]!= '\0' ; i++)
// Verifica se são introduzidos outros caracteres que não sejam números
if ((introducao [i] < 48) || (introducao [i] > 57)) return 2;
// Converte uma introdução correcta para um inteiro
numero = atol (introducao);
// Verifica se o número é menor que 6
if (numero < 6) return 2;
else return 1;
}
/******************************************************************************
* Function / Função : resolver *
* Author / Autor : David Pires *
* Last change / Última modificação : 10/11/2008 *
* Description / Descrição : Função que efectua o cálculo e a *
* apresentação ao utilizador de todas as somas possíveis dentro dos critérios *
* inicialmente indicados *
* Parameters / Parâmetros : Não recebe quaisquer parâmetros *
* Return / Retorna : Não retorna quaisquer valores *
******************************************************************************/

void resolver ()
{
//Inicialização das parcelas 1 e 2 com parcela 1 < parcela 2
int parcela1 = 1, parcela2 = 2;
int parcela3;

printf ("\nSomas possíveis com 3 parcelas diferentes:\n\n");


while (parcela1 <= (numero / 3))
{
//As duas linhas seguintes garantem que parcela 2 < parcela 3
parcela3 = numero - parcela2 - parcela1;
while (parcela2 < parcela3)
{
//Apresentação ao utilizador com tabulações
printf ("\n\t%d\t+\t%d\t+\t%d\n\n", parcela1, parcela2, parcela3);
//Variação das parcelas 2 e 3 em função uma da outra
parcela3--;
parcela2++;
}
//Incremento da parcela 1 e também da parcela 2 em função da parcela 1
parcela1++;
parcela2 = parcela1 + 1;
}
pausa ();
}

/******************************************************************************
* Function / Função : pausa *
* Author / Autor : David Pires *
* Last change / Última modificação : 10/11/2008 *
* Description / Descrição : Basicamente, o seu objectivo é fazer uma *
* pausa sempre que seja necessário, para que o utilizador possa ver *
* resultados no monitor. *
* Parameters / Parâmetros : Não recebe quaisquer parâmetros *
* Return / Retorna : Não retorna quaisquer valores *
******************************************************************************/

void pausa ()
{
char tecla;
printf ("\nPrima ENTER para continuar...\n");
tecla = getchar ();
}