Ya dejando un poco atrás la locura navideña, y preparándonos para recibir este año 2009, hemos decidido hacer un alto de las festividades (en confabulación con nuestro “maravilloso” servicio de hosting que nos ha fallado a diestra y siniestra, por lo que ofrecemos nuestras disculpas) y traerles un nuevo número de esta gran saga que ha sacado chispas busca darles una pequeña manito durante sus primeros pasos del mundo de la programación.
En el número anterior, nos adentramos en nuestro primer lenguaje real, C, haciendo una larga introducción y comparación con lo que habíamos visto hasta ahora, terminando con nuestro primer programa. En esta ocasión, seguiremos adentrándonos más en el tema y terminaremos con la confección de un programa algo más complejo.
Así que sin más espera, los invitamos a seguirnos después del salto, que no es en verdad un salto, sino que un “leer más”.
Nota: Como es habitual, les recomendamos, si no lo han hecho ya, leer los números anteriores de esta saga, que pueden encontrar en la categoría de Programación de CLH.
Tal como prometimos en el número anterior, en este veremos los siguientes contenidos:
Veremos bastante hoy, así que vamos, manos a la obra:
Si nos hemos fijado hasta ahora, siempre que realizamos algún ejemplo o ejercicio de código, en C, Pseudo-código o bien en nuestros tutoriales de PHP, siempre ponemos las explicaciones entre unos símbolos /* y */.
Esto, junto a otros símbolos, es lo que en la programación (a todo nivel) se conoce como comentarios.
Los comentarios en la programación, si bien no son obligatorios, se convierten en una herramienta util y su mayor función es entregarnos la posibilidad de añadir pequeñas anotaciones sobre lo que estimemos conveniente, ya sea sobre el código propiamente tal u otras cosas como notas de autoría o funcionamiento del programa en sí.
¿Por qué usar comentarios?
Principalmente por un tema de orden. Tenemos que pensar de que si bien nuestra memoria puede ser excelente, en más de alguna ocasión nos tocará revisar códigos que hayamos realizado hace algún tiempo y puede que en ese programa hayamos utilizado alguna función o lógica que no tiene sentido en este momento. Por eso el uso de comentarios nos simplifica el tener que estar mucho tiempo deduciendo lo que alguna vez hicimos. Lo mismo se presta para cuando nuestro código es revisado por terceros o bien nosotros revisamos códigos hechos por alguien más.
Hay 2 formas de comentarios: los de línea simple y los de múltiples líneas. La única diferenciación es en los símbolos que utilizamos para iniciar y terminar los comentarios.
Cuando los comentarios son de línea simple solo debemos añadir al principio de la línea el símbolo // . Debemos tener en cuenta de que solo será válido como comentario lo que escribamos en la misma línea. Si pasamos a otra línea lo tomará como código y nos lanzará error, por lo que debemos utilizar símbolo de comentario de múltiples líneas.
Para múltiples líneas, utilizamos el mismo que hemos usado hasta ahora, o sea al principio del comentario ponemos /* y al final del comentario cerramos con */. Todo lo que escribamos entremedio será considerado como comentario.
De cualquier forma, si es que les complica recordar los símbolos para cada caso, pueden utilizar siempre el formato de múltiples líneas, que cubre comentarios ya sea en 1 línea o en varias.
Cuando trabajabamos en Pseudo-código, una de las funcionalidades que más utilizabamos, era la lectura o recepción de datos ingresados por un usuario vía teclado. Eso nos permitía interactuar de una mayor forma con quien utilizaba el programa y realizar procesamientos mucho mejores y personalizados.
Pues bien, en C también podemos leer datos desde teclado, de una forma tan similar como en pseudolenguaje. Si recordamos el tutorial anterior, hablábamos de la función scanf, la cual nos permitía realizar esa tarea y que se utiliza de la siguiente forma:
scanf("%tipodevariable", &nombredelavariable);
Como podemos observar, esta función presenta 2 parámetros: %tipodevariable (entre comillas) y &nombredelavariable, los cuales a su vez presentan 2 signos: % y &. Vamos por parte explicando:
Con esas definiciones claras, veamos un pequeño ejemplo, para lo que utilizaremos el entorno de programación que instalamos en el número anterior:
Ejemplo: Realizar un programa que lea un dato numérico por teclado y luego mostrarlo por pantalla. (La explicación del código, como siempre en negrita, cursiva y entre /* y */.
#include <stdio.h> #include <stdlib.h> #include <conio.h> /* Partimos por agregar las librerías necesarias para nuestro programa, incluida la conio.h para hacer uso de la función getch( ); */ int numero; /* Declaramos una variable llamada numero de tipo int */ int main( ) { /* Declaramos la función main o principal */ printf("Ingrese un numero del 1 al 10: "); /* Mostramos un mensaje al usuario para que ingrese un numero del 1 al 10 */ scanf("%d", &numero); /* Con scanf leemos el dato, indicando con %d que es un dato de tipo int e indicamos que guardaremos la información en el área de memoria de la variable numero poniendo &numero */ printf("Ingreso el numero %d", numero); getch(); /* Mostramos el numero que ingreso el usuario, poniendo un mensaje con printf y en la posición donde mostraremos el número ponemos el símbolo correspondiente al tipo de dato, o sea %d, y luego de la coma la variable que mostraremos. En la línea siguiente ponemos un getch ( ); para que el programa quede en espera hasta que presionemos una tecla y así podamos ver el resultado antes que se cierre */ } // Cerramos llave de la función main.
Compilamos el programa y no deberíamos tener errores. Lo ejecutamos y probamos que funcione.
Así de simple es la captura de datos vía teclado.
Las iteraciones condicionales en C son bastante similares a las que vimos en pseudocódigo (Si y Si No, Switch) y cumplen exactamente la misma función, esto es, ejecutar una serie de acciones a partir del cumplimiento de una condición. No entraremos en mayor detalle, pues lo vimos de forma bastante completa en el pasado.
En lo que si adentraremos es en como se usan en C:
Si y Si no
En C se utiliza de la misma forma, radicando la diferencia en que en vez de ser Si y Si no, hablamos de if y else. Esta iteración tiene las mismas características que en pseudo, o sea, todo else debe ir luego de un if y dentro de un if y de un else pueden ir múltiples if y elses. La forma de declaración es:
if(condición) { sentencia 1; sentencia 2; } else { sentencia 3; sentencia 4; }
Cuando utilizamos if y else, podemos o no usar llaves para abrir y cerrar el if. Cuando un if y/o un else tienen solo una sentencia a ejecutar, podemos escribirlos sin llaves para abrir y cerrar. Si es más de una sentencia, necesariamente deben llevar llaves. Si desean, para evitar confusiones, podemos utilizar siempre las llaves.
Veamos un ejemplo ampliando el caso anterior. También pediremos un dato al usuario, pero en vez de mostrarlo lo someteremos a un simple if y else para ver si el número es mayor a 5:
#include <stdlib.h> #include <stdio.h> #include <conio.h> int numero; int main() { printf("Ingrese un numero del 1 al 10: "); scanf("%d",&numero); /* Primero vemos con un if si el numero es igual a 5. Recordemos que para comparar utilizamos doble signo igual */ if(numero == 5) printf("El numero ingresado es 5"); else // Si no es igual a 5 if(numero > 5) // Si es mayor a 5 mostramos el mensaje printf("El numero ingresado es mayor a 5"); else // Si es menor a 5 mostramos el mensaje printf("El numero ingresado es menor a 5"); getch(); }
A medida que vayamos avanzando, el uso de if y else será más complejo y largo, pero la lógica es básicamente la misma.
La iteración switch la veremos en el próximo número, ya que implica un mayor nivel de detalle y no queremos extendernos por sobre los demás contenidos de momento.
Tal como las iteraciones, en pseudolenguaje también definimos y utilizamos ciclos y búcles que cumplen la misma funcionalidad que en C, por lo que no nos desviaremos definiendo nuevamente esos temas, si no que veremos cada caso para C y luego un ejemplo que los reune a todos.
Mientras
El ciclo mientras que usabamos en Pseudocódigo, en C (y otros lenguajes) es conocido como while y es uno de los más usados. La forma de utilizarlo es la misma, o sea:
while(condición) { sentencia 1; sentencia 2; }
Tal como en Pseudo, este ciclo sólo se ejecutará (y se mantendrá en ejecución) mientras la condición se cumpla.
Para
Este ciclo en lenguaje C es conocido como for y se utiliza de la misma forma, o sea:
for(inicialización de variable ; condición ; aumento o decremento de la variable) { sentencia 1; sentencia 2; sentencia 3; }
Tal como en el caso del ciclo while, este ciclo se continuará ejecutando mientras se cumpla la condición, pero a diferencia del anterior, este siempre se ejecutará, ya que la variable para la condición se inicializa dentro del propio ciclo.
Haga mientras
Corresponde al ciclo do-while, bastante similar al caso del while pero con 2 diferencias. Este ciclo se ejecutará al menos 1 vez aunque la condición no se cumpla y el while del final debe ir con punto y coma, o sea:
do { sentencia 1; sentencia 2; sentencia 3; }while(condición);
Tal como en pseudolenguaje, hay ocasiones ideales para el uso de cada tipo de ciclo, pero en muchas ocasiones podemos usar cualquiera de los 3 y dependerá más que nada del gusto personal.
A continuación veremos un ejemplo en donde utilizaremos los 3 ciclos para resolver un mismo problema.
Ejercicio: Enumerar del 1 al 10 utilizando los 3 ciclos vistos hasta ahora.
#include <stdlib.h> #include <stdio.h> #include <conio.h> int numero; int main() { numero=1; // Asignamos el valor inicial a la variable while(numero<=10) // Partimos con un ciclo while { printf("%d\n",numero); /* Mostramos el número y utlizamos \n para hacer salto de línea */ numero++; // Incrementamos el valor } for(numero=1;numero<=10;numero++) // Seguimos con un ciclo for especificando los parámetros { printf("%d\n",numero); // Mostramos el número } numero=1; // Reinicializamos el número a 1 do // Terminamos con un ciclo do-while { printf("%d\n",numero); // Mostramos el número numero++; // Incrementamos el valor }while(numero<=10); // Definimos la condición getch(); // Dejamos el programa en espera }
Luego de compilar y ejecutar podemos ver que como resultado se enumerará del 1 al 10, 3 veces seguidas, 1 por cada ciclo que definimos.
Ahora que hemos visto aspectos básicos del lenguaje C, desarrollaremos un ejercicio en el que combinaremos todos los conocimientos adquiridos hasta ahora.
Lo que haremos será programar un terminal de venta simple, en donde primero desplegaremos una lista de productos, luego pediremos el código del producto, la cantidad que se desea llevar y mostraremos el total a cancelar. No nos complicaremos mucho y en el futuro iremos añadiendo nuevas funcionalidades. Así que manos a la obra:
#include <stdlib.h> #include <stdio.h> #include <conio.h> int codigo, cantidad, valor, total, vuelto, pago; /* Declaramos las variables que usaremos, todas de tipo int */ int main() { printf("\t Lista de productos\n"); /* Partimos por listar los productos, utilizamos \t para separar los textos, tal como si utilizaramos la tecla TAB */ printf("Codigo\t Nombre\t Precio\n"); printf("1\t Silla\t 100\n"); printf("2\t Puerta\t 350\n"); printf("3\t Sillon\t 200\n"); printf("\nIngrese el codigo del producto que desea llevar: "); /* Solicitamos el código del producto*/ scanf("%d",&codigo); /* Leemos el código */ printf("\nIngrese la cantidad que desea llevar: "); /* Solicitamos la cantidad que llevarán */ scanf("%d",&cantidad); /* Leemos la cantidad */ if(codigo==1) /* Comparamos mediante iteraciones el código para asignar el valor total */ valor=100; if(codigo==2) valor=350; if(codigo==3) valor=200; total=valor*cantidad; /* Multiplicamos el valor por la cantidad para obtener el total */ printf("\nEl total es de: %d",total); /* Mostramos el total */ printf("\nIngrese el pago: "); /* Solicitamos el pago */ scanf("%d",&pago); /* Leemos el pago */ if(pago<total) /* Vemos mediante un if si el pago es suficiente */ printf("\nEl pago no es suficiente"); else { vuelto=pago-total; /* Obtenemos el vuelto */ printf("\nEl vuelto es de: %d",vuelto); /* Mostramos el vuelto */ } printf("\nVenta finalizada"); /* Damos el mensaje de despedida */ getch(); }
Y así tenemos nuestro simple terminal de venta. Como podemos apreciar, este programa no es lo suficientemente óptimo, ya que solo podemos realizar 1 venta por sobre 1 sólo producto, así que su aplicación es bastante limitada. Para poder realizar múltiples ventas o 1 venta de múltiples productos es necesario el uso de ciclos para poder repetir las acciones necesarias.
Desde ya los incentivamos a que vayan modificando este programa y agregando esa funcionalidad. De cualquier forma en las próximas lecciones le iremos añadiendo más y más cosas a este programa para crear una aplicación mucho más completa.
Con esto damos por terminada la lección de hoy, hemos cubierto bastante y aún nos queda un largo camino por recorrer, así que mucha paciencia.
En la próxima edición de Como aprender a programar y no morir en el intento veremos:
Recuerden que como siempre, este tutorial ha sido:
Esperamos que este tutorial haya sido de utilidad para Uds.
Muchas gracias por leer, y será hasta una próxima oportunidad.
Staff CLH
8:19:52 am
Hola a todos y gracias por ésta maravillosa guia… (elogios xD).
He de decir que mi experiencia en el mundo de la informática viene ya desde hace 15 años como explotación de sistemas, administración y chapurreo de desarrollo. Siempre he querido aprender a programar y uno de mis problemas es que soy autodidacta. Llevo años haciendo cursos de programación en php, java, ajax, java-script, mysql, etc, pero mi problema siempre era el mismo. Entiendo los lenguajes de programación pero no conocía lo que era el desarrollo en sí.(no sé si me explico) por muchas guias, manuales etc que leí nunca me explicaron cómo hay que empezar a desarrollar un programa. Bien he de felicitaros por vuestra labor ya que estoy siguiendo vuestro curso y lo estoy consiguiendo, ahora mismo estoy en la parte 8 y creo que había llegado el momento de escribir. Por cierto, el algoritmo del huevo frito me sirvió de mucha ayuda xD en fn, a lo que voy, he desarrollado el ejercicio que proponeis arriba y sólo tengo una pequeña duda. Al grano:
La aplicación funciona correctamente salvo por un detalle y no sé si es un problema de compilación o que falte alguna expresión como en otros lenguajes parseint o algo así…
El tema es que el fallo creo que viene en la lina donde damos el valor al total
total=valor*cantidad;
he escrito tanto que no sé si se me entiende.
Total la declaramos arriba como int y le estamos pasando una cadena de caracteres aunque estén llenos de valores decimales, el tema es que el resultado que me muestra no me lo muestra correctamente, si por ejemplo elijo código 1 (silla) cantidad 1 el valor de total es igual a 4210832 , no entiendo de donde saca ese valor, el caso es que si elijo la opción 2 y cantidad 1 mostraría el mismo valor 4210832.
Me tiene un poco loco… Ayuda por favor.
Salu2
9:46:48 am
Bien pues tras hacer varias pruebas simples determino que el teclado no me lo lee correctamente o sí pero ¿que lee?
una prueba fácil
#include<stdlib.h>
#include <stdio.h>
#include <conio.h>
int numero;
int main()
{
printf(“Ingresa un numero:\t”);
scanf(“%d”,&numero);
printf(“%d”,&numero);
getch();
}
// el resultado que me da si introduzco cualquier numero es:
4210784
Algún problema hay con la lectura del teclado…
1:08:55 pm
problema resuelto!!!!!
el tema estaba en que en el printf(“%d”,total);
escribía también &( ej:printf(“%d”,&total);) y entonces lo que mostraba era la dirección de lamemoria.
3:33:17 pm
@villar: Exactamente, cuando en un printf pones el símbolo & al lado de la variable, te mostrará la dirección de memoria en la que se encuentra en vez de su contenido. Felicitaciones por deducir el problema, esa es una de las tareas más importantes en la programación, el poder llegar a la solución de los problemas y ser perseverante.
Gracias por tus buenos comentarios. Saludos!
3:08:59 pm
Muy buenos los tutoriales pero tengo una duda:
En el ejemplo de iteraciones condicionales no me reconoce el ultimo else, cada ves que ingreso un numero distinto a 5 me lo toma como mayor sin importar que este sea menor.
Aqui el codigo:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int numero;
int main()
{
printf (“ingrese un numero del 1 al 10:”);
scanf(“%d”,&numero);
if(numero==5)
printf(“el numero es 5”);
else
if(numero < 5)
printf(“numero mayor a 5”);
else
printf(“Numero menor a 5”);
getch();
}
como dije antes no me toma el ultimo else
De antemano agadesco a quien responda.
4:56:06 pm
@Luis2477: Te falta una llave abriendo en el else donde incluyes el if(numero < 5) …etc . Ahí te debiera tomar todo sin problemas.
Saludos!
5:09:20 pm
Gracias por tu respuesta tambien note otro error puse “<” en vez de “>”
Me quedo de esta forma y ahora funciona:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int numero;
int main()
{
printf (“ingrese un numero del 1 al 10:”);
scanf(“%d”,&numero);
if(numero==5)
printf(“el numero es 5”);
else
if(numero > 5) /*esta fue la que modifique*/
printf(“numero mayor a 5”);
else
printf(“Numero menor a 5”);
getch();
}
1:59:05 am
hola
sobre el primer ejercicio de esta parte.-
como dice villar devuelve 4210704, pero en parte 7 hay otro ejercicio igual y devuelve el numero que el usuario ingresa, cual es la diferencia con este de la parte8? no entiendo
parecen los dos identicos…
2:09:50 am
bueno no esta ese ejercicio en parte 7 pero hice un ejercicio aca que devuekve el valor que el usuario ingresa…
4:28:13 am
en el 2° ejercicio sobre la venta
como se hace para que en el total aparesca el precio en $ y no el numero del lugar del espacio de memoria que ocupa?