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

 

 


Tema destacado: Curso de javascript por TickTack


  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 ... 160
91  Programación / Programación C/C++ / Re: Error en codigo Ayuda!!! en: 10 Marzo 2015, 04:02 am
ahora  compila y ejecuta pero cuando  tecleo la Opcion 1 y preciono ENTER  simplemente regresa al menu y asi con las otras Opciones
Eso sucede porque en la sentencia condicional switch:
Código
  1. switch (opc)
  2. {
  3. case 1:
  4. {
  5.   void lectura_datos(float *apun_trabajadores[10]);
  6.   break;
  7. }
  8. case 2:
  9. {
  10.   void calcular_salarioTotal(float *apun_trabajadores[10]);
  11.   break;
  12. }
  13. case 3:
  14. {
  15.   void imprimir_datos(float *apun_trabajadores[10]);
  16.   break;
  17. }
  18. }
Lo que estas haciendo es declarar las funciones.

Para llamar a (ejecutar, invocar) una función debes indicar el nombre de esta seguido de sus argumentos (delimitados por paréntesis), de esta forma:
Código
  1. switch (opc){
  2. case 1:
  3.   lectura_datos(apun_trabajadores);
  4.   break;
  5. case 2:
  6.   calcular_salarioTotal(apun_trabajadores);
  7.   break;
  8. case 3:
  9.   imprimir_datos(apun_trabajadores);
  10.   break;
  11. }

¿Por qué el arreglo bidimensional es declarado con un solo índice (solo se especifican las filas y no las columnas)?
float *apun_trabajadores[10];

¿Por qué se debe reservar espacio para las columnas? (malloc)
for(fila=0; fila<10; fila++) apun_trabajadores[fila]=(float*) malloc(6*sizeof(float));
Porque "apun_trabajadores" es un array de punteros, esto es, no almacena los valores directamente, en su lugar almacena las direcciones de las filas cada una con un tamaño fijo de seis elementos (las columnas) de tipo float.

Por eso primero reservas la memoria necesaria para cada fila guardando esta (la dirección) en el array.

En tu caso se puede utilizar un array de arrays (por ejemplo "float trab[10][6]") sin problemas, el porque se utiliza en su lugar un array de punteros mas reserva dinámica de memoria vía malloc se debe, supongo, al enunciado.

Un saludo
92  Programación / Programación C/C++ / Re: Convertir decimal a diferentes bases en: 9 Marzo 2015, 16:32 pm
Aún no tengo claro con qué podría sustituir el new char, ya que mi propósito es usar C
Puedes utilizar new porque utilizas un compilador de C++, revisa con cuidado su documentación para saber como compilar el código fuente como C.

Tampoco estoy seguro de por qué se debe de usar esto:
Código:
resultado[j] = char('0' + n[i]);
Porque los enteros 0, 1, 2, ... y los caracteres '0', '1', '2' ... se parecen (son enteros) pero no son los mismo (sus valores son diferentes).

Para obtener los dígitos 0, 1, 2, ... en base a los caracteres '0', '1', '2', ... debes restar '0'. Para explicarlo mejor:
Código:
'0' - '0' == 0
'1' - '0' == 1
...
'9' - '0' == 9
Y lo opuesto también aplica, para obtener los caracteres '0', '1', '2', ... en base a los dígitos 0, 1, 2, ... debes sumar '0':
Código:
0 + '0' == '0'
1 + '0' == '1'
...
9 + '0' == '9'
Ello porque los caracteres '0', '1', '2', ... tienen posiciones (valores) consecutivos y están ordenados de forma ascendente ('0', '1', '2', ...., '9').

Y esto:
Código:
resultado[j] = '\0';
Porque en C una cadena es una secuencia de cero o mas caracteres seguidos del carácter '\0', este ultimo se utiliza para indicar el final de la cadena (si no lo colocas, ¿Como sabes donde termina?).

Ademas quisiera saber por qué en algunos char se debe poner char*, me dijeron que para que funcionara debía ponerlo, pero no se por qué.
Se utiliza "char *" para declarar una variable de tipo "puntero a carácter", ese tema lo veras mas adelante junto con los arrays.

Por ultimo si no tienes un curso o libro de calidad consigue uno, recomendaciones sobre ellos las puedes encontrar mediante el motor de búsqueda de los foros.

Un saludo
93  Programación / Programación C/C++ / Re: Consulta - Llamar función dentro de su misma función en: 8 Marzo 2015, 17:24 pm
Yo te recomendaría declarar la función como bool, y, desde el lugar donde la llamas, hacer un:
Código
  1. while(sumando());

Y convertir el if en:

Código
  1. if(seguir == 1)
  2.    return true;
  3. else
  4.    return false;
Ya que el resultado de los operadores relacionales es el esperado (true si se cumple la condición, falso en caso contrario) la sentencia condicional se puede eliminar quedando solo la sentencia de retorno:
Código
  1. return seguir == 1;

Un saludo
94  Programación / Programación C/C++ / Re: leer desde archivo en c en: 7 Marzo 2015, 16:47 pm
yo lo que quiero es leer de un archivo desde el final hasta el principio, pero por lo visto no se puede
Es posible y relativamente fácil en el caso de archivos binarios, en el caso de archivos de texto plano hay varias limitaciones.

Una aproximación consiste en leer cada uno de los caracteres en el archivo tomando nota cuando se requiera del inicio de cada linea mediante la función ftell. Ya con la posición de cada linea puedes utilizar fseek para posicionarte en la que tu quieras y leerla (recordando que las operaciones de lectura bien sobrescriben o agregan al final, no insertan).

Un programa de ejemplo donde se imprime cada una de las lineas de un archivo de texto empezando con la ultima y terminando con la primera:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_LINEAS  1024
  5. #define MAX_CHARS   1024
  6.  
  7. #define NOM_ARCHIVO  "main.c"
  8.  
  9. int main(void)
  10. {
  11.   FILE *in;
  12.   long pos[MAX_LINEAS];
  13.   int num_pos;
  14.   char linea[MAX_CHARS];
  15.   int i;
  16.   int ch;
  17.  
  18.   if ((in = fopen(NOM_ARCHIVO, "rt")) == NULL){
  19.      perror(NOM_ARCHIVO);
  20.      return EXIT_FAILURE;
  21.   }
  22.  
  23.   /* Obtenemos la posicion de inicio de cada linea en el archivo */
  24.   ch = '\n';
  25.   num_pos = 0;
  26.   do {
  27.      if (ch == '\n' && (ch = fgetc(in)) != EOF){
  28.         ungetc(ch, in);
  29.         pos[num_pos++] = ftell(in);
  30.      }
  31.   }while ((ch = fgetc(in)) != EOF);
  32.  
  33.   /* Posicionamiento sobre cada linea de la ultima a la primera */
  34.   i = num_pos;
  35.   while (i > 0){
  36.      i--;
  37.      fseek(in, pos[i], SEEK_SET);
  38.      fgets(linea, MAX_CHARS, in);
  39.      printf("%s", linea);
  40.   }
  41.   fclose(in);
  42.  
  43.   return EXIT_SUCCESS;
  44. }

Un saludo
95  Programación / Programación C/C++ / Re: leer desde archivo en c en: 6 Marzo 2015, 15:17 pm
pues no funciona como dices, lo que hace es sobreescribir el numero
Todas las operaciones en archivos sobrescriben o bien agregan al final

pero lo que quiero es que se vayan añadiendo uno delante de otro
No es posible insertar en un archivo.

Hay varias alternativas, la mas sencilla consiste en:
1) Abres el archivo original y uno auxiliar.
2) Envías los datos como deseas al archivo auxiliar.
3) Cierras los archivos.
4) Eliminas el archivo original mediante la función remove.
5) Renombras el archivo auxiliar con el nombre del original mediante la función rename.

Un saludo
96  Programación / Programación C/C++ / Re: Errores al compilar en: 6 Marzo 2015, 07:25 am
porque se pone el asterisco?

Código
  1. void ordenar (int *ord);
  2. void imprimir (int *impri);
En realidad no es necesario el cambio (es mas bien una cuestión de estilo).

Todo argumento que se declare en la forma "T nombre[N]", por ejemplo:
Código
  1. void ordenar (int ord[ALGUN_VALOR]);
  2. void imprimir (int impri[ALGUN_VALOR]);
Se procesa como si la declaración fuera:
Código
  1. void ordenar (int *ord);
  2. void imprimir (int *impri);
Ahí el asterisco indica que el argumento es un puntero, en tu caso la dirección en memoria del primer elemento del array. Revisa tu material de referencia y busca los apartados sobre punteros y arrays.

Un saludo
97  Programación / Programación C/C++ / Re: Convertir decimal a diferentes bases en: 6 Marzo 2015, 07:19 am
El primer problema con el programa es que el lenguaje es C++ (la próxima vez por favor indícalo) pero no tiene casi nada de este (solo la reserva de memoria mediante new).

En la función de conversión los cambios a realizar son:
1) Debes reducir en una unidad el contador "i" antes de procesar cada dígito.
2) Cuando el dígito este en el rango 0 .. 9 para generar el carácter correspondiente debes utilizar:
Código
  1. resultado[j] = char('0' + n[i]);
3) Después del bucle y antes de la sentencia de retorno debes agregar el carácter de fin de cadena con:
Código
  1.   resultado[j] = '\0';
  2.  
  3.   return resultado;
  4. }

Por ultimo en la función main debes imprimir el resultado mediante printf:
Código
  1. printf("El numero %d en base %d es: ", num, base);
  2. printf("\"%s\"\n", conversion(num, base)); /* <== */
  3. printf("\n\nQuieres convertir otro numero? Si=0/No=1 ");

Ya por ultimo deberías utilizar las facilidades del lenguaje, la función se puede reducir bastante, falta liberar la memoria utilizada y hay que evitar el uso de la biblioteca conio de Borland. Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|

Un saludo
98  Programación / Programación C/C++ / Re: (Problema)Matrices Dinámicas de Caracteres! en: 6 Marzo 2015, 03:37 am
Modifique la función 'asignar', siguiendo tu recomendación. como resultado surgio un error en //ASIGNAR MEMORIA PARA CADA FILA
Debes pasar un puntero de tipo "char ***" y dentro de la función aplicar indireccion utilizando paréntesis, esto porque los operadores sufijos como "[]" tienen mayor prioridad que los prefijos como "*".

De esta forma:
Código
  1. void asignar(char ***matriz, int filas, int columnas)
  2. {
  3.   *matriz = malloc(filas * sizeof *matriz);
  4.  
  5.   for (int i = 0; i < filas; i++)
  6.      (*matriz)[i] = malloc(columnas * sizeof *(*matriz)[i]);
  7. }

Otro error se encuentra en la función que libera la memoria, la sentencia:
Código
  1. free(matriz + i);
Hay que cambiarla a:
Código
  1. free(matriz[i]);

----

Algunas recomendaciones:
* Evita el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.
* Las conversiones explicitas del valor retornado por las funciones malloc, calloc y realloc NO son necesarias y no se recomiendan.
* Cuando publiques código fuente utiliza las etiquetas de código, si utilizas las etiquetas para citar no se puede revisar el código fuente correctamente.

Un saludo
99  Programación / Programación C/C++ / Re: programa punteros c en: 6 Marzo 2015, 03:01 am
No se por que el programa se salta el segundo scanf.
Como ya te comento ivancea96 el error se encuentra en la llamada a scanf:
Código
  1. scanf("vuelve a escribir un valor para dato(%d)\n",&p->dato2);

----

Solo para redondear el tema: cuando colocas texto literal en la cadena de formato este se consumirá solo si se encuentra literalmente en el stream (en este caso la entrada estándar).

En tu programa para que este genere la salida esperada debes introducir el primer numero, inmediatamente después el texto "vuelve a escribir un valor para dato(" y justo después de este el segundo numero. Por ejemplo:
Código:
introduce dato:
123vuelve a escribir un valor para dato(456  <== Entrada del programa
dato guardado con punto ((*D).dato) 123
introduce dato 2:
dato guardado por flecha(->) 456
Presione una tecla para continuar . . .

Un saludo
100  Programación / Programación C/C++ / Re: Leer archivo de texto en: 5 Marzo 2015, 16:06 pm
Estuve intentando leer un archivo de texto con el siguiente formato:

Pablo#10#7/12/1990

Estoy empezando a llegar a la conclusión de que no es posible leerlo con un solo fscanf con los siguientes parámetros:
Código:
fscanf(pF,"%s#%d/%d/%d",nombre,&dia,&mes,&ano);
Si tienes garantizada la estructura del archivo de texto puedes leer los cinco campos de cada registro con fscanf, un ejemplo de ello pero utilizando sscanf y un array para explicarlo mejor y de una manera mas fácil (eso espero) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *linea[] = {
  7.      "Hugo#14#7/12/1990",
  8.      "Paco#12#5/10/1988",
  9.      "Luis#10#3/08/1986",
  10.      "LINEA_SIN_EL_FORMATO_VALIDO"
  11.   };
  12.  
  13.   char nombre[100];
  14.   int num;
  15.   int d;
  16.   int m;
  17.   int a;
  18.   int i;
  19.  
  20.   for (
  21.      i = 0;
  22.      sscanf(linea[i], " %[^#]#%d#%d/%d/%d", nombre, &num, &d, &m, &a) == 5;
  23.      i++
  24.   )
  25.      printf("%s %d %d/%d/%d\n", nombre, num, d, m, a);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Otra opción es:
1) Leer cada linea con fgets.
2) Obtener cada uno de los componentes (separados por el carácter '#') con strtok.
3) Obtener los enteros del segundo y tercer componente con sscanf.

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 25 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines