2011-09-17 17 views
5

Primero, esto es para mi clase CS296, así que todo tiene que estar en la función main() y no puedo usar nada más que bucles, cambios y declaraciones if.Pregunta sobre mi diseño para mi tarea en C++

De todos modos, el programa le pide al usuario que ingrese el número de estudiantes en una clase, seguido de sus nombres. A continuación, muestra qué estudiante debe estar al frente de la línea y qué estudiante debe estar en la parte posterior de la línea en función de los estudiantes que se alinearon alfabéticamente de A-Z.

El programa se ejecuta, pero creo que el diseño es pobre. Específicamente con cómo estoy usando la variable de conteo. Esperaba tal vez obtener algunos comentarios al respecto. ¡Gracias!

int main(void) 
{ 
    string front, back, student; 
    unsigned short count = 1, students; 

    cout << "Enter the number of students in the class. Valid range is 1 - 25." << endl 
     << endl 
     << "Students: "; 
    cin >> students; 

    while (students < 1 || students > 25) 
    { 
     cout << endl 
      << "ERROR: Valid range is 1 - 25" << endl 
      << endl 
      << "Students: "; 
     cin >> students; 
    } 

    cout << endl 
     << "Enter the name of student " << count << ": "; 
    cin.ignore(); 
    getline(cin, student); 

    front = back = student; 

    for (count = 2; count <= students; count++) 
    { 
     cout << "Enter the name of student " << count << ": "; 
     getline(cin, student); 

     if (student < front) 
      front = student; 
     else if (student > back) 
      back = student; 
    } 

    cout << endl 
     << front << " should be at the head of the line." << endl 
     << back << " should be at the end of the line." << endl; 

    return 0; 
} 
+0

Buen trabajo al identificarlo claramente como tarea. –

+1

No creo que sea del todo malo. Probablemente pondría todas las extracciones de flujo y getlines en una verificación 'if (...)' para ver si la operación tuvo éxito. –

Respuesta

6

No, parece correcto. Las especificaciones requieren ingresar un recuento y luego ingresar a muchos estudiantes, que es exactamente lo que has hecho.

No me malinterpreten, el programa es malo, pero eso se debe a especificaciones ridículas como "todo tiene que estar en la función main()", no tiene nada que ver con su implementación.

Para este nivel de tarea, me gustaría obtener algo así de mis alumnos. Sería un cambio agradable del código que ni siquiera compila, nombres de variables de un solo carácter en todas partes, o un marasmo sin formatear de indentación incorrecta y pestañas/espacios mixtos :-)

+1

De acuerdo en la buena calidad del código. –

+0

Gracias! (= Realmente me gusta programar y trato de encontrar la manera más limpia y eficiente posible para resolver un problema de tarea sin dejar de estar dentro de los límites de las funciones de C++ que tengo permitido usar. Es frustrante que no podamos usar las funciones que aún no han sido cubiertos, pero estoy seguro de que hay una razón para ello. –

+1

Encuentro a los maestros que activamente desalientan el aprendizaje por uno mismo muy ... desalentador.O asumen que eres tan tonto que aprenderás todo lo que está mal o que harás trampa, y nunca que realmente te interese la programación. Estoy en el primer año de mi especialización en CS, y el hecho de que hasta ahora, tanto en Java como en C, podría usar la mayor parte del std. lib. (excepto por ejemplo qsort() en un ejercicio de quicksort) hizo que mis tareas fueran menos dolorosas ya que ya tenía experiencia previa en programación. – danielkza

1

Parece un diseño perfectamente razonable para mí desde una perspectiva algorítmica. Solo está encontrando el mínimo y el máximo de una lista mientras lee la lista, y acelera la parte difícil (inicializando primero y último en el primer elemento). Se puede usar un do-while para que sea un poco más agradable, así:

do {// leído en, comparar al máximo, mínimo } tiempo (contar < 25)

+0

La dificultad principal con el bucle 'do {...} while();' es inicializar la cadena 'frontal' para que todos los valores ingresados ​​se puedan comparar más abajo que en el primer ciclo. Luego tiene que comparar el valor ingresado con el 'front' y el' back' cada vez para que ambos se configuren en el primer ciclo (perdiendo el 'else' del' else if'). –

+0

Sí, por eso parecía que el primer nombre debía ingresarse fuera del ciclo. Supongo que podría haber puesto una condición if en el ciclo de la primera iteración, pero creo que eso sería peor. –

1

Teniendo en cuenta que sólo se almacene dos estudiantes, no hay ninguna necesidad particular de limitar el número de entradas a solo 25. Si el usuario (usted) desea agregar más de 25 nombres, no hay cambios necesarios excepto en la validación del número. De hecho, no hay una razón obvia para que el usuario cuente la cantidad de estudiantes; el código podría seguir leyendo a los estudiantes hasta llegar a EOF en cin. Sin embargo, si la especificación dice "debes ingresar el número de nombres", entonces tu código tiene que hacer eso, por tonto que sea. Pero debe permitir EOF temprano y terminar el ciclo con elegancia si el usuario solo ingresa 3 nombres en lugar de los 20 prometidos.

Es lamentable que no pueda usar funciones propias; puede usar uno para solicitar y leer el siguiente nombre, reduciendo la repetición en su código.

Teniendo en cuenta estas limitaciones, su código es razonable. Podría evitar el "nombre de lectura fuera del ciclo" a costa de verificaciones más complejas dentro del ciclo. La compensación es probablemente a favor de lo que has escrito.

+0

La única razón para el límite de 1-25 fue porque la tarea requería eso, de lo contrario, estoy de acuerdo. (= –