Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Número de divisores (https://www.clubdelphi.com/foros/showthread.php?t=91688)

Daniel2622 02-04-2017 03:25:43

Número de divisores
 
Hola, disculpen soy nuevo en este club, no se bien como se usa.
Necesito ayuda con un problema en lazarus o delphi que creo que son programas muy similar.
Mi problema es:
Usando el procedimiento con paso de parámetros, calcular el número de divisores (n) que imprima la cantidad de divisores que tiene el numero entero n.
Por ejemplo, si n=16 el programa debe imprimir que tiene 5 divisores (que son 1,2,4,8 y 16).

Esperó y me puedan ayudar, por favor.
De antemano muchas gracias, saludos.

jhonny 02-04-2017 07:20:32

Hola, bienvenido, el método básico sería algo como lo siguiente:

Supongamos que no es una app de consola y tienes un TEdit llamado Edit1, entonces en el OnClick de un botón pones...


Código Delphi [-]
var
  vNumero, vI, vCantidad: NativeInt;
begin
  vNumero := StrToInt(Edit1.Text);

  for vI := 1 to vNumero do
    if (vNumero mod vI) = 0 then
      vCantidad := vCantidad + 1;

  ShowMessage(vCantidad.ToString);
end;

Ya, eso sería todo.

Sin embargo, si quieres usar parallels para lograr esto, se podría hacer algo así:

Agregar en el uses las unidades...
  • System.Threading
  • System.SyncObjs

Y escribir en aquél botón:

Código Delphi [-]
var
  vNumero, vCantidad: Int64;
begin
  vNumero := StrToInt(Edit1.Text);

  TParallel.&For(1, vNumero,
    procedure(vI: Int64)
    begin
      if (vNumero mod vI) = 0 then
        TInterlocked.Increment(vCantidad);
    end);

  ShowMessage(vCantidad.ToString);
end;

Espero te sirva, saludos.

Daniel2622 02-04-2017 20:26:28

Número de divisores
 
Hola, disculpen soy nuevo en este club
Necesito ayuda con un problema en lazarus
Mi problema es:
Usando el procedimiento con paso de parámetros, calcular el número de divisores (n) que imprima la cantidad de divisores que tiene el numero entero n.
Por ejemplo, si n=16 el programa debe imprimir que tiene 5 divisores (que son 1,2,4,8 y 16).

Esperó y me puedan ayudar, por favor.
De antemano muchas gracias, saludos.

jhonny 02-04-2017 20:44:18

Hola,

¿No te sirvió lo que te respondí en el otro hilo que abriste para el mismo tema? http://www.clubdelphi.com/foros/showthread.php?t=91685

Por favor, en el futuro, no repitas hilos ;), te invito a leer la guía de estilo del club http://www.clubdelphi.com/foros/guiaestilo.php

Daniel2622 02-04-2017 20:58:30

Lo siento mucho, en verdad no sabía que no se podía hacer eso.

Daniel2622 02-04-2017 21:07:05

Disculpa jhonny, vi la respuesta que le hiciste a mi pregunta en el foro varios
Siguí tus recomendaciones y el código me mostraba varios errores, trate de acomodarlo a lo que poco se, pero no me da e número de divisores sino el mismo numero que yo introduzco.
Este es mi código:
implementation

Código Delphi [-]
{$R *.lfm}

{ TForm1 }
Procedure cantidad_de_divisores(n:Integer);
var 
  c1,c2:Integer;
  s:Longint;
begin
  s:=0;
  c1:=1;
  c2:=1;
  for c1:=1 to n do
    if n mod c1=0 then
      s:=c1+c2;
  Form1.Edit2.Text:=FloatToStr(n);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var 
  n:Integer; 
  codigo:Integer;
begin
  val(Edit1.Text,n,codigo);
  cantidad_de_divisores(n);
end;

Esperó y me puedas seguir ayudando.

Gracias y saludos.

jhonny 02-04-2017 21:29:21

Hola, no te preocupes, lo importante es que ya sabes y lee la guía de estilo para que no suceda...

En cuanto a la duda y siguiendo el camino que tomaste, lo que sucede es que N es el número que ingresas, vCantidad es el número que debes mostrar, así:

Código Delphi [-]
function cantidad_de_divisores(n:Integer): Integer;
var
  vNumero, vI, vCantidad: Integer;
begin
  vCantidad := 0;
  vNumero := StrToInt(Edit1.Text);

  for vI := 1 to vNumero do
    if (vNumero mod vI) = 0 then
      vCantidad := vCantidad + 1;

  Result := vCantidad;
end;

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var 
  n:Integer; 
  codigo:Integer;
begin
  val(Edit1.Text,n,codigo);
  Form1.Edit2.Text := FloatToStr(cantidad_de_divisores(n));
end;

Saludos.

Daniel2622 02-04-2017 21:54:18

Hola Jhonny, siguiendo tu código me lanza tres errores en la ventana de mensajes los cuales son:
unit1.pas(46,28) Error: Identifier not found "Edit1"
unit1.pas(52,9) Error: identifier idents no member "Result"
unit1.pas(74, "BEGIN" expected but "end of file" found

Me parece que son errores de identificación, pero no se como resolverlo; por favor me podrías decir como resolverlos.
De antemano gracias y saludos.

Casimiro Notevi 02-04-2017 22:14:07

A ver, pon todo tu código.

Daniel2622 02-04-2017 22:18:38

Hola Casimiri Noveti, este es el código que hice con ayuda de Jhonny:

Código Delphi [-]

implementation

{$R *.lfm}

{ TForm1 }
Procedure cantidad_de_divisores(n:Integer);
var
  vNumero, vI, vCantidad: Integer;
begin
  vCantidad := 0;
  vNumero := StrToInt(Edit1.Text);

  for vI := 1 to vNumero do
    if (vNumero mod vI) = 0 then
      vCantidad := vCantidad + 1;

  Result := vCantidad;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  n:Integer;
  codigo:Integer;
begin
  val(Edit1.Text,n,codigo);
  cantidad_de_divisores(n);
end;
De antemano gracias por tu ayuda.

Casimiro Notevi 02-04-2017 22:37:44

Eso no es TODO tu código, Dinial6222 ;)

Y recuerda poner los tags al código fuente, ejemplo:



Gracias :)

Daniel2622 02-04-2017 22:58:24

Perdón, este es todo mi código; esta construido en el programa Lazarus

Código Delphi [-]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
Procedure cantidad_de_divisores(n:Integer);
var
  vNumero, vI, vCantidad: Integer;
begin
  vCantidad := 0;
  vNumero := StrToInt(Edit1.Text);

  for vI := 1 to vNumero do
    if (vNumero mod vI) = 0 then
      vCantidad := vCantidad + 1;

  Result := vCantidad;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  n:Integer;
  codigo:Integer;
begin
  val(Edit1.Text,n,codigo);
  cantidad_de_divisores(n);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Edit1.Clear;Edit2.Clear;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  Close;
end;

end.

AgustinOrtu 02-04-2017 23:19:29

Eso pasa porque el procedimiento cantidad_de_divisores esta declarado "fuera" del form. Prueba de este modo:

Código Delphi [-]

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    procedure cantidad_de_divisores(n: Integer); // agregas esto aca
  public
  end;

implementation

//agregas lo que esta en negrita
procedure TForm1.cantidad_de_divisores(n:Integer);
var
  vNumero, vI, vCantidad: Integer;
begin
  vCantidad := 0;
  vNumero := StrToInt(Edit1.Text);

  for vI := 1 to vNumero do
    if (vNumero mod vI) = 0 then
      vCantidad := vCantidad + 1;

  Result := vCantidad;
  // los procedimientos no devuelven resultados, no existe la variable implicita "Result"
  // supongo que lo que queres es mostrar el resultado en el Edit2
  Edit2.Text := IntToStr(vCantidad);
end;

Daniel2622 02-04-2017 23:28:20

Gracias por tu ayuda [AgustinOrtu].
Ya me da el resultado.
Nuevamente gracias, saludos.


La franja horaria es GMT +2. Ahora son las 04:33:30.

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