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

#901
Cita de: MeCraniDOS en  1 Abril 2013, 13:40 PM(Solución Tonta) Abres math.h con el bloc de notas, te copias la función del logaritmo y la pones en tu programa, listo, ya no tienes que llamarla
El encabezado <math.h> solo contiene el prototipo de la función.

Un saludo
#902
Cita de: NathanD en 29 Marzo 2013, 17:43 PMBuenas, mi problema esta vez es el siguiente.

En realidad me gustaría que me explicarais el porqué de este resultado de este código.
El primer cambio a realizar es: antes de utilizar la función malloc debes tener acceso a su prototipo, eso lo consigues incluyendo el encabezado <stdlib.h>.

Cita de: x64Core en 29 Marzo 2013, 18:38 PMYo no estoy seguro lo que dice naderST
naderST esta en lo correcto: el orden en que se evalúan los operandos de una expresión y cuando exactamente aplican los efectos laterales no lo define el lenguaje.

Si modificamos el programa ligeramente (inclusión de <stdlib.h> y unos cuantos avances de linea) algunas salidas mas son:

Con Lcc-win32:
Introduce una frase: hola, mundo
0x00144610 = h
0x00144611 = o
0x00144612
0x00144611


Con gcc 4.5.3 (CygMing):
Introduce una frase: hola, mundo
0x20010228 = h
0x20010229 = o
0x2001022a
0x20010229


Con Visual C++ 2008 Express:
Introduce una frase: hola, mundo
00373E30 = h
00373E31 = o
00373E31
00373E31


Un saludo
#903
Para comparar la cadena ingresada con las literales "sabado" y "martes" tienes que seguir el consejo que te dieron en tu otro tema: utilizar la función strcmp.

Un saludo
#904
El operador "&" se utiliza cuando se desea obtener la dirección en memoria de una variable, por ejemplo:
int num;

/* ... */

scanf("%d", &num);


En el caso de los arrays no es necesario porque (salvo contadas excepciones) al utilizar el nombre de uno automáticamente se obtiene la dirección en memoria de su primer elemento:
char palabra[100];

/* ... */

scanf("%99s", palabra);


Otro ejemplo, el prototipo de la función puts es:
int puts(const char *cadena);
La función espera la dirección en memoria del primer carácter de la cadena a imprimir, para indicarlo podemos utilizar:
char cadena[] = "Linea a imprimir";

/* ... */

puts(&cadena[0]); /* Direccion en memoria de cadena[0] */

/* O bien */

puts(cadena); /* La direccion en memoria se genera automaticamente */


Un saludo
#905
Programación C/C++ / Re: [C] Funcion Split
29 Marzo 2013, 06:11 AM
Cita de: mr.blood en 28 Marzo 2013, 14:46 PMEspero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor.
Algunos comentarios:

* Para tener acceso al prototipo de malloc es mejor, en lugar de <malloc.h>, incluir <stdlib.h> ya que este ultimo es parte de la biblioteca estándar de C.

* Cuando reservas memoria para cada parte de la cadena debes utilizar "j + 1", el elemento adicional es para almacenar ahí el '\0'.

* En lugar de copiar la cadena y a continuación almacenar manualmente el '\0':
strncpy(retorno[i], &cadena[inicios[i]], j);
retorno[i][j] = '\0';

Puedes realizar los dos pasos con sprintf:
sprintf(retorno[i], "%.*s", j, cadena + inicios[i]);

* En la función "len_palabra" puedes obtener el numero de caracteres utilizando solo una variable local, de esta forma:
int len_palabra(char *cadena, int inicio, char separador)
{
   int i = inicio;
   
   while (cadena[i] != separador && cadena[i] != '\0')
      i++;
   
   return i - inicio;
}


Un saludo
#906
Si te están enseñando C estándar puedes utilizar cualquier compilador y en este caso lo mejor es uno actualizado. O si la idea es aprender programación enfocada en MS Windows puedes utilizar la versión gratuita del fabricante (Microsoft Visual C++ Express).

¿Con "Borland C" a que compilador y versión te refieres?

Un saludo
#907
Solo para redondear lo comentado por avesudra y amchacon.

Cuando se declara un array este debe tener el tamaño suficiente para almacenar la cadena incluyendo el '\0' al final de esta. Ya que "blanca" es una cadena de siete caracteres hay que cambiar la declaración a:
char bola[7];

Y en la llamada a scanf debes utilizar el especificador "%Ns" donde N indica el numero máximo de caracteres que serán almacenados en el array sin incluir el '\0':
scanf("%6s", bola);

Por ultimo no es necesario calcular primero el descuento y a continuación restarlo:
descuento = compra * .20;
total = compra - descuento;

Ya que puedes hacerlo directamente:
total = compra * .8;

Un saludo
#908
Programación C/C++ / Re: CRT personalizada
27 Marzo 2013, 19:30 PM
Cita de: 85 en 26 Marzo 2013, 16:21 PMSe pueden encontrar versiones de las funciones originales que cumplen con los standards de C, hay implementaciones de algunas funciones que a mi por ejemplo me interesaban crear implementaciones personalizadas de ellas, atoi, strtok, y muchas otras
La especificación de strtok según la referencia sobre C90 de P. J. Plauger (un poco mas estricta que la estándar) es:
Citarstrtok

char *strtok(char *s1, const char *s2);

If s1 is not a null pointer, the function begins a search of the string s1. Otherwise, it begins a search of the string whose address was last stored in an internal static-duration object on an earlier call to the function, as described below. The search proceeds as follows:

1. The function searches the string for begin, the address of the first element that equals none of the elements of the string s2 (a set of token separators). It considers the terminating null character as part of the search string only.

2. If the search does not find an element, the function stores the address of the terminating null character in the internal static-duration object (so that a subsequent search beginning with that address will fail) and returns a null pointer. Otherwise, the function searches from begin for end, the address of the first element that equals any one of the elements of the string s2. It again considers the terminating null character as part of the search string only.

3. If the search does not find an element, the function stores the address of the terminating null character in the internal static-duration object. Otherwise, it stores a null character in the element whose address is end. Then it stores the address of the next element after end in the internal static-duration object (so that a subsequent search beginning with that address will continue with the remaining elements of the string) and returns begin.

Esta se puede implementar utilizando las funciones strspn y strcspn (prototipos en <string.h>). Un programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *fn_strtok(char *str, char const *set);

int main(void)
{
   char str[] = "?a???b,,,#c";

   printf("\"%s\"\n", strtok(str, "?"));
   printf("\"%s\"\n", strtok(NULL, ","));
   printf("\"%s\"\n", strtok(NULL, "#,"));
   printf("%p\n", (void *) strtok(NULL, "?"));
   
   strcpy(str, "?a???b,,,#c");
   
   printf("\"%s\"\n", fn_strtok(str, "?"));
   printf("\"%s\"\n", fn_strtok(NULL, ","));
   printf("\"%s\"\n", fn_strtok(NULL, "#,"));
   printf("%p\n", (void *) fn_strtok(NULL, "?"));
   
   return EXIT_SUCCESS;
}

char *fn_strtok(char *str, char const *set)
{
   static char *p;
   
   if (str == NULL)
      str = p;
   
   p = str += strspn(str, set);
   if (*str == '\0')
      str = NULL;
   else {
      p += strcspn(p, set);
     
      if (*p != '\0')
         *p++ = '\0';
   }
   
   return str;
}


Y su salida es:
"a"
"??b"
"c"
(null)
"a"
"??b"
"c"
(null)


Un saludo
#909
Programación C/C++ / Re: Duda con fgets
27 Marzo 2013, 06:55 AM
Cita de: dalberto9410 en 27 Marzo 2013, 06:45 AMcreo que allí lo que estas haciendo es crear una variable p que es un puntero y coje la direccion donde encuentre un salto de linea y lo remplace por '\0' no?
Correcto. Utilizamos strchr para buscar el '\n' en la cadena y almacenamos su resultado en la variable "p". Si es NULL significa que no se encontró, si es distinto entonces esa es la dirección en la cadena donde se almacena el carácter. En este punto basta con utilizar "*p = '\0'" para sobrescribir el '\n' con un '\0'.

Cita de: dalberto9410 en 27 Marzo 2013, 06:45 AMAh y otra cosa como es el funcionamiento de puts?
Es una función simple, imprime la cadena pasada como argumento y a continuación imprime un avance de linea. Por ejemplo en lugar de:
printf("hola, mundo\n");
Podemos utilizar con el mismo efecto (nos ahorramos el '\n'):
puts("hola, mundo");

Un saludo
#910
Programación C/C++ / Re: Duda con fgets
27 Marzo 2013, 06:38 AM
Lo que indicas es normal ya que fgets lee y almacena una linea de texto incluyendo el avance de linea. Si no quieres el '\n' debes eliminarlo manualmente mediante un bucle o utilizando la función strchr (prototipo en <string.h>), como hacerlo con esta ultima:
#include <string.h>

/* ... */

c_t crear_contacto()
{
   c_t nuevo;
   char *p;
   
   puts("Ingrese nombre:");
   fgets(nuevo.nombre, 80, stdin);
   if ((p = strchr(nuevo.nombre, '\n')) != NULL)
      *p = '\0';
   
   puts("Ingrese telefono:");
   scanf("%d", &nuevo.tel);
   
   nuevo.fecha_nacimiento = crear_fecha();
   
   return  nuevo;
}


Un saludo