Issuu on Google+

UNIVERSIDAD TÉCNICA DE AMBATO FACULTAD DE CIENCIAS HUMANAS Y DE LA EDUACIÓN CARRERA DE DOCENCIA EN INFORMÁTICA

Cristhian Tamami Dávila Segundo Semestre Ing. Mg. Wilma Gavilánez Septiembre 2012-Febrero 201


Lenguaje de Programación I INTRODUCCION LENGUAJE DE PROGRAMACION EN C 1. Introducción 2. Ciclo de vida, algoritmos y diagrama de flujo 1. La resolución de problemas 2. Análisis del problema 3. Diseño del algoritmo 4. Resolución del problema 5. Algoritmo 6. Diagrama de flujo 3. Datos, constantes, variables, acumuladores, banderas y contadores 1. Tipos de datos 1. Datos numéricos 2. Datos lógicos 3. Caractéres 2. Constantes y variables 3. Contador 4. Acumulador 5. Banderas 4. Expresiones 1. Expresiones aritméticas 2. Expresiones lógicas 5. Diseño Top-Down 6. Estructura general de un programa en C 7. Entrada y salida de datos en C 8. Estructuras de decisión 1. Estructura de decisión if-else 2. If's anidados 3. Estructura de decisión múltiple Switch 9. Estructuras de repetición 1. Estructuras de control de repetición while y do/while 2. Estructura de control de repetición for y for's anidados 10. Arreglos unidimensionales Introducción El Lenguaje de programación C fue implantado por primera vez en los años 70 por Dennis Ritchie para una computadora DEC PDP-11 corriendo el sistema operativo UNIX. El lenguaje C, a diferencia de lenguajes como Basic y Pascal que son lenguajes de alto nivel, es un lenguaje de nivel medio ya que combina las propiedades de un lenguaje de alto nivel con la funcionalidad del lenguaje ensamblador. Es esa misma característica la que le da a este lenguaje más potencia y dominio sobre los recursos del sistema. Entre una de las características más importantes de C está la portabilidad, esto es, un programa escrito en C se puede trasladar fácilmente entre distintos sistemas operativos como Windows, DOS o Linux.

Diseñado por: Cristhian Tamami

Página 2


Lenguaje de Programación I Ciclo de vida, algoritmos y diagrama de flujo La resolución de problemas La principal razón para aprender a programar y conocer los lenguajes de programación es utilizar la computadora como herramienta para solucionar problemas. La resolución de problemas se divide en tres fases: Análisis del problema El propósito de esta fase es ayudar al programador a comprender el problema. El problema debe estar bien definido si se desea llegar a una solución satisfactoria, para lo cual se requiere que las especificaciones de entrada y salida sean descritas con detalle. Diseño del algoritmo Una computadora solo puede solucionar problemas cuando se le proporcionan los pasos sucesivos a realizar, a estos pasos sucesivos que indican las instrucciones a realizar se les llama "algoritmos". Las fases para realizar el diseño del algoritmo son:   

Diseño descendente Refinamiento de pasos Uso de herramientas de programación: diagrama de flujo o pseudocódigo

Resolución del problema Una vez que el algoritmo está diseñado y representado mediante una herramienta de programación (pseudocódigo o diagrama de flujo) se lleva a cabo la fase de la resolución del problema mediante la computadora, la cual se divide a su vez en las siguientes subfases:

1. Codificación del algoritmo, que consiste en utilizar un lenguaje de programación siguiendo las reglas gramaticales del mismo (sintaxis) para convertir el algoritmo en un programa 2. Ejecución del programa utilizando un compilador del lenguaje 3. Comprobación del programa Algoritmo Se denomina algoritmo al conjunto de instrucciones que especifican la secuencia de operaciones a realizar para resolver un problema especifico. Es decir, es un conjunto de pasos a seguir para llegar a cierto fin medible o comprobable. Los algoritmos son independientes del lenguaje de programación y de la computadora que se vaya a emplear para ejecutarlo.

Diseñado por: Cristhian Tamami

Página 3


Lenguaje de Programación I Todo algoritmo debe ser:

1. Preciso, es decir, indicar el orden en el que ha de realizarse cada paso 2. Definido, es decir, se debe obtener el mismo resultado cada vez que se ejecute con las mismas especificaciones de entrada 3. Finito, es decir, debe terminar en algún momento o debe tener un número finito de pasos Diagrama de flujo Técnica especializada para representar algoritmos mediante el uso de figuras, las cuales se unen mediante flechas denominadas líneas de flujo que indican el orden en que se deben ejecutar. Datos, constantes, variables, acumuladores, banderas y contadores Tipos de datos Las 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. Los tipos de datos simples son: numéricos (enteros y reales), lógicos y caracteres. Datos numéricos Este tipo de datos se divide en enteros y reales. Los enteros son aquellos números que no tienen componente fraccionario o decimal y dentro de la computadora son un subconjunto finito de los números enteros. Estos números pueden ser negativos o positivos y el rango es de –32,768 a 32,767. Datos lógicos Este tipo de dato es aquel que solo puede tomar uno de 2 valores: verdadero (true) o falso (false). En lenguaje C no existe el tipo lógico pero se puede implementar con un número entero conociendo que 0 es falso y cualquier número diferente de cero verdadero. Caracteres El dato tipo carácter puede tomar un valor de un conjunto finito y ordenado de caracteres o símbolos que la computadora reconoce (código ASCII). Este tipo de dato ocupa un byte y almacena un solo carácter. Diseñado por: Cristhian Tamami

Página 4


Lenguaje de Programación I Tipos de datos Descripción

Memoria

Int

Entero

2 bytes

Char

Caracter

1 byte

Float

Flotante

4 bytes

Double

Flotante de doble precisión 8 bytes

Constantes y variables Una constante es un dato que permanece sin cambio durante el desarrollo del algoritmo o durante la ejecución del programa. La mayoría de los lenguajes de programación nos permiten el manejo de diferentes tipos de constantes, estas pueden ser enteras, reales, caracteres y cadenas. En lenguaje C una constante se define por medio de la instrucción #define (directiva del procesador). Una variable se identifica por dos atributos: el nombre de la variable (identificador) y el tipo de la variable. El identificador se puede formar con caracteres alfanuméricos y el carácter de subrayado (_) empezando siempre por una letra. No se admiten como identificadoras palabras reservadas del lenguaje de programación que se esté utilizando. Los nombres de variables que se elijan para el algoritmo o programa deben ser significativos y tener relación con el objeto que representa. En lenguaje C la sintaxis para definir una variable es: tipo_de_dato identificador;

Contador Los procesos repetitivos requieren contar los sucesos y acciones internas, una forma de hacerlo es mediante un contador. Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad constante en cada repetición. La forma en que se construye un contador es la siguiente: int contador = 1; //variable con valor inicial de 1 contador = contador+1; contador += 1; contador ++;

Acumulador

Diseñado por: Cristhian Tamami

Página 5


Lenguaje de Programación I Un acumulador o totalizador es una variable cuya función es almacenar cantidades resultantes de operaciones sucesivas. Realiza la misma función que un contador con la diferencia de que el incremento o decremento es variable en lugar de constante. int acumulador = 0; acumulador = acumulador + valor; acumulador += valor;

Banderas Una bandera, también denominada interruptor o conmutador es una variable que puede tomar uno de dos valores (verdadero o falso) a lo largo de la ejecución del programa y permite comunicar información de una parte a otra del mismo. int primo; primo = 0; primo = 1;

Expresiones Las expresiones son combinaciones de constantes, variables, símbolos de operación (operadores), paréntesis y nombres de funciones especiales. Por ejemplo: sqrt ((p-a)*(p-b)*(p-c)); (a+b+c) / p;

Una expresión toma un valor que se determina por el resultado de la ejecución de las operaciones indicadas, tomando los valores de las variables y constantes y aplicando las prioridades de las operaciones. Expresiones aritméticas Utilizan los operadores siguientes:

Operador Acción +

Suma

-

Resta

*

Multiplicación

Diseñado por: Cristhian Tamami

Página 6


Lenguaje de Programación I /

División

%

Módulo

++

Incremento

--

Decremento

Las expresiones que tienen 2 o más operadores requieren reglas de precedencia que permiten determinar el orden en que habrán de efectuarse dichas operaciones. Por ejemplo: 5 + 8 * 2 //Primero se hace 8 * 2 y luego se suma 5 5+16 = 21 10%3 = 1 //Regresa el residuo de la división entera

Expresiones lógicas Estas emplean los operadores lógicos:

Operador

Acción

Operadores Relacionales >

Mayor que

>=

Mayor o igual

<

Menor que

<=

Menor o igual

==

Igual

!=

Diferente

Operadores lógicos

Diseñado por: Cristhian Tamami

Página 7


Lenguaje de Programación I &&

Y

||

O

!

Negación

Por ejemplo: 5>3 && 6>2 año%4==0 && año%100!=0 || año%400==0

Diseño Top-Down La metodología descendente (top-down), también conocida como arriba-abajo consiste en establecer una serie de niveles de menor o mayor complejidad (arriba-abajo) que den solución al problema. Consiste en efectuar una relación entre las etapas de la estructuración de forma que una etapa jerárquica y su inmediatamente inferior se relacionen mediante entradas y salidas de información. Un proceso descendente esta basado en dos características esenciales:  

representación en forma de árbol, y descomposición funcional

Estructura general de un programa en C Todo programa 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. Las definiciones de las funciones adicionales pueden preceder o seguir a main. Cada función debe contener:

1. 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. 2. Una lista de declaración de argumentos, si se incluyen éstos en la cabecera. 3. Una sentencia compuesta, que contiene el resto de la función. Los comentarios pueden aparecer en cualquier parte del programa, mientras estén situados entre los delimitadores /* */ o comenzar con // si solo es una línea. /*Estructura de un programa en C*/

Diseñado por: Cristhian Tamami

Página 8


Lenguaje de Programación I #include <nombre_de_la_biblioteca> #define nombre_de_la_constante valor //Función principal void main(){ definición de variables; instrucciones del programa; }

Ejemplo: /*Primer programa en C*/ #include <stdio.h> #include <conio.h> void main(){ //Imprime el texto en pantalla printf ("Hola, mundo!"); getch(); }

Entrada y salida de datos en C Como se mencionó anteriormente, es necesario conocer las entradas y las salidas del problema para poder resolverlo. Para que C reciba estos datos utilizamos las funciones de biblioteca scanf para la entrada y printf para la salida. Su sintaxis es la siguiente: //Lee el valor y lo guarda en una variable scanf ("%d", &variable); //Imprime en pantalla el texto y el valor printf ("El valor es %d", variable);

Ejemplo: #include <stdio.h> #include <conio.h> #include <math.h> void main() { int r, a, p; printf ("Programa que calcula el área y perímetro de un circulo"); printf ("\nIntroduce el radio: ");

Diseñado por: Cristhian Tamami

Página 9


Lenguaje de Programación I scanf ("%d", &r); a = M_PI * pow(r,2); p = M_PI * (r+r); printf ("\nEl área es: %d", a); printf ("\nEl perímetro es: %d", p); getch(); }

En ocasiones, queremos que el programa reciba una entrada de tipo caracter. Para lograr esto podemos declarar una variable de tipo carácter y guardarla en getch() o getche(). La diferencia entre ellos es que getche() muestra en pantalla el carácter introducido, mientras que getch() lo mantiene oculto. Su sintaxis es la siguiente: char opc; opc=getch(); opc=getche();

Estructuras de decisión Estructura de decisión If-Else Cuando el programador desea especificar en un algoritmo o programa 2 o más caminos alternativos se debe utilizar una estructura de decisión, la cual evalúa una condición y en función del resultado, realiza una parte de la estructura u otra. Las condiciones se especifican mediante expresiones lógicas. Una de las estructuras de decisión es la estructura if-else y su sintaxis es la siguiente: //Si se trata de dos o más instrucciones, estas van entre llaves { } if (condición) Instrucciones a ejecutar cuando la condición es verdadera; else Instrucciones a ejecutar cuando la condición es falsa;

Ejemplo: #include <stdio.h> #include <conio.h> void main(){ int year;

Diseñado por: Cristhian Tamami

Página 10


Lenguaje de Programación I clrscr(); //Limpia la pantalla printf ("Progama para determinar si un año es bisiesto"); printf ("\nIntroduce un numero de año\n"); scanf ("%i", &year); if (year%4 == 0 && year%100 != 0 || year%400 == 0) printf ("\a\nEl año %i si es bisiesto", year); else printf ("\a\nEl año %i no es bisiesto", year); getch(); }

If’s anidados if (condición) if (condición) Instrucciones a ejecutar cuando la condición es verdadera; else Instrucciones a ejecutar cuando la condición es falsa; else Instrucciones a ejecutar cuando la condición es falsa;

Ejemplo: #include <stdio.h> #include <conio.h> void main(){ int a, b, c, d, mayor; clrscr (); printf ("Programa que indica cual de 4 numeros es el mayor\n"); printf ("Introduce 4 numeros enteros:\n"); scanf ("%i%i%i%i", &a, &b, &c, &d); if (a > b) if (a > c) if (a > d)

Diseñado por: Cristhian Tamami

Página 11


Lenguaje de Programación I mayor = a; else mayor = d; else if (c > d) mayor = c; else mayor = d; else if (b > c) if (b > d) mayor = b; else mayor = a; else if (c > d) mayor = c; else mayor = d; printf ("El mayor es %i", mayor); getch(); }

Estructura de decisión múltiple (switch) La estructura switch evalúa una expresión que puede tomar n valores distintos, según con cual de estos valores coincida, se ejecutaran ciertas acciones, es decir, el programa o algoritmo seguirá un determinado camino entre los n posibles. La sintaxis de la estructura switch es: switch (expresión entera) { case exp_constante_1: acciones a realizar cuando la expresión tiene el valor exp_constante_1; break; case exp_constante_2: acciones a realizar cuando la expresión tiene el valor exp_constante_2; break; ...especificar todos los casos default:

Diseñado por: Cristhian Tamami

Página 12


Lenguaje de Programación I acciones a realizar cuando la expresión no coincide con ninguno de los casos; break; }

Estructuras de repetición Las computadoras están diseñados especialmente para aquellas aplicaciones en las cuales una operación o conjunto de ellas deben de repetirse varias veces. A las estructuras que repiten una secuencia de instrucciones un número determinado de veces se les denomina bucles y se llama iteración al acto de repetir la ejecución de una secuencia de acciones. Estructuras de control de repetición while y do/ while En estas estructuras el conjunto de instrucciones que forman parte del bucle se repite mientras se cumple una determinada condición. La estructura do/ while prueba la condición después de ejecutar las instrucciones del bucle y por lo tanto esta se ejecutará por lo menos una vez. La sintaxis de la estructura while es: while (condición) { Instrucciones que se repetirán mientras la condición sea verdadera; Instrucciones adicionales; }

Ejemplo: #include <stdio.h> #include <conio.h> void main(){ int b = 99; while ( b > 0 ){ printf printf printf printf

("\n%i bottle(s) of beer on the wall,", b); ("\n%i bottle(s) of beer.", b); ("\nTake one down, pass it around,"); ("\n%i bottle(s) of beer on the wall.\n", b-1);

b--; } getch();

Diseñado por: Cristhian Tamami

Página 13


Lenguaje de Programación I }

La sintaxis de la estructura do/ while es: do { Instrucciones que se repetirán al menos una vez mientras la condición sea verdadera; Instrucciones adicionales: } while (condición);

Ejemplo: #include <stdio.h> #include <conio.h> #include <math.h> void main(){ float a, b, c, raiz, x1, x2; char resp; do{ clrscr(); printf ("Programa para calcular las raices de una ecuacion cuadratica"); printf ("de la forma ax^2+bx+c=0"); printf ("\n\nIntroduce el valor de las variables a, b y c en orden: \n"); scanf ("%f%f%f", &a,&b,&c); raiz=(b*b)-4*a*c; if (raiz>=0){ x1=(-b+sqrt(raiz))/(2*a); x2=(-b-sqrt(raiz))/(2*a); printf ("\nLas raices son x1: %.2f y x2: %.2f", x1, x2); } else printf ("\nLos valores que introdujiste regresan raices imaginarias"); printf ("\n\nDeseas resolver otra ecuacion? (s/n) ");

Diseñado por: Cristhian Tamami

Página 14


Lenguaje de Programación I resp = getche(); } while (resp=='s' || resp=='S'); getch(); }

Estructura de control de repetición for y for anidados La estructura for maneja de manera automática todos los detalles de repetición controlada por un contador. La sintaxis de la estructura for es: for (contador; condición; variación) Secuencia de instrucciones que se desean repetir;

Ejemplo: #include <stdio.h> #include <conio.h> void main(){ int x=1, y=1, z=0, a; clrscr (); printf("Serie de Fibonaci\n\n"); printf("Escribe el numero final: "); scanf("%i",&a); printf("%6i",x); printf("%6i", y); for (; z < a ;){ z=x+y; if(z <= a){ printf("%6i",z); x = y; y = z; } } getch(); }

Arreglos unidimensionales Diseñado por: Cristhian Tamami

Página 15


Lenguaje de Programación I Un arreglo es un conjunto de celdas de memoria relacionadas entre si ya que todos tienen el mismo nombre y almacenan el mismo tipo de datos para referirse a una celda en particular algún elemento dentro del arreglo y entre corchetes [] el numero de posición del elemento dentro del arreglo. El número de posición que aparece dentro de los corchetes se conoce como índice y debe ser un número entero o una expresión entera, por ejemplo: printf ("%i", a[0]+a[5]+a[10]); x=a[7]/2; x=a[4]=12;

Para declarar un arreglo se emplea la siguiente sintaxis: tipo_de_dato nombre_del_arreglo [número de elementos]; int a[12]; float f[10]; char nom_emp [30];

Ejemplo: #include <stdio.h> #include <conio.h> #define MAX 12 void main(){ int a[MAX], b[MAX], c[MAX], i, j=0, k=0; clrscr(); printf ("Programa que almacena 12 numeros en un arreglo "); printf ("y luego los separa en dos de acuerdo a su valor.\n"); for (i=0; i < MAX; i++){ printf ("Introduce el valor %i: ", i+1); scanf ("%i", &a[i]); } for (i=0; i < MAX; i++) if (a[i] < MAX){ b[j] = a[i]; j++; } else {

Diseñado por: Cristhian Tamami

Página 16


Lenguaje de Programación I c[k] = a[i]; k++; } printf ("\nLos numeros quedan asi:\n\n"); for (i=0; i < j; i++) printf ("%i\n", b[i]); for (i=0; i < k; i++) printf ("\t%i\n", c[i]); getch(); }

VECTORES Y MATRICES EN LENGUAJE C Un vector es un array unidimensional de números. Se define la clase Vector con dos miembros dato, el número de datos que guarda y el array unidimensional que guarda dichos datos. public class Vector { public int n; double[] x; La clase Vector y la clase Matriz están en el mismo paquete. El miembro dato x de la clase Vector tiene el control de acceso por defecto, es decir, público dentro del mismo paquete pero privados fuera del paquete. Más abajo, en esta página al definir las funciones miembro de la clase Matriz que realizan operaciones entre matrices y vectores veremos que, los objetos de la clase Vector necesitan acceder a su miembro dato x. Una matriz es un array bidimensional de números. En general, decimos que una matriz tiene una dimensión m x n, cuando los números están dispuestos en m filas y n columnas. Se denominan matrices cuadradas a aquellas que tienen el mismo número de filas que de columnas. Estas matrices tienen especial importancia y serán las que tratemos en estas páginas. public class Matriz{ public int n; private double[][] x; La clase Matriz tiene dos miembros dato, la dimensión de la matriz n, y un array bidimensional x, que crearemos e inicializaremos en los constructores. Los constructores Vamos a definir dos constructores en la clase Vector, al primero se le pasa el número de elementos que va a guardar e inicializan a cero todos sus elementos. Diseñado por: Cristhian Tamami

Página 17


Lenguaje de Programación I public Vector(int n) { this.n=n; x=new double[n]; for(int i=0; i<n; i++){ x[i]=0.0; } } Para crear un vector v de dimensión tres se escribe Vector v=new Vector (3); Al segundo constructor, se le pasa el array unidimensional, e inicializa el miembro dato x con los valores que guardan los elementos de dicho array en una única y simple operación de asignación public Vector(double[] x) { this.x=x; n=x.length; } Para crear un vector v que guarde los datos del array v1 se escribe Double [] v1={1, 2, 3}; Vector v=new Vector (v1); Para la clase Matriz necesitamos definir dos constructores, al primero se le pasa la dimensión n de la matriz cuadrada, creando un array bidimensional de n filas y n columnas, e inicializa todos sus elementos a cero. public Matriz(int n) { this.n=n; x=new double[n][n]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ x[i][j]=0.0; } } } Para crear una matriz a de dimensión tres cuyos elementos son todos ceros, se escribe. Matriz a=new Matriz(3); Al segundo constructor, se le pasa un array bidimensional, e inicializa el miembro dato x con los valores que guardan los elementos de dicho array en una única y simple operación de asignación.

Diseñado por: Cristhian Tamami

Página 18


Lenguaje de Programación I public Matriz(double[][] x) { this.x=x; n=x.length; } Para crear la matriz a

se crea un array bidimensional a1, y se le pasa al constructor de la clase Matriz double[][] a1={{1, 2, 3},{-2, -4, -5},{3, 5, 6}}; Matriz a=new Matriz(a1); public class Vector { public int n; //dimensión double[] x; public Vector(int n) { this.n=n; x=new double[n]; for(int i=0; i<n; i++){ x[i]=0.0; } } public Vector(double[] x) { this.x=x; n=x.length; } //otras funciones miembro } **************************************** public class Matriz{ public int n; //dimensión private double[][] x; public Matriz(int n) { this.n=n; x=new double[n][n]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ x[i][j]=0.0; } } } public Matriz(double[][] x) { this.x=x; n=x.length; Diseñado por: Cristhian Tamami

Página 19


Lenguaje de Programación I } //otras funciones miembro } Mostrar un vector y una matriz Para mostrar un vector redefinimos la función toString de la clase base Object, de la cual deriva implícitamente Vector. Separamos sus elementos mediante el carácter tabulador '\t'. public String to String(){ String texto=" "; for(int i=0; i<n; i++){ texto+="\t "+(double)Math.round(1000*x[i])/1000; } texto+="\n"; return texto; } Vamos añadiendo al string texto, los elementos del vector y el carácter separador entre elementos, limitamos el número de decimales a tres mediante la función Math.round. Para concluir la fila y pasar a la siguiente en la pantalla de texto, añadimos un carácter retorno de carro '\n'. Mediante la operación + definida en la clase String podemos concatenar fácilmente los distintos elementos y crear la representación textual del vector que devuelve la función toString Para mostrar el vector v en la pantalla de texto, basta escribir la sentencia Vector v=new Vector(v1); System.out.println(v); Para mostrar los elementos de la matriz, redefinimos la función toString de la clase base Object, de la cual deriva implícitamente Matriz. Separamos los elementos de una fila mediante el carácter tabulador'\t', y limitamos el número de decimales a tres mediante la función Math.round. Cuando se acaba una fila se inserta un retorno de carro '\n' y se continua con la siguiente fila, y así sucesivamente. for(int j=0; j<n; j++){ texto+="\t "+(double)Math.round(1000*x[i][j])/1000; } texto+="\n"; Vamos añadiendo al String texto, los elementos de la matriz y los caracteres separadores entre elementos y entre filas de elementos. public String toString(){ String texto="\n"; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ Diseñado por: Cristhian Tamami

Página 20


Lenguaje de Programación I texto+="\t "+(double)Math.round(1000*x[i][j])/1000; } texto+="\n";

}

} texto+="\n"; return texto;

Para mostrar una matriz a en la pantalla de texto basta escribir la sentencia Matriz a=new Matriz(a1); System.out.println(a); public class Vector { public int n; //dimensión double[] x; //... public String toString(){ String texto=" "; for(int i=0; i<n; i++){ texto+="\t "+(double)Math.round(1000*x[i])/1000; } texto+="\n"; return texto; } } **************************** public class Matriz{ public int n; //dimensión private double[][] x; //... public String toString(){ String texto="\n"; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ texto+="\t "+(double)Math.round(1000*x[i][j])/1000; } texto+="\n"; } texto+="\n"; return texto; } } Copia de una matriz dada Cuando calculamos la matriz inversa de una dada, pasamos una matriz en el único parámetro de la función estática denominada inversa. En el cuerpo de dicha función se realizan operaciones con los elementos de dicha matriz. Dado que en Java se pasan por valor las Diseñado por: Cristhian Tamami

Página 21


Lenguaje de Programación I referencias a objetos, la matriz original resulta modificada en el curso de la llamada a la función inversa. public class Matriz implements Cloneable{ public int n; //dimensión private double[][] x; //.......... public Object clone(){ Matriz obj=null; try{ //llama a clone de la clase base Object obj=(Matriz)super.clone(); }catch(CloneNotSupportedException ex){ System.out.println(" no se puede duplicar"); } //copia la matriz bidimensional obj.x=(double[][])obj.x.clone(); for(int i=0; i<obj.x.length; i++){ obj.x[i]=(double[])obj.x[i].clone(); } return obj; } } Para obtener una copia a de una matriz d se escribe. Matriz a=(Matriz)d.clone(); La promoción (casting) es necesaria ya que clone devuelve una referencia a un objeto de la clase base Object. Traza de una matriz Se denomina traza de una matriz cuadrada a la suma de los elementos de su diagonal principal. public double traza(){ double tr=0.0; for(int i=0; i<n; i++){ tr+=x[i][i]; } return tr; } Para obtener la traza de la matriz a de la sección anterior se escribe double traza=a.traza(); Diseñado por: Cristhian Tamami

Página 22


Lenguaje de Programación I Operaciones con matrices y vectores Suma de dos matrices cuadradas Cuando se suman dos matrices de las mismas dimensiones

Se obtiene otra matriz c en la que sus elementos cij son las suma de los correspondientes elementos de las matrices a y b, es decir cij=aij+bij public static Matriz suma(Matriz a, Matriz b){ Matriz resultado=new Matriz(a.n); for(int i=0; i<a.n; i++){ for(int j=0; j<a.n; j++){ resultado.x[i][j]=a.x[i][j]+b.x[i][j]; } } return resultado; } Veamos ahora como se llama a la función que suma dos matrices. double[][] a1={{1, 2, 3},{4,5,6},{7,8,9}}; Matriz a=new Matriz(a1); double[][] b1={{1, 0, -1},{2,1,3},{-1, 0, 2}}; Matriz b=new Matriz(b1); Matriz re=Matriz.suma(a, b); System.out.println("matriz "+re); Producto de dos matrices La regla para multiplicar dos matrices es bastante más complicada que para sumar dos matrices de las mismas dimensiones. En general, se pueden multiplicar dos matrices de dimensiones m x n y n x q, dando como resultado una matriz de dimensiones m x q. En este apartado nos circunscribiremos exclusivamente a matrices cuadradas de dimensión n.

Diseñado por: Cristhian Tamami

Página 23


Lenguaje de Programación I Los elementos cij se obtienen multiplicando los elementos aik de la fila i por los elementos akj de la columna j, y sumando los resultados.

La codificación se realiza empleando un tripe bucle for, guardando en los elementos de la la matriz local resultado la suma de los productos de la fórmula anterior. public static Matriz producto(Matriz a, Matriz b){ Matriz resultado=new Matriz(a.n); for(int i=0; i<a.n; i++){ for(int j=0; j<a.n; j++){ for(int k=0; k<a.n; k++){ resultado.x[i][j]+=a.x[i][k]*b.x[k][j]; } } } return resultado; } Otras variantes de la operación producto son: El producto de un escalar (número real) por una matriz que da como resultado otra matriz cuyos elementos están todos multiplicados por dicho escalar. Se define también la operación conmutativa public static Matriz producto(double d, Matriz a){ Matriz resultado=new Matriz(a.n); for(int i=0; i<a.n; i++){ for(int j=0; j<a.n; j++){ resultado.x[i][j]=a.x[i][j]*d; } } return resultado; } Al multiplicar una matriz cuadrada de dimensión n, por un vector columna de la misma dimensión obtenemos otro vector columna. Cada elemento del vector resultante se obtiene multiplicando los elementos de una fila de la matriz por los correspondientes elementos del vector columna y se suman los resultados. La codificación de esta función producto es la siguiente: public static Vector producto(Matriz a, Vector v){ int n=v.n; Vector b=new Vector(n); for(int i=0; i<n; i++){ for(int k=0; k<n; k++){ Diseñado por: Cristhian Tamami

Página 24


Lenguaje de Programación I b.x[i]+=a.x[i][k]*v.x[k]; } } return b; } Al multiplicar un vector fila por una matriz cuadrada de la misma dimensión obtenemos otro vector fila. El código es semejante al de la función producto definida previamente. public static Vector producto(Vector v, Matriz a){ int n=v.n; Vector b=new Vector(n); for(int j=0; j<n; j++){ for(int k=0; k<n; k++){ b.x[j]+=v.x[k]*a.x[k][j]; } } return b; }

CADENA DE VOCALES ENUNCIADO 1.- Diseñe un programa que permita ingresar una cadena de caracteres desde teclado, visualizar las vocales.

ANÁLISIS 1.- Creamos nuestra primera función que seria borde en el cual contenga un for y un gotoxy para ubicar columna y fila. 2.-Después creamos la segunda función que es INGRESAR utilizamos un gets para ingresar la cadena. 3.- Después creamos la tercera función que es VOCALES MINUSCULAS MAYUSCULAS utilizamos un for y en un if varias condiciones que me vaya comparando cuales son vocales. 4.- Después creamos la cuarta función que es RESULTADO utilizamos un for que vaya hasta el limite del vector y me imprima la cadena. 15.- Por ultimo creamos el programa principal. 16.-Existe un lazo DO-WHILE que permite preguntar si desea continuar Si o NO. Diseñado por: Cristhian Tamami

Página 25


Lenguaje de Programación I DESARROLLO #include<stdio.h> #include<conio.h>

BIBLIOTECAS PRINCIPALES

#include<string.h> char vector[20],vector2[20];

DECLARACION DE VARIABLES

int i,fila=10,op,lim,h; void borde () { for (i=1;i<=80;i++) { gotoxy(i,1);printf("!"); gotoxy(i,24);printf("!"); }

FUNCIÓN BORDE

for (i=1;i<=24;i++) { gotoxy(1,i);printf("!"); gotoxy(80,i);printf("!"); } } void ingresar () { gotoxy(15,fila);printf("INGRESE CARACTERES: ");

FUNCIÓN BORDE

gets(vector); } Diseñado por: Cristhian Tamami

Página 26


Lenguaje de Programación I void minusc_mayusc () { fila=10,h=0;

FUNCIÓN MINUSCULAS MAYUSCULAS

for(i=0;i<lim;i++) { if ((vector[i]=='a')||(vector[i]=='A')||(vector[i]=='e')||(vector[i]=='E')||(vector[i]=='i')||( vector[i]=='I')||(vector[i]=='o')||(vector[i]=='O')||(vector[i]=='u')||(vector[i]=='U')) { vector2[h]=vector[i]; h=h+1; } } } void resultado () { fila=15; for(i=0;i<h;i++) { textcolor(i+3);

FUNCIÓN RESULTADO

gotoxy(30,fila);cprintf("%c",vector2[i]); fila=fila+1; } } void main () Diseñado por: Cristhian Tamami

Página 27


Lenguaje de Programación I { textcolor(WHITE); textbackground(BLUE);

PROGRAMA PRINCIPAL

do { clrscr(); flushall(); borde (); gotoxy(15,7);printf("VERIFICACION MAYUSCULAS Y MINUSCULAS"); ingresar(); lim=strlen(vector); minusc_mayusc(); resultado(); gotoxy(13,22);printf("PRESIONE 1 PARA CONTINUAR 0 PARA SALIR ");scanf("%d",&op); }while (op==1); getch(); }

CORRIDO

Diseñado por: Cristhian Tamami

Página 28


Lenguaje de Programación I

IMPRESIÓN DE CADENA ENUNCIADO 1.- Diseñe un programa que permita ingresar una cadena de caracteres desde teclado, visualizar la misma cadena.

ANÁLISIS 1.- Ingresamos una cadena de caracteres por teclado. 2.-En el programa principal creamos un borde para la pantalla con gotoxy columnas filas. 3.- Después con un for que vaya desde uno hasta el limite de la cadena visualizamos la misma cadena pero en forma vertical osea pasar los elementos a un vector. 4.-Existe un lazo DO-WHILE que permite preguntar si desea continuar Si o NO

DESARROLLO #include<stdio.h> #include<conio.h>

BIBLIOTECAS PRINCIPALES

#include<string.h> char vector[20];

DECLARACIÓN DE VARIABLES

Diseñado por: Cristhian Tamami

Página 29


Lenguaje de Programación I int limite,i,fila=10,op; void main () { do { clrscr(); flushall();

BORDE DE PANTALLA

for(i=1;i<=80;i++) { gotoxy(i,1);printf("*"); gotoxy(i,24);printf("*"); } for(i=1;i<=24;i++) { gotoxy(1,i);printf("*"); gotoxy(80,i);printf("*"); } gotoxy(15,5);printf("VERIFICACION DE CARARCTERES"); gotoxy(15,7);("INGRESO DE LA CADENA: ");gets(vector); limite=strlen(vector); for(i=0;i<limite;i++) { textcolor(i+15);

IMPRESIÓN DE LA CADENA

gotoxy(20,fila);cprintf("%c",vector[i]);

Diseñado por: Cristhian Tamami

Página 30


Lenguaje de Programación I fila=fila+1; } gotoxy(13,20);printf("PRESIONE [1:CONTINUAR] [0:SALIR]=> ");scanf("%d",&op); }while(op==1); getch(); }

CORRIDO

N° 2 VECTORES Y FUNCIONES    

Cadena Inversa Vocales y consonantes Numero de vocales y consonantes salir

ENUNCIADO 7.- Diseñe un programa utilizando vectores y funciones que me permita diseñar el siguiente menú de opciones. ANÁLISIS 1.- Creamos nuestra primera función que seria borde en el cual contenga un for y un gotoxy para ubicar columna y fila. Diseñado por: Cristhian Tamami

Página 31


Lenguaje de Programación I 2.-Después creamos la segunda función que es INGRESAR con un gets(vector1); limite=strlen(vector1). 3.- Después creamos la tercera función que es CADENA INVERSA utilizamos un for (i=limite;i>=0;i--) y se pasa al segundo vector2[h]=vector1[i] y se incrementara i++. 4.- Después creamos la cuarta función que es RESULTADO_INVERSA utilizamos un for (i=1;i<limite;i++) se imprime el vector2[i]. 5.- Después creamos la quinta función que es VOCALES_CONSONANTES utilizamos un for (i=1;i<limite;i++) en una condición hacemos las respectivas comparaciones y vamos pasando al otro vector2[i]=vector1[i] y se va incrementando h=h+1. 6.- Después creamos la sexta función que es RESULTADO_VOCAL CONSONANTE utilizamos un for (i=1;i<limite;i++) se imprime el vector2[i]. 7.- Después creamos la séptima función que es NUMEROS VOCALES_CONSONANTES utilizamos un for (i=1;i<limite;i++) en una condición hacemos las respectivas comparaciones y vamos pasando al otro vector2[i]=vector1[i] y se va incrementando h=h+1. 8.- Después creamos la octava función que es RESULTADO_NUMERO VOCAL CONSONANTE utilizamos un for (i=1;i<limite;i++) se imprime el vector2[i].

9.- Por ultimo creamos el programa principal donde contendrá mensajes de impresión

y case para poder escoger la opcion según lo que desee el usuario y en cada case se llama a las respectivas funciones. 10.-Existe un lazo DO-WHILE que permite preguntar si desea continuar Si o NO. DESARROLLO #include<conio.h> #include<stdio.h>

LIBRERÍAS PRINCIPALES

#include<stdlib.h> #include<string.h> char vector1[20],vector2[20];

Diseñado por: Cristhian Tamami

Página 32


Lenguaje de Programación I int i,op,op1,limite,fila=15,h,conv,conc,lim,con;

DECLARACIÓN DE VARIABLES

void borde() {for(i=1;i<=80;i++) {gotoxy(i,1);printf("@"); gotoxy(i,24);printf("@");}

FUNCIÓN BORDE

for(i=1;i<=24;i++) {gotoxy(1,i);printf("?"); gotoxy(80,i);printf("?");

}}

void ingresar() {gotoxy(14,7);printf("INGRESE LA CADENA==> ");gets(vector1);

FUNCIÓN INGRESAR

limite=strlen(vector1);} void cadena_inversa() { h=0; for(i=limite;i>=0;i--)

FUNCIÓN CADENA INVERSA

{vector2[h]=vector1[i]; h=h+1;}} void resultado_inversa() {fila=10; for(i=1;i<limite;i++)

RESULTADO CADENA INVERSA

{gotoxy(30,fila);printf("%c",vector2[i]); fila=fila+1;}} void encontrar() {

h=0,con=0; for(i=0; i<limite; i++)

Diseñado por: Cristhian Tamami

Página 33


Lenguaje de Programación I { if(vector1[i]!='a'&&vector1[i]!='A'&&vector1[i]!='e'&&vector1[i]!='E' FUNCIÓN VOCALES &&vector1[i]!='i'&&vector1[i]!='I'&&vector1[i]!='o'&&vector1[i]!='O' CONSONANTES &&vector1[i]!='u'&&vector1[i]!='U') {

vector2[h]=vector1[i]; h=h+1;

} if(vector1[i]==' ') { h=h-1; } } for(i=0; i<limite; i++) { if(vector1[i]=='a'||vector1[i]=='A'||vector1[i]=='e'||vector1[i]=='E'||vector1[i]=='i'||vecto r1[i]=='I'||vector1[i]=='o'||vector1[i]=='O'||vector1[i]=='u'||vector1[i]=='U') {

vector2[h]=vector1[i]; h=h+1;}

if(vector1[i]==' ') {h=h-1;}}} void visualizar() {

fila=10; for(i=0; i<limite; i++) {

RESULTADO VOCALES CONSONANTES

gotoxy(28,fila); printf("%c",vector2[i]); fila=fila+1;}}

Diseñado por: Cristhian Tamami

Página 34


Lenguaje de Programación I void numero_consonante() {

h=0; conc=0; FUNCIÓN CONTAR CONSONANTES

for(i=0; i<limite; i++) {if(vector1[i]!='a'&&vector1[i]!='A'&&vector1[i]!='e' &&vector1[i]!='E'&&vector1[i]!='i'&&vector1[i]!='I' &&vector1[i]!='o'&&vector1[i]!='O'&&vector1[i]!='u' &&vector1[i]!='U') { conc=conc+1; } if(vector1[i]==' ') { conc=conc-1; }

gotoxy(20,14);printf("Consonantes==> %d",conc); }} void numero_vocal() { for (i=0;i<limite;i++) { if (vector1[i]=='a'||vector1[i]=='A') { cona=cona+1; Diseñado por: Cristhian Tamami

FUNCIÓN CONTAR VOCALES Página 35


Lenguaje de ProgramaciĂłn I } else if (vector1[i]=='e'||vector1[i]=='E') { cone=cone+1; } else if (vector1[i]=='i'||vector1[i]=='I') { coni=coni+1; } else if(vector1[i]=='o'||vector1[i]=='O') { cono=cono+1; } else if(vector1[i]=='u'||vector1[i]=='U') { conu=conu+1; } gotoxy(40,14);printf("vocal a ==> %d",cona); gotoxy(40,15);printf("vocal e ==> %d",cone); gotoxy(40,16);printf("vocal i ==> %d",coni); DiseĂąado por: Cristhian Tamami

PĂĄgina 36


Lenguaje de Programación I gotoxy(40,17);printf("vocal o ==> %d",cono); gotoxy(40,18);printf("vocal u ==> %d",conu); }} void main() { do { clrscr(); textcolor(GREEN); textbackground(LIGHTGRAY); for(i=1;i<=80;i++) {gotoxy(i,1);printf("*"); gotoxy(i,24);printf("*");} for(i=1;i<=24;i++) {gotoxy(1,i);printf("/"); gotoxy(80,i);printf("/");} gotoxy(20,5);printf (" ^^^^^ PRIMER PROGRAMA ^^^^^"

);

gotoxy(20,7);printf (" 1.- CADENA INVERSA "); gotoxy(20,9);printf (" 2.- VOCALES Y CONSONANTES"

);

gotoxy(20,11);printf(" 3.- NUMEROS DE VOCALES Y CONSONATES INVERTIDAS"); gotoxy(20,13);printf(" 4.- SALIR"

);

gotoxy(20,17);printf(" ESCOJA UNA OPCION ==> ");scanf("%d",&op); switch(op) { case 1: clrscr(); borde(); Diseñado por: Cristhian Tamami

Página 37


Lenguaje de Programación I gotoxy(20,5);printf(" CADENA INVERSA ");

CASE 1

flushall(); ingresar(); cadena_inversa(); resultado_inversa(); break; case 2: clrscr(); borde(); gotoxy(20,5);printf("VOCALES Y CONSONANTES"); flushall();

CASE 2

ingresar(); encontrar(); visualizar(); break; case 3: clrscr(); borde(); gotoxy(20,5);printf("NUMEROS DE VOCALES Y CONSONANTES");

CASE 3

flushall(); ingresar(); numero_vc(); visualizar_vc(); break; Diseñado por: Cristhian Tamami

Página 38


Lenguaje de Programación I case 4: exit(1); break; }gotoxy(12,22);printf("Presione 1 para continuar o 0 para salir: ");scanf("%d",&op1); }while(op1==1); getch();}

CORRIDO

Diseñado por: Cristhian Tamami

Página 39


Lenguaje de Programación I

Diseñado por: Cristhian Tamami

Página 40


Producto 1