Professional Documents
Culture Documents
La primera línea del programa es un comentario con inicio /* y final */, es obviado
por el compilador, así que no se ejecuta.
Luego sigue la línea main(), la cual es una función y forma parte de todo programa
escrito en C. Por lo tanto, todo lenguaje comienza a ejecutarse a partir de esa
función que traducida significa “principal”.
Las llaves dan inicio { y cierre } a la función principal, tampoco nunca deben faltar.
El contenido entre llaves se denomina bloque.
main()
{
printf(“Hola”);
printf(“Mundo\n”);
}
main()
{
printf(“Hola\nMundo\n”);
}
#include <stdio.h>
main()
{
int numero1, numero2, total;
printf(“Ingrese el primer entero\n”);
scanf(“%d”, &numero1);
printf(“Ingrese el segundo entero\n”);
scanf(“%d”, &numero2);
return 0;
}
La primera línea incluye una directriz del preprocesador C. Toda línea que comienza
con el numeral #, es preprocesada antes de que el programa compile. Lo que hace
#include <stdio.h> es incluir la librería estándar stdio.h en nuestro programa.
Una librería es un grupo de funciones, información o declaraciones (que ya vienen
con C o que hemos creado nosotros), y se incluyen para que puedan ser usadas en
nuestro programa.
Una variable almacena información de un tipo definido para luego ser usada en el
programa. En este caso estamos declarando tres variables llamadas numero1,
numero2 y total del tipo número entero (int). Por lo tanto, dentro de estas
variables sólo podrán almacenarse números enteros. Si quisiéramos definir una
variable que contenga números racionales, se debería declarar así: float
racional1.
La siguiente línea:
scanf(“%d”, &numero1);
La función scanf se encarga de esperar una entrada a través del teclado por parte
del usuario. En este caso el usuario debería ingresar un entero para que sea válido.
Vemos que dentro de la función scanf hay dos argumentos (los datos que recibe
una función, también llamado parámetros). Cada argumento se separa por una
coma. El primer argumento “%d”, indica el tipo de dato que debe ingresar el
usuario. En este caso el especificador de conversión %d está indicando que debe
recibirse un número entero. El carácter especial % es un carácter de escape como
la barra invertida. Luego el carácter d indica que se recibe un entero.
Luego está el otro argumento &numero1, que es la variable que hemos definido y
que guardará el primer número ingresado. El uso de ampersand & delante de
nuestra variable será aclarado más adelante. Por el momento sólo piense que indica
la dirección de memoria en donde se almacena la variable.
Aquí la función printf tiene dos argumentos. El primero imprime la cadena de texto,
y el segundo argumento, la variable que debe ser impresa en pantalla
inmediatamente después del primer texto.
numero1 = 4;
total = 3 + numero1;
total = total * total;
Ejemplo de uso:
resultado = 20 >= 2;
Almacena en la variable resultado el valor lógico TRUE (verdadero), porque la
sentencia es verdadera, 20 es mayor o igual a 2.
Los operadores lógicos tienen muchos usos que veremos más adelante.
numero1 = 4;
total = 3 + numero1;
total = total * total;
Ejemplo de uso:
resultado = 20 >= 2;
Los operadores lógicos tienen muchos usos que veremos más adelante.
Las estructuras de selección son aquellas que permiten, bajo una condición,
ejecutar distintos códigos. La más simple es la estructura de selección IF. Se da una
condición que puede ser verdadera o falsa, y se ejecuta un código u otro
dependiendo del resultado de esa condición en tiempo de ejecución. También está
la estructura de selección SWITCH que, dependiendo de un valor, ejecutará
distintos códigos.
Luego están las estructuras de repetición, las cuales repiten un código cierta
cantidad de veces hasta que se cumpla o deje de cumplir una condición. Son
ejemplos de estas estructuras en C los WHILE, los FOR, etc.
if (condición)
ejecuta esto si la condición es verdadera
else
ejecuta esto si la condición es falsa
int edad;
printf(“Ingrese su edad: \n”);
scanf(“%d”, &edad);
if (edad>=18)
{
printf(“Usted es mayor de edad. \n”);
}
else
{
printf(“Usted es menor de edad. \n”);
};
En este ejemplo, declaramos una variable llamada edad de tipo entero. Luego
imprimimos en pantalla Ingrese su edad, y con la función scanf esperamos que el
usuario ingrese un número entero.
if (condición)
{
ejecuta esto sólo si la condición es verdadera
};
switch (valor) {
case ‘1’: ejecuta esto si valor es 1
break;
case ‘2’: ejecuta esto si valor es 2
break;
case ‘3’: ejecuta esto si valor es 3
break;
default: ejecuta esto si valor no es ninguno de los anteriores
break;
};
Cada case puede ejecutar múltiples líneas de código. Todos deben terminan con un
break, que indica que debe seguirse la ejecución del programa luego de ejecutar las
líneas superiores. La ejecución continúa luego de la estructura switch. El caso
default se ejecuta si no hubo coincidencia entre el contenido de valor y los case
superiores.
int hijos;
printf(“Ingrese la cantidad de hijos que usted tiene: \n”);
scanf(“%d”, &hijos);
switch (hijos) {
case ‘0’:
printf(“No le corresponde asignación familiar por hijo\n”);
break;
case ‘1’:
printf(“Le corresponden 50usd de asignación familiar por su único
hijo\n”);
break;
case ‘2’:
printf(“Le corresponden 75usd de asignación familiar por sus dos
hijos\n”);
break;
default:
printf(“Le corresponden 100usd de asignación familiar por tener más
de dos hijos\n”);
break;
};
Se define la variable del tipo entero hijos, se le pide al usuario que ingrese el
número de hijos que posee y luego entra en acción la estructura switch, actuando
de diferentes formas dependiendo del valor de la variable hijos en tiempo de
ejecución.
while (condición)
{
bloque de instrucciones
};
int num;
num = 0;
while (num<=10)
{
printf(“Repetición numero %d\n”, num);
num = num + 1;
};
Repetición numero 0
Repetición numero 1
Repetición numero 2
Repetición numero 3
Repetición numero 4
Repetición numero 5
Repetición numero 6
Repetición numero 7
Repetición numero 8
Repetición numero 9
Repetición numero 10
¿Por qué? Vemos que iniciamos la variable del tipo entero num en cero. Luego, se
evalúa por primera vez si es menor o igual a 10, al ser verdadera, se ejecuta el
bloque dentro del while por primera vez. Se imprime Repetición numero 0, pues
el valor dentro de num es cero. Luego el proceso se repite hasta que num con
valor 10 se le suma 1, y toma el valor 11. Se evalúa la condición del while y se
determina que NO se cumple, por lo tanto, salta el bloque y sigue la ejecución del
programa.
int contador;
Repetición numero 1
Repetición numero 2
Repetición numero 3
Repetición numero 4
Repetición numero 5
Repetición numero 6
Repetición numero 7
Repetición numero 8
Repetición numero 9
Repetición numero 10
Las tres expresiones que componen la estructura for en C son opcionales, por lo
tanto se pueden omitir en ciertos casos. Si se omite la primera (la inicialización de
la variable de control), significa que la variable se inicializa en otra parte del
programa. Si se omite la segunda expresión, la estructura for entraría en un ciclo
infinito, lo cual es considerado un error. Si se omite la tercera expresión significa
que la variable de control es calculada dentro del bloque de for.
Como vemos, la tercera expresión no sólo suma contador de dos en dos sino que
además en cada repetición ejecuta la operación suma += contador.
do {
bloque de enunciados
} while (condición);
num = 1;
do {
printf(“%d\n”, num);
num = num + 1;
} while (num<=10);
1
2
3
4
5
6
7
8
9
10
La variable num vale: 11
Los enunciados break y continue son utilizados para modificar el flujo de control
dentro de un programa.
int num;
num = 1;
while (num <= 10)
{
if (num == 5)
{
break;
};
printf(“%d - ”, num);
num = num + 1;
};
Lo que sucede es que cuando la variable num toma el valor 5, la condición del
while se cumple, al ingresar al bloque se evalúa en la estructura if si num es igual
a 5 y se ejecuta el break saliendo del bloque while. Num termina valiendo 5 pues
jamás se ejecuta la suma num = num + 1.
int num;
num = 0;
while (num <= 7)
{
num = num + 1;
if (num == 5) {
continue;
};
printf(“%d - ”, num);
};
1–2–3–4–6–7
Algunos programadores dicen que el uso del break y del continue dentro de las
estructuras de control (excepto el break en la estructura switch) viola las normas
de la programación estructurada. Lo cierto es que no es necesario el uso de break
y continue si se utilizan las estructuras correctas
Ya habíamos visto algunos operadores que resultaban en un verdadero (true) o un
falso (false) al usarse con números o variables, estos eran:
== operador de igualdad en C
!= operador de desigualdad
> mayor
< menor
>= mayor o igual
<= menor o igual
valor = (!expresion1)
En este caso si la expresión es verdadera, valor resulta falso.
Si la expresión es falsa, valor resulta falso.
Los módulos en C se llaman funciones. Existen dos tipos de funciones con las que se
arman programas: las que son creadas por los usuarios y los paquetes de funciones
predefinidos disponibles en la biblioteca estándar de C. Estos últimos contienen
cientos de funciones básicas para el cálculo de funciones matemáticas,
manipulación de cadenas de caracteres, funciones de entrada-salida, etc. Son
funciones que suelen usarse frecuentemente en la construcción de programas y, al
estar predefinidas, ahorran tiempo a los programadores. Por eso es útil
familiarizarse con las funciones de la biblioteca estándar de C, pues al conocer
estas funciones podremos ahorrarnos de escribir mucho código, además cuentan
con la ventaja de ser altamente eficientes y generalmente portables.
En tanto las funciones creadas por el programador son aquellas escritas para
resolver tareas que generalmente no están en la biblioteca estándar y sirven para
cumplir con el propósito del programa a crearse.
Las funciones son invocadas mediante una llamada de función; esto se logra
escribiendo el nombre de la función y la información de entrada necesaria
(parámetros o argumentos) para que ésta pueda lograr su cometido. Ya hemos
visto ejemplos de funciones con sus parámetros, por ejemplo: printf(“Hola
Mundo\n”); Allí se está llamando a la función printf con el argumento “Hola
Mundo\n”, que es una cadena. El resultado es la impresión en pantalla del ese
texto.
#include <stdio.h>
int cuadrado(int);
main()
{
int numero;
int cuadrado(int y)
{
int resultado;
resultado = y * y;
return resultado;
}
En este programa hemos creado la función llamada cuadrado que recibe un entero
para calcular el cuadrado de dicho número. Analizaremos paso por paso el
programa anterior.
Se incluye la librería stdio.h porque utilizamos las funciones printf y scanf. A
continuación se hace el prototipado de nuestra función cuadrado. Es necesario
escribir el prototipo de todas las funciones que creemos. En este caso el prototipo
es: int cuadrado(int);
enunciados
}
Dentro del enunciado de las funciones se debe regresar el control al punto desde
donde se invocó a dicha función. En el caso de las funciones que no regresen
resultados, estas finalizan cuando termina de ejecutarse la última línea de la
función o cuando se llega al enunciado return. Si la función devuelve un resultado,
se debe especificar cuál siguiendo la siguiente forma: return expresión;
Para terminar el tema debemos recordar, como consejo, que la mejor práctica al
programar es modularizar o sea, crear múltiples funciones simples que trabajarán
juntas para crear un programa complejo.
Este prototipo indica que la función de nombre máximo retorna como resultado un
valor de tipo entero. Además informa que la función debe ser llamada con tres
parámetros del tipo entero también.
Hay dos formas de llamar a funciones en C, por valor o por referencia. Cuando los
parámetros de una función son pasados por valor, los parámetros son copiados y
esas copias son pasadas a la función; esto significa que los valores originales no se
modifican. En otras palabras, las modificaciones que se les hagan a las copias
dentro de la función llamada no afectan los valores originales de las variables con
las cuales se llamó la función.
Por otra parte, cuando los parámetros son pasados por referencia, puede alterar los
valores originales de las variables con las cuales se ha llamado la función (si es que
los altera en la función).
Por defecto todas las llamadas a funciones son por valor, a menos que se
especifique lo contrario.
En otras palabras, las reglas de alcance definen hasta dónde un identificador puede
ser usado.
*El único identificador que tiene alcance de función, o sea, sólo es visible y
referenciable dentro de una función, son las etiquetas.
*Los identificadores que son declarados dentro de un bloque (como puede serlo una
función), sólo tienen alcance de bloque, por lo tanto sólo son visibles dentro de ese
bloque y sus bloques anidados (si es que los hay). Por ejemplo, las variables locales
declaradas dentro de una función sólo son visibles dentro de esa función. Lo mismo
para los parámetros de dicha función, que son tratados como variables locales.
*Los únicos identificadores con alcance de prototipo de función son aquellos que se
utilizan en la lista de parámetros del prototipo de una función.
Hasta el momento, las únicas funciones que hemos estudiado han sido llamadas
desde otra función; pero es posible crear funciones que puedan llamarse a sí
mismas, estas son llamadas: funciones recursivas.
Una función puede ser recursiva tanto de forma directa (si es llamada a sí misma) o
de forma indirecta (si llama a una función que luego la llama).
Existen algunos problemas que pueden ser resueltos de forma más eficiente (o su
resolución puede ser más naturalmente pensada) utilizando funciones recursivas.
Para que esto no suceda una función recursiva debe ser muy bien pensada.
Principalmente una función recursiva debe saber resolver el caso más simple,
llamado caso base. Si la función es llamada con el caso base, inmediatamente
retorna el resultado (no necesita volver a llamarse a sí misma para poder
resolverlo).
El cálculo de factorial es posible hacerlo tanto con una estructura de control como
usando una función recursiva. El código de la función recursiva puede ser:
Se iniciará la ejecución de la función pero esta vez con el número 4. Este proceso se
repetirá tantas veces como sea necesario hasta que la variable numero sea el caso
base, o sea 1. Una vez que se llega al caso base, comienza a calcular el factorial (de
atrás hacia adelante).