2009-05-20 128 views
6

Soy nuevo en C#. Y me gustaría programar algo así como, mostrar los números primos en un cuadro de lista si el usuario ingresará cualquier número entero en el cuadro de texto. (Eso significa que, si escriben 10, mostrará los números primos de 0 a 10, o 20 de 0 a 20, etc.).números primos C#

¿Qué debería considerar primero, antes de hacer la programación? Sé que hay muchos ejemplos en Internet, pero primero me gustaría saber qué voy a necesitar.

Gracias por la punta ;-)

=== Gracias chicos. ¿Entonces estás sugiriendo que es mejor hacerlo primero en la aplicación de la Consola? Hice un ejemplo de "For Loop" usando Console Application una muy simple, pero cuando intenté hacerlo en la aplicación Windows Form, no estoy seguro de cómo implementarlo. Me temo que si sigo haciendo ejemplos en la consola, entonces tendré dificultades para hacerlo en las aplicaciones de Windows Form. ¿Qué opinas?

====== Hola de nuevo,

necesito un poco de retroalimentación con mi código:

 Console.WriteLine("Please enter your integer: "); 
     long yourInteger; 
     yourInteger = Int32.Parse(Console.ReadLine()); 

     //displaying the first prime number and comparing it to the given integer 
     for (long i = 2; i <= yourInteger; i = i + 1) 
     { 
      //Controls i if its prime number or not 
      if ((i % 2 != 0) || (i == 2)) 
      { 
       Console.Write("{0} ", i); 
      } 

     } 
+1

Así no es como se verifican los números primos ... Ese código verifica si un número es desigual (o es dos) ... Se necesita un algoritmo más inteligente como http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes – toxvaerd

+1

Solo para ilustrar por qué su algoritmo no funcionará: imprimirá 9, que no es el mejor ... – toxvaerd

Respuesta

11

Bueno, primero pensaría en cómo encontrar números primos, y escribir eso en una aplicación de consola que lea una línea, haga los cálculos, y escriba los resultados (simplemente porque eso es lo más simple que puede hacer, y cubre la misma lógica de análisis sintáctico etc. que necesitarás más adelante).

Cuando esté satisfecho con la generación de números primos, mire cómo hacer winforms: cómo colocar un listbox, un cuadro de texto y un botón en un formulario; cómo manejar el evento click (del botón), y cómo leer desde el cuadro de texto y escribir valores en el cuadro de lista. Su código de origen debería ser bastante correcto para tomar "como está" ...

Si no tiene un IDE, entonces tenga en cuenta que C# Express es gratuito y cubrirá todo lo anterior.

+0

Más bien expreso que sharpdevelop? Su rotundo rechazo a los complementos de soporte hizo que un nogo para mí una vez, o me estoy perdiendo algo? – Peter

+1

De hecho, no es compatible con complementos. Cualquiera de los productos probablemente estaría bien; simplemente esa IMO es más fácil obtener ejemplos, etc. que usan la terminología/diseño (etc.) de la versión MS. Para alguien "nuevo en C#" que puede ser importante. –

+1

Ok, creo que haré esto primero en la consola y, si funciona, lo transferiré a winforms. Gracias Marc por la entrada – tintincutes

6

que necesitará saber:

  • Como lee usuario entrada desde una aplicación de Windows
  • Cómo generar números primos dentro de un rango
  • Cómo escribir la salida de la manera que desee

Sugiero encarecidamente que separe estas tareas. Una vez que tenga cada uno de ellos trabajando por separado, puede juntarlos. (Marc sugiere escribir una aplicación de consola para la sección de números primos; esta es una buena sugerencia si no quiere realizar pruebas unitarias todavía. Si ha utilizado las pruebas unitarias en otros idiomas, es razonablemente fácil comenzar a utilizarlas; NUnit. Sin embargo, una aplicación de consola será más rápida para comenzar.)

En teoría, para una tarea potencialmente larga (por ejemplo, el usuario ingresa 1000000 como primer número) generalmente debe usar un hilo de fondo para mantener la interfaz de usuario responde. Sin embargo, lo ignoraría para empezar. Tenga en cuenta que mientras está calculando los números primos, su aplicación parecerá estar "colgada", pero haga que funcione en primer lugar. Una vez que esté seguro con la versión simple, puede mirar BackgroundWorker y similares si se siente aventurero.

+0

Creo que debería marcar la frase "Imitaría eso para empezar" como Bold. Buena respuesta, como de costumbre, John! :) – Galilyou

+0

Gracias Jon Tomaré nota de este consejo ;-) – tintincutes

1

Aquí es una respuesta a la edición:

Gracias chicos. ¿Entonces estás sugiriendo que es mejor hacerlo primero en la aplicación de la Consola? Hice un ejemplo de "For Loop" usando Console Application, uno muy simple, pero cuando intenté hacerlo en la aplicación Windows Form, no estoy seguro de cómo implementarlo. Me temo que si sigo haciendo ejemplos en la consola, entonces tendré dificultades para hacerlo en las aplicaciones de Windows Form. ¿Qué piensas?

Si desea presentar los números primos como una aplicación de formularios de Windows, debe diseñar también la interfaz de usuario. Eso es un poco exagerado para que se resuelva un problema tan pequeño. El diseño más fácil que puede hacer es llenar un formulario ListBox en su formulario (example).

Si está realmente interesado en aprender Windows Forms o WPF, entonces hay several resources para esto.

+0

gracias Spoke eso es lo que me gustaría hacer, simplemente muestre los números primos en el cuadro de lista con un solo botón. tal vez podría comenzar a establecer el rango 1-100. y mostrarlo con un solo clic. ¿Qué piensas? – tintincutes

+0

Puede intentar tener un TextBox para ingresar el número cuando se debe detener el rango (en lugar de ingresar un rango como "1-100" porque entonces tendrá que manipular las cuerdas), un botón para comenzar a encontrar el primer números y un cuadro de lista para mostrar los resultados. Simple como eso. – Spoike

4

que discuten la creación de números primos utilizando el Sieve of Eratosthenes en mi blog aquí:

http://blogs.msdn.com/mpeck/archive/2009/03/03/Solving-Problems-in-CSharp-and-FSharp-Part-1.aspx

El código es el siguiente ...

public IEnumerable<long> GetPrimes(int max) 
{ 
    var nonprimes = new bool[max + 1]; 

    for (long i = 2; i <= max; i++) 
    { 
     if (nonprimes[i] == false) 
     { 
      for (var j = i * i; j <= max; j += i) 
      { 
       nonprimes[j] = true; 
      } 

      yield return i; 
     } 
    } 
} 

Con este código se puede escribir declaraciones como esta ...

var primes = SieveOfEratosthenes.GetPrimes(2000); 

.. para obtener un IEnumerable de primos hasta 2000.

Todo el código se puede encontrar en CodePlex en http://FSharpCSharp.codeplex.com.

El código es "como está" y debe verlo para determinar si se ajusta a sus necesidades, ya sea que necesite agregar la comprobación de errores, etc., así que trátelo como una muestra.

+0

esto es muy elegante. Estudiaré este ejemplo, gracias Martin ;-) – tintincutes

+0

Buen ejemplo y publicación de blog pero pierdes puntos de estilo por el uso de '== false' en el condicional. –

0

Hace poco escribí una rutina para implementar Sieve Of Eratosthenes y encontré este hilo. Sólo para los archivos, aquí está mi aplicación:

static List<int> GetPrimeNumbers(int maxNumber) 
    { 
     // seed the master list with 2 
     var list = new List<int>() {2}; 

     // start at 3 and build the complete list 
     var next = 3; 
     while (next <= maxNumber) 
     { 
      // since even numbers > 2 are never prime, ignore evens 
      if (next % 2 != 0) 
       list.Add(next); 

      next++; 
     } 

     // create copy of list to avoid reindexing 
     var primes = new List<int>(list); 

     // index starts at 1 since the 2's were never removed 
     for (int i = 1; i < list.Count; i++) 
     { 
      var multiplier = list[i]; 
      // FindAll Lambda removes duplicate processing 
      list.FindAll(a => primes.Contains(a) && a > multiplier) 
       .ForEach(a => primes.Remove(a * multiplier)); 
     } 

     return primes; 
    } 

Siempre se puede sembrar con "1, 2" si necesitaba 1 en su lista de números primos.

1
using System; 
class demo 
{ 
    static void Main() 
    { 
     int number; 
     Console.WriteLine("Enter Number you Should be Checked Number is Prime or not Prime"); 
     number = Int32.Parse(Console.ReadLine()); 
     for(int i =2;i { 
     if(number % i == 0) 
     { 
      Console.WriteLine("Entered number is not Prime"); 
      break; 
     } 
     } 
     if(number % i !=0) 
     { 
     Console.WriteLine("Entered Number is Prime"); 
     } 

     Console.ReadLine(); 
    } 
} 
0

Su enfoque es completamente incorrecto. Los números primos son absolutos y nunca cambiarán. Su mejor opción es pregenerar una larga lista de números primos. Luego, crea un algoritmo para buscar rápidamente ese número y determinar si está en la lista. Luego, en su caso (ya que desea enumerar todos en el rango dado, simplemente hágalo). Esta solución será mucho más rápida que cualquier algoritmo de búsqueda de números primos implementado durante el tiempo de ejecución. Si el número entero ingresado es mayor que su lista, entonces siempre puede implementar el algoritmo comenzando en ese punto.

Cuestiones relacionadas