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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  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 ... 160
71  Programación / Programación C/C++ / Re: ARBOLES PATRICIA PROGRAMACIÓN Y ALGORITMOS en: 26 Marzo 2015, 02:54 am
Lo usual es utilizar un buscador, por ejemplo Google. Con este el primer vinculo listado es Radix Tree.

Un saludo
72  Programación / Programación C/C++ / Re: Problema en ejercicio Ayuda please en: 20 Marzo 2015, 02:53 am
tengo una duda con un ejercicion en C
Otra parte que se debe cambiar en el programa son las declaraciones de los arrays y las llamadas a scanf:

* Al llamar a scanf utilizas el operador "dirección de" (el '&'):
Código
  1. scanf("%s", &pregunta1);
No es necesario utilizar ese operador cuando el argumento sea un array.

* Los tres arrays tienen una capacidad para dos elementos pero, en un caso ideal, scanf almacenara tres caracteres (los dos de la cadena "si" o "no" mas el '\0' para indicar el final de la cadena). Hay que cambiar el numero de elementos de los benditos arrays como mínimo a tres.

* Para evitar el desbordamiento en la llamada a scanf debes utilizar la cadena de formato "%2s", en ella el '2' indica que se debe leer una palabra de máximo dos caracteres.

* Para evitar errores en el caso de palabras demasiado largas (mas de dos caracteres) debes eliminar el resto de la linea de texto. Ejemplos sobre ello hay a montones en la base de datos de los foros, solo es cuestión de utilizar el motor de búsqueda (busca los temas relacionados con el bufer de la entrada estándar).

Un saludo
73  Programación / Programación C/C++ / Re: [C] Base de datos automática en: 20 Marzo 2015, 02:40 am
"Por ultimo ya que el numero de registros es pequeño te conviene, al principio del programa, leer todo en memoria (en arrays) realizando ahí todo el proceso (solo los resultados finales los envías al archivo)."

¿Que quieres decir con leer todo en memoria?
A que declares en tu programa un array con capacidad para veinte elementos, a continuación abres el archivo y lees todos los registros almacenándolos en el array. La idea es un proceso mas rápido y evitar la validación de las operaciones (en el caso de archivos hay que tomar precauciones en caso de error o fin de archivo).

Un saludo
74  Programación / Programación C/C++ / Re: Error de suma en: 18 Marzo 2015, 16:44 pm
El programa trata de sumar los suspensos y aprobados de una clase de 10 en 4 asignaturas
Lo primero que debes hacer es eliminar las variables "i", "j", "nota", "notas" y "opc" ya que no se utilizan en el programa.

1.- La recogida de datos empieza con el alumno 1, asignatura 1, posteriormente asignatura 2 pero me mantiene el alumno 1, cuando deberia poner alumno 2.
Las ocurrencias de la variable "alumno" son:
Código
  1. int prueba = 1, alumno = 1; /* 1 */
  2.  
  3. printf ("Calificacion del Alumno %d:", alumno++); /* 2 */
  4. scanf ("%f", &A[a][b]);
  5. alumno = 1; /* 3 */
A ella le das el valor inicial de uno (1), imprimes su valor antes del incremento (2) y le asignas nuevamente el valor uno (3). En resumen la variable mantiene el mismo valor antes de su uso.

2.- Una vez introducida las calificaciones, la primera asignatura me suma los suspensos y aprobados, pero los sucesivos lo que hace es sumar los anteriores no me contabiliza los suspensos ya aprobados de la segunda asignatura y asi sucesivamente.
El programa solo hace lo que tu indicas que haga, no hay mas.

Aquí mejor un paréntesis y lo digo en buen plan: consigue un libro de calidad, si necesitas recomendaciones aplica el consejo usual (utilizar el motor de búsqueda de los foros).

----

Si necesitas de un bucle que itere por cada una de las cuatro asignaturas utilizas un bucle como este:
Código
  1. for (j = 0; j < max_pruebas; j++){
  2.   printf("Prueba No %d:\n", j + 1);
  3.  
  4.   /* Alguna operacion */
  5. }
Como puedes ver solo necesitas de una variable (el contador del bucle).

Y si necesitas leer las diez notas por cada prueba utilizas dos bucle anidados de esta forma:
Código
  1. puts("Calculo aprobados y suspensos");
  2. for (j = 0; j < max_pruebas; j++){
  3.   printf("Prueba No %d:\n", j + 1);
  4.   for (i = 0; i < max_alumnos; i++){
  5.      printf("Calificacion del Alumno %d:\n", i + 1);
  6.      scanf ("%f", A[i] + j);
  7.  
  8.      /* Alguna operacion por cada nota */
  9.   }
  10.  
  11.   /* Alguna operacion por cada prueba */
  12. }

Para obtener el promedio por cada materia lo que debes hacer es inicializar las variables "aprobados" y "suspensos" justo antes del bucle interno, en este obtienes todas las notas de la prueba y justo después de este (del mentado bucle) imprimes los resultados.

Un saludo
75  Programación / Programación C/C++ / Re: [C] Base de datos automática en: 17 Marzo 2015, 03:05 am
La idea es que la base sea automática, lo más autosuficiente posible, que se produzcan las menos interrupciones y peticiones al usuario posibles, de tal forma que las "entradas" (sujetos generados aleatoriamente) y las "salidas" (sujetos borrados por haber pasado los 95 años) estén equilibrados. En fin... ¿es realizable programar esto en C? ¿He cometido algún error en el planteamiento? ¿Necesito conocer especialmente algo que se me haya pasado por alto? Yo entiendo que el manejo de ficheros y del tiempo será esencial.
Es posible utilizando solo C estándar, las partes de la biblioteca estandar en las que te debes enfocar  son:
* <stdlib.h>
Por las funciones que permiten la generación de números aleatorios (srand y rand) así como funciones que te permitan obtener enteros de cadenas (atoi, atol, strtol, etc.).

* <time.h>
Para la obtención y generación de fechas (time en particular como semilla de srand).

* <stdio.h>
Lo mas pesado. Para el almacenamiento en archivos la aproximación mas sencilla son los archivos de texto plano (cada uno de los campos de cada registro se almacena en una linea), estos los lees linea por linea con fgets y se imprimen en el archivo con fprintf.

Por ultimo ya que el numero de registros es pequeño te conviene, al principio del programa, leer todo en memoria (en arrays) realizando ahí todo el proceso (solo los resultados finales los envías al archivo).

Un saludo
76  Programación / Programación C/C++ / Re: consulta especifica en C ayuda en: 17 Marzo 2015, 02:38 am
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

El primer error ocurre cuando pides confirmación en el primer caso:
Código
  1. char buscartitulo[15], titulo[20][15], salir;
  2.  
  3. /* ... */
  4.  
  5.   printf ("Quieres ingresar otro s/n \n");
  6.   scanf ("%s", &salir);
  7. }while (salir != 'n' && registro < 20);
Para leer un carácter mediante scanf debes utilizar el especificador de formato " %c", el espacio antes del carácter '%' es necesario para ignorar el espacio blanco (espacio, tabulador, etc.).

El segundo error ocurre en el bloque donde buscas el registro:
Código
  1. printf ("titulo a buscar ");
  2. scanf ("%s", buscartitulo);   ///si lo busco con un entero %d si me funciona
  3. while (contador == 1 && x < registro){
  4.   if (buscartitulo == titulo[x]){ /* <== */
  5.      posicion = x;
  6.      contador = 0;
  7.   }
  8.   x++;
  9. }
  10. if (contador) {
  11.   printf ("No se encontro el titulo que se buscaba\n");
  12. }
  13. else
  14.   printf ("id es %d precio es %d cantidad es %d \n"
  15.           , id[posicion], precio[posicion], cantidad[posicion]);
En C no puedes utilizar el operador de comparación "==" con cadenas, en su lugar debes utilizar la función strcmp. Ejemplos de ellos los puedes consultar mediante el motor de búsqueda de los foros.

Un saludo
77  Programación / Programación C/C++ / Re: Sobre aprobado y suspenso en: 17 Marzo 2015, 02:12 am
Los errores principales son dos. El primero son los indices utilizados para acceder al array de arrays:
Código
  1. for (i = 0; i < PRUEBAS; i++) { /* i == 0 .. 3 */
  2.   printf ("\nNumero de Prueba %d: \n", prueba++);
  3.   for (j = 0; j < ALUMNOS; j++) { /* j == 0 .. 9 */
  4.      printf ("Calificacion del Alumno %d:", alumno++);
  5.      scanf ("%f", &A[i][j]);
Están al revés, "i" debe iterar desde 0 hasta ALUMNOS y "j" desde 0 hasta PRUEBAS. Lo que lleva a que estas procesando cada uno de los alumnos (contador "i") del cual pides cada una de las notas (contador "j").

El otro error se debe al uso de la variable "nota":
Código
  1. int nota = 0;
  2.  
  3. /* ... */
  4.  
  5. printf ("Calificacion del Alumno %d:", alumno++);
  6. scanf ("%f", &A[i][j]);
  7.  
  8. if (nota >= 5)
  9.   aprobados++;
  10. else
  11.   suspensos++;
  12. alumno = 1;
A esa variable le das un valor inicial de cero y después de ello nunca la modificas. La variable que debes verificar para conocer si el alumno aprobó o no la materia es "A[ i ][ j ]":
Código
  1. if (A[i][j] >= 5)
  2.   aprobados++;
  3. else
  4.   suspensos++;

Un saludo
78  Programación / Programación C/C++ / Re: Ayuda con este programa! en: 16 Marzo 2015, 02:28 am
tengo un pequeño problema con uno de los programas q realizo, epero me puedan ayudar.
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

En cuanto a la función buscar el error es no inicializar la variable "i" con el valor cero y también deberías en la función main verificar su valor de retorno en caso de no encontrarse la cadena.

Otra opción es utilizar el valor N (numero de elementos) para indicar que no se encontró la cadena, de esta forma:
Código
  1. if ((j = Buscar (f, 22, c)) == 22) /* Hay que evitar magic numbers */
  2.   printf("No se encontro la fruta");
  3. else
  4.   printf("Costo de la Fruta es de $%s\n", p[j]);
  5.  
  6. /* ... */
  7.  
  8. int Buscar(char f[][15], int n, char *c)
  9. {
  10.   int i;
  11.  
  12.   for (i = 0; i < 22 && strcmpi(c, f[i]) != 0; i++)
  13.      ;
  14.  
  15.   return i;
  16. }

Ya por ultimo evita usar la función gets, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
79  Programación / Programación C/C++ / Re: Funciones y Proyectos en C en: 15 Marzo 2015, 20:29 pm
El código fuente que publicas tiene bastantes errores y la primera recomendación es: consigue un curso o libro de calidad, recomendaciones sobre ellos las puedes consultar mediante el motor de búsqueda de los foros.

Algunos de los errores son:

* En la función "suma_vectores" utilizas el operador "+=" cuando debería ser "+".
* Esa misma función retorna "vsuma[ i ]" con "i" igual a dim pero ese elemento no tiene un valor asignado.
* En la invocación de la función tratas de inicializar el array "vsuma" con el valor de retorno de la función "suma_vectores", eso no es posible ya que una función no puede retornar un array.

Debes cambiar la aproximación y modificar la función de suma de vectores para que acepte cuatro argumentos: las direcciones base de los dos arrays, el numero de elementos en ambos y la dirección base del array de resultados (la suma).

Poco mas o menos así:
Código
  1. /* Declaracion de variables */
  2. float a[NUM_ELEM];
  3. float b[NUM_ELEM];
  4. float suma[NUM_ELEM];
  5.  
  6. /* ... */
  7.  
  8. /* Invocacion */
  9. suma_vectores(a, b, NUM_ELEM, suma);
  10.  
  11. /* ... */
  12.  
  13. /* Definicion */
  14. void suma_vectores(float *a, float *b, int num_elem, float *suma)
  15. {
  16.   int i;
  17.  
  18.   for (i = 0; i < num_elem; i++)
  19.      suma[i] = a[i] + b[i];
  20. }

Un saludo
80  Programación / Programación C/C++ / Re: Comparación de dos cadenas sin usar ningún tipo de bucle en: 15 Marzo 2015, 20:12 pm
Aquí hay que tener presente la distinción entre contenedor (array) y contenido (cadena).

En el caso de las cadenas literales como "hola" estas se almacenan en un array anónimo (sin nombre) con el tamaño suficiente para cada uno de los caracteres indicados mas el terminador '\0', cadenas literales idénticas pueden almacenarse en arrays distintos o bien solo ser una referencia al (la dirección del) mismo array.

A ello se debe que la comparación "hola" == "hola" puede ser verdadera pero el estándar de C no lo garantiza.

Caso aparte si la cadena se almacena en un array declarado en el programa, en el bloque de memoria retornado por las funciones calloc, malloc o realloc o bien uno de los arrays estáticos parte de la biblioteca estándar de C. En todos esos casos las direcciones de memoria serán distintas sin importar el contenido.

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