Curso completo de programación con lenguaje C

KooPad

Creo que soy un poco masoca. Venia de Python y tenia miedo de no adaptarme bien, pero me gusta la dificultad que tiene C++.

Overburden

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.

1 respuesta
Leos

#392 Pon float y pon uno de los dos con decimales, es decir, 3.0/2 y deberían salirte los decimales.

1 1 respuesta
Overburden

#393 joder, que cosa más rara, al poner 3.0/2 sí me funciona, muchas gracias tío, esto por que pasa?

2 respuestas
Leos

#394 Porque como mínimo uno de los dos números debe ser float para darte un resultado float.

gonya707

#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
cabron

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
Overburden

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.

2 respuestas
herre

#398 El %s en el format string coge texto hasta un white space, tienes que cambiar un poco:

http://stackoverflow.com/a/6282236/3566420

Leos

#398 Porque con el scanf solo guarda characteres, para imprimir frases en vez de un scanf usa un gets.

1 respuesta
herre

#400 NO uses gets. Leed man 3 gets.

1 respuesta
Leos

#401 A mi me están enseñando así, recordemos que esto es C no programación de linux.

1 respuesta
herre

#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.

KooPad

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.

spoiler

En Python este código funcionaba, estoy al 99% seguro que es por tema de decimales ya que con numeros pequeños funciona.

1 respuesta
gonya707

#404 Claro, hay limite en todos los lenguajes. Lo que pasa es que un int en python será mas grande que uno en C.

Para asegurarse en vez de oint puedes usar long, long long, double o ya en ultima instancia long double

1
11 días después
sercheador

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

N

¿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.

He3maN0

Usando los bucles he conseguido hacer "un juego" jaja.
Es una puta mierda super sencilla pero estoy muy orgulloso jaja

spoiler
1 respuesta
gonya707

#408 genial! ahora a complicarlo un poco.

Que te parece reciclar esa estructura para hacer un juego de adivinar "parejas de cartas"? :D

1 respuesta
He3maN0

#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!

He3maN0
spoiler

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?

2 respuestas
herre

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í.

fehnd

#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); }
1 respuesta
Dev

Joder, y yo perdiéndome este hilo... :qq: :qq:

herre

#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

1 respuesta
herre

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;
}
fehnd

#415 ah no, yo suelo ponerlo, solo que he copypasteado literalmente el code de #411 y lo he hecho a pelo, suelo llamar a cstdlib, voy a ver si hay mucha diferencia con stdlib.h

por cierto, si que lo has acotado si xD

herre

cstdlib es algo de c++. Mejor ceñirse a stdlib aqui.

He3maN0
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;?

2 respuestas
gonya707

#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

1 respuesta