elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 21:26  


Tema destacado: Únete al Grupo Steam elhacker.NET

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  un par de dudas sobre codigo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: un par de dudas sobre codigo  (Leído 188 veces)
ALCales

Desconectado Desconectado

Mensajes: 9


Ver Perfil
un par de dudas sobre codigo
« en: 14 Enero 2012, 16:22 »

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!!


En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: un par de dudas sobre codigo
« Respuesta #1 en: 14 Enero 2012, 17:33 »

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
if (memcmp(num, aleatorio, N * sizeof *num) == 0){
  /* Son iguales */
}else {
  /* Algun elemento distinto */
}

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


En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: un par de dudas sobre codigo
« Respuesta #2 en: 14 Enero 2012, 19:22 »

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
int cmp(int* vec1, int* vec2, int N) {
int i;
int b = 1;
i = 0;
while (i < N && b) {
b = vec1[i]==vec2[i];
++i;
}
return b;
}

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
int existsFile(char* filename) {
FILE* f = NULL;
f = fopen(filename,"r");
if (f == NULL && errno == ENOENT)
return 0;
else {
fclose(f);
return 1;
}
}

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!
En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: un par de dudas sobre codigo
« Respuesta #3 en: 14 Enero 2012, 21:44 »

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
int cmp(int *p, int *q, int N)
{
  int i;
 
  for (i = 0; i < N && p[i] == q[i]; i++)
     ;
 
  return i == N;
}

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: un par de dudas sobre codigo
« Respuesta #4 en: 14 Enero 2012, 23:30 »

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
int cmp(int *p, int *q, int N)
{
  int i;
 
  for (i = 0; i < N && p[i] == q[i]; i++)
     ;
 
  return i == N;
}

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
int cmp(int *p, int *q, int N) {
int i = 0;
while (i < N && p[i] == q[i]) ++i;
return i == N;
}

¡Nos vemos, jefe!
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines