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


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  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 25 26 27 ... 112
111  Programación / Programación C/C++ / Re: C++ Memoria dinámica en: 5 Febrero 2018, 18:06
Deberías dar un poco de formato a tu código: cada sentencia en una línea, controlar las sangrías, dejar las llaves de cierre solas en su propia línea. Consideraciones estéticas. El código se ve mucho mejor y a simple vista se puede seguir de forma más intuitiva.

A lo que voy. Te dejo la función inacabada rellena con el código comentado más una recomendación: cuanto menos código escribas mejor (sin llegar a hacer críptica la solución, hay que sacrificar muchas veces la simplicidad por la claridad). La lógica muchas veces se puede simplificar, y no digo solo operaciones lógicas sino las líneas de código. Muchas veces el código se repite y no nos damos cuenta. Vale la pena perder un poco de tiempo en revisarlo y dejar todo lo que se repita fuera de las estructuras condicionales y reorganizar éstas para que solo toquen los pequeños cambios que se suceden.

Tu solución, supongo que esto te lo ha dado el profesor
Código
  1. void AddToCollection(Collection &col, int element) {
  2.    // la primera parte de la funcion
  3.    if (col.elno==0) {
  4.        col.elements = new int[1];
  5.        col.elements[0] = element;
  6.    }
  7.    //lo que no esta terminado
  8.    else {
  9.        int *temporal;
  10.        int i;
  11.  
  12.        temporal = new int[col.elno + 1]; // Hago que temporal sea un elemento más grande que el actual número de elementos.
  13.        for(i = 0; i < col.elno; ++i)
  14.            temporal[i] = col.elements[i]; // Copio todos los elementos del array antiguo al nuevo.
  15.        temporal[i] = element; // i está actualizada al nuevo último elemento por la forma en que trabaja for,
  16.                               // así que guardo el elemento pasado a la función.
  17.        delete[] col.elements; // Ahora puedo borrar el arrar antiguo
  18.        col.elements = temporal; // y hacer que el puntero elements apunte al nuevo array.
  19.    }
  20.    col.elno++; // Actualizo elno para indicar que hay un elemento más.
  21. }

Ahora la mía:
Se basa en que todo el trabajo es el mismo, menos en una cosa, tanto si no había elementos guardados o si los había.
Obviamente faltan las comprobaciones de seguridad, por si acaso hubiera algún fallo pero no están incluidas por simplicidad y claridad.

Código
  1. void AddToCollection(Collection &col, int element) {
  2.    int *temporal;
  3.    int i;
  4.  
  5.    temporal = new int[col.elno + 1];
  6.    for(i = 0; i < col.elno; ++i)
  7.        temporal[i] = col.elements[i];
  8.    temporal[i] = element;
  9.    if(col.elno) // Esta es la excepeción que he nombrado. Que es lo mismo a: if(col.elno > 0)
  10.        delete[] col.elements;
  11.    col.elements = temporal;
  12.    col.elno++;
  13. }
112  Programación / Programación C/C++ / Re: Convertir una cadena en Mayusculas en: 2 Febrero 2018, 09:38
Tiene que ser carácter a carácter. Si quieres hacerlo de una vez genera una función que tome dicha cadena y pase toupper carácter a carácter. Al regresar tendrás tu cadena en mayúsculas.

Por cierto, para guardar "hola" necesitas un array de 5 caracteres. Acuérdate que toda cadena tiene un carácter NUL ('\0') al final para marcar el fin de ésta.
113  Programación / Programación C/C++ / Re: Tengo un ejercicio al que no doy forma.Necesito un empujón en: 28 Enero 2018, 12:34
Antes de ayudarte con tu el algoritmo:
El ejercicio pide números introducidos a mano en el código, eso es, el array debes inscribirlo de la forma:
Código:
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Los valores óbviamente debes ponerlos tú.

Ahora:
Sabes que sí o sí es un array. Prepara dos variables, una que guarde el mayor y otra que guarde el menor.
Al principio del código haz que valgan lo mismo que el primer elemento del array.
Después, por cada elemento del array, menos el primero por la razón que ya hemos dicho, si menor es mayor que el elemento del array copiar dicho elemento a menor y de igual forma si mayor es menor que el elemento del array copiar dicho elemento a mayor.
Una vez terminado el bucle el número que buscas será la diferencia entre mayor y menor. No te preocupes por si menor o mayor y menor son negativos pues matemáticamente la respuesta será igual de buena.
114  Programación / Programación C/C++ / Re: EJERCICIO programacion en C. FICHEROS en: 27 Enero 2018, 23:05
No entiendo qué pretendes con esa condición del if.
115  Programación / Programación C/C++ / Re: rompecabezas imposible en: 26 Enero 2018, 12:17
Mete el código entre estas dos etiquetas:
[code=c] copia aquí todo tu código [/code]
Si no lo hace así ves que no se va a entender.
116  Programación / Programación C/C++ / Re: duda programa: no de devuelve el identificador como parametro de una funcion en: 24 Enero 2018, 22:12
No sé como vas de punteros pero te cuento:
Como sabes los parámetros se pasan a las funciones por valor, eso quiere decir que a la vuelta el parámetro no se habrá modificado.
Cuando pasas un puntero como parámetro de una función, dentro de ella podrás modificar el contenido de esa memoria, no el puntero en sí, que una vez que regreses, y recuerda que lo has pasado por valor (es decir, una copia) éste no se habrá modificado.
Es muy importante que memorices estos conceptos.

Ahora. La función fopen devuelve un puntero, es decir, genera una estructura en algún sitio de forma dinámica y nos devuelve el puntero al principio. Pretendes que ese puntero se quede guardado en el argumento que le pasas a la función, pero lo por explicado más arriba esa información no puede salir de la función, en main sigue el puntero original y por tanto se pierde.

¿Cómo podrías solucionar esto?
Haciendo que la función devuelva un puntero a FILE, es decir:
Código
  1. FILE* abrir(char nom[], char b[]) {
  2.    FILE *fich;
  3.    char nombre[40], dni[40], apellido[100];
  4.  
  5.    fich = fopen(nom, b);
  6.  
  7.    // aquí el resto de la función
  8.  
  9.    return fich;
  10. }
  11.  
  12. int main() {
  13.  
  14.    // aquí el código de main hasta llegar a abrir, y entonces
  15.  
  16.    fichlec = abrir(nombre, b);
  17.  
  18.    // ...
  19. }

O si te interesa pasar el parámetro sí o sí como argumento tendría que ser como puntero a puntero. La idea es: sabiendo que se puede cambiar el contenido de un puntero, pero no el puntero en sí, debes dar ese puntero (FILE *) como dato (de un puntero anterior que será el que se copiará) para que así se pueda modificar.

Por cierto, printf tiene un carácter de control para ver la dirección de los punteros: %p

Código
  1. void abrir(char nom[],FILE **fich, char b[]) {
  2.    // ...
  3.    *fich = fopen(nom,b); // para acceder al contenido, que es FILE *
  4.  
  5.    // Ahora, si quieres ver la dirección debes hacer
  6.    printf(" valor del identificador:  %p         ------------\n", *fich); // recuerda, el contenido de fich es lo que se devolverá a main
  7. }
  8.  
  9. int main() {
  10.    // ...
  11.    abrir(nombre, &filelec, b)
  12.  
  13.    // para ver la dirección de filelec es de la forma habitual:
  14.    printf(" valor del identificador:  %p         ------------\n", fichlec);
  15. }

Y recuerda que al terminar debes cerrar los archivos con fclose.
117  Programación / Programación C/C++ / Re: ayuda , guardar en un regsitro, inconvenientes en: 23 Enero 2018, 14:11
Así es. El problema es que actualizas contaproceso y cintacanti fuera de eso, por tanto también suman las comas y los otros caracteres no deseados.

Por otra parte, y como consejo, todos esos if-else que se basan en un número entero los puedes sustituir por otra construcción que existe en C para ese propósito: switch-case. El código quedará más claro.
Aunque aún puedes ir un paso más allá con otra instrucción que te hará toda la captura de forma automática aprovechando que el formato del archivo siempre es el mismo y se considera, de por sí, bien formateado: la función fscanf. El grupo de de funciones scanf son muy potentes para estos trabajos pero para eso uno debe saber usar la cadena de control, aunque no es nada difícil.
118  Programación / Programación C/C++ / Re: ayuda , guardar en un regsitro, inconvenientes en: 23 Enero 2018, 10:34
Todo lo que tienes hecho debe estar dentro del if(carácter !='\n'...
Cómo lo haces fuera, tu contador también cuenta esos caracteres y como lo usas para presentarlos en pantalla te devuelve lo que hay más allá de tus datos.
119  Programación / Programación C/C++ / Re: ¿Cómo hacer que una biblioteca sea multiplataforma? en: 22 Enero 2018, 21:50
Para compilar para diferentes S.O. pásate por aquí:
https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Para controlar el terminal en Linux por aquí:
https://www.google.es/search?q=termios&oq=termios&aqs=chrome..69i57.953j0j7&sourceid=chrome&ie=UTF-8
Y un ejemplo del uso de termios para realizar getche y getch de conio: https://github.com/billroy/bitlash/blob/master/src/conio.h
120  Programación / Programación C/C++ / Re: Duda sobre funciones en C/C++ en: 22 Enero 2018, 00:11
Vas muy rápido. Ya haces uso de programación visual y aún no dominas el lenguaje. Por ahora, y de verdad te será mucho más fácil, sí solo trabajas en modo texto. Aprende bien los fundamentos, después ya podrás combinarlo con el s.o. de tu elección y con el entorno gráfico que más te guste.

En este punto, para aprender esto, deberías estar con algo tan sencillo como:

Código
  1. #include <stdio.h>
  2.  
  3. Int devuelve_5() {
  4.    return 5;
  5. }
  6.  
  7. int main() {
  8.    int num = devuelve_5();
  9.    printf("num = %d", num);
  10.  
  11.    return 0;
  12. }
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 25 26 27 ... 112
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines