1

No puedo compilar mi códig, y necesito ayuda para ver qué hay de malo en este programa.

Necesito desarrollar un programa en el cual, mediante un menú de opciones, de de alta, de baja y haga un cambio de nombre de alumnos (no sé si me di a entender).

Éste es el código. Me falla en la parte de case 3:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    int nombres [11][50];
    char cambio;
    int i,n,opciones,buscar,lugar,element,eliminado;
    do{
        system("Color F2");
        printf("\tHola!, este programa guardar, borrar y cambiar nombres de alumnos mediante un MENU (Solo puede guardar a 10 alumnos)\n");
        printf("Elija una de las opciones para trabajar\n");
        printf("1. Dar de alta a alumnos\n");
        printf("2. Hacer un cambio de datos de un alumno\n");
        printf("3. Dar de baja a algun alumno\n");
        printf("4. Salir del programa\n");
        printf("Opcion: ");
        scanf("%d",&opciones);
        switch(opciones)
        {
        case 1:
            for(i=1;i<11;i++){
                printf("Capture el nombre del alumno %d: ", i);
                scanf("%s",&nombres[i]);
            }
            break;
        case 2:
            for(i=0;i<=11;i++){
                printf("\nIngrese la posicion a cambiar: ");
                scanf("%d", &buscar);
                for(i=0;i<=11;i++)
                {
                if(buscar==nombres[i])
                {
                    printf("Nombre encontrado \n");
                    printf("Ingresa el nombre de reemplazo: ");
                    scanf("%s", &cambio);
                }
                }
                }
            break;
        case 3:
           printf("\nIngrese el lugar a eliminar");
           scanf("%d", &lugar);
           int eliminado=nombres[lugar];
           for(int i=0;i<n;i++){
           if(i==lugar){
           while(i<n-1){
           nombres[i]=nombres[i+1];
           i++;
           }
           break;
           }
           }
           n=n-1;
           for(int i=0;i<n;i++){
           printf("Los nombres del arreglo son: ", nombres[i]);
           }
           printf("El nombre eliminado es : ",eliminado);
           break;
        case 4:
            printf("Gracias por usar el programa, tenga un buen dia\n");
            EXIT_SUCCESS;
            break;
        default:
            printf("Opcion invalida, solo puede usar desde la opcion 1 hasta la 4\n");
            break;
        }
    }while(opciones !=4);
return 0;
}
Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
AlexRomJ22
  • 11
  • 1
  • y cual es el error que aparece? – BetaM May 27 '19 at 01:18
  • En la parte del Case 3, ese el problema que tengo. – AlexRomJ22 May 27 '19 at 01:20
  • 3
    deberás editar tu pregunta entonces y explicar a detalle, que es lo que tratas de obtener, lo que llevas hecho y colocar el error que te aparece, del mismo modo no uses la etiqueta de c# cuando no es este lenguaje el que usas y finalmente coloca un título descriptivo que sea relacionado al problema; pues poner que si hay algo de malo con tu código no ayuda en mucho – BetaM May 27 '19 at 01:22
  • Todos tus bucles tiene la misma variable `i` como iterador de bucle... pero algunos de ellos están anidados, por lo que el resultado no va a ser el que esperas. – Alvaro Montoro May 27 '19 at 01:30
  • Lee [ask] y cómo crear un [mcve] y edita la pregunta con las recomendaciones que encontrarás allí. Además, completa el [tour] para aprender más sobre el funcionamiento general del sitio. – Alvaro Montoro May 27 '19 at 01:30
  • @Andrespengineer dos variables con el mismo nombre en diferentes ámbitos es completamente legal en C y C++, lo que sucede es que la del ámbito más interno ocultará la del ámbito más externo. – PaperBirdMaster May 27 '19 at 07:05

1 Answers1

7

¿Que hay de malo con mi programa en C++?

Muchas cosas.


  1. Tu código es no : Como programa en C++ tu código deja mucho que desear, no usas absolutamente nada del lenguaje en el que dices que tu código está redactado.
  2. <stdio.h> y <stdlib.h> son cabeceras de C, si realmente las necesitas en un programa (presuntamente) C++ deberás usar las versiones adaptadas a dicho lenguaje: <cstdio> y <cstdlib>. Lee este hilo para saber más detalles.
  3. La cabecera <conio.h> no es estándar, en consecuencia no ha sido adaptada a C++. Lee este hilo para saber más detalles.
  4. Estas leyendo cadenas de caracteres sobre una formación1 de números, int nombres [11][50]; debería ser char nombres [11][50];.
    1. De hecho, si lo que pretendes es programar en C++, en lugar de una formación bidimensional de caracteres debería ser un contenedor de cadenas, por ejemplo: std::list<std::string> nombres;.
  5. En C++ se aconseja que el ámbito de las variables sea lo más pequeño posible; esto significa que en lugar de declarar la variable de indizado de los for al principio del programa y reusarla (posiblemente de manera erronea) en cada for, deberías declararla en cada for.
  6. En C++ la comunicación por consola con el usuario se hace con flujos (stream) de datos, para escribir en consola se usa std::cout (console out) y para leer de la consola se usa std::cin (console in), todos esos printf y scanf son funciones de C.
  7. En C++ (y también en C) las formaciones1 se indexan desde 0, lo que quiere decir que en este bucle no lees el primer elemento (además del problema mencionado en el punto 4):

    for(i=1;i<11;i++){
        printf("Capture el nombre del alumno %d: ", i);
        scanf("%s",&nombres[i]);
    }
    
  8. En los bucles, deberías favorecer el preincremento frente al postincremento, salvo que tengas un motivo para no hacerlo (que rara vez será así). Lee este artículo para más detalles.
  9. Para copiar (en tu caso, sobrescribir) datos de una posición de una formación1 bidimensional a otra posición de la misma, no hay que igualar; de hecho, al hacerlo lo más posible se que el programa falle en tiempo de ejecución, la manera correcta (en C++) es usar std::copy:

    while(i < n - 1) {
        std::copy(std::begin(nombres[i + 1]), std::end(nombres[i + 1]), std::begin(nombres[i]));
        i++;
    }
    
  10. Los valores se devuelven con return, la macro EXIT_SUCCESS no fuerza la salida del programa, es simplemente el valor que deberá ser devuelto por el programa en caso de finalizar de forma correcta. Así que deberías escribir:

    return EXIT_SUCCESS;
    

Me falla en la parte de case 3

Tu error (mencionado en el punto 9) es que estás igualando posiciones de una formación1 con la idea de sobrescribir los datos:

while(i<n-1){
nombres[i]=nombres[i+1]; // <---- MAL!!!
i++;
}

nombres es una formación1 de tamaño estático; cada uno de sus elementos tiene una posición fijada en memoria por el compilador, con tu instrucción de igualación estás pretendiendo cambiar esa posición de memoria lo cuál es muy probable que haga fallar el programa en tiempo de ejecución.


  1. También conocida como arreglo o en inglés array.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82