[ Foro de Pascal ]

problemas con programas clavedeacceso

17-May-2010 18:51
sergio cienfuegos caldevilla
4 Respuestas

hola, me llamo sergio y soy novato en la programacion. me he puesto muy en serio a esto, pero llevo mucho tiempo sin estudiar, y me cuesta aprender cosas que para otros tendran mas soltura. me he quedado pillado en el ejercicio clave de acceso con while y tres intentos. estoy seguro que es una tonteria lo que falta pero en fin, llevo dos dias dando vueltas  y todavia nada. hice dos caminos distintos, se que hay cosas mal, pero el fin es el mismo, quiero darle el valor '3' a la variable contador,cuando sea  correcta la clave, y no se si soy zoquete o que pero... estos son mi forma de enfocarlo.
program claveper;
var
       clave_valida,intento:string[30];
begin
       clave_valida:='golayu';
       writeln('introduzca su clave');
       readln(intento);
       while intento<>clave_valida do
       begin
          if intento<>clave_valida then
          writeln('la clave es incorrecta.');
          writeln('pruebe otra vez');
          readln(intento);
           if intento=clave_valida then
           writeln('acceso aceptado')
       end
end.
ese es un camino que hice, no se si se puede, pero pretendia condicionar un for contador:=1 to 3 con el while, pero no se como.

hice otro camino y no se cual esta mas acertado o mas cerca de la resolucion, es este
program claveper;
var
       clave_valida,intento:string[30];
begin
       clave_valida:='golayu';
       writeln('introduzca su clave');
       readln(intento);
       while intento<>clave_valida do
       begin
          if intento<>clave_valida then
          writeln('la clave es incorrecta.');
          writeln('pruebe otra vez');
          readln(intento);
           if intento=clave_valida then
           writeln('acceso aceptado')
       end
end.
por favor responda cuanto antes, estoy con la cabeza hecha un lio. gracias por adelantado.


17-May-2010 20:25
Antonio P.G.

Hola Sergio.

No he entendido que quiere decir con "darle el valor '3' a la variable contador", ya que no veo ninguna variable "contador".

Está claro que le ha dado muchas vueltas al programa, ya que ha terminado por enviar dos veces el mismo, si no me equivoco. Je je. De todas formas, una cosilla: hay alguna instrucción que sobra en el bucle. Veamos:

program claveper;
var
 clave_valida,
 intento       :string[30];
begin
 clave_valida:='golayu';
 writeln('introduzca su clave');
 readln(intento);
 while intento<>clave_valida do
 begin
  if intento<>clave_valida then
  writeln('la clave es incorrecta.');
  writeln('pruebe otra vez');
  readln(intento);
   if intento=clave_valida then
   writeln('acceso aceptado')
 end
end.

1 - Al comienzo del bucle, se comprueba si son iguales las variables o no. Si entra al bucle, es porque las variables son diferentes, es decir: sólo entrará si son diferentes. Por ello, no es necesario escribir el "if intento<>clave_valida then", ya que sabemos que será siempre verdad (siempre se cumplirá).

2 - Si no se produce el bucle, es porque la clave es correcta, segurísimo (estrictamente correcta). Por ello, podríamos sacar el segundo "if" del bucle fuera, pero tampoco será necesario, ya que sabemos que al salir del bucle la clave será correcta (no hay que preguntárselo).

Así me quedaría a mí el programilla:

program Claveper;
var
 clave_valida,
 intento        : string[30];
begin
 clave_valida:= 'golayu';
 writeln ('Introduzca su clave:');
 readln  (intento);
 while intento <> clave_valida do begin
   writeln ('La clave es incorrecta. Pruebe otra vez:');
   readln  (intento);
 end;
 writeln ('Clave aceptada.');
end.

Es muy importante también respetar el sangrado. Pues eso. Sin embargo, lo del contador no lo pillo.

Espero haber sido un poco de ayuda.
¡Ciao!


17-May-2010 23:32
sergio cienfuegos caldevilla

disculpa, puse dos veces el mismo programa, ante todo os agradezco la labor que desempeñais, me he puesto de autodidacta, pero llego hasta donde llego, sino tengo a quien preguntar puntualmente, puedo obcecarme mucho con una cosa.
bueno el codigo en cuestion era este
program clavedeacceso_b2b;

var
       clave_valida,intento:string[30];
       contador:integer;
begin
       clave_valida:='golayu';
       contador:=1;
       writeln('introduzca su clave');
       readln(intento);
       writeln('intento',contador);

       while ((contador<>3) or (clave_valida<>intento)) do


       begin
       writeln('introduzca su clave');
       readln(intento);
       writeln('intento',contador+1);
       readln(contador);
       end
end.
-le he dado vueltas por arriba por abajo, pero hay algo que me falla y no se el que. perdona mi ignorancia, pero lo compenso con ganas.
gracias por adelantado


18-May-2010 01:26
Nacho Cabanes (+83)

Aunque muestres el siguiente valor del contador con:

writeln('intento',contador+1);

Realmente no lo estás modificando. Sería más natural aumentar el contador y luego mostrar su valor:

contador := contador + 1;
writeln('intento: ',contador);


Y, en cualquier caso, el contador no se lo debes pedir al usuario, de modo que no tiene sentido la línea:

readln(contador);


Por cierto, no suena nada cortés eso de "responda cuanto antes". Todos los que estamos aquí intentando ayudar, sobre todo Antonio y yo, contestamos tan pronto como nos es posible, sin recibir nada a cambio (apenas algún mensaje de agradecimiento). No es necesario que "nos metas prisa". Yo no voy a contestar antes porque digas "responda cuanto antes"... habrá veces que pueda responder dos horas después y habrá veces que tarde casi una semana... pero generalmente, las exigencias me desmotivan, en vez de motivarme...


18-May-2010 14:42
sergio cienfuegos caldevilla

respecto a lo de 'responda cuanto antes', perdone por expresarme asi, se la labor que desempeñan, ahora mismo si no tubiera a quien preguntar, no se si podria acabar el curso, no pretendia que sonara asi, mas bien estaba preocupado, porque cuando se me mete algo en la cabeza, sino lo termino me vuelvo loco buscando.
agradezco profundamente lo que hacen, y os doy las gracias de corazon, a demas me tendreis por aqui una buena temporada, dado que pretendo aprender varios lenguajes de programacion.
un saludo desde ribadesella. sergio.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)