Jump to content
Knectus

[Pzim] Consultar matricula com base no nome do condutor/matricula

Recommended Posts

Knectus

Editado (1) vez :

Seguinte, tenho um trabalho de pascal (PZIM) em que estou com alguns problemas em concluir, agradeço se alguém me der umas dicas ..

Gostaria de permite consulta lugar do veiculo com base na matricula, permite consulta lugar com base no nome do condutor e permite mostrar a taxa de ocupação em % ..

Eu sei que o codigo é muito grande e provavelmente pouca gente irá me ajudar, mas qualquer dica seria importante, visto que estou bloquiado   😲

O meu principal problema é saber como consultar com base no codutor, o resto eu consigo .. :s

- Não sei por onde começar ..

Sim, "floribela style" --'

 

[left]
type dados = record
   nome: string;
   modelo: string;                                              
   marca: string;
   matricula: string;
   Disponivel: boolean;                                             
end;
   var x:array[1..50] of dados;
  i,cont:integer;
  px:string;
  a:char;
  
  procedure ResetVariaveis;                                              
   begin
   	 	x[i].nome:='Vazio';
   		x[i].modelo:='Vazio';
   		x[i].marca:='Vazio';
   	     x[i].marca:='Vazio';
     x[i].matricula:='Vazio';                                                     
     x[i].disponivel:=true;  // true = disponivel & false = Ocupado/Não Disponivel    
   	a:=' ';   	                                                                                          
   end;
   
   procedure ACarregar;        // Procedimento utilizado para executar os pedidos do utilizador.
var i:integer;
Begin
   writeln(#7,PX);
   for i:=1 to 19 do           //18 retirar
   begin
      delay(60) ;
      write(#177) ;
   end; 
   	writeln;writeln;
End;

  procedure MostrarLista;   // Este procedimento tem a função de mostrar a lista de lugares disponiveis, caso contrario 
  	var z:boolean;
    begin
     clrscr;
    	z:=false;
     writeln ('                              Lista de Lugares Diponiveis :');
      for i:=1	to 50 do
    	   begin
    	   	if x[i].disponivel = true then
       z:=true;
        end;
      if z=true then
 write ('Os lugares disponiveis estão em: ');  
  for i:=1 to 50 do
   begin
   	if x[i].disponivel = true then	  
     	write(i,' | ');
        end; writeln; writeln;
        writeln ('             Concluido com Sucesso, Presione qualquer tecla para continuar! ');
     	readkey;
    end; 

  procedure DisponivelSN;
    begin
     clrscr;
    	          writeln ('             Insira o numero do lugar para saber se esta Disponivel ou não :');
       read (i);
  if (i>0) and (i<51) then
   begin      
       	if x[i].disponivel = false then
	  begin
	     writeln ('      ««««««««««  Informações sobre o lugar ',i,' [Ocupado]  ««««««««««'); writeln;       // erro no  writeln (' >>>>>>>>>> ou <<<<<<<<< ou ººººººººº ');
	  	writeln ('                    Nome do Dono do veiculo : ',x[i].nome); writeln;
		writeln ('                      Modelo do veiculo : ',x[i].modelo); writeln;
		writeln ('                        Marca do veiculo : ',x[i].marca); writeln;
		writeln ('                          Matricula do veiculo : ',x[i].matricula); writeln; writeln;
		writeln ('              Concluido com Sucesso, Presione qualquer tecla para continuar! ');
     			readkey;
	  end else
	  if x[i].disponivel = true then
	   begin
	   	writeln ('                       O Lugar encontra-se [Disponivel] '); writeln;
	   				writeln ('              Concluido com Sucesso, Presione qualquer tecla para continuar! ');
     			readkey;
	   end;
   end
    else DisponivelSN;		  	      		
    end; 
     
  procedure Adicionarcarro;
    begin
     clrscr;             // Falta o procedure ACARREGAR;
    	    	 writeln ('             Escolha o lugar que quer estacionar o carro :');    	    	 
 		 read(i);  // Complica usar nesta linha uma string para nao ter erro a inserir o carro..
		  if (i>0) and (i<51) then
		  begin  
		    if x[i].disponivel=false then
	          begin
                 writeln ('             O Lugar encontra-se ocupado volte a tentar');
		       writeln ('      Presione qualquer tecla para continuar! ');
		       readkey; 
		        Adicionarcarro;
		    end                                                                                                                                                                                                                                     
 		    else if x[i].disponivel=true then
 		    begin
		     x[i].disponivel:=false;
		     cont:=cont+1;
    		 		 writeln ('Escreva o seu nome :');
 			      read(x[i].nome);
				 writeln ('Insira o modelo do seu carro :');
			      read (x[i].modelo);
			 writeln ('Insira a marca do seu carro :');
				 read (x[i].marca);
			 writeln ('Insira a matricula do seu carro :');
				 read(x[i].matricula) ;
			 px:='A Adicionar o carro..'; // PX := 'A Adicionar o carro.. -> É a string utilizada no procedimento PX 
	                ACarregar; 
		      writeln ('Presione qualquer tecla para continuar! ');
		           readkey;
		    end;
		   end
		   else AdicionarCarro;		 	    
    end;
          
  procedure RetirarCarro;
    begin
     clrscr;
     	if (i>0) and (i<51) then
	 begin 
    	    	  writeln ('Escolha o lugar que quer retirar o carro :');    	    	 
 	 	  read(i);
		  ResetVariaveis;
		  px:='A retirar o carro..'; // PX := 'A retirar o seu carro..' -> É a string utilizada no procedimento PX 
	       ACarregar;
		          writeln ('             Concluido com Sucesso, Presione qualquer tecla para continuar! ');
     	readkey;
	end
	else RetirarCarro;	 		 	
    end;  
   
   Procedure VeiculosEstacionados;
    begin
     clrscr;
     	if cont = 0 then
     		writeln (' De momento não se encontram veiculos estacionados. ')
     	else writeln (' Encontram-se ',cont,' veiculos estacionados.'); 
	writeln;   	
     writeln ('             Concluido com Sucesso, Presione qualquer tecla para continuar! ');
     	readkey;	 		 	
    end; 
    
    procedure MatriculaNome;
    		var c:char;
	    mat:string; //CHAR?
     begin									// N FUNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D:
      clrscr;
      writeln ('  Quer procurar o lugar pela Matricula? Ou Nome ?');
      read(c);
      if (c = 'Matricula') or (c = 'matricula') then
       begin
        writeln (' Insira a matricula do carro :');
        read (mat);
        	for i:=1 to 50 do
        	 begin
            if x[i].matricula = mat then
            writeln ('O carro encontra-se na posição ',i,' do estacionamento.');	
        	 end;
       end
       else if (c = 'Nome') or ( c = 'nome') then
             begin
             
             end;       
     end;
     

  procedure MenuPrincipal;
   begin
   	repeat
   clrscr;
        for i:=1 to 9 do
    write (CHR(40),' ') ;
        write('  Bem vindo ao Estacionamento !  ');
        	   for i:=1 to 9 do
    write (CHR(41),' ') ;
   	   writeln;
   	   writeln;
   	   writeln ('                    1- Mostrar a Lista de lugares disponiveis '); 
   	   writeln ('                    2- Saber se esta disponivel ou não '); 
   	   writeln ('                    3- Adicionar carro ao estacionamento '); 
   	   writeln ('                    4- Retirar carro do estacionamento ');    
   	   writeln ('                    5- Saber quantos veiculo estão Estacionados ');  
   writeln ('                    6- Consultar lugar com base na Matricula/Nome ');  
   	   writeln ('                    7- Sair do Programa ');  
   	   writeln;
   	   writeln (' - Nota: No estacionamento encontram-se apenas 50 lugares.');
   	   readln(a);
    //  write(#7); - retirei o som na opçao do menu.
   	   case a of 
         '1': MostrarLista ;
         '2': DisponivelSN ;
         '3': AdicionarCarro;
         '4': RetirarCarro;
    '5': VeiculosEstacionados;
    '6': MatriculaNome;	 // '7': exit; seria outra ipotese .
        end;
  until a='7';    
   end;
                                                                 
Begin
  for i:= 1 to 50 do
  	resetvariaveis;
  menuprincipal; 
End.
	[/left]
 

                                                               

Share this post


Link to post
Share on other sites
thoga31

Ok. Antes de mais, utiliza a tag code (vou colocar espaços entre os textos e os parêntesis para não accionar a tag): [ code=pascal ] código [ /code ]. :)

De seguida, a tua questão é vaga, para além de estar muito colorida (floribela style) e a negrito.

E as regras do fórum desaconselham títulos do tipo "ajuda urgente" ou "help me!".

Quanto à questão, onde estás a ter dificuldades? Exactamente no quê? "Ajuda para concluir o programa" não é dúvida. Resume o que o programa assim já faz, e diz exactamente o que não estás a conseguir. Facilita muito a análise do código, pois saberemos de ante-mão o que está lá. Ok?

Não estou a criticar negativamente, como és novato no P@P estou apenas a dar-te orientações iniciais quanto à forma em se expor dúvidas no P@P. Ok? ;)

Refaz lá a tua questão. Nem todos se dedicam a escrever isto tudo para, por fim, tentar ajudar no que puder. :)

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
rolando2424

Já lá vão uns três anos desde que mexi em pascalzim... Experiência traumática ;)

Infelizmente o pascalzim não executa o código em Linux, mas pelo menos deu para detectar um erro no procedure ResetVariaveis:

procedure ResetVariaveis;
begin
   x.nome:='Vazio';
   x.modelo:='Vazio';
   x.marca:='Vazio';
   x.marca:='Vazio';
   x.matricula:='Vazio';
   x.disponivel:=true;  // true = disponivel & false = Ocupado/Não Disponivel
   a:=' ';
end;

O problema vem que o tipo da variável x é array[1..50] of dados.

Ou seja, se quiseres fazer o reset às variáveis tens que aceder a cada elemento do array.

Se por exemplo, trocares o ResetVariaveis por este:

procedure ResetVariaveis;
begin
   x[1].nome:='Vazio';
   x[1].modelo:='Vazio';
   x[1].marca:='Vazio';
   x[1].marca:='Vazio';
   x[1].matricula:='Vazio';
   x[1].disponivel:=true;  // true = disponivel & false = Ocupado/Não Disponivel
   a:=' ';
end;

Já desaparece o erro (pelo menos esse).

O problema é que isso só faz reset ao primeiro elemento do array.

Para fazeres o reset a todas as variáveis, basta usares um ciclo for.

Ou seja, se utilizares este código:

// Nao testei este codigo
procedure ResetVariaveis;
begin
   for i := 1 to 50 do
   begin
      x[i].nome:='Vazio';
      x[i].modelo:='Vazio';
      x[i].marca:='Vazio';
      x[i].marca:='Vazio';
      x[i].matricula:='Vazio';
      x[i].disponivel:=true;  {// true = disponivel & false = Ocupado/Não Disponivel   }
   end;
   a:=' ';
end;

Tens um monte de erros semelhantes a este (basicamente sempre que escreveste x.nome ou algo do género deveria ser algo semelhante a x[k].nome.

Se corrigires estes erros, o código já parece executar. Infelizmente o pascalzim bloqueia nessa parte em linux e não posso testar mais nada.


Não me responsabilizo por qualquer dano ocorrido no seguimento dos meus conselhos. Prontos, a minha pessoa está oficialmente protegida legalmente :D

Share this post


Link to post
Share on other sites
Knectus

Já lá vão uns três anos desde que mexi em pascalzim... Experiência traumática ;)

Infelizmente o pascalzim não executa o código em Linux, mas pelo menos deu para detectar um erro no procedure ResetVariaveis:

procedure ResetVariaveis;
begin
   x.nome:='Vazio';
   x.modelo:='Vazio';
   x.marca:='Vazio';
   x.marca:='Vazio';
   x.matricula:='Vazio';
   x.disponivel:=true;  // true = disponivel & false = Ocupado/Não Disponivel
   a:=' ';
end;

O problema vem que o tipo da variável x é array[1..50] of dados.

Ou seja, se quiseres fazer o reset às variáveis tens que aceder a cada elemento do array.

Se por exemplo, trocares o ResetVariaveis por este:

procedure ResetVariaveis;
begin
   x[1].nome:='Vazio';
   x[1].modelo:='Vazio';
   x[1].marca:='Vazio';
   x[1].marca:='Vazio';
   x[1].matricula:='Vazio';
   x[1].disponivel:=true;  // true = disponivel & false = Ocupado/Não Disponivel
   a:=' ';
end;

Já desaparece o erro (pelo menos esse).

O problema é que isso só faz reset ao primeiro elemento do array.

Para fazeres o reset a todas as variáveis, basta usares um ciclo for.

Ou seja, se utilizares este código:

// Nao testei este codigo
procedure ResetVariaveis;
begin
   for i := 1 to 50 do
   begin
      x[i].nome:='Vazio';
      x[i].modelo:='Vazio';
      x[i].marca:='Vazio';
      x[i].marca:='Vazio';
      x[i].matricula:='Vazio';
      x[i].disponivel:=true;  {// true = disponivel & false = Ocupado/Não Disponivel   }
   end;
   a:=' ';
end;

Tens um monte de erros semelhantes a este (basicamente sempre que escreveste x.nome ou algo do género deveria ser algo semelhante a x[k].nome.

Se corrigires estes erros, o código já parece executar. Infelizmente o pascalzim bloqueia nessa parte em linux e não posso testar mais nada.

Obrigado rolando, mas fui eu que fiz mal o copy - past :)

Share this post


Link to post
Share on other sites
nunopicado

Boas Knectus:

Antes de mais temos de analizar o teu procedimento MatriculaNome;

procedure MatriculaNome;
var c:char;
      mat:string; //CHAR?
     begin                                                                      // N FUNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D:
      clrscr;
      writeln ('  Quer procurar o lugar pela Matricula? Ou Nome ?');
      read(c);
      if (c = 'Matricula') or (c = 'matricula') then
       begin
        writeln (' Insira a matricula do carro :');
        read (mat);
                for i:=1 to 50 do
                 begin
            if x[i].matricula = mat then
            writeln ('O carro encontra-se na posição ',i,' do estacionamento.');      
                 end;
       end
       else if (c = 'Nome') or ( c = 'nome') then
             begin
             
             end;       
     end;
Estas a tentar ler com uma variável char (c) palavras ('Matricula' ou 'Nome')... Falha logo aí.

Se alterares esse if por algo assim:

procedure MatriculaNome;
                var c:char;
                    mat,nome:string; //CHAR?
     begin                                                                      // N FUNFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D:
      clrscr;
      writeln ('  Quer procurar o lugar pela (M)atricula? Ou (N)ome ?');
      read(c);
      case upcase(c) of
      	'M': begin
                  writeln (' Insira a matricula do carro :');
                  read (mat);
                  for i:=1 to 50 do
                      begin
                           if x[i].matricula = mat then
                                writeln ('O carro encontra-se na posição ',i,' do estacionamento.');      
                      end;
               end;
          'N': begin
                  writeln (' Insira o nome do proprietário :');
                  read (nome);
                  for i:=1 to 50 do
                      begin
                           if x[i].nome = nome then
                                writeln ('O carro encontra-se na posição ',i,' do estacionamento.');      
                      end;
               end;  
      end;
     end;
No entanto, eu ainda mudava para isto:
procedure MatriculaNome;
var 
   filtro:string; 
begin                                                              
   clrscr;
   writeln (' Insira o Nome ou a Matricula: ');
   read(Filtro);
   i:=0;
   repeat
      inc(i);
   until (i>50) or (pos(filtro,x[i].matricula+x[i].nome)>0);
      
   if i<=50 then writeln ('O carro encontra-se na posição ',i,' do estacionamento.')
               else writeln ('O carro não foi encontrado no estacionamento.');   
   writeln ('Presione qualquer tecla para continuar! ');
   readkey;
end;
Assim ele pesquisa nome e matricula ao mesmo tempo, conforme o que o utilizador meter...

Pode-se ainda converter tudo em maiúsculas (filtro e nome+matricula) no momento do teste, para que, indiferentemente de como o utilizador meter, ele encontra na mesma...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Knectus

Obrigado mais uma vez, nuno  ;)

- Percebi quase tudo, so não percebi o que faz a função "pos" e "inc" ?  :)

Share this post


Link to post
Share on other sites
thoga31

inc - incrementa 1 à variável. inc(i) é o mesmo que i:=i+1

pos - a primeira posição de um caracter ou conjunto de caracteres numa string. Por exemplo, pos('M', 'BEM VINDO') retorna 3. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Exacto, ou seja...

Se o nome for 'Knectus da Silva' e a matricula for 'XX-00-11', e procurares por 'Knectus' o que o programa fará é:

   i:=0;
   repeat
      inc(i);
   until (i>50) or (pos(filtro,x[i].matricula+x[i].nome)>0);

vai incrementar a variável i 1 a 1 até que seja 51 (>50) ou que a posição de "Knectus" dentro de "XX-00-11Knectus da Silva" (matricula+nome junta as duas strings) seja mais que 0 (ou seja, que exista, pois se retornar 0 é sinal que não encontrou).

Neste caso, a função pos vai devolver o valor 9, ou seja, a palavra Knectus começa na 9ª posição da string "XX-00-11Knectus da Silva". Como 9 é maior que 0 então a condição será verdadeira, por isso o ciclo repeat irá terminar nesse momento, e a variável i indicará qual o estacionamento onde esse valor foi encontrado...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.