URGE AYUDA DEV C++

Iniciado por Danidan1998, 14 Mayo 2019, 21:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Danidan1998

Necesito encontrar alguna funcion para que me vuelva a reiniciar desde el menu principal tomando en cuenta que ya tengo los enlaces de los programas que quiero que me abra, esto es un MENU DE OPCIONES, por lo que al momento de terminar el programa me vuela a inicar desde el principio del menu para hacer otro programa
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main ()
{
   do{system ("cls") ;
      char ch;
      char Z=10;
      printf ("A. NUMERO MAYOR \n");
      printf ("B. Promedios \n");
      printf("C. Salir \n");
      ch=getchar();
      switch(ch)
      {
         case 'A':
            printf ("ESTE PROGRAMA ES PARA DETERMINAR EL NUMERO MAYOR \n");
      system( "D:\\Trabajo\\NUMEROMAYOR.exe" );
      break;
      case 'B':
         printf ("ESTE PROGRAMA ES PARA LOS PROMEDIOS DE UN ALUMNO \n");
         system("D:\\Trabajo\\CUATROCALIFICACIONES.exe");
            case 'C':
               printf( "Hasta Luego ");
               Z=5;
               return 0;
               break;
               default:
         printf(" No existe el comando \n ");
                        }
      
      
   }
   while ("Z=5");
   
}

@XSStringManolo

Puedes meter lo que te interese repetir en un bucle do while o while.
Te liaste un poco.

bool SalirDelBucle = false;

do
{
switch (ch)
{
case 'C':
SalirDelBucle = true;
}
El programa
}
while (SalirDelBucle == false;)

Asi es mas entendible para el lector humano.

Tambien podrias hacer un bucle infinito con while(true)
Y salir del bucle con un break;

Estas usando mal el bucle do while.
En espanhol es:
Haz {ESTO} mientras (esto sea verdad)
do {programa} while (Z=5)

Entonces estas diciendo que se ejecute lo que hay dentro del do mientras z sea igual a 5.
Tu lo que quieres hacer es que se ejecute lo de dentro del mientras que z no valga 5.

A parte esta usando el operador = y en realidad quieres usar el ==

Cambia el while (Z=5)
Por while (Z !=5) Si no me salte nada ya te deberia funcionar.

K-YreX

Todos los códigos entre etiquetas de código GeSHi...  :rolleyes:

Mejor cárgate esa Z... :silbar: :silbar: :silbar:
Por qué la condición entre comillas???? Eso son cadenas de caracteres literales...
En serio... Por qué Z? Por qué si vale 5? Y por qué de tipo <char> si le asignas un entero? Eso no hay quien lo entienda. Como te han dicho usa una variable <bool> que solo puede ser true/false para decidir si seguir repitiendo el programa o si salir. Y pon un nombre que diga algo, como te han dicho, no Z (igual que <ch>.... Llámalo <opcion> o algo así que permita identificarlo fácil).

Además estás usando funciones típicas de C y estás programando en C++... Usa las funciones de entrada/salida típicas de C++ <cout> y <cin> (de <iostream>) en lugar de <getchar()> y <printf()> (de <stdio.h> que en C++ sería <cstdio>) y quita la librería <conio.h> que no tiene utilidad y solo sirve para sacar errores según el compilador... Así que haciendo eso <conio.h> y <stdio.h> sobran. Y el nombre correcto para <stdlib.h> en C++ es <cstdlib> (como con todas, se quita el .h y se añade una c al comienzo del nombre).

Y lo normal es meter cada funcionalidad en una FUNCIÓN, no en un programa. Así haces los programas independientes unos de otros y no tienes que usar <system("...")> que requiere más recursos porque necesita hacer llamadas al sistema.

Y si haces <return> el programa termina. Otra razón más por la que el Z=5 sobra. Bueno el Z=5 y todo lo que vaya después del <return>
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

Te hice un ejemplo del programa en C++ usando solo iostream para que te hagas una idea de mas
o menos como usar las cosas mas básicas de lenguaje.
Normalmente en vez de añadir programas .exe a tu programa, lo que se hace es hacer
prototipos de funciones en un archivo .h y declarar las funciomes en un
archivo .cpp

Te lo comento solo para que lo sepas. Hay cosas mucho mas basicas de programación que
debes repasar. Descargate 7 u 8 libros de programación .pdf y elige el que entiendas mejor para aprender.

Tambien hay unos tutoriales muy buenos para aprender http://c.conclase.net/curso/


Código (cpp) [Seleccionar]
#include <iostream> //Para usar funciones entrada y salida cout y cin.

using namespace std; //Para no tener que escribir std::cout std::cin y std::endl

//Funciones:
/* Si necesitas obtener mas numeros del usuario haz
una funcion usando vectores u otros contenedores validos de la STL.*/
int FuncionNumeroMayor(int numero1, int numero2, int numero3)
{

int numeroMayor;
if (numero1 > numero2) //Si el numero1 es mayor que el 2:
{
numeroMayor = numero1; //Guarda el numero1.
}

else
{
numeroMayor = numero2; //En caso contrario guarda el numero2.
}

if (numeroMayor > numero3) //Si el numero guardado es mayor que el numero3.
{
//No hagas nada, ya que el valor almacenado en numeroMayor ya es mayor que el numero3.
}

else //Si el numero3 es mayor que el numero guardado:
{
numeroMayor = numero3; //Guarda el numero3.
}
return numeroMayor; //Retorna el numero mayor.
}


int FuncionPromedio(int numero1, int numero2, int numero3)
{
int Promedio = numero1 + numero2 + numero3; //Suma los 3 numeros
Promedio = Promedio / 3; //Dividelos por 3 para obtener el promedio.
return Promedio; //Retorna el promedio.
}

void EnsenharMenu() // Muestra el texto en pantalla:
{
cout << "Que quieres hacer?" << endl << "1-Numero mayor de 3 numeros" << endl;
cout << "2-Promedio de 3 numeros" << endl << "3-Cerrar el programa" << endl;
cout << "Introduce el numero correspondiente a la operacion a realizar y pulsa enter.";
cout << endl;
}

void LimpiarPantalla() //Nos ahorra usar system cls
{
cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
}

int main()
{

//Declaracion de variables:
int OpcionDelMenu, numero1, numero2, numero3;
bool SalirDelBucle = false;


do { //Haz lo siguiente hasta el while, mientras la condicion del while se cumpla:
EnsenharMenu(); //Llama a la funcion.
cin >> OpcionDelMenu; //Obtiene la respuesta del teclado.

            switch (OpcionDelMenu)
            {
case 1:
{
LimpiarPantalla(); //Llama a la funcion que imprime los endl

//Pide numeros al usuario para poder mandarlos a la funcion.
cout << "Introduce el primer numero y pulsa enter." << endl;
cin >> numero1;
cout << "Introduce el segundo numero y pulsa enter." << endl;
cin >> numero2;
cout << "Introduce el tercer numero y pulsa enter." << endl;
cin >> numero3;

//Declara una variable NumeroMayor, llama a la funcion que retorna
//el numero mayor. El valor retornado se almacena en la variable.

//Mira el return de la funcion arriba donde es declarada si no
//lo entiendes.

int NumeroMayor = FuncionNumeroMayor(numero1, numero2, numero3);
cout << endl;

//Imprime el valor almacenado en la variable:
cout << "El numero mayor es: " << NumeroMayor << endl;
cout << endl << endl << endl << endl << endl << endl << endl;

break;
}//Fin de case 1

case 2:
{
LimpiarPantalla();
cout << "Introduce el primer numero y pulsa enter." << endl;
cin >> numero1;
cout << "Introduce el segundo numero y pulsa enter." << endl;
cin >> numero2;
cout << "Introduce el tercer numero y pulsa enter." << endl;
cin >> numero3;


int Promedio = FuncionPromedio(numero1, numero2, numero3);
cout << endl;
cout << "El numero promedio es: " << Promedio << endl;
cout << endl << endl << endl << endl << endl << endl << endl;
break;
}//Fin de case 2

case 3:
{
LimpiarPantalla();
SalirDelBucle = true;
break;

default:
LimpiarPantalla();
cout << "El numero introducido no corresponde a ninguna opcion." << endl;
cout << endl << endl << endl << endl << endl << endl << endl;
break;
} //Fin de case3

            } //Fin de switch

    }//Fin de do
while(SalirDelBucle == false);

//Nos ahorramos la llamada a system pause:
int PausaDelSistema;
cout << "El programa a finalizado." << endl
<<"Introduce cualquier caracter y pulsa enter para finalizar" << endl;
cin >> PausaDelSistema;

return 0;
}//fin de main




K-YreX

Para la función de <numeroMayor> te puedes ahorrar condiciones si empiezas suponiendo un valor como máximo que es lo que se suele hacer en estos casos. Además poner un <if> vacío para hacer algo en el <else> es mejor darle la vuelta a la condición para hacer lo del <else> en el <if> y no poner el <else>. Algo así:
Código (cpp) [Seleccionar]

int numeroMayor(int numero1, int numero2, int numero3){
    int mayor = numero1;
    if(numero2 > mayor)
        mayor = numero2;
    if(numero3 > mayor)
        mayor = numero3;
    return mayor;
}

De todas formas hacerlo para 3 números queda un poco feo porque no te vale para 2 que es el caso base, ni para un número aleatorio por lo que lo suyo sería:
  • Crear la función para 2 parámetros y llamar a la función desde la propia función:
    Código (cpp) [Seleccionar]

    int mayor = numeroMayor(numeroMayor(numero1, numero2), numero3);

  • Crear la función para un array:
    Código (cpp) [Seleccionar]

    int numeroMayor(int *numeros, int size);


    La función de <FuncionPromedio()> mejor hacerla de tipo <double/float> porque un promedio usando enteros queda un poco limitado. Recordar hacer un cast en la división para pasar de enteros a reales. Y lo mismo de antes, mejor que reciba un array de números:
    Código (cpp) [Seleccionar]

    double calcularPromedio(int *numeros, int size);


    Esto a decisión de cada uno (bueno como todo) pero la función del menú haría que retorne ya la opción elegida. De esta forma puedes meter un filtro <do while> para controlar la opción que se elige. Así además nos ahorramos un <case> ya que no aceptamos ningún valor distinto de {1, 2, 3}:
    Código (cpp) [Seleccionar]

    int opcion_elegida = menu();


    Limpias la pantalla al comienzo de cada <case>. Llama a la función una única vez antes de empezar el <switch>. También escribes unos cuantos saltos de línea al final de cada <case>; más de lo mismo, ponlo una única vez después del <switch>. De todas formas esto son funciones fanzy (funciones de adorno) que no debes prestar mucha atención ya que no es lo importante.

    Las variables de tipo <bool> en una condición queda mejor poner <if/while(condicion)> para <if/while(condicion == true)> y <if/while(!condicion)> para <if/while(condicion == false)>:
    Código (cpp) [Seleccionar]

    while(!fin);


    Citar
    Código (cpp) [Seleccionar]

    //Nos ahorramos la llamada a system pause:
    int PausaDelSistema;
    cout << "El programa a finalizado." << endl
    <<"Introduce cualquier caracter y pulsa enter para finalizar" << endl;
    cin >> PausaDelSistema;
    Todo esto para no usar <system("pause")>? Con un <cin.get()> solucionado.
    Código (cpp) [Seleccionar]

    cin.get();


Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

@XSStringManolo

#5
Era un codigo de ejemplo para que vea las caracteristicas mas basicas del lenguaje
No un programa 100% funcional. Ya que es su tarea, no la mia.
Utilizo lo mas basico del lenguaje por lo citado anteriormente.

Propones una funcion que no funciona. No contempla que los valpres almacenados en las variables sean iguales.

Propones utilizar arrays en un programa que se presupone que el usuario puede introducir la cantidad de valores que quiera. En lugar de usar vectores que no dejan de estar implementados con arrays.

Siguiendo por esa linea, seria mas eficiente usar set como contenedor. Ya que ordena automaticamente los valores al almacenarlos y de paso arreglas el problema de tu funcion al ignorar automaticamente lovalores que ya se encuentren en set. Lo que no altera el normal funcionamiento del programa.

Suprimi el valor decimal a proposito aunque lo correcto sea redondear porque no queria solucionarle la tarea.

En base al resto que comentas intente acercar el codigo al lenguaje humano para que lo entienda.

K-YreX

Citar
Propones una funcion que no funciona. No contempla que los valpres almacenados en las variables sean iguales.
Te invito a buscar cualquier ejemplo o analizar el funcionamiento de la función para ver si es cierto que no contempla que los valores sean iguales. Se empieza asignando como mayor a <numero1> y se actualiza en caso de que otro de los números sea mayor estricto. ¿Qué más da que dos números sean iguales? mayor{5,5} = 5. Que más da que el mayor sea el primero o el segundo, si son iguales. Mejor tratar al primero como mayor y nos ahorramos una asignación más a lo tonto.
Esto se usa siempre para determinar el mayor de dos números:
Código (cpp) [Seleccionar]

// Lo que se le pasa a alguien por la cabeza cuando esta empezando
// Aqui si es cierto que si no ponemos >= en la condicion tendriamos un problema si numero1 == numero2
int mayor;
if(numero1 >= numero2)
    mayor = numero1;
else
    mayor = numero2;

// Como se suele hacer para optimizar
int mayor = numero1; // suponemos que numero1 es mayor
if(numero2 > mayor) // solo si numero2 es mayor estricto actualizamos el mayor, si son iguales mantenemos numero1 ya que es correcto
    mayor = numero2;


Citar
Propones utilizar arrays en un programa que se presupone que el usuario puede introducir la cantidad de valores que quiera. En lugar de usar vectores que no dejan de estar implementados con arrays.
Los contenedores de la STL están muy bien pero para una tarea trivial como es esta no recomiendo su uso. Estás metiendo una enorme cantidad de código (funciones, constantes, etc) que traen consigo cada una de las librerías dedicadas a un contenedor cuando con un array que no añade nada más se puede solucionar.
Además creo que los contenedores de la STL no deberían usarse hasta haber hecho algún algoritmo tedioso con arrays:
1º Para saber desenvolverse en situaciones difíciles en las que por un motivo u otro, sea obligatorio usar arrays.
2º Para comprender mejor el potencial de los contenedores y ver la de trabajo que quitan.
Seguro que hay más razones pero sólo destacaré esas. Imagina que empiezas a programar usando desde el principio la librería <vector> y un día te dicen "¿cómo llevas trabajar con memoria dinámica?" o piensas "¿por qué la gente se esfuerza en aprender memoria dinámica y a usar <new> y <delete> cuando el <vector> lo hace todo solo?"

Citar
Siguiendo por esa linea, seria mas eficiente usar set como contenedor.
Depende lo que entiendas por eficiente... Crear un set de valores donde vamos a meter un array ponte de 1000000 números en los que hay 20 repetidos. Habrá quien diga que mejor un set "así evitas meter los valores que son iguales. Al final coges el último y ya está" Y... El set se ordena por arte de magia? De verdad alguien piensa eso? Requiere tiempo de ejecución que aunque no se vea de forma explícita, está ahí. Habrá quien diga que mejor una cola con prioridad, con las operaciones suficientes para resolver esa tarea y menos costosa y habrá quien no se quede ahí y diga "cuando la cola con prioridad no esté vacía comparas el valor que vas a meter con el top y solo lo introduces si el nuevo valor es mayor, así no introduces todos los valores y por ende no requieres de tanto espacio" Y yo me pregunto al final eso no acaba siendo un bucle que determina el mayor entre el mayor actual y el siguiente número del array?? Mejor saber sacarse las castañas del fuego sin tanto contenedor de la STL aunque no digo que no tengan su utilidad, pero no para algo tan trivial...

Citar
Suprimi el valor decimal a proposito aunque lo correcto sea redondear porque no queria solucionarle la tarea.
Muy bien, entonces digamos que lo comenté para que si alguien lo iba a pasar por alto, se parara a pensarlo. Ya que al final siempre alguien acaba liado preguntándose "¿por qué me salen estos dos porcentajes iguales si uno vale 20,99% y el otro 20,02%? Por no haber hecho un cast en la división.

Citar
En base al resto que comentas intente acercar el codigo al lenguaje humano para que lo entienda.
Para acercarse al lenguaje humano están los comentarios a los que no pondré quejas ya que explicas todo lo que vas haciendo y eso está bien sobre todo para la gente que empieza o el pseudocódigo el cual ya cada cual puede encargarse de traducir a su manera.
Pero por ejemplo crear una variable para guardar el enter del final... Si alguien está empezando y se acostumbra a hacerlo así porque es lo que vio cuando él estaba empezando a programar, algún día le harán preguntas como "¿por qué creas esa variable?" o "¿por qué de tipo int si vas a guardar un enter"? o podrá pensar que eso funciona cuando pulsas enter hasta que un día se equivoque y le dé a otra tecla y se diga "¿por qué pido que pulsen Enter para salir si cualquier tecla sirve?" Son pequeños detalles pero que la gente cuando lo ve debería preguntarse ese tipo de cosas y en cambio muchos lo pasan por alto y dicen "pues se hace así y ya está". Y no es que se haga así, cada uno podrá hacerlo como quiera al final, pero que sepan las opciones que tienen.

Solo quiero dejar claro que tanto el comentario anterior como este son críticas constructivas. No lo hago por tocar las narices ni nada pero en el fondo todos tenemos nuestro ego y nos gusta defenderlo. Y personalmente me gusta explicar el porqué de lo que hago y digo en un mundo que cada vez más se usa el motivo del porque sí hasta en el sistema educativo, sin ningún tipo de razonamiento en el que apoyarse. Ahora que ya he soltado mi reivindicación y he mostrado las posibilidades que hay hasta para hacer la función más simple del mundo. Suerte a todos y ánimo con la programación :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;