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

#1131
Programación C/C++ / Re: ejercicio en C
1 Noviembre 2012, 18:49 PM
Cita de: xiruko en 31 Octubre 2012, 12:31 PMpodrias recomendarme algun libro o web que no sea de iniciacion en C sino que profundice mas?
Si ya manejas bien el lenguaje C dos libros de calidad son "The Standard C Library" de P. J. Plauger y "Algorithms in C" de Robert Sedgewick, el primero sobre la biblioteca estándar de C y el segundo sobre algoritmos (búsqueda, ordenación, grafos, etc.).

Pero, va de nuevo la advertencia: no son libros para principiantes.

Otro muy bueno para un nivel de principiante/intermedio es "Pointers on C", no es un libro solo sobre punteros sino que se le da el énfasis que requieren. Otras de sus ventajas son enseñar el lenguaje según el estándar y cubrir mas temas que "K&R2".

Todos ellos, hasta donde tengo entendido, en ingles.

Un saludo
#1132
Antes de procesar una cadena hay que almacenarla en algún lugar (una variable), eso lo estas haciendo si utilizas la función "gets". Por cierto no se recomienda el uso de esa función, en su lugar puedes utilizar las funciones "getline" o "get" o el operador ">>". Por favor lee el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

También debes presentar los avances que lleves del programa indicando donde tienes dificultades, mas información en la pagina Reglas del subforo.

Un saludo
#1133
Programación C/C++ / Re: strcpy entre char
1 Noviembre 2012, 02:41 AM
En el primer ejemplo no es necesario utilizar la función "strlen", basta con verificar si el carácter procesado es '\n' o '\0'. Otra forma de buscar el carácter '\n' es mediante la función "strchr" (prototipo en <string.h>):
void func(char *str)
{
   char *p;
   
   if ((p = strchr(str, '\n')) != NULL)
      *p = '\0';
}


Y en el segundo ejemplo si se obtiene la longitud de la cadena con "strlen" no es necesario utilizar "strcat" ya que se puede hacer de forma manual (ya que son solo dos caracteres):
void trim(char *b)
{
   size_t i = strlen(b);
   
   if (b[i - 1] != '\n'){
      b[i] = '\n';
      b[i + 1] = '\0';
   }
}


Un saludo
#1134
Programación C/C++ / Re: ejercicio en C
31 Octubre 2012, 01:42 AM
Otra forma consiste en indicar el numero de caracteres a imprimir mediante "%.*s" en la llamada a "printf":
#include <stdio.h>

int main (void)
{
   char cad[] = "hola";
   size_t nc = sizeof cad - 1;
   size_t i;
   
   puts(cad);
   for (i = 1; i < nc; i++)
      printf("%s%.*s\n", cad + nc - i, nc - i, cad);
   
   return 0;
}


Un saludo
#1135
Programación C/C++ / Re: Duda en "if"
31 Octubre 2012, 01:17 AM
En lugar de "fflush(stdin);" puedes utilizar " %c" en la llamada a "scanf" para leer el operador. De esta forma:
puts("Introduce dos valores\n");
scanf("%d %d", &a, &b);

puts("Introduce un caracter");
scanf(" %c", &oper);


Un saludo
#1136
Programación C/C++ / Re: Vectores dinamicos
30 Octubre 2012, 16:28 PM
El problema lo tienes al realizar la aritmética de punteros, tu la realizas en la forma:
X = *(m1 + (i * fm1 + j) *sizeof(int)) + *(m2 + (i * fm1 + j) * sizeof(int));
En cada una de las expresiones multiplicas al indice por "sizeof(int)", honestamente no entiendo porque.


En C la aritmética de punteros tiene un ajuste automático en base al tipo apuntado. En buen cristiano significa que:
a + i
Es la dirección en memoria del elemento con indice "i" en el array "a" sin importar el tipo, eso es transparente para el programador.

Y para acceder al objeto apuntado se utiliza:
*(p + i) /* Objeto en la posicion "i" del array */

/* O bien */

a[ i ]     /* Objeto en la posicion "i" del array */


En cuanto a la función "sumar" primero tienes que indicar que parámetros recibe (los nombres no son descriptivos) y la operación que debe realizar.

Un saludo
#1137
El problema se encuentra en esta parte:
char *aux = "a";

while (strcmp(aux,"q"))
   fgets(aux,1,stdin);

El programa revienta porque la variable "aux" almacena la dirección en memoria de una cadena literal y estas no deben modificarse.

Un saludo
#1138
Problemas hay varios, el mas importante es el modo de apertura de los archivos: el archivo de entrada se debe abrir en el modo "rt" y el de salida en "wt".

También se debe generar el mensaje de error de forma automática (mediante la función "perror") y utilizar nombres descriptivos para las variables.

La función con las correcciones:
void grabaCategorias(nodocat *p)
{
   FILE *entrada;
   FILE *salida;
   
   if ((salida = fopen("E:\\temp.txt", "w")) == NULL){
      perror("E:\\temp.txt");
      return;
   }
   while (p != NULL){
      fprintf(salida, "%d;%s\n", p->id, p->nomCat);
      p = p->sig;
   }
   fclose(salida);
   
   if ((entrada = fopen("E:\\temp.txt", "r")) == NULL)
      perror("E:\\temp.txt");
   else if ((salida = fopen("E:\\categorias.txt", "w")) == NULL){
      perror("E:\\categorias.txt");
      fclose(entrada);
   }else {
      int ch;
      int prev;
     
      prev = '\n';
      while ((ch = fgetc(entrada)) != EOF)
         if (prev != '\n' || ch != '\n'){
            fputc(ch, salida);
            prev = ch;
         }
     
      fclose(entrada);
      fclose(salida);
   }
}


Un saludo
#1139
Otra opción consiste en el uso de las funciones "fgetc" y "fputc" (prototipos en <stdio.h>), mas o menos así:
int ch;
int prev;

/* ... */

prev = '\n';
while ((ch = fgetc(entrada)) != EOF)
   if (prev != '\n' || ch != '\n'){
      fputc(ch, salida);
      prev = ch;
   }


Un saludo
#1140
Programación C/C++ / Re: Split en C
29 Octubre 2012, 03:18 AM
Otra forma, basada en aritmética de punteros y la función "strstr" (prototipo en <string.h>), es (falta la validación de errores):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **separar(char const *cad, char const *sep, int *num_elem);

int main(void)
{
   char const *linea = "Holasss999 como estas 999freeze??? 999 :p999a999b999999c999d99aaaa999";
   char **elem;
   int num_elem;
   int i;
   
   elem = separar(linea, "999", &num_elem);
   for (i = 0; i < num_elem; i++)
      printf("elem[%2d] == \"%s\"\n", i, elem[i]);
   
   for (i = 0; i < num_elem; i++)
      free(elem[i]);
   free(elem);
   
   return EXIT_SUCCESS;
}

char **separar(char const *cad, char const *sep, int *num_elem)
{
   char **elem;
   char *p;
   int i;
   
   size_t nc_sep = strlen(sep);
   
   elem = malloc((strlen(cad) + nc_sep) / (nc_sep + 1) * sizeof *elem);
   
   for (i = 0; (p = strstr(cad, sep)) != NULL; cad = p + nc_sep){
      if (p != cad){
         elem[i] = malloc(p - cad + 1);
         sprintf(elem[i], "%.*s", p - cad, cad);
         i++;
      }
   }
   if (*cad != '\0'){
      elem[i] = malloc(strlen(cad) + 1);
      strcpy(elem[i], cad);
      i++;
   }
   *num_elem = i;
   
   return realloc(elem, i * sizeof *elem);
}


Un saludo