Pascal - Andamento dum Robot

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

[[]]
 
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.
 
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 :)
 
Pascal robot

ctr disse:
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.

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...
 
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 :(
 
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:
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.
 
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:
 
LionGreen disse:
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:

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

mas como qualquer coisa, convém ir aprendendo aos poucos e desde o início :)
 
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

[[]]
 
SwimmerBoy disse:
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

[[]]


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á...
 
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...
 
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
 
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?
 
[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]
 
SwimmerBoy disse:
Algoritmo?!?! Traduz lá isso?!

Temos até sábado!

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
 
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.
 
Back
Topo