Curso completo de programación con lenguaje C

gonya707

#28 Con tu primera solucion para las tildes me dan caracteres raros (una alpha veo por ahi) en el resultado, pero no las tildes. Por ahi pueden ir los tiros no obstante (hay varias soluciones). La otra manera usa conio.h yos recomiendo no usarla de momento porque os vais a hacer un lio. Es posible solo con stdio de maneras no demasiado complicada.

Por lo demas bien, un detalle solo, has declarado las variables fuera del main. A estas alturas no importa demasiado, pero procura a partir de ahora crearlas dentro del main si solo las usas en el main, como es el caso. Hablare sobre este detalle mas adelante

1 respuesta
bazoo

Ah, por cierto, un poco de feedback para mejorar como profe, podrías estructurar un poco mejor usando los [h1][/h1] y [h2][/h2], asi como insertar "mini-bars", que pueden tener títulos:


[img]http://tools.mediavida.com/sub.php?t=Mini-bar[/img]

Tampoco estaría de más un indice con anclas.

Ancla origen: [ancla=ID]TEXTO[/ancla] <- Si tocas aquí
Ancla destino: [ancla]ID[/ancla]<- Acabas aqui...

1 respuesta
gonya707

#32 Si, lo tenia pensado hacer, pero /pereza XD. Cuando ponga la siguiente si me encuentro motivado

bazoo

#31 A mi me salen bien, pero en mayus. Luego mirare la solución correcta.

Roger that con lo de las variables.

Tochomosca

Tremendisimo el hilo y la iniciativa, le dedicaré buenas horas en cuanto tenga algo de tiempo. Gracias!

B

Dejo esto aquí porque no sabía dónde meterlo, gonya si crees que otro hilo es más apropiado me lo dices y lo pongo ahí o abro uno nuevo:

http://pfacka.binaryparadise.com/articles/guide-to-advanced-programming-in-C.html

1 respuesta
gonya707

#36 Todo eso son cosas demasiado complicadas para los que empiezan a programar, que se supone que son el target de este hilo xD. De todos modos es material muy interesante y quizá me meta a explicar algunas de esas cosas ya en una etapa más avanzada.

JuAn4k4
  • para debugear, dios que tiempos.
    printf("He llegado aquí"); 

Venga por aportar algo, los tipos de datos:
http://en.wikipedia.org/wiki/C_data_types

Y como leerlos con el fscanf:
http://www.cplusplus.com/reference/cstdio/fscanf/

2
willy_chaos

Segundo post al que me suscribo. Ya se programar en C, pero siempre se aprende algo nuevo :).

Yo este año estoy en la universidad haciendo DPO (Java), PAED (Programacion Avanzada y Estructura de Datos), y comenzaremos con Android, asi que seguramente pueda aportar algo.

(Backtracking, etc..)

wiFlY

Estoy dentrisimo del cursillo xD

EDIT: me callo, no lei una linea que me aclaraba todas mis dudas xD

EDIT2: como se usa el comando "n"?????

EDIT3: Ya hize mis deberes, ejejjeje, me costo un par de pruebas lo de los numeros...

spoiler

editado por gonya707: te he ocultado en spoiler el ejercicio

deseando que empieze la tercera clase ejejejeje

3 respuestas
wiFlY

Una pregunta:

Yo de chavalin aprendi un poco de Qbasic y recuerdo que usabamos el comando alias para crear nuevos alias/comando. Es decir, podia meter un programita o una accion como puede ser coger dos numeros y hacer (+,-,*,%) en un solo comando.

Imagino que esto se podra hacer en C, considero que seria bastante util aprenderlo.

Saludos!!

EDIT: se me acaba de ocurrir que al igual que con "int main" abro la aplicacion o programa principal, podria hacer:

int cuentas(void){ //lo de void no se si es solo para main o no, pero yo lo pongo para luego cerrar con return

// aqui meteria todo el tema de crear los numeros y hacer las cuentas (+,-,*,%)

return 0
}

A ver, no se si esta bien. El tema es que vi a un colega crear alias/comados (asi los llamaba yo en Qbasic) en Java y mas o menos era algo asi pero con comandos java.

1 respuesta
gonya707

#40 Estan perfectos tus deberes, aunque podrias haber pedido floats y asi las cuentas se pueden hacer con decimales, pero vamos, no pasa nada.

#41 Lo que llamas alias o comando aqui se llaman funciones y es lo que has estado usando todo el rato xD fprintf y las otras instruccione son bloques de código que otras personas han escrito y que tu solo haciendo una llamada estas ejecutando. En unas lecciones más adelante aorenderemos a hacer nuestras propias funciones.

1 1 respuesta
wiFlY

#42 Lo que puse arriba de como creo que se genera una funcion esta mal por cojones, porque lo he pensado y al crear una funcion como esa en la que se operan variables tiene que ser necesario definir dichas variables, cosa que no he hecho.

Bueno, muchas gracias y esperaremos a la siguiente clase ehehehehe

1 respuesta
gonya707

#43 Pues por ahi van los tiros tampoco te creas que has estado tan equivocado

raid

Enhorabuena por la iniciativa...

Tienes curso para rato... Madre mía!!!

A los que no controlen el lenguaje y hagan el curso, han elegido bien. Es un lenguaje muy bonito.

Habrá de C++ también? (me refiero a POO)

(Yo le estuve dando un cursillo de C a un amigo por correspondencia. A partir de la lección 3 lo abandonó por imposible.. jaja.)

1 respuesta
gonya707

#45 Sí, cuando termine con C enlazaré con C++ y programacion orientada a objetos

2 1 respuesta
raid

#46 No dejas de sorprenderme...

Bueno, me pondré el de C++ en fav para repasar conceptos :D

B

Buenas.

Antes de nada, felicitarte por el curro. Esperando nuevos capítulos, que ésto en una tarde uno se lo merienda :P

Código y resultado
1 1 respuesta
wiFlY

#48 Como has hecho para que te salgan las letras con tildes escribiendolas asi en el fprintf?

1 respuesta
B

#49 Tiro de gcc en gnu/linux para compilar

gcc archivo.c -o a.out
1 respuesta
wiFlY

#50 Alumno aventajado :cool:

1
gonya707

librerías y más funciones

En la lección anterior aprendimos a usar dos funciones importantísimas, fprintf y fscanf, que servían respectivamente para usar la salidas y entradas estándar y con ello poder hablar y escuchar a nuestra máquina. Estas dos funciones, como ya se comentó, se encuentran dentro de stdio.h, la librería que incluiamos siempre en nuestros programas. Si quitamos esa linea de #include e intentamos usar fprintf o fscanf el compilador nos devolverá un error diciendo que "no tiene ni idea de que es eso de fprintf que hemos puesto en la linea X".

Asimismo también se habló de fflush, función para limpiar los buffers de entrada. fflush también pertenece a stdio.h, y junto a estas tres hay exactamente cuarenta funciones más dentro de la libreria stdio. Os iré presentando algunas de ellas a lo largo del curso cuando sea necesario su uso. Si teneis curiosidad por saber como se llaman y qué hacen podeis echarlas un ojo aquí.

La librería math.h

Nuestro programa puede llevar incluido el número de librerias que queramos y una de las más versátiles se encarga de realizar operaciones matemáticas más allá de las típicas que podíamos calcular con los operadores +-*/. Esta librería es math.h. Puesto que esta librería se encarga de operar matemáticamente con la máxima precisión posible, sólo usa numeros con decimales, pero no los float que ya conocemos, sino otro tipo, llamado de doble precisión: double.

float num1     = 232.5431;
double num2 = 232.5431;
// ambas variables guardan el mismo valor, pero num2 ocupa el doble de memoria, siendo más preciso al operar

Por cierto, si usabamos %d para los enteros y %f para floats, double usa también %f. De este modo podemos imprimir números double.

math.h tiene las siguientes utilidades:

  • Operaciones con Potencias y raices:
// sqrt -> square root, calcula la raiz cuadrada del numero de entrada
var1 = sqrt(64);

// pow ->power, calcula e; resultado de elevar el primer numero de entrada al segundo
var2 = pow(2, var1); 

//que resultados almacenan ahora var1 y var2?

Probablemente con esta notación ententais perfectamente estods dos ejemplos, pero por ser algo más ortodoxos a partir de ahora usaré el prototipo para explicar nuevas funciones. Qué es el prototipo de una función? El prototipo define en una sola linea los parametros de entrada, de salida y el nombre de la función, y nos será muy útil cuando las funciones de las librerías no nos basten y tengamos que definir las nuestras propias.

Los prototipos de las dos funciones anteriores son los siguientes:

double sqrt(double x);
double pow(double x, double y);

En el caso de sqrt, su parámetro de entrada es un número, cosa que ya sabiamos, en concreto un double, devolviendo a su salida a la izquierda otro double con el resultado de la operación. Del mismo modo pow recibe dos numeros y devuelve otro.

Procurad no liaros con todo lo que he dicho ahora, el prototipo es una manera de resumir la función en una linea, pero no tendreis que escribir double pow(double x, double y); en ningun sitio en vuestro codigo nunca. Limitaos a usar estas funciones como se hizo la primera vez, devuelven un valor y con el operador = lo metes dentro de una variable.

Otras operaciones dentro de math.h son las trigonométricas:

// seno, coseno, tangente
double sin(double x);
double cos(double x);
double tan(double x);
// arcoseno, arcocoseno, arcotangente
double asin(double x);
double acos(double x);
double atan(double x);

Logaritmos

//logaritmo en base e (logaritmo neperiano)
double log(double x);
//logaritmo en base 10
double log10(double x);

Operaciones de redondeo

//redondeo al entero más cercano
double round(double x);
//redondeo al entero menor
double floor(double x);
//redondeo al entero mayor
double ceil(double x);

math.h contiene alguna función más pero no las veo vitales a estas alturas, de todos modos la técnica a seguir no es aprenderse de memoria todas estas funciones, sino saber buscarlas cuando las necesitas. Para ello podeis ir por ejemplo aqui, que como vereis, también se usa la notación de prototipos para presentaros cada función. ;)

La librería stdlib.h

Además de stdio y math, otra de las librerías clásicas de ANSI C es la llamada librería estándar, stdlib.h.

stdlib contiene muchas funciones interesantes, pero de momento voy a limitarme unicamente a tres. La mas importante ya la habéis usado algunos en los deberes, y es system.

system("color 37");
system("tree");
//... etc

system se usa para correr comandos de la consola de windows. Exactamente los mismos con los que se navegan por los directorios y cualquier cosa del cmd.

Esta función puede tener muchas ultilidades para vuestros programas, por ejemplo:

Borrar la pantalla de la consola

system("cls");

Apagar la máquina en una hora (3600 segundos)

system("shutdown -s -t 3600");

Pausar el programa hasta el siguiente keystroke

system("pause");

A continuación una función util para cuando estéis poco inspirados dando valores.

int rand(void);

Por partes. rand se usa para obtener numeros aleatorios (random), su parámetro de entradas es void, es decir nada, por lo que su uso sería así:

int numeroMisterioso;
numeroMisterioso = rand();

rand es capar de devolver numeros enteros que siempre se encuentran entre 0 y 32767. Porque ese numero? porque es el mayor numero entero positivo que caben en 16 bits. Concretamente 32767 es en binario 0111 1111 1111 1111. Si no quereis acordaros del número concreto podeis usar la constante RAND_MAX. Las constantes son otra de las cosas que contienen las librerias. En el caso de stdlib, además de sus funciones, una de sus constantes es RAND_MAX, con el valor 32767. Podeis usar RAND_MAX libremente como si fuese una de vuestras variables por vuestro programa, pero nunca cambiar su valor.

rand por si sola es una funcion coja. Si os compilais un programa de ejemplo con rand() os va a salir siempre el mismo resultado en distintas ejecuciones. Menuda mierda de aleatoriedad no? Eso ocurre porque no estamos cambiando la semilla y está usando siempre la misma. Para cambiar la semilla se usa la siguiente función, tambien perteneciente a stdlib:

void srand(int semilla);

Como veis, recibe un numero entero como semilla (tiene que ser un numero positivo, por cierto) y no devuelve nada, void. Necesitamos pasarle un numero, y que cada vez que se ejecute el programa ese numero sea distinto, y para ello hay algo en vuestro ordenador que es perfecto para estas cosa: la hora.

La librería time.h

Esta librería es, como su propio nombre indica un paquete que contiene funciones relacionadas con el tiempo, hora del ordenador y los tiempos de ciclo de reloj de la máquina. Para no abrumar con el contenido de toda la librería de momento sólo usaremos una función, y la usaremos siempre igual, por lo que no voy a daros el prototipo (hay otra razón oculta, pero ya lo desvelaré).

time(NULL);

Esta sentencia devuelve un número que simboliza la hora del día que es. Para usar esto como semilla además recomiendo multiplicarlo por un número grande, de este modo los números aleatorios resultantes quedarán más esparcidos. Aquí presento un programa completo que imprime por pantalla 3 números aleatorios, distintos en cada ejecución.

spoiler

Deberes - Lección 3

Mucha información nueva y con ello muchas posibilidades. Las cosas que quiero que me entregueis son:

1 - Crear un programa que pregunte por los dos catetos de un triángulo rectángulo y calcule la hipotenusa. Posteriormente debe calcular los dos ángulos restantes terinando de resolver el triángulo e imprimir todos los resultados por pantalla.

2 - Crear un programa que pregunte un número entero de tres cifras y desglose en numero en centenas unidades y decenas, es posible hacerlo tan solo con int. Ejemplo de resultado: http://puu.sh/6PI58.png

3 - Otro programa parecido al anterior pero que separe parte entera de parte decimal. Hacedlo todo con doubles para evitar lios.

4 - Hacer un conversor de gradios celsius a fahrenheit, sabiendo que http://puu.sh/6PIci.png

5 - Crear un generador de numeros aleatorios que siempre de numeros exactamente entre 10 y 100

6 - Modificar los programas 1, 2 y 4 para que en vez de procesar números introducidos por el usuario lo haga con números aleatorios que genere él mismo

De momento no tenemos ningún mecanismo para comprobar que los números que se introducen son válidos. Por ejemplo en el problema 2-, que tenga tres cifras. En la siguiente lección rellenaremos el hueco de saber necesario para ello.

Procurad pensar bien los problemas, probablemente las soluciones estén por internet, pero creo que sería más constructivo que comentaseis vuestras dudas y los problemas que vais teniendo aquí

8
wiFlY

Antes de empezar con los deberes tengo una duda xD

Si os compilais un programa de ejemplo con rand() os va a salir siempre el mismo resultado en distintas ejecuciones

Que quieres decir exactamente? Porque yo con el siguiente codigo, usando rand simplemente, consigo 3 numeros diferentes.

spoiler
1 respuesta
BLZKZ

#53 pues fácil, ejecuta dos veces el programa ese que has hecho y dinos qué aparece ;)

1 1 respuesta
wiFlY

#54 Clarisimo me ha quedado xD. Que precision tiene el reloj del pc? Lo digo por que esto lo pones dos veces en un programa y se ejecuta casi al instante.

1 respuesta
gonya707

#55 pues no se la precision que tiene pero puedes probarlo. Almacena en una variable el time(NULL), pausa, espera 10 segundos y vuelve a guardar el valor de time. viendo los dos numeros te puedes dar una idea

1 respuesta
wiFlY

#56 A ver, serios problemas estoy teniendo xD No consigo siquiera que me de el cuadrado de un numero que introduzco.

spoiler

Lo de "introduce el cateto" es porque estaba haciendo el primer ejercicio y al tener problemas he copiado el codigo para ir paso por paso.

El resultado que me da es 1.#INF00

B

ojito con no controlar la entrada con scanf que se puede liar parda.

1 1 respuesta
B

#58 Explicate, no nos dejes así :qq:

1 respuesta
B

#59 resumiendo, si metes una cadena de texto superior al tamaño de la variable usando scanf sobreescribes áreas de memoria que no deberías. Puedes encontrar más info en google con "buffer overflow"

2 respuestas