Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCCIÓN A LA COMPUTACIÓN
Hoy en día todas las personas que se inicien en el ámbito de la programación, necesitan
conocer los conceptos básicos de la computación, para poder comprender el
procesamiento de información mediante computadoras y utilizarlas con bases sólidas en
el desarrollo de los programas y su uso en general.
Computadora. Es un dispositivo electrónico capaz de ejecutar cálculos y tomar
decisiones lógicas a velocidades a miles de millones de veces más rápidas de lo que
pueden hacerlo los seres humanos.
El mundo de la alta tecnología nunca hubiera existido de no ser por el desarrollo de la
computadora. Toda la sociedad utiliza estas máquinas, en distintos tipos y tamaños, para
el almacenamiento y manipulación de datos. Los equipos informáticos han abierto una
nueva era en la fabricación gracias a las técnicas de automatización, y han permitido
mejorar los sistemas modernos de comunicación. Son herramientas esenciales
prácticamente en todos los campos de investigación y en tecnología aplicada.
TIPOS DE COMPUTADORAS
En la actualidad se utilizan dos tipos principales de computadoras: analógicas y digitales.
Sin embargo, el término computadora suele utilizarse para referirse exclusivamente al tipo
digital.
Las computadoras analógicas aprovechan la similitud matemática entre las interrelaciones
físicas de determinados problemas y emplean circuitos electrónicos o hidráulicos para
simular el problema físico. Las computadoras digitales resuelven los problemas realizando
cálculos y tratando cada número dígito por dígito.
Las instalaciones que contienen elementos de computadoras digitales y analógicas se
denominan computadoras híbridas. Por lo general se utilizan para problemas en los que
hay que calcular grandes cantidades de ecuaciones complejas, conocidas como
integrales de tiempo. En una computadora digital también pueden introducirse datos en
forma analógica mediante un convertidor analógico digital, y viceversa (convertidor digital
a analógico).
COMPUTADORAS ANALÓGICAS
La computadora analógica es un dispositivo electrónico o hidráulico diseñado para
manipular la entrada de datos en términos de, por ejemplo, niveles de tensión o presiones
hidráulicas, en lugar de hacerlo como datos numéricos. El dispositivo de cálculo analógico
más sencillo es la regla de cálculo, que utiliza longitudes de escalas especialmente
calibradas para facilitar la multiplicación, la división y otras funciones. En la típica
computadora analógica electrónica, las entradas se convierten en tensiones que pueden
sumarse o multiplicarse empleando elementos de circuito de diseño especial. Las
respuestas se generan continuamente para su visualización o para su conversión en otra
forma deseada.
COMPUTADORAS DIGITALES
Todo lo que hace una computadora digital se basa en una operación: la capacidad de
determinar si un conmutador, o ‘puerta’, está abierto o cerrado. Es decir, la computadora
puede reconocer sólo dos estados en cualquiera de sus circuitos microscópicos: abierto o
cerrado, alta o baja tensión o, en el caso de números, 0 o 1. Sin embargo, es la velocidad
con la cual el ordenador realiza este acto tan sencillo lo que lo convierte en una maravilla
de la tecnología moderna. Las velocidades del ordenador se miden en megahercios, o
millones de ciclos por segundo. Una computadora con una velocidad de reloj de 100 MHz,
APUNTES DE PROGRAMACIÓN EN C AUTOR: ING. JORGE LUIS RIVERA HERNÁNDEZ 09 1
velocidad bastante representativa de una microcomputadora, es capaz de ejecutar 100
millones de operaciones discretas por segundo. Las microcomputadoras de las
compañías pueden ejecutar entre 150 y 200 millones de operaciones por segundo,
mientras que las supercomputadoras utilizadas en aplicaciones de investigación y de
defensa alcanzan velocidades de miles de millones de ciclos por segundo.
La velocidad y la potencia de cálculo de las computadoras digitales se incrementan aún
más por la cantidad de datos manipulados durante cada ciclo. Si un ordenador verifica
sólo un conmutador cada vez, dicho conmutador puede representar solamente dos
comandos o números. Así, ON simbolizaría una operación o un número, mientras que
OFF simbolizará otra u otro. Sin embargo, al verificar grupos de conmutadores enlazados
como una sola unidad, la computadora aumenta el número de operaciones que puede
reconocer en cada ciclo.
Por ejemplo, una computadora que verifica dos conmutadores cada vez, puede
representar cuatro números (del 0 al 3), o bien ejecutar en cada ciclo una de las cuatro
operaciones, una para cada uno de los siguientes modelos de conmutador: OFF-OFF (0),
OFF-ON (1), ON-OFF (2) u ON-ON (3). En general, las computadoras de la década de
1970 eran capaces de verificar 8 conmutadores simultáneamente; es decir, podían
verificar ocho dígitos binarios, de ahí el término bit de datos en cada ciclo. Un grupo de
ocho bits se denomina byte y cada uno contiene 256 configuraciones posibles de ON y
OFF (o 1 y 0). Cada configuración equivale a una instrucción, a una parte de una
instrucción o a un determinado tipo de dato; estos últimos pueden ser un número, un
carácter o un símbolo gráfico. Por ejemplo, la configuración 11010010 puede representar
datos binarios, en este caso el número decimal 210, o bien estar indicando al ordenador
que compare los datos almacenados en estos conmutadores con los datos almacenados
en determinada ubicación del chip de memoria.
El desarrollo de procesadores capaces de manejar simultáneamente 16, 32 y 64 bits de
datos ha permitido incrementar la velocidad de las computadoras. La colección completa
de configuraciones reconocibles, es decir, la lista total de operaciones que una
computadora es capaz de procesar, se denomina conjunto, o repertorio, de instrucciones.
Ambos factores, el número de bits simultáneos y el tamaño de los conjuntos de
instrucciones, continúa incrementándose a medida que avanza el desarrollo de las
computadoras digitales modernas.
HISTORIA DE LA COMPUTACIÓN
La primera máquina de calcular mecánica, un precursor de la computadora digital, fue
inventada en 1642 por el matemático francés Blaise Pascal. Aquel dispositivo utilizaba
una serie de ruedas de diez dientes en las que cada uno de los dientes representaba un
dígito del 0 al 9. Las ruedas estaban conectadas de tal manera que podían sumarse
números haciéndolas avanzar el número de dientes correcto. En 1670 el filósofo y
matemático alemán Gottfried Wilhelm Leibniz perfeccionó esta máquina e inventó una que
también podía multiplicar.
El inventor francés Joseph Marie Jacquard, al diseñar un telar automático, utilizó delgadas
placas de madera perforadas para controlar el tejido utilizado en los diseños complejos.
Durante la década de 1880 el estadístico estadounidense Herman Hollerith concibió la
idea de utilizar tarjetas perforadas, similares a las placas de Jacquard, para procesar
datos. Hollerith consiguió compilar la información estadística destinada al censo de
población de 1890 de Estados Unidos mediante la utilización de un sistema que hacía
pasar tarjetas perforadas sobre contactos eléctricos.
LA MÁQUINA ANALÍTICA
También en el siglo XIX el matemático e inventor británico Charles Babbage elaboró los
principios de la computadora digital moderna. Inventó una serie de máquinas, como la
máquina diferencial, diseñadas para solucionar problemas matemáticos complejos.
Muchos historiadores consideran a Babbage y a su socia, la matemática británica Augusta
Ada Byron (1815-1852), hija del poeta inglés Lord Byron, como a los verdaderos
inventores de la computadora digital moderna. La tecnología de aquella época no era
capaz de trasladar a la práctica sus acertados conceptos; pero una de sus invenciones, la
máquina analítica, ya tenía muchas de las características de una computadora moderna.
Incluía una corriente, o flujo de entrada en forma de paquete de tarjetas perforadas, una
memoria para guardar los datos, un procesador para las operaciones matemáticas y una
impresora para hacer permanente el registro.
Primeras computadoras. Las computadoras analógicas comenzaron a construirse a
principios del siglo XX. Los primeros modelos realizaban los cálculos mediante ejes y
engranajes giratorios. Con estas máquinas se evaluaban las aproximaciones numéricas
de ecuaciones demasiado difíciles como para poder ser resueltas mediante otros
métodos. Durante las dos guerras mundiales se utilizaron sistemas informáticos
analógicos, primero mecánicos y más tarde eléctricos, para predecir la trayectoria de los
torpedos en los submarinos y para el manejo a distancia de las bombas en la aviación.
CIRCUITOS INTEGRADOS
A finales de la década de 1960 apareció el circuito integrado (CI), que posibilitó la
fabricación de varios transistores en un único sustrato de silicio en el que los cables de
interconexión iban soldados. El circuito integrado permitió una posterior reducción del
precio, el tamaño y los porcentajes de error. El microprocesador se convirtió en una
realidad a mediados de la década de 1970, con la introducción del circuito de integración
a gran escala (LSI, acrónimo de Large Scale Integrated) y, más tarde, con el circuito de
integración a mayor escala (VLSI, acrónimo de Very Large Scale Integrated), con varios
miles de transistores interconectados soldados sobre un único sustrato de silicio.
Todas las computadoras digitales modernas son similares conceptualmente con
independencia de su tamaño. Sin embargo, pueden dividirse en varias categorías según
su precio y rendimiento: La computadora personal es una máquina de coste relativamente
bajo y por lo general de tamaño adecuado para un escritorio (algunas de ellas,
denominadas portátiles, o laptops, son lo bastante pequeñas como para caber en un
maletín); la estación de trabajo, un microordenador con gráficos mejorados y capacidades
de comunicaciones que lo hacen especialmente útil para el trabajo de oficina; la
minicomputadora, una computadora de mayor tamaño que por lo general es demasiado
cara para el uso personal y que es apta para compañías, universidades o laboratorios; y
el mainframe, una gran máquina de alto precio capaz de servir a las necesidades de
grandes empresas, departamentos gubernamentales, instituciones de investigación
DISPOSITIVOS DE ENTRADA
Estos dispositivos permiten al usuario del ordenador introducir datos, comandos y
programas en la CPU. El dispositivo de entrada más común es un teclado similar al de las
máquinas de escribir. La información introducida con el mismo, es transformada por el
ordenador en modelos reconocibles. Otros dispositivos de entrada son los lápices ópticos,
que transmiten información gráfica desde tabletas electrónicas hasta el ordenador;
joysticks y el ratón o mouse, que convierte el movimiento físico en movimiento dentro de
una pantalla de ordenador; los escáners luminosos, que leen palabras o símbolos de una
página impresa y los traducen a configuraciones electrónicas que el ordenador puede
manipular y almacenar; y los módulos de reconocimiento de voz, que convierten la
palabra hablada en señales digitales comprensibles para el ordenador. También es posible
utilizar los dispositivos de almacenamiento para introducir datos en la unidad de proceso.
DISPOSITIVOS DE SALIDA
Estos dispositivos permiten al usuario ver los resultados de los cálculos o de las
manipulaciones de datos de la computadora. El dispositivo de salida más común es la
unidad de visualización (VDU, acrónimo de Video Display Unit), que consiste en un
monitor que presenta los caracteres y gráficos en una pantalla similar a la del televisor.
Por lo general, las VDU tienen un tubo de rayos catódicos como el de cualquier televisor,
aunque los ordenadores pequeños y portátiles utilizan hoy pantallas de cristal líquido
(LCD, acrónimo de Liquid Crystal Displays) o electroluminiscentes. Otros dispositivos de
salida más comunes son las impresoras y los módem. Modem. Un módem enlaza dos
ordenadores transformando las señales digitales en analógicas para que los datos puedan
transmitirse a través de las telecomunicaciones.
Sistemas operativos. Los sistemas operativos internos fueron desarrollados sobre todo
para coordinar y trasladar estos flujos de datos que procedían de fuentes distintas, como
las unidades de disco o los coprocesadores (chips de procesamiento que ejecutan
operaciones simultáneamente con la unidad central, aunque son diferentes). Un sistema
LENGUAJES DE PROGRAMACIÓN
Lenguaje máquina (bajo nivel). El lenguaje propio del ordenador, basado en el sistema
binario, o código máquina, resulta difícil de utilizar para las personas. El programador
debe introducir todos y cada uno de los comandos y datos en forma binaria, y una
operación sencilla como comparar el contenido de un registro con los datos situados en
una ubicación del chip de memoria puede tener el siguiente formato: 11001010 00010111
11110101 00101011. La programación en lenguaje máquina es una tarea tan tediosa y
consume tanto tiempo que muy raras veces lo que se ahorra en la ejecución del programa
justifica los días o semanas que se han necesitado para escribir el mismo.
Lenguaje ensamblador. Uno de los métodos inventados por los programadores para
reducir y simplificar el proceso es la denominada programación con lenguaje
ensamblador. Al asignar un código mnemotécnico (por lo general de tres letras) a cada
comando en lenguaje máquina, es posible escribir y depurar o eliminar los errores lógicos
y de datos en los programas escritos en lenguaje ensamblador, empleando para ello sólo
una fracción del tiempo necesario para programar en lenguaje máquina.
En el lenguaje ensamblador, cada comando mnemotécnico y sus operadores simbólicos
equivalen a una instrucción de máquina. Un programa ensamblador traduce el código
fuente, una lista de códigos de operación mnemotécnicos y de operadores simbólicos, a
código objeto (es decir, a lenguaje máquina) y, a continuación, ejecuta el programa.
Sin embargo, el lenguaje ensamblador puede utilizarse con un solo tipo de chip de CPU o
microprocesador. Los programadores, que dedicaron tanto tiempo y esfuerzo al
aprendizaje de la programación de un ordenador, se veían obligados a aprender un nuevo
estilo de programación cada vez que trabajaban con otra máquina. Lo que se necesitaba
era un método abreviado en el que un enunciado simbólico pudiera representar una
secuencia de numerosas instrucciones en lenguaje máquina, y un método que permitiera
COMPUTACIÓN
es la ciencia encargada de estudiar los sistemas, más precisamente computadoras, que
automáticamente gestionan información.
COMPUTADORA U ORDENADOR
Máquina electrónica capaz de almacenar información y tratarla automáticamente
mediante operaciones matemáticas y lógicas controladas por programas informáticos.
PROGRAMACIÓN
Es la acción de programar que implica ordenar, estructurar o componer una serie de
acciones cronológicas para cumplir un objetivo. La programación puede ser aplicado
para eventos sociales, a medios de comunicación y al mundo informático de las
computadoras.
ALGORITMO
Un algoritmo se define como un método que se realiza paso a paso para solucionar un
problema que termina en un número finito de pasos.
Ejemplo de algoritmo:
Receta para preparar atole(algoritmo)
1.-Encender la estufa.
2.-Colocar una olla y agregar la leche después ponerla a hervir.
3.-En un recipiente pequeño agregar un poco de leche para disolver la maicena.
4.-Una vez disuelta agregar la maicena a la olla.
5.-Agregar una raja de canela.
6.-Agregar azúcar.
PSEUDOCÓDIGO
Es una descripción de un algoritmo de alto nivel, que emplea una mezcla de lenguaje
natural con algunas convenciones sintácticas propias de lenguajes de programación,
como asignaciones, ciclos y condicionales.
Ejemplo de pseudocódigo:
LA DEFINICIÓN DE UN ALGORITMO
ESTRUCTURAS ALGORITMICAS
Son un grupo de formas de trabajo que permiten mediante la manipulación de variables, realizar
ciertos procesos específicos que nos llevan a la solución de problemas.
Se clasifican en:
Asignación
Secuenciales Entrada
Salida
Simples
ESTRUCTURAS Condicionales
ALGORITMICAS
Múltiples
Hacer para
Hacer mientras
Cíclicas
Repetir hasta
4. Desarrollo de la solución
5. Evaluación de la solución
Ejemplo:
Planteamiento:
Si 3 libros cuestan $320.50, ¿cuántos se pueden comprar con $4500.00?
Identificación del problema:
Entrada:
Costo de 3 libros = $320.50
Cantidad de dinero con el que se cuenta = $4500.00.
Salida:
Total de libros que se pueden comprar con $4500.00.
Alternativas de solución:
Alternativa 1
$4500.00/320.50 = 14
14*3 = 42
Alternativa 2
320.50/3 = 106.83
4500/106.83 = 42
Alternativa 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 320.50 = 3
$ 4487.00 = 42
Elección de una alternativa:
Alternativa 1 es la mas adecuada.
$4500.00/320.50 = 14
14*3 = 42 Se pueden comprar 42 libros
Selecciona la alternativa que se considere más completa, sencilla o mejor, según las
necesidades o el criterio de elección.
.
CONVERSIÓN DE OCTAL A DECIMAL
Regla: Comenzando de la derecha hacia la izquierda, se eleva la base 8 a la potencia 0 y
se multiplica por el dígito correspondiente y así sucesivamente hasta la enésima potencia,
los resultados se suman para obtener el número decimal deseado.
Ejemplo:
5328 = ( ? )10 = 34610
532
1 7 2 5 6 7 3 2 5
2 14 14 15 7 11 13 14 5
2 E E F 7 B D E 5
Los sistemas numéricos octal y hexadecimal se utilizan en computación para reducir cifras
binarias. Los números binarios largos se pueden expresar de forma concisa en sistemas
numéricos con bases más altas que el sistema numérico binario.
Ejemplos:
1 7 2 5 6 7 3 2 5
27 cifras binarias se reducen a 9 cifras octales.
HEXADECIMAL
0010 1110 1110 1111 0111 1011 1101 1110 01012 = 2EEF7BDE516
2 14 14 15 7 11 13 14 5
2 E E F 7 B D E 5
36 cifras binarias se reducen a 9 cifras hexadecimales.
El sistema numérico hexadecimal, es el que mas utilizado para reducir cifras binarias en
computación.
Aplicación de programación en lenguaje C para la conversión de los sistemas numéricos
decimal, binario, octal y hexadecimal.
Ejemplo:
0 0 0 0 0 0 0 0 = 1 Byte o carácter
b7 b6 b5 b4 b3 b2 b1 b0
27x0 + 26 x0 + 25 x0 + 24 x0 +23 x0 + 22 x0 + 21 x0 + 20x0 = 128x0+64x0+32x0+16x0+8x0+4x0+
2x0+1x0 = 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 0
.. = 1 Byte o carácter
1 1 1 1 1 1 1 1
b7 b6 b5 b4 b3 b2 b1 b0
27x1 + 26 x1 + 25 x1 + 24 x1 +23 x1 + 22 x1 + 21 x1 + 20x1 = 128x1+64x1+32x1+16x1+8x1+4x1+
2x1+1x1 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
El número de combinaciones que se pueden realizar en un byte son de 0 hasta 255. La
formula general es: 28 -1 = 256 - 1 = 255 combinaciones.
El código ASCII fue diseñado de tal manera que cada carácter o byte represente un
número decimal. Por ejemplo, A = 65, ..Z = 90, a = 97, b = 98,....z = 122 y otros signos.
La computadora en su interior no entiende números decimales, ni letras ni símbolos. Solo
entiende el sistema binario llamado lenguaje maquina que consiste en trenes de pulsos
altos bajos de 8 bits (bytes). ALTO = = 1 y BAJO = = 0
En el interior de la maquina los bits se representan por pulsos electrónicos ALTOS y
BAJOS . Por ejemplo, al presionar cualquier carácter del teclado en el interior de la
maquina se activa un tren de 8 pulsos electrónicos ALTOS y BAJOS. Estos pulsos se
codifican y decodifican y al final del proceso se visualiza en pantalla el carácter elegido.
Ejemplo:
Convertir a lenguaje maquina el siguiente texto.
El código ASCII es muy práctico porque nos permite tener acceso a cualquier carácter con
solo presionar la tecla Alt y el número decimal correspondiente en el teclado numérico.
Ejemplos:
Alt + 85 = U, Alt + 122 = z, Alt + 94 = ^, Alt + 124 = |, etc.
El código ASCII se clasifica en normal(0 a 127 bytes) y Extendido(128 a 255 bytes).
Dec
Sím
Hex bol DecHexSímbolo DecHexSímbolo DecHexSímbolo
o
16 10 DLE 32 20 (space) 48 30 0
0 0 NUL 17 11 DC1 33 21 ! 49 31 1
1 1 SOH 18 12 DC2 34 22 " 50 32 2
2 2 STX 19 13 DC3 35 23 # 51 33 3
3 3 ETX 20 14 DC4 36 24 $ 52 34 4
4 4 EOT 21 15 NAK 37 25 % 53 35 5
5 5 ENQ 22 16 SYN 38 26 & 54 36 6
6 6 ACK 23 17 ETB 39 27 ' 55 37 7
7 7 BEL 24 18 CAN 40 28 ( 56 38 8
8 8 BS 25 19 EM 41 29 ) 57 39 9
9 9 TAB 26 1A SUB 42 2A * 58 3A :
10 A LF 27 1B ESC 43 2B + 59 3B ;
11 B VT 28 1C FS 44 2C , 60 3C <
12 C FF 29 1D GS 45 2D - 61 3D =
13 D CR 30 1E RS 46 2E . 62 3E >
14 E SO 31 1F US 47 2F / 63 3F ?
15 F SI
64 40 @ 80 50 P 96 60 ` 112 70 p
65 41 A 81 51 Q 97 61 a 113 71 q
66 42 B 82 52 R 98 62 b 114 72 r
67 43 C 83 53 S 99 63 c 115 73 s
68 44 D 84 54 T 100 64 d 116 74 t
69 45 E 85 55 U 101 65 e 117 75 u
70 46 F 86 56 V 102 66 f 118 76 v
71 47 G 87 57 W 103 67 g 119 77 w
72 48 H 88 58 X 104 68 h 120 78 x
73 49 I 89 59 Y 105 69 i 121 79 y
74 4A J 90 5A Z 106 6A j 122 7A z
75 4B K 91 5B [ 107 6B k 123 7B {|
APUNTES DE PROGRAMACIÓN EN C AUTOR: ING. JORGE LUIS RIVERA HERNÁNDEZ 09 21
76 4C L 92 5C \ 108 6C l 124 7C
}
77 4D M 93 5D ] 109 6D m 125 7D
~
78 4E N 94 5E ^ 110 6E n 126 7E
79 4F O 95 5F _ 111 6F o 127 7F
Programa de ejemplo:
//programa que visualiza el codigo ASCII normal y extendido (0 a 255 bytes)
#include<stdio.h>
main()
{
int cont;
for(cont= 0;cont<=255;++cont)
printf("%d %c\t",cont,cont);
return 0;
}
A S
Entrada A o Salida S 0 1 S= A
1 0
Ejemplo:
A 1 o0 o 1 S Si A =1 S = 1 Esto es equivalente a: 1 = 1
A S = 0.0 = 0 B A S S = A.B
S 0.1 = 0 0 0 0
B 1.0 = 0 0 1 0
1.1 = 1 1 0 0
1 1 1
. COMPUERTA LÓGICA OR ( o )
Esta entrega a la salida 0 si las entradas son 0 y, 1 si las entradas son diferentes o igual a
1.
Ejemplo:
Número de combinaciones 22 = 4
Símbolo tradicional Interpretación Tabla de verdad Expresión booleana Símbolo IEC
S = 0+0 = 0 B A S S= A+B
A 0+1 = 1 0 0 0
------ S 1+0 = 1 0 1 1
B 1+1 = 1 1 0 1
1 1 1
La compuerta OR se puede comparar con un circuito eléctrico poniendo los interruptores
en paralelo para encender un foco.
Ejemplo:
A
Cerrado = 1 Abierto = 0 Foco encendido = 1
Si el interruptor A se cierra y el interruptor B se mantiene
B S abierto el foco se enciende. Con una sola condición que
~ se cumpla el foco se encenderá.
S = 00 = 1 B A S S= AB
A 01 = 0 0 0 1
o----- S 10 = 0 0 1 0
B 11 = 1 1 0 0
1 1 1
Ejemplo:
Cierto = 1
True = 1
Falso = 0
False = 0
.
CAPÍTULO 2
ANTECEDENTES HISTÓRICOS DE C
Lenguaje C o también conocido como “Lenguaje de programación de sistemas” fue
desarrollado en los años setenta por Dennis Ritchie en Bell Telephone Laboratories, inc.
Este lenguaje es el resultado de dos lenguajes anteriores, el BCPL y el B, que se
desarrollaron anteriormente. C se usó únicamente en los laboratorios Bell hasta 1978,
cuando Brian Kernighan y Dennis Ritchie publicaron una descripción definitiva del
lenguaje “K&R C“.Tras la publicación de K&R, los profesionales de las computadoras,
impresionados por las características del lenguaje C, comenzaron a promover su uso. Por
la mitad de los ochenta, la popularidad de C se había extendido por todas partes. Se
habían escrito numerosos compiladores e interpretes de C para computadoras de todos
los tamaños y se habían desarrollado muchas aplicaciones comerciales. Muchas de estas
que se habían escrito en otros lenguajes se reescribieron en C para tomar partido de su
eficiencia y portabilidad.
La mayoría de las implementaciones de C diferían en algo de la definición original de
K&R. Esto creó pequeñas incompatibilidades entre las diferentes implementaciones del
lenguaje. Debido a este problema, el Instituto Nacional Americano de Estándares (ANSI).
Estableció un comité para crear un estándar de C. Esto se logró en el año de 1990,
apareciendo Turbo C. Turbo C es un compilador rápido y eficiente, satisfaciendo así las
necesidades de una amplia variedad de programadores.
Este lenguaje de programación está orientado a los Sistemas operativos y es muy eficaz y
con él podemos crear Software de sistemas operativos como Windows, Linux y también
para aplicaciones. También sirve para experimentos informáticos, físicos, matemáticos
etc. es también muy utilizado en robótica con el que se programan simuladores, etc.
.
LENGUAJE DE PROGRAMCION
DIRECTIVA: #include
Su formato es: #include<archivo.h>
En la redacción de cualquir programa en C, se deben incluir todos los archivos a los que
pertenecen las funciones de biblioteca que se utilecen en su desarrollo.
Ejemplo:
//Progama de aplicación de ladirectiva #include.
#include<stdio.h>
#include<math.h>
#include<conio.h>
main()
{
float x, y,s,t;
printf(“x= \n”); /*archivo #include<stdio.h> */
scanf(“%f”,&x); //archivo#include<stdio.h>
printf(“y=\n ”);
scanf(“%f”,&y); //archivo#include<stdio.h> */
s = pow(x*y,3); //archivo #include<math.h>
t= sqrt(x); // archivo #include<math.h>
getch(); //archivo #include<conio.h>
printf(“s = %f t = %f”,s,t);
}
if(segundo == 59)
{
segundo=0;
minuto = minuto + 1;
}
if(minuto == 59)
{
segundo=0;
minuto = 0;
hora = hora + 1;
}
}
}
DIRECTIVA #define
Su formato es: #define nombre texto
Esta directiva indica al procesador que sustituya un dato por otro. Por ejemplo, la
directiva #define TRE 50 sustituirá el valor de 50 cada vez que TRE aparezca en el
programa. Tambien se le llama constante simbólica.
DECLARACIONES
Una declaración consiste en un tipo de datos, seguido de uno o más nombres de
variables, finalizando en un punto y coma (;).
Todas las variables deben ser declaradas antes de ser utilizadas.
Ejemplos: char p; int a,b,c; float r1,r2; double x,y,z;
También se le pueden asignar valores iniciales a las variables dentro de la declaración de
tipo:
Ejemplos:
char p = ‘x’;
char texto[ ] = “Hola”;
int a = 3, b = 5, c;
foat x = 0.013, y = -5.2;
COMENTARIOS
La inclusión de comentarios en un programa es una saludable práctica, como lo
reconocerá cualquiera que haya tratado de leer un listado elaborado por otro programador
ó por sí mismo, varios meses atrás. Para el compilador, los comentarios son inexistentes,
por lo que no generan líneas de código, permitiendo abundar en ellos tanto como se
desee.
Los comentarios se escriben entre los delimitadores /* y */. Por ejemplo: /*En C Este es
un comentario */. Parrafo completo. Y // comrntario una sola línea.
En C++ los comentarios se se preceden con dos diagonales //. Por ejemplo: //En C++
esto es un comentario en C tambien se pueden utilizar las //.
.
MUESTRA DE LA ESTRUCTURA DE UN PROGRAMA EN C
.
/*programa que visuliza el número mayor aplicando funciones*/
.
CONCEPTOS BÁSICOS DE C
BIBLIOTECA. Son archivos que contienen las funciones estándar que se pueden usar en
los programas. Estas funciones incluyen todas las operaciones de E/S, así como otras
rutinas útiles.
COMPILACIÓN. Es el proceso durante el cual se traducen una a una las sentencias del
código fuente a código máquina, en esta acción pueden ocurrir errores de sintaxis.
.
PASOS PARA LA EJECUCIÓN DE UN PROGRAMA EN C
Edición
(código fuente)
Compilación
(del código
fuente)
NO
SI
Erro
r
NO
Enlazador
NO
SI
Erro
NO
r
Ejecución
SI NO
Erro
r
NO
Final
EJEMPLOS DE PROGRAMAS EN C
#include<stdio.h>
/*Presentación de un trabajo*/
main()
{
printf(“Nombre del alumno:-----------------------------\n”);
printf(“No. de control: ------------------------------------\n”);
printf(“Escuela:----------------------------------------------\n”);
printf(“Carrera:-----------------------------------------------\n”);
printf(“Materia:-----------------------------------------------\n”);
printf(“Hora:---------------------------------------------------\n”);
printf(“Maestro:----------------------------------------------\n”);
printf(“Lugar y fecha:--------------------------------------\n”);
return 0;
}
ELEMENTOS BÁSICOS DE C
Lenguaje c se auxilia de ciertos elementos básicos para la construcción de programas
como: el conjunto de caracteres, secuencias de escape, identificadores, palabras clave,
tipos de datos, constantes, arreglos, declaraciones, expresiones, sentencias y
operadores.
CONJUNTO DE CARACTERES DE C
En la elaboración de programas en C se pueden utilizar para formar los elementos
básicos (constantes, variables, operadores, expresiones) las letras mayúsculas de la A a
la Z, las minúsculas de la a a la z , los dígitos del 0 al 9 y ciertos caracteres especiales.
Lista de caracteres especiales.
! * / % + - \ < > = & | ^ # ( ) { } [ ] ~ , ; " _ : ' ? . (blanco)
La mayoría de las versiones del lenguaje también permiten que otros caracteres, como @
y $, se incluyan en comentarios y cadenas de caracteres por medio de las funciones de
biblioteca printf() y puts().
Ejemplos: Printf(“@”); Puts(“@”); o Printf(“$”); Puts(“$”);
SECUENCIAS DE ESCAPE
En C también se utilizan combinaciones de caracteres no imprimibles como: el retroceso
de un espacio \b, un salto de línea \n, un tabulador \t, un sonido bell \a, etc. solo se utilizan
en las cadenas de caracteres de las funciones de biblioteca printf() y Puts(),
Ejemplos:
printf(“Hola\namigos\ncomo van los estudios en C.”);
\n indica al compilador que el texto escrito se visualice en pantalla de la siguiente forma:
Hola
amigos
como van los estudios en C.
printf(“\tBuenas tardes.”);
\t indica al compilador que el texto escrito se visualice en pantalla de la siguiente forma:
Buenas tardes.
Una secuencia de escape siempre representa un solo carácter, aún cuando se escriba
con dos o más caracteres.
Ejemplos:
‘\102’ secuencia de escape en octal que representa el número decimal 66 y la letra B en el
código ASCII.
‘\x45’ secuencia de escape en hexadecimal que representa el número decimal 69 y la letra
E en el código ASCII.
IDENTIFICADORES
Los identificadores son nombres que se les da a varios elementos de un programa, como
variables, constantes, funciones Y arreglos. Un identificador está formado por letras y
dígitos, en cualquier orden, excepto el primer carácter, que debe ser una letra o un
carácter de subrayado.
Se pueden utilizar mayúsculas y minúsculas (no acentuadas), aunque no se pueden
intercambiar, esto es, una letra mayúscula no es equivalente a su correspondiente
minúscula de acuerdo al código ASCII.
El carácter de subrayado se utiliza frecuentemente para unir varias palabras y así formar
un identificador.
Ejemplos:
El_area_del_triangulo_es El_porcentaje_es
La longitud de los identificadores no se limita, aunque el compilador sólo reconoce los 31
primeros caracteres. Los demás caracteres son utilizados para la comodidad del
programador, esto depende del compilador que se utilice.
Ejemplos de cómo deben escribirse los identificadores:
correcto: Incorrecto:
q 6q Carácter ilegal (el número al inicio)
Area A-rea Carácter ilegal (-)
El_cubo _es_igual_a El-cubo-es_igual_a Carácter ilegal (´)
Espec. de
Tipo de dato Tamaño Rango formato
char 8 bits -128 a 127 %c ó %d
unsigned char 8 bits 0 a 255 %c ó %d
Short int 16 bits -32,768 a 32,767 %hd
int 32 bits -2,147,483,648 a 2,147,483,647 %i ó %d
unsigned int 32 bits 0 a 4,294,967,295 %u
float 32 bits 3.4x10e-38 a 3.4x10e38 %f ó %g ó %e
double 64 bits 1.1x10e-308 a 1.7x10e308 %lf
bool 8 bits 0a1
Para la definición de variables se debe poner primero el tipo de dato a definir y luego el
nombre de la variable, (si se desea inicializarla se le puede asignar un valor. Ejemplo:
#include <stdio.h>
#define va_int 805
#define va_float 332.41e-1
main () {
printf(" %f ", va_float); /* imprime 33.241*/
printf(" %.1f ", va_float); /* imprime 33.2*/
printf(" %.4f ", va_float); /* imprime 33.2410*/
printf(" %1.4e ", va_float); /* imprime 3.3241e+01*/
printf(" %d ", va_int); /* imprime 805*/
printf(" %10f", va_float); /* imprime 33.241*/
return 0;
}
CONSTANTES
En C se usan cuatro tipos básicos de constantes: constantes enteras, constantes de coma
flotante, constantes de carácter y constantes de cadena de caracteres (también se utilizan
las constantes enumeradas que se tratarán en capítulos avanzados).
Las constantes son datos referenciados a través de un identificador, cuyo valor no varía a
lo largo de toda la ejecución de un programa.
CONSTANTES ENTERAS
Una constante entera, es un número con un valor entero que se puede escribir en tres
sistemas numéricos: decimal, octal o hexadecimal.
Las constantes enteras y de coma flotante representan números. Por tal motivo se les
denomina de tipo numérico.
Reglas para el uso de constantes.
1.- No se pueden incluir comas ni espacios en blanco en las constantes.
2.- Una constante puede ir precedida del signo menos (-).
Ejemplo:
El resultado marcará error
#include<stdio.h>
porque el tipo de dato no es el
main()
adecuado debido a que el rango es
{
menor al resultado. En este caso
int a 2000, b = 500, c;
se recomienda el tipo de dato long
c = a*b;
int.
printf(“El resultado de c es: %d\n”,c);
De otro modo
//Programa de aplicacion del código ASCII
#include<stdio.h>
main( )
{
char num;
printf("Ingrese el numero enterro: ");
scanf(“%d”,&num);
printf("El numero %d em ASCII representa al caracter %c",num,num);
}
Se debe tener en cuenta que una constante de carácter (‘c’) no es equivalente a una
constante de cadena de caracteres (“c”). Ya que una constante de carácter tiene un valor
entero correspondiente, mientras que la constante de cadena no tiene valor entero
equivalente.
VARIABLES
Una variable es un identificador que se utiliza para representar cierto tipo de información
dentro del programa. En algún punto del programa se le asigna a la variable un valor que
después se puede recuperar en cualquier momento sin más que hacer referencia la
nombre de la variable.
Una variable contendrá un dato simple como una cantidad numérica o una constante de
carácter. A una variable se le pueden asignar diferentes valores en distintas partes del
programa, de tal manera la variable pude cambiar durante la ejecución del programa. Sin
embargo el tipo de datos asociado a la variable no puede cambiar.
Ejemplos:
p = ’g’; a la variable p se asigna el carácter g
x = 30; a la variable x se asigna el valor numérico 30
F = m*a; a la variable F se asigna el producto de las variables m*a
E = m*v*v/2; a la variable E se asigna el producto de las variables m*v*v/2
ARRREGLOS (ARRAYS)
Un arreglo es un identificador que representa una colección de datos. Cada dato es
representado por su elemento del arreglo correspondiente, de esta forma el primer dato
es representado por el primer elemento del arreglo y así sucesivamente. Los elementos
del arreglo se distinguen unos de otros por el valor que se le asigna al índice.
Ejemplo:
sea la variable y un arreglo de 5 elementos. El primer elemento es y[0], el segundo y[1], y
así sucesivamente. El último elemento será y[4]. Por consecuencia para un arreglo de n
elementos los valores del índice se encontrarán siempre entre 0 y n-1.
Representación esquemática
T A M P I C O \0
0 1 2 3 4 5 6 7 Valor del índice
Nota: si la cadena es de n elementos de le debe agregar un elemento mas debido al
carácter nulo, en caso contrario la cadena se truncaría faltándole una letra.
Ejemplo:
char cadena[7];
T A M P I C \0
0 1 2 3 4 5 6 Valor del índice
Para declarar un arreglo (array), cada variable del arreglo debe ser seguida de un par de
corchetes, con un entero positivo dentro de estos que especifica el tamaño o el número de
elementos del arreglo. Ejemplo: char linea[50]; Un arreglo de tipo carácter también se
puede inicializar en una declaración. Para realizar esta operación el arreglo se escribe con
los corchetes vacíos sin especificar el tamaño, solo se le asigna la cadena de caracteres
encerrada entre comillas, finalizando en punto y coma.
.
Ejemplo:
char texto[] = “México”;//Arreglo unidimensional con asignación
Existen diferentes tipos de arreglos de enteros de caracteres, unidimensionales y
multidimensionales.
Ejemplos de declaraciones:
int dígitos[10] = {1,2,3,4,5,6,7,8,9};
float x[5] = {0,0.12,0,-0.32,0};
char color[3] = { ‘R’,’E’,’D’};
int a[50]; //Arreglo unidimensional
float x[5][6]; //Arreglo bidimensional
float x[5][6][2][3].. ]; //Arreglo multidimensional
printf("%s\n\n", titulo);
for(indice=0; indice < 10; indice++)
printf("5 x %2d = %4d\n", (indice+1), espacios[indice]);
return 0;
}
// Programas de ejemplo
/*Calcular la media de n números, después computar la desviación de cada número
respecto a la media*/
#include<stdio.h>
int n=5;
float lista[] = {3, -2, 12, 4.4, 3.5};
main()
{
int cont;
float media, d, suma = 0;
/*Calcular la media y escribir la respuesta */
for(cont = 0; cont<n; ++cont)
suma+=lista[cont];
media = suma/n;
printf("\nLa media es %5.2f\n\n",media);
/*Calcular y escribir las desviaciones respecto a la media */
for(cont = 0; cont < n; ++cont) {
d = lista[cont] - media;
printf("i=%d x=%5.2f d=%5.2f\n",cont+1,lista[cont],d);
}
}
EXPRESIONES
Una expresión representa una unidad de datos simple, tal como un número o un carácter,
una constante, una variable, un elemento de un arreglo o una referencia de una función.
También puede consistir en una combinación de tales identidades mediante operadores.
Las expresiones también pueden representar condiciones lógicas que son ciertas o falsas.
Las condiciones cierto y falso se representan por los valores enteros 1 y 0,
respectivamente. Por lo tanto las expresiones lógicas representan cantidades numéricas.
Ejemplos:
E = m*v*v/2;
x<=y; p = = q;
a>b&&c<d||p<q; x*=y;
SENTENCIAS
Una sentencia hace que la computadora ejecute una acción. En C se utilizan tres tipos
diferentes de sentencias: sentencias de expresión o de asignación, sentencias
compuestas y de control.
Ejemplos:
#include<stdio.h>
/*Programa que calcula el producto de dos números */
main( )
{ /* Inicia sentencia compuesta */
Instrucciones……..
} /*Termina sentencia compuesta */
SENTENCIAS DE CONTROL
Las sentencias de control se usan para conseguir ciertas acciones especiales en un
programa, como comprobaciones lógicas, bucles y ramificaciones. En algunos casos las
sentencias de control requieren que otras sentencias se encuentren incluidas en ellas.
Ejemplos:
#include<stdio.h>
main()
{
int contador;
for (contador = 1; contador<=500; ++contador){
printf("%d\t”, contador);printf(“Hola…..”);
}
return 0;
}
#include<stdio.h>
main()
{
int contador=1;
while (contador<=500){
printf("%d\t”, contador);
++contador;
}
return 0;
}
#include<stdio.h>
main()
{
int contador=1;
do
{
printf("%d\t”, contador);
++contador;
} while (contador<=500);
return 0;
}
OPERADORES Y EXPRESIONES
Los operadores son símbolos que representan operaciones y, se utilizan para formar
expresiones. Lenguaje C, posee un gran número de operadores que se pueden agrupar
en varias categorías como: operadores aritméticos, operadores monarios, operadores
relacionales, operadores lógicos, operadores de asignación y el operador condicional. Los
datos sobre los que actúan los operadores se llaman operandos. A algunos operadores se
les llama binarios porque requieren dos operandos para ejecutarse, a otros se les llama
monarios o unarios ya que actúan sobre un solo operando, también existe un operador
que actúa sobre tres operandos a este se llama operador condicional.
Un operador sirve para manipular datos.
OPERADORES ARITMÉTICOS
Los operadores aritméticos son aquellos que sirven para realizar operaciones tales como
suma, resta, multiplicación, división y el resto de una división (operador módulo).
Los operandos sobre los que actúan los operadores aritméticos deben representar valores
numéricos. De este modo, los operandos deben ser cantidades enteras, de coma flotante
o caracteres.
En lenguaje C no hay operador de exponenciación. Sin embargo, se utiliza la función de
biblioteca pow que realiza la exponenciación. Esta función pertenece al archivo de
biblioteca #include<math.h>. Ejemplo: pow(x,y) x = base y = exponente pow(x,y)=x y
2
por ejemplo: pow(3,2)=3 =9.
TABLA DE LOS OPERADORES ARITMÉTICOS
OperadorExpresió Significado
n
+ a+b Suma
- a-b Diferencia (o cambio de signo)
* a*b Producto
/ a/b División entera
% a%b Módulo (resto de la división entera)
float a = 1, b = 2, c = 3, d = 4, E, F;
E = a - b/ c * d; E =1-2/3*4 = 1-.666666*4 = 1 - 2.666666 E = -1.666666
F = (a - b)/(c*d) F = (1-2)/(3*4) =(-1)/(12) F = - 0.08333333
Ejemplos:
int i = 5 ++i Equivale a i = i+1 por lo tanto i = 6. Este operador equivale a sumar 1 a la
variable. En caso contrario se resta 1 a la variable int i = 5 –i equivale a i = i-5 por lo
tanto i = 4.
/* De otro modo */
#include <stdio.h>
main()
{
int x = 12;
printf ( "Valor de x = %d\n", x );
printf ( "Valor de x = %d\n", x++ );
printf ( "Valor de x = %d\n", x );
} /*Salida en pantalla: Valor de x=100 Valor de x =100 Valor de x = 101*/
Ejemplos:
/* Programa que determina en tamaño de los tipos de datos */
#include<stdio.h>
main()
{
char c;
int i;
/* De otro modo */
#include<stdio.h>
main()
{
char c;
int i;
float x;
double d;
printf(“char: %d Byte \n”, sizeof (char));
printf(“int: %d Bytes \n”, sizeof (int));
printf(“float: %d Bytes \n”, sizeof (float));
printf(“double: %d Bytes \n”, sizeof (double));
} /*Salida en pantalla: char: 1 Byte int: 2 Bytes float : 4 Bytes double : 8 Bytes*/
Los operadores monarios tienen mayor precedencia que los operadores aritméticos. Por
lo tanto si un operador menos monario actúa sobre una expresión aritmética que contiene
uno o más operadores aritméticos, la operación monaria será la primera llevada a cabo a
menos que la expresión aritmética este encerrada entre paréntesis.
La asociatividad de los operadores monarios es de izquierda a derecha.
OperadorSi
Interpretación
== igual que se cumple si son iguales
!= distinto que se cumple 1 si son diferentes
> mayor que se cumple si el primero es mayor que el segundo
< menor que se cumple si el primero es menor que el segundo
>= mayor o igual que se cumple si el primero es mayor o igual que el segundo
<= menor o igual que se cumple si el primero es menor o igual que el segundo
Ejemplo:
/* Aplicación de operadores relacionales */
#include <stdio.h>
main()
{
int a = 50, b = 20;
printf( "a>b da como resultado %d\n", a>b );
printf( "b<a da como resultado %d\n", b<a );
printf("a==b da como resultado %d\n",a==b);
printf("a>=b da como resultado %d\n",a>=b);
printf("a<=b da como resultado %d\n",a<=b);
printf("a!=b da como resultado %d\n",a !=b);
return 0;
}
OPERADORES DE ASIGNACIÓN
El operador de asignación ( = ) es el mas usado en lenguaje C.
Este es un operador que se utiliza para asignar un valor a una variable. Este valor puede
ser un número que tecleamos directamente u otra variable:
U7h 8
Su formato es:
identificador = expresión
Ejemplo:
Velocidad = distancia/tiempo;
Area = base*altura/2;
a = 100; o a = b;
Se puden asignar valores a varias variables a la vez: por ejemplo: a = b = c = 30; se les
asigna a las variables a, b, c el valor 30. También se pueden asignar variables al valor de
otra variable. Por ejemplo: a = b = c = d; a, b, c toman el valor d.
Ejemplos :
Int a = 10, b=8; declaración de variables
Expresión Expresión equivalente Resultado
a += b; a = a + b; a = 18
a - = b; a = a - b; a=2
a * = b; a = a * b; a = 80
a / = b; a = a / b; a=1
a %= b; a = a % b; a=2
De otro modo:
Si int x = -1; (x<0)?0:100 (1<0)?0:80
-1 es menor que cero por lo tanto la exp1. (-1<0) es cierta, el resultado será 0.
Ver más ejemplos:
int a =2, b =3, c =4;
c *= (a > 0 && a < = 12) ? ++a : a/b; c = c * ((a > 0 &&a <= 12)? ++a : a/b);
c = c*(( 2 > 0 && 2<= 12)? ++2 : 2/3); c = 4 * (++2) = 4 * (2+1) = 4 * 3 = 12 c = 12
int a =80, b =20, c =30; declaración de variables
c *= (a > 0 && a <= 12) ? ++a : a/b; c = c *( (a > 0 && a <= 12)? ++a: a/b);
c = 30*(( 80 > 0 && 80 <= 12)? ++80 : 80/20);c = 30 * (80/20) = 30 * (4) = 30* 4 = 120
c = 120
De otro modo:
int a = 15, b = 5, c = 7, d = 9, p; declaración ve variables
p = (a > b||c > d) ? -- d : a%d; p = (15 > 5||7 > 9) ? -- 9 : 15%9; p = --9 = 8 p=8
Archivo
Función Tipo Propósito Ejemplos
#include<>
Fmod(d1,d2) double Math.h Retorna el resto de d1/d2 con el mismo signo que d1
Abre un archivo llamado s1, del tipo s2.
Fopen(s1,s2) File* Stdio.h
Retorna un puntero al archivo
fprintf(f, ...) int stdio.h Escribe datos en el archivo f (el resto de los argumentos fprintf(f1,"El resultado es %f\n",result);
fputc(c, f) int stdio.h Escribe un carácter en el archivo f fputc(*(p++), stdout);
fputs(s, f) int stdio.h Escribe una cadena de caracteres en el archivo f fputs("esto es una prueba", f1);
Lee i2 elementos, cada uno de tamaño i1 bytes, desde el archivo f hasta la
fread(s,i1,i2,f) int stdio.h fread(buf, strlen(msg)+1, 1, flujo);
cadena s
char*cad;
//asignar memoria a la cadena
malloc.h o
free(p) void Libera un bloque de memoria reservada cuyo principio esta indicado por p. cad=(char *)malloc(50);
stdlib.h
...
free(cad); // liberar memoria
fscanf(f, ...) int math.h Lee datos del archivo f ( el resto de los argumentos fscanf(flujo, %s%f, cad, &f);
Mover el puntero al archivo f una distancia de un byte desde la posición al
Fseek(f,1,f) int Stdio.h
principio del archivo, la posición actual del puntero o el fin del archivo
ftell(f) long int stdio.h Devuelve la posición actual del puntero dentro del archivo f ftell(fichen)
Escribe i2 elementos, cada uno de tamaño 1 bytes, desde la cadena s hasta
fwrite(s, i1, i2, f) int stdio.h num=fwrite(lista,sizeof(char),25,flujo);
el archivo f
while(c=getc(fx) !=EOF {
getc(f) int stdio.h Lee un carácter del archivo f print ("%c",c);
}
int c;
getchar(void ) int stdio.h Lee un carácter desde el dispositivo de entrada estándar while((*c=getchar()) != '\n')
print ("%c",c);
char(punte
gets(s) stdio.h Lee una cadena de caracteres desde el dispositivo de entrada estándar gets(nombre);
ro)
carac=getch();
if (isalnum(carac))
Determina si el argumento es alfanumérico. Devuelve un valor distinto de
isalnum(c) int ctype.h print("%c letra|digito \n",carac);
cero si es cierto; en otro caso devuelve 0
else
printf("%c no letra|digito \n", carac);
Determina si el argumento es alfabético. Devuelve un valor distinto de cero int c;
isalpha(c) int ctype.h
si es cierto; en otro caso devuelve 0. if (isalpha(c)) printf("%c es letra\n",c);
isascii(c) int ctype.h Determina si el argumento es un carácter ASCII. Devuelve un valor int c;
for (i=0;i<10;i++)
rand( ) int stdlib.h Devuelve un entero positivo aleatorio
printf("%6d\",rand());
longitud=strlen(nombre);
strlen(s) int string.h Devuelve el numero de caracteres de una cadena char s[81]="Cadena demo”;
printf("La longitud de s es: %d\n"
strlen(s));
char(punter char *cad="----";
strset(c, s) string.h Pone todos los caracteres de s a c (excluyendo el carácter nulo del final \0)
o) strset (cad,'x'); // cad es ahora xxxx
Pasa la orden al sistema operativo. Devuelve cero si la orden se ejecuta
system(s) int string.h correctamente; en otro caso devuelve un valor distinto de cero, tipicamente system(dir);
-1.
tan(d) double math.h Devuelve la tangente de d y=tan(x);
tanh(d) double math.h Devuelve la tangente hiperbólica de d a=tanh(x);
Devuelve el numero de segundos transcurridos despues de un tiempo base
time(p) long int time.h time(&hora);
designado
toascii int ctype.h Convierte el valor del argumento a ASCII c=toascii(entero);
tolower int ctype.h o Convierte una letra a minúscula c=tolower('s'); //c se convierte en 's'
.
CAPÍTULO 4
La función getchar también se puede utilizar para leer cadenas de caracteres, leyendo en
una sentencia de control la cadena de carácter a carácter.
.
Ejemplos:
#include<stdio.h>
#include<ctype.h>
#define EOL '\n'
main()
{
char leo[100];
/* Leer una línea de texto en minúsculas y escribirlo en mayúsculas */
int cont, aux;
/* Leer la línea */
for(cont = 0; (leo[cont] = getchar()) != EOL; ++cont)
;
aux = cont; /* apuntar el contador de caracteres*/
for (cont=0; cont<aux; ++cont )
/*Escribir la línea en mayúsculas */
putchar(toupper(leo[cont]));
return 0;
}
Junto con las funciones getchar y scanf, también existe una provisión especial para
indicar el final de un archivo dentro del programa. La definición EOF (end of file = fin de
archivo) se da dentro del paquete de entrada-salida estándar stdio.h y el resultado
devuelto por getchar será -1, siempre que se presente el final del archivo.
La expresión (c = getchar()) != EOF) sirve al propósito dual de obtener desde la entrada
el siguiente carácter y, simultáneamente, comprobar si se ha llegado al final del archivo.
.
Ejemplos:
{
char f;
int a;
long q;
float x;
double z;
char leo[100];
………………
scanf (“%[^\n], %c %d %ld %f %lf ”,leo,&f,&a,&q,&x,&z);
........................
}
Ejemplo:
#include<stdio.h>
main()
{
char Texto[100]; //Texto es la variable declarada en la cadena de caracteres
gets(Texto);
puts(Texto);
}
Ejemplos:
/* Programa que guarda datos en memoria y los visualiza en pantalla */
#include<stdio.h>
main()
{
char f ;
int a;
short e;
long q;
unsigned t;
float x;
double z;
char leo[100];
printf(“*********************************** \n”);
printf(“Escribe tu nombre completo \n”);
gets(leo);
printf(“Teclea los valores de f, a, e, q, t, x, z:\n”);
scanf (“%d %d %hd %ld %u %f %lf ”, &f, &a, &e, &q, &t, &x, &z);
/*Aquí se escriben las formulas*/
printf(“%c\n %d\n %hd\n % ld\n %u\n %f\n %lf\n”, f, a, e, q, t, x, z);
puts(leo); // ó printf(“%s”, leo);
return 0;
}
Carácter Significado
%c El dato es un carácter
%d El dato es un entero decimal
%e El dato es un valor en coma flotante en la forma exponencial base 10
%f El dato es un valor en coma flotante
%g El dato es un valor en coma flotante
%h El dato es un entero corto
%i El dato es un entero decimal
%o El dato es un entero octal
El dato es una cadena seguida por un espacio en blanco
%s
(el carácter nulo \0 se añade automáticamente al final
%u El dato es un entero sin signo
%x El dato es un entero hexadecimal en minúsculas
%[^\n] El dato es una cadena que puede contener espacios en blanco, etc.
Carácter Significado
%c El dato se muestra como un carácter
%d El dato se muestra como un entero decimal
%e El dato se muestra como un valor en coma flotante con exponente (min)
%E El dato se muestra como un valor en coma flotante con exponente (may)
%f El dato se muestra como un valor en coma flotante sin exponente
El dato se muestra como un valor en coma flotante usando la conversión de tipo e o f,
%g dependiendo del valor; no se muestran ceros no significativos ni el punto decimal si no es
significativo
%h El dato se muestra como un entero corto
%i El dato se muestra como un entero decimal
%o El dato se muestra como un entero octal
%s El dato se muestra como una cadena de caracteres
%u El dato se muestra como un entero sin signo
%x El dato es un entero hexadecimal en minúsculas
%X El dato es un entero hexadecimal en mayúsculas
%p El dato es un puntero
Prefijo Significado
h Entero corto o entero sin signo corto
l Entero largo, entero largo sin signo o real de doble precisión
L real en doble precisión largo
¿Que es la función fflush (stdout )? Pues bien, cuando se usa la función printf, no se
escribe directamente en la pantalla, sino en una memoria intermedia,
llamada buffer. Cuando el buffer se llena o cuando se introduce un carácter
'\n' es cuando se envía el texto a la pantalla. En este ejemplo se deseaba
que apareciera el mensaje Introduce una letra: y el cursor se quedara justo
después, es decir, sin usar '\n'. Si se hace esto, en algunos compiladores el
mensaje no se muestra en pantalla hasta que se pulsa una tecla. Y la
función fflush (stdout ) lo que hace es enviar a la pantalla lo que hay en ese
buffer.
Ejemplo:
#include <stdio.h>
#include <conio.h>
main()
{
char letra; Salida en pantalla:
printf( "Introduce una letra: " ); Introduce una letra:
fflush( stdout ); Has introducido la letra: a
letra = getch();
printf("\n has introducido la letra :%c", letra );
}
.
/*Programa que calcula el número de días vividos */
#include<stdio.h>
main()
{
char nombre[50];
int edad;
printf("¿Cómo te llamas?\n ");
gets (nombre);
printf("¿Cuántos años tienes?\n");
scanf("%d",&edad);
edad=edad*365;
printf("%s, has vivido %d dias\n",nombre,edad);
printf("Pulsa cualquier tecla para terminar...");
}
/*Programa que saca las raíces de una ecuación de este tipo Ax*x+Bx+C=0 */
#include<stdio.h>
#include<math.h>
void main()
{
float A,B,C,raiz,sol1,sol2;
printf("\nIntroduzca el termino de la x al cuadrado: ");
scanf("%f",&A);
printf("\nIntroduzca el termino de la x: ");
scanf("%f",&B);
printf("\nIntroduzca el termino independiente: ");
scanf("%f",&C);
raiz=B*B-4*A*C;
.
/* Programa que calcula potencias de base real positiva y exponente entero*/
#include <stdio.h>
float potencia (float, int);
main ( )
{
int exponente;
float base;
printf ("Introducir BASE y EXPONENTE: ");
scanf ("%f%d", &base, &exponente);
if ( base <= 0.0 ) printf ("Solo admito bases positivas \n");
else { if ( exponente > 0 )
printf ("Potencia: %f \n", potencia(base, exponente));
else
printf ("Potencia: %f \n",1.0/potencia(base, -exponente));
}
}
float potencia (float b, int e)
{
if ( b == 1.0 ) return (1.0);
else {
if ( e == 1 ) return ( b );
else {
int i; float p=1.0;
for ( i=1; i<=e; i++ ) p=p*b;
return ( p );
}
}
}
SENTENCIA CONDICIONAL if
La sentencia if solo se ejecuta si la condición es cierta = 1. En caso contrario el programa
sigue su curso sin ejecutar la sentencia.
Su formato es:
if (condición) sentencia;
Ejemplos:
/* Uso de la sentencia condicional if */
.
// programa que dice el tipo de angulo
# include <stdio.h>
main()
{
float Angulo;
// Instrucciones ejecutables
printf("Teclee el valor de angulo: ");
scanf("%f",&Angulo);
if (Angulo < 90)
printf("El angulo es agudo");
if (Angulo == 90)
printf("El angulo es recto ");
if (Angulo>90 && Angulo<180)
printf("El angulo es obtuso ");
if (Angulo == 180)
printf("El angulo es llano ");
if (Angulo>180 && Angulo<360)
printf("El angulo es concavo ");
printf("<Intro> Para continuar...");
}// Fin del programa
.
//Programa que dados tres números determina el mayor
#include<stdio.h>
main()
{
int i,j,k,mayor;
printf("i= ");
scanf("%d",&i);
printf("j=");
scanf("%d",&j);
printf("k= ");
scanf("%d",&k);
mayor=i;
if(j>mayor)
mayor=j;
if(k>mayor)
mayor=k;
printf(" El numero mas grande de(%d %d %d) es:%d\n\n",i,j,k,mayor);
printf(“Adios”);
return 0:
}
Formato:
if(condición)
{
.
Ejemplos:
/* Uso de la sentencia condicional if else */
#include<stdio.h>
main()
{
int p;
printf( "Teclea un número " );
scanf( "%d", &p );
if ( p==50 ){
printf ( "El número que introdujo es cincuenta.\n" );
}
else{
printf ( "El número que introdujo no es cincuenta.\n" );
}
}
/*Programa que dice: un triangulo es rectangulo despues de haberle dado los dos catetos
y la hipotenusa. */
#include<stdio.h>
main()
{
int C1,C2,C3,m;
printf("\nIntroduzca los lados: ");
scanf("%d%d%d",&C1,&C2,&C3);
if(C1>C2)
{
m=C2;
C2=C1;
C1=m;
}
if(C3>C2)
{
m=C2;
C2=C3;
C3=m;
}
if(C2*C2==C3*C3+C1*C1)
printf("\nEl triangulo es rectangulo");
else
printf("\nEl triangulo no es rectangulo");
return 0;
}
Ejemplos:
/*Leer dos números enteros y escribir el mayor de ambos o un mensaje si son iguales. */
#include <stdio.h>
main()
{
int a,b;
printf("Dame dos numeros... ");
scanf("%d%d",&a,&b);
if (a>b) printf("El mayor numero es... %d",a);
else if (b>a)printf("El numero mayor es.... %d",b);
else printf("Los numeros son iguales");
return 0;
}
/* Escribe bebé, niño o adulto */
#include <stdio.h>
main()
{
int edad;
printf("Introduce tu edad: ");
scanf("%d",&edad);
if (edad<1)
printf("Lo siento, te has equivocado.");
else if (edad<3) printf("Eres un bebé");
else if (edad<13) printf("Eres un niño");
else if (edad<18) printf("Eres un adolescente");
else if (edad<13) printf("Eres unjoven");
else printf("Eres adulto");
return 0;
}
Cada case puede incluir una o más sentencias sin necesidad de ir entre llaves, ya que se
ejecutan todas hasta que se encuentra la sentencia break. La variable evaluada solo
puede ser declarada en tipo entero o carácter.
default ejecutará las sentencias que incluya, en caso de que la opción escogida no exista.
La sentencia switch sirve par elegir una opción entre varias disponibles. Aquí no tenemos
una condición que se debe cumplir sino el valor de una variable, dependiendo del valor se
cumplirá un caso u otro.
Vamos a ver un ejemplo de múltiples casos con if-else y luego con switch.
Como vemos el código con switch es más cómodo de leer.
.
Ejemplos:
/*Aplicación de la sentencia switch */
#include <stdio.h>
main()
{
int num;
printf( "Introduce un número " );
scanf( "%i", &num );
switch( num )
{
case 1: printf( "Es un 1\n" );
break;
case 2:printf( "Es un 2\n" );
break;
case 3:printf( "Es un 3\n" );
break;
default:
printf( "No es ni 1, ni 2, ni 3\n" );
}
}
El inicio indica una variable (variable de control) que condiciona la repetición del bucle.Si
hay más, van separadas por comas.
La condición es una expresión relacional que determina cuando finaliza el ciclo.
El incremento define como cambia la variable de control cada vez que se repite el ciclo.
También se puede poner más de una condición. Los elementos de cada sección se
separan por comas. Cada sección se separa por punto y coma.
Como se ve en el ejemplo, si se tiene más de una variable en la sección de inicialización y
en la de incrementos estas deben ir separadas por comas.
Por ejemplo: for (a=1,b=100;a!=b;a++,b- -){
/*De otro modo cuando se usan dos o más instrucciones hay que utilizar las llaves*/
#include <stdio.h>
void main()
{
int i;
for ( i=0 ; i<100 ; i++ ) {
printf( "Adios\n" ); printf(“Amigos\n”);
}
}
formato:
Tipo de dato variable = valor inicial
while(condicion) {
instrucciones;
incremento;
}
/*Programa que escribe los números del 1 al 10 */
#include <stdio.h>
main()
{
int numero=1;
while(numero<=10) {
printf("%d\n",numero);
numero++;
}
}
La condición puede ser cualquier expresión, y cualquier valor distinto de cero es cierto. El
ciclo itera mientras la condición es cierta. Cuando la condición se hace falsa, el control del
programa pasa a la línea siguiente al código del ciclo.
La sentencia puede ser: una sentencia vacía, una sentencia simple o un bloque de
sentencias que se repiten.
También tiene una variable de inicio y un incremento
Ejemplos:
/*Programa que escribe de 1 a n números*/
#include <stdio.h>
main()
{
int a,num;
printf ("Escuela: \n");printf ("Nombre:");printf ("No. de control: \n");
printf ("Materia: \n");
printf ("Maestro: \n");printf ("Hora: \n");
printf ("Introduce el número: \n");
scanf("%d",&num);
a=1;
.
/*Programa que escribe los números del 1 al 10 */
#include <stdio.h>
main()
{
int numero=1;
while(numero<=10) {
printf("%d\n",numero); numero++;
}
}
/*Programa que calcula el el promedio de n calificaciones con centinela para parar el no.
de calificaciones */
#include<stdio.h>
main()
{
float promedio, suma;
.
SENTENCIA DE CONTROL do-while
Con esta sentencia se controla la condición al final del bucle. Si ésta se cumple, el
programa vuelve a ejecutar las sentencias del bucle.
La única diferencia entre las sentencias while y do-while es que con la segunda el cuerpo
del bucle se ejecutará por lo menos una vez.
Su formato es:
Int inicio;
do{
instrucciones
………………..
incremento;
}while (condición);
Ejemplos.
/*programa que calcula la media de una serie de números que finaliza al introducir el 999.
El 999 no debe ser tenido en cuenta para la media. */
.
BUCLES ANIDADOS
Los bucles se pueden anidar uno entre otro. Loa bucles internos y externos no necesitan
ser generados por el mismo tipo de estructura de control. Pero es importante que un bucle
se encuentre incluido dentro del otro. Cada bucle debe ser controlado por un índice
diferente.
Ejemplos:
/*Uso de bucles anidados for*/
#include<stdio.h>
main()
{ int i,j,x,y;
printf("introduzca numeros enteros del 1 al 20\n");
scanf("%d%d",&x,&y);
for(i=1;i<=y;i++) {
for(j=1;j<=x;j++)
printf(" @ "); printf("\n");
}
}
SENTENCIA break
Esta sentencia se utiliza para terminar la ejecución de un bucle o salir de una sentencia
switch.
Ejemplos:
#include<stdio.h> /*Programa que utiliza la palabra clave break*/
void main()
{
int x;
for(x=1;x<=10;x++){
if(x==5)
.
#include<stdio.h> /*Interrupcion de un ciclo infinito utilizando la instrucción for */
main()
{
int c;
printf("Introduce un caracter:\n(puslse x para salir)\n");
for(;;) {
c=getchar();
if(c=='x') break;
}
printf("El ciclo infinito ha sido interumpido. ¡Hasta pronto!\n");
}
SENTENCIA continue
Se utiliza dentro de un bucle. Cuando el programa llega a una sentencia continue no
ejecuta las líneas de código que hay a continuación y salta a la siguiente iteración del
bucle.
SENTENCIA goto
.
CAPÍTULO 6
FUNCIONES (MODULARIDAD)
En capítulos anteriores se vio como utilizar funciones de biblioteca con el fin de realizar
cierto número de operaciones o cálculos de uso común, redacción de textos, etc. Sin
embargo, lenguaje C permite también al programador definir sus propias funciones que
realicen determinadas tareas. Esto permite al programador dividir un programa grande en
un cierto número de componentes más pequeñas, cada una de las cuales con un
propósito único e identificable. Por consecuencia un programa en lenguaje C se puede
modularizar mediante el uso inteligente de las funciones.
Función es un segmento de programa que realiza determinadas tareas para desarrollar un
programa.
A una función también se le puede llamar modulo o parte de un programa.
Tipos de funciones:
Funciones de biblioteca: Aplicadas en programas anteriores como, printf(), scanf(), pow(),
etc.
Existen otras funciones que pueden ser escritas o creadas por los programadores cuyas
características son las siguientes:
Los enunciados se escriben una sola vez para definir la función.
Las funciones se invocan por medio de una llamada de función.
La llamada de una función especifica su nombre y proporciona información en forma de
argumentos, que la función necesita para llevar a cabo su tarea designada.
Su formato es:
Tipo de retorno nombre de la función (tipo de dato arg1,...,tipo de dato argn);
El nombre de la función puede ser cualquier identificador válido nunca una palabra clave a
menos que se escriba con letras mayúsculas. (Ejemplo: FLOAT, PRINTF, etc.).
El tipo de valor de regreso: es el tipo de datos del resultado regresado al llamador. Un tipo
de valor de regreso (void) indica que una función no devolverá un valor.
Un tipo de valor de regreso no especificado será tomado por el compilador como tipo int.
Ejemlpo:
#include<archivo.h>
...............
Tipo de regreso nombre de la función(tipo de dato arg1,....,tipo de dato argn);
main()
{
Declaraciones;
secuencia de sentencias
nombre de la función(arg1, arg2,....,argn); /*Llamada de la función */
}
/*Definición de la función */
tipo de retorno nombre de la función(tipo de dato arg1,....,tipo de dato argn)
{
declaraciones
instrucciones
return 0; /*Cuando la función no regresa valores*/
return (expresión); /*Cuando la función regresa valor*/
} /*Fin de la función creada por el usuario*/
Ejemplo:
#include<archivo.h>
float proceso(float a, float b,......,float n); /* Prototipo de la función*/
}
float proceso(float x,float y,float z) /*Encabezado ó definición de la función */
{
Declaraciones;
Secuencia de sentencias; /*Cuerpo de la función */
return resultado de la operación;
}
Los argumentos declarados en la definición de la función, se llaman argumentos formales,
reciben información de los argumentos actuales.
Los argumentos declarados en la llamada de la función se llaman argumentos actuales,
esta información se envía a los argumentos formales.
Ejemplos:
#include <stdio.h>
int cuadrado(int); /*Prototipo de la función*/
main()
{
int x;
for(x=1;x<=20;x++)
printf(“%d”,cuadrado(x)); /*Llamada de la función*/
printf(“\n”);
}
int cuadrado(int y) /*Definición de función */
{
return y*y;
}
/* De otro modo */
#include<stdio.h>
int maximo(int,int,int);
main()
{
int a,b,c;
printf(“Introduce los tres digitos:”);
scanf(“%d%d%d”,&a,&b,&c);
printf(“El maximo es:%d\n”, maximo(a,b,c));
return 0;
}
int maximo(int x,int y,int z)
{
int max=x;
if(y>max)
max=y;
if(z>max)
max=z;
return max;
}
/* programa que muestra tabla de multiplicar, producto por sumas números y números
comprendidos entre dos */
#include <stdio.h>
#include <conio.h>
void tabla(int);
void producto(int,int);
void numeros(int,int);
main()
{
int op,n,m;
do {
clrscr ();
printf ("\n MENÚ DE OPCIONES");
printf ("\n ================\n");
printf ("\n 1.- TABLA DE MULTIPLICAR\n");
printf ("\n 2.- PRODUCTO POR SUMAS\n");
printf ("\n 3.- MOSTRAR NÚMEROS COMPRENDIDOS ENTRE DOS\n");
printf ("\n 4.- SALIR \n\n\n\n");
printf ("\n ELIGE UNA OPCION : ");
.
/*programa para calcular el factorial de un entero n */
#include<stdio.h>
int factn( int n);
main()
{
int n,factorial;
printf("Introduce un nunero entero:"); scanf("%d",&n);
printf("El factorial de %d es: %d",n,factn(n));
}
int factn(int numero)
{
int i;
int producto = 1;
if(numero>1)
for(i=2;i<=numero;++i)
producto*=i;
return producto;
}
#include<stdio.h>
int p=1, q=2;
void dem(void);
main()
{
printf("Antes de la llamada dem(), p = %d\n y q = %d\n",p,q);
dem();
printf("despues de la llamada dem(), p = %d\n y q = %d\n",p,q);
}
void dem(void)
{
int p = 15, q = 12;
printf(" Declaracion local dem(), p = %d\n y q = %d\n",p,q);
}
Ejemplos:
#include<stdio.h> /*Función que modifica el valor de su argumento*/
int modificar(int); /*prototipo de la función*/
main()
{ int x=5;
printf("\nx=%d desde main, antes de llamar a la función", x);
modificar(x); /*Llamadade la función*/
printf("\nx=%d desde main, despues de llamar a la función", x);
}
int modificar(int x) /* Encabezado de la función ó definición de la función*/
{
x*=3;
printf("\nx=%d desde main, despues de modificar el valor", x);
return x;
}
RECURSIVIDAD:
Se llama recursividad a un proceso mediante el cual una función se llama a sí misma de
forma repetida, hasta alcanzar una determinada condición. Este proceso se utiliza para
computaciones repetitivas en las que cada acción se determina en función de un
resultado anterior. Se pueden escribir en esta forma problemas iterativos.
Ejemplos:
*/lcular el factorial de una cantidad entera positiva.
n!=1*2*3*......*n; Esta formula también se puede expresar en forma recursiva.
n!=n(n-1), en la que la acción deseada (el calculo de n!) se expresa en términos de un
resultado anterior, el valor de (n-1)!, que se supone ser conocido. También sabemos que
1! Es por definición el fin del proceso recursivo. */
.
/*Las torres de Hanoi resolución utilizando recursividad*/
#include<stdio.h>
void transferir(int, char,char,char);
void main()
{
int n;
printf("\nEstas son las torres de Hanoi\n");
printf("¿Cuantos discos ?");
scanf("%d",&n);
printf("\n");
transferir(n,'I','D','C');
}
void transferir(int n,char desde,char hacia,char temp)
/* Transferir discos desde un pivote a otro */
/* n = númro de discos */
/* desde = origen */
/* temp = almacenamiento temporal */
{
if(n>0){
/*Mover n-1 discos hasta el pivote temporal*/
transferir(n-1,desde,temp,hacia);
/*Mover el n-ésimo disco desde su origen hasta su destino*/
printf("Mover disco %d desde %c hasta %c\n",n,desde,hacia);getch();
/*Mover los n-1 discos desde el pivote temporal hasta su destino*/
transferir(n-1,temp,hacia,desde);
}
}
ARREGLOS (ARRAYS)
Un arreglo 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 sólo cambiar el índice que lo referencia. El índice será un valor entero y positivo. En C
los arreglos comienzan por la posición 0.
Existen aplicaciones que requieren en su proceso múltiples datos que tienen
características comunes,(como un conjunto de datos numéricos, representados por
y1,y2,y3,.......,yn). En tales situaciones es conveniente colocar los datos en un arreglo
donde todos comparten el mismo nombre. Los datos individuales pueden ser caracteres,
enteros, números en coma flotante, etc. Sin embargo, todos deben ser del mismo tipo.
Cada elemento de un arreglo (cada dato individual) es referido especificando el nombre
del arreglo seguido por uno o más índices, con cada índice encerrado entre corchetes.
Cada índice se debe escribir como un entero no negativo. Por ejemplo: Un arreglo de y de
n elementos se expresa como y[0],[1],..........,[n-1], el valor de cada índice se representa
por una constante entera, una variable entera o una expresión más compleja.
Y es un arreglo de n elementos .
El número de índices determina la dimensionalidad del arreglo. Si, y[1] indica un arreglo
unidimensional, si t[i][k] hace referencia a un arreglo bidimensional y multidimensionales
como p[i][j].....[n].
Un arreglo es una expresión entera positiva encerrada entre corchetes.
La expresión es generalmente una constante entera positiva.
Ejemplos:
/*Conversión de minúsculas a mayúsculas*/
#include<stdio.h>
#include<ctype.h>
#define TAMANO 100
main()
{
char texto[TAMANO];
int cont;
/*Leer línea*/
for(cont = 0; cont < TAMANO; ++cont)
texto[cont] = getchar();
/*Escribir la línea en mayúsculas*/
for(cont=0;cont< TAMANO;++cont)
putchar(toupper(texto[cont]));
putchar('\n');
}
Los arreglos también pueden incluir la asignación de valores iniciales. Estos valores
iniciales deben aparecer en el orden en que serán asignados a los elementos individuales
del arreglo, encerrados entre llaves y separados por comas.
Su formato es:
Tipo de datos nombre del arreglo[expresión]={valor1,valor2,.......,valorn};
Expresión es el número de elementos.
Vaor1 es el primer elemento del arreglo y así sucesivamente.
Ejemplos:
int dígitos[10] = {1,2,3,4,5,6,7,8,9}; El índice de un arreglo de n elementos varía
float x[5] = {0,0.12,0,-0.32,0}; de 0 a n-1.
char color[3] = { ‘R’,’E’,’D’};
Ejemplos:
Cuando se asigna una constante de cadena “NOW”.
char prueba[3] = “NOW”
Prueba[0] = ‘N’
Prueba[1] = ‘O
Prueba[2] = ‘\0’
Esto es incorrecto debido al carácter nulo \0, ya que el arreglo debe ser de cuatro
elementos, de tal manera que la forma correcta de escribirse es:
char prueba[4] = “NOW”;
Prueba[0] = ‘N’
Prueba[1] = ‘O’
Prueba[3] = ‘w’
Prueba[2] = ‘\0’
El tamaño de un arreglo se puede definir al principio de un programa por medio de la
directiva #define tamaño 90
Los corchetes pueden estar vacíos, ya que el tamaño se puede especificar como parte de
la definición.
No se pueden incluir valores iniciales en la declaración.
En los arreglos numéricos cada elemento del arreglo representa una cantidad numérica.
Ejemplos:
/*Calcular la media de n números, después computar la desviación de cada número
respecto a la media */
#include<stdio.h>
.
/*Calcular la media de n números, después computar la desviación de cada número
respecto a la media*/
#include<stdio.h>
int n=5;
float lista[] = {3, -2, 12, 4.4, 3.5};
main()
{
int cont;
float media, d, suma = 0;
/*Calcular la media y escribir la respuesta */
for(cont = 0; cont<n; ++cont)
suma+=lista[cont];
media = suma/n;
printf("\nLa media es %5.2f\n\n",media);
/*Calcular y escribir las desviaciones respecto a la media */
for(cont = 0; cont < n; ++cont) {
d = lista[cont] - media;
printf("i=%d x=%5.2f d=%5.2f\n",cont+1,lista[cont],d);
}
}
Ejemplos:
/*Pasar arreglo de tres elem. a una función donde estos sean alterados */
#include<stdio.h>
void modificar(int y[3]); /*Declaración de función */
main()
{
int cont, y[3]; /* definición de arreglo */
printf("Desde main, despues de llamar a la función :\n");
for(cont = 0; cont <= 2; ++cont) {
y[cont] = cont+1;
printf("y[%d] = %d\n\n",cont, y[cont]);
}
modificar(y);
printf("Desde main, despues de llamar a la función :\n");
for(cont = 0; cont <= 2; ++cont)
printf("y[%d] = %d\n\n",cont, y[cont]);
}
void modificar(int y[ ])
{
int cont;
printf("Desde la función, después de modificar los valores :\n");
for(cont = 0; cont <= 2; ++cont){
y[cont] = -9;
printf("y[%d] = %d\n\n",cont, y[cont]);
}
}
.
ARREGLOS MULTIDIMENSIONALES
Se definen prácticamente del mismo modo que los arreglos unidimensionales.
En este tipo de arreglos se manejan tablas, filas y columnas.
Por ejemplo: Un arreglo bidimensional de [p][q] , puede ser una tabla de valores que tiene
p filas y q columnas, de tal manera que un arreglo tridimensional puede verse como un
conjunto de tablas algo así como un libro en el cual cada página es una tabla y así
sucesivamente.
Su formato es el siguiente:
Tipo de dato nombre[exp1] [exp2]....... [expn];
Por ejemplo:
fila 2
fila 3
fila m
Ejemplos:
int elem [3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
Número de elementos 3*4 = 12.
Esto es, una tabla de tres filas y cuatro columnas (cuatro elementos por fila, como los
valores iniciales se asignan por filas (el último índice se incrementará más rápido), el
resultado de esta asignación es:
int elem[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
El par de llaves externas sirve para contener los pares de llaves internas.
Si los valores son menores al número de elementos, estos se rellenan con ceros.
Por ejemplo:
int elem[3][4] = {1,2,3,4,5,6,7,8,9};
int elem[3][4] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
Esta definición asigna valores solo a los tres primeros elementos de cada fila. De este
modo, los elementos de arreglo tendrán los siguientes valores iniciales.
Ejemplos:
/*Programa para calcular la suma de los elementos de dos tablas de enteros */
#include<stdio.h>
#define MAXF 20
#define MAXC 30
main()
{
int nfil,ncol;
/*definición de arreglo */
int a[MAXF][MAXC], b[MAXF][MAXC], c[MAXF][MAXC];
/* Prototipo de funciones */
void leerentrada(int a[][MAXC], int nfil, int ncol);
void calcularsuma(int a[][MAXC], int b[][MAXC], int c[][MAXC], int nfil, int ncol);
void sacarsalida(int c[][MAXC], int nfil, int ncol);
printf("¿Cuantas filas?\n");
scanf("%d",&nfil);
printf("¿Cuantas columnas?\n");
scanf("%d",&ncol);
printf("\n\nLa primera tabla:\n");
leerentrada(a,nfil,ncol);
printf("La segunda tabla:");
leerentrada(b,nfil,ncol);
calcularsuma(a,b,c,nfil,ncol);
printf("\n\nSuma de los elementos:\n\n");
sacarsalida(c,nfil,ncol);
}
void leerentrada(int a[][MAXC], int m, int n) /*Leer tabla de enteros */
{
int fila, colu;
for( fila =0; fila<m; ++fila) {
printf("\nIntroducir datos para la fila no. %2d\n",fila+1);
for(colu=0; colu<n; ++colu)
scanf("%d", &a[fila][colu]);
}
}
void calcularsuma(int a[][MAXC], int b[][MAXC], int c[][MAXC], int m, int n)
/*Sumar los elementos de las dos tablas de enteros */
{
int fila, colu;
for( fila =0; fila<m; ++fila) {
for(colu=0; colu<n; ++colu)
c[fila][colu] = a[fila][colu]+ b[fila][colu];
}
}
void sacarsalida(int a[][MAXC], int m, int n)
#include<stdio.h>
main()
{
int valores[5] = {100,200,300,400,500};
#include<stdio.h>
void mostrar_arreglo(int arreglo[],int numero_de_elementos)
{
int i;
for(i=0;i<numero_de_elementos;i++)
printf("%d\n", arreglo[i]);
}
void main()
{
int chicos[5] = {1,2,3,4,5};
int grandes[3] = {1000,2000,3000};
mostrar_arreglo(chicos,5);
mostrar_arreglo(grandes,3);
}
#include<stdio.h>
/* Cómo inicializar arreglos multidimensionales */
void imprimir_arreglo(int [][3]);
main()
{
int arreglo1[2][3]={{1,2,3},{4,5,6}};
int arreglo2[2][3]={1,2,3,4,5};
int arreglo3[2][3]={{1,2},{4}};
printf("El arreglo1 es:\n");
imprimir_arreglo(arreglo1);
printf("El arreglo1 es:\n");
imprimir_arreglo(arreglo2);
printf("El arreglo1 es:\n");
imprimir_arreglo(arreglo3);
}
void imprimir_arreglo(int a[][3])
{
int i,j;
for(i=0;i<=1;i++) {
for(j=0;j<=2;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
VECTORES Y MATRICES
Un vector es un arreglo unidimensional, es decir, sólo utiliza un índice para referenciar a
cada uno de los elementos.
Formato:
tipo nombre [tamaño];
El tipo puede ser cualquiera de los ya conocidos y el tamaño indica el número de
elementos del vector (se debe indicar entre corchetes [ ]). En el ejemplo, se podrá
observar que la variable i es utilizada como índice, el primer for sirve para rellenar el
vector y el segundo para visualizarlo. Como se ve, las posiciones van de 0 a 9 total 10
elementos.
Ejemplos:
/* Declaración de un arreglo */
Ejemplos:
int vector[]={1,2,3,4,5,6,7,8};
char vector[]="programador";
char vector[]={'p','r','o','g','r','a','m','a','d','o','r'};
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.
Ejemplo:
/* como se rellena un vector de tipo char. */
#include <stdio.h>
main() /* Rellenamos un vector char */
{
char cadena[20];
int i;
for (i=0;i<19 && cadena[i-1]!=13;i++)
cadena[i]=getche( );
if (i==19) cadena[i]='\0';
else cadena[i-1]='\0';
printf("\n%s",cadena);
}
declaración o prototipo
void visualizar(int *);
desarrollo de la función
void visualizar(int *arreglo)
Matrices
Una matriz es un array multidimensional. Se definen igual que los vectores excepto que
se requiere un índice por cada dimensión.
formato:
tipo nombre [tamaño 1][tamaño 2]...;
Una matriz bidimensional se podría representar gráficamente como una tabla con filas y
columnas.
La matriz tridimensional se utiliza, por ejemplo, para trabajos gráficos con objetos 3D.
En el ejemplo, se puede ver como se rellena y visualiza una matriz bidimensional. Se
necesitan dos bucles para cada una de las operaciones. Un bucle controla las filas y otro
las columnas.
Ejemplos:
/* Matriz bidimensional. */
#include <stdio.h>
main()
{
int x,i,numeros[3][4];
for (x=0;x<3;x++) /*Se rellena la matriz */
for (i=0;i<4;i++)
Ejemplos:
Int i, numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Quedarían asignados de la siguiente manera:
numeros[0][0]=1 numeros[0][1]=2 numeros[0][2]=3 numeros[0][3]=4
numeros[1][0]=5 numeros[1][1]=6 numeros[1][2]=7 numeros[1][3]=8
numeros[2][0]=9 numeros[2][1]=10 numeros[2][2]=11 numeros[2][3]=12
.
También se pueden inicializar cadenas de texto:
Ejemplo:
#include<stdio.h>
main()
{
int i;
char dias[7][10]={"lunes","martes","miércoles","jueves","viernes","sábado","domingo"};
for(i = 0;i<=6;++i)
printf("%s\n",dias[i]);
}
salida en pantalla:
lunes
martes
miércoles
jueves
viernes
sabado
domingo
Para referirse a cada palabra bastaría con el primer índice.
PUNTEROS
Un puntero es una variable que representa la pocisión (más que el valor ) de otro dato, tal
como una variable o un elemento de arreglo. Estos tienen muchas aplicaciones en C. Por
ejemplo, pueden ser usados para trasvasar información entre una función y sus puntos de
llamada , devuelven varios datos desde una función mediante los argumentos de la
función. También permiten que referencias a otras funciones puedan ser especificadas
como argumentos de una función.
Los punteros se relacionan con los arreglos y proporcionan una vía alternativa de acceso
a los elementos individuales del arreglo.También permite que un arreglo multidimensional
sea reemplazado por un arreglo de punteros de menor dimensión. Esta característica
permite que una colección de cadenas de caracteres sean representadas con un solo
arreglo, incluso cuando las cadenas puedan tener distinta longitud.
formato:
tipo_de_dato *nombre_del_puntero;
Si en vez de querer apuntar a una variable tipo char como en el ejemplo hubiese sido de
tipo int, la declaración sería:
int *punt;
Ejemplos:
#include<stdio.h>
void main()
{
int suma, x;
int *y;
suma = 50,
y = &suma,
x = *y;
printf(“El resultado es: %d”,x);
} /*Salida en pantalla: El resultado es: 50*/
/* Asignaciones de punteros. */
#include <stdio.h>
void main() /* Asignación de direcciones */
{
int a;
int *p1,*p2;
p1=&a;
p2=p1;
printf("%p %p",p1,p2);
} /* Salida en pantalla: 19B2 19B2*/
/*Programa que muestra la relación entre dos variables enteras, sus direcciones y sus
punteros asociados */
#include <stdio.h>
main()
{
int x = 5;
int y;
int *px; /*Puntero a un entero */
int *py; /* Puntero a un entero */
px = &x; /* Asigna la dirección de x a px */
y = px; /* Asigna el valor de x a y */
py = &y; /*Asigna la dirección de y a py */
printf("\nx = %d &x = %X px = %X *px = %d", x, &x, px, *px);
printf("\ny = %d &y = %X py = %X *py = %d", y, &y, py, *py);
/*Usando punteros en una comparación, comprobar si dos variables son iguales usando
punteros */
#include <stdio.h>
main()
{
int a, b;
int *punt1, *punt2;
a = 5; b = 5;
punt1 = &a;
punt2 = &b;
if ( punt1 == punt2 )
printf( "Son iguales\n" );
}
Se podría pensar que el if se cumple y se mostraría el mensaje. Son iguales en pantalla.
Pues no es así, el programa es erróneo. Es cierto que a y b son iguales. También es cierto
que punt1 apunta a 'a' y punt2 a 'b'. Lo que se quería comprobar era si a y b eran iguales.
Sin embargo con la condición se esta comprobando si punt1 apunta al mismo sitio que
punt2, comparando las direcciones donde apuntan. Por supuesto a y b están en distinto
sitio en la memoria así que la condición es falsa. Para que el programa funcione se deben
usar los asteriscos:
Ejemplo:
/* Lo correcto es lo siguiente */
#include <stdio.h>
main()
{
int a, b;
int *punt1, *punt2;
a = 5; b = 5;
punt1 = &a; punt2 = &b;
if ( *punt1 == *punt2 )
printf( "Son iguales\n" );
return 0;
} /*Salida en pantalla: Son iguales*/
Ahora sí: se esta comparando el contenido de las variables a las que apuntan punt1 y
punt2. Se debe tener mucho cuidado con esto porque es un error que se cuela con mucha
facilidad.
Cambiando un poco el ejemplo, ahora 'b' no existe y punt1 y punt2 apuntan a 'a'. La
condición se cumplirá porque apuntan al mismo sitio.
ARITMÉTICA DE DIRECCIONES
Es posible desplazar un puntero recorriendo posiciones de memoria. Para se pueden usar
los operadores de suma, resta, incremento y decremento (+, -, ++, - -). Si se tiene un
puntero ( p1 ) de tipo int ( 2 bytes ), apuntando a la posición 30000 y se hace: p1=p1+5; el
Ejemplos:
/*Escribir un programa que de un valor a una variable. Que ésta sea apuntada por un
puntero y sumarle 3 a través del puntero. Luego imprimir el resultado.*/
/* Esta es una posible solución */
#include <stdio.h>
main()
{
int a;
int *b; a = 5;
b = &a;
*b += 3;
printf( "El valor de a es = %d\n", a );
printf( "El valor de a es = %d\n", b );
}
PASO DE PUNTEROS A FUNCIONES
Se ha visto en el capítulo de funciones cómo pasar parámetros y cómo obtener resultados
de las funciones (con los valores devueltos con return). Pero se tiene un inconveniente,
sólo se puede tener un valor devuelto. Los punteros permites modificar varias variables en
una función.
Hasta ahora para pasar una variable a una función se hacía lo siguiente:
Ejmplo:
/* Programa que pasa argumentos a funciones */
#include <stdio.h>
int suma( int a, int b );
main()
{
int var1, var2;
var1 = 5; var2 = 8;
printf( "La suma es : %i\n", suma(var1, var2) );
}
int suma( int a, int b )
{
return a+b;
} /*Salida en pantalla: La suma es 13*/
En este ejemplo se han pasado a la función los parámetros 'a' y 'b' (que no se pueden
modificar) y devuelven la suma de ambos. Suponiendo que se quiera tener la suma pero
además se quiere que var1 se haga cero dentro de la función. Para eso se hace lo
siguiente:
/* Programa que ilustra la vinculación entre los elementos de un arreglo y sus direcciones
*/
#include<stdio.h>
#include<conio.h>
main()
{
static int x[8] = {20,21,22,23,24,25,26,27};
int i;
for(i = 0; i<7; ++i)
printf("\n= %d\n x[i] = %d *(x+i) = %d &x[i] = %X x+i = %X",i, x[i], *(x+i),&x[i], x+i);
}
CAPÍTULO 9
ESTRUCTURAS
Las estructuras (struct) son agrupaciones de una o más variables de tipos posiblemente
diferentes, agrupadas bajo un solo nombre, que permite un manejo más cómodo de la
agrupación de la información. Las struct son estructuras de datos similares a los registros
(record) de Pascal. La forma general de definición es:
struct tipo_estructura
{
tipo miembro_1;
tipo miembro_2;
.....
tipo miembro_n;
} variable_estructura;
Ejemplos:
/*de declaración de estructuras*/
struct datos
{
char nombre[20];
char direccion[20];
int codigo;
APUNTES DE PROGRAMACIÓN EN C AUTOR: ING. JORGE LUIS RIVERA HERNÁNDEZ 09 137
};
struct datos a,b[5]; /* b es un array de estructuras */
Estructuras anidadas: se producen cuando algún miembro de la estructura es a su vez
otra estructura.
Ejemplo:
struct fecha
{
int mes;
int dia;
int anno;
};
struct persona
{
char nombre[20];
struct fecha nacimiento;
};struct persona p;
Ejemplo:
/* Como inicializar una estructura */
#include<stdio.h>
main()
{
struct empleado {
int id;
char nombre[32];
};
/* Inicialización de la estructura */
struct empleado info = {
1,
"b. Smith"
};
printf("Esta es una muestra:\n");
printf("No. ID del empleado: %s\n", info.nombre);
printf("Nombre del empleado: %04d\n\n", info.id);
printf("Cual es su nombre \n");
gets(info.nombre);
printf("Cual es su No. de ID: \n");
scanf("%d", &info.id);
printf("\n Estos son los datos que usted introdujo: \n");
printf("Nombre: %s\n", info.nombre);
printf("No. de ID: %04d\n", info.id);
}
Continuando con las estructuras de los ejemplos anteriores, se pueden tener las
siguientes referencias a miembros:
Ejemplo:
para pasar por valor el miembro a.codigo
void funcion f1(int) /*declaración de la función prototipo*/
f1(a.codigo); /* llamada a la función */
void f1(int x) /* definición de la función */
{ ........
..........}
Paso por dirección de miembros de una estructura a una función.
En el siguiente ejemplo suma es una función que recibe dos estructuras pasadas por valor
y a su vez devuelve una estructura.
struct vector
{
int x,y,z;
};
struct vector (struct vector, struct vector);
void main()
{
struct vector v1,v2,v3;
...
v3=suma(v1,v2);
...
}
struct vector suma(struct vector v1, struct vector v2)
{
v1.x+=v2.x;
v1.y+=v2.y;
v1.z+=v2.z;
return (v1);
}
Ejemplos:
#include <stdio.h>
struct pareja
{
int a,b;
};
void f1(struct pareja *);
void main()
{
struct pareja p = { 13, 17}; /* inicialización de los miembros*/
f1(&p);
printf("valor de a:%d valor de b:%d\n",p.a,p.b); /* escribe 14 y 18 */
}
void f1(struct pareja *q)
{
q->a++; /* equivalente a (*q.a)++ pero más usado */
q->b++;
}
/* Programa que determina el tamaño de una estructura */
#include<stdio.h
#include<conio.h>
main()
{
struct fecha {
int mes;
int dia;
int anno;
};
struct cuenta {
int cuenta_no;
char cuenta_tipo;
char nombre[100];
float anteriorsaldo;
float nuevosaldo;
float saldo;
struct fecha ultimopago;
} cliente;
printf("%d\n",sizeof cliente);
printf("%d\n",sizeof (struct cuenta));
getch();
return 0;
}
.
/* Programa que actualiza una serie de cuentas de clientes */
#include<stdio.h>
struct fecha {
int mes;
int dia;
int anno;
};
struct cuenta {
char nombre[100];
char calle[100];
char ciudad[100];
int cuenta_no;
char cuenta_tipo;
float anteriorsaldo;
float nuevosaldo;
float pago;
struct fecha ultimopago;
} cliente[100];
main()
/* Leer cuentas de clientes, procesar cada una y mostrar la salida*/
{
int i,n;
void leerentrada(int i);
void escribirsalida(int n);
printf("Sistema de cuentas de clientes\n\n");
ARCHIVOS DE DATOS
Los archivos de datos permiten almacenar información de modo permanente, para ser
accedida o alterada cuando sea necesario.
En C existe un conjunto extenso de funciones de biblioteca para crear y procesar archivos
de datos.
Los archivos secuenciales de datos se pueden dividir en dos categorías. En la primera
categoría están los archivos que contienen caracteres consecutivos. Estos caracteres se
pueden interpretar como datos individuales, como componentes de una cadena o como
números. La segunda categoría es a menudo denominada archivos sin formato y organiza
los datos en bloques contiguos de información. Estos bloques representan estructuras de
datos más complejas como arrays y estructuras (struct).
CREACIÓN DE UN ARCHIVO
Un archivo secuencial de datos puede crearse de dos formas distintas. Una es crear el
archivo directamente, usando un editor. La otra es escribir un programa que introduzca
información en la computadora y la escriba en un archivo. Los archivos sin formato sólo
pueden crearse mediante programa.
Cuando se crea un archivo con un programa, lo habitual es introducir la información desde
el teclado y escribirla en el archivo.
Si el archivo consta de caracteres individuales, se pueden usar la funciones getchar (para
obtener caracteres de teclado) y putc (para escribir caracteres en un archivo).
El formato de putc es el siguiente:
putc(variable_de_tipo_caracter,puntero_al_area_de_buffer);
Un archivo creado de esta manera puede ser visualizado de distintas formas:
Usando una orden del sistema operativo tal como type, usando un editor o escribiendo un
programa que lea el contenido y lo muestre. Para ello se pueden utilizar las funciones getc
(para leer caracteres de un archivo) y putchar (para escribir caracteres por pantalla).
El formato de getc es:
variable_de_tipo_caracter=getc (puntero_al_area_de_buffer);
Los archivos de datos que contienen sólo cadenas de caracteres pueden crearse y leerse
más fácilmente con programas que utilizan funciones de biblioteca especialmente
orientadas para cadenas: fgets y fputs.
Muchos archivos de datos contienen estructuras de datos más complicadas, como struct
que incluyen combinaciones de información, caracteres y números. Tales archivos se
pueden procesar.
PROCESAMIENTO DE UN ARCHIVO
Para actualizar los registros dentro de un archivo de datos hay varios enfoques. Uno de
ellos consiste en leer cada registro del archivo, actualizarlo y escribirlo en el mismo
Ejemplos:
fwrite(&cliente, sizeof(registro), 1, ptvar);
fread(&cliente, sizeof(registro), 1, ptvar);
donde cliente es una variable estructura de tipo registro y ptvar un puntero a archivo
secuencial.
Ejemplo:
/*Como abrir y cerrar un archivo */
#include<stdio.h>
enum {EXITO, FRACASO};
main()
{
FILE*aptrf;
char nomarchivo[] = "Juan.Polainas";
int valdevol = EXITO;
if((aptrf = fopen(nomarchivo, "r")) == NULL) {
printf("El archivo no se puede abrir\n %s.\n", nomarchivo);
valdevol = FRACASO;
}
else{
printf("El valor de aptrf es: 0x%p\n", aptrf);
printf("Listo para cerrar el archivo.");
fclose(aptrf);
}
return valdevol;
}
Ejemplos:
#include<stdio.h>
main()
{
char ligne[128];
FILE *in, *out;
while(gets(ligne) !=NULL)
puts(ligne);
in = fopen("fuente", "rb");
out = fopen("destino", "wb");
while(fgets(ligne, 128, in) !=NULL)
fputs(ligne, out);
}
Ejemplos:
int i,tab[1000];
struct datos{
int edad;
char nombre[10];
char apellido[15];
};
FILE *flux;
struct datos empleado; ...
flux=fopen(''...'',''r'');
i=fwrite(%empleado, sizeof(struct datos), 1, flux);
/*un elemento tamaño sizeof(struct datos) es escrito en el stream flux*/
i=fwrite(tab, sizeof(int), 1000, flux);
/*1000 elementos tamaño sizeof(int) son escritos en el stream flux*/
}
se lee un elemento de tamaño sizeof(struct datos) del stream flux y la información
while ( !feof(flux) ) {
fread(&empleado, sizeof(datos), 1, flux);
Ejemplo uso:
char nombre[20], direc[60];
int pos;
FILE *base = fopen(''datitos'',''w+'');
for( i=0; ;i+=80)
{
fseek(base, i, SEEK SET);
pos = ftell(base);
fread(nombre, 20, 1, base);
fread(direc, 60, 1, base);
printf(''Nombre:%s, direc:%s, pos. archivo:%d \n'',nombre,direc,pos);
if(feof(base) )
break;
}
.
Ejemplos:
/* Detección de un fin de archivo */
#include <stdio.h>
#define PAR 100
main()
{
char Non[PAR];
char archivo[20];
FILE *fp;
puts("Introduce el nombre del archivo:");
gets(archivo); /* Abre el archivo para lectura */
if((fp = fopen(archivo, "r")) == NULL)
{
fprintf(stderr, "error abriendo el archivo.");
return 0;
}
/* Si no ha llegado al fin de archivo lee una línea y la despliega */
while(!feof(fp))
{
fgets(Non,PAR,fp);
printf("%s",Non);
} fclose(fp);
}
/* Copia de un archivo */
/* Programa que Calcula la función sen(x) por interpolación a partir de una tabla */
/* fichero interpol.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265358979
main()
{
double vector[91];
int x1, x2;
double y1, y2;
double x, y, a, b, radianes;
FILE *fi;
int i;
fi = fopen("tabla.d", "r");
for (i=0; i <= 90; i++)
fscanf(fi, " %lf", &vector[i]);
printf("Este programa calcula el valor del seno de un ángulo\n");
printf("por interpolación entre dos valores.\n");
printf("\nIntroduzca el valor del ángulo en grados:\n");
printf("valor: ");
scanf("%lf", &x);
printf("\n");
/* Valores entre los que interpolar */
x1 = (int)x;
x2 = x1 + 1;
y1 = vector[x1];
y2 = vector[x2];
/* Cálculo del valor interpolado */
a = (y2 - y1)/(x2 - x1);
b = (y1*x2 - y2*x1)/(x2 - x1);
y = a*x + b;
printf("El valor del seno de %6.2lf es %18.15lf.\n", x, y);
radianes = x*PI/180.0;
printf("%s%6.2lf es %18.15lf%s",
"El valor del seno de ", x,
sin(radianes), ", calculado con math.h");
}