Programacion basica
Transcript of Programacion basica
IntroducciónFases para desarrollar algoritmosPseudocódigosImplementación en un lenguaje de alto nivel(lenguaje C)Estructura de control2. Modulación y arreglosFunciones punterosÁmbito de los identificadoresFunciones recursivasModo graficoElaboración de proyectosArreglos3. Punteros, cadenas, estructuras, archivos y preprocesador cAritmética de punterosCadenasEstructurasArchivosPreprocesador c
.Lenguaje algorítmicoDefinición del problemaAnálisis del problemaPrueba de escritorio
CodificaciónAnálisis de errorControl de calidad final
EJERCICIOS:1.- Sumar n números enteros
Definición_ sumar n números enteros de uan serie asi:1+2+3+4+5+6+….nAnálisis del problema.
1 + 2 + 3 + 4 + 5 + 6 +…………..n
i=1 d=2 repetir n veces i=i+d d=d+1
Prueba de escritorio
rep i d01234....n
H 1361015
23456
2.- usando sumas encontrar el producto m*n
2
Algoritmo
Test software engineering
3
6
10
1
8
Definición_ con sumas encontrar el producto entre dos números denotados por my n:
Analisis del problema.Con un ejemplo podemos analizarlo, en nuestro caso utilizaremos el producto 4*5:4 + 4 + 4 + 4 + 4
d= 0 repetir n veces d=d+m
Prueba de escritorio
veces d m012345
H 04
8 12 16 20
444444
3.- usando restas encontrar el cociente entre m/n
3
12
16
20
4
0
Definición_ con restas encontrar el cociente entre dos números denotados por my n:Analisis del problema:Con un ejemplo de dos números enteros vemos como varía la división: 28/3
28 - 3
25-3
22-3
19-3 16-3
13-3
10-3 7-3
4-3
1-3 i=0
Repetir d>n d = d-n i = i+1
Prueba de escritorio
repetir i (cociente) d (residuo) n0123456789
0123456789
282522191613107431
3333333333
4
d
d
d
d
d
d
d
d
d
d
VARIABLESSon espacios de ememoria (RAM) que cambian continuamente de valor.Empiezan con un letra y continúan con una letra y/o número, signo subrayadoOjo no van espacios ni tildes ni la ñ (es recomendable máximo usar 8 signos)Ejemplos:
a m izq derecha1 Izquierda2
numero_1 numero_2
subrayado
CONSTANTESValores fijos que no cambian en la ejecución del programaEjemplo:
Constante pi (que vale3.1416)
ALGORITMOSecuencia ordenada de pasos para resolver un problema (programa).
Diagrama de flujoPseudocódigos
1.- Diagramas de flujo
Un diagrama de flujo es una representación gráfica de un algoritmo o de una parte del mismo. Los diagramas de flujo ayudan en la comprensión de la operación de las estructuras de control (Si, Mientras).
La ventaja de utilizar un algoritmo es que se lo puede construir independiente mente de un lenguaje de programación, pues al momento de llevarlo a código se lo puede hacer en cualquier lenguaje.
Dichos diagramas se construyen utilizando ciertos símbolos de uso especial como son rectángulos, diamantes, óvalos, y pequeños círculos, estos símbolos están conectados entre sí por flechas, conocidas como líneas de flujo. A continuación se detallarán estos símbolos.
Nombre Símbolo Función
Terminal
Representa el inicio y fin de un programa. También puede representar una parada o interrupción programada que sea necesaria realizar en un programa.
Entrada / salida Cualquier tipo de introducción de datos en la memoria desde los periféricos o
5
registro de información procesada en un periférico.
Proceso
Cualquier tipo de operación que pueda originar cambio de valor, formato o posición de la información almacenada en memoria, operaciones aritméticas, de transformaciones, etc.
Decisión
Indica operaciones lógicas o de comparación entre datos (normalmente dos) y en función del resultado de la misma determina (normalmente si y no) cual de los distintos caminos alternativos del programa se debe seguir
Conector Misma Página
Sirve para enlazar dos partes cualesquiera de un diagrama a través de un conector en la salida y otro conector en la entrada. Se refiere a la conexión en la misma pagina del diagrama
Indicador de dirección o línea de flujo
Indica el sentido de la ejecución de las operaciones
Salida
Se utiliza en ocasiones en lugar del símbolo de salida. El dibujo representa un pedazo de hoja. Es usado para mostrar datos o resultados.
Reglas de los diagramas de flujo
Debe de indicar claramente dónde inicia y dónde termina el diagrama. Cualquier camino del diagrama debe de llevarte siempre a la terminal de fin. Organizar los símbolos de tal forma que siga visualmente el flujo de arriba hacia
abajo y de izquierda a derecha. No usar lenguaje de programación dentro de los símbolos. Centrar el diagrama en la página. Las líneas deben ser verticales u horizontales, nunca diagonales.
2.- pseudocódigo
(falso lenguaje), es una serie de palabras léxicas y gramaticales referidos a los lenguajes de programación, pero sin llegar a la rigidez de la sintaxis de estos ni a la fluidez del lenguaje coloquial. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación, con la misma validez semántica, normalmente se utiliza en las fases de análisis o diseño de Software, o en el estudio de un algoritmo. Forma parte de las distintas herramientas de la ingeniería de software.
6
si
no
EJEMPLOS DE DIAGRAMAS Y PSEUDOCODIGOS
Para división m/n
DIAGRAMA DE FLUJO PSEUDOCODIGO
VariablesContador, izq,derechoInicio leer(izq,derecho) contador=0
repetir izq>derecho contador = contador+1 izq= izq – derechosacar a pantalla contador izqfin
7
inicio
Leer (izq, derecho)
Contador=0
Contador= contador + 1
Izq =izq -derecho
Izq>=derecho
Sacar a pantalla
Contador
fin
si
no
Para suma de n números enteros
DIAGRAMA DE FLUJO PSEUDOCODIGO
si no
Variables izq,derech,,n
Inicio leer(izq,derecho) izq=1 derecho=2
repetir n veces
izq = izq+derecho derecho = derecho +1
sacar a pantalla derecho
fin
8
inicio
Leer (izq,derecho)
Izq=1
derecho=2
Derecho<=n
fin
Imprimir: izq
Izq=izq+derecho
derecho=derecho+1
si
no
Para v/t cuando t>0
DIAGRAMA DE FLUJO PSEUDOCODIGO
Si no
Variables distancia,tiempo,velocidad
Inicio leer(distancia,tiempo) si t>0
velocidad = distancia /tiempo Imprimir velocidad
caso contrario Mensaje: no se puede calcular la velocidad
fin
9
inicio
Leer (distancia, tiempo)
Mensaje: no se puede calcular la velocidad
Velocidad = distancia tiempo
t>0
fin
Imprimir: velocidad
si
no
Para multiplicar m *n
DIAGRAMA DE FLUJO PSEUDOCODIGO
si no
Variables m,n,d
Inicio leer(m,n) d=0repetir n veces
d = d +m
imprimir d
fin
EJEMPPLO DE PSEUDOCODIGO CON SUMA DE MATRICES
A11
A12
A13
A21 A22 A23A31 A32 A33
B11
B12 B13B21 B22 B23B31 B32 B33
10
inicio
Leer (m,n)
d=0
i=0
i<=n
fin
sacar: d
d = d +m
i=i+1
A=
B=
A11
+ B11 A12 + B12 A13 +
B13
A21 + B21 A22 + B22 A23 + B23A31 + B31 A32 + B32 A33 + B33
DESARROLLO PARA VER EL ALGORITMORepetirj=1 hasta j=n Repetirj=1 hasta j=n Repetirj=1 hasta j=n
C1j=A1j+B1j C2j=A2j+B2j C3j=A3j+B3j
Repetir i=1 hasta n
Repetir j=1 hasta j=n
Cij=Aij+Bij
ESTRUCTURA DE UN PROGRAMA
Si() V
Caso contario
f
repetir n veces
11
A+B=c=
OPERADORESLos operadores permiten enfocar la búsqueda vinculando términos de búsqueda y definiendo la relación entre ellos
Precedencia de operadoresLa interpretación de cualquier expresión en C++ está determinada por la precedencia y asociatividad de los operadores en dicha expresión. Cada operador tiene una precedencia, y los operadores en una expresión se evalúan en orden de mayor a menor precedencia. La evaluación de operadores con la misma precedencia viene determinada por su asociatividad. Y, al igual que en matemáticas, los paréntesis anulan las reglas de precedencia.En la siguiente tabla se listan los operadores en C++, su precedencia y su asociatividad. Los operadores se listan en orden de prioridad decreciente (los situados más arriba tienen mayor prioridad). Los operadores en la misma línea horizontal tienen la misma precedencia.
Operador Propósito Asociatividad :: Scope (unario) De derecha a izquierda :: Scope (binario) De izquierda a derecha -> . Selección de miembros De izquierda a derecha [] Índices De izquierda a derecha () Llamada a función De izquierda a derecha ++ Postincremento De izquierda a derecha -- Postdecremento De izquierda a derecha sizeof Tamaño de un objeto De derecha a izquierda ++ Preincremento De derecha a izquierda -- Predecremento De derecha a izquierda * & + - ! ~ Operadores unarios De derecha a izquierda new Crea un objeto De derecha a izquierda delete Borra un objeto De derecha a izquierda () Conversión de tipo (type cast) De derecha a izquierda ->* .* Puntero a un miembro De izquierda a derecha * / % Operadores multiplicativos De izquierda a derecha + - Operadores aditivos De izquierda a derecha << >> Operadores bitwise De izquierda a derecha < > <= >= Operadores de relación De izquierda a derecha == != Operadores de igualdad De izquierda a derecha & Y bitwise De izquierda a derecha ^ bitwise O exclusivo De izquierda a derecha | bitwise O inclusivo De izquierda a derecha && Y lógico De izquierda a derecha || O lógico De izquierda a derecha ?: Operador condicional De derecha a izquierda = *= /= += -= >*gt;= Operadores de asignación De derecha a izquierda
12
&= ^= |= %= <<= , Operador coma De derecha a izquierda
Con pseudocódigos multiplicación de matrices
MULTIPLICANDO
C11= A11 B11 + A12 B21 + A13
B31 + A14
B41 + A15
B51
C21= A21 B11 + A22 B21 + A23
B31 + A24
B41 + A25
B51
C31= A31 B11 + A32 B21 + A33
B31 + A34
B41 + A35
B51
C41= A41 B11 + A42 B21 + A43
B31 + A44
B41 + A45
B51
C51= A51 B11 + A52 B21 + A53
B31 + A54
B41 + A55
B51
C14=
A11
B14
+ A12
B24
+ A13
B34
+ A14
B44
+ A15
B54
C24=
A21
B14
+ A22
B24
+ A23
B34
+ A24
B44
+ A25 B54
C34=
A31
B14
+ A32
B24
+ A33
B34
+ A34
B44
+ A35 B54
C44=
A41
B14
+ A42
B24
+ A43
B34
+ A44
B44
+ A45 B54
C54=
A51
B14
+ A52
B24
+ A53
B34
+ A54
B44
+ A55 B54
13
A11 A12 A13 A14 A15A21 A22 A23 A24 A25A31 A32 A33 A34 A35A41 A42 A43 A44 A45A51 A52 A53 A54 A55
B11 B12 B13 B14 B15B21 B22 B23 B24 B25B31 B32 B33 B34 B35B41 B42 B43 B44 B45B51 B52 B53 B54 B55
C12=
A11
B12
+ A12
B22
+ A13
B32
+ A14
B42
+ A15
B52
C22=
A21 B12
+ A22
B22
+ A23
B32
+ A24
B42
+ A25
B52
C32=
A31 B12
+ A32
B22
+ A33
B32
+ A34
B42
+ A35
B52
C42=
A41 B12
+ A42
B22
+ A43
B32
+ A44
B42
+ A45
B52
C52=
A51 B12
+ A52
B22
+ A53
B32
+ A54
B42
+ A55
B52
C13= A11 B13
+ A12
B23 + A13 B33
+ A14 B43
+ A15
B53
C23= A21 B13 + A22 B23 + A23 B33 + A24 B43 + A25 B53C33= A31 B13 + A32 B23 + A33 B33 + A34 B43 + A35 B53C43= A41 B13 + A42 B23 + A43 B33 + A44 B43 + A45 B53C53= A51 B13 + A52 B23 + A53 B33 + A54 B43 + A55 B53
C15=
A11
B15
+ A12
B25
+ A13
B35
+ A14
B45
+ A15
B55
C25=
A21 B15
+ A22
B25
+ A23
B35
+ A24
B45
+ A25
B55
C35=
A31 B15
+ A32
B25
+ A33
B35
+ A34
B45
+ A35
B55
C45=
A41 B15
+ A42
B25
+ A43
B35
+ A44
B45
+ A45
B55
C55=
A51 B15
+ A52
B25
+ A53
B35
+ A54
B45
+ A55
B55
ANALISANDO:1.- Comenzamos analizando fila por fila y elemento por elemento
C11= A11 B11 + A12 B21 + A13
B31 + A14
B41 + A15
B51
EXAMINANDO fila 1
1.- C11 y C12
1)A1- B1- 2)A1k B1q entonces
3)
4)
C11 = suma
2.- C13
C13=suma3.- C14
14
C12= A11 B12 + A12 B22 + A13 B32 + A14 B42 + A15 B52
C13= A11 B13
+ A12
B23 + A13 B33
+ A14 B43
+ A15
B53
C14= A11
B14 + A12 B24 + A13 B34 + A14 B44 + A15 B54
C15=
A11 B15 + A12 B25 + A13 B35 + A14 B45 + A15 B55
K:1 hasta nq:1 hasta nA1k Bq1
K:1 hasta n k=q (cambian igual en misma posición)A1k B1k
Repetir K:1 hasta nSuma = suma + A1k Bk1
Repetir r:1 hasta nSuma = suma + A1r Br3
Repetir m:1 hasta nSuma = suma + A1m Bm4
C14=suma
4.- k=q=r=m:1 hasta n entonces para la PRIMERA FILA
Repetir j=1 hasta n Suma =0
Repetir k=1 hasta nSuma =suma + A1kBkj
C1j=suma
EXAMINANDO fila 2
Repetir j=1 hasta n suma =0
Repetir k=1 hasta n suma =suma + A2kBkj
C2j=suma
EXAMINANDO fila 3
Repetir j=1 hasta n suma =0
Repetir k=1 hasta n suma =suma + A3kBkj
C3j=suma
EXAMINANDO fila 4
Repetir j=1 hasta n suma =0
Repetir k=1 hasta n suma =suma + A4kBkj
15
C4j=suma
Ojo se puede observar que cambia OJO SE PUEDE OBSERVAR QUE CAMBIA UNICAMENTE
Repetir j=1 hasta n suma =0
Repetir k=1 hasta n suma =suma + A kBkj
C j=suma
ENTONCES el algoritmo de multiplicación de matrices queda asi:
Repetir i=1 hasta n
Repetir j=1 hasta n suma =0
Repetir k=1 hasta n suma =suma + AikBkj
Cij=suma
16
Con pseudocódigos escalonar matrices.Para realizar el estudios de este ejercicio es necesario que estudiemos por lo menos una matriz de orden 5, para poder tener una mejor visualización de los ejercicios.
MATRIZ DE ORDEN n CON CEROS BAJO LA DIAGONAL
Primera Columnaa) Segunda Fila:
a21 = a11*a21 -
a21*a11
a22 = a11*a22 - a21*a12
a23 = a11*a23 - a21*a13
a24 = a11*a24 - a21*a14
a25 = a11*a25 - a21*a15
a2n =a11*a2n -
a21*a1n
17
Repetir k=1….n
a2k= a11*a2k - a21*a1k
a11 a12 a13 a14 …… a1na21 a22 a23 a24 …… a2na31 a32 a33 a34 …… a1na41 a42 a43 a44 …… a2na51 a52 a53 a54 …… a1na61 a62 a63 a64 …… a2nam1 am2 am3 am4 …… a1n
b) Tercera Fila
a31 =a11*a31 -
a31*a11
a32 =a11*a32 - a31*a12
a33 =a11*a33 - a31*a13
a34 =a11*a34 - a31*a14
a35 =a11*a35 - a31*a15
a3n =a11*a3n - a31*a1n
c) Cuarta Fila
a41 =a11*a41 - a41*a11
a42 =a11*a42 -
a41*a12
a43 =a11*a43 - a41*a13
a44 =a11*a44 - a41*a14
a45 =a11*a45 - a41*a15
a4n =a11*a4n - a41*a1n
d) Quinta Fila
a51 =a11*a51 -
a51*a11
a52 =a11*a52 - a51*a12
a53 =a11*a53 - a51*a13
a54 =a11*a54 - a51*a14
a55 =a11*a55 - a51*a15
18
Repetir d=1….n
a3d= a11*a3d - a31*a1d
Repetir t=1….n
a4t= a11*a4t - a41*a1t
Repetir p=1….n
a5p= a11*a5p – a51*a1p
a5n =a11*a5n - a51*a1n
e) Sexta Fila
a61 =a11*a61 - a61*a11
a62 =a11*a62 -
a61*a12
a63 =a11*a63 - a61*a13
a64 =a11*a64 - a61*a14
a65 =a11*a65 - a61*a15
a6n =a11*a6n - a61*a1n
Conclusión del estudio de la primera columna:
19
Repetir r=1….n
a6r= a11*a6r – a61*a1r
Repetir d=1….n
a3d= a11*a3d - a31*a1d
Repetir r=1….n
a6r= a11*a6r – a61*a1r
Repetir j=2….n
a3d= a11*a3d - a31*a1dRepetir k=1….n
ajk= a11*ajk - aj1*a1k
Repetir p=1….n
a5p= a11*a5p – a51*a1p
Repetir t=1….n
a4t= a11*a4t - a41*a1t
Repetir k=1….n
a2k= a11*a2k - a21*a1k
SEGUNDA COLUMNA
a. Tercera Fila
a32 =a22*a32 -
a32*a22
a33 =a22*a33 - a32*a23
a34 =a22*a34 - a32*a24
a35 =a22*a35 - a32*a25
a36 =a22*a36 - a32*a26
a3n =a22*a3n - a32*a2n
b3 = a22*b3 - a32*b2
b. Cuarta Fila
a42 =a22*a42 -
a42*a22
a43 =a22*a43 -
a42*a23
a44 =a22*a44 - a42*a24
a45 =a22*a45 - a42*a25
a46 =a22*a46 - a42*a26
a4n =a22*a4n - a42*a2n
b4 = a22*b4 - a42*b2
c. Quinta Fila
20
b3=a22*b3-a32*b2
Repetir k=2….n
a3k= a22*a3k – a32*a2k
b3=a22*b3-a32*b2
Repetir z=2….n
a4z= a22*a4z – a42*a2z
b5=a22*b5-a52*b2
a52 =a22*a52 -
a52*a22
a53 =a22*a53 - a52*a23
a54 =a22*a54 - a52*a24
a55 =a22*a55 - a52*a25
a56 =a22*a56 - a52*a26
a5n =a22*a5n - a52*a2n
b5 = a22*b5 - a52*b2
d. Sexta Fila
a62 =a22*a62 -
a62*a22
a63 =a22*a63 -
a62*a23
a64 =a22*a64 - a62*a24
a65 =a22*a65 - a62*a25
a66 =a22*a66 - a62*a26
a6n =a22*a6n - a62*a2n
b6 = a22*b6 - a62*b2
e. Séptima Fila
21
b5=a22*b5-a52*b2
Repetir q=2….n
a5q= a22*a5q – a52*a2q
b6=a22*b6-a62*b2
Repetir t=2….n
a6t= a22*a6t – a62*a2t
a72 =a22*a72 -
a72*a22
a73 =a22*a73 -
a72*a23
a74 =a22*a74 - a72*a24
a75 =a22*a75 - a72*a25
a76 =a22*a76 - a72*a26
a7n =a22*a77 - a72*a2n
b7 = a22*b7 - a72*b2
22
b7=a22*b7-a72*b2
Repetir r=2….n
a7r= a22*a7r – a72*a2r
b3=a22*b3-a32*b2
Repetir k=2….n
a3k= a22*a3k – a32*a2k
b5=a22*b5-a52*b2
Repetir q=2….n
a5q= a22*a5q – a52*a2q
b6=a22*b6-a62*b2
Repetir t=2….n
a6t= a22*a6t – a62*a2t
b7=a22*b7-a72*b2
Repetir r=2….n
a7r= a22*a7r – a72*a2r
b3=a22*b3-a32*b2
Repetir z=2….n
a4z= a22*a4z – a42*a2z
Repetir w= 3……..n
bw =a22*bw-aw2*b2
Repetir z=2….n
awz = a22*awz – aw2*a2z
Tercera Columna
a. Cuarta Fila
a43 =a33*a43 - a43*a33
a44 =a33*a44 - a43*a34
a45 =a33*a45 - a43*a35
a46 =a33*a46 - a43*a36
a47 =a33*a47 - a43*a37
a4n =a33*a4n - a43*a3n
b4 = a33*b4 - a43*b3
b. Quinta Fila
a53 =a33*a53 -
a53*a33
a54 =a33*a54 - a53*a34
a55 =a33*a55 - a53*a35
a56 =a33*a56 - a53*a36
a57 =a33*a57 - a53*a37
a5n =a33*a5n - a53*a3n
b5 = a33*b5 - a53*b3
23
Repetir w= 3……..n
b4=a33*b4-a43*b3
Repetir m=3….n
a4m= a33*a4m – a43*a3m
b5=a33*b5-a53*b3
Repetir d=3….n
a5d= a33*a5d – a53*a3d
c. Sexta Fila
a63 =a33*a63 -
a63*a33
a64 =a33*a64 - a63*a34
a65 =a33*a65 - a63*a35
a66 =a33*a66 - a63*a36
a67 =a33*a67 - a63*a37
a6n =a33*a6n - a63*a3n
b6 = a33*b6 - a63*b3
d.= Séptima Fila
a73 =a33*a73 -
a73*a33
a74 =a33*a74 - a73*a34
a75 =a33*a75 - a73*a35
a76 =a33*a76 - a73*a36
a77 =a33*a77 - a73*a37
a7n =a33*a7n - a73*a3n
b7 = a33*b7 - a73*b3
24
b6=a33*b6-a63*b3
Repetir e=3….n
a6e= a33*a6e – a63*a3e
b7=a33*b7-a73*b3
Repetir f=3….n
a7f= a33*a7f – a73*a3f
b5=a33*b5-a53*b3
Repetir d=3….n
a5d= a33*a5d – a53*a3d
b6=a33*b6-a63*b3
Repetir e=3….n
a6e= a33*a6e – a63*a3e
b4=a33*b4-a43*b3
Repetir m=3….n
a4m= a33*a4m – a43*a3m
Visualizando todas las fórmulas de las columnas:
25
b7=a33*b7-a73*b3
Repetir f=3….n
a7f= a33*a7f – a73*a3f
Repetir p=4………….n
bp = a33*bp-ap3*b3
Repetir f=3….n
apf = a33*apf – ap3*a3f
Repetir w= 3……..n
bw =a22*bw-aw2*b2
Repetir p=4………….nRepetir p=4………….n
Repetir k=1………….n-1
1era colmuna 2da columna
3era columna 4ta columna
Fórmula para hacer ceros bajo la diagonal:
Para encontrar las raíces: examinamos las 5 raíces
ultimas
26
Repetir j=2….n
a3d= a11*a3d - a31*a1dRepetir k=1….n
ajk= a11*ajk - aj1*a1kRepetir z=2….n
awz = a22*awz – aw2*a2z
bp = a33*bp-ap3*b3
Repetir f=3….n
apf = a33*apf – ap3*a3f
bt = a44*bt-at4*b4
Repetir v=4….n
atv = a44*atv – ap4*a4v
Repetir i=k+1….n
bi = akk*bi-aik*bk
Repetir j=k….n
aij = akk*aij – aik*akj
Repetir i= n……..1
Suma =0
Repetir j=i+1……n
Xi=(bi-suma)/aii
X5=b5
a55 X 4=
b4−a45∗X5
a44
X3=b3−(a34∗X4+a35∗X5 )
a33 X2=
b2−(a23∗X2+a24∗X 4+a25∗X5 )a22
X1=b1−( a11∗X2+a13∗X3+a14∗X 4+a15∗X 5)
a11
X i=bi− ∑
j=i+1
n
aij∗X j
aii
Formula que encuentra raíces:
PSEUDOCÓDIGO
VARIABLES
Matriz ann, vector bn, vector XnSuma i,j,k
INICIO
//leer datos
27
Suma=suma +aij*xj
//CALCULAR
//SACAR A PANTALLA
Repetir i:1…nImprimir Xi
FIN
28
DIAGRAMA DE FLUJO
29
LENGUAJE C
Estructura del programa
Todo programa escrito en C consta de una o más funciones, una de las cuales se llama main. El programa siempre comenzará por la ejecución de la función main. Cada función debe contener:
Una cabecera de la función, que consta del nombre de la función, seguido de una lista opcional de argumentos encerrados con paréntesis.Una lista de declaración de argumentos, si se incluyen estos en la cabecera.Una sentencia compuesta, que contiene el resto de la función
Los argumentos son símbolos que representan información que se le pasa a la función desde otra parte del programa. Cada sentencia compuesta se encierra con un par de llaves, {..}. Las llaves pueden contener combinaciones de sentencias elementales y otras sentencias compuestas. Así las sentencias compuestas pueden estar anidadas, una dentro de otra. Cada sentencia de expresión debe acabar en punto y coma (;) Los comentarios pueden aparecer en cualquier parte del programa, mientras estén situados entre los delimitadores /* ................ */ Los comentarios son útiles para identificar los elementos principales de un programa o simplemente para orientar a un posible usuario de ese código. Todo fichero fuente en C sigue la siguiente estructura
PreprocesadorTipos de datosVariablesFunciones y/o prototipos de funcionesFunción principal (programa principal)Funciones
Ejemplo
Suma de dos números
#include<iostream.h> preprocesadorfloat a,b,c; variablesvoid main() función principal{//ingreso de datoscin >>a>>b;
30
//calculosc=a+b;//resultadoscout<<c;}
Tipos de datosLas computadoras pueden trabajar con varios tipos de datos, los algoritmos y programas operan sobre estos. Existen dos clases de datos: datos simples y datos compuestos.
Los distintos tipos de datos se representan como un conjunto o secuencia de dígitos binarios (bits). Los lenguajes de programación de alto nivel nos permiten basarnos en abstracciones para no manejar los detalles de representación interna.
En el lenguaje C existen tres tipos de datos básicos que son el int, float y char. A partir de estos tipos se crean otros que funcionan igual pero que difieren en el tamaño como el long, el double, y otros. Estos que son parte del lenguaje se consideran como tipos "primitivos"
Tipos de datos básicos
char Caracteresint Números enterosfloat Números en coma flotante (32 bits)double Números en coma flotante de doble precisión (64 bits)
Enteros: son el tipo de dato más primitivo en C. Se usan para representar números enteros, valga la redundancia. Pero siempre se pueden encontrar otras aplicaciones para los números enteros. En general se pueden usar para representar cualquier variable discreta.
Flotantes: son más modernos y se usan mucho en aplicaciones que trabajan con gráficos o que necesitan de mucha precisión. El tipo de dato flotante en lenguaje C sólo tiene dos tamaños: el float y el double, que son 4 bytes y 8 bytes respectivamente.
Caracteres: el tipo char solo tienen 1 byte de tamaño y usa la misma representación que los número enteros. La única diferencia es su tamaño y que el char es usado para representar los 255 caracteres de la tabla ASCII.
31
32
int i, j, k;float x,y,z;
char ch;
DECLARACIONES
La declaración de objetos en C tiene como finalidad dar a conocer el tipo y propiedades de los identificadores.
Todos las variables deben ser declaradas. En las declaraciones es obligado especificar el tipo.
De cada objeto en un programa C se puede establecer tres propiedades que le afectan en su relación: el alcance, la visibilidad y la durabilidad.
El alcance sirve para saber en qué región del código una declaración de un objeto está activa, es decir, el objeto existe.La visibilidad nos indica en qué región del código un objeto está activo. La diferencia con el alcance es que en una misma región pueden estar dos objetos con el mismo identificador, ocultando un objeto a otro.La durabilidad es el tiempo de ejecución del programa donde el objeto existe en la memoria. La durabilidad puede ser:
Estática: El objeto perdura desde la compilación hasta el final. Local: El objeto es creado en la entrada de un bloque y es borrado a la salida.
Para declarar una variable en C, se debe seguir el siguiente formato:
tipo lista_variables;
tipo es un tipo válido de C y lista_variables puede consistir en uno o más indentificadores separados por una coma.
Ejemplo:
Operadores
33
En todos los lenguajes de programación se utilizan operadores para efectuar operaciones aritméticas. Combinando las variables y constantes en expresiones aritméticas por medio de funciones adecuadas.
Operadores aritméticos.
Los operadores aritméticos que se pueden utilizar en C++ son:
Operación Acción+ Suma- Resta* Multiplicación/ División% resto
Operador de relación
Los operadores relacionales comparan sus operandos y devuelven el valor 1 si la relación es cierta, y 0 si no lo es. Son:
Operador Propósito < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que == Igual != No igual <> Distinto a, diferente de
Operadores lógicos.
Los operadores lógicos que se pueden utilizar en C++ son:
Operador
Acción
! Negación lógica
&& Y lógico || O lógico
Precedencia de operadores.
34
Anteriormente dimos una definición de procedencia de operadores uy ua tabla véase pag #12.
Prioridad de los operadores
Prioridad Operador(es)
Más alta ( ) [ ] ->
! ~ ++ -- - (tipo) * & sizeof
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?
= += -= *= /=
Más baja ,
SISTEMAS DE NUMERACION
Los números se pueden representar en distintos sistemas de numeración que se diferencian entre si por su base. Así el sistema de numeración decimal es de base 10, el binario de base 2, el octal de base 8 y el hexadecimal de base 16. El diseño de todo sistema digital responde a operaciones con números discretos y por ello necesita utilizar los sistemas de numeración y sus códigos. En los sistemas digitales se emplea el sistema binario debido a su sencillez.
Cualquier número de cualquier base se puede representar mediante la siguiente ecuación polinómica:
35
Siendo b la base del sistema de numeración. Se cumplirá que b>1; a i es un número perteneciente al sistema que cumple la siguiente condición: 0 ≤ a i <b.
SISTEMA DECIMAL
Emplea 10 caracteres o dígitos diferentes para indicar una determinada cantidad: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Si el número contiene decimales:
SISTEMA BINARIO
Es el sistema digital por excelencia, aunque no el único, debido a su sencillez. Su base es 2Emplea 2 caracteres: 0 y 1. Estos valores reciben el nombre de bits (dígitos binarios). Así, podemos decir que la cantidad 10011 está formada por 5 bits. Veamos con un ejemplo como se representa este número teniendo en cuenta que el resultado de la expresión polinómica dará su equivalente en el sistema decimal:
SISTEMA OCTAL
Posee ocho símbolos: 0, 1, 2, 3, 4, 5, 6, 7. Su base es 8.
SISTEMA HEXADECIMAL.
Está compuesto por 16 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Su base es 16. Es uno de los sistemas más utilizados en electrónica, ya que además de simplificar la escritura de los números binarios, todos los números del sistema se pueden expresar en cuatro bits binarios al ser 16 = 24
Conversión de un sistema a otro
Transformar el número decimal 100 en binario.
36
Si la conversión es de binario a decimal, aplicaremos la siguiente regla: se toma la cantidad binaria y se suman las potencias de 2 correspondientes a las posiciones de todos sus dígitos cuyo valor sea 1.
1011112 = 1.25+0.24+1.23+1.22+1.21+1.20 = 4510
101012= 1.24+0.23+1.22+0.21+1.20 = 2110
Entrada y salida de datosEn el lenguaje c++ tenemos varias alternativas para ingresar y/o mostrar datos, dependiendo de la librería que vamos a utilizar para desarrollar el programa, entre estas están: iostream.h y stdio.h
#include <iostream.h>
Los objetos de flujo que vienen predefinidos serán:
1. cin, que toma caracteres de la entrada estándar (teclado); 2. cout, pone caracteres en la salida estándar (pantalla);
Estos objetos se utilizan mediante los operadores << y >>.
El operador << se denomina operador de inserción; y apunta al objeto donde tiene que enviar la información. Por lo tanto la sintaxis de cout será:
cout<<variable1<<variable2<<...<<variablen;
Por su parte >> se denomina operador de extracción, lee información del flujo cin y las almacena en las variables indicadas a la derecha.
37
La sintaxis sería la siguiente:
cin>>variable1>>...>>variablen;
#include <stdio.h>
Los objetos de flujo que vienen predefinidos serán:
1. scanf2. printf
scanf es utilizado para asignar la información que se introduce por el teclado
La sintaxis del scanf es la siguiente:
scanf(“%letra%letra”,&var1,&var2);
es utilizado para imprimir en la pantalla los resultados del programa
La sintaxis del PRINTF es el siguiente:
printf(“mensaje %letra”,var1);
PASOS PARA PROGRAMAR
1. Abrir Borland2. Editar el programa
#include<iostream.h>
float a,b,c;
void main()
{
//ingreso de datos
cin >>a>>b;
//calculos
c=a+b;
//resultados
cout<<c;
}
38
3. Guardar el archivo
4. Ejecutar el programa.- cuando se ejecuta el archivo se guardan tres tipos de archivos:
Suma.exe es el archivo ejecutable
Suma.obj archivo que se encuentra en lenguaje de máquina
Suma.cpp es un archivo de borland
Al correr el programa solo sale la pantalla en blanco y se ingresan los valores con un enter.
Para evitar esto se utilizan instrucciones que indiquen que hacer
#include<stdio.h>float a,b,c;void main(){//ingreso de datosprintf("ingrese 2 numeros:");scanf("%f%f",&a,&b);//calculosc=a+b;//resultados
39
printf("el resultado es:%f",c);}
Ejercicios
Programa para calcular la hipotenusa de un triángulo rectángulo
#include<iostream.h>#include<math.h> libreriafloat a,b,c;void main(){//ingreso de datos comentariocout<<"ingrese un cateto:\n";cin>>a;cout<<"ingrese un cateto:\n";cin>>b;//calculosc=sqrt((a*a)+(b*b));//resultadoscout<<"la hipotenusa es:\n";cout<<c;}
Instrucciones de controlLas estructuras condicionales comparan una variable contra otro(s) valor(es), para que en base al resultado de esta comparación, se siga un curso de acción dentro del programa. Cabe mencionar que la comparación se puede hacer contra otra variable o
contra una constante, según se necesite.
Decisiones
Condición verdadera
Las estructuras condicionales simples se les conocen como “Tomas de decisión”. Estas tomas de decisión tienen la siguiente forma:
1 instrucción 2 o más instrucciones
Condición V, F Condición V, Fif( ) if( )
40
instrucción; {
}
Ejemplo:
1 instrucción 2 o más instruccionesif(a>10)
p=14*a
if(b<14.5){
q=p+r;
w=sqrt(q);}
}
Condición verdadera o falsa
Las estructuras condicionales dobles permiten elegir entre dos opciones o alternativas posibles en función del cumplimiento o no de una determinada condición. Se representa de la siguiente forma:
if( ) instrucción;
else
{
}
41
Ejemplo
Programa que determina el mayor de dos números ingresados
#include "stdio.h"float a,b;void main(){// ingreso de datosprintf("ingrese dos numeros\n");scanf("%f%f",&a,&b);// calculosif(a>=b)printf("A>=B");elseprintf("B>A");}
Selección multiple
Las estructuras de comparación múltiples, son tomas de decisión especializada que permiten comparar una variable contra distintos posibles resultados, ejecutando para cada caso una serie de instrucciones específicas:
1. IF ANIDADO
if (( )&&( ))instrucción;
elseif (( )&&( ))instrucción;
elseinstrucción;
Ejemplo
Leer tres números diferentes e imprimir el número mayor de los tres.
42
#include<stdio.h>float n1,n2,n3;void main(){//ingreso de datosprintf("ingrese tres numeros\n");scanf("%f%f%f",&n1,&n2,&n3);// calculosif((n1>n2)&&(n1>n3)) if anidadoprintf("el numero mayor es %f",n1);elseif((n2>n1)&&(n2>n3)) printf("el numero mayor es %f",n2);elseprintf("el numero mayor es %f",n3);}
2.SWITCHswitch( ){case __: instrucción;break;case __: instrucción;break;default: instrucción;}
Ejemplos
#include <stdio.h>int a;void main(){// ingreso de datosprintf("ingrese un numero entero de uno a tres\n");scanf("%d",&a);//calculosswitch(a){case 1: printf("ud ingreso el 1\n");break;case 2: printf("ud ingreso el 2\n");break;case 3: printf("ud ingreso el 3\n");break;default: printf("ud se equivoco");}}
43
#include "stdio.h"enum {liga,quito,nacional,barcelona,emelec};int p;void main(){//ingreso de datosprintf("ingrese un numero entero:");scanf("%d",&p);//calculosswitch (p){case liga: printf("\nliga campeon\n");break;case quito: printf("\nquito campeon\n");break;case nacional: printf("\n nacional campeon\n");break;case barcelona: printf("\n barcelona campeon\n");break;case emelec: printf("\n emelec campeon\n");}}
Estructuras CíclicasSe llaman problemas repetitivos o cíclicos a aquellos en cuya solución es necesario utilizar un mismo conjunto de acciones que se puedan ejecutar una cantidad específica de veces. Esta cantidad puede ser fija o puede ser variable.
REPETICION
1) Cuando se conoce el número de veces a repetir for ( inicialización; control; incremento)
{
instrucción(es);
}
Ejemplo
Programa que suma una progresión aritmética 1, 2, 3, 4, 5, 6, 7, 8, 9…..n
44
#include<stdio.h>int n,suma,i;void main(){//ingreso de datosprintf("ingrese n:");scanf("%d",&n);//calcularsuma=0;for(i=1;i<=n;i++)suma+=i;printf("suma=%d",suma);}
2) Cuando NO se conoce el numero de veces a repetir
1.1 puede no ejecutarse nunca while ( condición )
{
instrucciones;
}
#include<stdio.h>int n,suma,i;void main(){//ingreso de datosprintf("ingrese n:");scanf("%d",&n);//calcularsuma=0;i=1;while(i<=n){suma+=i;i++;}printf("suma=%d",suma);}
1.2 puede ejecutarse por lo menos una vezdo
{
instrucciones;
}while ( condición )
45
Ejemplo
Programa que suma una progresión aritmética
#include<stdio.h>int n,suma,i;void main(){//ingreso de datosprintf("ingrese n:");scanf("%d",&n);//calcularsuma=0;i=1;do {suma+=i;i++;}while (i<=n)printf("suma=%d",suma);}
EjerciciosMultiplicación con for
#include<stdio.h>int n,m,i,d=0;void main(){//ingreso de datosprintf("ingrese n:");scanf("%d",&n);printf("ingrese m:");scanf("%d",&m);//calcularfor(i=1;i<=n;i++)d=d+m;printf("d=%d",d);}
Multiplicación con do while
#include<stdio.h>int n,m,i,d=0;void main(){//ingreso de datosprintf("ingrese n:");scanf("%d",&n);printf("ingrese m:");scanf("%d",&m);//calculari=1;do{d=d+m;i++;} while(i<=n);//resultadosprintf("d=%d",d);}
División con cociente y residuo
#include<stdio.h>int n,j,i=0,d;void main(){//ingreso de datosprintf("ingrese d # entero positivo:");scanf("%d",&d);printf("ingrese n # entero
Ingresar un número y determinar si es perfecto
#include <stdio.h>int n,i,np,y;void main (){printf ("INGRESAR NÚMERO => ");scanf ("%d",&n); //calculosnp=0;y=0;
46
positivo:");scanf("%d",&n);//calcularfor(j=1;d>n;j++){d=d-n;i++;}printf("cociente");printf("%d",i);printf("residuo:");printf("%d",d);}
for (i=1;i<n;i++){np=(n%i);if (np==0) y=y+i;}if (n==y)printf("El número %d es perfecto",n);elseprintf("El número %d no es perfecto",n);}
Comparacion de nombres
#include<stdio.h>#include<string.h>char nombre1[10], nombre2[10];void main(){//ingrese de datosprintf("ingrese nombre=");scanf("%s",&nombre1);printf("ingrese nombre=");scanf("%s",&nombre2);//calculosif(!strcmp(nombre1,nombre2))printf("son iguales");elseprintf("son diferentes");}
Comparacion con un nombre
#include<stdio.h>#include<string.h>char nombre[10], nombre1[10];void main(){//ingrese de nombresprintf("ingrese nombre=");scanf("%s",nombre);strcpy(nombre1,"maria");//calculosif(!strcmp(nombre,nombre1))printf("son iguales");elseprintf("son diferentes");}
números primos
#include<stdio.h>int i,n=0,flag=0;void main(){//ingreso de datosprintf("ingrese el numero:\n");scanf("%d",&n);//calculosflag=0;for(i=2;i<n-1;i++){if(n%i==0)flag=1;}if (flag==0)printf("es un numero primo:\n");elseprintf("no es un numero primo:\n");
factorial
#include <stdio.h>float n,i,ft;void main(){//ingresoprintf("ingrese un numero");scanf("%f",&n);//calculosft=1;for (i=1;i<=n;i++)ft=(ft*i);printf("factorial es =%f",ft);}
47
} ARREGLOS
Un Arreglo es una estructura de datos que almacena bajo el mismo nombre (variable)a una colección de datos del mismo tipo.Los arreglos se caracterizan por:
· Almacenan los elementos en posiciones contiguas de memoria· Tienen un mismo nombre de variable que representa a todos los elementos. Para hacer referencia a esos elementos es necesario utilizar un índice que especifica el lugar que ocupa cada elemento dentro del archivo
Tipos de Arreglos:
Estáticos.- Tiene número de elementos fijosDinámicos.- Número de elementos variables.
Vector: Es un arreglo de “N” elementos organizados en una dimensión donde “N” recibe el nombre de longitud o tamaño del vector. Para hacer referencia a un elemento del vector se usa el nombre del mismo, seguido del índice (entre corchetes), el cual indica una posición en particular del vector.
A 0
Matriz: Es un arreglo de M * N elementos organizados en dos dimensiones donde “M” es el numero de filas o reglones y “N” el numero de columnas.
48
Cubo:
Estaticos.-
Tipo de Dato Nombre [ * ] [ * ] [ * ]
float A[10];
int [10][20];
double C[5][5][5];
Dinámicos.-
Tipo de Dato * * *Nombre
Puntero
float *A;
49
int **B;
double ***C;
Unidimensional
A [3]=10.6;
scanf (“%letra”;&A[3]);
printf (“………%letra”, A[3]);
for (i=o; i<10; i++)
scanf (“%letra”, &A[i] );
for (i=o; i<10; i++)
printf (“……%letra”, A[i] );
Bidimencional
A [3][4]);
scanf (“%letra”;&A[3][4]);
printf (“………%letra”, A[3][4]);
for (i=o; i<10; i++)
for (j=o; j<10; j++)
scanf (“%letra”;&A[i][j]);
50
for (i=o; i<10; i++)
for (j=o; j<10; j++)
printf (“………%letra”, A[i][j]);
Tridimensional
A [3][4][5]10.6;
scanf (“%letra”;&A[3][4][5]);
printf (“………%letra”, A[3][4][5]);
for (i=o; i<10; i++)
for (j=o; j<10; j++)
for (k=o; k<10; k++)
scanf (“%letra”;&A[i][j][k]);
for (i=o; i<10; i++)
for (j=o; j<10; j++)
for (k=o; k<10; k++)
printf (“………%letra”, A[i][j][k]);
PROGRAMAS// SUMA DE VECTORES
#include "stdafx.h"float A[10],B[10],C[10];int i;int _tmain(int argc, _TCHAR* argv[]){
//leer datosfor (i=0;i<10;i++){
printf("A[%d]=",i);scanf("%f",&A[i]);
}for (i=0;i<10;i++){
// SUMA DE MATRICES
#include "stdafx.h"
float A[5][5],B[5][5],C[5][5];int i,j;
int _tmain(int argc, _TCHAR* argv[]){
//leer datosfor (i=0;i<5;i++)for (j=0;j<5;j++)
{printf("A[%d][%d]=",i,j);scanf("%f",&A[i][j]);
}
51
printf("B[%d]=",i);scanf("%f",&B[i]);
}//calculosfor (i=0;i<10;i++)
C[i]=A[i]+B[i];//salidafor (i=0;i<10;i++)
printf("%f\t",C[i]);printf("Para terminar ingrese
un numero entero=");scanf("%d",&i);return 0;
}
for (i=0;i<5;i++)for (j=0;j<5;j++){
printf("B[%d][%d]=",i,j);scanf("%f",&B[i][j]);
}//calculosfor (i=0;i<5;i++)for (j=0;j<5;j++)
C[i][j]=A[i][j]+B[i][j];//salidafor (i=0;i<5;i++){
for (j=0;j<5;j++)printf("%f\t",C[i][j]);printf("\n");
}printf("Para terminar ingrese un numero entero=");
scanf("%d",&i);return 0;
}
// SUMA DE CUBOS
#include "stdafx.h"float A[3][3][3],B[3][3][3],C[3][3][3];int i,j,k;
int _tmain(int argc, _TCHAR* argv[]){
//leer datosfor (i=0;i<3;i++)for (j=0;j<3;j++)for (k=0;k<3;k++)
{printf("A[%d][%d][%d]=",i,j,k);scanf("%f",&A[i][j][k]);
}for (i=0;i<3;i++)for (j=0;j<3;j++)for (k=0;k<3;k++){
printf("B[%d][%d][%d]=",i,j,k);scanf("%f",&B[i][j][k]);
}//calculosfor (i=0;i<3;i++)for (j=0;j<3;j++)for (k=0;k<3;k++)
C[i][j][k]=A[i][j][k]+B[i][j][k];//salidafor (i=0;i<3;i++){
printf("Plano %d\n",i);for (j=0;j<3;j++){
for (k=0;k<3;k++)printf("%f\t",C[i][j][k]);
52
printf("\n");}
}printf("Para terminar ingrese un numero entero=");scanf("%d",&i);return 0;
}PUNTEROS
“sinónimos de dirección (memoria RAM)”
Un puntero es una variable que contiene una dirección de memoria. Normalmente, esa dirección es la posición de otra variable de memoria. Si una variable contiene la dirección de otra variable, entonces se dice que la primera variable apunta a la segunda.
Si una variable va a contener un puntero, entonces tiene que declararse como tal. Una declaración de un puntero consiste en un tipo base, un * y el nombre de la variable. La forma general es: tipo *nombre;
Donde tipo es cualquier tipo válido y nombre es el nombre de la variable puntero. El tipo base del puntero define el tipo de variables a las que puede apuntar. Técnicamente, cualquier tipo de puntero puede apuntar a cualquier dirección de la memoria, sin embargo, toda la aritmética de punteros esta hecha en relación a sus tipos base, por lo que es importante declarar correctamente el puntero.
Existen dos operadores especiales de punteros: & y *. El operador de dirección (&) devuelve la dirección de memoria de su operando. El operador de indirección (*) devuelve el contenido de la dirección apuntada por el operando.
Después de declarar un puntero, pero antes de asignarle un valor, éste contiene un valor desconocido; si en ese instante lo intenta utilizar, probablemente se estrellará, no sólo el programa sino también el sistema operativo. Por convenio, se debe asignar el valor nulo a un puntero que no este apuntando a ningún sitio, aunque esto tampoco es seguro.
Ejemplos
Siendo b=4; f=1.1;i=2.001;l=A
int *a,b,c; 4 float *e,f,g; 1,1 double *h,i,j; 2,001 char *k,l,m; A
53
Para escribir la dirección colocamos por ejemplo:
a=&b;
e=&f;
La indirección o contenido se obtiene con el siguiente arreglo:
(*a)
Para obtener las direcciones de las variables nos valemos del siguiente arreglo:
Printf(“%P%P%P”,&e,&f,&g);
Printf(“%X%X%X”,&e,&f,&g);
Siendo : %P = valor del puntero
%X=entero en formato hexadecimal
Ejemplo 1:
En el siguiente ejemplo se muestra la estructura básica utilizada en los punteros:
//punteros
#include "stdafx.h"float *a,*b,c,d,e;
int _tmain(int argc, _TCHAR* argv[]){a=&c;b=&d;printf("c=" );scanf("%f",&c);printf("d=" );scanf("%f",&d);e=*a+*b;printf("c=%f\t d=%f\t e=%f\t",*a,*b,e);printf("\n\n direccion\n\n");printf("&a=%x\t &b=%x\t &c=%x\t &d=%x\t &e=%x",&a,&b,&c,&d,&e);printf("\n\n contenidos \n\n");printf("a=%x\t b=%x\t c=%f\t d=%f\t e=%f\n",a,b,c,d,e);scanf("%f",&e);return 0;}
54
Punteros del tipo **q
Podría decirse que es la dirección de la dirección:
p q r
Ejemplo 2
En este ejemplo se explica la estructura de los punteros del tipo **q:
//punteros#include<stdio.h>float **a,*b,c,d;void main(){a=&b;b=&c;printf("c=");scanf("%f",&c);printf("d=");scanf("%f",&d);printf("\n");d=2*(**a);printf("d=%f\t",d);printf("\n\n direcciones \n\n");printf("&a=%x\t &b=%x\t &c=%x\t &d=%x\n",&a,&b,&c,&d);printf("\n\n contenidos \n\n");printf("a=%x\t b=%x\t c=%f\t d=%f\n",a,b,c,d);}
Operaciones con punteros
1) A una variable de puntero se le puede asignar una dirección de una variable normal (mismo tipo de dato):
55
pV=&a;
2) Una variable de puntero puede aceptar otra variable de puntero (mismo tipo de dato).
pV=pV;
3) Una variable de puntero puede aceptar una dirección nula.
pV=null;
4) A una variable de puntero se le puede sumar o restar un número entero.
pV+3
pV-3 pV pV+1 pV+2 pV+3…… ……
pV++pV--
5) Una variable de puntero puede ser comparada con otra variable de puntero (mismo tipo de dato).
pX<=pY
pX!=pZ
También podemos decir que.. existen sólo dos operaciones aritméticas que se puedan usar con punteros: la suma y la resta.
Cada vez que se incrementa un puntero, apunta a la posición de memoria del siguiente elemento de su tipo base. Cada vez que se decremento, apunta a la posición del elemento anterior. Con punteros a caracteres parece una aritmética normal, sin embargo, el resto de los punteros aumentan o decrecen la longitud del tipo de datos a los que apuntan.
Por ejemplo, si asumimos que los enteros son de dos bytes de longitud y p1 es un puntero a entero con valor actual 2000. Entonces, después de la expresión p1++; p1 contiene el valor 2002, no 2001.
No pueden realizarse otras operaciones aritméticas sobre los punteros más allá de la suma y resta de un puntero y un entero. En particular, no se pueden multiplicar o dividir punteros y no se puede sumar o restar el tipo float o el tipo double a los punteros.
56
Punteros y arreglos
Un arreglo es un conjunto de variables del mismo tipo que pueden ser referenciadas a través de un mismo nombre. La forma de identificar a un elemento determinado es a través de un índice.
Función Operador malloc() newfree() delete
Para asignar un nuevo valor a la memoria de la variable, colocamos:
Pv=new tipodato [#]
Ejemplo 1:
Suma de matrices con punteros y arreglos
#include "stdafx.h"float **a,**b,**c;int i,j,n;
int _tmain(int argc, _TCHAR* argv[]){//toma de memoriaprintf("ingrese dimension n=");scanf("%d",&n);a=new float*[n];b=new float*[n];c=new float*[n];for(i=0;i<n;i++){ a[i]=new float[n]; b[i]=new float[n]; c[i]=new float[n];}
//ingreso de datosfor(i=0;i<n;i++) for(j=0;j<n;j++) { printf("A[%d][%d]=",i+1,j+1);
scanf("%f",&a[i][j]); }
for(i=0;i<n;i++)
57
for(j=0;j<n;j++) { printf("B[%d][%d]=",i+1,j+1);
scanf("%f",&b[i][j]); }
//calculosfor(i=0;i<n;i++) for(j=0;j<n;j++) c[i][j]=a[i][j]+b[i][j];
//salidafor(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%f\t",c[i][j]); printf("\n");}
//liberacion de memoriafor(i=0;i<n;i++){delete []a[i];delete []b[i];delete []c[i];}delete []a;delete []b;delete []c;
printf("Digite un numero, para terminar : ");scanf("%d",&i);return 0;}
Ejemplo 2:
Sistema de ecuaciones lineales:
#include "stdafx.h"float **A,*B,*X,aux,sum=0.0;int n,i,j,k;
int _tmain(int argc, _TCHAR* argv[]){
//toma de memoriaprintf("INGRESE LA DIMENSION N=");
58
scanf("%d",&n);A=new float*[n];B=new float[n];X=new float[n];
for(i=0;i<n;i++)A[i]=new float[n];
//ingreso de la matrizfor (i=0;i<n;i++){for(j=0;j<n;j++){printf("ingrese el elemento:A[%d][%d]= ",i+1,j+1);scanf("%f",&A[i][j]);}printf("Ingrese el elemento B[%d]=",i+1);scanf("%f",&B[i]);}//calculosfor(k=0;k<n-1;k++) for(i=k+1;i<n;i++){aux=A[i][k];for(j=k;j<n;j++) A[i][j]=A[k][k]*A[i][j]-aux*A[k][j];B[i]=A[k][k]*B[i]-aux*B[k];}
for(i=n-1;i>=0;i--){ sum=0.0;for(j=i+1;j<n;j++)sum+=A[i][j]*X[j];X[i]=(B[i]-sum)/A[i][i];}//imprimir
printf("\n\nLAS RAICES SON\n\n");for(i=0;i<n;i++)printf("%f\t",X[i]);
// LIBERACION DE LA MEMORIAfor(i=0;i<n;i++)delete []A[i];delete []A;delete []B;delete []X;
printf("\n\nPara terminar ingrese un numero entero=");scanf("%d",&i);
59
return 0;}
Subprogramas
Estructura básica de un subprograma:
tipodato nombre(datos a ingresar o salir del subprograma cada uno con su tipo de dato)
{variables locales--return var td;}
Las variables que se encuentran fuera del subprograma se denominan globales.La variables locales son aquellas que solo existen dentro de cada subprograma.Las variables globales se inicializan en cero.Las variables locales se inicializan con basura.
Ejemplo 1: Estructura básica de un subprograma:
#include "stdafx.h"#include "math.h"float y2,q;int a,b,c,d;
float f1(float z){float x1,r=8.9;y2=(q+r)/z;x1=sqrt(y2);return x1;}void f2(int p, int q);
int _tmain(int argc, _TCHAR* argv[]){printf("ingrese un valor decimal=" );scanf("%f",&y2);
60
q=f1(y2);printf("ingrese dos enteros =>");scanf("%d%d",&c,&d);f2(c,d);printf("q=%f\n",q),printf("a=%d\t b=%d\n",a,b);printf("ingrese un numero entero para terminar");scanf("%d",&c);return 0;}void f2(int p, int q){float x,y;y=p-q;x=y+5;a=y;b=x;}
Ejemplo 2:
Paso de parámetros a funciones:
# include "stdafx.h"float x,y,z;
void f3(float a,float *b, float*c){float aux;printf("x=%f\t y=%f\t z=%f\t",a,*b,*c);aux=*b;(*b)=a+(*b)+(*c);(*c)=a-aux-(*c);a=2*a;printf("x=%f\t y=%f\t z=%f\t",a,*b,*c);}
int _tmain(int argc, _TCHAR* argv[]){printf("x=");scanf("%f",&x);
printf("y=");scanf("%f",&y);
printf("z=");scanf("%f",&z);
printf("\n antes de llamar a la funcion");
61
printf("x=%f\t y=%f\t z=%f\t\n\n",x,y,z);
f3(x,&y,&z);printf("x=%f\t y=%f\t z=%f\t\n\n",x,y,z);printf("ingresa un numero para poder terminar");scanf("%f",&y);
return 0;}
Ejemplo 3:
Sistema de ecuaciones lineales con punteros y subprogramas:
#include "stdafx.h"
float **A,*B,*X,aux,sum=0.0;int n,i,j,k;
void leer (float **x,float *y,int w)for (i=0;i<w;i++){
for(j=0;j<w;j++){printf("ingrese el elemento:A[%d][%d]= ",i+1,j+1);scanf("%f",&A[i][j]);}printf("Ingrese el elemento B[%d]=",i+1);scanf("%f",&B[i]);}
void calculo (float **x,float *y,float *z, int w)for(k=0;k<n-1;k++)for(i=k+1;i<n;i++)
{aux=A[i][k];for(j=k;j<n;j++)
A[i][j]=A[k][k]*A[i][j]-aux*A[k][j];B[i]=A[k][k]*B[i]-aux*B[k];}
//raices
for(i=n-1;i>=0;i--){ sum=0.0; for(j=i+1;j<n;j++) sum+=A[i][j]*X[j]; X[i]=(B[i]-sum)/A[i][i];}
void imprimir(float *X,int n);int _tmain(int argc, _TCHAR* argv[])
62
{
//toma de memoriaprintf("INGRESE LA DIMENSION N=");scanf("%d",&n);A=new float*[n];B=new float[n];X=new float[n];
for(i=0;i<n;i++)A[i]=new float[n];leer (A,B);calculo(A,B,X,n);imprimir(X,n);
// LIBERACION DE LA MEMORIA for(i=0;i<n;i++) delete []A[i];
delete []A;delete []B;delete []X;
printf("\n\nPara terminar ingrese un numero entero=");scanf("%d",&i);return 0;
void imprimir (float *X,int n)
printf("\n\nLAS RAICES SON\n\n");for(i=0;i<n;i++)printf("%f\t",X[i]);5
}
Ejemplo 4:
Realizar un programa que sume los elementos pintados en una matriz de orden n:
#include "stdafx.h"float **a,suma;
63
int i,j,n;
void leer(float **x, int w){
for(i=0;i<w;i++)for(j=0;j<w;j++){printf("a[%d][%d]= ",i+1,j+1);scanf("%f",&x[i][j]);}
}
void calculo(float**x,int w){
for(i=0;i<w;i++)if (i%2==0)
for(j=0;j<w;j+=2)suma+=a[i][j];else
for (j=1;j<n;j+=2)suma+=a[i][j];
}
int _tmain(int argc, _TCHAR* argv[]){//toma de memoriaprintf("ingrese n=");scanf("%d",&n);a=new float*[n];for(i=0;i<n;i++)
a[i]=new float[n];leer(a,n);calculo(a,n);printf("\n");
//imprimir matrizfor(i=0;i<n;i++){
for(j=0;j<n;j++){printf("%f\t",a[i][j]);}
printf("\n");}printf("\n");printf("la suma es %f",suma);
//borrar memoriafor(i=0;i<n;i++){
64
delete []a[i];}
delete []a;
printf("ingrese un numero para terminar");scanf("%d",&n);return 0;}
Ejemplo 5:
Realizar un programa que muestre los coeficientes que genera el triangulo de pascal
#include <iostream.h>#include <conio.h>
float nfa(int b);
void main(){int nf, r,x=40,y=1;float f1=0, f2=0, f3=0;
// Limpiamos Pantallaclrscr();
cout << "hasta n terminos ===> ";int a;
// Obtenemos el dichos valorcin >> a;
clrscr();
// Creamos secuencia numericafor (nf=0; nf<=a; nf++){gotoxy(x,y);
for (r=0; r<=nf; r++){f1 = nfa(nf);f2 = nfa(r);f3 = nfa(nf-r);
// Mostramos el valor segun rf/r, guardados en f1,f2,f3cout<< f1/(f3*f2) << " ";}
65
Tipo dato & Variable
// Salto de lineacout << "\n";x -= 1;y +=1;}
}
// Funcion factorial segun valor dado.float nfa(int b){float fact=1;
for (int i=1; i <=b; i++)fact *= i;
return fact;}
18-06-2009
REFERENCIA
Actúa como un puntero toma la dirección de un objeto (Variable) pero funcionan de diferente manera. Una vez inicializado ya no se puede modificar
Referencia Punterosint i;Int &r=i ;r=400;#include<………….>Int I, &x=I;main(…….){i=2;x*=100;printf(“i=%d”,i);
*r;r=&I;*r=400
66
printf(“\n x=%d”,x);trampa}
#include………….int i=45, &j=i;int fun_1(intj);main(….){printf(“i=%d\t j=%d\n”, i,j);i=fun_1(j);printf(“i=%d\t j=%D\n”,i,j);}Int fun_1(int j){ j=4;retur n j;}
FUNCIONES QUE DEVUELVEN REFERENCIAS
ESTRUCTURA EJEMPLOInt &fun2(int &k){
return k;}I=fun2(k);
Z[2]=45;
#include………….Int z[10];int &element(int*v, int i){return V[i];}main(….){Element(z,2)=45;// z[2]=45printf(“\n z[2]=%d”, z[2]);
}
67
EJEMPLO#include………….Int x=22, y=33, &z=x,&w=y;void f1(int a, int b);void f2(int*a,int*b);void f3(int &a,int &b);main(….){printf(“\n x=%d \t y=%d \n”,x,y);f1(x,y);printf(“\n x=%d \t y=%d \n”,x,y);f2 (&x,&y);printf(“\n x=%d \t y=%d \n”,x,y);f3(z,w);printf(“\n x=%d \t y=%d \n”,x,y);trampa}Void f1(int a, int b){int aux;aux=a;a=b;b=aux;}Void f2(int *a, int *b){int aux;aux= *a;*a=*b*b=aux;}void f3 (int &a, int b){int aux;aux=a;a=b;b=aux}
22-06-2009
68
ESTRUCTURAS
Def.- Tipo de dato que crea el programador
Formato.-
Formato EjemploStruct xxx{…..…… datos simples……};
Struct circuito{float voltajeFloat corrienteFloat Resistencia};
Anidamiento de estructuras.-
datos z;z. nombrez.nacimiento.messtruct fecha{int dia;int mes;int anio;};struct datos{char nombre [15];char direccion[20];fecha nacimiento;float sueldo;int hijos;};
Asignación de estructuras
A=Z;
A,Z son del mismo tipo de estructuras, los valores de asignan a los mismos campos
A.campo1 = Z.campo1;
A.campo2= Z.campo 2;
A.campo3.p = Z.campo3.p;
Ejemplo
69
1.- Leer datosScanf(“%f”, &z.campon); 2.- Sacar datosPrintf (“%t”, Z.campon);
3.- W=(a+z.campon * p)/ y.campo2;
EJERCICIO# include……Struct circuito{float v;Float I;Float r;};Circuito a;tmain(…..){#ingreso de datosprintf(“v= i=”);scanf(“%f%f”, & a.v,&a.i);//calculoa.r=a.v/a.i;//salidaprintf(“r=%5.3f”,a.r);}
// Arreglos estaticos de estructura#include…..struct circuito{Float v,I,r;};Circuito a[10];int j;….tmain(…){// ingreso de datosFor(j=0; j<10 ; j++){Printf(“v= , i= “);Scanf(“%f%f”,&a[j].v, &a[j].i);}//calculoFor(j=o; j<10; j++)A[j].r=a[j].v/a[j].i;
70
// salidaFor(j=0; j<10; j++)Printf(“r=%5.3f\n”, a[j].r);trampa}
// arreglos dinamicos de estructura#include…….Struct circuito{Floatv,i,r;};int j,n;circuito *a;…….main(…){// toma de memoriaPrintf(“n”);Scanf(“%d”,&n);a=new circuito[n];// ingreso de datosFor(j=0; j<n ; j++){Printf(“v= , i= “);Scanf(“%f%f”,&a[j].v, &a[j].i);}//calculoFor(j=o; j<n; j++)A[j].r=a[j].v/a[j].i;// salidaFor(j=0; j<n; j++)Printf(“r=%5.3f\n”, a[j].r);
delete[ ]a;trampa}
//estructuras y funciones#include….Struct circuito{Float v,i,r;};Int j,n;Circuito *a;Void leer (circuito *x, int w){For(j=0; j<w; j++)
71
{Printf(“v= i= “);Scanf(“%f%f”,&x[j].v, &x[j].i);}}Void calculo(circuito *x,int w){For(j=0; j<w; j++)x[j].r=x[j].v/x[j].i;}Void salir( circuito *x,int w){For(j=0; j<w; j++)Printf(“r=%5.3f\n”, x[j].r);}….main(….){//toma de memoriaPrintf(“n=”);Scanf(%d”,&n);A=new circuito [n];Leer(a,n);Calculo(a,n);Salir(a,n);//borrar memoriaDelete[]a;trampa
}
V i r
v=[1]
i[4]
r[7]
j v,i,r
25-06-2009
72
f(x) Audio
>>wapread >>waplay
>>aviread >>avifile
y
Grafico (foto)
x
-
* .*
/ ./
Matlab
C:\elect1.jpg
C:\elect2.jpg
>>x=imread(‘c:\elect1.jpg’); y=imread(‘c:\elect.jpg’)
>>x la imagen digitalizada matriz ---
>>imshow(x) ---
>>p1=x+7 ---
>>imshow(p1)
>>p3=x.*5
>>imshow(q3)
z=x + y si es posible
imshow(z)
73
29-06-2009
Estructuras auto-referenciadas
a b
a inf=12;
Estructuras auto-referenciadas
§1 sinopsis
Las estructuras se utilizan con frecuencia como elementos de estructuras de datos tipo árbol y lista. En estos casos, un conjunto de objetos del mismo tipo, están relacionadas entre sí mediante punteros contenidos en ellos mismos, de forma que basta conocer la raíz del árbol o principio de la lista, para poder acceder a todo el conjunto. En ocasiones, si tales listas son doblemente enlazadas, es posible entrar en cualquier nodo y recorrer la totalidad del conjunto en cualquier sentido. Esta es la razón del apelativo "auto-referenciadas".
§2 Como ejemplo, construiremos un programa que acepte caracteres por el teclado y construya un árbol binario ( 1.8b) cuyos elementos contengan el carácter introducido y estén ordenados según su valor ASCII. En la Fig. 1 se muestra gráficamente el resultado de introducir los caracteres: b, D, g, A, E y k.
El programa acepta caracteres indefinidamente (mientras exista memoria suficiente, o se pulse ESC). Después de la introducción de cada nuevo elemento, se muestra ordenadamente la totalidad del árbol.
Ejemplo:
#include "stdafx.h"74
Inf dirección
InfDirección
struct nodo{float inf;nodo *direc; };nodo *a,*b;int n;
int _tmain(int argc, _TCHAR* argv[])
{a=new nodo;a->inf=12.4;a->direc=NULL;b=new nodo;b->inf=10.5;b->direc=NULL;a->direc=b;b=NULL;printf("a->inf=%5.2f\n",a->inf);b=a->direc; printf("a->inf=%5.2f\n",b->inf);
printf("ingrese un numero");scanf("%d",n);
return 0;}
30-06-2009 CREAR LISTAS
// Crar.cpp : Defines the entry point for the console application.//
#include "stdafx.h"int n;struct nodo{char nombre[10];float inf;nodo *direc;
};
nodo *A, *q, *aux;char op='s';
int _tmain(int argc, _TCHAR* argv[]){
75
aux = new nodo;printf("Ingrese nombre=");scanf("%s",&aux->nombre);printf("Ingrese numero=");
scanf("%f",&aux->inf);aux -> direc = NULL;
A=q=aux; while (op!='n') {
printf("Ingrese nombre="); scanf("%s",&aux->nombre); printf("Ingrese numero=");
scanf("%f",&aux->inf); aux = new nodo;
aux -> direc = NULL; q->direc=aux; q=aux; printf("Ingresar otro nodo s/n=?"); scanf("%c",&op); } aux=A; while(aux!=NULL) { printf("%s\t%f",aux->nombre,aux->inf); aux=aux->direc; }
printf("\n\ningrese un numero para terminar\n");scanf("%d",&n);return 0;
}
LISTAS#include "stdafx.h"
struct nodo{char nombre[10];float inf;nodo *direc;};
int n,m=1;nodo *A, *q, *aux;char op='s';
int _tmain(int argc, _TCHAR* argv[]){
aux = new nodo;printf("Ingrese nombre=");
76
scanf("%s",&aux->nombre);printf("Ingrese numero=");
scanf("%f",&aux->inf);aux -> direc = NULL;
A=q=aux; while (m==1) {
aux = new nodo;printf("Ingrese nombre=");scanf("%s",&aux->nombre);printf("Ingrese numero=");scanf("%f",&aux->inf);aux -> direc = NULL;
q->direc=aux; q=aux; printf("Ingresar otro nodo s=1/n=0?"); scanf("%d",&m); }
aux=A; while(aux!=NULL) { printf("%s\t%5.2f\n",aux->nombre,aux->inf); aux=aux->direc; }
printf("\n\ningrese un numero para terminar\n");scanf("%d",&n);return 0;
}
LISTAS QUE SE INSERTA POR EL FINAL
#include "stdafx.h"
struct nodo
{
char nombre[10];
float edad;
nodo *direc;
};
int b,m=2;
nodo *A,*aux,*ULT;
77
int _tmain(int argc, _TCHAR* argv[])
{
ULT=NULL;
while (m==2)
{
printf("ingrese 1 para insertar\n");
printf("ingrese 2 para eliminar\n");
printf("ingrese 3 para salir\n");
scanf("%d",&b);
switch (b)
{
case 1: if(A==NULL)
{
aux = new nodo;
scanf("%s",&aux->nombre);
scanf("%f",&aux->edad);
aux->direc=NULL;
A=ULT=aux;
}
else
{
aux=new nodo
scanf("%s",&aux->nombre);
scanf("%f",&aux->edad);
aux->direc=NULL;
ULT->direc=aux;
78
ULT=aux;
}
break;
case 2:if (A==NULL)
printf("esta vacio");
else
{
if (A==ULT)
{
aux=A;
A=ULT=NULL;
delete aux;
}
else
{
aux=ULT;
ULT=A;
while (ULT->direc!=aux)
ULT=ULT->direc;
delete aux;
}
}
}
aux=A;
while (aux!=NULL)
{
79
printf(" nombre%s\n",aux->nombre);
printf(" edad%f\n",aux->edad);
aux=aux -> direc;
}
printf("continuar s=2, n =0");
scanf("%d",&m);
}
printf("ingrese un numero entero para terminar");
scanf("%d",&b);
}
LISTAS POR CUALQUIER LADO
# include <iostream.h>
struct nodo
{
int info;
nodo *sig;
};
nodo *a, *r, *p, *aux;
char op='s';
int op1=0;
void main ()
{
a=NULL;
while (op!='n')
80
{
cout <<"1.-Ingreso\n 2.-Borrar\n 3.-Salir\n";
cin >>op1;
switch (op1)
{
case 1:aux=new nodo;
cin>>aux->info;
if (a==NULL)
{
a=aux;
aux->sig=NULL;
}
else
{
r=a;
if(aux->info<r->info)
{
aux->sig=a;
a=aux;
}
else
{
while((r->sig->info<aux->info)&&r->sig!=NULL)
r=r->sig;
if(r->sig!=NULL)
{aux->sig=r->sig;r->sig=aux;}
if(r->sig==NULL)
{aux->sig=NULL;r->sig=aux;}
81
}
}
break;
case2: cin>>clave;
if (a==NULL)
[cout<<"lA LISTA ESTA VACIA";getch();}
else
{r=a;
if (clave==r->info)
{//elimina primero
a=a->sig;
delete r;
}
else
{
while((clave!=r->sig->info)&&(r->sig!NULL))
r=r->sig;
p=r->sig;
if(p!=NULL)
{
if(p->sig!=NULL)
r->sig=p->sig;
if(p->sig==NULL)
r->sig=NULL;
delete p;
82
}
if(p==NULL)
cout<<"No hay nombre en la lista";
} //del switch
//Impresion de la lista
r=a;
while(r!=NULL)
{
cout<<r->info;
r=r->sig;
}
cout<<"Continuar (s/n)?";
cin>>op;
} //fin del while
} // fin del main
02-07-2009
LISTAS
1.- INICIO
aux=new nodo;
scanf(“%f”,&aux inf);
aux direc = A;
A= aux;
83
BORRAR
aux=A;
A= aux direc;
delete aux;
2.- INSERTAR FINAL (Ubicar el puntero en el último nodo)
aux = new nodo;
scanf (“%f”,&aux inf);
aux direc = null
p direc=aux
BORRAR
P direc=aux;
delete aux
3.- INSERTAR INTERMEDIO (Ubicar el Puntero en el nodo)
aux = new nodo;
scanf (“%f”,& aux inf);
aux direc =p direc;
p direc = aux
BORRAR
84
p direc = aux direc;
delete aux;
include “stdafx.h”
struct nodo
{
char nombre [10];
float edad;
nodo *direc;
};
nodo *A, *aux;
int m=2; b;
Main (……)
A=NULL;
while (m==2)
{
printf(“ingrese 1 para inserter\n”);
printf(“ingrese 2 para eliminar\n”);
printf((“ingrese 3 para salir\n”);
scanf(“%d”,&b);
switch(b)
{
case 1: aux = nex nodo;
scanf(“%s”, & aux nombre);
scanf(“%f”,&aux edad);
aux direc=A;
85
A=aux;
Break;
Case 2: if(A==NULL)
printf(“Está vacío”);
else
{
aux=A;
A= aux direc;
delete aux;
}
}
aux=A
while(aux!=NULL)
{
printf(“ nombre %s\n”,a nombre);
printf(“ edad %f\n”, a edad);
aux= aux direc;
}
printf(“continuar s=2; N=0”);
scanf(“%d”,&m);
}
TRAMPA
}
86
09-07-2009
FORMAS DE ALMACENAMIENTO DE LAS VARIABLES
Auto
Static
Register auto float a;
Extern static tipo var;
Const register tipo var;
Volatile
EJEMPLO:
Void f1()
{
static int a= 10;
a=a+10;
printf(“%d\n”;a);
]
Main(..)
;
f1();// 20
f2();// 30
f3() ;// 40
}
87
COMANDOS DE PROCESADORES
#include -----> #include <stdio.h> "stdafx"
#define
#undef
#if
#else
#endif
#ifdef
#ifndef
#pragma
#error
#line
"path.\...\....\"...las comillas buscan la Dirección en la computadora.
fie.cpp
# include"stdafx.."
#include"e:\fie\trabajo\uno.cpp"
#include"f:\electronica\tres.cpp"
Main(...)
{
}
uno.cpp
void fi()
{
printf("HOLA");
}
tres.cpp
88
void f2()
{
printf("TRES");
}
#define NOMBRE Lista de comandos.................... (SE CORTA CON \)
....................\
....................\
#define M 4
#define rutina for(i=1;i<10;i++)\
j=i+2; \
for(k=j; k<20;k++)\
printf("*"); \
printf("\n") \
}
main()
{
p=m+5;
#undef m
rutina;
}
#undef (elimina a la macro)
13-07-2009
#indef uno_h
#define uno_h
89
Struct dato
{
Char nombre [15];
Int x;
};
#endif
#include….
#include “uno.h”
Dato a;
……main()
{
Scanf(“%s”,&a.nombre);
#include “uno.h”
Scanf(“%d”,&a.x);
Printf(“%s\t%d”,a.nombre,a.x);
}
LOS ARCHIVOS
Almacenamiento en variables y arreglos es temporal: termina programa y estos datos se pierden;Conservación permanente de grandes cantidades de datos: archivos;Archivos almacenados en dispositivos almacenamiento secundario, (p.e. disco);C ve un archivo como un flujo secuencial de bytes, (stream); que se conoce con el nombre de descriptor o manejador de archivos.Cada archivo termina con un marcador de fin de archvio, (eof);Cuando un archivo se abre se asocia un stream con el archivo;La ejecución de un programa abre automaticamente tres archivos, los cuales tienen relacionados tres streams:
1. stdi: entrada estándar, (que vale 0); 2. stdo: salida estándar, (valor: 1);
90
3. stderr: error estándar, (valor: 2);
Dos tipos de archivos:
1. Archivos tipo texto 2. Archivos binarios
Abertura de archivos texto
stream = fopen(nombre-archivo, modo)
stream: debe ser una variable tipo apuntador a un archivo FILE *<nombre-variable>
nombre-archivo: es el nombre de un archivo, el cual debe de estar entre comillas, (''): ''/usr/local/tarea.txt''
también puede referenciarse usando un arreglo de caracteres: char nombre[40] nombre = ''/usr/local/tarea.txt''
modo: al igual que el nombre-archivo se puede expresar entre comillas o a travez de un arreglo de caracteres;
Los valores que puede tomar modo son:
simbolo si existe el archivo si no existe r abre archivo para lectura error: regresa NULL w abre archivo para escritura crea archivo y abre escritura a abre archivo para añadir crea archivo y abre escritura b declara archivo como binario (manejado por fread() y fwrite()) + permite lectura y escritura
Ejemplos abertura archivos
main() { FILE *p, *q; char nombre[25], modo[5];
/* Abriendo archivo texto en modo escritura */
91
if ( p = fopen(''ejemplo.txt'', ''w+'')) { ... } else { printf(''\n Error: no se pudo abrir el archivo \n''); exit(1) } ...
/* Abriendo archivo binario en modo lectura */
nombre = ''/usr/al445566/toto.dat''; modo = ''rb''; if ( q = fopen(nombre,modo) == NULL) printf(''No pudo abrirse el archivo nn''); else ... }
File *p,*q,*f
p=fopen (“ nombre del archivo”,” + ”)
a b binario
c:\file\tralnp\datos.dat w t letras ASCII-uincode
r
Archive Existe No existe
92
Numeros
Estructuras
Imágenes
Audio
Video
a(append) adiciona Creaw(write) Borra crea
fclose(p);
fwrite(&dato,sizeof(dato),1,P);
fread(&dato,sizeof(dato),1,p);
fseek (f,cont*sizeof(dato),SEEK_SET);
rewind(p); pone al punter del archive al inicio
while(¡feof(p))
EJEMPLO.-
#include "stdafx.h"struct datos{char nombre[10];float nota1;};FILE *f;datos *a;int cont,opp;int _tmain(int argc, _TCHAR* argv[]){
f=fopen("c:\datos.dat","a+b");scanf("%s",&a.nombre);scanf("%f",&a.nota1);fwrite(&a,sizeof(a),1,f);fclose(f);f=fopen("c:\datos.dat","r+b");fread(&a,sizeof(a),1,f);cont=1;while(!feof(f)){printf("cont=%d",cont);printf("%s\t%f\n",a.nombre,a.nota1);fread(&a,sizeof(a),1,f);cont++;}fclose(f);f=fopen("c:\datos.dat","r+b");printf("posicion=");scanf("%d",&opp);fseek(f,opp*sizeof(a),SEEK_SET);fread(&a,sizeof(a),1,f);printf("%s\t%f\n",a.nombre,a.nota1);fclose(f);printf("ingrese un numero");scanf("%d",&cont);
93
return 0;}
Bibliografía
http://www.geocities.com/eztigma/lenguajec.html
http://www.mailxmail.com/curso-introduccion-lenguaje-c/declaraciones
http://www.fismat.umich.mx/mn1/manual/node3.html#SECTION00330000000000000000
94
http://elvex.ugr.es/decsai/c/apuntes/tipos.pdf
http://ar.geocities.com/luis_pirir/cursos/operadores.htm
95