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

#151
Cita de: cesariox23 en 29 Diciembre 2014, 03:06 AMEl día de hoy empecé a codificar un programa que me permitiría obtener los componentes RGB de una cadena hexadecimal de color, si yo ingresara 6c6c6c me devolvería (108, 108, 108)
Si es para practicar, parte de tu proceso de aprendizaje del lenguaje C no hay problema. Pero hay que indicar que dicha operación se puede realizar de forma mas corta mediante scanf, mas o menos así:
unsigned r;
unsigned g;
unsigned b;

while (scanf("%2x%2x%2x", &r, &g, &b) == 3)
   printf("%x\n%x\n%x\n\n", r, g, b);

En la llamada a scanf el especificador "%2x" indica que se consumirá un máximo de dos caracteres validos para la conversión (dígitos en base 16) y el valor de retorno se verifica para asegurarnos de que se leyeron los tres números correctamente.

----

Cita de: crack81 en 29 Diciembre 2014, 21:18 PMpara corregir el error duplica la funcion   scanf("%c", &respuesta);
En este caso en particular (carácter '\n' de la linea anterior en el bufer de la entrada estándar) no es necesario duplicar la llamada a función, en su lugar basta con utilizar la cadena de formato " %c" donde el espacio al inicio de ella le indica a scanf que primero descarte todos los caracteres de espacio blanco (espacio, avance de linea, etc.) que encuentre, solo entonces se leerá el carácter y almacenara en la dirección indicada.

Un saludo
#152
Cita de: DanielC# en 29 Diciembre 2014, 22:48 PMEs precisamente lo que quería lograr, sólo tengo el trabajo de pasarlo de c++ a c, no tengo conocimientos de c++ pero seguramente no debe ser cosa de otro mundo.
La parte relacionada con el uso de punteros a función la puedes utilizar tal cual, sin cambios:
int (*func[])(int) = {islower,isupper,isdigit};

/* ... */

if ((*func[i])(ch)){


Solo un detalle: la expresión "(*func[ i ])(ch)" es valida pero no es necesario el operador de indirección, se puede utilizar "func[ i ](ch)" sin problemas.

Un saludo
#153
Cuando tengas un problema con uno de tus programas lo primero que debes hacer es compilarlo en el modo mas estricto que permita el compilador ya que esa es la forma mas fácil de detectar errores, como hacerlo se debe describir claramente en su documentación.

Las partes a corregir son:

* En la función main llamas a "max_min_lista" y en esta falta el uso del operador "dirección de" (el '&') con los dos últimos argumentos:
max_min_lista(vector, dim, maximo, minimo);

/* Debe cambiarse a: */
max_min_lista(vector, dim, &maximo, &minimo);


* En la función "max_min_lista" falta el uso del operador "*" al utilizar los parámetros "max" y "min" ya que estos son punteros, la susodicha con los cambios termina así:
void max_min_lista(int *v, int dim, int *max, int *min)
{
   int f, c;

   *min = v[0];
   *max = v[0];

   for(f=0;f<dim;f++){
      if(v[f] > *max){
         *max = v[f];
      } else if(v[f] < *min){
         *min = v[f];
      }
   }

   printf("Maximo: %d   Minimo: %d", *max, *min);
}


Por ultimo hay que cambiar la definición de la función main a "int main(void) ..." o bien "int main() ..." y eliminar en la función "max_min_lista" la variable "c" ya que no se utilizan en el programa.

Un saludo
#154
Cita de: harofenix en 25 Diciembre 2014, 04:21 AMQue tal, apenas estoy aprendiendo el uso basico de apuntadores, hice este programita para calcular el promedio, sin embergo, me da mal el promedio, la pregunta es: que estoy haciendo mal ?
El problema principal en el programa es de diseño.

1) No necesitas de las variables "globales", ademas hay que evitar su uso siempre que sea posible.

2) La función "SolicitudEingresoDeValores" se debe modificar pasando las direcciones de la cinco variables con la intención de modificarlas dentro de la función:
void SolicitudEingresoDeValores(float *a, float *b, float *c, float *d, float *e)
{
printf("ingrese el primer valor: \n");
scanf("%f", a);

printf("ingrese el primer valor: \n");
scanf("%f", b);

printf("ingrese el primer valor: \n");
scanf("%f", c);

printf("ingrese el primer valor: \n");
scanf("%f", d);

printf("ingrese el primer valor: \n");
scanf("%f", e);
}


3) La función "Promedio" no requiere de punteros ya que no altera las variables, solo necesita sus valores para calcular el promedio:
float Promedio(float a, float b, float c, float d, float e)
{
return (a + b + c + d + e) / 5;
}


4) Ambas funciones se utilizan en main de esa forma:
#include <stdio.h>

void SolicitudEingresoDeValores(float *a, float *b, float *c, float *d, float *e);
float Promedio(float a, float b, float c, float d, float e);

int main(void)
{
float a, b, c, d, e;
   
SolicitudEingresoDeValores(&a, &b, &c, &d, &e);
printf("%10.2f \n", Promedio(a, b, c, d, e));
   
return 0;
}

/* ... */


Un saludo
#155
Otro problema en el programa es la declaración de los arrays indicando su numero de elementos mediante los valores pasados a la función, por ejemplo en la función "CreacionEimpresionDeArregloBidimensional" (por cierto un nombre largo no es necesariamente claro, trata de utilizar nombres descriptivos pero razonablemente cortos):
void CreacionEimpresionDeArregloBidimensional(int filas, int columnas)
{
   int array[filas][columnas];
   
/* ... */

A ese tipo de arrays se les conoce como arrays de longitud variable y solo se garantizan en el estándar C99 (en C90 no existen y en C11 son opcionales), la solución aquí es revisar la documentación del compilador o bien utilizar las funciones para la reserva dinámica de memoria (malloc, calloc y realloc).

En cuanto al uso de scanf vs fgets+sscanf en programas como este no hay diferencia (si se requiere una validación completamente a prueba de fallos scanf y familia no bastan, se debe utilizar fgets + strtol/strtoul/strtod).

Un saludo
#156
Cita de: AxelP en 23 Diciembre 2014, 04:46 AMsiempre me dice que la cadena no se encuentra en el archivo. Haciendo pruebas, comparé buscar con buscar y si funcionó, entonces no se que error haya al comparar con la cadena.
El problema se debe a que utilizas fgets para leer las lineas del archivo (lee y almacena el avance de linea) y gets para obtener la linea a buscar (lee y descarta el avance de linea). La solución ya la indico engel lex: sustituir el uso de gets por fgets

Un saludo
#157
Programación C/C++ / Re: Ayuda con grafos en c
18 Diciembre 2014, 03:01 AM
Para encontrar la ruta mas corta entre dos vértices en un grafo no dirigido puedes utilizar el algoritmo de Dijkstra.

Un saludo
#158
Cita de: mokaNordic en 11 Diciembre 2014, 02:01 AM¿Y si defino la variable char linea[N] después de obtener N?
Declarar un array cuyo numero de elementos se indica mediante un valor calculado en tiempo de ejecución (VLA, array de longitud variable) solo es posible si el compilador soporta el estándar C99 (en C90 no existe y en C11 (el ultimo) es opcional), si vas por esa aproximación solo queda revisar la documentación del compilador.

Otra opción ya la indico Eternal Idol, al utilizar las funciones para reserva dinámica de memoria (malloc, callo y realloc) te olvidas de ese problema.

Ya por ultimo no es necesario utilizar fgets y strlen para conocer la longitud de la cadena mas larga y verificar que el primer elemento del array no sea cero es innecesario ya que si fgets no retorna NULL significa que leyó y almaceno por lo menos un carácter en el array (mas el carácter '\0').

Una forma mas simple de obtener la longitud máxima incluyendo el carácter '\n' es mediante fgetc, mas o menos así:
FILE *p_fichero;
int ch;
long max_len;
long len;

/* ... */

max_len = len = 0;
while ((ch = fgetc(p_fichero)) != EOF){
   len++;
   
   if (ch == '\n'){
      if (len > max_len)
         max_len = len;
     
      len = 0;
   }
}


Un saludo
#159
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

El problema que mencionas se debe al uso en la llamada a scanf del especificador "%[^\n]", con el lees todos los caracteres de la linea menos el '\n', este se queda en el bufer de la entrada estándar y causa que todas las siguientes llamadas (a la mentada función) terminen de inmediato. La solución mas fácil es utilizar " %[^\n]", el espacio antes del símbolo de porcentaje es critico ya que con el se descarta primero el espacio blanco.

Otra opción para leer por linea es fgets. Por ultimo en la función main solo imprimes el primer registro, supongo falta ahí un bucle para imprimirlos todos.

Un saludo
#160
Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

El error que comentas sucede porque declaras la funcion "VerDatos" antes que el tipo "struct lista", para solucionarlo debes declarar primero todos los tipos que necesitas en el programa y solo despues las declaraciones y definiciones de las funciones.

Tambien debes incluir el encabezado <string.h> antes de cualquier uso de la funcion strcmp.

Un saludo