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

#71
Cita de: NOB2014 en  6 Agosto 2014, 16:17 PM
Hola Leo.
Gracias "viejo" amigo por responder, corrí tú código y me dio el mismo error que a la mayoría, si la última palabra tiene 4 letras y no tiene un espacio entre la última letra y el '\0' no la sustituye.-
Bueno dejo mi versión.-  

Saludos.
Daniel


¡¡¡ Un placer volver a verte por aquí !!!, amigo Daniel.

Ya ves que las prisas y el no testear a fondo un código tiene a veces esas consecuencias.

En realidad, y creo que como bien has observado, faltaba "la última comprobación", los cuatro últimos caracteres. Paso mi código con esa corrección:

Código (cpp) [Seleccionar]
************************************************
 char frase [  ] = "1234   789 1234 321  9876 5678" ;
  frase [ strlen ( frase ) ] =' ' ;
  for ( i = 0 ; i < strlen( frase ) - 1 ; i++  ) {
    if ( frase [ i ] != ' ' )
      j++ ;
    else if ( frase [ i ] == ' '  ) {
      if ( j == 4 ){
        cont++ ;
        for ( k = i - 1 ; k >= i - 4  ; k-- )
          frase [ k ] = '*' ;
      }
    j = 0 ;
    }
  }
  frase [ i ] = '\0' ;
  printf ( "\n\nLa frase final es: %s" , frase ) ;
  printf ( "\n\nY contiene %d palabras de cuatro letras.\n\n" , cont ) ;
*******************************************************


Y lo dicho, un placer el volver a encontrarte, y espero que sea más a menudo ¡¡¡Campeón!!!!. ;) ;) ;)

EDITADO para hacer uso de strlen y abreviar.

¡¡¡¡ Saluditos! ..... !!!!


#72

* Lo que comentaba en mi mensaje.
Cita de: Eternal Idol en  6 Agosto 2014, 00:57 AM
Ciertamente; mientras comprendas que era un problema del ámbito de la variable que intentabas retornar ...

* Lo que indiqué en mi mensaje, ponerlo en main, ¿hace falta decir que "sólo" cuando ya lo han comentado en dos intervenciones anteriores?.

* Y de paso recordarle que tiene que pasar la función con el argumento de "nombre". ¿O no?.

Cita de: Eternal Idol en  6 Agosto 2014, 00:41 AM

todo ese codigo no explica el problema en lo mas mínimo.


Cita de: Kaxperday en  6 Agosto 2014, 00:47 AM

1000 gracias tema solucionado, puse un simple malloc como dijo leosansan y se solucionó..................xD.




* Prueba sin malloc.

* ¿Sin el caracter nulo final una cadena?.

* Y sólo quedó el detalle de la impresión, que como comenté era una opción si solo quería imprimir.

Sin acritud, que no estoy para batallitas.  ;)

¡¡¡¡ Saluditos! ..... !!!!




#73
Vamos que :

Código (cpp) [Seleccionar]
char *nombre ;

debe ir en main con el consiguiente cambio en la función y en su invocación ya que ahora tiene un parámetro que pasar (nombre):

Código (cpp) [Seleccionar]
char* CreaNombre(char *nombre);

Tampoco viene mal hacer una cierta reserva de memoria para nombre, tipo:

Código (cpp) [Seleccionar]
nombre =  malloc ( 100 * sizeof ( char ) ) ;

Ya puestos, ¿que tal si "cierras" la cadena nombre con el caracter nulo no sea que imprima cosas raras:

Código (cpp) [Seleccionar]
  for ( i = 0 ; i < 13 ; i++ )
    nombre [ i ] = ( 48 + rand ( ) % ( 57 - 48 ) + 1 ) ;
    nombre[i] = '\0' ;


Y si lo que deseas es tan sólo imprimir puedas hacer:

Código (cpp) [Seleccionar]
printf ( ":%s." , CreaNombre ( nombre ) ) ;

Tampoco vendría mal colocar el srand al comienzo del programa y terminar main con el return correspondiente, así como incluir la librería time.h en lugar de la string.h que aquí no hace nada, a no ser que el código que cuelgas sea parte de otro más completo.  :)

¡¡¡¡ Saluditos! ..... !!!!


#74
Teniendo en cuenta que pueden haber varios espacios en blanco seguidos y haciendo el bestia, sin usar las funciones propias para estos efectos, propongo:

Código (cpp) [Seleccionar]
********************************************************

char frase [  ] = "1234   789 1234 321  9876 56 " ;
  for ( i = 0 ; frase [ i ] ; i++  ) {
    if ( frase [ i ] != ' ' )
      j++ ;
    if ( frase [ i ] == ' ' ) {
      if ( j == 4 ){
        cont++ ;
        for ( k = i - 1 ; k >= i - 4  ; k-- )
          frase [ k ] = '*' ;
      }

    j = 0 ;
    }
  }
  printf ( "\n\nLa frase final es: %s" , frase ) ;
  printf ( "\n\nY contiene %d palabras de cuatro letras.\n\n" , cont ) ;

*******************************************************


¡¡¡¡ Saluditos! ..... !!!!


#75
Cita de: Swain en  5 Agosto 2014, 17:51 PM
Si no sabes el largo que va a tomar la frase tienes que usar punteros
pero para cada palabra puedes asignarle un espacio TOPE

Me ha gustado el uso del puntero con asignación dinámica de memoria, eso sí con lo que tan acertadamente comenta eferion respecto a dicha asignación así como el uso del bool.  ;-)

Sólo unos pequeñitos detalles:

* creo que falta la librería stdbool.h
* ¿No te sobra el "&" en los scanf al tratarse de arrays?.
* Tal como lo tienes, introduce un espacio en blanco al comienzo de la frase, cosa que no procede.
* ¿Es tan necesario el uso de memset?. Para inicializar "frase " podríamos usar calloc, en lugar de malloc, y respecto a inicializar a la variable "aux", ¿es tan necesario?. Dudas, dudas ..... :rolleyes:
* Podemos ahorrarnos uno de los scanf haciendo la pregunta al entrar la frase.

Son sólo detallitos sin mayor importancia pero creo que eferion me ha contagiado el estado "quisquilloso" hoy.  :laugh:

Pero insisto, me ha gustado la aportación, tanto que con tu permiso la modifico para tener en cuenta los pequeñitos detalles que mencioné:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

char *funcion ( char *frase ) {
  bool cont = true ;
  char aux [ 50 ] ;
  frase = calloc ( sizeof  aux , sizeof ( char ) ) ;
  printf("\nEscribe una palabra ( n para salir ): ") ;
  scanf ( "%s" , aux ) ;
  strcpy( frase , aux ) ;
  while ( cont ) {
    printf("\nEscribe una palabra ( n para salir ): ") ;
    scanf ( "%s" , aux ) ;
    ( strlen ( aux ) == 1 && ( aux[0] == 'n' || aux[0] == 'N') ) ? cont = false : sprintf ( frase , "%s %s" , frase , aux ) ;
    frase = realloc ( frase , sizeof ( aux ) + strlen ( frase ) ) ;
  }
  return frase ;
}

int main( ) {
  char *frase ;
  printf( "\n\nLa frase es:\n\n%s" , funcion ( frase ) ) ;
  free ( frase ) ;
  return EXIT_SUCCESS ;
}


¡¡¡¡ Saluditos! ..... !!!!


#76
Cita de: programator11 en  5 Agosto 2014, 13:17 PM
Buenas que tal.

Mi problema es el siguiente, quiero hacer un programa que vaya concatenando las palabras que yo vaya introduciendo por teclado, el problema es que no se como hacer para que se concatenen con un espacio cada palabra (aaa bbb en lugar de aaabbb)


Además de la solución que te dio eferion te propongo otra alternativa.

Para empezar sacaría el primer scanf del do-while, ya que la primera palabra y la segunda son escaneadas impepinablemente siendo ya optativas las siguientes. Con eso ahorras la variable cont y te evitas el if-else del do-while.

Y para concatenar las palabras usaría la función sprintf con lo que en con sólo una función concateno las palabras:

Código (cpp) [Seleccionar]
/***************************************************/

 char c , cad[100] = "" , pal[18] ;

 printf ( "\nIntroduzca la primera palabra\n\n" ) ;
 scanf ( "%s"  ,pal ) ;
 sprintf ( cad , "%s%s" , cad  , pal ) ;

 do {
   printf ( "\nIntroduzca la siguiente palabra de la frase:\n" ) ;
   scanf ( "%s" , pal) ;
   sprintf ( cad , "%s%c%s" , cad , ' ' , pal ) ;
   printf( "\nSi quieres seguir alargando la frase pulsa S, sino pulsa cualquier otra letra:\n" ) ;
   scanf( " %c", &c) ; /* Observa el espacio en blanco antesde %c para limpiar el '\n' del scanf previo */
 } while ( c == 's' ) ;

  printf ( "\n\nLa frase final es \n\n%s" , cad ) ;

/********************************************************/


Y respecto al uso de scanf y  fflush (stdin) te aconsejaría leer lo que no hay que hacer en C/C++. Nivel basico.

En cualquier caso si veo necesario el uso de una condición que controle el tamaño de la cadena "cad" tal que si se supere su tamaño aborte el ciclo y no permita añadir más palabras pues en caso contrario se iría más allá de la dimensión de la mencionada cadena cad.También es necesario controlar que la variable "palabra" introducida sucesivamente no supere en cada caso su tamaño y tienes ejemplo de eso en el enlace anterior. Eso ya te lo dejo a ti aunque es sencillito.  ;)

¡¡¡¡ Saluditos! ..... !!!!


#77
Cita de: engel lex en 23 Julio 2014, 08:08 AM
no destruyas el tema, deja la pregunta como estaba en lugar de que alguien más se interese en algo similar y usa el boton para marcar el tema como resuelto

Totalmente de acuerdo y además no dice cómo logro resolverlo por si a otros usuarios le puede resultar útil.

Ante tanto desdén respondo con otra opción:

Código (cpp) [Seleccionar]
n1 = ( ( n1 + n2 / 2 ) / n2 > ( n1 / n2 ) )  ?  ( n1 / n2 ) * n2 + n2 : ( n1 / n2 ) * n2 ;

¡¡¡¡ Saluditos! ..... !!!!


#78


¡Vamos a darle trabajo a eferion!.



El for no salió tan mal parado, pero ¿lo podemos mejorar?.

Pues se me ha ocurrido un sistema que reduce el número de divisiones a la mitad o a la mitad más uno, según que el número de cifras sea par o impar, con lo que los resultados del test que le pasaste al for tendrás que "actualizarlo" con el nuevo sistema:

Código (cpp) [Seleccionar]
 int digitos = 0 , num = 123456.345 ;
 while ( num )
   digitos = ( num /= 100 ) >= 0 ? digitos + 2 :  digitos + 1 ;





;) ;) Y sirve tanto para enteros como para decimales.  ;) ;)



¡¡¡¡ Saluditos! ..... !!!!


#79
Programación C/C++ / Re: Estructura switch¿?
4 Agosto 2014, 13:36 PM
Cita de: 718208 en  4 Agosto 2014, 12:48 PM
Hola lucas59, sino entiendo mal lo que tendrias que hacer es poner un caso default, y saltar caracteres de tabuladores, para esto después de los case poné estos otros case
.............................


;) ;) Sin malos rollos, ¿vale?.   ;) ;)



Lee bien la pregunta y después la acertada respuesta de rir3760.



Un fuerte saludo 718208.

#80
Cita de: Blaster en  4 Agosto 2014, 01:22 AM

Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", numero);


El problema es que, a diferencia de los dos métodos anteriores, éste que propones da el número de los caracteres de la cadena "numero":

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", "123.314");

y si esta es "123.314" dará 7 mientras que si número se coloca directamente:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", 123.314);

dará el resultado correcto, "creo", si es un entero e impredecible si es un decimal, aún poniendo %f.

Cita de: Blaster en  4 Agosto 2014, 04:59 AM
Es verdad, debí leer mas detenidamente la explicación que diste

Me alegra que hallas captado lo que pretendía exponer y siento no haber sido tan claro la primera vez.  ;)

Un fuerte saludo Blaster.