Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#361
Cita de: nolasco281 en 23 Abril 2014, 02:36 AMsegun 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 (cpp) [Seleccionar]
for (int i = 0; i <= 5-v; i++){
   // Primera iteracion, i == 0
   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
Cita de: ivancea96 en 22 Abril 2014, 22:04 PMSi os sirve de algo,
Código (cpp) [Seleccionar]
int funcion ( int matriz[][], int fila, int columna){...}

es lo mismo que
Código (cpp) [Seleccionar]
int funcion ( int **matriz, int fila, int columna){...}
No. Como ya te indico amchacon la primera declaración:
Código (cpp) [Seleccionar]
int funcion ( int matriz[][], int fila, int columna){...}
Se procesa como si fuera:
Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
int funcion ( int matriz[][10], int fila, int columna){...}
La cual se procesa como si fuera:
Código (cpp) [Seleccionar]
int funcion ( int (*matriz)[10], int fila, int columna){...}

Un saludo
#363
Cita de: patilanz en 22 Abril 2014, 07:51 AMpara 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 (cpp) [Seleccionar]
int mat[N][M];
Se declara el array "mat" de N elementos cada uno de tipo "int [M]".

Cita de: patilanz en 22 Abril 2014, 07:51 AMMi 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 (cpp) [Seleccionar]
/* A */ int fn(int a[N]);
/* B */ int fn(int a[ ]);

La declaración en realidad es:
Código (cpp) [Seleccionar]
/* 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
Cita de: holamega12 en 20 Abril 2014, 18:42 PMbuscando 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 (cpp) [Seleccionar]
int main()
{
   T_datos_personales personas[5];
   int num_personas = 0;
   int opciones = 0;
   
   // ...
   
   case 2:
      // Se agrega una persona solo si num_personas es menor que cinco ...
   
      // Se actualiza el contador de personas
      num_personas++;
   
   // ...


Un saludo
#365
Programación C/C++ / Re: Manejar ficheros
18 Abril 2014, 19:38 PM
Cita de: sMARIO en 18 Abril 2014, 03:25 AMestoy 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:
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.

Cita de: sMARIO en 18 Abril 2014, 03:25 AMCreo 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char linea[] = "www.google.es A 130.206.193.53";
   char nombre[sizeof linea]; /* Solo por indicar un valor */
   char cat;
   char ip[sizeof linea]; /* Solo por indicar un valor */
   
   if (sscanf(linea, "%s %c %s", nombre, &cat, ip) == 3)
      printf("Nombre: %s\nCategoria: %c\nIP: %s\n", nombre, cat, ip);
   
   return EXIT_SUCCESS;
}


Cita de: sMARIO en 18 Abril 2014, 03:25 AMEl 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:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int check_ip(char const *ip, unsigned char byte[]);

int main(void)
{
   char *linea[] = {
      "130.206.193.53\n",
      "211.132.198.42\n",
      "130.206.193\n",
      "256.132.198.42\n",
      "130 . 206 . 193 . 53\n",
      "211.198.42.\n",
      "130..193.53\n",
      ".132.198.42\n",
      "130.206.193.192.191\n",
      "255.132.198.42 xxx\n",
      "4294967297.4294967297.4294967297.4294967297\n"
   };
   size_t num_lineas = sizeof linea / sizeof linea[0];
   size_t i;
   
   for (i = 0; i < num_lineas; i++){
      unsigned char byte[4];
     
      if (check_ip(linea[i], byte))
         printf("IP: %u.%u.%u.%u\n", byte[0], byte[1], byte[2], byte[3]);
      else
         printf("Error: %s", linea[i]);
   }
   
   return EXIT_SUCCESS;
}

int check_ip(char const *ip, unsigned char byte[])
{
   char sep[] = "...\n";
   int nb = 0;
   unsigned num = 0;
   int in = 0;
   
   while (nb < 4){
      if (isdigit(*ip)){
         num = num * 10 + *ip - '0';
         in = 1;
      }else if (in && num < 256 && *ip == sep[nb]){
         byte[nb] = num;
         nb++;
         num = 0;
         in = 0;
      }else
         break;
     
      ip++;
   }
   
   return nb == 4 && *ip == '\0';
}


Su salida (en mi caso) es:
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
Cita de: Pricipiante C++ en 17 Abril 2014, 19:58 PMsoy 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
Cita de: Cas980 en 17 Abril 2014, 23:26 PMEstoy 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í:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ENTRADA  "alumno.csv"

struct alumno {
   char nombre[30];
   char apellido[30];
   char materia[30];
   int edad;
};

int main(void)
{
   FILE *entrada;
   int ch;
   struct alumno a;
   int num_lineas;
   
   if ((entrada = fopen(NOM_ENTRADA, "r")) == NULL){
      perror(NOM_ENTRADA);
      return EXIT_FAILURE;
   }
   
   num_lineas = 0;
   while((ch = fgetc(entrada)) != EOF)
      if (ch == '\n')
         num_lineas++;
   
   rewind(entrada);
   while (fscanf(entrada, " %[^,],%[^,],%[^,],%d", a.nombre, a.apellido, a.materia,
      &a.edad) == 4)
   {
      /* "a" contiene la informacion del nodo leido, se procesa en alguna forma ... */
      printf("%s\n%s\n%s\n%d\n\n", a.nombre, a.apellido, a.materia, a.edad);
   }
   fclose(entrada);
   
   /* ... */
   
   return EXIT_SUCCESS;
}


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
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
Cita de: nolram en 17 Abril 2014, 07:15 AMestoy 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
Cita de: nolram en 16 Abril 2014, 08:40 AMlo 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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;

int main ()
{
   char c;
   
   do{
      cin >> c;
     
      if (c >= 'a' and c<='z'){
         c = c - 'a' + 'A';
         cout << c;
      }else if (c >= 'A' and c<='Z'){
         c = c - 'A' + 'a';
         cout << c;
      }
   }while (c != 'p' && c != 'P');
   cout << endl;
   
   return 0;
}


Un saludo