2009-10-08 13 views
7

Esto NO es tarea, pero es una práctica que el maestro nos dio para ayudar a estudiar para un examen. Pero no le entregaré esto al maestro. (Espero que esté permitido)¿Cómo puedo usar una instrucción switch() para convertir de una calificación numérica a una letra?

Quiere que un usuario ingrese una calificación y le asigne una calificación de letra. ¡Sería fácil con las declaraciones if, pero no puedo usar CUALQUIER! Tengo que usar el método de cambio.

Aquí es mi clase funcional:

public class Grade { 

public double getGrade(int input) 
{ 
    double inputGrade; 
    switch(input) 
    { 
    case 1: inputGrade >= 90; 
     break; 
    case 2: inputGrade >= 80; 
     break; 
    case 3: inputGrade >= 70; 
     break; 
    default: 
     grade = 60; 
    } 
    return grade; 

} 

} 

Aquí es mi clase de prueba:

import java.util.*; 
public class TestGrade 
{ 
public static void main(String[] args) 
{ 
    Scanner scan = new Scanner(System.in); 
    int input = scan.nextInt(); 
    Grade lGrade = new Grade(); 
    double finalGrade = lGrade.getGradeSwitch(input); 
    System.out.println("Your toll is $" + finalGrade); 
} 

} 

simplemente no han estado programando suficiente para tener esta mente analítica. He intentado completarlo, simplemente no he encontrado una forma de encubrir la entrada del usuario (int) en una calificación de letra (cadena) sin las declaraciones if.

Sé que esto está incompleto, pero esto es lo más lejos que pude llegar sin cometer errores.

EDITAR: ¡GUAU! Gracias chicos, odio elegir una sola respuesta correcta, ¡porque muchos de ustedes me ayudaron!

Esto es lo que terminó con (que trabajó: D)

public String getGrade(int input) 
{ 
    String letterGrade; 
    switch(input/10) 
    { 
     case 9: letterGrade = "A"; 
        break; 
     case 8: letterGrade = "B"; 
        break; 
     case 7: letterGrade = "C"; 
        break; 
     case 6: letterGrade = "D"; 
     default: 
        letterGrade = "F"; 
    } 
    return letterGrade; 

} 
+3

Se permiten los deberes, aunque en general es bueno si las personas lo etiquetan como tal. O incluso escribir la pregunta de tal manera que demuestre que ha pensado en ella en lugar de simplemente copiar/pegar la pregunta de su ejercicio. –

+1

Amen a lo que dijo Mateo. +1 por el esfuerzo, aunque a menudo encuentro que las tareas son menos que aceptables. – DVK

+0

Wow. Tienes que amar reglas arbitrarias como "debes usar una declaración de cambio". Eso realmente refleja el mundo real. Quiero decir, ¿no hubiera sido mejor si el profesor realmente se le ocurrió una pregunta más adecuada para usar realmente una declaración de cambio? Es decir, probablemente puedas escribir una solución usando tan solo ciclos, pero nunca lo harías. – Kibbee

Respuesta

6

bien, mi suposición es que va a entrar en una calificación numérica 0-100, y que los grados de la letra que desea ir tan "90-100: A; 80 -89: B; ...; 60-69: D; 0-59: F ".

Si ese no es el caso, su primera lección que se debe aprender acerca de la programación es: la parte más importante de la codificación es escribir claramente las especificaciones y requisitos

Una vez dicho esto, hay enfoques inteligentes y tontos .

  • enfoque Dumb:

    • utilizar un interruptor en la "entrada" como lo hace ahora

    • Dado que los valores 90, 91 ... 100 se supone que todos los tratados misma, poner a todos en casos como los interruptores separados pero sólo hacer el trabajo en el último (conocido como la caída de la transferencia; see SwitchDemo2 on this page for how that works)

    • Para el último valor (digamos, 90 si comienza desde 100 y baja), la instrucción de cambio sería letterGrade = "A"; descanso;

    • una vez que llegue caso de 89, se repite la misma lógica que lo hizo para 100 a través de 90

    • espuma, aclara, repite, y 60

    • manija Fs como un caso por defecto.

Esto será muy larga y bastante tonto (como en, la fuerza bruta) y muy molesto para escribir, y una herramienta de enseñanza brillante para eso que nunca desea escribir código mudo de nuevo si usted puede ayudar eso.

  • más elegante solución (inserción cita apropiada Star Wars aquí)

    • ¿Qué ves en común entre todos los que # correspons a "A"?

    derecho, es el hecho de que, aparte de 100, todos ellos son #s 2-DIIT que comienzan con 9.

    Por lo tanto, para manejar todos ellos en 1 declaración de caso, ¿no sería maravilloso para activar un valor que le da "9" para todos los # entre 90 y 99?

    espero que sabes la respuesta de inmediato ... nota más abajo ...

    Sí, simplemente dividir su conjunto por 10!

    Por lo tanto, es necesario tener un interruptor en su calificación numérica diveded por 10, los casos de 10, 9, 8, 7, 6 y asignación predeterminada a F.

Hope esto cubre suficientemente terreno para que pueda encontrar una solución de trabajo, al tiempo que muestra cómo el análisis podría funcionar también.

+0

NOTA: No criticaré tu código actual; el problema principal ya fue comentado por otra respuesta y los problemas sintácticos menores no son realmente el punto de esta Q como yo lo veo. – DVK

+0

NOTA: una forma aún más inteligente es evitar INTERRUPTOR alltogether, y el uso (como se sugiere otra respuesta) el poder de códigos ASCII ... pero eso es un poquito avanzada y muy, muy viola el espíritu de este ejercicio, que es aprender de conmutación . – DVK

0

Aquí hay un punto de partida: La 'A' carácter, como un entero, tiene el valor 65. ¿Qué crees que sucede si usted convierte el valor 66 a un personaje?

1

La sentencia switch no toma los valores condicionales, es decir, es imposible parece un true o false respuesta como inputGrade >= 70;, sino que busca si el elemento n en switch(n) es igual a x de la casex:.

Además, las cajas del interruptor terminan con dos puntos (:), no semis.

Consulte this link para obtener una explicación genérica de la instrucción switch con un ejemplo específico de Java.

+0

@akf - aunque su respuesta es muy útil por su lado sintáctico, creo que el usuario también está pidiendo la parte "cómo abordar el análisis" también. Solo mi sentimiento. –

+0

Estoy de acuerdo. Hay un montón de soluciones por ahí que hacen un par de puntos muy buenos (10 por ej. (Casi demasiado bueno, tal vez)). Obviamente, me enfoqué en el aspecto de 'obtener la cabeza alrededor del interruptor primero' como punto de partida. – akf

0

realizar esta corrección

double grade; // i think you mispelled it inputGrade 

y

case 1: grade = 90; // inputGrade >= 90 is an expression and is not valid 
     break; 
0

tenemos cubierto Enums todavía? Mi sugerencia sería pensar cómo una enumeración podría ayudarlo a obtener su respuesta. Lo siento, no puedo brindarle más ayuda que eso sin arruinar su momento de aha.

0

No veo ningún lugar en su código donde devolverá una carta.

Es posible que desee escribirlo en inglés, de alguna manera, y ver lo que se está perdiendo.

Por ejemplo: Las entradas del usuario calificación numérica calificación numérica se convierte en una carta de grado Imprime calificación numérica y la letra.

Luego, escribe la parte principal duro, parte 2. grados posibles son ... rangos de entrada posibles son ... Volver carta grado

Si escribir es nuestra mayor claridad, muy paso- paso a paso, ya que así es como la computadora lo procesará, entonces debería ver cómo hacerlo.

Imagina que estás explicando a un niño de segundo grado cómo hacer esto, tiene que ser una instrucción muy básica.

+0

@James: pero ... mi compilador es mucho más tonto que un alumno de segundo grado. SIEMPRE falla en hacer lo que quiero decir - los de segundo grado a veces lo hacen bien :) – DVK

1

Aquí hay otra pista sobre cómo hacer esto.

¿Qué pasaría si tu entero dividiera la calificación entre 10?

0

En primer lugar, si su función es tomar una calificación como un número entero y devolver una calificación de letra, ¿por qué tiene un tipo de devolución de double?

Después de lidiar con eso, aquí es una pista:

El grado puede variar de 0 a 100, de manera que es de 101 casos de manejar en su sentencia switch. Entonces podrías escribir todos los 101 casos si quisieras. Pero, ¿puedes pensar en una forma de reducir el número de casos? (Gran pista: todas las bandas de calificación son un múltiplo de 10)

1

Las instrucciones de cambio solo funcionan con valores que coinciden con los casos dados (junto con un valor predeterminado). La única manera de escribir esto usando una declaración de cambio es tener un caso para cada puntuación posible.

podría hacer esto como:

switch (score) 
{ 
    case 0: 
    case 1: 
    ... 
    case 80: 
    case 81:   
    ... 
    case 89: 
     return "B"; 
    case 90: 
    ... 
    case 100: 
     return "A"; 
     break; 
} 

O

se puede cortar hasta una lista de 11 casos posibles de dividir por 10 la primera.

Eso le dejaría con:

switch (score/10) 
{ 
    case 0: 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
     return "F"; 
    case 5: 
     return "E"; 
    case 6: 
     return "D"; 
    case 7: 
     return "C"; 
    case 8: 
     return "B"; 
    case 9: 
    case 10: 
     return "A"; 
} 

o algo similar (por supuesto, esto supone que tiene los grados correspondientes a más de 50 = E, = 90 + A y así sucesivamente).

+2

Heh ... buenas mentes y todo ... pero ¿por qué no usaste los valores predeterminados? Además, sería una buena idea dar HINTS en lugar de código de trabajo, ya que se supone que el niño debe aprender a pescar. – DVK

+0

Usted realmente sólo necesita dar cuenta de cada grado número de 60 a 100. Todo lo demás es una F. –

+0

@ DVK- lo di unos 30 segundos pensamiento, realmente no pensar en la limpieza hasta uso por defecto, etc Usted' Probablemente tenga razón sobre lo de la pesca, pero creo que el problema es como decirle al niño que vaya a pescar una ballena azul con un espagueti. Asumiendo que es un niño, y no un estudiante maduro. Y a él. – RodeoClown

-1

¿Qué tal esto:

static int[]  SCORES = 
    { 90, 80, 70, 60, 0 }; 

static String[] GRADES = 
    { "A", "B", "C", "D", "F" }; 

String letterGrade(int pct) 
{ 
    for (int i = 0; i < SCORES.length; i++) 
     if (pct >= SCORES[i]) 
      return GRADES[i]; 
} 

Esto supone que pct es positivo. Utiliza una única declaración if, por lo que no estoy seguro de si esto califica como una solución válida o no.

+0

Si bien es artificial, la restricción sobre la pregunta es usar un interruptor y no si. – PTBNL

3

Comenté esto tan completamente como pude. Espero que puedas seguirlo. Como esta no es una pregunta para la tarea, no tengo problemas para publicar una solución. A veces solo necesitas ver el código para "obtenerlo", así que aquí está. Si tiene alguna pregunta sobre lo que he escrito, deje un comentario y aclararé la respuesta.

public static String getGrade(int numberGrade) { 
    // There are two parts of the number grade that you really 
    // care about. The first is the quotient after division 
    // by 10. The second is the remainder after division by 
    // 10. The quotient will tell you where it is an A, B, C 
    // D, or F. The remainder will tell you whether it should 
    // have a +, -, or nothing following the letter. 
    // 
    // Let's take the grade 73 as an example. The quotient would 
    // be 7, with a remainder of 3. Because it has a quotient of 
    // 7, you know it's a C. Because of the 3, you know it should 
    // have a minus sign (-) after it. 
    // 
    // Once you know the pattern, you can pretty easily apply 
    // a switch statement to it and produce a letter grade. 

    // Variables for the quotient and remainder, described above 
    int quotient = numberGrade/10; 
    int remainder = numberGrade % 10; 

    // This will hold the final letter grade 
    String letterGrade; 

    switch (quotient) { 
     case 10: 
      // The student got a 100%, so just return A+ 
      return "A+"; 
     case 9: 
      // 90-99 is an A 
      letterGrade = "A"; break; 
     case 8: 
      // 80-89 is a B 
      letterGrade = "B"; break; 
     case 7: 
      // 70-79 is a C 
      letterGrade = "C"; break; 
     case 6: 
      // 60-69 is a D 
      letterGrade = "D"; break; 
     default: 
      // Anything 59 or below is an F 
      return "F"; 
    } 

    switch (remainder) { 
     // For example, 70-73 are C- 
     case 0: case 1: case 2: case 3: 
      letterGrade += "-"; break; 
     // Likewise, 77-79 are C+ 
     case 7: case 8: case 9: 
      letterGrade += "+"; break; 
     // Everything else just falls through, no + or - needed 
    } 

    // You are left with a letter grade consisting of 
    // an A, B, C, D or F, and a plus or minus where 
    // it is appropriate. 
    return letterGrade; 
} 

Y aquí es una demostración muy simple de este método:

for (int i = 100; i >= 0; i--) { 
    System.out.println(i + " = " + getGrade(i)); 
} 

Se imprimirá la siguiente:

100 = A+ 
99 = A+ 
98 = A+ 
97 = A+ 
96 = A 
95 = A 
94 = A 
93 = A- 
92 = A- 
91 = A- 
90 = A- 
89 = B+ 
88 = B+ 
87 = B+ 
86 = B 
+0

¡Muchas gracias por su explicación! No solo copié/pegué, ¡realmente aprendí aquí gracias! – Phil

+1

Esto es brillante ya que maneja un caso extra + 's y -'s. – heretoinfinity

0

estaba aburrido y se acercó con esto. Sé que no utiliza sentencias switch o bien, pero anywho:

private string GetGrade(int grade) 
    { 
     return ((char)((int)(Math.Max((Math.Min(10 - (grade/10) + 64, 69)), 65)))) 
       .ToString().Replace("E", "F"); 
    } 

Sólo quería ver si podía hacerlo utilizando los códigos de caracteres. Probablemente hay una manera aún más corta, pero bueno :) Oh, y lo siento, es C#.

Cuestiones relacionadas