1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Pascal - Andamento dum Robot

Discussão em 'Programação' iniciada por SwimmerBoy, 26 de Outubro de 2004. (Respostas: 45; Visualizações: 3432)

  1. SwimmerBoy

    SwimmerBoy Folding Member

    Olá ppl

    Então a situação é a seguinte:

    Tenho uma cadeira de IP (introdução à programção) e nunca tive programação na vida..... Estou a apanhar completamente do ar....

    Precisava de uma ajuda para fazer este programa:

    Mover um Robot

    Um determinado robot pode deslocar-se pelas diversas casas de um tabuleiro, por linhas ou por colunas, de forma análoga aos movimentos duma torre num tabuleiro de xadrez. As movimentações físicas permitidas são activadas por apenas dois comandos próprios:


    1) A instrução Frente faz avançar o robot para a casa situada imediatamente à sua frente;

    2) A instrução Direita resulta numa mudança de orientação do robot, por rotação vertical de 90 graus para a sua direita, sem se deslocar da casa em que se encontre nessa altura.


    Por hipótese, as linhas e as colunas do tabuleiro têm a orientação dos pontos cardeais e são numeradas a partir do valor 1. Nestas condições, as linhas numeram-se no sentido Sul-Norte e as colunas no sentido Oeste-Este. Também se admite que, ao ser inicialmente colocado numa das casas do tabuleiro, a orientação do robot é sempre Sul, e considere que o tabuleiro tem 7 colunas e 9 linhas.

    Pretende-se construir um programa para gerar e afixar no ecrã toda a sequência de comandos que levará o robot de uma posição inicial arbitrária a qualquer outra existente no tabuleiro, através da passagem pelo menor número possível de casas intermédias. As coordenadas das casas inicial e final serão dadas interactivamente pelo utilizador, pelo que precisarão de ser validadas. Além disso, o programa também deverá indicar a orientação do robot quando este atingir a casa final.


    Não faço ideia de como começar.... O P4rthen0n pode confirmar...o nosso professor de práticas é um quanto ou tanto BAD e não ajuda os k mais precisam (aka eu e P4rthen0n)....

    Dêm ai umas dicas sff

    [[]]
     
  2. Feiticeiro

    Feiticeiro Power Member

    Em Pascal? Em Pascal só aprendi a fazer uma calculadora...lol...
     
  3. ctr

    ctr Power Member

    Depreendo que saibas o q é uma matriz, podes usar uma matriz bidimensional para fazer isso, por exemplo, podes preencher a matrix com 0 "zeros" em todas as casas excepto na casa em que está o robot, ai usas o valor 1 "um".
    Cada vez que o robot se move para uma nova casa mudas o valor na matriz, onde ele estava passa a 0 e para onde vai muda para 1. Para onde ele está virado podes guardar isso numa outra variável. Outra maneira seria usares um apontador para a matrix, mais apontadores já é mais "à frente". Agora deves pesquisar o como fazer isto na linguagem que queres, aconselho que sejas tu a fazer o programa e não o "saques" já feito, senão nunca mais aprendes a sintax da linguagem e como funcionar com ela, logo que estejas mais dentro da linguagem o mais dificil torna-se ter a ideia de como desenhar o programa, optimiza-lo e não a programação em si.

    Cmps.
     
  4. HecKel

    HecKel The WORM

    Segue a ideia que o ctr deu, no entanto não te esqueças que para programares tens de pensar da forma mais primária, isto é, tens de desmantelar o problema em vários subproblemas, e aí resolver individualmente cada subproblema, no fim só tens de garantir k funcionam todos juntos :) dá a ideia k te vai complicar a vida, mas na verdade em vez de um grande problema vais ter vários pequenos problemas que resolves rápidamente.

    Mais outra coisa, quando estás a programar e pensas k o k vais fazer é imediato, lembra-te que programar essas ideias pode não ser tão linear assim, o pc é burro, tens de dizer todos os passinhos :P Agora vais achar isso ridiculo, mais tarde já deves compreender melhor :)
     
  5. inginheiiro

    inginheiiro Power Member

    Pascal robot

    Faço das letras do ctr as minhas.
    Se não meteres as mãos na massa, nunca mais lá vais.
    dou-te uma paquena ajuda:


    type
    StatusType = (0, 1);
    DirType=(Norte,Sul,Este,Oeste);
    BoardType = array[1..9,1..7] of StatusType;
    RobotType = Record
    X : Integer;
    Y : Integer;
    Direccao : DirType;
    end;

    var
    tabuleiro : BoardType;
    Robot : RobotType;

    Begin
    (* Inicializa o tabuleiro *)

    for count1 := 1 to 9 do
    for count2 := 1 to 7 do
    tabuleiro[count1, count2] := 0;

    (* Coloca o robot na posicao 2,2 do tabuleiro *)
    Robot.X:=2;
    Robot.Y:=2;
    Robot.Direccao:=Norte;
    tabuleiro[Robot.X, Robot.Y]:=1;

    ...

    End.

    A resolução do problema é mais simples do que parece...
     
  6. P4rthen0n

    P4rthen0n Power Member

    inginheiiro, isso eh o programa feitinho? :D

    Obrigado pelas indicacoes dos 4, mas o maximo k nos aprendemos e k podemos usar eh while, if, array (k ele introduziu e eu nem percebi kek fazia nem como se fazia o proprio comando) e pouco mais. Como podem constactar, eh mesmo MUITO basico para kem ja sabe, mas nao para pessoas como eu k o pouco contacto com programacao k tive foi com o Pascal e da maneira k o Swimmer descreveu. :(

    thz pela ajuda ate agora, mas nao vai dar :(
     
  7. SwimmerBoy

    SwimmerBoy Folding Member

    Em meu nome e em nome do P4rthen0n, o nosso origado pelas dicas e pela ajuda, mas como ele descreveu, ainda não chegamos a types nem records....

    inginheiiro... axas k és capaz de fazer o programa e colocares alguns comentarios nas diversas partes do programa a especificar o k é k cada comando faz (só +/-....)?!?

    É k o meu (e do P4rthen0n) é não perceber o k cada comando vai fazer.... Não nos sabem explicar aquilo como deve ser nas aulas....

    Desculpem a maçada e se por acaso parece k kero a papinha toda feita, mas sem saber o k cada comando faz e não tendo a ajuda do professor, é mm muito dificil.....

    Origado a todos (+ uma vez) pela ajuda e pela compreensão...

    [[]]
     
    Última edição: 26 de Outubro de 2004
  8. AwakE

    AwakE Banido

    Isso é Pascal?

    Esse problema tem duas fases completamente separadas:

    1 - Pensar no algoritmo que te resolve o problema (não precisas de teclar).

    2 - Implementar.

    Claro que na primeira fase convem ter o minimo ideia do que podes e não podes fazer. Antes de desesperares com a segunda, pensa na primeira ;).

    PS: Não comeces a segunda sem ter a primeira feita....durante a segunda fase podes adaptar a solução, mas nunca faze-la de raiz.
     
  9. Black_Gamer

    Black_Gamer Power Member

    Voces querem e a papa feita :D
     
  10. LionGreen

    LionGreen 1st Folding then Sex

    Se Pascal for tão dificil como C++ um gaijo tem mesmo que agarrar o comboio desde inicio porque senão torna-se mesmo muito complicado :005: :005: :005:
     
  11. fap

    fap Power Member

    desculpem a expressão mas pascal é cagada :x2:

    mas como qualquer coisa, convém ir aprendendo aos poucos e desde o início :)
     
  12. SwimmerBoy

    SwimmerBoy Folding Member

    Pessoal, por favor, não façam disto spam....isto é para um trabalho e para mim, pascal é dificil, especialmente da maneira como esta a ser ensinado.....

    Se kiserem ajudar, é bem vinda a ajuda, mas para falarem de outras coisas, façam-no no geral sff

    [[]]
     
  13. Kermit the frog

    Kermit the frog I quit My Job for Folding


    pah n desesperes...pascal é só treinar :x2: (spamming)...

    Hj tenho teste ... damn ... vamos lá ver como corre :D




    P.S. - Peçam à mónica para vos ensinar a fazer uma parte do programa... o p4rthen0n que peça :fart: , mas o xuimer com a sua tecnica do tlm tb dá...
     
  14. inginheiiro

    inginheiiro Power Member

    Robot.

    Boas,
    Apesar de vc's não terem aprendido o que são records, nem types, nem Cases, deveriam estudar para acelarar a vossa aprendizagem. Só vos ajuda...

    O meu pascal está um bocado rusty, já que não o uso á cerca de 15 anos :)

    vamos lá então.

    1. Tipos.
    <b>Type</b> serve para declarar tipos de dados.
    Supôe que queres declarar uma variavel que possa conter 3 tipos de fruta (Maca,Banana,uva), declaras um tipo que suporte isso.

    Type Fruta=(Maca,Banana,Uva);
    var
    VariavelFruta:Fruta;
    begin
    VariavelFruta:=Maca;
    VariavelFruta:=Banana;
    VariavelFruta:=Uva;
    end.


    2.Records.
    <b>Record</b> Serve para agregares informação (neste momento basta-te teres esta ideia, pois serve para algo mais :) ).

    Supoe que queres criar um robot a 2D. Este tem que ter os seguintes dados:
    PosiçãoX (Inteiro)
    PosicaoY (Inteiro)
    Orientacao (Norte,Sul,Este,Oeste).

    1.declaras um tipo com as orientacoes.
    type oriType=(Norte,Sul,Este,Oeste);

    2.declaras um record que agrupe/junte os dados.
    type robotType=record
    X:Integer;
    Y:Integer;
    Orientacao: oriType;
    end;

    3. Assim já podes declarar uma variavel que represente o robot:
    var robot:RobotType;
    begin

    {Uso do robot}
    robot.x:=22;
    robot.y:=12;
    robot.Orientacao:=Norte;

    end.


    -------------------------------------/----------------------------------
    Não vos vou resolver o problema, isso compete-vos a vós fazer ... o que é impossivel se só olharem para ele 30m ou nem tiverem interesse em puxar pelos neuronios...

    No entanto dou-vos mais uma ajuda, o programa basicamente estruturado :

    -------------------------------------/----------------------------------
    type
    DirType=(Norte,Sul,Este,Oeste);
    BoardType = array[1..9,1..7] of integer;
    RobotType = Record
    X : Integer;
    Y : Integer;
    Direccao : DirType;
    end;

    var
    tabuleiro : BoardType;
    Robot : RobotType;
    count1 : Integer;
    Count2 : Integer;

    Begin


    { INICIALIZA O ARRAY }

    for count1 := 1 to 9 do
    for count2 := 1 to 7 do
    tabuleiro[count1, count2] := 0;


    { COLOCA O ROBOT NA POSICAO 2,2 VIRADO PARA SUL }

    Robot.X:=2;
    Robot.Y:=2;
    Robot.Direccao:=Sul;
    tabuleiro[Robot.X, Robot.Y]:=1;

    { VIRA O ROBOT PARA NORTE. }
    Robot.Direccao:=Norte;

    { DESLOCA O ROBOT UMA POSIÇÃO PARA CIMA. }
    tabuleiro[Robot.X, Robot.Y]:=0;
    Robot.Y:=Robot.Y-1;
    tabuleiro[Robot.X, Robot.Y]:=1;

    { IMPRIME O TABULEIRO NO ECRAN. }
    for count1 := 1 to 9 do
    Begin
    for count2 := 1 to 7 do
    Write(tabuleiro[count1, count2]+' ');
    Writeln;
    end;

    Case Robot.Direccao of
    Norte : Writeln('O Robot está virado para Norte!');
    Sul : Writeln('O Robot está virado para Sul!');
    Este : Writeln('O Robot está virado para Este!');
    Oeste : Writeln('O Robot está virado para Oeste.');
    end;


    End.

    -------------------------------------/----------------------------------

    Mais não faço ... compete-vos a vc's PENSAR/analisar/estruturar/completar/testar o programa.

    Faço isto pq sou um bocado contra a politica de ensino que muita gente usa nos dias que correm ... e sendo eu actualmente tmb professor numa instituição superior, tento mudar um bocado essa imagem, muitas vezes criada sem fundamento pelos alunos...
     
  15. Seavoices

    Seavoices Power Member

    Bom, velhos tempos esses de Pascal. Foi um bom início para início de programação. Depois na programação de alto nível é tudo mais fácil

    Aquilo que vos recomendo é terem atenção ao que desenvolver porque pode ajudar-vos imenso.

    Tive dois óptimos professores, tanto em programação (Pascal neste caso) como também em Inteligência Artificial. Ambos neste momento no IST

    Como tal, embora não vos vá ajudar directamente porque (como alguém disse) a papinha está toda aqui na thread, vou-vos recomendar o livro escrito pelo Dr. João Pavão Martins de introdução a Pascal:

    Martins J. P., Introdução à Programação Utilizando o Pascal, Lisboa, Portugal: McGraw-Hill de Portugal, 1994

    Já que aparentemente os vossos professores não são grande coisa, este livro pode ajudar imenso.

    Um abraço
     
  16. AwakE

    AwakE Banido

    Swimmer, já pensaste no algoritmo? Para essa parte não precisas do Pascal....só mm da massa cinzenta.

    Já agora quanto tempo têm para fazer isso?
     
  17. Chip

    Chip Zwame Advisor

    [offtopic]

    inginheiiro, ja te puseram a dar aulinhas? :D

    É bem é bem, tinhas de começar a trabalhar um bocadinho de vez em quando :P

    [/offtopic]
     
  18. SwimmerBoy

    SwimmerBoy Folding Member

    Algoritmo?!?! Traduz lá isso?!

    Temos até sábado!
     
  19. Kermit the frog

    Kermit the frog I quit My Job for Folding

    The term algorithm (pronounced AL-go-rith-um) is a procedure or formula for solving a problem. The word derives from the name of the mathematician, Mohammed ibn-Musa al-Khwarizmi, who was part of the royal court in Baghdad and who lived from about 780 to 850. Al-Khwarizmi's work is the likely source for the word algebra as well.

    A computer program can be viewed as an elaborate algorithm. In mathematics and computer science, an algorithm usually means a small procedure that solves a recurrent problem.


    An algorithm is a finite set of well-defined instructions for accomplishing some task which, given an initial state, will result in a corresponding recognisable end-state (contrast with heuristic). Algorithms can be implemented by computer programs, although often in restricted forms; an error in the design of an algorithm for solving a problem can lead to failures in the implementing program.


    Example:

    Given: a list "List"

    largest = List[1]
    counter = 2
    while counter <= length(List):
    if List[counter] > largest:
    largest = List[counter]
    counter = counter + 1
    print largest
     
  20. AwakE

    AwakE Banido

    Um algoritmo é um procedimento para resolução de um problema.

    Antes de te pores a programar, tens de ter uma ideia de como vais resolver o problema.

    Já pensaste como vais determinar o caminho mais curto a partir de todos os possiveis? Em termos conceptuais. A programação é apenas a implementação em Pascal (ou C ou Java, ou COBOL) do algoritmo.

    Se não sabes como vais resolver o problema vais programar o q? Pelo que me apercebi nesta thread o teu problema não tem a ver com Pascal....tu não sabes é como resolver o problema. Se estiver enganado corrige-me.

    Como alguem já disse, é preciso PENSAR.
     

Partilhar esta Página