Professional Documents
Culture Documents
______________________________________________________________________________
PLAN DE TRABAJO
IINNTTRROODDUUCCCCIIÓÓNN
Este texto fue elaborado tomando apartes de muchos de los manuales que existen en
Internet los cuales se has revisado y adaptado con la intención que su nivel sea el
razonable para una asignatura de “Programación en la media técnica” o similar, aunque
quizá algunos centros (especialmente universitarios) exijan un nivel más alto que el que
se cubre.
Está organizado de una forma ligeramente distinta a los libros de texto “convencionales”,
procurando incluir ejercicios prácticos lo antes posible, para evitar que un exceso de
teoría en los primeros temas haga el texto pesado de seguir.
Aun así, este texto no pretende “sustituir a un profesor”, sino servir de apoyo para que
los alumnos puedan tener una guía para desarrollar sus prácticas. Pero es trabajo del
profesor aclarar las dudas que surjan y proponer muchos más ejercicios que los que
figuran aquí.
Es necesario dejar claro, que el modulo no pretende ser un nuevo manual o texto guía,
ya que de estos existen muchos en Internet, por ello tomamos apuntes de varios de
estos buenos sitios (manuales) y lo único que se hizo fue darles un orden y adaptación a
las necesidades del presente curso. Los sitios más utilizados para elaborar este modulo
fueron: http://www.nachocabanes.com - www.monografias.com (Br. Manuel Antonio
Ortez), www.monografias.com (Isabella Merici Miranda Vasquez), a quienes
agradecemos por sus buenos trabajos.
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
IINNTTEEGGRRAACCIIÓÓNN DDEELL M
MÓÓD
DUULLO
O PPO
ORRU
UNNIIDDAADDEESS
LENGUAJE C++
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante distinga los conceptos básicos involucrados en el
lenguaje de programación C++
JJUUSSTTIIFFIICCAACCIIÓÓNN
El lenguaje de programación C está caracterizado por ser de uso general, con una
sintaxis sumamente compacta y de alta portabilidad.
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
1. Introducción
2. Estructura de Un programa en C
3. Lenguaje de Programación Estructurado C
4. Sintaxis de Algunos Elementos de Un Programa en C
5. Tipos de Datos en C
6. Tipos de Variables
7. Constantes
8. Entrada / Salida
9. Salida Hacia Pantalla [printf()]
10. Secuencias de Escapes
11. Entrada Desde Teclado
12. Operadores, Expresiones
13. Operadores
14. Expresiones
IINNTTRROODDUUCCCCIIÓÓNN
El lenguaje de programación C está caracterizado por ser de uso general, con una
sintaxis sumamente compacta y de alta portabilidad.
La descripción del lenguaje se realiza siguiendo las normas del ANSI C, por lo tanto, todo
lo expresado será utilizable con cualquier compilador que se adopte; sin embargo en
algunos casos particulares se utilizaron funciones Compilador ó Sistema Operativo-
dependientes, explicitándose en estos casos la singularidad de las mismas.
E
ESSTTRRUUCCTTUURRAA DDEE UUNN PPRROOGGRRAAM
MA NC
A EEN C++++
Antes de iniciar los conceptos propios del lenguaje C es necesario, primero; mencionar
algunos de los errores típicos al programar, para que el lector sepa como identificarlos y
así los pueda corregir.
ERROR DE SINTAXIS: Estos errores son producidos, cuando se hace mal uso de las
reglas del lenguaje de programación, y se violan las normas de sintaxis, de ese lenguaje
(en nuestro caso C); estos errores son fáciles de detectar por que generalmente es el
compilador, que los identifica (Y hasta muestra la línea donde se encuentra dicho error,
pero eso depende de la versión del compilador que estemos usando).
#include
#define
ejemplo:
#include <stdio.h>
#include <math.h>
#inlcude <stlib.h>
Es necesario aclarar que esto se hace al inicio del programa, y las declaratorias deben
llevar el símbolo de numeral (#) seguido de la sentencia “include”, y entre signos de
mayor y menor que (<>) el nombre de la directiva.
• Declaraciones Globales
Pueden ser:
• Prototipos de Funciones: También llamadas declaraciones de funciones, lo cual
se tratará más adelante
• Declaraciones de Variables
Cabe destacar, que esto se hace seguido de los #include y los #define.
main()
{
declaraciones locales /*Comentarios */
sentencias
}
La función main() va al inicio, luego abrimos llaves y dentro de ellas van las declaraciones
de variables, las sentencias de lectura, cálculos, asignaciones e impresiones, y con la
última llave ( } ), le indicamos el final del programa.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
float radio, area;
printf("Radio=\n");
scanf("%f", &radio);
area=3.14159*radio*radio;
printf("El Area es %f\n\n", area);
getch();
return 0;
}
Explicación:
Le indicamos al compilador, que usaremos las bibliotecas <stdio.h> y <conio.h>, ¿por qué
<conio.h>?, por que esta biblioteca, contiene las funciones getche(), getch(), etc., y de
una de ellas hacemos uso en este pequeño ejemplo.
Declaramos, como valores reales, las variables radio y área (de esto se hablará más
adelante). Luego, con la instrucción printf(), mostramos en pantalla el mensaje (Radio=) y
scanf se encarga de leer el valor digitado por el usuario. Posteriormente area, es igual al
la multiplicación de pi (3.14159), el radio al cuadrado. Se muestra en pantalla ese
resultado, luego el programa espera que se presiones cualquier tecla (getch() ) y no
retorna ningún valor (return 0).
A
ACCTTIIVVIIDDAADD…
…
1. Indique que tipo de error (Error de sintaxis, error de ejecución o error lógico), en cada
uno de los siguientes enunciados
• Al cometer este error, los resultados arrojados por el programa no son los que se
esperaban: ______________________________________________
Los frutos de ésta técnica se reflejan cuando, queremos darle mantenimiento al programa,
es más fácil hacerlo ya que hemos programado de una manera lógica y ordenada. Al
igual que al momento de corregir errores de sintaxis y lógica, esta técnica nos facilita el
trabajo.
Ahora iniciemos, de una vez por todas, lo que el lector está esperando:
S
SIINNTTAAXXIISS DDEE AALLGGUUNNOOSS EELLEEM
MEEN
NTTO
OSS D
DEE U
UNN PPR
ROOG
GRRA
AMMA NC
A EEN C
Identificadores:
Como su nombre lo indica, estos son los nombres, con los que identificamos las variables,
constantes, funciones, vectores, etc., de nuestro programa. Para ello debemos tener
presente algunas reglas:
Ejemplo:
Correctos
c2
_c2
Incorrectos
2c
2c
• No es lo mismo una minúscula que una mayúscula, ya que c distingue de entre ellas.
Ejemplo: BETA ≠ Beta ≠ beta ≠ BeTa
• No son válidos los identificadores de palabras reservadas. En un inicio hablamos que c
posee 32 palabras reservadas, entre ellas están:
Comentarios
En todo programa que estemos diseñando en C (o en cualquier otro lenguaje de
programación); es necesario insertar ciertos comentarios en el código, para que en
posteriores modificaciones y cuando se realice el mantenimiento, se puedan recordar
cosas importantes ya que, en los comentarios, se pueden incluir aspectos importantes del
programas, explicaciones del funcionamiento de las sentencias, etc.
/*este es un comentario en C */
/*Podemos colocar mucha información importante
de nuestro Programa */
La Directiva #include
Permite que, el preprocesador, incluya funciones proporcionadas por el fabricante, a
nuestro programa.
Ejemplo:
La directiva #define
Permite definir constantes simbólicas. Pero hasta ahora ha sido poco lo que se ha
hablado acerca de las constantes, es por ello que aprovechando este especio; se
dedicarán unas cuantas líneas para aclarar ello.
Las variables pueden cambiar de valor, durante la ejecución del programa, por eso es que
se llaman variables. Y las constantes como su nombre lo indica, son valores que
permanecen constantes durante toda la ejecución del programa, un ejemplo de ello, es el
valor de π (pi) que equivale a 3.14159....
Ejemplo:
#define N 100
#define PI 3.1416
#define B 45
/ % ^ & * () - + {} [] \ ; : <> ¿ .
#include <stdio.h>
#include <conio.h>
main()
{
float radio, area;
printf("Radio=\n");
scanf("%f", &radio);
area=3.14159*radio*radio;
printf("El Area es %f\n\n", area);
getch();
return 0;
}
Ejemplo:
{
...
printf(“Hola\n\b”);
...
}
Ejemplo:
b = c + d; d = 2*k;
Un tipo de dato, se define como un conjunto de valores que puede tener una variable,
junto con ciertas operaciones que se pueden realizar con ellas.
Definición de Variables
Si se desea imprimir los resultados de multiplicar un número fijo por otro que adopta
valores entre 0 y 9, la forma normal de programar esto sería crear una CONSTANTE para
el primer número y un par de VARIABLES para el segundo y para el resultado del
producto. Una variable, en realidad, no es más que un nombre para identificar una (o
varias) posiciones de memoria donde el programa guarda los distintos valores de una
misma entidad. Un programa debe DEFINIR a todas las variables que utilizará, antes de
comenzar a usarlas, a fin de indicarle al compilador de que tipo serán, y por lo tanto
cuanta memoria debe destinar para albergar a cada una de ellas. Veamos el EJEMPLO:
Ejemplo:
#include <stdio.h>
main()
{
int multiplicador; /* defino multiplicador como un entero */
int multiplicando; /* defino multiplicando como un entero */
int resultado; /* defino resultado como un entero */
multiplicador = 1000 ; /* les asigno valores */
multiplicando = 2 ;
resultado = multiplicando * multiplicador ;
printf("Resultado = %d\n", resultado); /* muestro el resultado */
return 0;
}
En las primeras líneas de texto dentro de main() defino mis variables como números
enteros , es decir del tipo "int" seguido de un identificador (nombre) de la misma. Este
identificador puede tener la cantidad de caracteres que se desee, sin embargo de acuerdo
al Compilador que se use, este tomará como significantes sólo los primeros n de ellos;
siendo por lo general n igual a 32. Es conveniente darle a los identificadores de las
variables, nombres que tengan un significado que luego permita una fácil lectura del
programa. Los identificadores deben comenzar con una letra ó con el símbolo de
subrayado "_”, pudiendo continuar con cualquier otro carácter alfanumérico ó el símbolo
"_”. El único símbolo no alfanumérico aceptado en un nombre es el "_”. El lenguaje C es
sensible al tipo de letra usado; así tomará como variables distintas a una llamada
"variable”, de otra escrita como "VARIABLE". Es una convención entre los programadores
de C escribir los nombres de las variables y las funciones con minúsculas, reservando las
mayúsculas para las constantes.
Vemos en las dos líneas subsiguientes a la definición de las variables, que puedo ya
asignarles valores (1000 y 2) y luego efectuar el cálculo de la variable "resultado". Si
prestamos ahora atención a la función printf(), ésta nos mostrará la forma de visualizar el
valor de una variable. Insertada en el texto a mostrar, aparece una secuencia de control
de impresión "%d" que indica, que en el lugar que ella ocupa, deberá ponerse el
contenido de la variable (que aparece luego de cerradas las comillas que marcan la
finalización del texto, y separada del mismo por una coma) expresado como un número
entero decimal. Así, si compilamos y corremos el programa, obtendremos una salida :
Inicialización de variables
Las variables del mismo tipo pueden definirse mediante una definición múltiple
separándolas mediante “, " a saber:
#include <stdio.h>
main()
{
int multiplicador=1000, multiplicando=2 ;
printf("Resultado = %d\n", multiplicando * multiplicador);
return 0;
}
TTIIPPOOSS DDEE V
VAARRIIAABBLLEESS
De acuerdo a la cantidad de bytes que reserve el compilador para este tipo de variable,
queda determinado el "alcance" ó máximo valor que puede adoptar la misma.
Debido a que el tipo int ocupa dos bytes su alcance queda restringido al rango entre -
32.768 y +32.767 (incluyendo 0 ).
En caso de necesitar un rango más amplio, puede definirse la variable como "long int
nombre_de_variable" ó en forma más abreviada "long nombre_de_variable"
A la inversa, si se quisiera un alcance menor al de int, podría definirse "short int " ó
simplemente "short", aunque por lo general, los compiladores modernos asignan a este
tipo el mismo alcance que "int".
Para variables de muy pequeño valor puede usarse el tipo "char" cuyo alcance está
restringido a -128, +127 y por lo general ocupa un único byte.
Todos los tipos citados hasta ahora pueden alojar valores positivos ó negativos y, aunque
es redundante, esto puede explicitarse agregando el calificador "signed" delante; por
ejemplo:
signed int
signed long
signed long int
signed short
signed short int
signed char
Si en cambio, tenemos una variable que sólo puede adoptar valores positivos (como por
ejemplo la edad de una persona) podemos aumentar el alcance de cualquiera de los
tipos, restringiéndolos a que sólo representen valores sin signo por medio del calificador
"unsigned". En la TABLA 1 se resume los alcances de distintos tipos de variables enteras
NOTA: Si se omite el calificador delante del tipo de la variable entera, éste se adopta
por omisión (default) como "signed".
De acuerdo a su alcance hay tres tipos de variables de punto flotante, las mismas están
descriptas en la TABLA 2
Las variables de punto flotante son SIEMPRE con signo, y en el caso que el exponente
sea positivo puede obviarse el signo del mismo.
Las reglas 1 a 3 no presentan problemas, sólo nos dicen que previamente a realizar
alguna operación las variables son promovidas a su instancia superior. Esto no implica
que se haya cambiado la cantidad de memoria que las aloja en forma permanente
"lvalue" = "rvalue" ;
Posteriormente al cálculo del resultado de "rvalue" (de acuerdo con las reglas antes
descriptas), el tipo de este se iguala al del "lvalue". El resultado no se verá afectado si el
tipo de "lvalue" es igual ó superior al del "rvalue", en caso contrario se efectuará un
truncamiento ó redondeo, según sea el caso.
double d, e, f = 2.33;
int i = 6;
e = f * i;
d = (int) ( f * i ) ;
En la primer sentencia calculamos el valor del producto (f * i), que según lo visto
anteriormente nos dará un double de valor 13.98, el que se ha asignado a e. Si en la
variable d quisiéramos reservar sólo el valor entero de dicha operación bastará con
También es factible aplicar la fijación de tipo a una variable, por ejemplo obtendremos el
mismo resultado, si hacemos:
d = (int) f * i;
En este caso hemos convertido a f en un entero (truncando sus decimales)
char c;
int c;
Esta última opción desperdicia un poco más de memoria que la anterior, pero en algunos
casos particulares presenta ciertas ventajas. Pongamos por caso una función que lee un
archivo de texto ubicado en un disco. Dicho archivo puede tener cualquier carácter ASCII
de valor comprendido entre 0 y 255. Para que la función pueda avisarme que el archivo
ha finalizado deberá enviar un número NO comprendido entre 0 y 255 (por lo general se
usa el -1, denominado EOF, fin de archivo ó End Of File), en este caso dicho número no
puede ser mantenido en una variable del tipo char, ya que esta sólo puede guardar entre
0 y 255 si se la define unsigned ó no podría mantener los caracteres comprendidos entre
128 y 255 si se la define signed (ver TABLA 1). El problema se obvia fácilmente
definiéndola como int.
Las variables del tipo carácter también pueden ser inicializadas en su definición, por
ejemplo es válido escribir:
char c = 97;
Para que c contenga el valor ASCII de la letra "a", sin embargo esto resulta algo
engorroso, ya que obliga a recordar dichos códigos. Existe una manera más directa de
asignar un caracter a una variable; la siguiente inicialización es idéntica a la anterior:
char c = 'a';
Es decir que si delimitamos un carácter con comilla simple, el compilador entenderá que
debe suplantarlo por su correspondiente código numérico.
difícil de asignarlas a una variable ya que el editor las toma como un COMANDO y no
como un carácter. Un caso típico sería el de "nueva línea" ó ENTER.
Con el fin de tener acceso a los mismos es que aparecen ciertas secuencias de escape
convencionales. Las mismas están listadas en la TABLA 3 y su uso es idéntico al de los
caracteres normales, así para resolver el caso de una asignación de "nueva línea" se
escribirá:
Para salvar este problema y mantener la portabilidad, es conveniente que cada vez que
haya que referirse al TAMAÑO en bytes de las variables, se lo haga mediante un
operador llamado "sizeof" que calcula sus requerimientos de almacenaje
sizeof(int)
sizeof(char)
sizeof(long double), etc.
C
COONNSSTTAANNTTEESS
Aquellos valores que, una vez compilado el programa no pueden ser cambiados, como
por ejemplo los valores literales que hemos usado hasta ahora en las inicializaciones de
las variables (1000, 2, 'a', '\n', etc), suelen denominarse CONSTANTES.
A fin de tener control sobre el tipo de las constantes, se aplican las siguientes reglas:
Una variable expresada como entera (sin parte decimal) es tomada como tal salvo que se
la siga de las letras F ó L (mayúsculas ó minúsculas) ejemplos:
Una variable con parte decimal es tomada siempre como DOUBLE, salvo que se la siga
de la letra F ó L
Una variable numérica que comienza con "0" es tomado como OCTAL así: 012 equivale a
10 unidades decimales
Una variable numérica que comienza con "0x" ó "0X" es tomada como hexadecimal: 0x16
equivale a 22 unidades decimales y 0x1A a 26 unidades decimales.
Constantes simbólicas
Por lo general es una mala práctica de programación colocar en un programa constantes
en forma literal (sobre todo si se usan varias veces en el mismo) ya que el texto se hace
difícil de comprender y aún más de corregir, si se debe cambiar el valor de dichas
constantes.
Se puede en cambio asignar un símbolo a cada constante, y reemplazarla a lo largo del
programa por el mismo, de forma que este sea más legible y además, en caso de querer
modificar el valor, bastará con cambiarlo en la asignación.
Para dar un símbolo a una constante bastará, en cualquier lugar del programa (previo a
su uso) poner la directiva:
E
ENNTTRRAADDAA // S
SAALLIIDDAA
Las funciones gets, puts, getch, etc; son utilizadas, en una forma un poco rudimentaria,
sin embargo; C posee otra serie de funciones, que son más completas, las cuales nos
permiten leer e imprimir (en pantalla), datos con un formato determinado, el cual ha sido
definido por el programador.
S
SAALLIIDDAA H
HAACCIIAA P
PAANNTTAALLLLAA [[PPRRIINNTTFF(())]]
Se utiliza para imprimir en pantalla cadenas de texto solas, o mandar a pantalla el valor de
alguna variable, o constante, o una combinación de las anteriores. Su formato es el
siguiente:
En donde:
Cadena de control: contiene códigos de formato que se asocian con los tipos de datos
contenidos en las variables.
CÓDIGO FORMATO
%d Un entero
%i Un entero
%c Una caracter
%s Una cadena
%f Un real
%ld Entero largo
%u Decimal sin signo
%lf Doble posición
%h Entero corto
%o Octal
%x Hexadecimal
%e Notación Científica
%p Puntero
%% Imprime Porcentaje
Ejemplo:
Int suma=10;
Printf(“La suma es %d”, suma);
Explicación:
Declaramos primero la variable como entero, con un valor de 10, luego la función printf, el
mensaje va entre comillas dobles, luego en el lugar que queremos que aparezca el valor,
colocamos el formato de la variable, cerramos comillas, luego una coma y el nombre de la
variable. Es importante recalcar, que en la posición que coloquemos el formato es donde
aparecerá el valor de la variable en este caso, 10.
Ejemplo:
Char nombre[7]=”Manuel”;
printf(“%s es en creador de este manual”, nombre);
Ejemplo:
También podemos hacer algunos arreglos, al formato de salida, por ejemplo, si deseamos
imprimir un número real justificado a la izquierda podemos colocar:
printf(“%-f”, z);
S
SEECCUUEENNCCIIAASS DDEE E
ESSCCAAPPEESS
CARÁCTER EXPLICACIÓN
DE
ESCAPE
\n Simula un Enter. Se utiliza para dejar una línea de por medio
\t Tabulador horizontal. Mueve el cursor al próximo tabulador
\v Tabulador vertical.
\a Hace sonar la alarma del sistema
\\ Imprime un carácter de diagonal invertida
\? Imprime el carácter del signo de interrogación
\” Imprime una doble comilla
Ejemplos:
E
ENNTTRRAADDAA D
DEESSDDEE TTEECCLLAADDOO
Ejemplo
Diseñe un programa que guarde y muestre la nota del examen final de 3 alumnos
#include <stdio.h>
#include <conio.h>
main()
{
float n1, n2, n3;
char nom1[10], nom2[10], nom3[10];
printf("Introduzca el Nombre del Primer alumno:\n");
scanf("%s", nom1);
printf("Introduzca la nota de este alumno:\n");
scanf("%f", &n1);
printf("Digite el nombre del segundo alumno:\n");
scanf("%s", nom2);
printf("Su nota es:\n");
scanf("%f", &n2);
printf("Finalmente el ultimo alumno es:\n");
scanf("%s", nom3);
printf("Y su nota es:\n");
scanf("%f", &n3);
getch();
return 0;
}
Explicación:
#include <stdio.h>
#include <conio.h>
Con la cual le indicamos al compilador, que de su librería añada a nuestro programa las
funciones estándar de entrada y salida; así como las entradas y salidas por consola
(stadio.h y conio.h, respectivamente).
Luego declaramos la variables, que contendrán las notas como reales (o de punto
flotante:
Ya que, las notas pueden ser deciamales, por ejemplo 9.6, 8.5; etc.
Luego declaramos las variables, que contendrán las notas, cabe aclarar que al momento
de las declaraciones las podemos hacer en el orden que deseemos, pueden ser primeros
los tipo char y luego los float, o viceversa, pero teniendo el cuidado que las variables que
contendrán las nombres lleven la longitud máxima entre corchetes, para nuestro caso, 10.
([10]).
A continuación, va la función scanf, primero y entre comillas el tipo de dato que va a leer:
scanf("%s", nom1);
Como puede notarse, va a leer la cadena de texto que contendrá la variable nom1. cabe
aclarar, que cuando se van a leer cadenas de texto, no es necesario colocar la dirección
(&), lo cual no sucede con los otros tipos de datos:
scanf("%f", &n1);
Después de haber leído los datos, espera a que se presiones cualquier tecla para finalizar
la ejecución del programa.
Ejemplo
#include <stdio.h>
#include <conio.h>
main()
{
char cadena[15];
printf("Digite la cadena:\n\n");
scanf("%s", cadena);
printf("\n\t LA CADENA ES LA SIGUIENTE:\n\n");
printf("***********************************************\n");
printf("%s\n", cadena);
printf("%s\n", cadena);
printf("***********************************************\n");
getch();
return 0;
}
Es importante, que el lector, intente correr, en su máquina estos ejemplos, para que
comprenda con mayor facilidad.
Ejemplo:
Ejemplo:
char cadena[15];
printf("Digite la cadena:\n\n");
scanf("%s", cadena);
Casos Especiales
Así:
%[ABC]s: A, B y C son los únicos caracteres que puede leer al encontrar uno diferente,
finaliza con un valor nulo.
%[ A-Z ]s: También pueden ser rangos de carácter en este caso sólo acepta
mayúsculas.
Ejemplo:
Ejemplo:
Scanf(“%[0-9]s”, &edad);
A
ACCTTIIVVIIDDAADD…
…
Menciones las diferencias fundamentales entre las funciones de entrada y salida por consola, con las f
__________________________________________________________________________________
_______________________________
__________________________________________________________________________________
¿Y la directiva <conio.h>?
__________________________________________________________________________________
En C, no existe el tipo de dato string; sin embargo, podemos hacer uso de las cadenas de texto, ¿Por q
Explique:
__________________________________________________________________________________
Ejercicios:
1. Haciendo uso de las funciones gets y puts, diseñe un programa en C, que se lea el nombre del
2. Diseñe un programa en C, que lea y muestre en pantalla el valor de tres variables de tipo Enter
3. Diseñe un programa que muestre, los diferentes tipos de datos, usados en C. Primero, debe ind
2x2=4
2x3=6
2x4=8
..
.
2x10=20
6. Realice el siguiente ejercicio, tal como se muestra, luego ejecútalo, nuevamente, pero quitándo
#include <stdio.h>
#include <conio.h>
main()
{
char cadena[15];
printf("Digite la cadena:\n\n");
scanf("%s", cadena);
printf("\n\t LA CADENA ES LA SIGUIENTE:\n\n");
printf("***********************************************\n");
printf("%s\n", cadena);
printf("%s\n", cadena);
printf("***********************************************\n");
getch();
return 0;
}
O
OPPEERRAADDOORREESS,, E
EXXPPRREESSIIOONNEESS
Hasta ahora, prácticamente hemos visto, como el protocolo esencial, para realizar un
programa en C; y algunas funciones muy importantes, como son las funciones de lectura
e impresión (scanf y printf, respectivamente).
Ahora veremos, otros aspectos fundamentales, como lo son los operadores, que pueden
ser: lógicos, matemáticos, relacionales, etc. Las expresiones, y las estructuras: de
secuenciación, de selección y de iteración.
O
OPPEERRAADDOORREESS
Operadores Aritméticos
Operador Propósito
+ Suma
- Resta
* Multiplicación
/ División
% Resto de la división entera
Los operandos sobre los que actúan los operadores aritméticos deben ser valores
Numéricos, es decir datos enteros, punto flotante o de carácter (Int, float y char,
respectivamente).
Una aclaración especial, merece el operador “%”, que indica el resto de la división entera.
Veámoslo con un ejemplo:
25%3
OPERADORES UNARIOS: C, incluye una clase de operadores que actúan sobre un solo
operador para producir un nuevo valor. Por eso el nombre de unarios, por que para poder
funcionar solo necesitan de un operador.
OPERADOR PROPÓSITO
Ejemplo:
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int x=5;
printf("\tPRIMERO OBSERVAREMOS EL RESULTADO DE ++X\n\n");
printf("%d\n", ++x);
printf("%d\n", ++x);
printf("%d\n", ++x);
printf("\tAHORA OBSERVAREMOS EL RESULTADO DE --X\n\n");
printf("%d\n", --x);
printf("%d\n", --x);
printf("%d\n", --x);
printf("\tEL RESULTADO DE X++ ES:\n\n");
printf("%d\n", x++);
printf("%d\n", x++);
printf("\tY EL DE X-- ES:\n\n");
printf("%d\n", x--);
printf("%d\n", x--);
getch();
return 0;
}
OPERADOR SIGNIFICADO
< Menor que
<= Menor o igual que
> Mayor que
>= Mayor o igual que
== Igual que (Para las comparaciones)
!= No igual a
Estos Operadores se encuentran dentro del mismo grupo de procedencia, que es menor
que la de los Operadores Unarios y aritméticos.
Operadores lógicos
Estos son los que nos permiten unir varias comparaciones: 10>5 y 6==6. Los operadores
lógicos son: AND (&&), OR (||), NOT(!).
Operadores de Asignación
Los Operadores de Asignación, como su nombre lo indica, se encargan de atribuirle,
asignarle, confinarle, etc a una variable, el resultado de una expresión o el valor de otra
variable.
identificador = expresión;
Donde el identificador representa por lo general una variable y una constante, una
variable o una expresión más compleja.
Ejemplo:
OPERADOR EXPLICACIÓN
+= Expresión1+=expresión2. Equivale a:
expresión1=expresión1 + expresión2
-= i-=1. equivale a: i=i-1
*= J*=2. Equivale a: j=j*2
/= K/=m, equivale a: k=k/m
%= P%n. Equivale a: p=p%n
Los Operadores de asignación tiene menos procedencia que el resto de los operadores y
tienen asociatividad de izquierda a derecha.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
float x, y, z;
clrscr();
printf("\tPROGRAMA QUE CALCULA EL VALOR DE LA ECUACION
X^2+X+1\n\n");
printf("Introduzaca el valor de x:\n");
scanf("%f", &x);
y=x*x;
z=y+x+1;
printf("**************************************\n");
printf("**El valor de la expresi¢n es: %.2f**\n", z);
printf("**************************************\n");
getch();
return 0;
}
Jerarquía de Operadores
Reglas de jerarquía
E
EXXPPRREESSIIOONNEESS
Ya han aparecido algunos ejemplos del lenguaje C en las secciones precedentes. Una
Expresión es una combinación de variables y/o constantes, y operadores. La expresión
es equivalente al resultado que proporciona al aplicar sus operadores a sus operandos.
Por ejemplo 1 + 5 es una expresión formada por dos operandos (1 y 5)y el operador (el +);
esta expresión es equivalente al valor 6, por lo cual quiere decir que allí donde esta
expresión aparece en el programa, en el momento de la ejecución es evaluada y
sustituida por su resultado. Una expresión puede estar formada por otras expresiones
más sencillas, y puede contener paréntesis de varios niveles agrupando distintos
Ejemplo:
9*(8+5)
primero sumamos 8+5, cuyo resultado es 13, y este lo multiplicamos por nueve, con lo
que la expresión anterior, da cómo resultado: 117.
Ejemplo:
2*((20/(12-2))+5)
Se evalúa la operación 12-2, que da como resultado 10, luego se divide 20, entre el
resultado anterior, es decir 10. el resultado es 2, y a este número se le suma 5,
obteniendo 7. ahora se multiplica por dos, para determinar así que la expresión anterior
es igual a 14.
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante conozca la forma de implementar las diferentes
estructuras algorítmicas en el lenguaje de programación C++
JJUUSSTTIIFFIICCAACCIIÓÓNN
La escritura de algoritmos implica, en muchas ocasiones, llegar a algo más que una
simple secuencia. Es el caso, cuando existe una serie de caminos o alternativas a
escoger dependiendo del resultado de una determinada situación. O bien, existe la
exigencia de que un grupo de acciones no se hagan para un ente específico, sino que
sea aplicado a muchos para realizar el mismo cálculo.
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
1. Estructuras secuenciales
2. Estructura selectiva Simple
3. Estructura Selectiva doble
4. Estructura selectiva Múltiple
5. Funcionamiento de Un Ciclo
6. Ciclo de Entrada Asegurada (While)
7. Ciclo Controlado por contador (For).
8. Ciclo Do... while
E
ESSTTRRCCTTUURRAASS S
SEECCUUEENNCCIIAALLEESS
Se les denomina así, por que; son estructuras en un programa, que después de ejecutar
una instrucción o sentencia, continúan con la otra, hasta llegar al final del programa. Los
ejemplos que hemos visto anteriormente, son ejemplos de estructuras secuenciales.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int x, x1, x2, y, y1, y2, z, z1, z2;
clrscr();
printf("\tPROGRAMA QUE CALCULA EL
CUADRADO Y EL CUBO DE 3 NUMEROS\n\n");
printf("Introduzaca el primer numero:\n");
scanf("%d", &x);
printf("Ahora ingrese el siguiente numero:\n");
scanf("%d", &y);
printf("Y el tercer numero es:\n");
scanf("%d", &z);
x1=x*x;
x2=x*x*x;
y1=y*y;
y2=y*y*y;
z1=z*z;
z2=z*z*z;
printf("*********************************\n");
printf("**Numero****Cuadrado*****Cubo****\n");
printf("**%d **** %d ***** %d ****\n", x, x1, x2);
printf("**%d **** %d ***** %d ****\n", y, y1, y2);
printf("**%d **** %d ***** %d ****\n", z, z1, z2);
printf("*********************************\n");
getch();
return 0;
}
Ejemplo
Una empresa necesita conocer el sueldo neto a pagar a un empleado. Teniendo como
entrada el salario produzca una salida de sueldo neto. Los descuentos a aplicar son:
ISSS 5%, AFP 7% y Renta 10%, estos descuentos son sobre el salario, y es sueldo
neto es la diferencia entre el salario y el total de las retenciones:
#include <stdio.h>
#include <conio.h>
main()
{
float sueldo, afp, isss, renta, sn;
char nombre[50];
clrscr();
printf("Introduzca el Nombre del empleado:\n");
scanf("%s", nombre);
printf("Su sueldo es:\n");
scanf("%f", &sueldo);
afp=sueldo*0.07;
isss=sueldo*0.05;
renta=sueldo*0.10;
sn=sueldo-(afp+isss+renta);
printf("El empleado %s\n", nombre);
printf("Posee un sueldo neto de %.2f\n", sn);
getch();
return 0;
}
Ejemplo:
Diseñe un programa que calcule el promedio y la suma de tres números ingresados por
el usuario:
#include <stdio.h>
#include <conio.h>
main()
{
float x, y, z, sum, prom;
clrscr();
printf("El Primer n£mero es:\n");
scanf("%f", &x);
printf("Ahora el segundo n£mero:\n");
scanf("%f", &y);
printf("El Ultimo numero es:\n");
scanf("%f", &z);
sum=x+y+z;
prom=sum/3;
printf("*****************************************\n");
printf("**La suma es %.2f y el promedio es %.2f*\n", sum, prom);
printf("*****************************************\n");
getch();
return 0;
}
E
ESSTTRRCCTTUURRAA S
SEELLEECCTTIIVVAA SSIIM
MPPLLEE
Los pequeños programas que hemos diseñada hasta el momento, han sido del tipo
secuencial, es decir, una sentencia se ejecuta después de otra, hasta el final del
programa.
Pero en la vida diaria muchas veces debemos elegir entre un camino y otro para llegar a
nuestro destino. Lo mismo pasa en programación, al realizar alguna actividad, nuestro
programa debe ser capaz de elegir uno u otro camino, a seguir dependiendo del valor de
alguna condición evaluada.
Para ello C, dispone de tres tipos de 3 tipos de estructuras selectivas, la cuales son:
Su sintaxis es la siguiente:
If(condición) Acción;
O también:
If(Condición)
Acción;
Donde:
Ejemplo:
En una tienda se venden artículos de primera necesidad, a los cuales se les aplica un
descuento del 20%, de la compra total, si esta es igual o mayor a $50. Diseñe un
programa en C, que a partir del importe total de la compra muestre lo que debe pagar
el cliente.
#include <stdio.h>
#include <conio.h>
main()
{
float compra;
clrscr();
printf("Introduzca el valor de la compra:\n");
scanf("%f", &compra);
if(compra>=50)
compra=compra*0.8;
E
ESSTTRRCCTTUURRAA S
SEELLEECCTTIIVVAA D
DOOBBLLEE
Esta estructura, se caracteriza por el hecho que ofrece dos caminos a seguir,
dependiendo si al evaluar la condición resulta cierta o falsa. Su sintaxis es la siguiente:
if(Condición)
Acción 1;
else
Acción 2;
Se debe tener en cuenta la condición puede ser compuesta, es decir haciendo uso de los
operadores && y || (Y lógico y No lógico), además que cuando tenemos más de una
sentencia por ejecutar ya sea del lado del cierto o del falso, estas van dentro de llaves.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int num;
printf("Ingrese el n£mero:\n");
scanf("%d", &num);
if(num%2==0)
printf("ES PAR\n\n");
else
printf("ES IMPAR\n\n");
getch();
return 0;
}
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
float nota;
printf("Digite la nota, porfavor:\n");
scanf("%f", ¬a);
if(nota >= 9.0)
printf("EXCELENTE\n\n");
else
if(nota >= 8.0)
printf("MUY BUENO\n\n");
else
if(nota >= 7.0)
printf("BUENO\n\n");
else
if(nota >=6.0)
printf("REGULAR\n\n");
else
printf("NECESITA MEJORAR\n\n");
getch();
return 0;
}
Este ejemplo, muestra que C, permite hacer anidamientos, es decir, una selección
dentro de otra, ya sea del lado del cierto, o del falso o de ambos.
El lector, puede tratar de hacer sus propias conclusiones, además de buscar otras
posibles solucione para este mismo problema. Por ejemplo, ¿que pasaría si iniciamos
con la condición del 6.0? ¿Qué pasaría si el usuario digita una neta negativa? ¿Cómo
podrías darle solución a este problema? Como programadores, debemos hacernos
muchas preguntas al momento de diseñar nuestros programas, ya que estos No serán
usados por nosotros, sino por otras personas.
Ejemplo:
• Si son varones, y su estatura es mayor a 1.60, y su peso es mayor o igual a 150 lb,
su dosis, serán: 20% de la estatura y 80% de su peso. De lo contrario, la dosis será
la siguiente: 30% de la estatura y 70% de su peso.
#include <stdio.h>
#include <conio.h>
main()
{
float peso, estatura, dosis;
char sexo;
}
else
{
dosis=(0.35*estatura)+(0.65*peso);
printf("La dosis de esta alumna debe ser de %.2f gramos\n\n", dosis);
}
}
getch();
return 0;
}
S
SEELLEECCCCIIÓÓNN M
MÚÚLLTTIIPPLLEE
Como su nombre lo indica, permite seleccionar entre varios caminos para llegar al final.
En este caso se pueden elegir un camino o acción a ejecutar de entre varios posibles que
se debe de evaluar, llamada selector. Sintaxis:
switch(selector)
{
case Etiqueta A:
Acción A;
break;
case Etiqueta B:
Acción B;
break;
case Etiqueta n:
Acción n;
break;
default:
Excepción;
break;
}
En donde:
Selector: Variables, expresiones simples de tipo ordinal, (enteros y caracteres –int y char-)
Etiqueta: Tiene que ser del mismo tipo de datos de selecto. Estas deber ser constantes
únicas y diferentes de otras.
Excepción: Es opcional.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int n;
clrscr();
printf("El N£mero es:\n");
scanf("%d", &n);
switch(n)
{
case 0: puts("Cero");
break;
case 1: puts("Uno");
break;
case 2: puts("Dos");
break;
case 3: puts("Tres");
break;
A
ACCTTIIVVIIDDAADD…
…
Ejercicios:
1. Diseñe un programa que dados tres números indique cual es el mayor de ellos.
2. Diseñe un programa que dados tres números indique cual de ellos es el menor.
9. Diseñe unA pequeña calculadora que, al digitar un código realice una operación
específica: si el código es 1, la operación es la suma, si es 2, Resta. 3,
multiplicación y 4 división. Si el usuario a escrito otro código inválido, mostrar un
mensaje de error.
#Include <stdio.h>
#incluide <conio.h>
main()
{
float nota;
printf(“Digite la nota:\n”)
scanf(“%f”, nota);
if(nota>=6.00)
printf(“Aprobado\n\n);
else
printf(Reprobado\n\n);
getch();
return 0;
}
C
CÍÍCCLLOOSS
Para repetir varias veces un proceso determinado haremos uso de los ciclos repetitivos, a
los cuales se les conoce con el nombre de estructura repetitiva, estructura iterativa, lazo o
bucle. (Tomado de Los guiones de clase de Introducción a la Informática. Universidad de
El Salvador. Año 2005)
FFUUNNCCIIOONNAAM
MIIEEN
NTTO
ODDEE U
UNN C
CIICCLLOO
Un ciclo, funciona de la siguiente manera: Evalúa una condición de resultar cierta, realiza
una acción o bloque de acciones, luego vuelve a evaluar la condición y si nuevamente
resulta cierta, realiza la (s) acción (es). Cuando la condición de cómo resultado falso, se
sale del ciclo y continúa con la ejecución normal del programa.
Contador: Es una variable de tipo entero, que nos ayuda, en el programa a contabilizar el
número de ejecuciones de una misma acción, de un grupo de alumnos etc. Un
acumulador tiene tres valores distintos:
• Valor Final: después de la ejecución del ciclo, el valor del contador, será distinto
a su valor inicial, este puede ser mayo o menor que el mismo, todo depende si
fue una cuenta creciente o decreciente.
NOTA: el lector no debe confundirse entre las variables tipo acumulador y tipo
contador, estas se diferencian unas de otras en que: los contadores, su valor de
cambio es una constante, ya que aumenta y disminuyen en el mismo valor, mientras
que los acumuladores su valor de cambio no es constante. Un acumulador
necesariamente lo inicializamos con cero (o al menos en la mayoría de los casos).
Un contador puede iniciar con cualquier valor.
Bandera: Las variables tipo bandera son aquellas que sólo admiten dos valores: cierto o
falso, true o false, hombre o mujer... etc.
C
CIICCLLOO DDEE E
ENNTTRRAADDAA A
ASSEEGGUURRAADDAA ((W
WHHIILLEE))
La sintaxis es la siguiente:
while(condición)
Acción;
Hay que tener mucho cuidado, cuando trabajamos con ciclos, ya que podemos caer en un
ciclo infinito, es decir que nunca se sale de él. Lo cual no es un error de sintaxis sino de
lógica. Por lo cual en las acciones debemos siempre colocar algo que haga que se
modifique el resultado de la condición, lo cual puede ser una bandera, un contador o un
acumulador.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int i=1; /*Declaramos nuestro contador con su Valor Inicial*/
while(i<=10) /*Mientras i sea menor o igual a 10:*/
{
printf("%d\t", i);/*Imprimir el valor de i*/
i+=1;/*Aumentar el contador en 1*/
}
getch();
return 0;
}
Ejemplo:
Se desea conocer el promedio de los números mayores que cero, en una serie de
números ingresados por el usuario. De los cuales no se sabe la cantidad, haciendo uso
de una bandera, diseñe un programa en el cual el usuario ingrese los números que
desee.
#include <stdio.h>
#include <conio.h>
main()
{
int i=0, sum=0, ban=1, n;
float prom;
while(ban==1)
{
printf("Ingrese un n£mero por Favor:\n");
scanf("%d", &n);
if(n>0)
{
i=i+1;
sum+=n;
}
printf("Desea Ingresar Otro N£mero? (Si=1 y No=0)\n");
scanf("%d", &ban);
}
prom=sum/i;
printf("************************************************************\n");
printf("*** El Promedio de los numeros mayores que cero es: %.2f ***\n", prom);
printf("************************************************************\n");
getch();
return 0;
}
Ejercicio:
En un salón se tienen las notas de 14, alumnos; de los cuales se desea saber cual fue
el promedio de todas las notas, cual fue la nota mayor y la nota menor. Así como la
cantidad de aprobados en el curso (Para Aprobar la asignatura se requiere de una nota
mayor o igual a 6.0)
#include <stdio.h>
#include <conio.h>
main()
{
if(nota>=6.00)
j=j+1;
if(nota>mayor)
mayor=nota;
if(nota<menor)
menor=nota;
i=i+1;
suma=suma+nota;
}
prom=suma/14;
printf("El Promedio es %.2f\n\n", prom);
printf("El total de Aprobados es %d\n", j);
printf("La Mayor nota fue %.2f\n", mayor);
printf("%.2f corresponde a la nota menor\n", menor);
getch();
return 0;
}
C
CIICCLLOO C
COONNTTRROOLLAADDOO PPOORR CCOONNTTAADDOORR ((FFOORR))
En algunas ocasiones, sabemos a ciencia cierta el número de veces que se tiene que
repetir una misma acción o bloque de acciones. Y para ello es que nos sirve, esta
estructura. Su sintaxis es la siguiente:
Donde:
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
int i;
for(i=1; i<=10; i++)
printf("%d\t", i);
getch();
return 0;
}
Ejemplo:
Diseñe un programa en C, que calcule las compras totales, realizadas por un grupo de
20 amas de casa. Luego con esa información obtenga la media.
#include <stdio.h>
#include <conio.h>
main()
{
int i;
float compra, desvia, prom, varinza, sum=0;
for(i=1; i<=10; i++)
{
printf("Ingrese la cantidad que gast¢ la ama de casa %d:\n", i);
scanf("%f", &compra);
while(compra<0)
{
printf("ERROR, la compra debe ser mayor que cero, vuelva a
intentarlo:\n");
scanf("%f", &compra);
}
sum=sum+compra;
}
prom=sum/12;
printf("El promedio de las compras es %.2f\n\n\a", prom);
getch();
return 0;
}
Cabe, mencionar que, en el ciclo for, podemos hacer cuentas decrecientes, es decir
asignarle un valor grande a nuestra variable de control y luego irla disminuyendo hasta un
valor determinado.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
float preciob1, preciob2, preciob3, sum=0, sum1=0, sum2=0, sum3=0;
int n, i, boletos1, boletos2, boletos3, boleto;
clrscr();
printf("\t\tBIENVENIDO(A)\n\n\n");
printf("Ingrese el precio de los boletos 1:\n");
scanf("%f", &preciob1);
while(preciob1<0)
{
printf("ERROR\n");
scanf("%f", &preciob1);
}
printf("Ingrese el precio de los boletos 2:\n");
scanf("%f",&preciob2);
while(preciob2<0)
{
printf("ERROR\n");
scanf("%f", &preciob2);
}
printf("Ingrese el precio de los boletos 3:\n");
scanf("%f",&preciob3);
while(preciob3<0)
{
printf("ERROR\n");
scanf("%f", &preciob3);
}
printf("¨Cu ntas ventas se realizaron este d¡a?:\n");
scanf("%d", &n);
while(n<0)
{
printf("ERROR\n");
scanf("%d", &n);
}
for(i=1; i<=n; i++)
{
printf("Ingrese el Boleto:\n");
scanf("%d", &boleto);
switch(boleto)
{
case 1: printf("Ingrese la cantidad de boletos vendidos:\n");
scanf("%d", &boletos1);
sum1+=boletos1;
sum=sum+(boletos1*preciob1);
break;
case 2: printf("Ingrese la cantidad de boletos vendidos:\n");
scanf("%d", &boletos2);
sum2+=boletos2;
sum=sum+(boletos2*preciob2);
break;
case 3: printf("Ingrese la cantidad de boletos vendidos:\n");
scanf("%d", &boletos3);
sum3+=boletos3;
sum=sum+(boletos3*preciob3);
break;
default: printf("ERROR, Vuelva a intentarlo\n\n");
break;
}
}
clrscr();
if(sum3<sum2 && sum3<sum1)
printf("Los Boletos que se vendieron menos fueron los boletos numero UNO\n\n");
if(sum2<sum3 && sum2<sum1)
printf("Los Boletos que se vendieron menos fueron los boletos numero DOS\n\n");
if(sum1<sum2 && sum1<sum3)
printf("Los Boletos que se vendieron menos fueron los boletos numero
TRES\n\n");
printf("El total recaudado en taquilla, durante este dia fue: %.2f\n\n", sum);
getch();
return 0;
}
C
CIICCLLOO D
DOO...... W
WHHIILLEE
Formato:
do {
sentencia;
.
.
} while(<expL>);
La diferencia fundamental, entre el ciclo while y do...while, es que en este ultimo, las
sentencias se realizarán por lo menos una vez, en cambio, con while, solo se cumplirán
mientras se cumpla la condición, lo cual puede ser nunca.
Ejemplo:
#include <stdio.h>
#include <conio.h>
void main()
{
int anio;
char respuesta;
printf("\n\n\nINICIO DEL PROGRAMA\n\n\n");
printf("\n\nEl programa te pide un anio y te dice exactamente si es bisiesto o no");
do
{
/*ENTRADA DE DATOS*/
printf("\n\nIntroduzca un anio determinado ");
scanf("%d",&anio);
/*PROCESO Y SALIDA DE DATOS*/
if ((anio%4==0 && anio%100!=0)||(anio%400==0)) printf("\n\nEl anio es bisiesto");
else printf("\n\nEl anio no es bisiesto");
printf("\n\nDesea introducir mas datos\n\n");
respuesta=getch();
} while(respuesta=='S' || respuesta=='s');
printf("\n\n\nFIN DEL PROGRAMA\n\n\n");
}
A
ACCTTIIVVIIDDAADD…
…
1^2+2^2+3^2....n^2
#include <stdio.h>
#include <conio.h>
main()
{
int n i, x, sum=0;
printf("Inrtroduzca el valor de n:\n");
scanf("%d", &n);
while(n<0)
{
printf("Error, vuelva a digitar el valor de n:\n");
scanf("%d", n);
}
for(i=1; i<=n, i++)
x=i*i;
sum+=n;
printf("El valor de la suma es:%d\n\n", sum)
getch();
return 0;
}
Ejercicios
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante aprenda a trabajar con subprogramas o módulos,
de igual manera, la forma de trabajar con arreglos unidimensionales o bidimensionales.
JJUUSSTTIIFFIICCAACCIIÓÓNN
Por otro lado los datos siempre que estén relacionados se pueden organizar en
estructuras, de tal manera que podamos tener un conjunto de datos manejados a
través de un mismo nombre de variable.
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
1. Subprogramas o Módulos
2. Paso de Parámetros
3. Funciones Definidas Por El Usuario en C
4. Funciones que no devuelven ningún valor.
5. Funciones que devuelven un valor entero
6. Funciones que Devuelven un Valor Real
7. Funciones en las que usamos Menú
8. Vectores
9. Uso de Vectores dentro de las Funciones
10. Matrices
S
SUUBBPPRROOGGRRAAM
MA OM
ASS O MÓÓDDUULLOOSS
La modularización, es una técnica usada por los programadores para hacer sus códigos
más cortos, ya que consiste en reducir un gran problema complejo, en pequeños
problemitas más sencillos, concentrándose en la solución por separado, de cada uno de
ellos.
En las funciones juegan un papel muy importe las variables, ya que como se ha dicho
estas pueden ser locales o globales.
Variables Globales: Estas se crean durante toda la ejecución del programa, y son
globales, ya que pueden ser llamadas, leídas, modificadas, etc; desde cualquier función.
Se definen antes del main().
Variables Locales: Estas, pueden ser utilizadas únicamente en la función que hayan sido
declaradas.
Donde:
• Tipo_de_datos: Es el tipo de dato que devolverá esa función, que puede ser real,
entera, o tipo void(es decir que no devolverá ningún valor).
• Nombre_de_la_funcion: Es el identificador que le damos a nuestra función, la cual
debe cumplir las reglas que definimos en un principio para los identificadores.
• Tipo y nombre de argumentos: son los parámetros que recibe la función. Los
argumentos de una función no son más que variables locales que reciben un valor.
Este valor se lo enviamos al hacer la llamada a la función. Pueden existir funciones
que no reciban argumentos.
• Acciones: Constituye el conjunto de acciones, de sentencias que cumplirá la
función, cuando sea ejecutada. Entre ellas están:
• Asignaciones
• Lecturas
• Impresiones
• Cálculos, etc
Una función, termina con la llave de cerrar, pero antes de esta llave, debemos colocarle la
instrucción return, con la cual devolverá un valor específico. Es necesario recalcar que si
la función no devuelve ningún valor, es decir, es tipo void, no tiene que ir la sentencia
return, ya que de lo contrario, nos dará un error.
Los subprogramas se comunican con el programa principal, que es el que contiene a las
funciones, mediante parámetros, que estos pueden ser: Parámetros Formales y
Parámetros Actuales.
P
PAASSOO DDEE PPAARRÁÁM
MEETTR
ROOSS
Los parámetros se tratan como variables locales y los valores iniciales se proporcionan
copiando los valores de correspondientes argumentos.
Los parámetros formales-Locales de una función reciben como inicilaes los valores de los
parámetros actuales y con ellos se ejecutan las acciones descritas en el subprograma.
Ejemplo:
A=5;
B=7;
C=proc1(A, 18, B*3+4);
Proc1(X, Y, Z)
Explicación:
FFUUNNCCIIOONNEESS D
DEEFFIINNIIDDAASS P
POORR E
ELL U
USSUUAARRIIOO EENN C
C
Una función, como ya se ha dicho, es un bloque de código dentro del programa que se
encarga de realizar una tarea determinada. Por lo tanto un programa en c debe constar
de una o más funciones, y por su puesto no puede faltar la función principal main().
Si un programa, está constituido por más de una función, las llamadas a la misma,
pueden realizarse desde cualquier parte del programa, y la definición de ellas debe ser
independiente unas de otras. Por lo tanto sería un grave error el tratar de definir una
función dentro de otra.
Una función puede ser llamada desde cualquier parte del programa no sólo una vez, y
cuando es llamada, empieza a ejecutar las acciones que están escritas en código.
Para mayor comodidad del lector vamos a ver varios ejemplos, del uso de funciones y a
medida que vayamos avanzando se volverán más complejos.
Cómo se ha dicho las funciones pueden o no devolver algún valor, para mi parecer, este
tipo de funciones son las más sencillas, ya que cuando se llama la función, esta realiza
lecturas, asignaciones, cálculos o impresiones, finaliza la ejecución de la función y el
programa continúa normalmente.
Ejemplo:
Diseñe un programa que dados dos números enteros determine la suma y cual de ellos
es mayor, usando dos funciones diferentes.
#include <stdio.h>
#include <conio.h>
void suma (int a, int b); /*Declaraci¢n de la funci¢n*/
void mayor (int a, int b); /*Tipo de dato, nombre de la funci¢n y el tipo y nombre de los
argumentos*/
main()
{
int a, b;
printf("Ingrese el valor de a:\n");
scanf("%d", &a);
printf("Ingrese el valor de b:\n");
scanf("%d", &b);
suma(a,b); /*Llamado de la funci¢n*/
mayor(a,b); /*Unicamente el nombre de la funci¢n y de los par metros*/
getch();
return 0;
}
void suma(int a, int b) /*Definici¢n de la funci¢n*/
{ /*Abrimos llaves al inicio de la definici¢n*/
int sum; /*Declaraci¢n de las variables locales*/
sum=a+b;
printf("El valor de la suma es %d:\n\n", sum);
Definición de la Función
La función ha sido declarada, ha sido llamada y por lo tanto deber haber sido definida. Lo
cual consta de dos partes, las cuales son:
• La Primera Línea
• Cuerpo de la función
Se inicia con una llave “{“, y en ella, se pueden realizar asignaciones, cálculos,
impresiones, así como la declaración de las variables locales. Puede estar constituidas
por estructuras secuenciales, selectivas, iterativas, anidamientos, se pueden llamar
otras funciones, etc; finaliza con “}”. Puede devolver uno o ningún valor.
Ejemplo:
Diseñe un Programa en C, que Dado un número entero y mayor que cero, Determine si
es o no un número Primo. Ojo, los números primos sólo son divisibles por el mismo y
por la unidad (1).
#include <stdio.h>
#include <conio.h>
void primo (int numero);
main()
{
int numero, ban=1;
clrscr();
while(ban==1)
{
primo(numero);
Las funciones que devuelven algún valor, se les llama PROTOTIPOS DE FUNCIONES:
Antes de usar una función C debe tener conocimiento acerca del tipo de dato que
regresara y el tipo de los parámetros que la función espera.
El estándar ANSI de C introdujo una nueva (mejor) forma de hacer lo anterior respecto a
las versiones previas de C.
Lo anterior declara una función llamada longcad que regresa un valor entero y acepta otro
valor entero como parámetro. (Tomado de “Manual de C” de Héctor Tejada Villela)
Ejemplo:
Diseñe un programa, que dado un número entero y mayor que cero, muestre su
factorial. (El factorial de 5 es 120; 5x4x3x2x1=120)
#include <stdio.h>
#include <conio.h>
int factorial (int num);
main()
{
int num, ban=1;
clrscr();
while(ban==1)
{
printf("Ingrese el valor del n£mero por favor:\n");
scanf("%d", &num);
while(num<0)
{
printf("ERROR, el valor del n£mero debe ser mayor que cero:\n");
scanf("%d", &num);
}
printf("El valor del factorial es %d\n\n", factorial (num));
printf("¨Desea Realizar otro calculo?Si=1 y No=0\n");
scanf("%d", &ban);
}
getch();
return 0;
}
int factorial (int num)
{
int sum=1, i;
for(i=2; i<=num; i++)
{
sum=sum*i;
}
return (sum);
}
Explicación:
Pero, que sucede cuando se está trabajando, con valores bastante grandes, al utilizar
solamente el int, se producirá un error lógico; ya que como valor de retorno podría ser un
cero o una cifra negativa. Por tanto debemos usar el tipo de dato “long int”.
Ejemplo:
Diseñe un programa, que dada una cifra entera y mayor que cero, sea elevada a una
potencia introducida por el usuario, la cual. (Ejemplo: 5^2=25).
#include <stdio.h>
#include <conio.h>
long int potencia (int base, int exponente);
main()
{
int base, exponente;
clrscr();
printf("La Base es:\n");
scanf("%d", &base);
while (base<0)
{
printf("ERROR, el dato debe ser mayor que cero:\n");
scanf("%d", &base);
}
printf("El Exponente es:\n");
scanf("%d", &exponente);
printf("%d ^ %d es %ld\n\n", base, exponente, potencia(base,exponente));
getch();
return 0;
}
long int potencia (int base, int exponente)
{
Este método es un poco complejo y puede realizarse de manera más fácil, haciendo uso
de las funciones predefinidas en C, de las cuales hablaremos a continuación.
FFUUNNCCIIOONNEESS QQUUEE D
DEEVVUUEELLVVEENN UUNN V
VAALLOORR R
REEAALL..
Antes que nada, trataremos las funciones predefinidas en C. Ya que C, posee ciertas
funciones que nos ayudan hacer nuestros programas más fáciles y utilizar menos código.
El lenguaje c, cuenta con una serie de funciones de bibliotecas que realizan operaciones y
cálculos de uso frecuente.
Para acceder a una función, se realiza mediante el nombre seguido de los argumentos
que le servirán a la función a realizar la tarea específica.
Nombre(arg1, arg2,...argn);
Funciones Matemáticas
Para acceder a ellas, se debe colocar la directiva #include <math.h> en el encabezado del
programa.
FUNCIÓN
(SINTAXIS) TIPO PROPÓSITO
abs(i) int Devuelve el valor absoluto de i
ran() int Devuelve un entero aleatorio
srand(u) void Inicializa el generador de números aleatorios
div(d1/d2) Double/ Devuelve el cociente y el resto de la división
int
atuf(s) Double Convierte la cadena a una cantidad de doble
precisión
atoi(s) int Convierte cadenas a un entero
atol(s) long Convierte cadenas a un entero largo
Hay muchas otras funciones, pero para ahondar más, debes saber cuál es la versión de
C, instalada en tu máquina y así verificar cuáles funcionan correctamente; pero por lo
general, estas funciones son muy estándar para la mayoría de compiladores.
Ejemplo:
a+b
|a-b|
ab
#include <stdio.h>
#include <conio.h>
#include <math.h>
double raiz(float a, float b);
double valor_absoluto(float a, float b);
double exponente (float a, float b);
main()
{
float a, b;
clrscr();
printf("\t\tBIENVENIDO\n\n");
printf("Ingrese el valor de a, por favor:\n");
scanf("%f", &a);
printf("Ahora el valor de b:\n");
scanf("%f", &b);
printf("El resultado de la ra¡z cuadrada de %.2f + %.2f es %.2f\n\n", a,b,raiz(a,b));
printf("|%.2f-%.2f| es igual a %.2f\n\n", a,b,valor_absoluto(a,b));
printf("%.2f^%.2f es igual a %f\n\n", a,b,exponente(a,b));
getch();
return 0;
}
double raiz(float a, float b)
{
float x;
double y;
x=a+b;
y=sqrt(x);
return (y);
}
double valor_absoluto(float a, float b)
{
float x;
double y;
x=a-b;
y=fabs(x);
return (y);
}
double exponente (float a, float b)
{
double x;
x=pow(a,b);
return (x);
}
Supongo que, este ejemplo no requiere mayor explicación. Pero me gustaría que el
lector, comprenda la gran cantidad de usos que podemos darle, a aquellas funciones
matemáticas, junto con las funciones definidas por el usuario, esta es una gran ayuda, ya
que ¿se imaginan la cantidad de código que deberíamos colocar, para determinar cosas
tan elementales como el valor absoluto?; con estas funciones matemáticas, C, nos ahorra
mucho trabajo y código.
Funciones Combinadas
A continuación veremos un ejemplo de un programa en el cual utilizamos dos funciones
de diferente tipo de dato.
Ejemplo:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
int numero;
char respuesta;
do {
do {
printf("\n\nIntroduzca un numero de terminos de la serie: ");
scanf("%d",&numero);
} while (numero<0);
calculodatos(numero);
for (i=1;i<=numero;i++) {
e=e+1./factorial(i);
}
printf("\n\nEl valor de e para %d terminos es %f.",numero,e);
}
Y así como este ejemplo, podemos realizar muchas otras combinaciones de funciones,
según necesitemos y lo solicite nuestro programa.
En la práctica, muchas veces debemos diseñar programas, que nos permitan elegir la
acción o acciones a realizar, es decir haciendo uso de un menú. El cual, no es más ni
menos que la aplicación de un selector múltiple. Un switch.
Ejemplo:
Diseñe un programa, que dado un ángulo, muestre su seno, coseno o tangente; según
lo desee el usuario.
#include <stdio.h>
#include <conio.h>
#include <math.h>
void seno (float angulo);
void coseno (float angulo);
void tangente (float angulo);
main()
{
float angulo;
int opcion, ban=1;
clrscr();
while(ban==1)
{
printf("\t\tBIENVENIDO/A\n\n");
printf("Introduzca el valor del angulo, por favor:\n");
scanf("%f", &angulo);
printf("¨Que desea hacer?:\n\n");
printf("********************************************\n");
printf("**** 1. seno del angulo ****\n");
printf("**** 2. coseno del angulo ****\n");
printf("**** 3. tangente del angulo ****\n");
printf("********************************************\n");
scanf("%d", &opcion);
while(opcion<0 || opcion>3)
{
printf("ERROR, la opcion debe estar entre 0 y 3:\n");
scanf("%d", &opcion);
}
clrscr();
switch(opcion)
{
case 1: seno (angulo);
break;
case 2: coseno (angulo);
break;
case 3: tangente (angulo);
break;
}
printf("¨Hay mas datos? (si=1 y no=0)\n");
scanf("%d",&ban);
}
getch();
return 0;
}
void seno (float angulo)
{
float y;
y=sin (angulo);
printf("El seno de %f es %f\n\n", angulo, y);
}
void coseno (float angulo)
{
float y;
y=cos(angulo);
printf("El coseno de %f es %f\n\n", angulo, y);
}
void tangente (float angulo)
{
float y;
y=tan(angulo);
printf("La tangente de %f es %f\n\n", angulo, y);
getch();
A
ACCTTIIVVIIDDAADD…
…
Mencione y explique, las partes en las que se componen las funciones definidas por el
usuario en C:
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
¿Cuál es la diferencia entre las funciones predefinidas en c y las funciones definidas por
el usuario?
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Ejercicios
E
ESSTTRRUUCCTTUURRAASS DDEE DDAATTOOSS ((A
ARRRREEGGLLOOSS))
Un array es un identificador que referencia un conjunto de datos del mismo tipo. Imagina
un tipo de dato int; podremos crear un conjunto de datos de ese tipo y utilizar uno u otro
con solo cambiar el índice que lo referencia. El índice será un valor entero y positivo. En
'C' los arrays comienzan por la posición 0.
V
VEECCTTOORREESS
Un vector es un array unidimensional, es decir, solo usa un índice para referenciar a cada
uno de los elementos.
Ejemplo:
Constante Simbólica
Hace más sencillo o más fácil modificar un programa que utiliza arreglos. Ya que todas
las referencias al tamaño del arreglo pueden ser alteradas, cambiando el valor de la
constante simbólica.
Ejemplo:
#include <stdio.h>
#include <conio.h>
#define N 10
main()
{
float x[N];
int i;
for(i=0; i<N; i++)
{
printf("Ingrese el valor %d:\n", i);
scanf("%f", &x[i]);
}
if(x[4]>0)
{
printf("La quinta Posici¢n es Positiva\n\n");
}
if(x[0]<0)
{
printf("La 1ø Posici¢n es Negativo\n\n");
}
if(x[N-1]==0)
{
printf("La Ultima Posici¢n es cero\n\n");
}
getch();
return 0;
}
Explicación
Así:
Esta es una versión gráfica, de lo que sucedería al llenar nuestro vector con los valores
indicados. Como podemos ver, C empieza a enumerar las casillas desde el cero, hasta el
9. totalizando de esa manera 10 posiciones. Así que, x[4]=8.
Es por ello, que el for, lo inicializamos con cero, hasta un valor menor que el de la
constante, ya que de lo contrario nos daría un error.
Una particularidad con los vectores de tipo char (cadena de caracteres), es que
deberemos indicar en que elemento se encuentra el fin de la cadena mediante el carácter
nulo (\0). Esto no lo controla el compilador, y tendremos que ser nosotros los que
insertemos este carácter al final de la cadena. Por tanto, en un vector de 10 elementos de
tipo char podremos rellenar un máximo de 9, es decir, hasta vector[8].Si solo rellenamos
los 5 primeros, hasta vector[4], debemos asignar el carácter nulo a vector[5]. Es muy
sencillo: vector[5]='\0';
Ahora veremos un ejemplo de como se rellena un vector de tipo char. Podemos ver que
en el for se encuentran dos condiciones:
(cadena[x-i]!=13).
U
USSOO DDEE V
VEECCTTOORREESS DDEENNTTRROO DDEE LLAASS FFUUNNCCIIOONNEESS
Un vector, solo puede ser argumento formal, es decir; por el momento, no podemos
enviarlo como valor de retorno., digo por el momento por que cuando hablemos de
punteros, veremos que si se pueden enviar.
Declaración o Prototipo:
Llamado de la Función
Definición de la función
Ejemplo:
#include <stdio.h>
#include <conio.h>
#define N 20
int suma (int [N]); /*Declaración de la función*/
void mayor (int [N]); /*Ojo, los argumentos que son vectores solo necesitan el tipo de
dato y la dirección*/
main()
{
int numeros[N], i;
printf("Ingrese la Cantidad de Valores:\n");
scanf("%d", &limite);
while(limite<0 || limite >N)
for(i=0; i<N; i++)
{
printf("Ingrese el elemento %d del vector:\n", i);
scanf("%d", &numeros[i]);
}
printf("La suma de todos los elementos del vector es: %d\n", suma(numeros));
mayor(numeros); /*Llamado de la función */
getch();
return 0;
}
int suma (int numeros [N]) /*Definición de la función */
{
int sum=0, i;
El lector, debe preguntarse, que pasaría si existen dos valores exactamente iguales que
sean los valores máximos y que por ende, estén en diferentes posiciones, que solución le
darías como programador?... este tipo de preguntas debe hacerse siempre que ha
finalizado un programa, y nunca dejar nada sin resolver, por que recordemos que los
programas que diseñamos son para que otras personas los usen.
M
MAATTRRIICCEESS
Las matrices se declaran de forma análoga, con corchetes independientes para cada
subíndice. La forma general de la declaración es:
tipo nombre[numero_filas][numero_columnas];
Donde tanto las filas como las columnas se numeran también a partir de 0. La forma de
acceder a los elementos de la matriz es utilizando su nombre, seguido de las expresiones
enteras correspondientes a los dos subíndices, entre corchetes.
En C tanto los vectores como las matrices admiten los tipos de las variables escalares
(char, int, long, float, double, etc.),
posición_elemento(0, 0) + i * M + j
Ejemplo:
Diseñe un programa que lea un matriz de 6*6 y luego determine la suma de cada una
de las filas y la almacene en un vector llamado suma.
#include <stdio.h>
#include <conio.h>
#define F 6
#define C 6
main()
{
int matriz[F][C], i,j, vector [F]={0,0,0,0,0,0};
for(i=0; i<F; i++)
for(j=0; j<C; j++)
{
printf("Ingrese el elemento F=%d y Columna=%d de la matriz:\n", i,j);
scanf("%d", &matriz[i][j]);
vector[i]=vector[i]+matriz[i][j];
}
printf("La Matriz generada es:\n\n");
for(i=0; i<F; i++)
{
for(j=0; j<C; j++)
{
printf("*%d*", matriz[i][j]);
}
printf("\n");
}
printf("Y el vector suma de las filas es:\n\n");
for(i=0; i<F; i++)
printf("%d\t", vector[i]);
getch();
return 0;
}
Creo que no hay mucho por explicar, el uso de una matriz en C, es bastante parecido al
de un vector, pero con las diferencias que en un vector tenemos únicamente una
dimensión y en las matrices tenemos dos.
Ejemplo:
Ejemplo:
8 1 6
3 5 7
4 9 2
#include <stdio.h>
#include <conio.h>
#define N 11
#define M 11
int comprueba (int [N][M], int dim);
void impresion (int [N][M], int dim);
main()
{
int cuadrado[N][M];
int dim, f, c, i;
clrscr();
printf("Introduzca la dimenci¢n por favor:\n");
scanf("%d", &dim);
while(dim<3 || dim>11)
{
printf("ERROR, el valor de la dimenci¢n debe estar entre 3 y 11:\n");
scanf("%d", &dim);
}
while((dim%2)!=1)
{
printf("ERROR el valor de la dimenci¢n debe ser Impar:\n");
scanf("%d", &dim);
}
for(f=0; f<dim; f++)
for(c=0; c<dim; c++)
cuadrado[f][c]=0;
f=0;
c=dim/2;
cuadrado[f][c]=1;
for(i=2; i<=dim*dim; i++)
{
f--;
c++;
if(f<0 && c==dim)
{
f=1;
c=dim-1;
}
if(f<0)
f=dim-1;
if(c==dim)
c=0;
if(cuadrado[f][c]!=0)
{
c--;
f=f+2;
}
cuadrado[f][c]=i;
}
printf("La constante m gica es: %d\n\n", comprueba (cuadrado, dim));
impresion(cuadrado, dim);
getch();
return 0;
}
int comprueba (int cuadrado [N][M], int dim)
{
int magic=1, f,c, consmagic, sum=0, i, j=-1;
consmagic=((dim*dim*dim)+dim)/2;
for(f=0; f<dim; f++)
{
sum=0;
for(c=0; c<dim; c++)
sum=sum+cuadrado[f][c];
if(sum!=consmagic)
magic=0;
}
for(c=0; c<dim; c++)
{
sum=0;
for(f=0; f<dim; f++)
sum=sum+cuadrado[f][c];
if(sum!=consmagic)
magic=0;
}
sum=0;
for(i=0; i<dim; i++)
sum=sum+cuadrado[i][i];
if(sum!=consmagic)
magic=0;
sum=0;
for((i=dim-1); i>=0; i--)
{
j=j+1;
sum=sum+cuadrado[i][j];
}
if(sum!=consmagic)
magic=0;
if(magic==0)
consmagic=0;
return (consmagic);
}
void impresion (int cuadrado[N][M], int dim)
{
int f, c;
printf("\tEL CUADRO GENERADO ES:\n\n");
for(f=0; f<dim; f++)
{
for(c=0; c<dim; c++)
printf("*%d*", cuadrado[f][c]);
printf("\n");
}
}
A
ACCTTIIVVIIDDAADD…
…
¿Cómo se define y se declara una función cuyos parámetros son vectores o matrices?
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
¿Cuáles son las diferencias fundamentales entre un arreglo y una variable simple?
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Ejercicios
Diseñe un programa para producir 2 informes; el primero eue contiene una lista de
las multas de velocidad recolectadas, donde la multa se calcula como la suma del
costo de la corte ($20,000) mas $ 1,250 por cada kph que exceda la velocidad
límite. Prepare una tabla con los siguientes resultados:
MANEJO DE ARCHIVOS
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante aprenda a trabajar con memoria secunadaria, es
decir, el amenjo de archivos.
JJUUSSTTIIFFIICCAACCIIÓÓNN
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
1. Archivos de Texto
2. Archivos binarios
3. Archivos especiales 1: la impresora
4. Archivos especiales 2: salida de errores
A
ARRCCHHIIVVOOSS DDEE TTEEXXTTOO
1. Abrir el archivo.
2. Leer datos de él o escribir datos en él.
3. Cerrar el archivo.
Eso sí, no siempre podremos realizar esas operaciones, así que además tendremos que
comprobar los posibles errores. Por ejemplo, puede ocurrir que intentemos abrir un
archivo que realmente no exista, o que queramos escribir en un dispositivo que sea sólo
de lectura.
Ejemplo:
#include <stdio.h>
main()
{
FILE* archivo;
archivo = fopen("prueba.txt", "wt");
fputs("Esto es una línea\n", archivo);
fputs("Esto es otra", archivo);
fputs(" y esto es continuación de la anterior\n", archivo);
fclose(archivo);
}
“t” avisa de que se trata de un archivo de texto ( text). Como abrimos el archivo para
escribir en él, se creará el archivo si no existía, y se borrará su contenido si ya existía
(más adelante veremos cómo añadir a un archivo sin borrar su contenido).
• Para escribir en el archivo y para leer de él, tendremos órdenes muy parecidas a las
que usábamos en pantalla. Por ejemplo, para escribir una cadena de texto usaremos
“fputs”, que recuerda mucho a “puts” pero con la diferencia de que no avanza de línea
después de cada texto (por eso hemos añadido \n al final de cada frase).
• Finalmente, cerramos el archivo con "fclose".
Ejemplo:
#include <stdio.h>
main()
{
FILE* archivo;
char nombre[80] = "c:\\autoexec.bat";
char linea[81];
archivo = fopen(nombre, "rt");
if (archivo == NULL)
{
printf("No existe el archivo!\n");
exit(1);
}
fgets(linea, 80, archivo);
puts(linea);
fclose(archivo);
}
• En el nombre del archivo, hemos indicado un nombre algo más complejo. En estos
casos, hay que recordar que si aparece alguna barra invertida (\), deberemos
duplicarla, porque la barra invertida se usa para indicar ciertos códigos de control. Por
ejemplo, \n es el código de avance de línea y \a es un pitido. El modo de lectura en
este caso es “r” para indicar que queremos leer ( read) del archivo, y “t” avisa de que
es un archivo de texto.
• Para leer del archivo y usaremos “fgets”, que se parece mucho a “gets”, pero podemos
limitar la longitud del texto que leemos (en este ejemplo, a 80 caracteres) desde el
archivo. Esta cadena de texto conservará los caracteres de avance de línea.
• Si no se consigue abrir el archivo, se nos devolverá un valor especial llamado NULL.
• La orden “exit” es la que nos permite abandonar el programa en un punto. La veremos
con más detalle un poco más adelante.
#include <stdio.h>
main()
{
FILE* archivo;
char nombre[80] = "c:\\autoexec.bat";
char linea[81];
archivo = fopen(nombre, "rt");
if (archivo == NULL)
{
printf("No existe el archivo!\n");
exit(1);
}
while (! feof(archivo)) {
fgets(linea, 80, archivo);
puts(linea);
}
fclose(archivo);
}
Esa será la estructura básica de casi cualquier programa que deba leer un archivo
completo, de principio a fin: abrir, comprobar que se ha podido acceder correctamente,
leer con “while !(feof(…))” y cerrar.
A
ACCTTIIVVIIDDAADD…
…
1. Un programa que pida al usuario que teclee frases, y las almacene en el archivo
“frases.txt”. Acabará cuando el usuario pulse Enter sin teclear nada.
2. Un programa que pregunte un nombre de archivo y muestre en pantalla el
contenido de ese archivo, haciendo una pausa después de cada 25 líneas, para
que dé tiempo a leerlo. Cuando el usuario pulse Enter, se mostrarán las
siguientes 25 líneas, y así hasta que termine el archivo.
Como se puede ver en este ejemplo, suele ser recomendable indicar la anchura que debe
tener cada dato cuando guardamos con “fprintf”, para que se pueda recuperar después de
la misma forma con “fscanf”.
Aun así, “fscanf” tiene el mismo problema que “scanf”: si leemos una cadena de texto, la
considera terminada después del primer espacio en blanco, y lo que haya a continuación
lo asignará a la siguiente cadena. Por eso, cuando manejemos textos con espacios, será
preferible usar “fgets” o bien otras dos órdenes para manejo de archivos que veremos un
poco más adelante.
A
ACCTTIIVVIIDDAADD…
…
1. Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email,
y día, mes y año de nacimiento (estos tres últimos datos deberán ser números
enteros cortos). Deberá tener capacidad para 100 fichas. Se deberá poder
añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar
todos los datos de una persona (se preguntará al usuario cual es el nombre de
esa persona que quiere visualizar). Al empezar el programa, leerá los datos de
un archivo llamado “agenda.dat” (si existe). Al terminar, guardará todos los datos
en ese archivo.
Modos de apertura
Antes de seguir, vamos a ver las letras que pueden aparecer en el modo de apertura del
archivo, para poder añadir datos a un archivo ya existente:
TIPO SIGNIFICADO
r Abrir sólo para lectura.
w Crear para escribir. Sobreescribe el archivo si existiera ya (borrando el
original).
a Añade al final del archivo si existe, o lo crea si no existe.
+ Se escribe a continuación de los modos anteriores para indicar que también
queremos modificar. Por ejemplo: r+ permite leer y modificar el archivo
t Abrir en modo de texto.
b Abrir en modo binario.
A
ARRCCHHIIVVOOSS B
BIINNAARRIIOOSS
Hasta ahora nos hemos centrado en los archivos de texto, que son sencillos de crear y de
leer. Pero también podemos manejar archivos que contengan información de cualquier
tipo.
En este caso, utilizamos “fread” para leer un bloque de datos y “fwrite” para guardar un
bloque de datos. Estos datos que leamos se guardan en un buffer (una zona intermedia
de memoria). En el momento en que se lean menos bytes de los que hemos pedido,
quiere decir que hemos llegado al final del archivo.
Por ejemplo, para leer 10 números enteros de un archivo (cada uno de los cuales
ocuparía 4 bytes, si estamos en un sistema operativo de 32 bits), haríamos
int datos[10];
resultado = fread(&datos, 4, 10, archivo);
if (resultado < 10)
printf("Había menos de 10 datos!");
Al igual que ocurría con “scanf”, la variable en la que guardemos los datos se deberá
indicar precedida del símbolo &. También al igual que pasaba con “scanf”, si se trata de
una cadena de caracteres (bien porque vayamos a leer una cadena de texto, o bien
porque queramos leer datos de cualquier tipo pero con la intención de manejarlos byte a
byte), como char dato[500] no será necesario indicar ese símbolo &, como en este
ejemplo:
#include <stdio.h>
FILE *fichOrg, *fichDest; /* Los dos archivos */
char buffer[2048]; /* El buffer para guardar lo que leo */
char nombreOrg[80], /* Los nombres de los archivos */
nombreDest[80];
int cantidad; /* El número de bytes leídos */
main()
{
/* Accedo al archivo de origen */
printf("Introduzca el nombre del archivo Origen: ");
scanf("%s",nombreOrg);
if ((fichOrg = fopen(nombreOrg, "rb")) == NULL)
{
printf("No existe el archivo origen!\n");
exit(1);
}
/* Y ahora al de destino */
printf("Introduzca el nombre del archivo Destino: ");
scanf("%s",nombreDest);
if ((fichDest = fopen(nombreDest, "wb")) == NULL)
{
printf("No se ha podido crear el archivo destino!\n");
exit(1);
}
/* Mientras quede algo que leer */
while (! feof(fichOrg) )
{
/* Leo datos: cada uno de 1 byte, todos los que me caben */
cantidad = fread( buffer, 1, sizeof(buffer), fichOrg);
/* Escribo tantos como haya leído */
fwrite(buffer, 1, cantidad, fichDest);
}
/* Cierro los archivos */
fclose(fichOrg);
fclose(fichDest);
}
Los cambios con relación a lo que conocíamos de archivos de texto son los siguientes:
• Los archivos pueden no ser de texto, de modo que leemos uno como archivo binario
(con “rb”) y escribimos el otro también como archivo binario (con “wb”).
• Definimos un buffer de 2048 bytes (2 K), para ir leyendo la información por bloques (y
guardando después cada bloque en el otro archivo).
• En la misma línea intento abrir el archivo y compruebo si todo ha sido correcto, con
Esto puede resultar menos legible que hacerlo en dos líneas separadas, como hemos
hecho hasta ahora, pero es más compacto, y, sobre todo, muy frecuente encontrarlo en
“fuentes ajenos” más avanzados, como los que se puedan encontrar en Internet o
cuando se programe en grupo con otras personas, de modo que he considerado
adecuado incluirlo.
• A “fread” le digo que queremos leer 2048 datos de 1 byte cada uno, y él nos devuelve
la cantidad de bytes que ha leído realmente. Para que el fuente sea más fácil de
aplicar a otros casos en los que no sean bloques de 2048 bytes exactamente, suele
ser preferible indicar que queremos leer el tamaño del bloque, usando “sizeof”:
Cuando la cantidad leida sea menos de 2048 bytes, es que el archivo se ha acabado
(lo podemos comprobar mirando esta cantidad o con “feof”).
• “fwrite” se maneja igual que fread: se le indica dónde están los datos, el tamaño de
cada dato, cuantos datos hay que escribir y en qué archivo almacenarlos. En nuestro
ejemplo, el número de bytes que debe escribir será el que haya leido:
A
ACCTTIIVVIIDDAADD…
…
1. Mejorar la agenda anterior, para guardar y leer cada “ficha” (struct) de una vez,
usando fwrite/fread y sizeof, como en el último ejemplo.
• Es de tipo “int”, lo que quiere decir que nos va a devolver un valor, para que
comprobemos si realmente se ha podido saltar a la dirección que nosotros le hemos
pedido: si el valor es 0, todo ha ido bien; si es otro, indicará un error (normalmente,
que no hemos abierto el archivo).
• “archivo” indica el archivo dentro de el que queremos saltar. Este archivo debe estar
abierto previamente (con fopen).
• “posición” nos permite decir a qué posición queremos saltar (por ejemplo, a la 5010).
• “desde” es para poder afinar más: la dirección que hemos indicado con posic puede
estar referida al comienzo del archivo, a la posición en la que nos encontramos
actualmente, o al final del archivo (entonces posic deberá ser negativo). Para no tener
que recordar que un 0 quiere decir que nos referimos al principio, un 1 a la posición
actual y un 2 a la final, tenemos definidas las constantes:
Ejemplo:
Esta orden nos permite saber también la longitud de un archivo: nos posicionamos
primero al final con “fseek” y luego comprobamos con “ftell” en qué posición estamos:
fseek(archivo, 0, SEEK_END);
longitud = ftell(archivo);
Ejemplo:
Leer información de un archivo BMP Vamos a abrir un archivo que sea una imagen en
formato BMP y a mostrar en pantalla si está comprimido o no. Para eso necesitamos
antes saber cómo se guarda la información en un archivo BMP, pero esto es algo fácil
de localizar:
ARCHIVOS .BMP
Un archivo BMP está compuesto por las siguientes partes: una cabecera de archivo, una
cabecera del bitmap, una tabla de colores y los bytes que definirán la imagen. En
concreto, los datos que forman la cabecera de archivo y la cabecera de bitmap son los
siguientes:
Con esta información nos basta para nuestro propósito: la compresión se indica en la
posición 30 del archivo, ocupa 4 bytes (lo mismo que un “int” en los sistemas operativos
de 32 bits), y si es un 0 querrá decir que la imagen no está comprimida.
#include <stdio.h>
main(){
char nombre[60];
FILE* archivo;
int compresion;
puts("Comprobador de imágenes BMP\n");
printf("Dime el nombre del archivo: ");
gets(nombre);
archivo = fopen(nombre, "rb");
if (archivo==NULL)
puts("No encontrado\n");
else
{
fseek(archivo, 30, SEEK_SET);
fread(&compresion, 1, 4, archivo);
fclose(archivo);
if (compression == 0)
puts("Sin compresión");
else
puts ("BMP Comprimido ");
}
}
Ya que estamos, podemos mejorarlo un poco para que además nos muestre el ancho y
el alto de la imagen, y que compruebe antes si realmente se trata de un archivo BMP:
#include <stdio.h>
main()
{
char nombre[60];
FILE* archivo;
int compresion, ancho, alto;
char marca1, marca2;
puts("Comprobador de imágenes BMP\n");
printf("Dime el nombre del archivo: ");
gets(nombre);
archivo = fopen(nombre, "rb");
if (archivo==NULL)
puts("No encontrado\n");
else
{
marca1 = fgetc(archivo); /* Leo los dos primeros bytes */
marca2 = fgetc(archivo);
if ((marca1 =='B') && (marca2 =='M'))
{ /* Si son BM */
printf("Marca del archivo: %c%c\n",
marca1, marca2);
fseek(archivo, 18, SEEK_SET); /* Posición 18: ancho */
fread(&ancho, 1, 4, archivo);
printf("Ancho: %d\n", ancho);
fread(&alto, 1, 4, archivo); /* Siguiente dato: alto */
printf("Alto: %d\n", alto);
fseek(archivo, 4, SEEK_CUR); /* 4 bytes después: compresión */
fread(&compresion, 1, 4, archivo);
fclose(archivo);
switch (compresion)
{
case 0: puts("Sin compresión"); break;
case 1: puts("Compresión RLE 8 bits"); break;
case 2: puts("Compresión RLE 4 bits"); break;
}
}
else
printf("No parece un archivo BMP\n"); /* Si la marca no es BM */
}
}
A
ACCTTIIVVIIDDAADD…
…
1. Mejorar la última versión de la agenda anterior (la que usa fwrite, fread y sizeof)
para que no lea todas las fichas a la vez, sino que lea una única ficha del disco
cada vez que lo necesite, saltando a la posición en que se encuentra dicha ficha
con “fseek”.
2. Hacer un programa que muestre información sobre una imagen en formato GIF
(se deberá localizar en Internet los detalles sobre dicho formato): versión, ancho
de la imagen (en píxeles), alto de la imagen y cantidad de colores.
A
ARRCCHHIIVVOOSS EESSPPEECCIIAALLEESS 11:: LLAA IIM
MPPR
REESSO
ORRA
A
Por ejemplo, en MsDos, se puede mostrar un archivo de texto en pantalla usando TYPE
DATOS.TXT y lo mandaríamos a impresora si redirigimos la salida hacia el dispositivo
llamado PRN: TYPE DATOS.TXT > PRN:
#include <stdio.h>
main()
{
FILE* impresora;
impresora = fopen("prn:", "wt");
fputs("Esto va a la impresora\n", impresora;);
fclose(impresora);
}
(Este mismo ejemplo debería funcionar desde muchas versiones de Windows, con
bastante independencia de la impresora que tengamos instalada).
A
ARRCCHHIIVVOOSS EESSPPEECCIIAALLEESS 22:: SSAALLIIDDAA DDEE EERRRROORREESS
Hemos comentado que en muchos sistemas operativos se puede usar el símbolo “>” para
redirigir hacia “otro sitio” (la impresora o un archivo de texto, por ejemplo) la información
que iba destinada originalmente a la pantalla. Esto funciona, entre otros, en Windows,
MsDos y toda la familia de sistemas operativos Unix (incluido Linux).
Pero en el caso de Linux (y los Unix en general) podemos redirigir además los mensajes
de error hacia otro sitio distinto del resto de mensajes (que iban destinados a pantalla).
Esto se consigue con el símbolo “2>” :
Esta política de separar los mensajes de información y los mensajes de error es fácil de
llevar a nuestros programas. Basta con que los mensajes de error no los mandemos a
pantalla con órdenes como “printf”, sino que los mandemos a un archivo especial llamado
“stderr” (salida estándar de errores).
Estos textos (título, autor y otros) deberían estar rellenos con caracteres nulos al final,
pero es algo de lo que no tenemos la certeza, porque algunas aplicaciones lo rellenan con
espacios (es el caso de alguna versión de WinAmp). Por eso, leeremos los datos con
“fread” y añadiremos un carácter nulo al final de cada uno.
Además, haremos que el programa nos muestre la información de varios archivos: nos
pedirá un nombre, y luego otro, y así sucesivamente hasta que pulsemos Enter sin teclear
nada más.
#include <stdio.h>
#include <string.h>
main()
{
FILE* fich;
char temp[31];
int i;
do
{
/* Pido el nombre del archivo */
printf("\nEscribe el nombre del archivo MP3 a comprobar: ");
gets(temp);
/* Si no teclea nada, terminaré */
if (strcmp(temp,"")==0)
puts("\nAplicacion finalizada.");
/* Si existe nombre, intento abrir */
else
if ( (fich=fopen(temp,"r+b"))!=NULL )
{
/* Si he podido abrir, muestro el nombre */
printf("Nombre del archivo: %s\n",temp);
/* Miro el tamaño del archivo */
fseek(fich,0,SEEK_END);
printf("Tamaño: %d\n",ftell(fich));
/* A 128 bytes está la marca "TAG" */
fseek(fich,-128,SEEK_END);
fread(temp,3,1,fich);
/* Son 3 letras, añado caracter nulo al final */
temp[3]='\0';
if (strcmp(temp,"TAG")!=0)
puts("No se encontró información válida.");
else
{
/* Si existe la marca, leo los datos */
/* Primero, 30 letras de titulo */
fread(temp,30,1,fich);
temp[strlen(temp)]='\0';
printf("Titulo: %s\n",temp);
/* Luego 30 letras de autor */
fread(temp,30,1,fich);
temp[strlen(temp)]='\0';
printf("Artista: %s\n",temp);
/* Ahora vamos a modificar el titulo */
printf("\nIntroduce el nuevo titulo: ");
gets(temp);
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante conozca la forma de depurar los programas
elaborados.
JJUUSSTTIIFFIICCAACCIIÓÓNN
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
C
COONNCCEEPPTTOOSS BBÁÁSSIICCOOSS SSOOBBRREE DDEEPPUURRAACCIIÓÓNN
Para eliminar esos fallos que hacen que un programa no se comporte como debería, se
usan unas herramientas llamadas “depuradores”. Estos nos permiten avanzar paso a
paso para ver cómo avanza realmente nuestro programa, y también nos dejan ver los
valores de las variables.
E
EJJEEM
MPPLLO
OSS D
DEE A
ALLG
GUUN
NOOSS EEN
NTTO
ORRN
NOOSS
El menú “Run” es el que nos permite poner nuestro programa en marcha normalmente
(“Run”), pero también el que nos permite avanzar paso a paso por las órdenes que lo
forman.
• “Trace into” va paso a paso por todas las órdenes del programa. Si hay una llamada a
una función, también sigue paso a paso por las órdenes que forma esa función.
• “Step over” es similar, salvo que cuando haya una llamada a una función, ésta se
tomará como una única orden, sin ver los detalles de dicha función.
En cualquiera de ambos casos, se nos muestra con una línea azul por dónde va
avanzando la depuración.
En la parte inferior de la pantalla aparecerán botones que nos permiten avanzar paso a
paso, saltar las funciones o añadir un “watch” para comprobar el valor de unas variables.
La línea que estamos depurando se marcará en azul (y destacada con una flecha). Los
“watches” estarán visibles en la parte izquierda de la pantalla.
Si usamos otra herramienta de desarrollo, como Anjuta, la depuración puede ser mucho
más sencilla, similar al caso de Turbo C y al de DevC++.
En este caso, podemos depurar fácilmente desde el propio entorno de desarrollo. Aun
así, el primer paso es el mismo que si fuéramos a usar gdb: debemos compilar con la
opción -g. La forma más sencilla de hacerlo es indicar que queremos “activar la
depuración”, desde el menú “Opciones”.
La línea que estamos depurando se indicará mediante una flecha en su margen izquierdo.
EJERCICIOS
IINNTTRROODDUUCCCCIIÓÓNN
Esta unidad busca que el estudiante perfeccione el conocimiento del lenguaje mediante
la elaboración de difrentes ejercicios
JJUUSSTTIIFFIICCAACCIIÓÓNN
O
OBBJJEETTIIVVOO G
GEENNEERRAALL
O
OBBJJEETTIIVVOOSS E
ESSPPEECCÍÍFFIICCOOSS
C
COONNTTEENNIIDDOO
1. Ejercicios varios
E
EJJEERRCCIICCIIOOSS VVAARRIIOOSS
total_estudiantes = total_estudiantes*grupo;
#include <iostream.h>
a. #include <iostream.h>
b. #include < iostream.h>
c. #include <iostream>
10. Si omite la llave final } de un programa, se produce un error. ¿De qué tipo?
11. Suponga que escribe un programa que debe calcualr los intereses de una cuenta
bancaria de un banco que calcula los intereses diariamente, y suponga que lo
escribe mal, de modo que calcula los intereses anualmente. ¿Qué tipo de error de
programación es este?
13. Escriba una instrucción de entrada que coloque la variable la_cifra (de tipo int) un
número que se introduzca mediante el teclado. Anteponga a la instrucción de
entreada una instrucción de solicitud que pida al usuario teclear el número entero.
14. ¿Qué instrucciones debe incluir en un programa para asegurar que, cuando se
envíe su a la salida un número de tipo double, aparezca en la notación ordinaria 3
dígitos después del punto decimal?
15. Escriba un programa completo en C++ que escriba la frase:CREO QUE ESTOY
APRENDIENDO. El programa no hará nada más.
16. Escriba una instrucción de salida que produzca el carácter de nueva línea y el de
tabulación.
17. Escriba un programa corto que declare e inicialice las variables double, uno, dos,
tres, cuatro y cinco con los valores 1.000, 1.414, 1.732, 2.000 y 2.236,
respectivamente. Luego escriba instrucciones de salida para generar la siguiente
leyenda y tabla. Utilice la secuencia de escape de tabulación \t para alinear las
columnas. Si no esta familiarizado con el carácter de tabulación, experimente con
él al efectuar este ejercicio. Una tabulación funciona como un tope mecánico en
una máquina de escribir: hace que las salidas se inicien en la siguiente columna,
que generalmente esta a una distancia igual a un múltiplo de 8 espacios. Muchos
editores y la mayoria de los procesadores de texto tienen tabulaciones ajustables.
Nuestra salida no.
N Raíz cuadrada
1 1.000
2 1.414
3 1.732
4 2.000
5 2.236
3x 3x + y x+y 3x + y
7 z+2
___
x2y/2/c √x/y x≠y 2!r
a = ´b´;
b = ´c´;
c = a;
Cout << a << b << c << ´c´
cifra = (1/3) * 3;
Cout << “(1/3) * 3 es igual a “ << cifra;
21. Escriba un programa completo en C++ que lea dos números enteros y los coloque
en dos variables de tipo int, y luego despliegue tanto la parte entera como el
residuo cuando el primer número se divida entre el segundo. Esto puede hacerse
usando los operadores / y %.
double c = 20;
double f;
f = (9/5) * c + 32.0;
23. Escriba un algoritmo que escriba la palabra Alto si el valor de la variable puntaje
es mayor que 100, y Bajo si el valor de puntaje es 100 o menos. La variable
puntaje es de tipo int.
Programar en C++.
24. Suponga que ahorros y gastos son variables de tipo double a las que se les ha
dado valores. Escriba una instrucción if_else que despliegue la palabra Solvente,
reste al valor de ahorros el valor de gastos, y asigne cero a gastos, siempre que
ahorros sea mayor o igual que gastos. En cambio, si ahorros es menor que
X2 – X – 2
Para describir dónde es positiva esta expresión (es decir, mayor que 0), hay que
describir un cojunto de números que sean menores que la raiz más pequeña (que
es –1), o bien, mayores que la raíz más grande (que es +2). Escriba una
expresión booleana en C++ que sea verdadera cuando esta fórmula tenga valores
positivos. Programar en C++.
X2 – 4X + 3
Para describir dónde es negativa está expresión, hay que describir un cojunto de
números que sean simultáneamente mayores que la raiz más pequeña (+1) y
menores que la raiz más grande (+3). Escriba una expresion booleana en C++
que sea verdadera cuando el valor de esta expresión sea negativo.
if(0)
cout<<” 0 es verdadero”;
else
cout<<”0 es Falso”;
cout<<endl;
if(1)
cout<<” 1 es verdadero”;
else
cout<<”1 es falso”;
cout<<endl;
if(-1)
cout<<”-1 es verdadera”;
else
cout<<”-1 es falso”;
cout<<endl;
X = 10;
while (X > 0)
{
cout<< X <<endl;
X = X – 3;
}
31. ¿Qué salida se produciría en el ejercicio anterior si el signo > se sustituyera por <
X = 10;
do
{
cout<< X<<endl;
X= X-3;
} while(X> 0);
X=-42;
do
{
cout<< X<<endl;
X=X-3;
}while(X>0);
34. ¿Cúal es la diferencia más importante entre una instrucción while y una do-while
X= 10;
while (X >0)
{
cout<< X <<endl;
X = X + 3;
}
36. Haga un programa en C** que lea tres nombres completos(apellidos nombres) y
los muestre en orden alfabético.
37. Haga un programa que encuentre el seno, coseno, arco seno, tangente y
cotangente de un conjunto de ángulos.
38. Hacer un programa que lea un conjunto de letras: si la letra es minúscula la debe
convertir a mayúscula y si es minúscula la debe convertir a mayúscula.
39. Elabore un programa que lea un conjunto de caracteres y diga si el carácter es:
una letra, un número u otro símbolo.
INICIO
LEA: N
MITAD=N/2
I=2
SW=”SI”
MIENTAS (I <=MITAD) ∧ (SW=”SI”) HAGA
SI ( N%I=0)
SW=”NO”
SINO
I=I+1
FIN_SI
FIN_SI
SI (SW=”SI”)
ESCRIBA: N,”SI ES”
SINO
ESCRIBA:N,”NO ES”
FIN_INICIO
#include <iostream.h>
#include <conio.h>
#include <math.h> //Reconoce la raíz mediante la función "sqrt"
main()
{
float a,b,c; /*Se define el tipo de dato_entrada*/
float p,at; /*Se define el tipo de dato_salida*/
cout<<"Ingrese el valor del lado a: ";cin>>a;
cout<<"Ingrese el valor del lado b: ";cin>>b;
cout<<"Ingrese el valor del lado c: ";cin>>c;
p=(a+b+c)/2.0;
at=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<at;
getch();
}
/* otra forma:
cout<<"El area del triangulo de lados "<<a<<", "<<b<<", "<<c<<" es: "<<at;
getch();
*/
#include <iostream.h>
#include <conio.h>
#include <math.h> //Reconoce exp(X), se refiere a "e a la X"
main()
{
float t;
double x,y,z;
cout<<"Ingrese el valor de t: ";cin>>t;
x=pow(t,3)-8*t+4;
y=sin(t)+cos(2*t);
z=exp(3*t+7);
cout<<"El valor de x es: "<<x;
cout<<"\nEl valor de y es: "<<y; /*"\n" se utiliza para saltar a otra linea*/
cout<<"\nEL valor de z es: "<<z;
getch();
}
# include <iostream.h>
# include <conio.h>
void main()
{
clrscr();
int S; float R; const float pi=3.141592;
cout<<"Ingrese cantidad en grados sexagesimales: ";
cin>>S;
R=S*pi/180;
cout<<"\nSu medida en radianes es: "<<R;
getch();
}
# include <iostream.h>
# include <conio.h>
void main()
{
clrscr();
int C; float F;
cout<<"Ingrese cantidad en grados centigrados: ";
cin>>C;
F=9*C/5.0+32;
cout<<"\nSu medida en grados Farenheit es: "<<F;
getch();
}
# include <iostream.h>
# include <math.h>
# include <conio.h>
void main()
{
clrscr();
int x,y; float radio,theta;
cout<<"Ingrese coordenadas rectangulares del punto: ";
cin>>x>>y;
radio=sqrt(x*x+pow(y,2));
theta=atan(y/x);
cout<<"\nSus coordenadas polares son: "<<"\tRadio = "<<radio;
cout<<"\tAngulo = "<<theta;
getch();
}
#include <iostream.h>
#include <conio.h>
#include <math.h> //Reconoce la raiz "sqrt"
main()
{
float a,b,c; /*Se define el tipo de dato_entrada*/
float p,at,r; /*Se define el tipo de dato_salida*/
cout<<"Ingrese el valor del lado a: ";cin>>a;
cout<<"Ingrese el valor del lado b: ";cin>>b;
cout<<"Ingrese el valor del lado c: ";cin>>c;
p=(a+b+c)/2.0; r=p*(p-a)*(p-b)*(p-c);
if (r>=0)
{at=sqrt(r); cout<<at;}
else
{cout<<"No existe tal triangulo...!";}
getch();
}
#include <iostream.h>
#include <conio.h>
main()
{
int a,b,temp;
cout<<"Ingrese un numero: ";cin>>a;
cout<<"Ingrese un segundo numero: ";cin>>b;
if (a>b)
{temp=a;
a=b; b=temp;}
cout<<"Ordenando "<<a<<" y "<<b<<" de menor a mayor seria: "<<a<<" ,
"<<b<<"";
getch();
}
#include <iostream.h>
#include <conio.h>
main()
{
int a,b,c,max,min,temp;
cout<<"Ingrese un numero: ";cin>>a;
cout<<"Ingrese un segundo numero: ";cin>>b;
cout<<"Ingrese un tercer numero: ";cin>>c;
max=a; min=a;
if max<b max=b:
if max<c max=c;
if min>b min=c;
if min>c min=c;
temp=(a+b+c)-(max+min);
cout<<"Ordenando "<<a<<" , "<<b<<" y "<<c<<" de menor a mayor seria:";
cout<<"\n"<<min<<" , "<<temp<<" , "<<max<<"";
getch();
}
#include <iostream.h>
#include <conio.h>
#include <ctype.h>
void main()
{
int i; long x,y,suma=0;
clrscr();
i=0; cout<<"Los elementos de la serie son: \n";
while (i<=143)
{
x=3+2*i; y=-2+3*i; i=i+1;
if (i%7==0)
{
cout<<"\n"<<x<<", "<<y<<", ";
}
else
{
cout<<x<<", "<<y<<", "; suma=suma+x+y;
}
}
cout<<"\nLa suma de todos sus elementos es: "<<suma;
getch();
}
# include <iostream.h>
# include <conio.h>
# include <ctype.h>
void main()
{
int n2,n3,n5; long N,M;
char Rpta;
clrscr();
do {
cout<<"Ingrese numero: "; cin>>N;
M=N; n2=0; n3=0; n5=0;
while (M%2==0) {n2=n2+1; M=M/2;}
while (M%3==0) {n3=n3+1; M=M/3;}
while (M%5==0) {n5=n5+1; M=M/5;}
# include <iostream.h>
# include <conio.h>
# include <ctype.h>
# include <math.h>
void main()
{
int R,k,max,min; long int N,M,suma,suma1,inv; float prom,desv;
char Rpta;
clrscr();
max=0; min=9;
do {
cout<<"Ingrese numero: "; cin>>N;
M=N; inv=0; k=0; suma=0;
while (M>0)
{
R=M%10; inv=inv*10+R; M=M/10;
if (R>max) max=R;
if (R<min) min=R;
suma=suma+R; suma1=suma1+R*R; k++;
}
prom=suma*1.0/k;
desv=sqrt(suma1*1.0/k-pow(prom,2));
cout<<"\nEl mayor numero es :"<<max;
cout<<"\nEl menor numero es :"<<min;
cout<<"\nEl numero tiene "<<k<<" cifras";
cout<<"\nEl promedio de las cifras del numero es "<<prom<<"\n";
cout<<"\nLa desviacion estandar de las cifras del numero es
<<desv<<"\n";
cout<<"\n\nDesea continuar (S/N)? "; cin>>Rpta;
}
while (toupper(Rpta)!='N');
getch();
}
# include <iostream.h>
# include <conio.h>
# include <ctype.h>
void main()
{
int R,k; long N,M,inv;
char Rpta;
clrscr();
do
{
cout<<"Ingrese numero: "; cin>>N;
M=N; inv=0; k=0;
while (M>0)
{
R=M%10; M=M/10;
if (R%2!=0) R=R-1;
inv=inv*10+R; k++;
}
M=inv; inv=0;
while (M>0)
{
R=M%10; M=M/10;
inv=inv*10+R;
}
cout<<"\nEl nuevo numero formado es :"<<inv;
cout<<"\nEl numero tiene "<<k<<" cifras";
cout<<"\n\nDesea continuar (S/N)? "; cin>>Rpta;
}
while (toupper(Rpta)!='N');
getch();
}
# include <iostream.h>
# include <conio.h>
# include <ctype.h>
void main()
{
int i,n1,n2,n3,n4,N,Dato; long suma;
float prom;
char Rpta;
clrscr();
do
{
cout<<"Ingrese numero de datos: "; cin>>N;
i=1; n1=0; n2=0; n3=0; n4=0; suma=0;
while (i<=N)
{
cin>>Dato; suma=suma+Dato;
if (Dato<=8) n1=n1+1;
if (Dato<=13 && Dato>8) n2=n2+1;
if (Dato<=17 && Dato>13) n3=n3+1;
if (Dato>17) n4=n4+1;
i=i+1;
}
prom=suma/(i-1);
cout<<"\nLa Tabla de frecuencias para los datos es: ";
cout<<"\n[00 - 08] "<<n1;
cout<<"\n<08 - 13] "<<n2;
cout<<"\n<13 - 17] "<<n3;
cout<<"\n<17 - 20] "<<n4;
cout<<"\n\nDesea continuar (S/N)? "; cin>>Rpta;
}
while (toupper(Rpta)!='N');
getch();
}
#include <iostream.h>
#include <conio.h>
void main()
{
int anno, i;
clrscr();
i=3;
while(anno!=0)
{
gotoxy(3,i);
cout<<"Ingrese el año (0 para terminar): ";
cin>>anno;
gotoxy(3,i+1);
if (((anno%4)==0 && (anno%100!=0)) || (anno%400==0))
cout<<"El año dado es Bisiesto\n";
else
cout<<"El año dado No es Bisiesto\n"<<"\n";
i=i+2;
}
getch();
}
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>
void main()
{
int N,i; double Dato,Suma=0,Suma1=0,Media,Varianza,Rango;
char Rpta;
clrscr();
do
{
cout<<"Ingrese cantidad de datos: "; cin>>N;
cout<<"\nIngreso de datos\n";
cout<<"Dato 1: "; cin>>Dato;
Suma=Suma+Dato; Suma1=Suma1+pow(Dato,2);
float Mayor, Menor;
Mayor=Dato; Menor=Dato;
for (i=2; i<=N; i++)
{
cout<<"\nDato "<<i<<": "; cin>>Dato;
Suma=Suma+Dato; Suma1=Suma1+pow(Dato,2);
if (Dato<Menor) Menor=Dato;
if (Dato>Mayor) Mayor=Dato;
}
Media=(Suma/N); Varianza=Suma1-pow(Media,2);
Rango=Mayor-Menor;
cout<<"\n\nLas estadisticas para el conjunto de valores dado son:";
cout<<"\nMedia = "<<Media<<" Varianza = "<<Varianza<<" Rango
= "<<Rango;
cout<<"\n\nDesea continuar (S/N): "; cin>>Rpta;
}
while (Rpta != 'N' && Rpta != 'n' );
getch();
}
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
long int Num,n,Inv; int digmenor,digmayor,digito,K;
char Rpta;
do
{
digmenor=9; digmayor=0;
cout<<"Ingrese un numero entero: ";cin>>Num; n=Num;
Inv=0; K=0;
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>
void main()
{
int N,i; float x0,y0,a,b,c,d,dx,x,y,fx,fy,U,L; char Rpta;
clrscr();
do
{
cout<<"Ingrese Numero de particiones: "; cin>>N;
cout<<"\nIngrese limites de la integral: "; cin>>x0>>y0;
cout<<"\nIngrese coeficientes del polinomio: "; cin>>a>>b>>c>>d;
dx=(y0-x0)/N; U=0; L=0;
for (i=0; i<=N; i++)
{
x=x0+i*dx; y=x0+(i+1)*dx;
fx=a*pow(x,3)+b*pow(x,2)+c*x+d;
fy=a*pow(y,3)+b*pow(y,2)+c*y+d;
if (fx<=fy) {U=U+fy; L=L+fx;}
#include <iostream.h>
#include <conio.h>
void main()
{
int N, i;
long int factorial;
clrscr();
gotoxy(1,2);
cout<<"Ingrese número entero (0 para terminar) "; cin>>N;
while(N!=0)
{factorial=1;
for (i=1; i<=N; i++) factorial=factorial*i;
cout<<"El factorial de "<<N<<" es "<<factorial;
cout<<"\nIngrese número entero (0 para terminar) ";
cin>>N;
};
getch();
}
#include <iostream.h>
#include <conio.h>
void main()
{
int N, i;
long int pen, ult, suma,aux;
clrscr(); gotoxy(2,2);
cout<<"Ingrese número de términos para la Serie de Fibonacci (menor que
35) ";
cin>>N; pen=0; ult=1; //Condiciones iniciales
i=2; suma=pen+ult;
cout<<"\n\nLos primeros "<<N<<" términos de la serie de Fibonacci son:\n";
#include <iostream.h>
#include <conio.h>
void main()
{
int N,i, j;
clrscr(); gotoxy(3,2);
cout<<"Ingrese número de estudiantes: "; cin>>N; cout<<"\n";
int nota[100], temp;
for (i=1;i<=N;i++)
{
gotoxy(3,i+3); cout<<"Ingrese nota del estudiante "<<i<<" ";
cin>>nota[i];
}
//Ordenamiento de las notas
for (i=1;i<=N-1;i++)
for (j=i+1;j<=N;j++)
if (nota[i]>nota[j])
{
temp=nota[i];
nota[i]=nota[j];
nota[j]=temp;
}
clrscr();
gotoxy(3,2);
int k=4;
cout<<"Las notas ordenadas en forma ascendente son:";
for (i=1;i<=N;i++)
if (i<=18)
{
gotoxy(4*i,k); cout<<nota[i];
}
else if (i<=36)
{
gotoxy(4*(i-18),k+1); cout<<nota[i];
}
else if (i<=54)
{
gotoxy(4*(i-36),k+2); cout<<nota[i];
}
cout<<"\n"; cout<<"\n";
if (N%2==0)
{
j=N/2; cout<<" La mediana de las notas es: "<<nota[j];
}
else
{
j=(N+1)/2; cout<<" La mediana de las notas es: "<<nota[j];
}
getch();
}
#include <iostream.h>
#include <conio.h>
void main()
{
int M, N, i, j, k;
clrscr();
//Ingreso de datos
gotoxy(2,2);
cout<<"Ingrese número de elementos del primer vector: "; cin>>M;
cout<<"\nIngrese número de elementos del segundo vector: "; cin>>N;
double A[100], B[100], C[100];
for (i=1; i<=M; i++)
{
gotoxy(3,i+4);
cout<<"Ingrese elemento "<<i<<" del primer vector: ";
cin>>A[i];
cout<<"\n";
}
clrscr();
for (j=1; j<=N; j++)
{
gotoxy(3,j+2);
cout<<"Ingrese elemento "<<j<<" del segundo vector: ";
cin>>B[j];
cout<<"\n";
}
k=0;
for (i=1; i<=M; i++)
for (j=1; j<=N; j++)
if (A[i]==B[j])
{
k++;
C[k]=A[i];
}
clrscr();
if (k>0)
{
cout<<"El vector intersección de los vectores A y B es:\n";
for (i=1; i<=k; i++)
{
gotoxy(4*i+1,3);
cout<<C[i];
}
}
getch();
}
#include <iostream.h>
#include <conio.h>
main()
{
int N, i, nota[100], A, B, C, D;
clrscr();
cout<<"Ingrese cantidad de notas N="; cin>>N;
A=0; B=0; C=0; D=0;
cout<<"\nIngrese las notas\n";
for (i=1; i<=N; i++)
{
cin>>nota[i];
if (nota[i]<=7) A++;
else if (nota[i]<=11) B++;
else if (nota[i]<=16) C++;
else D++;
}
cout<<"\n\Histograma de frecuencias\n";
cout<<"A=[01,07] "<<A<<" "; for (i=1; i<=A; i++) cout<<"*"; cout<<"\n";
cout<<"B=[08,11] "<<B<<" "; for (i=1; i<=B; i++) cout<<"*"; cout<<"\n";
cout<<"C=[12,16] "<<C<<" "; for (i=1; i<=C; i++) cout<<"*"; cout<<"\n";
cout<<"D=[17,20] "<<D<<" "; for (i=1; i<=D; i++) cout<<"*"; cout<<"\n";
cout<<"\n";
getch();
}
#include <iostream.h>
#include <conio.h>
main()
{
int M, N, i, j, Fmax, Cmax, Fmin, Cmin; float A[100][100], Mayor, Menor;
clrscr();
cout<<"Ingrese orden de la matriz (M,N) "; cin>>M>>N;
cout<<"\nElementos de la matriz";
for (i=1; i<=M; i++) //Proceso de ingreso de elementos de la Matriz
{
cout<<"\nIngrese elementos de la fila "<<i<<"\n";
for (j=1; j<=N; j++) cin>>A[i][j];
}
Mayor=A[1][1]; Menor=A[1][1];
for (i=1; i<=M; i++)
for (j=1; j<=N; j++)
{
if (A[i][j]>Mayor)
{
Mayor=A[i][j]; Fmax=i; Cmax=j;
}
if (A[i][j]<Menor)
{
Menor=A[i][j]; Fmin=i; Cmin=j;
}
}
cout<<"\n\nEl mayor elemento de la matriz es: "<<Mayor;
cout<<"\nubicado en la fila "<<Fmax<<" y columna "<<Cmax;
cout<<"\n\nEl menor elemento de la matriz es: "<<Menor;
cout<<"\nubicado en la fila "<<Fmin<<" y columna "<<Cmin;
getch();
}
E
ESSTTRRAATTEEGGIIAASS M
MEETTOODDOOLLÓÓGGIICCAASS
R
REECCUURRSSOOSS
IINNDDIICCAADDOORREESS DDEE E
EVVAALLUUAACCIIÓÓNN
C
CRRIITTEERRIIOOSS DDEE E
EVVAALLUUAACCIIÓÓNN