Curso completo de programación con lenguaje C

Times

Buenos días o buenas noches depende como queráis mirarlo (Lo que tiene haberse quedado en el paro recientemente)

Me uno a vosotros y espero que me aceptéis, pero voy bastante rezagado. Buscando miles de manuales por internet, al final lo tenia mas a mano de lo que pensaba. Gracias por la iniciativa y por tu paciencia.

Publico el primer ejercicio de todos y me dices si está bien "picado?" (el de sumas restas... con dos numeros)

spoiler

cuando cargo el programa por el cmd se me abre otra ventana de cmd con una barra arriba del avast y al introducir los números se me cierra, sin apenas ver nada, pero luego a la ventana anterior me los vuelve a pedir y entonces si se para y me deja leer los resultados. Por que ocurre esto?

Por cierto... que malo soy me he metido de ostias hasta resolverlo.

FoxWinterMan

#1 Hola tengo una duda que llevo rompiendome la cabeza de los ejercicios de structs!!

spoiler

Dudas: 1º No me imprime bien lo del numero aleatorio!! AL IMPRIMIR identificacion es velocidad y velocidad es numero muy grande fuera del rango propuesto!
Edit-> Consegui que me imprimiese la velocidad bien poniendo otro fprintf, pero el numero de identificacion sigo sin tenerlo bien, siempre es 0, entiendo que tengo que asignarle la direccion de la memoria a ejemplo1.identificacion pero no se como hacerlo :(

Dudas 2º Si quisiera hacer el ejemplo1 en el main y pasarlo a la funcion rellenar, seria como cualquier otra variable?
Duda 3º Para que se usa -> en estructuras? Lo he visto por ahi y no me queda claro :(

1 respuesta
gonya707

#242 Por partes, primero lo de la flechita que seguramente aclare el resto de dudas.

-> es un operador muy parecido al . que se usa cuando en vez de una estructura es un puntero a estructura. Por ejemplo

coche c1;
coche *c2;

c1.identificacion = 1234;
c2->identificacion = 4321;

fprintf(stdout, "id1: %d, id2: %d", c1.identificacion, (*c2).identificacion); 

ahi puedes ver el acceso con -> y con (*puntero).algo, cosas totalmente equivalentes.

La estructura del programa es algo deficiente, deberias crear la variable dentro del main, y pasarsela luego en forma de puntero a la funcion rellenar. Desde rellenar usas la direccion de memoria para modificar la misma variable que tienes en main, y asi al volver a main no se destruira. A continuación yo haría una funcion void mostrar(coche c); que es la que imprime por pantalla todos los campos.

Lo del numero aleatorio no se porque te falla la verdad, no consigo ver el error. Tu no tienes que designar ninguna direccion de memoria ni nada, no te lies.

Por cierto, para que pones un getchar al final del programa? Si es para que el programa se pause y no se cierre la ventana de comandos inmediatamente puedes poner un system("pause");

Por cierto 2. El fflush se usa siempre justo antes de un scanf, te falla el orden en el que los has puesto y el ultimo antes de crear el numero aleatorio sobra totalmente.

1 respuesta
FoxWinterMan

#243

Todo esto esta modificado ya! Pero el numero aleatorio sigue sin salirme, siempre salen los mismos valores y eso que tengo el srand con time y nada, siempre sale el mismo numero de 7 cifras!

FoxWinterMan

#1

spoiler
2 meses después
Adref

#1 Buenas queria darte las gracias por este curso ya que estaba buscando un libro para aprender C y cuando descubri tu curso decidi seguirlo y la verdad es que me esta siendo de gran ayuda, ya voy por la lección 6, cuando termine subire todos los ejercicios resueltos y ojala despues de este curso te animes y sigan mas como este jaja.

1 respuesta
gonya707

#246 edit: whooops, habia contestado al ejercicio que habias puesto pero ya no esta xD

1 respuesta
Adref

#247 Jaja esque iba a preguntar porque no me funcionaba el programa despues de repasarlo mil veces pero justo cuando lo copie vi el error xDDDD.

acho_tio

#40 alguien me explica por que en el resultado del post #40, al final de la funcion fprintf pone el numero 162???

1 respuesta
gonya707

#249 dentro de su cadena de texto entrecomillada ha puesto un %c, eso le indica al print que en ese hueco deberia haber un caracter especial. Para indicarle quécaracter se trata, se coloca despues de la cadena, separando con una coma, y en ese caso el caracter indicado es 162, que si consultas una tabla ascii resulta ser el caracter ó(o minuscula con tilde aguda)

Es una manera habitual de introducir caracteres raros, que metidos a las malas dentro de la cadena de texto darian un mal funcionamiento

http://www.ascii-code.com/

1 respuesta
acho_tio

#250 gracias por responder!! Pero tengo dos dudas:

  1. El código Ascii solo sirve para Windows? Pq en Linux me sale un rombo con un interrogante dentro en lugar del carácter "ó", y con los demás caracteres igual.

  2. En la web que pusiste de ascii el numero 163 que es el que usa en #40 no se corresponde con la letra ú ni ó ni nada parecido. Estoy usando mal el código ascii?

Perdona por la ignorancia pero apenas estoy iniciándome en C. Por cierto, felicidades por el hilo!!

1 respuesta
gonya707

#251 segun el linux que uses, lo del 163 puede que no te funcione, pero en cambio puedes meter tildes directamente en las cadenas de texto sin ningun problema

trarleys

Dar gracias a #1 por este curso ya que me ha servido de gran ayuda. Tambien me gustaría saber como veis el ejercicio 3 de Estructuras de datos, ya que me ha llevado mucho tiempo y querria saber si esta bien.

spoiler
1 1 respuesta
gonya707

#253 tu problema es porque tu numero de identificacion es un numero entero 'int'. Para un int 00001 y 1 son el mismo dato. Para poder usar IDs empezando con 0 deberias hacer que la identificacion no sea un nómero, sino una cadena de caracteres, de cara a la programacion

si aun asi quieres que sea obligatorio que la ID sea un numero y no una cadena alfanumerica, existe una funcion llamada isalpha que te detecta si algun caracter es una letra, cosa que no quieres.

Veo solo dos problemillas a tu programa pero en general esta bien y completo. El primero es los prototipos de funciones que haces, que devuelven chars, ints... cuando en realidad no devuelven nada, cambia los prototipos a void.

Otro detalle que puede resultar molesto al usar este programa es la poca información que da al usuario. Imagina que tienes los 10 coches metidos y metes un undécimo. Pedirá al usuario los datos cuando no va a introducirlos, en este caso son 3 campos pero imagina que son 50... todo ese escribir para nada. Debería comprobar que hay hueco antes de pedir ningún dato, y además de eso enviar un mensaje siempre que no haya podido completarse alguna acción junto con la razon de por que no se ha hecho i.e. "ERROR: La operación no ha podido completarse. El limite de articulos es 10."

1 respuesta
trarleys

#254 Vale gracias, voy a darle un repaso y corregir los errores que has mencionado :) .

trarleys

Versión mejorada del ejercicio.

spoiler

Lo del isalpha al final me di por vencido ya que no encontraba forma de que me funcionara bien.

1 respuesta
gonya707

#256

7 días después
willy_chaos

Despues de un tiempo por cosas de la uni tengo que ponerme al dia con C y me encuentro que haciendo por ejemplo este ejercicio de funciones.

spoiler

Si introduzco numeros, funciona bien, pero si introduzco 1 letra ... se queda en bucle infinito (sin dejarme introducir nada, simplemente hace los printf...)

Ejemplo poniendo numeros:

spoiler

Ejemplo introduciendo letra:

spoiler

Al añadir el isdigit a la comprobacion del segundo do-while ya no hace bucle infinito, pero no me pregunta el numero y automaticamente termina el programa

root@BCNSERVER:~/cprog# ./ejF.exe
Introduce el primer numero:
a
Introduce el segundo numero:
El resultado es 0 .
1 respuesta
f0restLOL

No me sale el ejercicio de hello word.

-archivo nuevo,código fuente

-#include <stdio.h>

int main(void) ´{
fprintf (stdout, "hello word");
return0:
}

Guardar como, hello.c y tipo c source files (*c)

Me guarda un unico archivo,nada de .exe

1 respuesta
gonya707

#259 Es que solo lo has guardado, tienes que compilarlo.

Dale al icono de los cuadraditos arriba a la izquierda:

#258 No entiendo porque en uno de los do while compruebas si es un numero y en el siguiente do while compruebas while ( num2 <= 0 );

1 1 respuesta
Maaarc

Tienes un ' que no deberia estar, en el int main{ y seguramente no te compile por eso. Y el retorno del final va con ; y no :

1
willy_chaos

#260 Estaba haciendo pruebas cuando he copiado el codigo, te pasteo el que tengo ahora.

spoiler
1 respuesta
gonya707

#262 la funcion isdigit es para caracteres, asi que es normal que no te funcione bien metiendole un int.

Por lo que veo no hay una manera segura de hacer esta comprobacion con int y con %d, ya que un caracter internamente tambien es un int... para que todo esto fuese 100% fiable deberias hacerlo con una cadena de caracteres [1, 2, 5, 5] e ir comprobando con un bucle que todos los miembros de la cadena fuesen cifras con isdigit

trarleys

Del tema 11- Manejo de fichero:

ejercicio 1

Y ya que estoy una pregunta:

spoiler
1 respuesta
gonya707

#264 usa

void funcion(FILE* blablabla);

Aunque no queda muy estético... el FILE es un tipo de variable como lo es int o char, puedes usarlo sin problemas en entradas/salidas de funciones, aunque no lo recomendaría. Yo directaamente abriría y cerraria ficheros desde dentro de la propia funcion. Lo suyo seria que hicieses:

void funcion(char* nombreArchivo);

...

void funcion(char* nombreArchivo){
FILE *pf =  fopen(nombreArchivo, "rt");
// cosas

}

1
trarleys

Terminado los dos últimos ejercicios del tema de ficheros:

ejercicio 2
ejercicio 3
B

Me quedan las últimas lecciones.

Hay que repasar todo y montar algo serio :clint:

willy_chaos

Vuelvo a vosotros porque estoy haciendo 1 practica y me encuentro que strcmp nunca me devuelve 0.

Pongo parte codigo

spoiler

La funcion timcmp lo que hace es recibir hora1,min1,seg1,hora2,min2,seg2 y lo pasa todo a segundos. Dependiendo quien es mayor y quien es menor, devuelve -1,0,1 al igual que strcmp (si fuera el caso...).

La funcion recibe un array de la array de Piloto y debe buscar el mas rapido en cada categoria (solo hay 3). La cosa es que el output de la funcion me devuelve esto:

spoiler

1 - No entiendo porque ese enter en la primera linea y no en las siguientes...
2 - No entiendo porque en la iteracion 1 , en vez de F1 printa F12 cuando en la definicion del struct esta puesto F1..
3 - No entiendo porque me devuelve 1 en las comparaciones validas..

Array Struct
1 respuesta
gonya707

#268 wowowo mucho codigo, intenta reducirlo al punto algido cuando pidas auyda.

Eso de que strcmp no te devuelva 0 nunca es un viejo conocido mio. Comprueba que con el método en el que metes las strings no se te cuele un \n o un \r en el ultimo caracter por culpa de terminar todos tus imputs pulsando el enter; el último caracter deberia ser siempre un \0

Lo que te esta comparando ahora mismo podria ser:

'F' '1' '\n'  == 'F' '1'  ?

de hecho es lo que te esta pasando en ese que da un salto de linea by the face

1 respuesta
willy_chaos

#269 Pero fijate en el spoiler array struct, como ves se realiza de la misma forma que en otros (todo esto antes de cargar el menu del programa, por lo que no hay ningun ENTER) aun pulsado.

El codigo que he puesto arriba es 3 veces el mismo, pero para los tres tipos de competiciones, a la que funcione 1, funcionaran los otros.

Luego como digo en la iteracion nº1 printa F12 cuando al introducir los datos en el struct, se realiza igual para todos.

Voy a mirar de forzar mediante bucles la limpieza con '\0' de todos los array de char no vaya a ser algo por el estilo...

1 respuesta