2012-06-28 12 views
6

Ok, quiero empezar diciendo que no soy estudiante, por lo que esta pregunta no tiene nada que ver con la tarea. Estoy tratando de aprender C# porque la compañía para la que quiero trabajar lo usa. Escuché que C# es muy similar a Java, así que estoy usando mi libro de Java que tiene problemas de ejercicio para practicar C#. Aquí está mi pregunta, estoy tratando de hacer un programa simple que el usuario ingrese 3 grados y lo almacena en una matriz y luego muestra los tres grados que se ingresaron. El problema es que no almacena las calificaciones. Sin embargo, sí muestra algún número al azar, como si pongo en el 34, 44 y 54 se vuelve 51. Aquí está mi código y gracias a todos:C# Entrada de usuario de consola

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Practice1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int[] test = new int[4]; 

      int i = 1; 

      for (i = 1; i <= 3; i++) 
      { 
       Console.WriteLine("Please enter test " + i); 
       test[i] = Console.Read(); 
       Console.ReadLine(); 

      } 
      for (i = 1; i <=3; i++) 
      { 
       Console.WriteLine(test[i]); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
+7

Solo para decir que C# no es como Java. Te estás haciendo un flaco servicio. Obtenga un buen libro de C# y aprenda de él. – Oded

+7

Lo que todos los demás dijeron es correcto, pero también, su ciclo está equivocado (bueno, probablemente. Es extraño). Estás salteando el primer elemento. En su lugar, use: 'for (int i = 0; i

+0

Su llamada console.read() luego console.readline() .. llame a console.readkey() en test [ i] – Botonomous

Respuesta

1

Console.Read() devuelve un carácter. Desea leer un string desde la consola, convertirlo a int, y luego almacenar ese valor en su matriz.

8

Su problema está aquí:

test[i] = Console.Read(); 

Se trata de poner un personaje (que es un código de caracteres entero) en la matriz de prueba.

En lugar hacer

test[i] = int.Parse(Console.ReadLine()); 

Editar: Si no está seguro de que el usuario escriba un número entero apta para su procesamiento, tal vez van a escribir "seis", por ejemplo, usted podría considerar el uso de una oportunidad/catch (si quiere saber por qué no iba a analizar), o el int.TryParse, que devuelve true para indicar el éxito y asigna el número entero a una variable analizada, campo o índice de matriz:

if(int.TryParse(Console.ReadLine(), out test[1]) 
    Console.WriteLine("Successfully parsed integer"); 
else 
    Console.WriteLine("Please enter an integer."); 
+0

Puede valer la pena actualizar para manejar los errores con try/catch - de lo contrario, arroja – Charleh

+2

@Charleh Preferiría que tryparse intente/capture para evitar excepciones –

+0

La mejor respuesta para un principiante. Además, las matrices comienzan en 0 en C# ... –

2

Console.Read() devuelve el valor ASCII de la clave ent ered. Por ejemplo, si escribe "A", obtendrá el valor 65 que es el código ASCII para "A".

Usted tendrá que analizar su cadena en un entero:

for (i = 0; i < 4; i++) 
{ 
    Console.WriteLine("Please enter test " + i); 
    string input = Console.ReadLine(); 
    int value; 
    bool success = int.TryParse(input, out value); 
    if (success) 
    { 
     test[i] = value 
    } 
    else 
    { 
     // Show an error message that the user must enter an integer. 
    } 

    Console.ReadLine(); 

}     

También tenga en cuenta que las matrices son indexados comenzando con 0 en C#, no con 1 como su código se supone.

Como alternativa, puede seguir usando Console.Read(), que devuelve la representación entera del carácter introducido, confirma que el carácter es de hecho un número y convierte desde el código ASCII al número apropiado.

+0

Buena captura. Corregí mi respuesta. –

+0

No hay problema. -1 -> +1 – NominSim

+0

TryParse espera un parámetro de salida: 'int.TryParse (entrada de cadena, salida int salida);' – rcdmk

2

Desde docsConsole.Read() "Lee el siguiente carácter del flujo de entrada estándar".

desea que el siguiente entero, así que algo como

bool cont = false; 
int val = 0; 
do 
{ 
    cont = int.TryParse(Console.ReadLine(), out val); 
    if(!cont){Console.WriteLine("please enter a real number you fool");} 
} while (!cont); 

debería funcionar.

+1

Mejor que simplemente int.Parse porque no se tira - se podría agregar otro para decir 'por favor ingrese un número real que engaña', etc. – Charleh

+0

@Charleh Actualizado para ayudar a los tontos. – NominSim

+1

¡Acabo de escupir mi bebida cuando vi este pop-up en el intercambio de pilas! – Charleh

2
 int[] test = new int[3]; 

     for (int i = 0; i < 3; i++) 
     { 
      Console.WriteLine("Please enter test " + i + 1); 
      test[i] = Int.Parse(Console.ReadLine()); 
     } 
     for (int i = 0; i < 3; i++) 
     { 
      Console.WriteLine(test[i]); 
      Console.ReadLine(); 
     } 

Como se puede ver, las matrices comienza desde el índice 0, lo que no hay necesidad de definir int [4] (uno más int que se requiere), y hay que bucle desde el índice 0 a la longitud-1

+0

Se olvidó de convertir de la cadena. – spender

+0

Sí ... lo actualicé :-) – eyossi

2

El problema es que estás leyendo en el personaje. Como tal, el "51" que está viendo es el valor decimal (base 10) ASCII para el número 3.Lo que hay que hacer es la siguiente:

string result = Console.ReadLine(); 
int grade = 0; 
int.TryParse(result, out grade) 
test[i] = grade; 
0

Aquí está el código:

int [] test = new int [3];

 for (int e = 0; e < 3; e++) 
     { 
      Console.WriteLine("Please enter test "); 
      test[e] = int.Parse(Console.ReadLine()); 
     } 


     Console.WriteLine("000000000000000000000000000\n"); 

     for (int e = 0; e < 3; e++) 
     { 

      Console.WriteLine(test[e]); 
      //Console.ReadLine(); 

     } 
Cuestiones relacionadas