Bem-vindo: Sáb, 23 de Novembro 2024, 17:39 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!

Ajuda em C

Mensagempor Rogergalvao » Sáb, 21 de Setembro 2013, 18:20

Bom eu sei que aqui é um fórum a respeito de Ubuntu, mas tem usuários que talvez entendam de programação, então fica aqui meu pedido.

To precisando de ajuda pra resolver um problema em C, é mais ou menos assim;

Suponha que eu tenha um barco e queira navegar através de um rio de largura L, e o meu barco tem largura "Lb" , para que ele navegue a profundidade do rio deve ser no minímo H+1,onde H é o calado do navio.
Eu recebo como entrada L-1 valores de profundidade do rio da margem esquerda para á direita, ou seja se o rio tem 5 metros de largura, eu recebo um vetor com 4 valores, os quais representam a profundidade do rio a cada 1 metro.
Como eu faço para descobrir o primeiro ponto a partir da margem esquerda em que o barco pode navegar?
A largura Lb e o calado H do barco são dados como entrada também.
Obs: para calcular a profundidade entre um metro e outro , tem uma fórmula que é dada.

A questão é que não estou conseguindo pensar em um modo efetivo para resolver.

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Sáb, 21 de Setembro 2013, 18:56

Qual é a sua dúvida mesmo? É pedir os elementos do vector tendo em conta o L pedido, é isso?
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 » Sáb, 21 de Setembro 2013, 19:01

Sabendo que a largura em metros de um rio navegável é dada por um valor inteiro L. Os técnicos em navegação fizeram um perfil do leito do rio medindo sua profundidade a cada metro, a partir da margem esquerda. Assim, por exemplo, no i-ésimo metro, a profundidade do rio é dada por um valor inteiro não negativo P(i), sendo que nas margens esquerda e direita as profundidades são P(0) e P(L), respectivamente, ambas com valor nulo (ou seja, P(0) = P(L) = 0).

As seguintes hipóteses são consideradas neste exercício:

O perfil do leito do rio não muda ao longo do trecho navegável, e
entre duas medidas consecutivas de profundidade P(i) e P(i+1), pode-se considerar que a profundidade varia linearmente entre estes dois valores. Assim, se K é um valor real no intervalo [0,1], o valor da profundidade no metro (i+K) considerado a partir da margem esquerda, será dado por P(i) + K*(P(i+1)-P(i)).
No seu dia a dia, os técnicos se deparam com o seguinte problema. Um navio de largura W e calado (profundidade máxima a partir da superfície) C pretende navegar pelo rio. Os técnicos precisam determinar se existe uma distância segura de navegação, a contar da margem esquerda, que permite que o navio navegue pelo rio. A resposta dada pelo técnicos ao capitão do navio é um valor real (double) X tal que:

X é igual a -1.000000 se o navio não pode navegar pelo rio (nota: supõe-se aqui que o calado do navio é o mesmo ao longo de toda a sua largura), e
X é o menor valor positivo (distância da margem esquerda) que o navio pode navegar com segurança. Isso ocorre se, no trecho que vai de [X, X+W] a profundidade do rio é sempre maior ou igual a C + 0.1.

Entrada: duas linhas com valores inteiros separados por um espaço em branco entre eles. Na primeira linha são dados L, no intervalo (fechado) [2, 50], W e C, no intervalo (fechado) [1, 25]. Na segunda linha, são dados L-1 valores correspondentes às profundidades a 1, 2, ..., L-1 metros da margem esquerda (lembre-se que as profundidades nas duas margens são nulas).

Saída: um valor double, impresso com seis casas decimais, correspondendo à posição X mais à esquerda na qual o navio pode navegar ou ao valor -1.000000, quando o calado do navio não permite que ele navegue pelo rio.

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Sáb, 21 de Setembro 2013, 19:24

Então, teremos algo assim:
Insira L [2, 50], W e C [1, 25]:
5 3 2
Insira os valores de profundidade [são 4 valores]:
1 2 3 4


Então fazendo uso de malloc e/ou realloc, ao lançar a primeira linha de pedidos de dados, o valor L será então usado para preparar o vector que irá receber os L-1 valores de profundidade.

Era esta a sua dúvida? Se for, agora não lhe poderei adiantar algum código de exemplo, mas mais tarde (ao fim de jantar), verei o que poderei fazer ;)
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 » Sáb, 21 de Setembro 2013, 19:28

Eu quero saber a menor distância a partir da margem esquerda em que o navio pode passa;
exemplo:
L W C
2 1 1
3
0.366667 <- menor distância a partir da margem esquerda em que o navio pode passar.
Ou seja a 0.36667 metros da margem esquerda o navio pode passar.

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Sáb, 21 de Setembro 2013, 22:35

Vamos fazer por passos, ok?

Entrada dos valores, é isto que pretende, correcto?
Código: Selecionar todos
#include <stdio.h>
#include <stdlib.h>

int main()
{
    
int L=0W=0C=0;
    
int *P;
    
int valida;
    do
    {
        
valida 1;
        
printf("Insira os valores (2 <= L <= 50, 1 <= W <= 25, 1 <= C <= 25):\n");
        
scanf("%d %d %d", &L, &W, &C);
        if((
L<|| L>50) || (W<|| W>25) || (C<|| C>25))    // Valida valores
        
{
            
printf("ERRO: Valor(es) fora do limite!\n");
            
valida 0;
        }
    }while(!
valida);
    
    
/*
     * Depois de validado, cria o vector de profundidade que irá receber os valores
     */
    
= (int *) calloc(L+1sizeof(int));
    
P[0] = 0;    // Margem esquerda
    
P[L] = 0;    // Margem direita
    
    
do
    {
        
valida 1;
        
printf("Insira os valores de profundidade (são %d valores):\n"L-1);
        static 
int i;
        for(
i=1i<Li++)
        {
            
scanf("%d", &P[i]);
        }
        
        for(
i=1i<Li++)
        {
            if(
P[i] < 0)    // Valida valores
            
{
                
printf("ERRO: Valor negativo!\n");
                
valida 0;
            }
        }
    }while(!
valida);    // Valida valores
    
    
return 0;
}
 
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 Luis Cardoso » Sáb, 21 de Setembro 2013, 23:04

Depois, fazendo os cálculos, determina-se o K, que dará algo assim:
Código: Selecionar todos
C+0.1 = P(i) + K * (P(i+1) - P(i))


K = ((C+0.1) - P(i)) / (P(i+1) - P(i))


     (C+0.1) - P(i)
K = -----------------
     (P(i+1) - P(i))


Então, para o cálculo na aplicação, sugeria o seguinte:
Código: Selecionar todos
    double K=0.0X=-1.0;
    
int conta=0;
    
    for(
i=0i<Li++)
    {
        
= ((C+0.1) - P[i]) / (P[i+1] - P[i]);
        
printf("[%d]\t%f\n"contaK);
        if(
K>=&& K<=1)
        {
            if(
X==-1.0)
            {
                
K;
            }
            else if(
conta < (X+W) && (X+conta) < L)
            {
                
conta++;
            }
            else if(
conta >= (X+W) && (X+conta) < L)
            {
                break;
            }
            else
            {
                
= -1.0;
                
conta 0;
            }
        }
        else
        {
            
= -1.0;
            
conta 0;
        }
    }
    
printf("%.6f\n"X); 
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 » Sáb, 21 de Setembro 2013, 23:28

Então Luis obrigado pelo feedback , mas não entendi muito bem a segunda parte.Qual é a idéia nela? Porque tipo o valor de k sempre vai estar entre 0 e 1 ou seja 0<=k<=1 pelo que foi dado no enunciado.

Rogergalvao
 
Mensagens: 49
Registrado em: 31 Maio, 2013

Re: Ajuda em C

Mensagempor Luis Cardoso » Sáb, 21 de Setembro 2013, 23:30

Rogergalvao (21-09-2013, 23:28) escreveu:Então Luis obrigado pelo feedback , mas não entendi muito bem a segunda parte.Qual é a idéia nela? Porque tipo o valor de k sempre vai estar entre 0 e 1 ou seja 0<=k<=1 pelo que foi dado no enunciado.

Veja agora, acabei de corrigir, estava a esquecer-me de contar com o W.
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 Luis Cardoso » Sáb, 21 de Setembro 2013, 23:51

Rogergalvao (21-09-2013, 23:28) escreveu:Então Luis obrigado pelo feedback , mas não entendi muito bem a segunda parte.Qual é a idéia nela? Porque tipo o valor de k sempre vai estar entre 0 e 1 ou seja 0<=k<=1 pelo que foi dado no enunciado.

Ah, percebi agora a sua dúvida, pelo enunciado, o K deve estar compreendido entre 0 e 1 se C+0.1 é menor ou igual a P(i) + K * (P(i+1) - P(i)), ficando portanto assim:
C+0.1 <= P(i) + K * (P(i+1) - P(i))

Ora, para efeito de cálculos, efectivamente só precisamos do valor mínimo, C+0.1, cujo C é conhecido via entrada do utilizador. Da fórmula apresentada, se reparar bem, a única incógnita é o K. Havendo portanto duas formas de a obter:
  1. Testa-se para cada i, um valor de K que vá de 0 a 1, passando pelos infinitos números intermédios;
  2. Calcula-se o valor de K, através da transformação da fórmula, isolando-se num membro o que se pretende obter.

Eu apresentei-lhe a solução B, se quer a A, isso agora já não é comigo... xD
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

Próximo

Voltar para Questões gerais

Quem está online

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

cron