Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Question Ejercicio con Posiciones de dígitos

Hola,

una vez más...me he bloqueado con un ejercicio, y el tema es, que no sé como tratar las posiciones de los digitos pertenecientes a determinada cifra.

El enunciado del problema es el siguiente:

Código:
Se introduce por el teclado una clave formada por un número entero de 5 cifras. Esta clave se considera correcta siempre que el valor del ultimo digito leído sea igual al ultimo digito de la suma de los 4 primeros dígitos de la clave. El programa deberá validar la clave y escribir en pantalla si es correcta o no.
Ejemplo:
24195 -> Suma = 2+4+1+9 = 16 􀃎 (5 <> 6) -> INCORRECTA
17480 -> Suma = 1+7+4+8 = 20 􀃎 (0 = 0) > CORRECTA
Y no sé cómo decirle al programa: 'si el último dígito de tal cifra, es igual a tal digito de tal cifra...luego...'

Es decir mi problema es la posición de los dítios, que no se cómo tratarlas, no el ejercicio en sí.

Si me pudieseis echar una mano, os lo agradecería.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #2  
Antiguo 16-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Cuando lees la clave, la lees como un string o como un numero?
Responder Con Cita
  #3  
Antiguo 16-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Jo jo jo, ahora ya hacemos hasta tareas

Código Delphi [-]
var
  i, Acumulado :Integer;
  UltimoDigito :String;
begin
  Acumulado := 0;
  UltimoDigito := Edit1.Text[Length(Edit1.Text)];
  for i := 1 to Length(Edit1.Text)-1 do
  begin
    Acumulado  := Acumulado + StrToInt(Edit1.Text[i]);
  end;

  if IntToStr(Acumulado)[Length(IntToStr(Acumulado))] = UltimoDigito then
    ShowMessage('Correcto')
  else
    ShowMessage('InCorrecto');
end;
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 16-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

Hola,

gracias por contestar :-)

@Seoane: pues la verdad, no sé :-S, he empezado a hacerlo como integer, pero la verdad es que no sé. ¿Cómo sería mejor?

@Johnny: muchas gracias, pero no puedo utilizar funciones tan avanzadas, ya que estos ejercicios únicamente me permiten solucionarlos con estructuras de control anidadas, bucles... y poco más :-) Pero te agradezco mucho tu aporte.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #5  
Antiguo 16-08-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
El código de jhonny no es tan avanzado que digamos, además no veo otra forma de hacerlo.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 16-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pues mas o menos es igual de complicado:

Aqui te lo dejo leyendo la clave como integer:
Código Delphi [-]
var
  i,j,k: Integer;
begin
  Writeln('Introduce la clave:');
  Readln(i);
  j:= i mod 10;
  k:= 0;
  while i > 0 do
  begin
    inc(k,i mod 10); // Esto es igual a k:= k + (i mod 10);
    i:= i div 10;
  end;
  if k mod 10 = j then
    Writeln('La clave es correcta')
  else
    Writeln('La clave no es correcta');
end.
Responder Con Cita
  #7  
Antiguo 16-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
A continuación... un lujo que uno se puede dar, solo de la manera mas rebuscada del mundo...

seoane, tu funcion tiene un pequeño problemita:

Código Delphi [-]
var
  i,j,k: Integer;
begin
  Writeln('Introduce la clave:');
  Readln(i);
  j:= i mod 10;
  k:= 0;
  while i > 0 do
  begin
    inc(k,i mod 10); // Esto es igual a k:= k + (i mod 10);
    i:= i div 10;
  end;
  if k mod 10 = j then
    Writeln('La clave es correcta')
  else
    Writeln('La clave no es correcta');
end; //Aqui iba ; no . 

Bueno gerupc, como bien dice D&W la funcion que te mostre no es muy avanzada, de hecho me parece mas avanzada la de seoane
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 16-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Perdone usted, pero cuando yo pongo un punto es porque es un punto
Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i,j,k: Integer;
begin
  Writeln('Introduce la clave:');
  Readln(i);
  j:= i mod 10;
  k:= 0;
  while i > 0 do
  begin
    inc(k,i mod 10);
    i:= i div 10;
  end;
  if k mod 10 = j then
    Writeln('La clave es correcta')
  else
    Writeln('La clave no es correcta');
end.

Responder Con Cita
  #9  
Antiguo 16-08-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por seoane Ver Mensaje
Perdone usted, pero cuando yo pongo un punto es porque es un punto
Jo jo jo, Eso me pasa por andar haciendome ilusiones , ¿Se ha notado mucho que me sueño corrigiendote un codigo?... hoy perdi la batalla pero debes estar muy atento para la proxima
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #10  
Antiguo 16-08-2007
Avatar de b3nshi
b3nshi b3nshi is offline
Miembro
 
Registrado: feb 2005
Ubicación: Tucuman - Argentina
Posts: 164
Poder: 20
b3nshi Va por buen camino
En la facultad a mi me hacen programar con C y por lo general estos ejericios los resolvemos usando arreglos del tipo char... es decir seria una cadena de caracteres, en otras palabras un string. Lo primero q se hace es ir validando caracter por caracter para ver si es un digito si no lo es entonces volvemos a pedir q ingrese un valor valido, de lo contrario procedemos a trabajar con los valores de la cadena... Se entiende?

En C existe una funcion q se llama isdigit(char) q devuelve 0 si es un digito, en delphi creo q es la misma...

Luego posicionandote en el ultimo valor de la cadena [ strlen(cadena) - 1 ] <-- Asi seria en c, obtenemos el valor del ultimo numero...

Si lo deseas puedo pasarte lo q seria el codigo hecho en C y luego intentas o intentamos traducirlo...

De todos modos creo q las propuestas de Seoane y Jhonny utilizando Div y Mod es una buena forma de llegar a lo q tu quieres... eso depende de como te lo pidan en la consigna... A mi por lo general siempre me piden un control de datos, pudiendo ser el usuario tan torpe q si le pedimos q ingrese el numero nos ingrese una letra, y en ese caso daria un error la aplicacion al intentar cargar un caracter en un integer, pero si no es tu caso ya tienes la solucion...

{Saludos}
Responder Con Cita
  #11  
Antiguo 16-08-2007
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
tambien podrias utilizar el siguiente ejemplo

debes tener 2 componentes...

1 Edit -> llamado en este caso vVar
1 Boton ->

en el evento del boton puedes poner este codigo..

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
   vSuma : Integer;
begin
     vSuma := StrToInt(vVar.Text[1])+StrToInt(vVar.Text[2])+StrToInt(vVar.Text[3])+StrToInt(vVar.Text[4]);
     if vSuma = StrToInt(vVar.Text[5]) Then
        ShowMessage('Correcto')
     Else
        ShowMessage('Incorrecto');
end;

espero te sirva.. ahh. y tambien es algo sencillo..... lo que hace es trabajar el texto como un array
__________________
BlueSteel
Responder Con Cita
  #12  
Antiguo 17-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

Hola,

muchísimas gracias por contestar y por vuestra atención.

Bien, la mejor solución es la que me da Seoane, ya que como he dicho, no es porque sean avanzadas o no, esa es otra cuestión, si no porque 'me exigen' (aunque no me lo vayan a mirar, lo hago para practicar los ejercicios que tendré que hacer) que lo haga mediante este tipo de métodos, es decir sin funciones, procedimientos,etc... Pero la culpa ha sido mia por no haber explicado estos detalles en el primer post

Asi que, una vez más, gracias. B3nshi, me parece que tu solució sería muy buena. La de Seoane me basta, pero si no te importa, como dices, miramos el código en C e intentamos (más que nada yo, que soy el que tiene que aprender ) traducirlo a Delphi.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #13  
Antiguo 17-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Question

Hola,

perdonad, pero hay una cosa que no entiendo, si se supone que ' k:= k + (i mod 10);' y ' j := i mod 10', porqué : ' k:= k + j; no me funciona??

Y qué función cumple el que haga: 'a la variable k le asigno el valor de k + último dígito' ? sumar todos los digitos de la cifra? y que la clave se divida entre 10 en la siguiente sentencia??

Lo siento, os voy a volver locos... muchas gracias a todos.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #14  
Antiguo 17-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por gerupc Ver Mensaje
perdonad, pero hay una cosa que no entiendo, si se supone que ' k:= k + (i mod 10);' y ' j := i mod 10', porqué : ' k:= k + j; no me funciona??
¿Te das cuenta de que el valor de i varia dentro del bucle?
Responder Con Cita
  #15  
Antiguo 17-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

Aupa Seoane,

vale,vale..., no me había dado cuenta... Oye la última cosilla, si no es mucho pedir, me podrías explicar las siguientes sentencias?

Código Delphi [-]
k := k + (i mod 10);
    i:= i div 10;

Es que algo las entiendo, pero no quiero asimilarlas estos conceptos mal...muchísimas gracias.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #16  
Antiguo 17-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por gerupc Ver Mensaje
Oye la última cosilla, si no es mucho pedir, me podrías explicar las siguientes sentencias?
La operación "mod" nos devuelve el resto de la división entera. El resto que queda al dividir un numero por 10 es el dígito que se encuentra mas a la derecha.

Si tenemos en cuenta lo anterior, podemos obtener las cifras que forman un numero aplicando sucesivamente las operación mod y div. Con mod obtenemos la cifra mas a la derecha y con div desplazamos todas las cifras un puesto hacia la derecha.

Por ejemplo:
Código:
1234
1234 mod 10 = 4 <- Primera cifra
1234 div 10 = 123
123 mod 10 = 3 <- Segunda cifra
123 div 10 = 12
12 mod 10 = 2 <- Tercera cifra
12 div 10 = 1
1 mod 10 = 1 <- Cuarta cifra
1 div 10 = 0 <- Cuando llegamos a cero es que hemos terminado
Responder Con Cita
  #17  
Antiguo 17-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

Hola,

una vez más, muchas gracias por tu ayuda, me ha sido de gran utilidad. Ya que conocia la función de 'mod', pero no la manera en la que se aplicaba en este caso.

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #18  
Antiguo 17-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Talking

Aupa de nuevo,

faltaba un pequeño detalle, ya que no me cuadraban algunos resultados... El fallo era que la suma de el ultimo digito de la suma de los "cuatro" primeros
digitos, tenia que ser igual al último digito de la clave entrante.

Y claro, de la anterior manera, lo que se hacía era la suma de todos los digitos, para ello lo que he hecho ha sido hacer a k:=-Ult_digito, quedando así el código:

Código Delphi [-]
program Ejercicio3;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
  clave: integer;
  Ult_digito: integer;
  k: integer;
begin
  Write('Escribe el valor de la clave:');
  Readln(clave);
    Ult_digito := clave mod 10;  //Asi consigo el ultimo digito, ya que es igual al resto
    k := - Ult_digito; //Para que unicamente me sume todos exceptuando el Ultimo Digito.
      while clave > 0 do
        begin
          k := k + (clave mod 10); //Almacena el valor de cada digito excepto del ultimo, y los suma...
          clave := clave div 10; //hasta que esto sea 0 clave := 0
        end;
  if k mod 10 = Ult_digito then
    Writeln('La clave es CORRECTA')
  else
    Writeln('La clave es INCORRECTA');
    readln;
end.

Un saludo!

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #19  
Antiguo 17-08-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

En el código de seoane, la variable J guarda el valor del último dígito, así que el único cambio que podrías hacerle para que funcione como esperas es:

Código Delphi [-]
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i,j,k: Integer;
begin
  Writeln('Introduce la clave:');
  Readln(i);
  // Aquí podrías validad si la clave consta de 5 dígitos...
  j :=  i mod 10;
  i := i div 10; // Con esto solo sumamos los primeros 4 dígitos...
  k :=  0;
  while i > 0 do
  begin
    inc(k, i mod 10);
    i := i div 10
  end;
  if (k mod 10) = j then
    Writeln('La clave es correcta')
  else
    Writeln('La clave no es correcta')
end.


Saludos...

Última edición por maeyanes fecha: 17-08-2007 a las 21:03:47.
Responder Con Cita
  #20  
Antiguo 18-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

Aupa,

de acuerdo, muchas gracias!! Todo solucionado...

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con ejercicio en Delphi gerupc Varios 5 11-08-2007 21:39:28
Como usar solo dos posiciones decimales alcides Varios 9 02-04-2007 19:31:31
Ejercicio Solarintg Varios 1 02-12-2006 15:48:07
Mover posiciones dentro de un list Box creus Varios 13 04-11-2006 18:03:44
posiciones decimales karocs Varios 6 12-09-2004 19:24:01


La franja horaria es GMT +2. Ahora son las 08:17:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi