Ir ao conteúdo
  • Cadastre-se

C Programa de "GPS" em C


Julia_Lucia

Posts recomendados

Olá pessoal, estou em uma cadeira de introdução a programação em C e me encontro com a seguinte atividade para fazer utilizando funções:

"Sua empresa decide lançar um novo sistema de localização inovador para carros chamado GPS (Girando Para Sempre). Esse sistema avisa ao motorista se ele está andando em círculos, ou seja, se ele fez tantas curvas que acabou voltando à direção original. Escreva um programa com uma função que gera aleatoriamente uma direção (char ‘D’ para direita e char ‘E’ para esquerda), e que vai dobrando o carro 90 graus a cada vez. O carro para quando fizer uma volta completa (tanto faz para que lado). No final, imprima a quantidade de curvas que o carro fez.

 

Dicas:

A função chamada apenas retorna uma direção (‘D’ ou ‘E’) aleatoriamente.

Tome cuidado, um carro que dobra para a direita e logo após para esquerda retorna à sua direção original, porém não completou uma volta.

 

Atenção: O programa deverá obrigatoriamente usar funções."

 

Eu não consigo entender qual é a lógica que deveria usar para resolver esse problema, nem como "sortear" aleatoriamente a letra D ou E. Estou realente perdida neste exercício a dias...

Se alguém puder me ajudar ficarei muito grata! :D

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Em 14/10/2020 às 22:06, Julia_Lucia disse:

Eu não consigo entender qual é a lógica que deveria usar para resolver esse problema, nem como "sortear" aleatoriamente a letra D ou E. Estou realente perdida neste exercício a dias...

Se alguém puder me ajudar ficarei muito grata!

 

A tal volta tem 360 graus. Cada curva tem 90. Então para dar uma volta tem que fazer 4 conversões seguidas para o mesmo lado, já que 4 x 90 = 360.

 

Nada mais.

 

Para fazer cada curva o simples é usar rand() que devolve um número inteiro. Pode usar esse número e se for par você vai para a esquerda, já que o lado par da rua é o direito. Contar as curvas: some 1 a cada curva. Uma volta: 4 curvas para o mesmo lado em seguida...

 

  • Curtir 1
  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Em 14/10/2020 às 22:06, Julia_Lucia disse:

[...] Eu não consigo entender [...]

A que pena, bastava simular (brincando) com carrinho imaginário (ou real) seguindo as regras. Com tempo notaria que seu carrinho é uma abstração que podemos relacionar, por exemplo, ao ponteiro de um relógio de ponteiros (rel. analógico) ou da bússola do GPS (Girando Para Sempre).

 

         0 
  +-------------+
  |             |     D > Direção Horária      (incremento)
  |     * -->   | 90  E < Direção Anti-horaria (decremento)
  |             |
  +-------------+ 
        

 

"

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Então, até o momento consegui desenvolver isso:

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

//funçao que gera aleatoriamente D ou E
char funcao1()
{
    int num;
    char direcao;

    srand(time(NULL));

    num = rand() %0;
    if (num == 0)
    {
        direcao = 'D';
    }
    else
    {
        direcao = 'E';
    }
    printf("%c", direcao);
    return direcao;
}

int main(){
setlocale(LC_ALL, "Portuguese");

    int direita = 0, esquerda = 0, limite = 0;
    char direcao = funcao1 ();
    char memoria;

    //Iniciando a variável memoria
    funcao1();
    memoria = direcao;

    if (direcao == 'D')
    {
        direita++;
    }
    else
    {
        esquerda++;
    }

    //Repetição até que ocorra 4 curvas para o mesmo lado
    while (direita < 4 || esquerda < 4 || limite < 1000)
    {
        funcao1();
        if (memoria == direcao)
        {
            if (direcao == 'D')
            {
                direita++;
            }
            else
            {
                esquerda++;
            }
            memoria = direcao;
        }
        else
        {
            if (direcao == 'D')
            {
                esquerda = 0;
                direita++;
            }
            else
            {
                direita = 0;
                esquerda++;
            }
        }
        limite++;
    }

    //Imprimir o numero de voltas
    printf("\nO carro andou uma volta completa\n");
    printf("\nO carro fez %d curvas\n", limite);

 return 0;
}

Porém não está funcionando... Alguém sabe o que esta errado?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

38 minutos atrás, Julia_Lucia disse:

Porém não está funcionando... Alguém sabe o que esta errado?

 

Você deve considerar apenas avanços consecutivos na mesma direção... Até o quarto.
 

@Julia_Lucia quatro avanços na mesma direção são a volta completa. Apenas isso. 

Do tópico #2:

Em 15/10/2020 às 23:41, arfneto disse:

A tal volta tem 360 graus. Cada curva tem 90. Então para dar uma volta tem que fazer 4 conversões seguidas para o mesmo lado, já que 4 x 90 = 360.

 

Nada mais.

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, Julia_Lucia disse:

num = rand() %0;

Acredito que esse trecho seja problemático também, pois você está pedindo o resto da divisão de alguma coisa por 0, porém não existe divisão por zero. No meu entendimento, esse trecho nem era para compilar.

 

Para sortear valores binário (0 ou 1), faça assim:

num = rand() % 2;

Ou seja, dois valores possíveis sequenciais começando de 0 (0 e 1).

Além disso, você não precisa trabalhar com as letras D e E, pois elas são apenas simbólicas, como só existe duas possibilidades para virar o carro (direita e esquerda), você poderia trabalhar com valores binários (0 e 1) diretamente, por exemplo, 0 representa DIREITA e 1 representa ESQUERDA.

  • Curtir 1
  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, AdrianoSiqueira disse:

Além disso, você não precisa trabalhar com as letras D e E, pois elas são apenas simbólicas, como só existe duas possibilidades para virar o carro (direita e esquerda), você poderia trabalhar com valores binários (0 e 1) diretamente, por exemplo, 0 representa DIREITA e 1 representa ESQUERDA

Eu também pensei isso, porém; se seguir a riscas o enunciado é algo importante, e geralmente é quando se trada de exercício de escalares, esse  raciocino para por aqui.

 

Veja:

Em 14/10/2020 às 22:06, Julia_Lucia disse:

Escreva um programa com uma função que gera aleatoriamente uma direção (char ‘D’ para direita e char ‘E’ para esquerda), e que vai dobrando o carro 90 graus a cada vez.

 

Dicas:

A função chamada apenas retorna uma direção (‘D’ ou ‘E’) aleatoriamente.

 

Talvez essa parte do enunciado não esteja aberto para interpretações somente se admite o mais certo quando se segue a 'receita do bolo', que nesse caso é o enunciado mesmo. Além disso, por qual ração as direções estão justamente escritas em literal char.

 

Eu fiz as correções, veja

char
funcao1 (void)
{
    int	 num;
    char direcao;

    // srand(time(NULL)); <-- essa funcao na primeira linha de main
    // depois apague esses e outro comnetario
    num= rand() % 2;
    if (num == 0)
    {
        direcao= 'D';
    }
    else
    {
        direcao= 'E';
    }
    //printf("%c", direcao); <-- aqui nao imprime nada
    return direcao;
}

 

 Funciona!

 

 

Opinião:

Acredito que antes de propor novos meios ou no caso mais grave impor uma solução; é necessário explorar a lógica e a programação apresentada pela autora  como @AdrianoSiqueira., afinal de conta é da autora o exercício.

"

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...