Título: URGE AYUDA DEV C++ Publicado por: Danidan1998 en 14 Mayo 2019, 21:37 pm 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"); } Título: Re: URGE AYUDA DEV C++ Publicado por: @XSStringManolo en 14 Mayo 2019, 22:28 pm 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. Título: Re: URGE AYUDA DEV C++ Publicado por: K-YreX en 14 Mayo 2019, 22:45 pm 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> Título: Re: URGE AYUDA DEV C++ Publicado por: @XSStringManolo en 15 Mayo 2019, 01:17 am 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
Título: Re: URGE AYUDA DEV C++ Publicado por: K-YreX en 15 Mayo 2019, 01:53 am 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 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:
Código
Código
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
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
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
Citar Código
Código
Título: Re: URGE AYUDA DEV C++ Publicado por: @XSStringManolo en 15 Mayo 2019, 04:50 am 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. Título: Re: URGE AYUDA DEV C++ Publicado por: K-YreX en 15 Mayo 2019, 07:04 am 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
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 |