Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ALCales en 14 Enero 2012, 16:22 pm



Título: un par de dudas sobre codigo
Publicado por: ALCales en 14 Enero 2012, 16:22 pm
Hola, tengo un par de dudas rapidas haber si alguno me puede ayudar

·Si tengo dos vectores de enteros y quiero ver si son iguales, los he comparado asi:
Código:
if(num[0]==aleatorio[0] && num[1]==aleatorio[1] && num[2]==aleatorio[2] && num[3]==aleatorio[3])
hay alguna manera mas abreviada o otra formas de compararlos?

·Otra duda, si por ejemplo:
Código:
int a;
scanf("%d",&a);
if(125>a>100 ) FILE * fopen... (y que se abra un archivo)(y aqui un printf();)
if(200>a>125) FILE *fopen...(que se abra otro archivo distinto)printf()
if(a>200) FILE *fopen..(otro distinto tb) printf()...
y tengo esto en un bucle, ¿que puedo poner para que si ya puse por ejemplo 110 y me cree el primer archivo si luego lo vuelvo a poner no me lo vuelva a crear, abrir..?(bueno lo que realmente quiero es que no me salga el printf(); del mensaje que tengo en el if, ya que como ya me salio anteriormente no hace falta que me lo repita mas veces

·Haciendo un programa estaba usando una estructura y funciones tb, el caso esque digamos que tenia una estructura:
struct Prueba{...} Uno;
pues cuando hacia la llamada de esta entre las funciones no me la reconocia, me daba errores y ya no sabia que mas cambiar y sin embargo si pongo la estructura como un vector ya si que iva struct{...}Uno[0];
por que?? xD

Bueno saludos y gracias!!


Título: Re: un par de dudas sobre codigo
Publicado por: rir3760 en 14 Enero 2012, 17:33 pm
No has indicado el lenguaje, supongo es C, ¿Correcto?

Si tengo dos vectores de enteros y quiero ver si son iguales, los he comparado asi:
Código:
if(num[0]==aleatorio[0] && num[1]==aleatorio[1] && num[2]==aleatorio[2] && num[3]==aleatorio[3])
hay alguna manera mas abreviada o otra formas de compararlos?
Para comparar dos arrays de enteros puedes utilizar la funcion memcmp (prototipo en string.h), esta recibe tres argumentos: las direcciones base de los arrays y el tercero es el numero de elementos (como caracteres).

En tu caso seria mas o menos así (N es el numero de elementos a comparar):
Código
  1. if (memcmp(num, aleatorio, N * sizeof *num) == 0){
  2.   /* Son iguales */
  3. }else {
  4.   /* Algun elemento distinto */
  5. }

Otra duda, si por ejemplo:
Código:
int a;
scanf("%d",&a);
if(125>a>100 ) FILE * fopen... (y que se abra un archivo)(y aqui un printf();)
if(200>a>125) FILE *fopen...(que se abra otro archivo distinto)printf()
if(a>200) FILE *fopen..(otro distinto tb) printf()...
y tengo esto en un bucle, ¿que puedo poner para que si ya puse por ejemplo 110 y me cree el primer archivo si luego lo vuelvo a poner no me lo vuelva a crear, abrir..?
No es posible utilizando solo C estándar ya que si bien la función "fopen" retorna diferente de NULL cuando el archivo se abre correctamente el caso contrario (retorna NULL) no permite concluir que no existe ya que la función puede fallar por otras razones (por ejemplo falla de dispositivo).

Tal vez haya una solución pero necesitamos que publiques el código fuente del programa.

Un saludo


Título: Re: un par de dudas sobre codigo
Publicado por: Xandrete en 14 Enero 2012, 19:22 pm
Perfectamente, lo primero se puede hacer como te dice rir3760. Si quieres programar una función tú mismo, a modo de ejercicio, puedes hacer algo así:

Código
  1. int cmp(int* vec1, int* vec2, int N) {
  2. int i;
  3. int b = 1;
  4. i = 0;
  5. while (i < N && b) {
  6. b = vec1[i]==vec2[i];
  7. ++i;
  8. }
  9. return b;
  10. }

Y utilizarla donde convenga. Por ejemplo, if (cmp(num,vec,4) Loquesea();

La ventaja de memcmp es que es más genérica y sirve para cualquier tipo de datos.

Lo segundo se podría hacer, aunque no creo que de manera portable. Básicamente el problema se puede reducir a saber si un archivo existe o no. Está la librería errno.h, de la biblioteca estándar. Esta librería define un entero, errno, que toma distintos valores en función de los errores que tengan las llamadas al sistema (en caso de que no haya error, el comportamiento no está definido). El problema es que en Linux y en Windows no se definen los mismos errores en el errno, ni para las mismas situaciones (el estándar requiere sólo 3 códigos de error básicos). Bajo Linux, el código del error genérico "Not such file or directory" es el 2, aunque puedes usar la macro ENOENT también.

Se puede usar una función como ésta si usas Linux.

Código
  1. int existsFile(char* filename) {
  2. FILE* f = NULL;
  3. f = fopen(filename,"r");
  4. if (f == NULL && errno == ENOENT)
  5. return 0;
  6. else {
  7. fclose(f);
  8. return 1;
  9. }
  10. }

Con eso puedes comprobar si un archivo existe o no (aségurate de que filename tenga un carácter '\0' al final!!). Si estás en Windows, habría que mirar qué número de errores utiliza y cómo y cuándo los modifica. Si no hay ningún código apropiado en el errno, se debería usar otra librería de este SO.

Me cuesta entender tu última duda. ¿Podrías poner un código de ejemplo que lo ilustre?

¡Saludos!


Título: Re: un par de dudas sobre codigo
Publicado por: rir3760 en 14 Enero 2012, 21:44 pm
Solo un comentario (en buen plan): la variable "b" solo "pasa la cubeta". En otras palabras no es necesaria ya que se puede utilizar la comparación directamente y al contador como bandera de estado.

Eliminando esa variable nos queda:
Código
  1. int cmp(int *p, int *q, int N)
  2. {
  3.   int i;
  4.  
  5.   for (i = 0; i < N && p[i] == q[i]; i++)
  6.      ;
  7.  
  8.   return i == N;
  9. }

Un saludo


Título: Re: un par de dudas sobre codigo
Publicado por: Xandrete en 14 Enero 2012, 23:30 pm
Solo un comentario (en buen plan): la variable "b" solo "pasa la cubeta". En otras palabras no es necesaria ya que se puede utilizar la comparación directamente y al contador como bandera de estado.

Eliminando esa variable nos queda:
Código
  1. int cmp(int *p, int *q, int N)
  2. {
  3.   int i;
  4.  
  5.   for (i = 0; i < N && p[i] == q[i]; i++)
  6.      ;
  7.  
  8.   return i == N;
  9. }

Un saludo

Perfectamente.

Lo único con lo que soy reticente es con lo de usar bucles for en búsquedas. Es una tontería, sólo es una cuestión de estilo, pero me obsesionan los temas de estilo. Si no es un recorrido uso while.

Código
  1. int cmp(int *p, int *q, int N) {
  2. int i = 0;
  3. while (i < N && p[i] == q[i]) ++i;
  4. return i == N;
  5. }

¡Nos vemos, jefe!