Flames Posted March 6, 2012 Report Share Posted March 6, 2012 Escreva um programa que dado um intervalo de tempo em segundos, definido pelo utilizador durante a execução, utilize a série de Gregory-Leibniz para calcular o valor aproximado de PI... Notas : deverá utilizar a função time(NULL), disponível com a inclusão do ficheiro time.h Fiz da seguinte forma mas acho que está errada segue-se o codigo #include <stdio.h> #include <time.h> #include <math.h> double lieb(unsigned int maximo); int main() { unsigned int maximo; double x; printf("Tempo a decorrer\n"); scanf("%d", &maximo); printf("Pi = %f", lieb(maximo)); return 0; } double lieb(unsigned int maximo){ clock_t inicio,fim; inicio=clock(); double pi=0; int i=0; int p=1; int div=4.0; do{ pi+=pow(-1,i)*div/p; i++; p=p+2; fim=clock(); } while ((fim-inicio)/CLOCKS_PER_SEC<maximo); return pi; } Alguem me poderia dizer se esta é a forma correcta de usar o time ? :S Link to comment Share on other sites More sharing options...
pmg Posted March 6, 2012 Report Share Posted March 6, 2012 O que é pedido é a funcao time(); tu estas a usar a funcao clock(). Mesmo que estejas a usar bem o clock() nao estas a fazer o exercicio de acordo com o enunciado. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Flames Posted March 6, 2012 Author Report Share Posted March 6, 2012 O que é pedido é a funcao time(); tu estas a usar a funcao clock(). Mesmo que estejas a usar bem o clock() nao estas a fazer o exercicio de acordo com o enunciado. O prof falou numa relacao entre qualquer coisa(pelos vistos TIME) e Clocks_per_Second e no que pesquisei nao vi essa relacao :S Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 6, 2012 Report Share Posted March 6, 2012 ve aqui : http://www.cplusplus.com/reference/clibrary/ctime/CLOCKS_PER_SEC/ IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flames Posted March 7, 2012 Author Report Share Posted March 7, 2012 ve aqui : http://www.cplusplus.com/reference/clibrary/ctime/CLOCKS_PER_SEC/ algo como inicializar a Time(null) depois no meio da funcao fazer x=time() e fazer a diferenca entre os dois... Pelo que percebi Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 7, 2012 Report Share Posted March 7, 2012 seria essa a ideia original ... para usar o clocks é inválido pela simples razão que (se bem me lembro) retorna o tempo de processamento da aplicação. o problema é que o tempo de processamento deixa de ser contabilizado quando o processador está ocupado a fazer outras cenas como dar atenção a outras aplicações .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flames Posted March 7, 2012 Author Report Share Posted March 7, 2012 seria essa a ideia original ... para usar o clocks é inválido pela simples razão que (se bem me lembro) retorna o tempo de processamento da aplicação. o problema é que o tempo de processamento deixa de ser contabilizado quando o processador está ocupado a fazer outras cenas como dar atenção a outras aplicações .... #include <stdio.h> #include <time.h> #include <math.h> double lieb(unsigned int maximo); int main() { unsigned int maximo; double x; printf("Tempo a decorrer\n"); scanf("%d", &maximo); printf("Pi = %f", lieb(maximo)); return 0; } double lieb(unsigned int maximo){ time_t inicio,fim; inicio=time(NULL); double pi=0; int i=0; int p=1; int div=4.0; do{ pi+=pow(-1,i)*div/p; i++; p=p+2; fim=time(&fim); } while (difftime(fim,inicio)<maximo); return pi; } Terminei com algo assim... Link to comment Share on other sites More sharing options...
pmg Posted March 7, 2012 Report Share Posted March 7, 2012 O prof falou numa relacao entre qualquer coisa(pelos vistos TIME) e Clocks_per_Second e no que pesquisei nao vi essa relacao :S Pois não 😉 Não há relação entre a função time() e a macro CLOCKS_PER_SEC. A função time() está "ligada" ao tempo dum relógio de pulso. A função clock() está "ligada" ao tempo do processo. Pode haver grandes diferenças entre estes dois tempos principalmente em computadores com múltiplos processadores, e, em menor grau, quando o processador divide o tempo por vários processos. fim=time(&fim); Terminei com algo assim... Não está nada mal. Mas tenho uma sugestões a fazer: a função time() mete o valor actual no argumento passado, se diferente de NULL, e devolve esse mesmo valor. Não é preciso atribuir esse valor duas vezes, ou seja, ou passas o fim como argumento, ou usas para atribuição. fim = time(NULL); time(&fim); Além disso se puderes evitar a função pow() deixas de depender do header <math.h> e, provavelmente, tornas o cálculo mais rápido. Repara que só usas a função para alternar entre 1 e -1. Podes fazer o mesmo, por exemplo, assim int i = -1; pi += i * 4.0 / p; i = -i; // troca sinal Podes ainda passar o 4 para fora do ciclo. 4/1 - 4/3 + 4/5 - 4/7 + ... é o mesmo que 4*(1/1 - 1/3 + 1/5 - 1/7 + ...) What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
pmg Posted March 7, 2012 Report Share Posted March 7, 2012 Outra coisa!! int main() { unsigned int maximo; /* ... */ scanf("%d", &maximo); O "%d" serve para introduzir valores de tipo int; o maximo é um objecto de tipo unsigned. Uma coisa não joga com a outra!! Ou alteras o tipo da variavel maximo, ou alteras o formato no scanf (para "%u"). What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Flames Posted March 7, 2012 Author Report Share Posted March 7, 2012 Outra coisa!! O "%d" serve para introduzir valores de tipo int; o maximo é um objecto de tipo unsigned. Uma coisa não joga com a outra!! Ou alteras o tipo da variavel maximo, ou alteras o formato no scanf (para "%u"). Yap a parte do i tens razao pois eu estava a usa-lo de inicio para controlar o numero de ciclos que o utilizador queria (liebniz num outro formato) #include <stdio.h> #include <time.h> double lieb(unsigned int maximo); int main() { unsigned int maximo; double x; printf("Tempo a decorrer\n"); scanf("%u", &maximo); printf("Pi = %f", lieb(maximo)); return 0; } double lieb(unsigned int maximo){ time_t inicio,fim; inicio=time(NULL); double pi=0; int i=1; double p=1.0; do{ pi+=i/p; p=p+2; i=-i; fim=time(NULL); } while (difftime(fim,inicio)<maximo); return 4*pi; } PS: a diferença de segundos não é significativa ou é impressão minha? um segundo dá 3.141593 o mesmo que segundo>=2 -.-" Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now