Introducción Fases para desarrollar algoritmos Pseudocódigos Implementación en un lenguaje de alto nivel(lenguaje C) Estructura de control 2. Modulación y arreglos Funciones punteros Ámbito de los identificadores Funciones recursivas Modo grafico Elaboración de proyectos Arreglos 3. Punteros, cadenas, estructuras, archivos y preprocesador c Aritmética de punteros Cadenas Estructuras Archivos Preprocesador c
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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.
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
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.
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:
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
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.
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);}
#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;
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.
}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:
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);
//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];}
// 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.
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;}
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.
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:
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 ... }
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);