Ir ao conteúdo
  • Cadastre-se

C Contagem de movimentos e valor inválido


Serena
Ir à solução Resolvido por Midori,

Posts recomendados

Oi pessoal, alguém pode me ajudar

Estou aprendendo a programar e travei nesse exercício. Não sei como fazer a contagem de movimentos e também informar que um dos valores iniciais é inválido.
O usuário deve informar dos pontos (x1,y1)- que indica o canto inferior esquerdo do retângulo e (x2,y2) - que indica o canto superior direito, além de informar um ponto inicial e quanto o ponto se desloca(caso um dos valores for inválido o programa é encerrado). No fim, o programa termina quando o ponto sair do retângulo, informando quantos movimentos o ponto fez antes de sair do perímetro.

#include<stdio.h>
#include<locale.h>

int main (){

    setlocale(LC_CTYPE,"");

    float x1, y1;
    float x2, y2;
    float  x3, y3;
    float anda=0;
    int direcao;

    printf("\n Informe os valores de x e y, respectivamente, do ponto P1: ");
    scanf("%f %f", &x1, &y1);

    printf("\n Informe os valores de x e y, respectivamente, do ponto P2: ");
    scanf("%f %f", &x2, &y2);

    while (x1>=x2 || y1>=y2){
        printf("\n O valor das coordenadas de P2 devem ser maiores que P1. \n Insira novamente valores para o ponto P2: ");
        scanf("%f %f", &x2, &y2);
    }
    printf("\n Informe as coordenadas do objeto: ");
    scanf("%f %f", &x3, &y3 );

    printf("\n Informe o passo de deslocamento: ");
    scanf("%f", &desloc);

    printf("\n Para o objeto se mover use: \n 1 - andar para a esquerda \n 2 - andar para a direita \n 3 - andar para baixo \n 4 - andar para cima");

    do {
            printf("\n Informe a direçao: ");
            scanf("%d", &direcao);

            switch(direcao){
                case 1: x3 = x3 - anda;
                        break;
                case 2: x3 = x3 + anda;
                        break;
                case 3: y3 = y3 - anda;
                        break;
                case 4: y3 = y3 + anda;
                        break;
                default: printf("\n Direçao inválida.");
            }
            printf("\n Direçao atual: %.1f %.1f", x, y);
            

    } while (x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2);

    printf("\n\n O objeto saiu do perímetro definido.");

return 0;

}

 

Link para o comentário
Compartilhar em outros sites

Basicamente, isso funciona:

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

typedef struct {
    double x;
    double y;
} Ponto;

int main() {
    Ponto ponto1 = (Ponto) {0.0, 0.0};
    Ponto ponto2 = (Ponto) {0.0, 0.0};
    Ponto objeto = (Ponto) {0.0, 0.0};

    int passos = 0;
    int direcao = 0;
    
    printf("Digite as coordenadas do primeiro ponto. \n");
    printf("X: ");
    scanf(" %lf%*c", &ponto1.x);
    printf("Y: ");
    scanf(" %lf%*c", &ponto1.y);

    printf("Digite as coordenadas do segundo ponto. \n");
    printf("X: ");
    scanf(" %lf%*c", &ponto2.x);
    printf("Y: ");
    scanf(" %lf%*c", &ponto2.y);

    printf("Digite as coordenadas do objeto. \n");
    printf("X: ");
    scanf(" %lf%*c", &objeto.x);
    printf("Y: ");
    scanf(" %lf%*c", &objeto.y);

    printf("Selecione a direcao. \n\n");
    printf("              [ 1 ] - Cima \n");
    printf("[ 2 ] - Esquerda           [ 3 ] - Direita \n");
    printf("              [ 4 ] - Baixo \n\n");
    printf("> ");
    scanf(" %i%*c", &direcao);

    switch (direcao) {
        case 1:
            for (double i = objeto.y; i <= ponto2.y; ++i, ++passos);
            break;
        case 2:
            for (double i = objeto.x; i >= ponto1.x; --i, ++passos);
            break;
        case 3:
            for (double i = objeto.x; i <= ponto2.x; ++i, ++passos);
            break;
        case 4:
            for (double i = objeto.y; i >= ponto1.y; --i, ++passos);
            break;
        default:
            printf("[ E ]: Direcao invalida! \n");
            break;
    }

    printf("---------------------- \n");
    printf("Foram dados %i passos. \n", passos);
    printf("---------------------- \n");

    return EXIT_SUCCESS;
}

Porém precisa adicionar as verificações para garantir que os dados sejam válidos.

Link para o comentário
Compartilhar em outros sites

  • Solução

Outra forma já pedindo as coordenadas do retângulo na mesma instrução.

 

#include <stdio.h>

typedef struct retangulo{
    float x1;
    float y1;
    float x2;
    float y2;
}Retangulo;

typedef struct objeto{
    float x;
    float y;
}Objeto;

int movimento(Objeto *obj, int deslocamento){
    int direcao;
    printf("\n1)Direita\n2)Esquerda\n3)Cima\n4)Baixo\n: ");
    scanf("%d",&direcao);
    switch(direcao){
        case 1: obj->x+=deslocamento; break;
        case 2: obj->x-=deslocamento; break;
        case 3: obj->y-=deslocamento; break;
        case 4: obj->y+=deslocamento; break;
        default: printf("Coordenada invalida\n"); return 0;
    }
    return 1;
}

int main(){
    Retangulo ret;
    Objeto obj;
    int mv=0, deslocamento;

    while(1){
        printf("Coordenadas do retangulo: ");
        scanf("%f %f %f %f",&ret.x1,&ret.y1,&ret.x2,&ret.y2);
        if(ret.x2<=ret.x1 || ret.y2<=ret.y1){
            printf("Coordenada invalida\n");
        }else{
            printf("Coordenadas do objeto: ");
            scanf("%f %f", &obj.x, &obj.y);
            printf("Deslocamento: ");
            scanf("%d", &deslocamento);
            break;
        }
    }
    while(1){
        mv += movimento(&obj,deslocamento);
        if(obj.x<ret.x1 || obj.x>ret.x2) break;
        if(obj.y<ret.y1 || obj.y>ret.y2) break;
        printf("Posicao atual: %.1f,%.1f",obj.x,obj.y);
    }
    printf("Movimentos = %d\n", mv);
    return 0;
}

 

  • 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...