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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ... 88
201  Programación / Programación General / Re: ¿Con qué clase de programación te sientes más identificado? en: 30 Mayo 2020, 21:07 pm
Yo diría que me siento más identificado con la programación de bajo nivel o nivel medio. Empecé con una mezcla de C y C++ hasta que aprendí a diferenciarlos (algo que parece muy tonto pero mucha gente los usa indiferentemente) y aunque he probado algún lenguaje más, estos siguen ahí presentes.
Me gusta saber cómo funcionan las cosas y los lenguajes de menor nivel de abstracción te permiten entender mejor el funcionamiento directo con memoria. Hay que decir que ahora tengo que trabajar con Java y echo de menos mis queridos punteros (aunque mucha gente los odia) y otras tantas cosas que se podían hacer en C/C++ y que Java no permite.

Además pasar de bajo nivel a alto nivel es más sencillo que a la inversa. Alguien que sabe trabajar con memoria puede olvidarse de ella y dejarse llevar pero alguien que no tiene ni idea de cómo funciona la memoria tiene más problemas para empezar a trabajar con ella.

Lo cierto es que de la enorme lista de lenguajes que hay en la encuesta, aunque he oído sobre muchos de ellos, he probado muy poquitos. Me da pereza eso de cambiar de lenguaje cada poco tiempo (y cada mucho también :xD). Coger un lenguaje, aprender la sintaxis básica y cuando empiezas a hacer proyectos complejos, coges y empiezas a probar otro... Se vuelve un poco repetitivo, a mi parecer. Te limitas a hacer siempre unas entradas/salidas de datos estándar y unos algoritmos básicos.

Tengo pensado probar algunos más pero seguramente en los que más me especialice sean C++, Java y algún otro que vaya descubriendo del estilo.

PD: Por si no se ha notado por la ausencia de mención: no me llama la atención la programación Web. Respeto a los que les guste obviamente y seguro que si me meto con ello le acabaría cogiendo el gustillo pero de momento es algo que no me llama.
202  Programación / Programación C/C++ / Re: estructuras y lectura de archivos en C en: 30 Mayo 2020, 11:30 am
El problema principal es la separación que estás haciendo en tokens o partes.
Buscas hasta la primera coma (,) para localizar el nombre del libro pero de seguido guardas el nombre del autor también sin haber buscado hasta la siguiente coma. Por lo tanto, el nombre del libro y el autor siempre son la misma cadena.
A partir de ahí ya se descuadran todos los cálculos (que tampoco entiendo esos fgets() con longitud 4 y 5...) y se guarda todo mal.

Además otro problema es que la cadena que usas para guardar cada línea del fichero temporalmente tiene una longitud de 50 y hay líneas que superan ese número de caracteres por lo que los caracteres que no entran en una línea, se leen en la siguiente.

Otro otro tema importante cuando se trabaja con memoria dinámica es que esa memoria tienes que liberarla manualmente usando free().

Y otro tema es usar return para salir en caso de error. En la función main() se puede hacer porque de un return acaba el programa pero en otras funciones auxiliares, llamar a return lo que hace es devolver el control a la función que llamó a esta. Es más correcto utilizar exit().
Además el valor 0 se suele asociar a que todo ha finalizado correctamente. Para errores es mejor usar -1. En conjunto: exit(-1).

Otros consejos son:
  • Utilizar una constante para la longitud de la cadena que te permita modificarlo rápidamente sin tener que ir mirando por todo el código.
  • No utilizar variables globales, como en tu caso el puntero l.
  • Para separar una cadena en base a un patrón o varios tienes la función strtok().
  • Para "vaciar" una cadena no es necesario poner '\0' a todas sus posiciones. Basta con hacerlo en la posición 0.

Te dejo otra forma de hacerlo con las modificaciones antes mencionadas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define SIZE 100
  6.  
  7. typedef struct {
  8. char *nombre;
  9. char *autor;
  10. int cantidad;
  11. int precio;
  12. } Libro;
  13.  
  14.  
  15. void liberarMemoria(Libro *libros, int numeroLibros){
  16. for(int i = 0; i < numeroLibros; ++i){
  17. free(libros[i].nombre);
  18. free(libros[i].autor);
  19. }
  20. free(libros);
  21. }
  22.  
  23. void guardarLibro(Libro *libros, char *temporal, int numeroLibros){
  24. char *token = strtok(temporal, ",");
  25. libros[numeroLibros-1].nombre = (char*)malloc((strlen(token)+1) * sizeof(char));
  26. strcpy(libros[numeroLibros-1].nombre, token);
  27.  
  28. token = strtok(NULL, ",");
  29. libros[numeroLibros-1].autor = (char*)malloc((strlen(token)+1) * sizeof(char));
  30. strcpy(libros[numeroLibros-1].autor, token);
  31.  
  32. token = strtok(NULL, ",");
  33. libros[numeroLibros-1].cantidad = atoi(token);
  34.  
  35. token = strtok(NULL, ",");
  36. libros[numeroLibros-1].precio = atoi(token);
  37. }
  38.  
  39. void mostrarLibros(Libro *libros, int numeroLibros){
  40. for(int i = 0; i < numeroLibros; ++i){
  41. printf("***** INFORMACION LIBRO %d *****\n", i+1);
  42. printf("Nombre: %s\n", libros[i].nombre);
  43. printf("Autor: %s\n", libros[i].autor);
  44. printf("Cantidad: %d\n", libros[i].cantidad);
  45. printf("Precio: %d\n", libros[i].precio);
  46. printf("\n");
  47. }
  48. }
  49.  
  50. int main(){
  51. Libro *libros = NULL;
  52. char temporal[SIZE];
  53. FILE *fichero = fopen("libros.txt", "r");
  54.  
  55. int numeroLibros = 0;
  56. while(fgets(temporal, SIZE, fichero)) {
  57. ++numeroLibros;
  58. libros = (Libro*)realloc(libros, numeroLibros * sizeof(Libro));
  59. guardarLibro(libros, temporal, numeroLibros);
  60. }
  61.  
  62. mostrarLibros(libros, numeroLibros);
  63.  
  64. liberarMemoria(libros, numeroLibros);
  65. return 0;
  66. }

PD: Cuando vayas a insertar código utiliza etiquetas de Código GeSHi y selecciona el lenguaje que corresponda a tu código. En tu mensaje anterior ya te las he incluido yo pero para otra ocasión.

PD 2: Aunque no es relevante, el menú que tienes no funciona. Si vas a pedir una opción tendrás que devolverla con un return.
203  Programación / Programación C/C++ / Re: no se como hacer que funcione archivo de encabezado en C++ en: 29 Mayo 2020, 18:55 pm
Nunca he trabajado con Visual Studio pero prueba las siguientes cosas:
  • Escribe la cabecera con comillas dobles:
Código
  1. #include "LibroCalificaciones.h"

  • Comprueba que el nombre del fichero de cabecera concuerda con lo que estás escribiendo, incluso la extensión.
  • Comprueba la ruta del fichero. Tiene que estar en el mismo directorio que el cpp al que lo estás importando. Si está en otro directorio tienes que especificarlo o asegurarte que el compilador está buscando en ese directorio.

No sé si te haya pasado más veces o tengas otros proyectos en los que se importe correctamente. Si es así comprueba qué cosas estás haciendo de manera diferente y puede que ahí esté el fallo.

Cualquier resultado, comenta cómo te ha ido.
Suerte. :-X
204  Programación / Bases de Datos / Re: Trigger SQL en: 29 Mayo 2020, 16:56 pm
Ya lo tengo, al final me ha quedado así, no entiendo muy bien el por qué del  DELIMITER $$ etc pero nos lo exigen así.
En MySQL es obligatorio que cada sentencia termine con punto y coma a diferencia de SQL Server por ejemplo. Si un trigger tiene varias instrucciones, cada una tiene que terminar en punto y coma. Entonces para delimitar el trigger completo tienes que usar un delimitador diferente de ahí el DELIMITER $$.

En estos casos como el trigger solo tiene una instrucción, puedes obviar el BEGIN...END y así no necesitas usar DELIMITER. Pero para otros casos en los que tus triggers tengan más de una instrucción, estarás obligado a utilizarlo.

PD: Utiliza las etiquetas de Código GeSHi para mostrar código. En tu caso selecciona la correspondiente a SQL.
205  Programación / Bases de Datos / Re: Trigger SQL en: 29 Mayo 2020, 16:09 pm
Hola, gracias por responder, voy a probar y te comento.
El segundo según lo que me comentas sería sustituir new por old, y también habría que sustituir Insert on por delete on?
Y en el tercero al igual que en el segundo habría que sustituir algún valor más?
Claro, exactamente. En el segundo caso sería AFTER DELETE ON.

Y en el tercer caso sustituir el INSERT/DELETE por UPDATE. Es más, te diría que igual se puede (y debería ser) AFTER UPDATE. Porque en el caso de que no se confirme la actualización, no quieres que se guarde ese "intento de cambio".
No puedo confirmártelo, lo siento, pero haz ambas pruebas y una de las dos tiene que funcionar seguro.

Suerte. :-X
206  Programación / Bases de Datos / Re: Trigger SQL en: 29 Mayo 2020, 15:47 pm
MariaDB que creo que es MySQL

En ese caso no puedes usar las tablas temporales INSERTED y DELETED pues estas son propias de SQL Server.
El símil que existe en MySQL son las partículas NEW y OLD antes del nombre de una columna.

El primer trigger quedaría:
Código
  1. CREATE TRIGGER tr_persona_insert AFTER INSERT ON tb_persona FOR EACH ROW
  2.  INSERT INTO tb_logs VALUES ('insert', NEW.dni, NULL);
La claúsula FOR EACH ROW sirve para los casos en los que insertas varios registros con una única sentencia INSERT. Así el trigger se ejecutará una vez por cada registro. El opuesto sería FOR EACH STATEMENT.

El siguiente trigger no tiene ninguna complicación. Tendrás que usar OLD en vez de NEW.

Para el tercer trigger, el de UPDATE, tendrás que usar BEFORE en vez de AFTER para poder acceder tanto al valor nuevo (NEW) como al viejo (OLD).

Inténtalo y comenta si tienes algún problema.
Suerte. :-X
207  Programación / Programación C/C++ / Re: Punteros en: 29 Mayo 2020, 08:30 am
.-Realice un programa que tenga una función que mediante apuntadores pueda transformar un
número entero en una cadena de caracteres formada por los dígitos del número entero.
Los punteros dan mucha libertad. Es muy difícil saber qué es lo que te están pidiendo exactamente pero yo creo que podría ser algo así:
Código
  1. void numberToString(int *number, char *string);
  2. char* numberToString(int *number);
En ambos casos es una función que recibe un entero por medio de un puntero, lo que sería el paso por referencia en C, y modifica (primer caso) o crea y devuelve (segundo caso) un puntero a una cadena en la que cada carácter es un dígito del número.

.-Empleando apuntadores escribir un programa que lea una línea de texto y escriba en pantalla
las palabras de que consta la línea sin utilizar las funciones de string.h y particularmente sin usar
strtok ().
En este caso quiero entender que tienes que separar cada una de las palabras leídas. Podrías guardar la línea de texto en una cadena unidimensional char[] e ir separando y mostrando alternativamente o, crear un array de cadenas char[][] y en cada fila guardar una de esas palabras.

Todo esto tiene bastante sentido si estás trabajando con memoria dinámica. Si no es así, también podrías hacerlo con memoria estática pero los punteros adquieren menos relevancia en este caso.

De todas formas, tienes que darnos más información sobre el problema. A ser posible con una breve explicación de lo que tú crees que tienes que hacer y cómo estás intentando hacerlo. Ya partimos luego de ahí para poder ayudarte mejor.

Suerte.  :-X
208  Programación / Programación C/C++ / Re: Ayuda con problema escolar, secuencia aritmetica en: 28 Mayo 2020, 23:39 pm
hola YreX-DwX, te agradezco mucho el tiempo que has dedicado a la respuesta, la verdad es que mi profesor no nos ha dado muchas clases y no tengo las bases necesarias para resolver el problema, intente hacer el pseudo codigo para el problema, lo hice de la siguiente forma:

PEDIR numero
SI NUMERO es igual o menor que 9 ENTONCES
 MOSTRAR "El numero "x9+1 = " Numero +1 veces 1"
SINO
 MOSTRAR "Introduzca un numero entre 1 y 9"
FIN SI
Lo primero: ese pseudocódigo no es muy correcto. Estás pidiendo un número <= 9 para mostrar el número en sí. Lo que tienes que hacer es calcular el número en base al que tú pides.
Además es importante el uso correcto de las comillas para mostrar mensajes. Las comillas significan que debe aparecer tal cual. Si pones "numero", se escribirá "numero"; si escribes: numero, se escribirá el valor del numero.

Hasta aquí creo entender el problema, sin embargo se me complica al querer escribir código para "numero+1" veces 1, no se en realidad como crear el bucle para ir colocando los 1 las veces que define numero.

Para crear bucles tienes que usar un sentencia while() o for():

SENTENCIA WHILE
Un bucle while(condicion) es un bucle que se repite mientras la condición que pongas dentro sea cierta. Es importante, dentro del bucle modificar algo que afecte a la condición pues sino el bucle siempre será cierto/falso y entonces nunca saldrás/entrarás.
Por ejemplo, para crear el primer número sabiendo el número de dígitos:
Código:
PEDIR numeroCifras
i := 1
numero := 0
MIENTRAS i <= numeroCifras HACER
  numero := numero + (i * pow(10, numeroCifras-i)) // pow(base, exponente)
  i := i + 1
FIN MIENTRAS
MOSTRAR "El numero de " + numeroCifras + " cifras es: " + numero


SENTENCIA FOR
Un bucle for(inicializacion, condicion, actualizacion) ejecuta lo que pongas en la inicialización cuando empieza, se repite como el while() cada vez que se cumple la condición y tras terminar cada iteración se ejecuta la actualización. El mismo ejemplo de antes con un for() sería:
Código:
PEDIR numeroCifras
numero := 0
PARA i := 1 HASTA numeroCifras INCREMENTO 1 HACER
  numero := numero + (i * pow(10, numeroCifras-i))
  // En este caso no se incrementa la i aqui porque ya lo hemos puesto en el INCREMENTO
FIN PARA

El for() puede parecer un poco más raro, te dejo la forma que tiene en C:
Código
  1. for(int i = 1; i <= numeroCifras; ++i){
  2.  // lo que sea
  3. }
  4. // Intentar usar i aqui da error porque solo existe dentro del for()
También puedes declarar la variable fuera. La diferencia es que si la declaras en el for() solo podrás usarla dentro del for() y si la declaras fuera podrás usarla una vez termine el bloque for().
Código
  1. int i;
  2. for(i = 1; i <= numeroCifras; ++i){
  3.  // lo que sea
  4. }
  5. // Aqui puedes usar la i porque esta declarada fuera del for()

Te dejo que intentes pasar esto a C, no tiene mucha complicación y es más gratificante si lo consigues tú. Lo único un poco raro es la función pow() pero ya existe en C, para poder usarla tienes que incluir la biblioteca <math.h>.

PD: Un bloque while() se puede convertir en un bucle for() y viceversa. La norma general es que si el bucle depende de un contador o índice se use for() y si la condición es de otro tipo, se utilice un while(). Pero ambas soluciones van a ser correctas. En el caso anterior, el uso correcto sería el for() pues depende de un contador i.

No se como hacer un arreglo, lo cheque en algunas paginas pero la verdad me perdí por completo, la forma en que puse el primer código, uso las funciones que me enseño el profesor pero no nos ha enseñado otras, solo conozco if y else ¿Podrías orientarme sobre que funciones estudiar para poder llegar a hacer el ejercicio?

Muchisimas gracias
No sé qué pretende que hagáis en este ejercicio pero me parece indispensable el uso de bucles para poder completarlo.
Creo que es mejor que primero lo intentes sin usar arrays/arreglos y luego le vayas introduciendo cosas. Mejor ir poco a poco comprobando que lo que tienes funciona que meter muchas cosas y luego hacerte un lío para arreglar los fallos.
Los arrays están muy relacionados con el bucle for(), te pongo un ejemplo básico de uso de un array con un for():
Código
  1. #include <stdio.h> // Biblioteca para la funcion printf()
  2.  
  3. #define LONGITUD 10 // Constante que se llama LONGITUD y vale 10. Es recomendable que las uses en vez de inventarte un numero dentro del codigo.
  4. // Si en algun momento quieres cambiar la longitud, solo tendras que cambiar ese 10. Si has ido poniendo 10 por todo el codigo, tendras que cambiarlo muchas veces
  5.  
  6. int main(){
  7.  int digitos[LONGITUD]; // Declaras un array estatico <digitos> con una longitud de lo que valga LONGITUD (10)
  8.  // La primera posicion del array es 0 y la ultima es LONGITUD-1 (9). Se accede a cada posicion con []
  9.  for(int i = 0; i < LONGITUD; ++i){
  10.    digitos[i] = i; // Guardamos en cada posicion el valor del indice: 0, 1, 2, 3, 4, 5,...
  11.  }
  12.  printf("El contenido del array es:\n");
  13.  for(int i = 0; i < LONGITUD; ++i){
  14.    printf("%d  ", digitos[i]);
  15.  }
  16.  getchar();
  17.  return 0;
  18. }
Los arrays son un tema muy amplio, te recomiendo que busques algún recurso (libros, pdfs, vídeos,...) sobre programación en C. Y las dudas que te surjan las preguntes por aquí porque si tengo que explicarte todo, se va a hacer un tema enorme. Así puedes profundizar más y con más ejemplos.

Ya tienes bastantes cosas para probar.
Suerte. :-X
209  Programación / Programación C/C++ / Re: Ayuda con problema escolar, secuencia aritmetica en: 28 Mayo 2020, 08:22 am
Si es la primera vez que tocas la programación y este es el primer ejercicio que os ha mandado hacer, tiene toda la pinta de que tienes un profesor un poco duro  :rolleyes: pero bueno, no hay que desanimarse por eso. Con los profesores duros en con los que más se aprende, a base de sacarse las castañas del fuego.

El primer código que pones es, digamos... una locura  :xD.
No es algo malo pues es la forma de pensar de cualquier persona pero los programas crecen muy rápidamente y no se pueden tratar los casos uno por uno porque entonces los códigos serían interminables. Es por esto que te pide sacar la correspondencia entre una cosa y otra, es decir el patrón con el que puedes hacer un programa mucho más corto.

El patrón en este caso si te das cuenta es:
1. Número (que llamaremos A) con n cifras empezando en el que la cifra en la posición 0 (izquierda) es 1 y para cada posición i, la cifra es i+1.
2. (* 9 +), no tiene mayor misterio puesto que siempre es así.
3. Número (que llamaremos B) que se corresponde con n+1. Si n vale 5 en el último caso (12345), B valdrá n+1 = 6.
4. Cantidad de 1s (que llamaremos X). Este valor es igual a B. En el último caso hay 6 1s.

Eso es obtener la correspondencia del ejercicio para poder programarlo. Y este patrón te permite conocer X sin tener que hacer la operación matemática, ya que X siempre tendrá una cantidad de 1s igual al número de dígitos del número de la izquierda + 1.


PARÉNTESIS SOBRE EL PSEUDOCÓDIGO Y UN EJEMPLO MUY SENCILLO

El pseudocódigo es un "lenguaje" para escribir algoritmos de forma más o menos flexible y sencilla para que un programador lo pueda entender. Muchas veces se parecen al código en sí o se puede pasar de uno a otro de forma muy fácil. Por ejemplo:
El pseudocódigo de un algoritmo que solicite un número y muestre si es positivo o negativo:
Código:
PEDIR numero
SI numero >= 0 ENTONCES
  MOSTRAR "El numero " + numero + " es positivo"
SINO
  MOSTRAR "El numero " + numero + " es negativo"
FIN SI

El código en C, que parece que es el lenguaje de programación que utilizas, sería:
Código
  1. #include <stdio.h> // Cabecera / Biblioteca que contiene las funciones printf() y scanf() para poder usarlas
  2.  
  3. int main(){
  4.  int numero;
  5.  printf("Introduce un numero: ");
  6.  scanf("%d", &numero);
  7.  if(numero >= 0){
  8.    printf("El numero %d es positivo", numero);
  9.  }
  10.  else {
  11.    printf("El numero %d es negativo", numero);
  12.  }
  13.  // En caso de que ejecutes directamente el .exe en Windows hay que poner una pausa para que no se cierre hasta que pulses una tecla
  14.  getchar(); // Si lo ejecutas en Linux o desde el IDE, no hace falta
  15.  // La funcion principal main() devuelve un entero al final, normalmente 0 si todo va bien:
  16.  return 0; // Si no lo pones, el compilador lo pondra solo pero solo en esta funcion
  17. }

El pseudocódigo es más importante de lo que suele parecer de primeras. Con él puedes diseñar un algoritmo que hace cosas sin tener que poner cómo las hace. Esto te permite simplificar problemas grandes y compartir algoritmos para luego traducirlos a su correspondiente lenguaje.


Para no hacer el mensaje excesivamente largo, que ya lo es un poco, te recomiendo que intentes lo siguiente:
Un programa que le indiques un número de dígitos (n) y te muestre la fila correspondiente. Por ejemplo, para n = 5:
Código:
12345 * 9 + 6 = 111111
El número n puede ser cualquiera así que tendrás que usar algún tipo de bucle (while() o for()).

Cuando tengas lo anterior perfecto, agrega el arreglo. En vez de mostrar el resultado directamente por la pantalla, tienes que ir guardando cada carácter en el arreglo para que quede de tal forma:
Código:
arreglo = ['1' | '2' | '3' | '4' | '5' | ' ' | '*' | ' ' | '9' | '6' | ' ' | '=' | ' ' | '1' | '1' | '1' | '1' | '1' | '1'|
Cuando lo tengas ahí guardado, tendrás que recorrer el array para ir mostrando cada posición y que te aparezca el mismo resultado por pantalla.

Ahora es cuando te toca esforzarte a ti e intentar hacer eso  :rolleyes: :rolleyes:
Los problemas que tengas los puedes comentar aquí para orientarte.
Suerte.

PD: Tú estás programando en C (o eso te piden) y el código ese que has conseguido buscando en Internet es C++ con un poco de C. Ten cuidado con eso.
PD 2: Procura que cada función tenga solo un <return>.
210  Programación / Programación C/C++ / Re: Ayuda en: 28 Mayo 2020, 03:38 am
Si lo que quieres es buscar en tu array de Agenda, el que tenga el número telefónico igual al que introduces:
Código:
Pedir telefono
i := 0
encontrado := -1
MIENTRAS i < longitud(contactos) and encontrado = -1 HACER
  SI contactos[i].telefono = telefono ENTONCES
    encontrado = i
  FIN SI
FIN MIENTRAS
Con este pseudocódigo puedes localizar el índice del contacto que tiene el número de teléfono que buscas. Luego solo es modificar sus campos accediendo a él.
El problema que tienes es que estás mezclando los índices de los contactos con sus números de teléfono.



PD: Unas cuantas mejoras para el programa:
  • Ya que usas una constante para el tamaño de los contactos, por qué no usas también constantes para los arrays de agenda??
  • Algunos nombres de variables no ayudan. opc, opc2, opc12432454... no dice nada. Llámalas opcion_menu, telefono_buscado, indice_buscado... y verás como no tienes el problema que has tenido de confundir un índice con un teléfono.
  • La programación utiliza el principio de una única vez, es decir, no repetir fragmentos de código innecesarios. Tienes un bloque de al menos 30 líneas y otro de unas 10 líneas por lo pronto repetidos... Deberías hacer uso de funciones, no solo para esa parte sino para otras también. Saber modularizar un programa también es programar.
  • Para leer cadenas de caracteres es recomendable usar la función fgets(), no scanf().
  • La biblioteca <conio.h> no pertenece al estándar y no se recomienda su uso. La única función que le das es llamar a getch() y puedes utilizar la función getchar() perteneciente a <stdio.h> en su defecto. Así te ahorras la biblioteca <conio.h>.
  • El único uso recomendado de break es para finalizar cada case de un switch. En tu programa veo algún break con otro fin.
  • Es más seguro utilizar strncpy() para copiar cadenas que strcpy().
Y el que más me ha dolido de todos: dicen que por cada fflush(stdin) que se utiliza, muere un gatito. No hagas eso a los pobres animalitos inocentes.

Con aplicar uno o dos de los consejos de esta lista, ese código pasaría de tener 311 líneas a unas 100 o menos y sería más fácil de leer para ti y para los demás. Aunque lo suyo sería que las aplicases todas o prácticamente todas.

Suerte. :-X
Páginas: 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ... 88
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines