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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [129] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 ... 161
1281  Programación / Programación C/C++ / Re: Me podrían ayudar con este programa en: 28 Abril 2016, 17:08 pm
Las pautas que te dan te solucionan casi todo el problema.
Empieza por crear la estructura de los números complejos.
1282  Programación / Programación C/C++ / Re: Normalizacion de cadenas en C en: 28 Abril 2016, 17:06 pm
Empecemos por el principio.
cad es el array que guarda la cadena en bruto. Se puede considerar cad como un puntero al primer elemento de dicho array.
pos es un puntero que recorre todo el array en bruto. De él se toman los caracteres para decidir que hacer con ellos.
des es un puntero que va a ser usado para formar el array nuevo. Solo se actualiza su posición cuando se ha soltado un carácter válido.

Para empezar hacemos que pos y des apunten al principio de cad.

Una bandera, espacio_escrito, sirve para saber si hemos escrito un carácter espacio y para marcar que no se escriban más en caso de que hubieren varios seguidos en la cadena en bruto.

Tip: en C, y para operaciones lógicas, todo valor 0 es falso y todo valor diferente de 0 es cierto.

Sí !espacio_escrito es igual a espacio_escrito==0.

Dentro del if que mira si estamos ante un espacio en blanco (un espacio o una tabulación) debemos mirar que no estemos al principio de la cadena nueva: no nos interesa poner espacios al principio de ella. Y esto es lo que hace des != cad: mira las direcciones a las que apuntan los dos punteros. Si son iguales no debemos escribir ningún espacio y por lo tanto saltamos todo el código de ese if.
De igual forma, si ya no estamos al principio de esa cadena, debemos mirar si con anterioridad hemos escrito un espacio o no, y eso es lo que hacemos mediante la bandera espacio_escrito. Si no se ha escrito un espacio debemos escribir uno y eso es lo que hace el código, además activamos la bandera a 1; así en los posteriores caracteres, si son blancos ya no escribiremos nada en la nueva cadena. Fíjate que, más adelante, nos encontramos un carácter no espacio en blanco, ponemos la bandera a 0.
Como consideramos espacios en blanco espacios y tabulaciones, y no nos interesa que en la cadena nueva haya tabulaciones, no podemos hacer *des = *pos porque *pos podría contener una tabulación. Para evitar esto y hacer que se escriba un espacio hacemos que *des = ' ', es decir escribamos un espacio en el caracter *des.
1283  Programación / Programación C/C++ / Re: Ayuda proyecto de un hospital en Dev c++ en: 28 Abril 2016, 00:43 am
Tal y como está planteado el código pon un campo más en el struct paciente que indique si está ingresado en el hospital o no. Para darlo de alta o ingresarlo modifica ese dato. La consulta de pacientes de un médico también debe usarlo.
1284  Programación / Programación C/C++ / Re: Liberar memoria asignada con malloc, después de salir de la función [C]. en: 27 Abril 2016, 22:18 pm
Es un ejemplo para que veas que hasta en la librería estándar usan el mismo código que tu, y que tanto odia tu manual. En serio, tíralo.
1285  Programación / Programación C/C++ / Re: Liberar memoria asignada con malloc, después de salir de la función [C]. en: 27 Abril 2016, 21:32 pm
En verdad no sé que manual estás siguiendo pero tíralo.
El programa está bien y, por ejemplo, así funciona la función de libreria fopen.

Código
  1. FILE *f = fopen(ruta, modo);

Date cuenta que tu función retorna la dirección de inicio del bloque que has adquirido de memoria. Lo único que tienes que hacer es no perderlo en ningún momento para pasárselo a free.
1286  Programación / Programación C/C++ / Re: {AYUDA}PROGRAMA EN C++ en: 27 Abril 2016, 21:26 pm
Mira si las fórmulas son correctas. Obtengo valores extraños y, al menos la fórmula de la ecuación de 2º grado que has dado en el enunciado está mal.
1287  Programación / Programación C/C++ / Re: Normalizacion de cadenas en C en: 27 Abril 2016, 18:33 pm
Algo así:
Código
  1. #include <stdio.h>
  2.  
  3. int tolower(int __c) {
  4.    if(__c >= 'A' && __c <= 'Z')
  5.        __c ^= 32;
  6.    return __c;
  7. }
  8.  
  9. int toupper(int __c) {
  10.    if(__c >= 'a' && __c <= 'z')
  11.        __c ^= 32;
  12.    return __c;
  13. }
  14.  
  15. int isblank(int __c) {
  16.    return __c == ' ' || __c == '\t';
  17. }
  18.  
  19. int main() {
  20.    char cad[50];
  21.    char *pos=cad;
  22.    char *des=cad;
  23.    int espacio_escrito = 0;
  24.  
  25.    printf("Ingrese la cadena: ");
  26.    fgets(cad, sizeof(cad), stdin);
  27.    puts(cad);
  28.  
  29.    while(*pos) {
  30.        if(isblank(*pos)) { /* Trato de todo tipo de espacios en blanco */
  31.            if(!espacio_escrito  && des != cad) { /* No se ha escrito el espacio en la cadena final Y no estamos en el primer carácter de la cadena final */
  32.                *des = ' ';
  33.                des++;
  34.                espacio_escrito = 1;
  35.            }
  36.        }        
  37.        else {
  38.            *des = tolower(*pos); /* Todo en minúscula */
  39.            des++;
  40.            espacio_escrito = 0;
  41.        }
  42.  
  43.        pos++;
  44.    }
  45.  
  46.    *des='\0';
  47.    cad[0] = toupper(cad[0]); /* Primera letra en mayúscula */
  48.  
  49.    puts(cad);
  50.    return 0;
  51. }
1288  Programación / Programación C/C++ / Re: Normalizacion de cadenas en C en: 27 Abril 2016, 16:25 pm
Puedes optimizar un poco el código, como ves pos siempre se incrementa, por lo que lo podrías sacar de los ifs.
Ya que el bucle principal recorre todos los caracteres del array mejor si solo manejas el control de los caracteres dentro de él y no generas más bucles, aparte de redundantes te quitan control y complican la lógica.
Te será más fácil si llevas todas las letras a minúsculas y ya fuera del bucle haces mayúscula la primera letra.
Ya existen funciones de librería para saber si un carácter es un carácter blanco y para cambiar la capitalización (solo en caracteres ingleses).
1289  Programación / Programación C/C++ / Re: Pointers en: 27 Abril 2016, 15:33 pm
La idea es buena, pero vamos a ver los fallos.
Creas un array dinámico para alojar la inversa del array que pasas y te mueves en él mediante aritmética de punteros, haciendo que el puntero mismo vaya variando. Cuándo lo quieres liberar con delete has perdido el puntero original que apunta al inicio de bloque con lo que fallas. La solución es crear un puntero permanente que guarde esa posición y usar otro para moverte por el array, tal que así:

Código
  1. arrayPtr2 = new int[size];
  2. arrayPtr2pointer = arrayPtr2;

Ahora usas uno para moverte como te movías y el otro para liberar con delete.

Para llevar arrayPtr hasta el final hazlo con una simple operación, así quitas código y tiempo de proceso:
En vez de
Código
  1. if (i == 0)
  2.    for (int j = 0; j < size; j++)
  3.        arrayPtr++;
usa
Código
  1. arrayPtr += size-1;

La orden para eliminar un array es mediante
Código
  1. delete [] identificardor_de_array
y no con
Código
  1. delete identificador_de_array

Las órdenes para preparar el array arrayPtr y para realizar la copia del arrayPtr2 al arrayPtr sácalas del bucle de generación del arrayPtr2. Son trabajos diferentes.

La función debería quedarte algo como esto:
Código
  1. void reverse(int *arrayPtr, int size) {
  2.    int *arrayPtr2pointer = new int[size];
  3.    int *arrayPtr2 = arrayPtr2pointer;
  4.  
  5.    arrayPtr += size - 1;
  6.    for (int i = 0; i < size; i++) {                
  7.        *arrayPtr2 = *arrayPtr;
  8.        arrayPtr--;
  9.        arrayPtr2++;
  10.    }
  11.  
  12.    arrayPtr++;  // Necesario porque en el último bucle se actualizan estos dos punteros
  13.    arrayPtr2--;  // y sobrepasan los limites. Hay que regresarlos a su lugar.
  14.  
  15.    arrayPtr2 = arrayPtr2pointer;
  16.    for (int i = 0; i < size; i++) {
  17.        *arrayPtr = *arrayPtr2;
  18.        arrayPtr++;
  19.        arrayPtr2++;
  20.    }
  21.    delete [] arrayPtr2pointer;
  22. }

Si la función no es para estudiar punteros, ni memoria dinámica y es solamente para invertir un array puedes dejar a un lado todo esto y usar código más normal.

Incluye en tu código lo siguiente:
Código
  1. #define SWAP(X,Y) { \
  2.     (X) ^= (Y); \
  3.     (Y) ^= (X); \
  4.     (X) ^= (Y); \
  5. }
  6.  
  7. #define ARRAY_LENGTH(X) sizeof(X)/sizeof(X[0])
  8.  
  9. void reverse(int array[], size_t size) {
  10.    int i;
  11.    for(i = 0; i < size / 2; ++i) {
  12.        SWAP(array[i], array[size - i - 1]);
  13.    }
  14. }
1290  Programación / Programación C/C++ / Re: Tengo un problema con un programa que no encuentro la informacion en: 27 Abril 2016, 11:46 am
Pero la ruta la puedes escribir directamente y no tener que ir trozo a trozo. Así podrias usar hasta las rutas relativas y el programa en script msdos o de powershell.
Páginas: 1 ... 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [129] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines