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
2:35:33 pm
La imagen es la pura verdad, triste pero cierto.
Buenos post últimamente están agarrando una curva de lo mejor, saludos :).
7:38:22 pm
@Irving: Gracias por tu comentario.
Sobre la imagen.. hahaha.. si, cosas que pasan.
Saludos
7:54:25 am
Hola muy bueno el tutorial pero me da un error en el programa de leer un dato numerico…me dice que ay un error de sintaxis despues de scanf
8:02:11 am
bueno ya se a arreglado porque lo e copiado directamente de aqui…pero por curiosidad de que puede ser el error…esque e buscado y buscado y no lo encuentro
5:02:10 pm
Hola, no soy un experto en programacion, pero creo que siempre la funcion “int main()” espera un valor, sino muchos compiladores no lo compilaran correctamente, o soltaran una advertencia, y se debe poner “return 0”.
Para que la funcion main, no pida ningun valor de retorno, se debe poner “void main()”.
Todo esto hablando de lo poco que conozco, y ante todo, muchas gracias por los articulos, muy entretenidos y vistos desde un punto de vista, por lo menos para mi, desconocido.
5:32:42 pm
@Ivan F: Muchas gracias por tu aporte, lo ideal es que entre todos vayamos dando nuestros conocimientos al respecto y haciendo de esta saga de tutoriales lo mejor que se pueda.
Tal como dices, lo ideal para la función main() es declararla como void, así no se esperará ningún valor retornado. Sin embargo, tal como bien indicas, depende de cada compilador. En algunos, declarar la función como void lanza advertencias o errores, por lo que se debe declarar como int.
Para el compilador utilizado en estos tutoriales, la declaramos como int para no tener problemas y no nos pidió valor retornado, pero está muy bien que nos aportes con ese detalle, pues se nos había escapado aclararlo.
Saludos
5:12:03 pm
ojalá puedas responder.
-cuando declaramos las variable no es necesario darle un valor ?
-porque en scanf y printf los int se colocan como “d”, siendo que yo siempre ocupé los “i”
-hice este codigo y tiene error en la linea 9, a ver si puedes decirme que tengo de malo (ya lo rebice)
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int codigo, cantidad, valor, total, vuelto, pago;
int main()
{
printf(”\t Lista de productos\n”); <—–ERROR ¿¿¿??
printf(“Codigo\tNombre\tPrecio\n”);
printf(“1\tSilla\t 100\n”);
printf(“2\tMesa\t 200\n”);
printf(“3\tMueble\t 300\n”);
printf(“Ingrese el codigo del producto\t”);
scanf(“%d”,&codigo);
printf(“\nIngrese la cantidad que desea llevar:”);
scanf(“%d”,&cantidad);
if(codigo==1)
valor=100;
if(codigo==2)
valor=200;
if(codigo==3)
valor=300;
total=valor*cantidad;
printf(“\n El total es de: %d”, total);
printf(“\nIngrese el pago:”);
scanf(“%d”,&pago);
if(pago<total)
printf(“\nEl pago no es suficiente”);
else
{
vuelto=pago-total;
printf(“\nEl vuelto es de: %d”, vuelto);
}
printf(“\nVenta finalizada”);
getch()}
6:04:54 pm
@Chileno: Sobre tus preguntas:
1.- Las variables puedes declararlas y no inicializarlas, siempre y cuando estás no dependan de alguna iteración condicional para tomar un valor y después operes con ellas. Me explico:
Si tu declaras una variable suma y esta variable solo tomara un valor si entra a un determinado if y más adelante operas con esta variable, el compilador te lanzará un error, ya que en el caso de que suma no entre al if y no tome valor, estarás operando con una variable igual a Null.
Si la variable toma valor más adelante si o si, entonces no es necesario inicializar.
En este punto depende mucho también el compilador que se esté usando.
2.- d o más bien %d habla del tipo de dato que se utiliza, un decimal. (En sistemas numéricos, un decimal equivale a un entero del mundo Z de la matemática). Aún así, sigue siendo un int.
3.- Es muy probable que el error te lo lance por inicializar la variable valor, ya que esta toma datos solo si entra a alguno de los if. Aquí se aplicaría lo explicado en el caso 1, aunque no lo puedo decir con certeza, pues tendría que ver el mensaje de error que te lanza.
Como consejo, cuando salen errores de compilación, a pesar de lanzar una línea específica, en ocasiones el error está en alguna línea anterior, así que cuando te aparezca, no te cierres a solo mirar la línea en sí, sino que repasa 1 o 2 líneas anteriores en busca del error.
Espero eso te sirva.
Saludos
8:27:05 pm
Muy bueno y simple el tutorial siempre habia querido saber a programar en c++.
Mi pregunta es si pueden dar un link para descargar el programa, ya que el que tengo me dice que le falta algo llamado GNU y reviso en la carpeta y no hay nada.
Por favor
11:18:47 am
@Claud: Si te refieres al entorno de programación, puedes descargarlo desde:
http://www.bloodshed.net/
Saludos