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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ... 160
361  Programación / Programación C/C++ / Re: Ordenamiento de numeros problema con la salida en: 23 Abril 2014, 02:50 am
segun yo nunca llega a -1.
En la primera iteración del bucle interno el valor del contador "i" es cero y en el condicional ocurre el problema que menciona Blaster:
Código
  1. for (int i = 0; i <= 5-v; i++){
  2.   // Primera iteracion, i == 0
  3.   if (a[i] < a[i-1]) // i, i - 1 ==> 0, 0 - 1

Otro error se encuentra en la primera iteración del bucle externo: con la variable "v" igual a cero el bucle interno iterara con su contador "i" tomando los valores 0 .. 5 (seis iteraciones).

Un saludo
362  Programación / Programación C/C++ / Re: Duda con matrices y paso por parametro en: 23 Abril 2014, 02:40 am
Si os sirve de algo,
Código
  1. int funcion ( int matriz[][], int fila, int columna){...}

es lo mismo que
Código
  1. int funcion ( int **matriz, int fila, int columna){...}
No. Como ya te indico amchacon la primera declaración:
Código
  1. int funcion ( int matriz[][], int fila, int columna){...}
Se procesa como si fuera:
Código
  1. int funcion ( int (*matriz)[], int fila, int columna){...}
Y el compilador debe quejarse ya que el tipo apuntado esta incompleto: "int []".

Para que pueda compilarse se debe completar el tipo, por ejemplo:
Código
  1. int funcion ( int matriz[][10], int fila, int columna){...}
La cual se procesa como si fuera:
Código
  1. int funcion ( int (*matriz)[10], int fila, int columna){...}

Un saludo
363  Programación / Programación C/C++ / Re: Duda con matrices y paso por parametro en: 22 Abril 2014, 16:46 pm
para pasar matrices hay que indicar la longitud de la columna pero no se porque
Porque es parte del tipo.

Lo que tu llamas matriz es un array donde cada uno de sus elementos es también un array. Por ejemplo con la sentencia:
Código
  1. int mat[N][M];
Se declara el array "mat" de N elementos cada uno de tipo "int [M]".

Mi pregunta es como sabe c++ o el compilador el tamaño de las filas ?
No lo sabe. Si declaras una función en cualquiera de las dos formas:
Código
  1. /* A */ int fn(int a[N]);
  2. /* B */ int fn(int a[ ]);
La declaración en realidad es:
Código
  1. /* C */ int fn(int *a);
Ello porque los arrays no se pasan por valor, en su lugar el argumento es la dirección en memoria del primer elemento.

Un saludo
364  Programación / Programación C/C++ / Re: como hago para saber que posición del vector esta libre? en: 20 Abril 2014, 19:45 pm
buscando por ahí me han dicho ...si guardas en una variable el lugar siguiente a la última persona que añadiste la vez anterior
Junto con el array declaras una variable para el numero de personas introducidas, esta tambien indica la siguiente posicion libre:
Código
  1. int main()
  2. {
  3.   T_datos_personales personas[5];
  4.   int num_personas = 0;
  5.   int opciones = 0;
  6.  
  7.   // ...
  8.  
  9.   case 2:
  10.      // Se agrega una persona solo si num_personas es menor que cinco ...
  11.  
  12.      // Se actualiza el contador de personas
  13.      num_personas++;
  14.  
  15.   // ...

Un saludo
365  Programación / Programación C/C++ / Re: Manejar ficheros en: 18 Abril 2014, 19:38 pm
estoy haciendo un programa en C que trabaja con ficheros de entrada y salida pero no se acceder a lo que necesito. Dentro del fichero de entrada hay varias líneas con 3 campos: nombre, tipo y dirección.
Por ejemplo:
Código:
www.google.es A 130.206.193.53
www.youtube.com A 211.132.198.42
Bien, yo para manejarlo mejor, cojo la primera linea y la paso a una cadena de caracteres con fgets. Una vez tengo la cadena compruebo que el tipo es correcto (sólo puede haber dos tipos, o A o B) con strchr.
Un problema si utilizas esa función es donde se localiza el carácter, por ejemplo si la linea inicia con "www.Amazon.com Z ..." podrías deducir que es valida cuando no es así.

Una forma de procesar el contenido del archivo es leyendo este linea por linea mediante fgets y a continuación validar, esto ultimo lo puedes realizar "in situ" (mediante strtok) o bien extrayendo primero los componentes (mediante sscanf) para solo entonces validarlos.

Cual aproximación tomar depende del programa y el manejo que tengas de C. La primera tiene la ventaja de no necesitar almacenamiento adicional mientras que la segunda permite realizar parte de la validación de forma automática.

Creo que si alguien me explica como meter cada campo en una cadena de caracteres sabría seguir, vamos, que si tengo "www.google.es A 130.206.193.53" como meto www.google.es en una cadena, A en otra y 130.206.193.53 en otra.
Utilizando sscanf, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char linea[] = "www.google.es A 130.206.193.53";
  7.   char nombre[sizeof linea]; /* Solo por indicar un valor */
  8.   char cat;
  9.   char ip[sizeof linea]; /* Solo por indicar un valor */
  10.  
  11.   if (sscanf(linea, "%s %c %s", nombre, &cat, ip) == 3)
  12.      printf("Nombre: %s\nCategoria: %c\nIP: %s\n", nombre, cat, ip);
  13.  
  14.   return EXIT_SUCCESS;
  15. }

El problema viene con la dirección, pues tengo que comprobar que no se salga del rango 0-255, que no aparezca un 5º número (130.210.222.32.1), etc... Resumiendo, que tenga el formato de una dirección IP. No se muy bien como mirar eso, lo que se me va ocurriendo acaba en un código enorme y dudo que sea así.
La validación ya sea automática o manual es relativamente corta. Se debe verificar que los caracteres solo sean dígitos formando cuatro enteros separados por puntos con el ultimo terminado con '\n' (ya que fgets lee la linea incluyendo ese carácter).

Un ejemplo de validacion manual de IPs:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. int check_ip(char const *ip, unsigned char byte[]);
  6.  
  7. int main(void)
  8. {
  9.   char *linea[] = {
  10.      "130.206.193.53\n",
  11.      "211.132.198.42\n",
  12.      "130.206.193\n",
  13.      "256.132.198.42\n",
  14.      "130 . 206 . 193 . 53\n",
  15.      "211.198.42.\n",
  16.      "130..193.53\n",
  17.      ".132.198.42\n",
  18.      "130.206.193.192.191\n",
  19.      "255.132.198.42 xxx\n",
  20.      "4294967297.4294967297.4294967297.4294967297\n"
  21.   };
  22.   size_t num_lineas = sizeof linea / sizeof linea[0];
  23.   size_t i;
  24.  
  25.   for (i = 0; i < num_lineas; i++){
  26.      unsigned char byte[4];
  27.  
  28.      if (check_ip(linea[i], byte))
  29.         printf("IP: %u.%u.%u.%u\n", byte[0], byte[1], byte[2], byte[3]);
  30.      else
  31.         printf("Error: %s", linea[i]);
  32.   }
  33.  
  34.   return EXIT_SUCCESS;
  35. }
  36.  
  37. int check_ip(char const *ip, unsigned char byte[])
  38. {
  39.   char sep[] = "...\n";
  40.   int nb = 0;
  41.   unsigned num = 0;
  42.   int in = 0;
  43.  
  44.   while (nb < 4){
  45.      if (isdigit(*ip)){
  46.         num = num * 10 + *ip - '0';
  47.         in = 1;
  48.      }else if (in && num < 256 && *ip == sep[nb]){
  49.         byte[nb] = num;
  50.         nb++;
  51.         num = 0;
  52.         in = 0;
  53.      }else
  54.         break;
  55.  
  56.      ip++;
  57.   }
  58.  
  59.   return nb == 4 && *ip == '\0';
  60. }

Su salida (en mi caso) es:
Código:
IP: 130.206.193.53
IP: 211.132.198.42
Error: 130.206.193
Error: 256.132.198.42
Error: 130 . 206 . 193 . 53
Error: 211.198.42.
Error: 130..193.53
Error: .132.198.42
Error: 130.206.193.192.191
Error: 255.132.198.42 xxx
IP: 1.1.1.1

Como se muestra en la salida un detalle evidente pero que se debe enfatizar es: la función no esta completa y puede producir un resultado incorrecto si el numero sobrepasa la capacidad del tipo "unsigned int" (ejemplo en la ultima linea de la salida). Añadir la validación faltante es cuestión de minutos (y un poco de esfuerzo).

Un saludo
366  Programación / Programación C/C++ / Re: Codeblocks vs Dev C++ en: 18 Abril 2014, 18:50 pm
soy nuevo en el mundo de la progamación y me gustaría teer su opinion sonbre estos programas, cual me recomiendan
No indicas el lenguaje de programación que estas aprendiendo.

En el caso de C/C++ para un principiante cualquier IDE que incluya un compilador relativamente reciente (todos menos los dinosaurios de Borland) es aceptable. Lo importante es aprender bien el lenguaje, una vez eso suceda si el IDE que utilizas te queda corto ya tendrás tiempo (y conocimiento) para cambiar a otro.

Un saludo
367  Programación / Programación C/C++ / Re: Contar nuemero de lineas de un fichero en: 18 Abril 2014, 00:33 am
Estoy escribiendo un código usando ficheros, necesito saber cuantas lineas tiene el archivo para almacenar el espacio correspondiente. ¿¿como puedo contar el numero de lineas usando el fscanf??
Para conocer el numero de lineas en el archivo de texto lo mas fácil y sencillo es leer su contenido carácter por carácter, el numero de lineas esta dado por el numero de caracteres igual a '\n'.

Y si la estructura del archivo de entrada esta garantizado (tres palabras y un entero por linea separados entre si por comas) entonces puedes leer su contenido directamente con fscanf. Mas o menos así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NOM_ENTRADA  "alumno.csv"
  5.  
  6. struct alumno {
  7.   char nombre[30];
  8.   char apellido[30];
  9.   char materia[30];
  10.   int edad;
  11. };
  12.  
  13. int main(void)
  14. {
  15.   FILE *entrada;
  16.   int ch;
  17.   struct alumno a;
  18.   int num_lineas;
  19.  
  20.   if ((entrada = fopen(NOM_ENTRADA, "r")) == NULL){
  21.      perror(NOM_ENTRADA);
  22.      return EXIT_FAILURE;
  23.   }
  24.  
  25.   num_lineas = 0;
  26.   while((ch = fgetc(entrada)) != EOF)
  27.      if (ch == '\n')
  28.         num_lineas++;
  29.  
  30.   rewind(entrada);
  31.   while (fscanf(entrada, " %[^,],%[^,],%[^,],%d", a.nombre, a.apellido, a.materia,
  32.      &a.edad) == 4)
  33.   {
  34.      /* "a" contiene la informacion del nodo leido, se procesa en alguna forma ... */
  35.      printf("%s\n%s\n%s\n%d\n\n", a.nombre, a.apellido, a.materia, a.edad);
  36.   }
  37.   fclose(entrada);
  38.  
  39.   /* ... */
  40.  
  41.   return EXIT_SUCCESS;
  42. }

Pero si cualquier campo contiene espacios (por ejemplo un nombre como "Jose Maria") o la estructura de la linea es ligeramente mas complicada hay que cambiar la aproximación y utilizar fgets para obtener una linea y strtok para extraer cada uno de los campos.

Por ultimo deberías evitar el uso de la biblioteca conio de Borland, convertir al tipo apropiado el valor de retorno de malloc y utilizar la función feof para controlar la lectura del archivo. Mas información relacionada en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
368  Programación / Programación C/C++ / Re: duda con buffer de cin en: 17 Abril 2014, 23:54 pm
Para conocer cual es el siguiente carácter en cin (sin extraerlo) puedes utilizar la función std::istream::peek.

Sin embargo por lo que comentas el problema de raíz es el uso intercalado de getline y (al parecer) el operador ">>". Para solucionarlo debes buscar todas las instancias donde utilizas ">>" seguidas del uso de getline, es en medio de ellas que debes descartar el resto de la linea.

Aquí lo mejor que puedes hacer es publicar la versión mas corta posible de tu programa que compile y presente el problema. A partir de el ya podemos ayudarte.

Un saludo
369  Programación / Programación C/C++ / Re: Mayusculas a minusculas problema c++ en: 17 Abril 2014, 23:45 pm
estoy pensando seriamente que le problema esta en el dev c++;

por que la verdad lo he intentado varias veces y no funciona de ninguna manera simepre al ingresar el caracter 8 se cierra
Para ayudarte a resolver el problema que mencionas primero debes publicar el código fuente completo.

Un saludo
370  Programación / Programación C/C++ / Re: Mayusculas a minusculas problema c++ en: 16 Abril 2014, 15:13 pm
lo que pasa es que intento pasar un char a mayusculas pero el programa me tira un error
Lo mejor en tu caso es utilizar (por sencillo) las funciones tolower y toupper (prototipos en <cctype>).

En cuanto al programa esta incompleto (falta el final de la funcion main), falta el parentesis de cierre en el bucle while, al convertir el caracter a mayusculas/minusculas debes restar el primer operando y sumar el segundo. Por ultimo la condicion de la salida no la aclaras.

Si se trata de salir cuando el caracter sea 'p' o 'P' el bucle se debe cambiar a:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main ()
  5. {
  6.   char c;
  7.  
  8.   do{
  9.      cin >> c;
  10.  
  11.      if (c >= 'a' and c<='z'){
  12.         c = c - 'a' + 'A';
  13.         cout << c;
  14.      }else if (c >= 'A' and c<='Z'){
  15.         c = c - 'A' + 'a';
  16.         cout << c;
  17.      }
  18.   }while (c != 'p' && c != 'P');
  19.   cout << endl;
  20.  
  21.   return 0;
  22. }

Un saludo
Páginas: 1 ... 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines