Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: El_newbie2017 en 27 Mayo 2017, 07:54 am



Título: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 27 Mayo 2017, 07:54 am
Hola, a todos;

Estoy intentando resolver el siguiente ejercicio la verdad no se si voy bien,no entiendo a lo que se refiere el punto 3, dos digitos en un espacio de 5 caracteres osea (23.)?Quisiera que me pudieran saber si me pueden ayudar. Gracias.
 
/*C) Escribir una instruccion prinf() que produzca    el resultado mostrado.

3)Tres numero enteros de dos digitos, cada uno ocupando un espacio de 5 caracteres.
*/


Código
  1. #include<stdio.h>
  2. #include<limits>
  3.  
  4. using namespace std;
  5.  
  6. int main (){
  7.  
  8. int dos,cuatro,a,b,c;
  9. float uno,f_cuatro;
  10.  
  11. uno = 1/3;
  12. dos = numeric_limits < int > :: max ( );
  13. cuatro = 50;
  14. f_cuatro = 53.123;
  15. a = 20;
  16. b = 30;
  17. c = 40;
  18.  
  19. printf("\n %.3f-----%d-----%d %d %d-----%d %f",uno,dos,a,b,c,cuatro,f_cuatro);
  20.  
  21.  
  22. return 0;
  23.  
  24. }


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 27 Mayo 2017, 09:13 am
¿Qué tal vas de inglés?
Aquí el manual de la família printf (https://linux.die.net/man/3/printf)

Trae todas las respuestas a lo que pides.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 27 Mayo 2017, 21:33 pm
Muchas gracias MAFUS, esta muy util, pero todavia no entiendo lo que quiere decir con 3 numeros de dos digitos ocupando un espacio de 5 caracteres.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 27 Mayo 2017, 23:26 pm
Normalmente los números ocupan el espacio de sus propios dígitos, pero el ejercicio te propone que escribas tres números que, a pesar de ser de dos dígitos cada uno ocupen 5 espacios para caracteres. Esto lo tienes en el manual.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 28 Mayo 2017, 03:34 am
Hola, lo lei varias veces aunque no entendí mucho. Sin embargo si me ayudo con el punto
3 todavia ando varado por el punto 1 y 2, con el tema de 1/3=00.333, el resultado siempre me imprime 0.333. Intente con la anchura de "%5.3f", pero no resulto e intentado con mas como *,05.3, si me puedes dar otra pista te agradecería la verdad aprendí un poco de conceptos, que no manejaba muchas gracias.

Código:

#include<stdio.h>
#include<limits>

using namespace std;

int main (){

int dos,cuatro,a,b,c;
float uno,f_cuatro;



uno = float (1)/float(3);
dos = numeric_limits < int > :: max ( );
cuatro = 50;
f_cuatro = 53.123;
a = 20;
b = 30;
c = 40;

printf("\n %05f-----%d-----%5d %5d %5d-----%-3d %.3f",uno,dos,a,b,c,cuatro,f_cuatro);


return 0;

}
[\code]


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 28 Mayo 2017, 13:52 pm
Solo está el enunciado del tres. ¿qué dicen los otros puntos?


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 28 Mayo 2017, 22:13 pm
Mira MAFUS;

1)El resultado de 1/3 con dos enteros y 3 decimales
2)El valor maximo de una variable entera con separadores de miles.

No he conseguido que el resultado me de 00.333, ya lo intente especificando un %05.3f, osea 5 números  3 decimales, donde tenia que rellenar a la izquierda los con dos 0;00.

Y el segundo lo estoy mirando hasta ahora. tengo que hacer que el valor max del entero me imprima los puntos de millares así como 2.147.483.648 y no  2147483648 como lo tengo actualmente,


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 28 Mayo 2017, 23:48 pm
Para el 1: la coma decimal (o punto decimal) también se considera parte del número de dígitos cuando marcas el número mínimo de caracteres a usar. La cadena de control por tanto será
Código:
"%06.3f"
Por cierto, para hacer una división con decimales basta que uno de los dos números sea marcado cómo decimal con un punto decimal. Así:
Código:
float uno = 1/3.;
;
Cuando C encuentra una operación matemática con dos números de diferente naturaleza siempre promociona los de menor rango al mismo tipo del mayor rango de la operación.

Para el 2: el manual dice
Citar
For some numeric conversions a radix character ("decimal point") or thousands' grouping character is used. The actual character used depends on the LC_NUMERIC part of the locale. The POSIX locale uses '.' as radix character, and does not have a grouping character. Thus,

printf("%'.2f", 1234567.89);
results in "1234567.89" in the POSIX locale, in "1234567,89" in the nl_NL locale, and in "1.234.567,89" in the da_DK locale.

Como puedes ver te marca que el apostrofe es el signo a usar para que printf imprima el separador de millares y, además, dice que depende de la configuración local.

Otra búsqueda por internet, no muy larga, indica como cambiar el comportamiento de printf si de normal no marca los millares. Para ahorrarte el trabajo te lo pongo aquí. Antes de usar printf debes cambiar la configuración local de esta forma:
Código:
setlocale(LC_NUMERIC, "");


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 29 Mayo 2017, 02:58 am
De nuevo mil gracias MAFUS, no se como no se me ocurrió que el punto es un carácter,bueno.

Ya estaba mirando justamente ese tema de setlocale LC_NUMERIC, pero no encuentro la abreviación  de el locale de mi país intente (co_CO) y (COLOMBIA), ya que decia que lo pusiera en mayúscula.

Código:
http://www.cplusplus.com/reference/clocale/setlocale/ 

Código:
#include<stdio.h>
#include<limits>
#include<locale.h>

using namespace std;

int main (){

int dos,cuatro,a,b,c;
float uno,f_cuatro;

setlocale(LC_NUMERIC, "");

uno = 1.0/3;
dos = numeric_limits < int > :: max ( );
cuatro = 50;
f_cuatro = 53.123;
a = 20;
b = 30;
c = 40;

printf("\n %06.3f-----%d-----%5d %5d %5d-----%-3d %.3f",uno,dos,a,b,c,cuatro,f_cuatro);

return 0;
}


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 29 Mayo 2017, 03:58 am
Para colombia es es_CO

http://www.localeplanet.com/icu/es-CO/


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 29 Mayo 2017, 20:53 pm
No >:D >:D >:D >:D MAFUS.

No quiere colocar los millares en el int. No si se le falte algo de mas al código.


Probandolo con otro código me tiera un valor null, no me tira la localidad de Colombia.

[Codigo]

#include <locale.h>
#include <stdio.h>
#include <time.h>

using namesapce std;

int main ()
{
   time_t currtime;
   struct tm *timer;
   char buffer[80];

   time( &currtime );
   timer = localtime( &currtime );

   printf("Locale is: %s\n", setlocale(LC_ALL, "es_CO"));
   strftime(buffer,80,"%c", timer );
   printf("Date is: %s\n", buffer);

 
   printf("Locale is: %s\n", setlocale(LC_ALL, "es_CO"));
   strftime(buffer,80,"%c", timer );
   printf("Date is: %s\n", buffer);

   return(0);
}

No se que pueda hacer.   :-\


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 29 Mayo 2017, 21:41 pm
Partiendo de tu último programa he hecho que me escriba el valor devuelto por una cadena vacía ("") y me ha devuelto el valor "es_ES.UTF-8". Es así porque este es el locale de mi sistema. De seguro que si tienes bien configurado tu S.O. te devolverá el de Colombia. De todas formas lo he buscado y es "es_CO.UTF-8". Inténtalo, a lo mejor los sistemas ahora están basados en UTF8. O dale la cadena vacía.

Sobre lo que me has dicho de que no quieres darle separador de millares al int, no lo entiendo pues eso es lo que te pide el ejercicio.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 30 Mayo 2017, 00:28 am
Si MAFUS me sirvio con "" extraño no había querido.Pero aun no me dan los millares.


No, me entendiste mal, dije que no ha separado el numero int en millares todavia, por eso probe con otro programa si el lc_numeric funcionaba y siempre me de volvia un valor null.

El codigo esta igual que antes pero con un es_CO.UTF-8 dentro de las comillas.

Griacias!!! Por su atención eres Grande.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 30 Mayo 2017, 00:47 am
Extraño que no te dé los millares. A mi con este código
Código
  1. #include <locale.h>
  2. #include <stdio.h>
  3.  
  4. int main ()
  5. {
  6.   printf("Locale is: %s\n", setlocale(LC_ALL, "es_CO.UTF-8"));
  7.   printf("Número: %'d\n", 12345678);
  8. }

Me da la siguiente salida:
Citar
Locale is: es_CO.UTF-8
Número: 12.345.678


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 30 Mayo 2017, 18:52 pm
Mmmmmm es muy estraño compile el codigo que me das arriba y no me lee el apostrofe.

me sale en pantalla;

[Codigo]

Local is: <null>
numero: 'd



Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: MAFUS en 30 Mayo 2017, 20:14 pm
Vale, lo entiendo. Debes estar trabajando con Windows, por eso no tienes la codificación es_CO.UTF-8 ni el apostrofe como bandera para printf, ya que este es parte del estándar POSIX, que Windows no usa. Si ese es el caso tienes dos posibilidades:
Usar un compilador que trabaje con POSIX
o
Formatear la cadena a mano.


Título: Re: Ejercicio basico con c++ (Ayuda con el prinft)
Publicado por: El_newbie2017 en 4 Junio 2017, 00:23 am
Hola MAFUS;
Tu que elección me recomiendas y si pudieras facilitarme un manual o algo confiable. Lo siento la tardanza. Gracias de antemano.