Analise de Código

11/03/2013

1

Pessoal.

Tenho o código abaixo em que ocorrem 2 erros:

program acha;
  var 
    texto, texto_e, texto_d, texto_c,caracter,letra:string;
    result: boolean;
    contador,i: integer;
  
  function ocorrencias(letra:string): boolean;
     begin
        result := true;
        if (letra<>'a') then 
          if (letra<>'b') then 
            if (letra<>'C') then
              result:= true
        else
           result:= false
     end;

begin

  texto:= 'ababaaEbCababaaa';
  contador:=0;
  caracter:='C';
  
  for i:=1 to length(texto) do
   begin
     texto_c:= texto[i];
     if ocorrencias(texto_c)=TRUE then inc(contador);
     writeLn(ocorrencias(texto_c));
     writeLn(contador);
     writeLn;
   end;
   
  writeLn('Contador: ', contador);
  
  texto_e:=copy(texto, 0, pos(caracter,texto)-1);
  texto_d:=copy(texto, pos(caracter,texto)+1, length(texto) );
  
  
  if(contador>0) then
   writeLn('Essa string nao e valida')
  
  else if((pos(caracter,texto)=0) or (pos(caracter,texto)=length(texto)-1) ) then
   writeLn('Essa string nao e valida')
  
  else writeLn('Essa string e valida');
   
end.

O primeiro na funçao ocorrencias:
  
   function ocorrencias(letra:string): boolean;
     begin
        if (letra<>'a') then 
          if (letra<>'b') then 
            if (letra<>'C') then
              result:= true
        else
           result:= false
     end;

Dada uma letra ele compara ela com as demais.
Caso seja diferente de a,b e C(maiusculo) então retorna true. Senão, retorna false;

O erro aqui: Ele deveria testar se a letra passada como paramtro é ou não diferente das outras 3.
Mas, quando testa com a letra C, ainda que a letra passada por parametro seja C dá que não é C:

Outro erro:
Nesse loop:
  texto:= 'ababaaEbCababaaa';
  contador:=0;
  caracter:='C';
  
  for i:=1 to length(texto) do
   begin
     texto_c:= texto[i];
     if ocorrencias(texto_c)=TRUE then inc(contador);
     writeLn(ocorrencias(texto_c));
     writeLn(contador);
     writeLn;
   end;

Dada a variavel texto
[code]
texto:= 'ababaaEbCababaaa';
[code]
Ele retorna fielmente os true e false (salvo o problema dsa letra 'C' relatado anteriormente) mas quando dá true, não incrementa o contador.

Estou usando pascalzim 5 e já teste. Sim, ele entende a funçao inc(var). Incrementa de 1 a variavel.

Onde estarão esses erros?

Grato a quem puder ajudar.

Carlos Rocha
Responder

Posts

11/03/2013

Carlos Rocha

Agora mudou o quadro:
  texto:= 'ababaaEbCababaaa';
  contador:=0;
  caracter:='C';
  tamanho_texto:=length(texto);
    
  for i:=1 to tamanho_texto do
   begin
   
     texto_c:= texto[i];
     
     if ocorrencias(texto_c)=true then 
	  begin 
	   inc(contador);
	  end;
	  
     writeLn(texto_c);
     writeLn (i);
     writeLn;
   end;

Esse for, não sei o porque, só começa do 3 loop (indice 3)
Responder

11/03/2013

Joel Rodrigues

Converta os dois lados para minúsculo ou maiúsculo antes de comparar.
Responder

11/03/2013

Carlos Rocha

Já resolvi,

Ficou assim;
program acha;
  var 
    texto, texto_e, texto_d, texto_c,caracter,letra:string;
    contador,i,tamanho_texto: integer;
  
  function ocorrencias(letra:string): boolean;      
   var result: boolean;    
     begin
        result:=false;
        if (
	        (letra<>'a') and 
		   (letra<>'b') and 
		   (letra<>'C')
		 ) then
              result:= true
     end;

begin

  texto:= 'ababaaEbCababaaa';
  contador:=0;
  caracter:='C';
  tamanho_texto:=length(texto);
    
  for i:=1 to tamanho_texto do
   begin
   
     texto_c:= texto[i];
           
     if ocorrencias(texto_c)=true then 
	  begin 
	   inc(contador);
	  end;
	  
   end;
   
  
  texto_e:=copy(texto, 0, pos(caracter,texto)-1);
  texto_d:=copy(texto, pos(caracter,texto)+1, length(texto) );
  
  
  if(contador>0) then
   writeLn('Essa string nao e valida pois ha um caracter estranho')
  
  else if(pos(caracter,texto)=0) then
   writeLn('Essa string nao e valida pois a letra C esta na primeira posicao')
  
  else if(pos(caracter,texto)=length(texto)-1)  then
   writeLn('Essa string nao e valida pois a letra C esta na ultima posicao')
  
  else if(length(texto) mod 2 = 0 ) then
   writeLn('Essa string nao e valida pois o tamanho da string e um numero impar')
  
  else 
    if texto_e=texto_d then     
       writeLn('Essa string nao e valida pois as duas substring nao sao iguais')
    else
      writeLn('Essa string e valida, as duas substring sao iguais');
   
end.

Valeu
Responder

11/03/2013

Joel Rodrigues

Beleza então, obrigado pelo retorno e por compartilhar a solução.
Sendo assim, estou marcando este tópico como resolvido.
Responder

11/03/2013

Carlos Rocha

Sim, sim.
O problema toos estava, nem me pergunte o porque que eu não consegui entender a logica do erro. Estava na writeLn do caracter no if

Valeu.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira