Bem-vindo: Qua, 27 de Novembro 2024, 14:29 Pesquisa avançada

Ajuda em C

Area de suporte geral. Aqui poderá fazer as questões que quiser relativas ao Ubuntu que não se enquadrem em nenhuma das outras secções do Fórum!

Re: Ajuda em C

Mensagempor Rogergalvao » Dom, 22 de Setembro 2013, 0:31

Então o intuito do programa é achar o primeiro ponto onde o barco pode passar , para que ele passe a profundidade tem que ser >= C+0.1, não entendi como o seu programa acha a primeira distância em que o barco passa.

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Dom, 22 de Setembro 2013, 11:16

Rogergalvao (22-09-2013, 0:31) escreveu:Então o intuito do programa é achar o primeiro ponto onde o barco pode passar , para que ele passe a profundidade tem que ser >= C+0.1, não entendi como o seu programa acha a primeira distância em que o barco passa.

É assim, tendo por base o código:
Código: Selecionar todos
    double K=0.0, X=-1.0;
    int conta=0;
    
    for
(i=0; i<L; i++)
    {
        K = ((C+0.1) - P[i]) / (P[i+1] - P[i]);
        printf("[%d]\t%f\n", conta, K);
        if(K>=&& K<=1)
        {
            if(X==-1.0)
            {
                X = i + K;
            }
            else if(conta < (X+W) && (X+conta) < L)
            {
                conta++;
            }
            else if(conta >= (X+W) && (X+conta) < L)
            {
                break;
            }
            else
            
{
                X = -1.0;
                conta = 0;
            }
        }
        else
        
{
            X = -1.0;
            conta = 0;
        }
    }
    printf("%.6f\n", X);

Para cada i irá ver o valor de K através da seguinte equação:
K = ((C+0.1) - P[i]) / (P[i+1] - P[i]);

Tal como foi descrito no comentário anterior, se este estiver entre 0 e 1, então o barco passa por essa região. Assim, o primeiro valor que encontrarmos é registado em X, correspondendo ao seguinte código:
Código: Selecionar todos
            if(X==-1.0)
            {
                X = i + K;
            

A partir daqui, temos um candidato à solução final, mas primeiro temos de garantir que a profundidade se mantêm maior ou igual a C+0.1, em toda a extensão W da embarcação, através do teste conta < (X+W), incrementando o contador conta de extensão abrangida. Para além disso, convém verificar se o comprimento permitido por X e a extensão actual, não é superior à margem direita, porque se for, a embarcação irá encalhar na margem direita. Só quando houver um valor de X que cumpra esses requisitos, fazemos com que o programa saia do ciclo for e apresente esse tal valor de X.
Código: Selecionar todos
            else if(conta < (X+W) && (X+conta) < L)
            {
                conta++;
            }
            else if(conta >= (X+W) && (X+conta) < L)
            {
                break;
            

O else que se encontra imediatamente abaixo, serve para colocar o X em -1.0, caso os testes anteriores falhem, que pode se dever ao facto de não conseguir ter o barco na zona necessária, sem que atinja a margem direita.
E o else final é para o seguinte caso:
Código: Selecionar todos
i-1: 0 <= K <= 1 → X = (i-1) + K
i: K<0 ou K>1 → X = -1.0

Ou seja, no teste anterior, a profundidade surgia dentro do intervalo exigido para o K, mas no teste actual, a profundidade já não está nesse intervalo, o que significa que a embarcação não poderá navegar nessa porção, porque toda a sua extensão não teria espaço para passar sem encalhar... Obrigando assim, a ter de verificar por um novo X que seja compatível com a embarcação.

Ficou mais claro agora, ou ainda há alguma dúvida?
ImagemImagem
«Escolhe um trabalho de que gostes, e não terás que trabalhar um só dia na tua vida» - Confúcio
Avatar do usuário
Luis Cardoso
Redator
 
Mensagens: 10455
Registrado em: 26 Maio, 2011
Localização: Portugal

Re: Ajuda em C

Mensagempor Rogergalvao » Dom, 22 de Setembro 2013, 16:59

Então Luis, entendi o seu raciocínio mas parece que não esta funcionando adequadamente, veja as seguintes execuções corretas:

Entrada 4 2 9 (L,W,C) Saída correta: 0.193617
47 39 9 (vetores profundidade)

Entrada: 17 1 25
47 49 3 38 23 13 31 6 46 20 42 44 48 19 50 22 Saída correta: 0.534043

Por exemplo para L=2,W=1,C=1 e profundidade = 3 , a saída correta seria 0.366667

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Dom, 22 de Setembro 2013, 22:55

Rogergalvao (22-09-2013, 16:59) escreveu:Então Luis, entendi o seu raciocínio mas parece que não esta funcionando adequadamente, veja as seguintes execuções corretas:

Entrada 4 2 9 (L,W,C) Saída correta: 0.193617
47 39 9 (vetores profundidade)

Entrada: 17 1 25
47 49 3 38 23 13 31 6 46 20 42 44 48 19 50 22 Saída correta: 0.534043

Por exemplo para L=2,W=1,C=1 e profundidade = 3 , a saída correta seria 0.366667

Efectivamente há um problema, porque o meu código apenas funcionou nesse último caso e sabe porquê? Se tivesse feito o debug do código teria visto, que a função que me indicou (P(i) + K*(P(i+1)-P(i))) para o cálculo dos valores intermédios tem um pequeno problema... Será mesmo essa fórmula? É que quando a diferença entre valores é muito pequena e os valores de P[i] muito altos, a fórmula dá K malucos...

Para o primeiro caso, tive o seguinte:
Insira os valores (2 <= L <= 50, 1 <= W <= 25, 1 <= C <= 25):
4 2 9
Insira os valores de profundidade (são 3 valores):
47 39 9
[0] 0.193617
[0] 4.737500
[0] 0.996667
[0] -0.011111
-1.000000


Para o segundo:
Insira os valores (2 <= L <= 50, 1 <= W <= 25, 1 <= C <= 25):
17 1 25
Insira os valores de profundidade (são 16 valores):
47 49 3 38 23 13 31 6 46 20 42 44 48 19 50 22
[0] 0.534043
[0] -10.950000
[0] 0.519565
[0] 0.631429
[1] 0.860000
[2] -0.210000
[0] 0.672222
[0] 0.236000
[1] 0.477500
[2] 0.803846
[3] 0.231818
[4] -8.450000
[0] -4.725000
[0] 0.789655
[0] 0.196774
[1] 0.889286
[2] -0.140909
-1.000000


E por fim no terceiro:
Insira os valores (2 <= L <= 50, 1 <= W <= 25, 1 <= C <= 25):
2 1 1
Insira os valores de profundidade (são 1 valores):
3
[0] 0.366667
[0] 0.633333
0.366667


Como pode ver pela informação:
Código: Selecionar todos
[conta]     K


Bom, como eu não posso despender mais tempo, não o poderei ajudar mais de momento, mas penso que tem de analisar a situação:
Cálculo de limites, derivadas no ponto, etc, etc... Como por exemplo a adição de mais um teste para verificar se no intervalo, ambos os valores (P[i] e P[i+1]) são maiores que C+0.1, que é quando o programa se atrapalha todo, porque o cálculo de K, é absurdo, já que não há K que passe por C+0.1 nesse intervalo...
ImagemImagem
«Escolhe um trabalho de que gostes, e não terás que trabalhar um só dia na tua vida» - Confúcio
Avatar do usuário
Luis Cardoso
Redator
 
Mensagens: 10455
Registrado em: 26 Maio, 2011
Localização: Portugal

Re: Ajuda em C

Mensagempor Paulo Junior » Seg, 23 de Setembro 2013, 20:39

Hmmmmmm, estuda na Unicamp e quer nao conseguer fazer Mc102 hein, aparece no lab do imecc hahahahah

Paulo Junior
 
Mensagens: 13
Registrado em: 26 Julho, 2013

Anterior

Voltar para Questões gerais

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes

cron