elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 125
81  Programación / Programación C/C++ / Re: Duda C++. Compila pero no corre. en: 17 Febrero 2015, 08:13 am
Debería cambiar el resto de las funciones en las que pasé una lista como parámetro?

En aquellos casos en los que necesites modificar el valor del puntero (liberar memoria, modificar el tamaño de la memoria reservada, etc), SI. En estos casos es un imperativo para que los cambios se reflejen fuera de la función.

En el resto de casos no es necesario y puede ser incluso contraproducente. Lo más sano es facilitar a cada función la cantidad mínima de datos necesaria.

La materia no cubre objetos, por eso las listas las hacemos de esa manera.
Le discutiré eso pues mi profesor es graduado de la facultad más prestigiosa en ingeniería de mi país, donde estoy estudiando yo ahora, y sé que tiene sus razones para evitar que usemos los String.

Quizás, una de las pegas de la clase "string" es que no admite unicode... pero para eso está la clase "wstring". En cualquier caso, ambas clases forman parte del estándar... y aunque en la librería estándar existen bugs, no es motivo para no usarlos. Básicamente porque cualquier librería externa que tengas que usar (incluso las propias del sistema operativo) también están expuestas a fallos de programación y no por ello dejas de usarlas. Además, la librería estándar suele tener algoritmos altamente optimizados, por lo que suele ser la mejor opción para programas de uso general.

Un saludo.
82  Programación / Programación C/C++ / Re: Imprimir la palabra mas larga de un string C++ en: 16 Febrero 2015, 16:20 pm
Muy bueno el invertir cadena, con respecto a la PalabraMasLargar hay un bug.

La idea no era dar un código completo... si miras el algoritmo ves que separa palabras únicamente por espacios, pero se puede mejorar fácilmente para que sea capaz de reconocer otros tipos de separadores.

Código
  1. if ( *it2 == ' '  || *it2 == ',' || *it2 == '.' /* ... */ )

83  Programación / Programación C/C++ / Re: Problema con Array en: 16 Febrero 2015, 12:25 pm
no logro ver como hacer para que cuando ya no hallan puestos disponibles el programa pregunte si desea un puesto en la otra clase y si la respuesta es SI que lo asigne

Código
  1. if(vacantes==false){cout<<"No hay vancantes en la clase #"<<clase<<endl; cin.get();cin.get();return;}

Ese if se ejecuta cuando no hay asientos en la clase seleccionada... solo tienes que poner ahí la lógica para que pregunte por un puesto en la nueva clase.

Un saludo.
84  Programación / Programación C/C++ / Re: Imprimir la palabra mas larga de un string C++ en: 16 Febrero 2015, 11:26 am
Invertir un string... que tal así:

Código
  1. int main( )
  2. {
  3.  std::string cadena = "0123456789";
  4.  std::string invertida( cadena.rbegin( ), cadena.rend( ) );
  5.  
  6.  std::cout << invertida << std::endl;
  7. }

En cuanto a encontrar la palabra más larga... con iteradores se puede conseguir fácilmente:

Código
  1. void PalabraMasLarga( const std::string& cadena )
  2. {
  3.  std::string palabra;
  4.  auto it = cadena.begin( );
  5.  
  6.  for( auto it2 = it; it2 != cadena.end( ); ++it2 )
  7.  {
  8.    if ( *it2 == ' ' )
  9.    {
  10.      size_t length = std::distance( it, it2 );
  11.      if ( length > palabra.size( ) )
  12.        palabra = std::string( it, it2 );
  13.      it = it2+1;
  14.    }
  15.  }
  16.  
  17.  std::cout << palabra << std::endl;
  18. }

El codigo usa dos iteradores, uno apunta al inicio de la palabra actual y el otro va avanzando hasta encontrar un espacio, si la longitud de la cadena es mayor que la palabra más larga encontrada hasta ahora, la sustituye.

Simple y rápido.
85  Programación / Programación C/C++ / Re: Duda C++. Compila pero no corre. en: 16 Febrero 2015, 10:16 am
Las cadenas de tipo string no las tengo permitidas usar, el profesor nos dijo que eran sumamente inestables y que prefería que usemos char.

Me permito la licencia de decir públicamente que tu profesor no tiene ni la más mínima idea idea de programación. Las clases de la librería estándar están ahí por algo. Y su implementación es bastante eficiente y estable. Otra cosa es que, claro, al no tener mucha idea sobre programación orientada a objetos, prefiera que programéis lo más parecido a C posible... pero eso, como he dicho, no habla muy bien del nivel de tu profesor.

A ver, tal y como lo entiendo, el profesor debería motivar vuestra curiosidad y abriros los ojos, no encasillaros y obligaros a programar de una forma que no será la que os encontréis luego en "el mundo real".

El índice quería que empezara en 1, por eso el i++ previo.

Imagínate que el arreglo admite dos elementos y estás rellenando el segundo. Al hacer "i++", i pasa a valer "2" y en la siguiente línea intenas escribir en el elemento con índice "2", es decir, estarías escribiendo en una posición de memoria no válida.


pero tenía entendido que las listas y los array siempre pasan por referencia.

Cuando usas un puntero como argumento, todo lo que modifiques que se refiera a la memoria apuntada por el puntero se verá reflejado fuera de la función... pero el puntero, como variable, es algo local, luego modificar la posición de memoria apuntada por el puntero es un cambio local y no se refleja fuera de la función. No se si me explico.

Un saludo.
86  Programación / Programación C/C++ / Re: Duda C++. Compila pero no corre. en: 16 Febrero 2015, 09:05 am
Las funciones no deben terminar con ";"

Esto sucede con la copia que has puesto de "LlenarVector", por ejemplo.

Estás programando en C++, no deberías usar los includes que acaben en ".h"

Esas cabeceras son de C. Puedes cargar la cabecera propia de C++ poniendo el prefijo "C" y eliminando el ".h" ( #include <cmath> en vez de #include <math.h> )

Dado que estás programando en C++, sería más cómodo y seguro para tí usar la clase "string" en vez de "char*" para almacenar cadenas.

Código
  1. int main( )
  2. {
  3.  // Tu estás usando este tipo de variables
  4.  char* variable = "una prueba";
  5.  
  6.  // Cuando puedes usar esta otra. Fíjate que no hace falta usar strncpy para copiar los valores.
  7.  std::string cadena = variable;
  8. }

En C++ no hace falta usar "typedef" para declarar estructuras:

Código
  1. struct Dato
  2. {
  3.  int valor;
  4. };
  5.  
  6. int main( )
  7. {
  8.  Dato dato; // Funciona sin typedef
  9.  dato.valor = 10;
  10. }

Los índices no los estás actualizando correctamente:

Código
  1. void LlenarVector(Equipo vectorequipos[], int &i) { //usando la función dada "leerequipo" lleno el vector y devuelvo el tamaño.
  2.     FILE *archivo = fopen ("equipos.txt", "r");
  3.   char nombre[31];
  4.   int pA, pB;
  5.  
  6.  
  7.   while (leerEquipo(archivo, nombre, pA, pB))
  8.   {
  9.  
  10.     vectorequipos[i].paramA = pA; //estos dos son parámetros usados para simular partidos, son enteros.
  11.     vectorequipos[i].paramB = pB;
  12.     strncpy(vectorequipos[i].nombre, nombre, 31);
  13.     i++;
  14.         vectorequipos[i].indice = i; // <<<< AQUI!!!
  15.   };
  16.   fclose (archivo);
  17. }
  18.  

Fíjate que en la línea anterior estás actualizando "i", luego la línea marcada está modificando el índice del siguiente registro.

Cuidado al inicializar los arreglos:

Código
  1. void Aleatoriafecha(int l, int fechastotales, tipofixture *fixture){
  2.    srand(time(NULL));//Para que no repita en caso de fixture nuevo
  3.    int vec[fechastotales];

"fechastotales" es una variable. Esta forma de definir los arreglos no es estándar y puede darte problemas. Es más seguro crear un arreglo de tamaño fijo y más grande de lo necesario o recurrir a la memoria dinámica.

La función AleatoriaFecha no funciona

Si revisas el código, verás que "vec" únicamente va a contener un elemento SIEMPRE... en la función no hay ningún bucle.

La función "crearlista" no funciona

Código
  1. void crearlista(tipofixture *fixture){ //creo listas
  2. fixture=NULL;
  3.  
  4. };

En primer lugar, el nombre de la función no se corresponde con el funcionamiento teórico de la función, ya que no crea nada, en tal caso inicializa un puntero. En segundo lugar, esta función no hace ABSOLUTAMENTE NADA, "tipofixture", si bien es un puntero, es una variable local. Esto quiere decir que cualquier cambio que realices sobre el puntero en sí (ojo, no sobre la memoria "apuntada" ), es un cambio que va a desaparecer al salir el código de la función. Si tu idea es que el cambio del puntero se refleje fuera de la función tienes que usar un puntero doble:

Código
  1. void crearlista(tipofixture **fixture){ //creo listas
  2. *fixture=NULL;
  3. };

Resumen

Tu código tiene bastantes inconsistencias. Deberías revisarlo con más detenimiento.

Ah si, y sería de agradecer que, para la siguiente ocasión, el código que facilitas pueda ser compilado... no es demasiado agradable tener que deducir el funcionamiento de tu programa únicamente viendo líneas de código.

Un saludo
87  Programación / Programación C/C++ / Re: ¿Cual es la diferencia entre C & C++ y cada una de sus ventajas? en: 15 Febrero 2015, 12:35 pm
C# es agua de otro costal, es código privativo Microsoft, pero es hijo de C++

Desde más o menos abril del año pasado, C# pasó a ser código abierto.
88  Programación / Programación C/C++ / Re: Permutaciones en C++ en: 13 Febrero 2015, 13:14 pm
Te agradezco el código, no tenía constancia de esa función (funciona a la perfección, por cierto) pero a la vez soy del colectivo imbécil que le encanta reinventar la rueda, como bien dices pienso que para aprender está genial.

Una posible implementación de "next_permutation" copiada de la web cppreference:

Código
  1. template<class BidirIt>
  2. bool next_permutation(BidirIt first, BidirIt last)
  3. {
  4.    if (first == last) return false;
  5.    BidirIt i = last;
  6.    if (first == --i) return false;
  7.  
  8.    while (1) {
  9.        BidirIt i1, i2;
  10.  
  11.        i1 = i;
  12.        if (*--i < *i1) {
  13.            i2 = last;
  14.            while (!(*i < *--i2)) ;
  15.  
  16.            std::iter_swap(i, i2);
  17.            std::reverse(i1, last);
  18.            return true;
  19.        }
  20.        if (i == first) {
  21.            std::reverse(first, last);
  22.            return false;
  23.        }
  24.    }
  25. }

* Te he puesto el código directamente porque explicado queda un poco rebuscado
89  Programación / Programación C/C++ / Re: Permutaciones en C++ en: 13 Febrero 2015, 12:08 pm
Si tu idea es pegarte con ello por aprender, perfecto.

En caso contrario, lo que estás buscando ya existe:

Código
  1. #include <algorithm>
  2. #include <iostream>
  3.  
  4. int main( )
  5. {
  6.  std::string cadena = "ABCD";
  7.  
  8.  do
  9.  {
  10.    std::cout << cadena << std::endl;
  11.  } while ( std::next_permutation( cadena.begin( ), cadena.end( ) ) );
  12. }
90  Programación / Programación C/C++ / Re: Juego Buscar objetos escondidos en: 11 Febrero 2015, 16:52 pm
Segundo yo no fui el desarrollador del código fue un colega mio como lo dije al principio de la publicación de dicho código, yo solamente compile el código y lo publique.

Si lo publicas, aunque no sea tuyo, pasas a adquirir cierta responsabilidad, ya que es tu nick el que figura junto al aporte.

Si alguien te dice "firma aquí", no vas a hacerlo sin el documento, entenderlo y estar conforme. Y es totalmente comprensible debido a las implicaciones legales que puede tener firmar algo.

Con lo que publicas en un foro pasa lo mismo. Si publicas algo, es tu nombre el que aparece junto al aporte y eso te hace responsable del contenido publicado. Por otro lado, dado que lo has publicado se entiende que estas conforme con el contenido, luego no es correcto excusarse diciendo que el código no es tuyo.

Si quieres aportar cosas a un foro, perfecto, pero no pierdas de vista que el aporte tiene que ser constructivo. Si no cumple ese requisito te puedes ahorrar el aporte. Una frase célebre de Hipócrates dice así: "Ante la enfermedad sólo pueden tomarse dos actitudes: o curar o, al menos, no perjudicar". En este caso, lo suyo es hacer aportaciones productivas o, al menos, no enseñar malos hábitos a los que están aprendiendo.

Un saludo.
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 125
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines