PDA

Ver la Versión Completa : Problema con restas sucesivas


gerupc
08-08-2007, 19:24:08
Hola,

haciendo unos ejercicios en Delphi, me he bloqueado en el siguiente:

Realizar un programa que nos permita calcular el cociente y el resto de la división de dos números enteros utilizando únicamente operaciones de suma y resta:La división se realizara a través de restas sucesivas.

12 / 3 = 12 – 3 = 9 1º resta
9 - 3 = 6 2º resta
6 - 3 = 3 3º resta
3 - 3 = 0 4º resta
cociente = 4 resto = 0

El resto, sé como conseguirlo mediante el bucle:

for i: 1 to cociente do
Begin
dividendo := dividendo - divisor;
End;

Pero claro, el problema es que para ello necesito tener antes el valor del cociente, lo cual sería:

cociente := dividendo / divisor;

Pero como el enunciado dice que lo he de hallar mediante sumas y restas, no sé como, si con algún bucle, o no sé.

A ver si alguine me puede echar una mano.

Gracias por las futuras respuestas ;-)

Un saludo,

Geru.

Delphius
08-08-2007, 19:34:51
Hola gerupc,

¿Y no bastaría con transformar a ese FOR en un WHILE?
Una pista: No te diste cuenta de que el resto en una división como mínimo es cero y cuanto mucho menor al divisor.

Saludos,

seoane
08-08-2007, 19:42:48
Vamos a ver si llegamos a la solución juntos:

Lo primero es darte cuenta de que existen mas tipos de bucles que el for, por ejemplo el while, que en este caso es perfecto

While Condicion do
begin

end;


Ahora pensemos cual es la "Condicion" que nos indica que tenemos que parar. Si te fijas veras que tenemos que parar de restar en el momento en que el dividendo es menor que el divisor.

Pues bien:

While Dividendo >= Divisor do
begin
Dividendo:= Dividendo - Divisor;
end;


Ahora solo nos falta obtener el cociente, eso es facil, solo tenemos que contar el nuemro de vueltas que da el bucle:

cociente:= 0;
While Dividendo >= Divisor do
begin
Dividendo:= Dividendo - Divisor;
cociente:= cociente + 1;
end;


¿Que te parece? :)

Ahora todo junto:

var
Dividendo, Divisor, Cociente: Integer;
begin
Dividendo:= 13;
Divisor:= 3;
//
cociente:= 0;
while Dividendo >= Divisor do
begin
Dividendo:= Dividendo - Divisor;
cociente:= cociente + 1;
end;
//
Writeln('El cociente es: ',cociente);
Writeln('El resto es: ',Dividendo);
end.

gerupc
08-08-2007, 20:06:35
Hola,

no sabeis cuanto os lo agradezco.

Seoane, muchísimas gracias por tu respuesta, te lo has trabajo muchísimo y has dado en un punto clave; tenía mal asimilado el concepto del bucle While. Y yo que pensaba que lo entendía perfectamente...

Ahora sí, todo perfecto, muchísimas gracias!!

:-) :-) :-) :-)

Un saludo,

Geru.

egostar
08-08-2007, 20:30:43
Y ya entrados la escuelita, porque no hacemos la prueba con el bucle REPEAT UNTIL:D


var
Dividendo, Divisor, Cociente: Integer;
begin
Dividendo:= 13;
Divisor:= 3;
cociente:= 0;
REPEAT
Dividendo:= Dividendo - Divisor;
cociente:= cociente + 1;
UNTIL Dividendo < Divisor
Writeln('El cociente es: ',cociente);
Writeln('El resto es: ',Dividendo);
end.


Salud OS.

Delphius
08-08-2007, 20:44:47
No pude evitarlo... tuve que meter código.
Y ya que estamos... si se desea algo más "elaborado":

function DivisionEntera(Dividendo, Divisor: integer; var Resto: integer): integer;
begin
result := 0;
if Divisor = 0
then begin
ShowMessage('Error. División por cero');
exit;
end;
Resto := Dividendo;
while resto >= Divisor do
begin
Resto := resto - Divisor;
inc(Result);
end;
end;

Saludos,

seoane
08-08-2007, 20:54:56
Y ya entrados la escuelita, porque no hacemos la prueba con el bucle REPEAT UNTIL:D

Y si el dividendo es menor que el divisor. Obtendrías un cociente de 1 y un resto negativo :eek: :D

egostar
08-08-2007, 20:57:28
Y si el dividendo es menor que el divisor. Obtendrías un cociente de 1 y un resto negativo :eek: :D

:D:D:D, ese tema viene en el siguiente capitulo, no se nos adelante niño genio.:D:D:D

Salud OS

Edito: En todo caso que le parece si la corrección se la dejamos al niño gerupc, digo si es que le interesa aprender algo más. :D

gerupc
09-08-2007, 00:19:37
Aupa!

Pues he estado un buen rato intentando con varias cosas....pero no lo consigo :( (el hacer que el bucle repeat no acepte un dividendo menor que el divisor).

He intentado con IF-THEN, haciendo:


if dividendo < divisor then
write('Error')
else
write(.........)// resultado


Pero como sabreis, nada :confused:.

EDITO:: Ahora me surge el siguiente problema, tengo que presentar las soluciones así:

Introduce el dividendo: 12
Introduce el divisor: 3
El cociente de 12 entre 3 es 4 y su resto es 0

Claro, el problema está en el dividendo, cómo me si el resto es 2 me aparece en el resultado final, como resto, tanto como dividendo.
A ver si me podeis ayudar :-)

Un saludo,

Geru.