Creo que soy un poco masoca. Venia de Python y tenia miedo de no adaptarme bien, pero me gusta la dificultad que tiene C++.
buenas, hace tiempo que no cojo c y ahora tengo una duda que no recuerdo cómo se solucionaba, quiero que me salgan las divisiones con decimales (3/2=1.5) pero me da valores enteros (3/2=1), he probado con float (%f) y con double(%lf) y sigue sin salirme.
#392 Pon float y pon uno de los dos con decimales, es decir, 3.0/2 y deberían salirte los decimales.
#393 joder, que cosa más rara, al poner 3.0/2 sí me funciona, muchas gracias tío, esto por que pasa?
#394 efectivamente como te han dicho asi se arregla.
Si crees que en el futuro se te va a olvidar este detalle siempre puedes hacer un cast a float para que sea más visual.
En vez de
3/2
así:
3 / (float) 2
O bien multiplicar en vez de dividir, lo cual te va a dar casi siempre decimales, y en teoría (no he comprobado la veracidad de esto), es más rápido de computar
3 * 0.5
Si pones decimales en una operación aritmética se hace un casting automático a double.
Para que sea float hay que usar el sufijo f. Se pude hacer con un casting pero es una manera absurda de emborronar el código
3.f /2; //resultado float
3.0/2 //resultado double
hay otra cosilla que no entiendo: si escribo esta linea de código
int main()
{
char x[1000];
scanf("%s",x);
printf("%s",x);
return 0;
}
y escribo un espacio, el printf no me imprime lo que hay después de ese espacio.
#398 El %s en el format string coge texto hasta un white space, tienes que cambiar un poco:
#398 Porque con el scanf solo guarda characteres, para imprimir frases en vez de un scanf usa un gets.
#402 No tiene nada que ver. Es una función deprecada, que va a ser eliminada y que es susceptible a graves vulnerabilidades de seguridad. En C11 de hecho ya está eliminada.
En c++ hay un valor limite para los números?
Estoy probando a pasar el código de la conjetura de Collatz a c++ y no se como arreglarlo.
En Python este código funcionaba, estoy al 99% seguro que es por tema de decimales ya que con numeros pequeños funciona.
BRUTAL! Yo he hecho el de C++ en esta pagina que también esta brutal.
http://stmblog.com/curso-basico-de-programacion/
Ahora seguire también el tuyo i me pongo un poquito en C
¿Nadie ha mencionado Handmade hero en este hilo? A ver si con estoy os doy un empujoncito para seguir dándole al C y al OP para que lo acabe.
inb4: La mayoría de los juegos de Nintendo están hechos en puro C.
Usando los bucles he conseguido hacer "un juego" jaja.
Es una puta mierda super sencilla pero estoy muy orgulloso jaja
#408 genial! ahora a complicarlo un poco.
Que te parece reciclar esa estructura para hacer un juego de adivinar "parejas de cartas"?
#409 jajaja eso mañana ahora voy a ver el partido,mañana hago el intento si puedo y lo pongo por aqui,aparte de que tengo que continuar jaja
Por cierto gracias por el cursillo!
Por favor alguien me podria decir como en vez de utilizar esos tres if,utilizar switch?
O no es posible?
Entiendo que tiene de entrada una variable y que los cases depende del valor,pero como lo podria aplicar aqui? Tendria que usar if de todas formas no?
No puedes utilizar un switch ahí, porque comparan cada case mediante igualdad. Lo más que puedes hacer es reescribirlo como if - else if , ya que son casos excluyentes entre sí.
#411 Creo que no se podían poner comparaciones en un case de un switch, de todas formas, te he cambiado el código porque hay una variable que realmente no hace falta, y estaría bien que introdujeras una sentencia de salida del bucle por si no quiere intentarlo más, te lo pongo todo(voy a aprovechar la variable que no hacía falta para esto):
No se porque, pero cuando lo pongo en spoiler no sale bien :/
//Y por último hacer un jueguecillo. Internamente se debe calcular de manera aleatoria un número entero entre 0 y 100, y
// el jugador debe de adivinarlo. Para ello el jugador deberá introducir un número sucesivas veces y el programa le advertirá si
// la respuesta es mayor, menor o bien ha acertado.
// Cuando acierte el programa deberá hacer un recuento de los turnos que se ha tardado en adivinar.
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
int main(){
// Variables
srand(time(NULL));
int usuario,aleatorio,fallos;
aleatorio = rand()%101;
bool acierto=true;
fallos = 0;
do{
//Texto en pantalla
fprintf (stdout,"Prueba suerte con un numero(-1 para salir): \n");
fscanf (stdin,"%d",&usuario);
if (usuario!=-1){
if (aleatorio > usuario){
fprintf (stdout,"El numero que diste era menor que el generado\n");
fallos = fallos + 1;
}
if (aleatorio < usuario){
fprintf (stdout,"El numero que diste era mayor que el generado\n");
fallos = fallos + 1;
}
}
else{
usuario=aleatorio;
acierto=false; //uso la variable de "acierto" como un mostrador de si ha salido o no
}while (aleatorio != usuario);
if(acierto==true){
fprintf (stdout,"Felicidades,acertaste el numero\n");
fprintf (stdout,"Tuviste %d fallos",fallos);
}
else{
fprintf (stdout,"Game Over\n");
fprintf (stdout,"Tuviste %d fallos",fallos);
}
#413 A mi se me veía bien en el spoiler.
Algunas cosas que los dos podeis mejorar:
Os falta incluir stdlib.h. Vuestro compilador será suficientemente listo para hacerlo el solo, pero mejor ser explícito. math.h no hace falta en este caso y stdbool.h simplemente no mola en c :p.
Os falta devolver algo en main. Lo habitual es devolver 0 si vuestro programa se ha ejecutado correctamente.
(Estas dos advertencias te las habría dado el compilador si compilas con -Wall (Warnings = all) Si usas gcc no tienes más que añadir eso a la línea de comando, si usas alguna otra cosa pregunta aquí como activarlo, es tremendamente recomendable.
Es más sencillo de entender el código si se declaran las variables cerca del primer lugar donde se van a usar.
Asi lo dejaría yo después de pasarle un trapito:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void die(char *msg) {
printf("\nERROR: %s\n", msg);
exit(1);
}
int main() {
srand(time(NULL));
int aleatorio = rand() % 101;
int acierto = 0;
int fallos = 0;
do {
printf("Prueba suerte con un numero: \n");
int usuario;
int rc = scanf("%d", &usuario);
if (rc == EOF) { die("EOF"); }
if (aleatorio > usuario) {
printf("El numero que diste era menor que el generado.\n");
fallos++;
} else if (aleatorio < usuario) {
printf("El numero que diste era mayor que el generado.\n");
fallos++;
} else if (aleatorio == usuario) {
printf("Felicidades, acertaste el numero.\n");
printf("Tuviste %d fallos", fallos);
acierto = 1;
}
} while (!acierto);
return 0;
}
Para ampliar, scanf y la mayoría de las funciones de la libreria estandar devuelven códigos que informan sobre si han tenido éxito. Es buena práctica examinar siempre este valor, y hacer fallar tu programa si alguno de estos "return code" no es lo que tu esperas, con un buen mensaje de error.
int rc;
rc = scanf("%d", &usuario);
if (rc) ...
PD: Dios MV, arregla el tag code de una vez xDDDD
Respondo aquí para no fastidiar el trozo de código otra vez xD Me faltaba decir:
Siempre inicializa tus variables. En el caso anterior (y a mi también se me ha olvidado), usuario no está inicializado, y puede tener cualquier valor dependiendo de la basurilla que hubiese en la localización de memoria que el compilador ha dado a esa variable.
Probad a ejecutar esto varias veces:
#include <stdio.h>
int main() {
char a[10];
printf("%s\n", a);
return 0;
}
void die(char *msg) {
printf("\nERROR: %s\n", msg);
exit(1);
int usuario;
int rc = scanf("%d", &usuario);
if (rc == EOF) { die("EOF"); }
No entiendo que es lo que hace realmente,por lo que sé return code(rc) va a comprobar que scanf no sea el EOF, y que en caso de que lo sea imprima ERROR EOF.Hasta ahi creo que lo he entendido,pero luego al compilar no le veo la utilidad.(Soy muy nuevo en esto jaja)
Tampoco entiendo el uso de EOF,buscando en inet salen cosas demasiado complicadas para mi
Otra cosa que es eso de inicializar una variable? Poner que usuario = 0;?
#419 Cuando usas scanf lo que esta haciendo es leer el buffer del fichero estándar, que es el teclado. Si lo que se acaba de leer es EOF significa que ha leido En Of File, es decir que el usuario no ha metido nada, el buffer no contiene ningún dato, solo el flag que señala fin del fichero. Asi compruebas que el usuario ha metido algo y no le ha dado simplemente al enter cuando se le ha pedido que meta un numero.
Si fuese en vez de un int un char* tendrias que compararlo con \0 en vez de EOF