Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#71
Claro, entonces el problema estaba en que no se estaba guardando en <datos> todas las unidades sino que se van sobreescribiendo en cada iteración. Entonces tienes que concatenar todo y preferiblemente como dice Serapis añadiendo un espacio entre cada unidad para separarlos mediante el espacio y mantener los dos puntos...
Código (csharp) [Seleccionar]

datos += mj[syntax].ToString() + " ";
...
string[] unidades = datos.Split(' ');
#72
Programación C/C++ / Re: C o C ++ ??
7 Abril 2021, 21:20 PM
Tanto con C como con C++ puedes hacer una infinidad de programas de prácticamente cualquier tipo pero es cierto que profesionalmente C se utiliza mucho en sistemas operativos, servicios, etc. C se suele denominar un lenguaje de nivel medio (tiene características tanto de alto nivel como de bajo nivel) lo que permite desarrollar con mucho detalle a nivel físico (incluso incluir lenguaje ensamblador en el propio código C) y generar un código muy eficiente comparado con lenguajes de más alto nivel (Java, C#, Python,...)

Al final C se queda muy limitado al utilizar paradigmas de programación orientada a objetos (POO) por lo que aquí entra C++. Brevemente se puede decir que es una extensión de C con clases. C++ admite todo lo que admite C más lo creado para C++. Se puede decir que ya es de alto nivel aunque permite programar a bajo nivel también.

Yo empecé con ellos y no me arrepiento. ¿Fácil? No, no será. Si buscas facilidad y una curva de aprendizaje alta (grandes resultados en poco tiempo), C/C++ no son tus lenguajes. Java o C# serán mejores lenguajes para ese fin. Si buscas o te gusta saber cómo funciona todo en profundidad y que nada se escape a tu control, entonces sí, C/C++ serán unos buenos lenguajes para ti.

Los lenguajes de más alto nivel se podría decir que te dan el trabajo hecho. Para que lo entiendas, un ejemplo. Estás haciendo un programa y necesitas hacer x cosa...

  • ¿Utilizas Java o C#? Seguro que ya tienen una función que hace eso. Investiga, encuentra esa función, lee su documentación, aprende cómo funciona y utilízala. ¿Cómo lo hace? Ni idea. En la mayoría de casos ni lo sabrás ni te pararás a investigarlo pero ya tienes tu tarea hecha.
  • ¿Utilizas C o C++? No busques esa función. Hazla tú. ¿Lleva más tiempo? Seguramente. ¿Cómo lo hace? Como tú quieras hacerlo. Cualquier tarea se puede programar de forma diferente y tú tendrás la tuya según tu forma de pensar. Igual no es la mejor solución pero es tuya, sabes cómo funciona al detalle y la puedes ir modificando/mejorando.
Obviamente en C y en C++ también hay funciones hechas, igual que también puedes hacer las tuyas propias en Java o C# pero digamos que es para que tengas una idea de lo que significa programar con unos lenguajes u otros.

PD: Si quieres hacer programas con interfaz gráfica personalmente te recomendaría C# con WPF. Para otros fines como programas de consola, algoritmia, estudio de eficiencia... te animaría a probar C o C++. Al fin y al cabo empezar a probar un lenguaje no significa que no puedas aprender después otros.  :rolleyes: :-X
#73
Cita de: Meta en  7 Abril 2021, 11:01 AM
No se que pasa.
En vez de verse:

F:
G:

En el comboBox, aparece esto.


Ver imagen.

En este otro código de abajo, solo se me ve así:
G:
:

¿Dónde está la F:?  ;D

Código (csharp) [Seleccionar]
       void UnidadDisco()
       {
           // Nombre de la unidad.
           ConsigueComponentes("Win32_CDROMDrive", "Id");

           // Delimitador.
           string[] unidades = datos.Split(':');

           foreach (string unidad in unidades)
           {
               comboBox_Unidad.Items.Add(unidad + ":");
           }

           // Selecciona la primera unidad.
           comboBox_Unidad.SelectedIndex = 0;
       }


Saludos.
Por un lado, no se puede ver la imagen. Ni en el cuadro de imagen ni mediante el enlace de "Ver imagen".
Y por otro lado, si no se muestra correctamente la F tiene que ser porque en la variable <datos> no está bien guardado.
Si el resultado ha sido:

G:
:

tiene que ser porque en <datos> estaba almacenado la siguiente cadena: "G::".

Prueba a imprimir el contenido de <datos> para comprobarlo.
#74
Claro, si digamos que en <datos> tienes algo como:
C:D:F:
Y vas recorriendo y agregando carácter a carácter pues agregarás:

C
:
D
:
F
:



Otra solución:
Código (csharp) [Seleccionar]

string[] unidades = datos.Split(':');
foreach(string unidad in unidades)
  combobox.Items.Add(unidad);

Resultado:

C
D
F
G

El delimitador (':') no se incluye en las subcadenas. Para incluirlo puedes hacerlo manualmente:
Código (csharp) [Seleccionar]
combobox.Items.Add(unidad + ":");
O mediante un for() y el método Substring() o similares para recoger dos caracteres en vez de uno.
#75
Sin tener más datos sobre cómo lo has implementado, la solución más genérica que se me ocurre es comparar si el valor es igual a ":" antes de agregarlo al combobox y en caso afirmativo, ignorar ese elemento.

Viendo el código de esa parte del programa igual se puede obtener una solución más "limpia" por decirlo de alguna manera.
#76
Bueno, viendo que nos encontramos aquí todos los habituales del foro para debatir este tema, aprovecharé para dejar también mi opinión al respecto.
Desde que empecé yo en el foro y habiéndome movido en mi mayoría por subforos de programación, hubo una cosa que me llamó especialmente la atención y que ya se ha citado por ahí:
Citar
Se pregunta por conceptos abstractos. Aquí no estamos para hacerle el trabajo a nadie
Creo que de todos los temas que he leído sólo me he encontrado dos casos en los que se podría decir que se preguntó por conceptos abstractos:
1. El código es demasiado grande y se publica un ejemplo simplificado que muestre el problema -> Esto puede dar problemas si el usuario considera irrelevante algo que realmente no lo es.
2. El usuario cree que está desarrollando un programa que nadie ha hecho antes y que valdrá millones cuando lo termine por lo que no se fía de publicar el código fuente tan alegremente.
Quitando esos dos casos que han ocurrido en alguna extraña ocasión, normalmente no se pregunta por conceptos abstractos. Yo entiendo que si tienes un problema y sobre todo si estás empezando no tengas ni idea de cuál pueda ser el motivo del error así que lo mejor para todos es publicar el código tal cual (además a ser posible Ctrl+C - Ctrl+V porque luego vienen los errores al reescribirlo) porque se han dado casos de que por no publicarlo el tema acaba con un puñado de mensajes pidiendo que se publique x parte del código.

Sobre el tema de hacer o no hacer las tareas, yo sé que en ocasiones he pecado de acabar haciendo más código del que pensaba. Eso sí, como dice el-brujo, con un poco de sentido común.
Usuario recién registrado, con muy pocos mensajes y todos pidiendo la misma tarea poniendo únicamente el enunciado -> Tiene todas las papeletas de ser ignorado/eliminado o llevarse una respuesta que no es la que está buscando.
Usuario habitual o que publica su código o que tras varias respuestas se le ve con interés por aprender y que realmente hace caso de lo que se le dice (no digo que no sea crítico con las respuestas pero se ve el que quiere mejorar y el que sólo quiere que eso funcione para aprobar) -> En este caso, dependiendo del tiempo que tenga también, pues sí me explayo un poco más sobre todo para corregir cosas que aunque funcionan no se deben hacer así (a veces con el propio programa y si tiene mucha paja con un ejemplo más compacto)
Todo esto sin contar los que directamente te mandan un mensaje privado con un historia (algunas muy imaginativas) para explicarte por qué no pueden hacerlo ellos (como si fueras tú el profesor) y que si se lo haces tú -> Mi respuesta tampoco les suele gustar demasiado... :-\

Siempre se ha dicho que el que hizo la ley, hizo la trampa y todas las reglas tienen siempre sus excepciones y sus vacíos legales. En un tema como este yo creo que debe primar el sentido común y sobre todo entre habituales del foro que todos estamos aquí voluntariamente (supongo  :silbar:) y por bastante tiempo.
Y yendo al tema concreto que ha dado lugar a toda esta trama y en el que yo también participé (con fragmentos de código), se puede ver un usuario que acaba de empezar y que no utiliza ni estructuras/clases ni colecciones de datos frente a una respuesta de @XSStringManolo utilizando estructuras, contenedores de la STL, parámetros por referencia, etc. En caso de querer hacer pasar ese código como suyo, cualquier profesor que se precie un poco debería tardar menos de 2 segundos en ver que ese código no es suyo.

PD: Por encima de hacer o no hacer la tarea, mi opinión es que esa respuesta en concreto era innecesaria porque no creo que proporcione ayuda a un usuario si se añaden tantas cosas que él no utiliza (ni sabrá utilizar). Ya irá aprendiendo poco a poco hasta poder llegar a soluciones bien escaladas como esa. En cuanto a mostrarle un código bien organizado, estoy de acuerdo.
#77
En el código del fichero .cs tienes declarada alguna clase/estructura antes de la clase que hereda de Form?
De ser así modifica el orden para que la primera clase del fichero sea la que hereda de Form.

Si lo anterior no era el causante del problema, ve al Explorador de soluciones, selecciona el fichero .cs de la vista (el designer no, el más externo) y haciendo click derecho selecciona "Excluir del proyecto". Después haz click derecho en el proyecto - Agregar - Elemento existente... y selecciona nuevamente de la carpeta del proyecto el fichero .cs.

PD: Yo recompilaría el proyecto al hacer alguno de estos cambios por si acaso. Compilar - Recompilar solución.
#78
Si abres el "Explorador de soluciones" de VS2019 para ver la estructura del proyecto, puedes hacer click derecho en el fichero .cs que quieras modificar y elegir "Ver diseñador".
Otra opción es tener abierto el código del fichero e ir a la barra superior de VS: Ver - Diseñador (Shift + F7).

Prueba ambas opciones y nos comentas los resultados.

Cita de: SonnyCrockett en  4 Abril 2021, 18:57 PM
Buenas tardes.

No está protegido contra escritura. Puedo modificar el código, pero el Form no aparece, está el archivo "designer" pero no me muestra la ventana, solo me muestra el código. Puedo modificar la acción de los botones, pero no puedo añadir un botón dentro del form porque no aparece la ventana. En cambio si ejecuto el programa, si funciona pero no es editable porque está en ejecución.
El fichero designer muestra únicamente el código. Para ver la ventana tienes que abrir el .cs superior al designer.
Si no te aparece igual es un problema con la vista del Explorador.
#79
Programación C/C++ / Re: Crash en la consola
4 Abril 2021, 21:05 PM
Bueno, vamos a ir viendo qué errores o mejoras hay en tu código...

  • No utilizar variables globales. Las variables globales, en contraposición con las variables locales, son las que se declaran fuera de cualquier función. Esto está desaconsejado. En todo caso se pueden utilizar para declarar constantes.

  • En la línea 11 llamas a la función bucle() pasando <a> (con valor 0) como argumento. Pasas un parámetro para ignorar su valor lo cual no debe hacerse y segundo que ese bucle no se va a ejecutar porque <estu> en ese punto vale 0 y <a> vale 1.

  • Después todo funciona normal hasta la línea 15. Aquí se llama de nuevo a bucle() y dentro de bucle() se llama a PromEdadIng() que tiene el error. Has definido que esa función devuelve un valor entero (int) pero en el caso de que se cumpla el if() no se devuelve nada.
    Si no se crea un bloque con llaves después de una estructura de control se entiende que únicamente la siguiente instrucción pertenece al bloque (no importa la indentación en C/C++).
Código (cpp) [Seleccionar]

// Esto:
if(condicion) cout << "Hola" << endl; cout << "Adios" << endl;
// es equivalente a esto:
if(condicion) {
  cout << "Hola" << endl;
}
cout << "Adios" << endl;

    En tu caso el <return edad> pertenece al bloque del else por lo que si se cumple la condición del if() no hay ningún return. Además la condición del if() va a ser siempre cierta. En C/C++ el operador '=' es el operador de asignación (asigna un valor a una variable) y si asignas a una variable cualquier valor distinto de 0, el resultado es true. El operador de comparación de igualdad es '=='.



Encontrado el error, a mejorar el código...
Primero, como ya he dicho, hay que evitar el uso de variables globales. Vamos a utilizar una constante para ver mejor su uso adecuado.
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

const int MAX_ESTUDIANTES = 10; // Como maximo el programa admitira 10 estudiantes

int main() {
  int estudiantes; // variable local para el numero de estudiantes a introducir
  // Ahora pedimos el numero de estudiantes y debera estar entre 1 y el maximo que hayamos definido antes
  // Para ello se utiliza un filtro con un bucle do-while() que pedira un valor mientras el que se haya introducido no sea valido
  do {
    cout << "Introduce el numero de estudiantes [1 - " << MAX_ESTUDIANTES << "]: ";
    cin >> estudiantes;
  } while(estudiantes < 1 || estudiantes > MAX_ESTUDIANTES);
}


Ahora toca ver el resto de la funcionalidad. Primero voy a hacerlo todo en el main() sin utilizar más funciones y después utilizando funciones para ver el proceso. Según veo en el código, el propósito es mostrar la edad promedio de los estudiantes de ingeniería.
Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

const int MAX_ESTUDIANTES = 10; // Como maximo el programa admitira 10 estudiantes

int main() {
  int estudiantes; // variable local para el numero de estudiantes a introducir
  // Ahora pedimos el numero de estudiantes y debera estar entre 1 y el maximo que hayamos definido antes
  // Para ello se utiliza un filtro con un bucle do-while() que pedira un valor mientras el que se haya introducido no sea valido
  do {
    cout << "Introduce el numero de estudiantes [1 - " << MAX_ESTUDIANTES << "]: ";
    cin >> estudiantes;
  } while(estudiantes < 1 || estudiantes > MAX_ESTUDIANTES);

  int estudios;
  int edad, edadTotalIngenieria = 0; // Importante inicializar a 0 el acumulador
  for(int i = 0; i < estudiantes; ++i) { // Es mejor contar desde 0 para cuando avances mas en el lenguaje
    cout << "Introduce la edad del estudiante " << (i+1) << ": ";
    cin >> edad; // Guardamos la edad introducida en <edad>
    cout << "Introduce los estudios del estudiante " << (i+1) << "(1 - Ingenieria | 2 - Otro): ";
    cin >> estudios;
    if(estudios == 1) edadTotalIngenieria += edad; // Si es estudiante de ingenieria, sumamos su edad a la del resto de ingenieria
  }
  // Hay que convertir al menos una variable en double para que el resultado sea double y no int
  double edadPromedioIngenieria = (double)edadTotalIngenieria / estudiantes;
  cout << "La edad promedio de los estudiantes de ingenieria es: " << edadPromedioIngenieria << endl;
  return 0; // En la funcion main() no es necesario. En el resto de funciones que devuelven algo, el return es obligatorio
}


Ahora para crear una función hay que buscar un fragmento de código que forme como un bloque y que pueda ser utilizado varias veces preferiblemente. En este caso el mejor ejemplo que veo es el principio del programa. Hay un fragmento de código para pedir un valor entre dos límites y repetirse hasta que se introduce un valor válido.
Es una buena práctica que las funciones tengan verbos en su nombre para indicar lo que hacen. Por ejemplo se puede llamar pedirEstudiantesEnRango()
Código (cpp) [Seleccionar]

int pedirEstudiantesEnRango() {
  int estudiantes;
  do {
    cout << "Introduce el numero de estudiantes [1 - " << MAX_ESTUDIANTES << "]: ";
    cin >> estudiantes;
  } while(estudiantes < 1 || estudiantes > MAX_ESTUDIANTES);
  return estudiantes; // Importante devolver el valor
}

int main() {
  int estudiantes = pedirEstudiantesEnRango();
  // el resto del programa
}

En la función anterior podemos usar MAX_ESTUDIANTES sin pasarlo como argumento porque es una constante global. Sin embargo, ¿qué pasaría si en algún momento del programa queremos pedir un número de estudiantes en otro rango? Habría que cambiar todo el programa. Entonces podemos agregar parámetros para indicar el mínimo y el máximo.
Código (cpp) [Seleccionar]

int pedirEstudiantesEnRango(int minimo, int maximo) {
  int estudiantes;
  do {
    cout << "Introduce el numero de estudiantes [" << minimo " - " << maximo << "]: ";
    cin >> estudiantes;
  } while(estudiantes < minimo || estudiantes > maximo);
  return estudiantes; // Importante devolver el valor
}

int main() {
  int estudiantes = pedirEstudiantesEnRango(1, MAX_ESTUDIANTES);
  // el resto del programa
}

Como se ve en el código anterior, si se utilizan parámetros es para pasar valores necesarios de una función a otra.

A partir de todo esto ya te toca seguir a ti y siempre puedes preguntar de nuevo si tienes algún problema o alguna duda.
Suerte.  :-X


PD: Las dos siguientes líneas son iguales con la diferencia de que la primera se entiende mejor que la segunda...
Además, si cuentas el bucle for() desde 0, no hace falta ni restar 1. ;) ;)
Código (cpp) [Seleccionar]

int retorno = f() - 1;
int retorno = (1 - f()) * -1;
#80
Programación C/C++ / Re: Mediana en un Array
2 Abril 2021, 23:58 PM
La media no es lo mismo que la mediana.
La mediana es el valor central de un conjunto de datos ordenados. En el caso de tener dos elementos centrales, la mediana es la media de los dos.

El proceso sería:
1 - Ordenar el vector
Siendo n el número de elementos del vector:
2.1 - Si n es impar, la mediana es el elemento (n+1)/2 del vector ordenado
2.2 - Si n es par, la mediana es la media entre el elemento (n/2) y (n/2+1)

Para una ayuda más concreta debes postear tu código (entre etiquetas de Código GeSHi). Las etiquetas de Código GeSHi las puedes seleccionar en el desplegable que dice "Código GeSHi" encima del cuadro de texto o escribiendo directamente:
[code=X]
Tu código aquí
[/code]
* Sustituye 'X' por 'cpp' para código C++ o por 'c' para código C.