Fundamentos de la programacion u2
Upcoming SlideShare
Loading in...5
×
 

Fundamentos de la programacion u2

on

  • 442 views

Esta es la entrega que ofrece una amplia enseñanza ...

Esta es la entrega que ofrece una amplia enseñanza
acerca de la resolución de problemas computacionales
en lenguaje C++.Net.

Este libro muestra ejercicios diseñados didácticamente
para la fácil asimilación del estudiante.

Además se incluye ejercicios de maratón, exámenes y
ejercicios para aplicaciones actuales.

Con este libro Usted podrá culminar su carrera
de ciencias informáticas sin morir en el intento.

Statistics

Views

Total Views
442
Views on SlideShare
442
Embed Views
0

Actions

Likes
0
Downloads
22
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Fundamentos de la programacion u2 Fundamentos de la programacion u2 Document Transcript

  • Capítulo 6Funciones Predefinidas deC++6.1 Concepto de Función6.2 Funciones Aritméticas6.3 Funciones trigonométricas6.4 Funciones de caracteres6.5 Funciones de Cadena6.6 Generador de números aleatorios6.7 De Control de pantalla
  • 6 Funciones Predefinidas de C++IntroducciónLos desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menosposible reutilizando bloques de código, dividiendo mentalmente las partes del programa (entrada -proceso – salida) como divisiones principales.Además hay procesos cotidianos en los programas que a menudo no vale la pena escribirlosreiteradamente, En eso C++ nos facilita la labor pues cuenta con funciones predefinidas de diferentestipos y para cada tipo de situaciones. No obstante antes de mostrar las funciones predefinidasmostraremos el concepto de función para ingresar con más visión a las funciones.6.1 Concepto de FunciónUna función es un conjunto de instrucciones con una tarea determinada, una función es utilizada paradividir un programa en subprogramas con tareas propias de la función. Una función siempre devuelvevalor.Para ver definición de funciones Véase capítulo 7.6.2 Funciones Aritméticas Valor Tipo Dato Tipo Dato LibreríaFunción Descripción Ejemplo devuelto Argumento devuelto (**) ejemplo double double sqrt(4.0) 2.0sqrt Raíz cuadrada float float sqrt(4.0) 2.0 math.h long long sqrt(4) 2 pow(2.0, double 8.0 double 3.0) 8.0 pow(2.0, 3)pow pow(2.0, Potencias float float 8.0 math.h(*) 3.0) 8.0 pow(2.0, 3) long long pow(20.0, 3) 8000.0 double double
  • abs(-7.0) 7 double double abs(7.0) 7 abs(-7.0) 7 math.h float float abs(7.0) 7 abs(-7) 7 int intabs Valor Absoluto abs(7) 7 abs(-70000) 70000 long long abs(70000) 70000 long long abs(- stdlib.h 70000.0 double double 70000.0) 70000.0 abs(70000.0) ceil(3.2) 4.0 double double ceil(3.9) 4.0 ceil(3.2) 4.0 float float Techo(redondeo ceil(3.9) 4.0ceil math.h arriba) ceil(30000.2 long long ) 30001.0 double double ceil(30000.9 30001.0 ) floor(3.2) 3.0 double double floor (3.9) 3.0 floor (3.2) 3.0 float float floor (3.9) 3.0floor Piso(redondeo abajo) math.h floor long long (30000.2) 30000.0 double double floor 30000.0 (30000.9) double double exp(1.0) 2.7 float float exp(1.0) 2.7exp Exponencial math.h long long exp(10.0) 22026.5 double double double double log(5.0) 1.6 float float log(5.0) 1.6log Logaritmo natural(ln) math.h long long log(1000.0) 6.9 double double double double log10(10.0) 1.0 Logaritmo base 10 float float log10(10.0) 1.0log10 math.h (ln) long long log10(1000.0 3.0 double double )(*) Para la función pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de lafunción o mostrar por pantalla con el formato, por ejemplo:Guardando el valor en variable:double base=2.0, exponente=3.0, resultado;
  • resultado=pow(base, exponente);printf("nnResultado: %8.1lf ", resultado);o mostrar directamente por pantalla:double base=2.0, exponente=3.0;printf("nnResultado: %8.1lf ", pow(base, exponente));6.3 Funciones trigonométricas Valor Tipo Dato Tipo Dato LibreríaFunción Descripción Ejemplo(*) devuelto Argumento devuelto (**) ejemplo double double cos(0.0) 1.0cos Coseno float float cos(0.0) 1.0 math.h long double long cos(1000.0) 0.6 double double acos(1.0) 0.0acos Arco Coseno float float acos(1.0) 0.0 math.h long double long double acos(0.5) 1.0 double double sin(0.5) 0.5 math.hsin Seno float float sin(0.5) 0.5 long double long double sin(10.0) -0.5 double double asin(0.8) 0.9asin Arco Seno float float asin(0.8) 0.9 math.h long double long double asin(1.0) 1.6 double double tan(1.0) 1.6tan Tangente float float tan(1.0) 1.6 math.h long double long double tan(100.0) -0.6 double double atan(0.8) 0.7 Arcoatan float float atan(0.8) 0.7 math.h Tangente long double long double atan(100.0) 1.6 double double cosh(1.0) 1.5 Cosenocosh float float cosh(1.0) 1.5 math.h Hiperbólico long double long double cosh(10.0) 11013.2 double double tanh(1.0) 0.8 Tangentetanh float float tanh(1.0) 0.8 math.h Hiperbólico long double long double tanh(0.5) 0.5
  • (*) Notar que en los ejemplos se asignan como parámetros constantes de tipo real, pues todos aceptanreales ya sea double, float o long double, no obstante también es posible asignar variables conel tipo solicitado en la función.6.4 Funciones de caracteresMuchas de las funciones predefinidas toman como base la tabla de códigos ascii.Para hacer comparaciones, conversiones y búsquedas generalmente es trabajado mediante el númerode código de cada carácter. A continuación mostramos la tabla de código ascii con los caracteresimprimibles.Tabla de códigos ascii Imprimibles Código Carácter Código Carácter Código Carácter Código Carácter (*)32 56 8 80 P 104 h 33 ! 57 9 81 Q 105 i 34 " 58 : 82 R 106 j 35 # 59 ; 83 S 107 k 36 $ 60 < 84 T 108 l 37 % 61 = 85 U 109 m 38 & 62 > 86 V 110 n 39 63 ? 87 W 111 o 40 ( 64 @ 88 X 112 p 41 ) 65 A 89 Y 113 q 42 * 66 B 90 Z 114 r 43 + 67 C 91 [ 115 s 44 , 68 D 92 116 t 45 - 69 E 93 ] 117 u 46 . 70 F 94 ^ 118 v 47 / 71 G (*)95 _ 119 w 48 0 72 H 96 ` 120 x 49 1 73 I 97 a 121 y 50 2 74 J 98 b 122 z 51 3 75 K 99 c 123 { 52 4 76 L 100 d 124 | 53 5 77 M 101 e 125 } 54 6 78 N 102 f 126 ~ 55 7 79 O 103 g
  • La tabla muestra los caracteres imprimibles por pantalla incluyendo el carácter con código número 32que representa el espacio en blanco y el carácter número 95 es la línea inferior.Funciones de caracteres Valor Tipo Tipo Dato devuelt LibreríaFunción Descripción Dato Ejemplo(*) Argumento o (**) devuelto ejemplo Devuelve true si su isalnum(B) argumento satisface true isalnum(1)isalnum isalpha o isdigit. char bool true ctype.h isalnum(+) Caso contrario devuelve false false. Devuelve true si su argumento es letra isalpha(B) true (Mayúscula o isalpha(1)isalpha char bool false ctype.h Minúscula). Caso isalpha(+) false contrario devuelve false. Devuelve true si su isdigit(B) false argumento es un digito. isdigit(1)isdigit char bool true ctype.h Caso contrario devuelve isdigit(+) false false. Devuelve true si su argumento es un carácter imprimible que ispunct(B) no satisface isalnum y false ispunct(1)ispunct no es espacio en blanco char bool false ctype.h ispunct(+) (Caracteres de true puntuación). Caso contrario devuelve false. Devuelve true si su isspace( argumento es un ) true carácter de espacio en isspace( ) trueisspace char bool ctype.h blanco (Tabular, Enter). isspace(n true Caso contrario devuelve ) false. Devuelve true si su iscntrl argumento es un (iscntrl carácter de control. Caso char bool char(127) true ctype.h(*) contrario devuelve ) false. Devuelve true si su islower(a) trueislower char bool ctype.h argumento es letra islower(A) false
  • Minúscula. Caso islower(+) false contrario devuelve false. isupper Devuelve true si su (a) argumento es letra isupper falseisupper Mayúscula. Caso char bool (A) true ctype.h contrario devuelve isupper false false. (+) Devuelve la versión en tolower(A) minúscula de su a tolower(a)tolower argumento. Si no tiene char char a ctype.h tolower(+) minúscula devuelve el + mismo argumento Devuelve la versión en toupper(A) mayúscula de su A toupper(a)toupper argumento. Si no tiene char char A ctype.h toupper(+) mayúscula devuelve el + mismo argumento(*) Hay una forma de averiguar cuáles son caracteres de control y esto es con las siguientesinstrucciones:for(int i=1;i<=127;i++)if(iscntrl(char(i))) printf("n%d = %c", i, char(i));El resultado nos mostrara todos los caracteres en el cual su código ascii esta entre (1-31) y el 127. Soncaracteres no imprimibles por ejemplo el número 10 que representa la tecla <Enter>6.5 Funciones de Cadena Valor Librería Prototipo Descripción Ejemplo devuelto (**) ejemploint atoi Convierte <cadena> char cad[2]={1,0};(char* <cadena>) 10 stdlib.h hacia un int atoi(cad);
  • long atol Convierte <cadena> char cad[2]={0,5};(char* <cadena>) 5 stdlib.h hacia un long atol(cad);double atof char Convierte <cadena>(char* <cadena>) cad[3]={0,.,5}; 0.5 math.h hacia un double atof(cad)char* strcat( Anexa o junta char cad1[10]={A,B};char* <cad_origen > al char cad2[2]={C};<cad_destino>, ABC string.h final de strcat(cad1, cad2);char* <cad_origen> <cad_destino> printf("n%s", cad1);) Devuelve 0, si las char cad1[1]={A}; cadenas sonint strcmp( char cad2[1]={A}; iguales, 1 sichar* <cadena1>, printf("n%d", 0 string.h <cadena1> es mayorchar* <cadena2>) strcmp(cad1, cad2)); a <cadena2> y -1 si es menor (*)char* strcpy( Cambia el valor de char cad[10];char* <Expresioncad> strcpy(cad, "ABC");<cad_destino>, ABC string.h hacia printf("n%s", cad);char* <cad_destino><Expresioncad>)int strlen char cad[10]={A,B}; Devuelve la longitud(char* <cadena>) printf("n%d", ABC string.h de <cadena> strlen(cad));char* strncat(char* Anexa o junta <n> char cad1[10]={A,B};<cad_destino>, caracteres de char cad2[2]={C,D};char* <cad_origen > al ABC string.h strncat(cad1,cad2,1);<cad_origen>, final de printf("n%s", cad1);int <n>) <cad_destino>int strncmp( Compara <n> char cad1[10]={A,B};char* <cadena1>, caracteres de char cad2[2]={A,C};char* <cadena2>, 0 string.h <cadena1> con printf("n%d",int <n>) <cadena2> strncmp(cad1, cad2, 1)); char Devuelve un puntero cad1[10]={A,B,C}; a la primera char cad2[10]={B};char* strstr( ocurrencia de la char cad3[10];char* <cadena>, cadena <Patrón> BC string.h strcpy(cad3, strstr(cad1,char* <Patrón>) en <cadena> y cad2)); NULL si no lo printf("n%s", cad3); encuentra Devuelve un puntero char cad1[10]={A,B,char* strchr( a la primera A,B};char* <cadena>, BAB string.h ocurrencia de la char car=B;char <caracter>) cadena < char cad3[10];
  • caracter> en strcpy(cad3, strchr(cad1, <cadena> y NULL car)); si no lo printf("n%s", cad3); encuentra Devuelve un puntero char cad1[10]={A,B, a la última A,B}; char car=B; ocurrencia de la char cad3[10];char* strrchr( cadena < strcpy(char* <cadena>, B string.h caracter> en cad3, strrchr(cad1, car)char <caracter>) <cadena> y NULL ); si no lo printf("n%s", cad3); encuentra(*) Devuelve 0, si son iguales en longitud y caracteres, 1 si <cadena1> es mayor a <cadena2> y -1 sies menor.Ejemplos:char cad1[10]={B, B};char cad2[2]={A};printf("nResultado: %d", strcmp(cad1, cad2));/*Retorna 1, por que el caracter mas alto de cad1 es B y el caractermas alto de cad2 es A es decir B>A en la tabla de los codigos ascii*/char cad1[10]={B, B};char cad2[2]={C};printf("nResultado: %d", strcmp(cad1, cad2));/*Retorna -1, por que el caracter mas alto de cad1 es B y el caractermas alto de cad2 es C es decir B<C en la tabla de los codigos ascii*/(**) Las librerías mostradas en las tablas son automáticamente referenciadas en Visual Studio .Net porla ya conocida referencia:
  • #include <iostream>using namespace std;6.6 Generador de números aleatoriosA menudo en los problemas computacionales es necesario generar números al azar o aleatorios. Acontinuación mostramos la forma de generar números aleatorios en C++.#include <iostream>using namespace std;#include "stdlib.h"#include "time.h"void main(){int tiempo, desde, hasta, Numero;tiempo=time(NULL);srand(tiempo);desde=50; hasta=150;Numero=desde + rand() % (1 + hasta - desde);printf("%dn", Numero);system("PAUSE");}Observamos del ejemplo anterior las nuevas directivas a utilizar:#include "stdlib.h"#include "time.h"Generamos la semilla de números aleatorios:
  • tiempo=time(NULL);srand(tiempo);Establecemos los límites de generación de números (50-150):desde=50; hasta=150;Generamos el número aleatorio y lo guardamos en la variable Número:Numero=desde + rand() % (1 + hasta - desde);En general la fórmula para generar números aleatorios entre a y b:a + rand() % (1 + b - a)
  • Capítulo 7Programación Modular7.1 Diseño descendente7.2 Subprogramas7.3 Variables globales y locales7.4 Funciones 7.4.1 Definición de funciones 7.4.2 Invocación a las funciones7.5 Procedimientos 7.5.1 Definición de Procedimientos 7.5.2 Invocación a las Procedimientos7.6 Tipos de Parámetros
  • 7 Programación ModularIntroducciónLos desarrolladores en C++, hacen sus programas teniendo siempre en mente el conocido dicho“Divide y vencerás”, el cual nos va a evitar serios dolores de cabeza a la hora de realizar aplicacionesgrandes y complejas. En C++ es esencial el trabajo modular ya sea por objetivos, abstracción o porreutilización.Un módulo representa un bloque abstracto de código, esto es el programa principal o subprogramasen una solución a un problema computacional.7.1 Diseño descendenteLas aplicaciones en C++ y varios lenguajes de programación tienen como característica el diseñodescendente en la escritura de código, es decir “de arriba hacia abajo” esto significa que en una hojade código el compilador va a hacer un barrido desde la primera hasta la última línea en la hoja decódigo. Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx Línea 4 xxxxxxxx Línea 5 xxxxxxxx …………………... …………………… Línea n-1 ...…….. Línea n...………..7.2 SubprogramasSon subdivisiones que bifurcan o alteran el flujo del código en un programa. Hacia la zona delsubprograma, esto puede ser en la hoja de código o en ocasiones a otros archivos.A continuación mostramos un esquema de un programa hecho de forma modular:
  • PROGRAMA PRINCIPAL SUBPROGRAMA (X) Línea 1 xxxxxxxx Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 2 xxxxxxxx LLAMA SUBPROGRAMA X …………………… Línea 4 xxxxxxxx Línea n-1 ...…….. Línea 5 xxxxxxxx Línea n...……….. Línea 6 xxxxxxxx LLAMA SUBPROGRAMA X Línea 8 xxxxxxxx Línea 9 xxxxxxxx Línea 10 xxxxxxxx LLAMA SUBPROGRAMA Y Línea 11 xxxxxxxx El esquema representa el Línea 12 xxxxxxxx flujo de un programa con …………………... dos subprogramas. …………………… Línea n-1 ...…….. Línea n...……….. SUBPROGRAMA (Y) Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx …………………… Línea n...………..Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja decódigo o en otro archivo.El compilador comienza con la línea 1, línea 2 y llega a la línea en la cual se llama al subprograma X,entonces el flujo brinca al subprograma X entonces comienza a ejecutarse la línea 1, 2, …n delsubprograma. Al terminar de ejecutarse el subprograma el flujo retorna al programa principal.Entonces continúa el programa principal con la línea 4, 5, 6 entonces vuelve a llamar al subprograma Xy vuelve a ejecutar y terminar sus instrucciones para retornar nuevamente al programa principal.Se ejecuta las líneas 8,9,10 y llega a la invocación del subprograma Y, entonces similar a lo que hizoel compilador con el subprograma X hace con Y, ejecuta las líneas del subprograma Y, al finalizarretorna al programa principal hasta terminar de ejecutar lo restante.
  • 7.3 Variables globales y localesUna variable es global o local en función de la zona dentro de la hoja de código en donde esdeclarada. Esto puede ser por el alcance del valor de la variable con la cual se necesita trabajar.Variable globalEs una variable que es declarada fuera de todo modulo, su valor almacenado es mantenido hasta quese termine el programa.#include <iostream>using namespace std;int nro; //Variable global nrovoid main(){Variable localEs una variable que es declarada dentro de un módulo, su valor almacenado es mantenido hasta quetermine el modulo.#include <iostream>using namespace std;void main(){int nro; //Variable Local del programa principal
  • 7.4 FuncionesUna función es un módulo de instrucciones con una tarea específica que retorna siempre resultado(s).Este resultado es del tipo de datos con el cual fue definido.Una función es código en espera hasta que la función sea invocada desde el programa principal, elvalor devuelto por la función puede ser almacenado o mostrado directamente por pantalla.7.4.1 Definición de funcionesPara utilizar una función antes previamente debe ser definida. A continuación mostramos la definiciónde una función:<Tipo de dato> <Nombre Función> (<Lista de argumentos>){ <Conjunto de instrucciones>return <valor/variable>;}Dónde:<Tipo de dato>:Tipo de datos valido C++ (int, double, bool, etc.) Véase apartado 3.1.1<Nombre Función> :Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)<Lista de argumentos>:Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,…)<valor/variable>:
  • Valor o variable que la función devolverá como resultado, cabe decir que este resultado debe ser deltipo de dato declarado por la función.Ejemplo:La siguiente función es de tipo entera y retorna la suma de dos números enteros.int f_sumar(int A, int B){int devolver;devolver = A + B;return devolver;}7.4.2 Invocación a las funcionesLa función f_sumar es un código en espera sino hasta que es invocado desde el modulo void main.Para invocar a una función se nombra la función y se pasan valores como se muestra a continuación:void main(){int A, resultado;A=10;resultado=f_sumar(A, 5);//Invocacion a funcionprintf("%dn", resultado);//Muestra 15system("PAUSE");}Una función no es necesariamente invocado de la función principal void main también es posible quesea invocado desde cualquier función valida de C++, y todas ellas estarán en espera hasta que seaninvocados desde el modulo void main. A continuación mostraremos como se invoca una funcióndentro de otra:
  • int f_sumar(int A, int B){int devolver;devolver = A + B;return devolver;}int f_doble(int A){int devolver;devolver = f_sumar(A, A);//Invocacion a funcion f_sumarreturn devolver;}El programa completo es:#include <iostream>using namespace std;//Definicion de la funcion f_sumarint f_sumar(int A, int B){int devolver;devolver = A + B;return devolver;}//Definición de la funcion f_dobleint f_doble(int A){int devolver;devolver = f_sumar(A, A);//Invocacion a función f_sumarreturn devolver;}//Programa Principalvoid main(){int A, resultado;A=10;resultado=f_doble(A);//Invocacion a función f_dobleprintf("%dn", resultado);//Muestra 20system("PAUSE");}
  • 7.5 ProcedimientosUn procedimiento es un tipo de función con la única restricción que NO retorna resultado(s). Por tantotodas las reglas que se describieron para las funciones son también aplicables a los procedimientos.En C++ los procedimientos también son conocidos como funciones void. Se concibe a unprocedimiento como bloque de código que es anexado al módulo que lo invoca.7.5.1 Definición de ProcedimientosPara utilizar un procedimiento antes previamente debe ser definida. A continuación mostramos ladefinición de un procedimiento:void <Nombre Procedimiento > (<Lista de argumentos>){ <Conjunto de instrucciones>}Dónde:<Nombre Procedimiento > :Identificador valido C++(Aplica las reglas a nombrar variables Véase apartado 3.1.3)<Lista de argumentos>:Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,…)Ejemplo:El siguiente procedimiento muestra por pantalla un entero.
  • void f_mostrar(int A){printf("%dn", A);system("PAUSE");}7.4.2 Invocación a los ProcedimientosEl procedimiento f_mostrar es un código en espera sino hasta que es invocado desde el modulovoid main.void main(){int A, resultado;A=10;f_mostrar(A); //Invocacion a Procedimiento f_mostrar}El programa completo es:#include <iostream>using namespace std;//Definición de Procedimiento f_mostrarvoid f_mostrar(int A){printf("%dn", A);system("PAUSE");}//Procedimiento Principalvoid main(){int A, resultado;A=10;f_mostrar(A);//Invocacion a Procedimiento f_mostrar}
  • Como podemos apreciar la función principal void main es un procedimiento o una función void.Tener en cuenta que las variables que se declaran y los argumentos solo cuentan dentro del módulodonde fueron declaradas, por lo tanto el argumento (int A) del procedimiento f_mostrar y lavariable int A de void main son distintas.7.6 Tipos de ParámetrosEn C++ los parámetros o argumentos de una función pueden ser de dos tipos: Por valor o porreferencia.Parámetro Por ValorSon aquellos parámetros en los cuales el valor o contenido de los parámetros es copiado, y dentro dela función se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada encontenido.void f_incrementar(int A){//Argumento A es por valorA++;printf("%dn", A);}void main(){int A;A=10;f_incrementar(A);//Muestra 11printf("%dn", A);//Muestra 10system("PAUSE");}Parámetro Por ReferenciaSon aquellos parámetros en los cuales la dirección de memoria es pasada hacia la función, esto indicaque dentro de la función se trabaja realmente con la variable que es pasada como argumento, portanto dicha variable puede ser modificada.
  • Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variableel símbolo de ampersand &.void f_incrementar(int &A){ //Argumento A es por referenciaA++;printf("%dn", A);}void main(){int A;A=10;f_incrementar(A);//Muestra 11printf("%dn", A);//Muestra 11system("PAUSE");}Se recomienda usar parámetros por referencia en lo mínimo. Es posible también modificar variables enfunciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremosque estamos modificando.
  • Capítulo 8Arreglos 8.1 Arreglos Unidimensionales 8.1.1 Representación Grafica 8.1.2 Asignación de Valores 8.1.3 Lectura y escritura de datos 8.1.4 Recorrido, inserción y eliminación en un vector 8.2 Arreglos Bidimensionales 8.1.1 Representación Grafica 8.2.2 Asignación de Valores 8.2.3 Lectura y escritura de datos 8.2.4 Recorrido, inserción y eliminación en una matriz 8.3 Ordenamientos 8.3.1 método de intercambio o burbuja 8.3.2 método por inserción, 8.3.3 método por selección 8.3.4 método de ordenación rápida (quicksort). 8.4 Búsquedas 8.4.1 Tipos de búsqueda 8.4.2 Método Búsqueda Binaria
  • 8 ArreglosIntroducciónLos arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo accesoindividual es numérico, este acceso individual es denominado índice. Un arreglo puede contener porejemplo listas de calificaciones de exámenes, de temperaturas o de nombres.Cabe decir que la cantidad de elementos de los arreglos es de tipo estática es decir que al declarar lalongitud del vector esta va a mantener su longitud hasta el final del programa.8.1 Arreglos Unidimensionales8.1.1 Representación GraficaA continuación mostramos un vector de tipo entero de 10 elementos:int A[10] 0 1 2 3 4 5 6 7 8 9 7 5 6 3 0 8 2 1 15 9A[0]=7 A[3]=3 A[8]=158.1.2 Asignación de ValoresAsignar a un elemento del vector es mediante la variable seguida del índice entre corchetes así comosigue a continuación:<Variable_vector>[<indice>] = <variable / valor>;
  • Ejemplos:A[0] = 7; A[3] = 3; A[8] = 15;A[5] = A[1]; A[6] = A[6] * 2; A[7] = A[0] / A[1];A[9] = desde + rand() % (1 + hasta - desde);8.1.3 Lectura y escritura de datosLeer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante lavariable seguida del índice entre corchetes así como sigue a continuación:Lecturascanf(<formato>, &<Variable_vector>[<indice>] );Ejemplosscanf("%d", &A[ 5 ]);scanf("%d", &A[ 0 ]);scanf("%d", &A[ p ]);Escrituraprintf(<formato>, <lista de elementos de vector>);Ejemplosprintf("%d", A[ 5 ]);
  • printf("%lf", B[ 0 ]);printf("%d y %8.2lf", A[ p ], B[ p ]);8.1.4 Recorrido, inserción, eliminación y ejemplos en un vectorRecorridoPara recorrer un vector ya sea para asignación, lectura o escritura utilizamos la sentencia forya que conocemos el inicio y el final del recorrido, así como se muestra a continuación:Ejemplo 1 Asignación del índice a cada elemento de un vector de 10 elementos:Longitud=10;for(i=0 ; i< Longitud ; i++){ A[i]=i;}Ejemplo 2 Ingreso por teclado a cada elemento de un vector de 10 elementos:Longitud=10;for(i=0 ; i< Longitud ; i++){ scanf("%d", &A[i]);}Ejemplo 3 Impresión por teclado a cada elemento en una línea para un vector de 10 elementos:Longitud=10;for(i=0 ; i< Longitud ; i++){ printf("%dn", A[i]);}
  • InserciónSabemos que la longitud del vector es de tipo estática por tanto la inserción es simulada, es decir noaumenta la longitud declarada al inicio.Para tal caso debemos declarar la longitud del vector con un valor máximo tope, que contemple lalongitud actual más las inserciones.Debemos tener la longitud virtual del vector en una variableA continuación mostramos el algoritmo de inserción si suponemos que:int A[6], N=4; 0 1 2 3 4 5 2 3 1 4Algoritmo de inserción:for(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i];A[posicion-1] = nro_insertar;N++;Dónde:<A>: Vector de elementos< posicion >: Posición a insertar< nro_insertar >: Valor a insertar< N >: Longitud del vector
  • Explicación del algoritmofor(i = N-1 ; i>=posicion-1 ; i--) A[i+1] = A[i];< for(i = N-1 ; i>=posicion-1 ; i--) > significa que la variable < i > comienza de la longituddel vector < N-1 >, y termina en la posición a insertar < i>=posicion-1 >. < A[i+1] = A[i] >significa el elemento siguiente es igual al anterior.Si < posicion > a insertar es 2 entonces:Procedemos a desplazar los elementos desde el final hasta la posición: A[i+1] = A[i] A[4] = A[3] A[3] = A[2] A[2] = A[1]Resultado: 0 1 2 3 4 5 2 3 3 1 4A[posicion-1] = nro_insertar;Si < nro_insertar > es 10 entonces:A[2-1] = 10; 0 1 2 3 4 5 2 10 3 1 4
  • N++;Como N tenía el valor de 4 y se incrementa en uno entonces:N=5EliminaciónSabemos que la longitud del vector es de tipo estática por tanto la eliminación es simulada, es decir nodecrementa la longitud declarada al inicio.Debemos tener la longitud virtual del vector en una variable.A continuación mostramos el algoritmo de eliminación si suponemos que:int A[6], N=5; 0 1 2 3 4 5 2 3 1 4 5Algoritmo de eliminación:for(i= posicion; i<N ; i++) A[i-1]=A[i];N--;Dónde:
  • <A>: Vector de elementos< posicion >: Posición a eliminar< N >: Longitud del vectorExplicación del algoritmofor(i= posicion; i<N ; i++) A[i-1]=A[i];< for(i= posicion; i<N ; i++) > significa que la variable < i > comienza de la posición aeliminar < i= posicion > hasta la longitud del vector < i<N >. < A[i-1] = A[i] > significa elelemento anterior es igual al siguiente.Si < posicion > a eliminar es 2 entonces:Procedemos a desplazar los elementos desde la posición hasta el final: A[i-1] = A[i] A[1] = A[2] A[2] = A[3] A[3] = A[4]Resultado: 0 1 2 3 4 5 2 1 4 5 5N--;Como N tenía el valor de 5 y se decrementa en uno entonces:
  • N=48.2.1 Representación GraficaA continuación mostramos una matriz de tipo entero de 5x5 (filas x columnas) elementos:int A[5][5]A[0][0]=2 A[0][3]=6 0 1 2 3 4 A[1] [1]=6 0 2 3 5 6 7 1 5 6 0 8 6 A[2] [3]=9 2 2 6 3 9 5 3 1 2 7 2 8 A[3] [1]=2 4 7 8 9 3 4A[4] [0]=7 A[3][3]=28.2.2 Asignación de ValoresAsignar a un elemento de la matriz es mediante la variable seguida de los índices entre corchetes asícomo sigue a continuación:<Variable_matriz>[<índice_fila>][<índice_columna>] = <variable / valor>;Ejemplos:
  • A[0][0] = 7; A[3][1] = 3; A[8][8] = 15;A[5][0] = A[1][3]; A[6][2] = A[6][2] * 2; A[7][5] = A[0][3] / A[1][9];A[9][1] = desde + rand() % (1 + hasta - desde);8.1.3 Lectura y escritura de datosLeer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediantela variable seguida de los índices entre corchetes así como sigue a continuación:Lecturascanf(<formato>, &<Variable_matriz>[<índice_fila>][<índice_columna>]);Ejemplosscanf("%d", &A[ 5 ][ 5 ]);scanf("%d", &A[ 0 ][ 1 ]);scanf("%d", &A[ f ][ c ]);Escrituraprintf(<formato>, <lista de elementos de la matriz>);Ejemplosprintf("%d", A[ 5 ][ 4 ]);printf("%lf", B[ 0 ][ 0 ]);printf("%d y %8.2lf", A[ f ][ 1 ], B[ f ][ c ]);
  • 8.2.4 Recorridos y ejemplos de matrices.Para recorrer una matriz ya sea para asignación, lectura o escritura utilizamos 2 sentencias forUno para controlar las filas y otro para las columnas, así como se muestra a continuación:Ejemplo 1 Asignación de la suma de los índices a cada elemento de una matriz de 5x4 elementos:TotalFilas=5;TotalColumnas=4;for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) A[fila][columna]= fila + columna;Ejemplo 2 Recorrer y sumar cada elemento en forma horizontal para una matriz de 2x3 elementos:TotalFilas=2;TotalColumnas=3;S=0;for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) S+=A[fila][columna];Recorrido: fila columna 0 0 0 1 0 2 1 0 1 1 1 2
  • Ejemplo 3 Recorrer y sumar cada elemento en forma vertical para una matriz de 2x3 elementos:TotalFilas=2;TotalColumnas=3;S=0;for(columna=0 ; columna < TotalColumnas; columna++) for(fila=0 ; fila < TotalFilas ; fila++) S+=A[fila][columna];Recorrido: columna fila 0 0 0 1 1 0 1 1 2 0 2 1Ejemplo 4 Cargar elementos a una matriz de 5x6 elementos:TotalFilas=5;TotalColumnas=6;for(fila=0 ; fila < TotalFilas ; fila++) for(columna=0 ; columna < TotalColumnas; columna++) scanf("%d", A[fila][columna]);Las instrucciones anteriores son correctas sin embargo tendremos que ingresar por teclado 5x6 veceses decir 30.Para tal caso podemos utilizar los números aleatorios:
  • tiempo=time(NULL);srand(tiempo);TotalFilas=5; TotalColumnas=6;desde=1; hasta=10;for(fila=0 ; fila< TotalFilas ; fila++) for(columna=0 ; columna< TotalColumnas ; columna++) A[fila][columna] = desde + rand() % (1 + hasta - desde);Ejemplo 5 Generar y mostrar por pantalla una matriz de 5x6 elementos:tiempo=time(NULL);srand(tiempo);TotalFilas=5; TotalColumnas=6;desde=1; hasta=5;for(fila=0 ; fila< TotalFilas ; fila++){ printf("nnt"); for(columna=0 ; columna< TotalColumnas ; columna++){ A[fila][columna] = desde + rand() % (1 + hasta - desde); printf("t%d", A[fila][columna]); }}Ejemplo 6 Definir e ingresar el orden NxM a una matriz://Definitionconst int OrdenMax = 10;int A[OrdenMax][OrdenMax], N, M;//Ingresoprintf("nrIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin);printf("nrIngrese # de columnas de la matriz: "); scanf("%d", &M);fflush(stdin);Ejemplo 7 Se tiene una matriz de orden N*M de tipo entero, se pidegenerar y mostrar números aleatorios entre 1 y 16 dentro de la matriz.#include <iostream>
  • using namespace std;#include "stdlib.h"#include "time.h"void main(){//Definition de matrizconst int OrdenMax = 10;int A[OrdenMax][OrdenMax], N, M;int tiempo, desde, hasta, fila, columna;//Ingreso orden matrizprintf("nrIngrese # de filas de la matriz: "); scanf("%d", &N);fflush(stdin);printf("nrIngrese # de columnas de la matriz: "); scanf("%d", &M);fflush(stdin);tiempo=time(NULL);srand(tiempo);desde=1; hasta=16; //rango números a generarfor(fila=0 ; fila<N ; fila++){ printf("nnt"); for(columna=0 ; columna<M ; columna++){ //generación de numero A[fila][columna] = desde + rand() % (1 + hasta - desde); //impresión de numero printf("t%d", A[fila][columna]); }}printf("nn");system("PAUSE");}8.3 OrdenamientosEn arreglos existen muchos métodos de ordenación de elementos a continuación mostraremos losmás utilizados.8.3.1 método de intercambio o burbuja
  • for(i=0 ; i<N-1 ; i++) for(j=i+1 ; j<N ; j++) if(A[i] > A[j]){ aux=A[i]; A[i]=A[j]; A[j]=aux; }Explicación del algoritmoEl primer < for > indica que se debe recorrer desde el inicio < i=0 > hasta el penúltimo elemento <i<N-1 >for(i=0 ; i<N-1 ; i++)El segundo < for > indica que se debe recorrer desde el siguiente del elemento actual < j=i+1 >hasta el último elemento < j<N >for(j=i+1 ; j<N ; j++)Si N=6 el recorrido de los dos for:i j0 1,2,3,4,51 2,3,4,52 3,4,53 4,54 5Recordar el algoritmo del intercambio de valores entre dos variables A y B:aux = A;A = B;B = aux;
  • Supongamos que el vector es el siguiente:0 1 2 3 4 53 5 4 6 7 0Como conocemos N=6, el recorrido de las variables <i> y <j> el algoritmo del intercambio esentonces:i j A[i] A[j] A[i] > A[j] Intercambio0 1 3 5 false0 2 3 4 false0 3 3 6 false0 4 3 7 false0 5 3 0 true 0 5 4 6 7 31 2 5 4 true 0 4 5 6 7 31 3 4 6 false1 4 4 7 false1 5 4 3 true 0 3 5 6 7 42 3 5 6 false2 4 5 7 false2 5 5 4 true 0 3 4 6 7 53 4 6 7 false3 5 6 5 true 0 3 4 5 7 64 5 7 6 0 3 4 5 6 7El resultado final es el arreglo ordenado:0 3 4 5 6 7
  • Capítulo 9Cadenas 9.1 Fundamentos de cadenas 9.2 Asignación de Valores 9.3 Lectura y escritura de datos 9.4 Arreglo de cadenas 9.5 Lectura y escritura de datos
  • 9.1 Fundamentos de cadenasIntroducciónEn el mundo de la programación y sistemas se trabajan con base de datos. Que no es más que datosinterrelacionados, y en su mayoría almacena datos de tipo texto (Cadenas).Entonces debemos aprender también a manejar bien los datos tipos cadenas en operaciones deconcatenación, extracción, filtros, etc.En C++ existen dos tipos de cadenas: estáticas y dinámicas. Nosotros comenzaremos con las de tiposestáticas para comprender el manejo interno y de cómo son las operaciones primitivas.Representación GraficaA continuación mostramos un vector de tipo carácter de 12 elementos:char A[12] 0 1 2 3 4 5 6 7 8 9 10 11 12 H O L A M U N D O 0 ? ?A[0]=H A[3]=A A[8]=D Operador marcador de fin de cadena9.2 Asignación de valoresAsignar a un elemento de la cadena es mediante la variable seguida de los índices entre corchetes asícomo sigue a continuación:<Variable_cadena>[<índice>] = <variable / valor>;
  • Ejemplos:A[0] = 7;A[3] = (char)65;A[8] = A;9.3 Lectura y escritura de DatosLeer o escribir un elemento de la cadena es similar a como se hace en los vectores, con la adición deentrada completa de la cadena mediante la función < gets >. Muchas de las operaciones en cadenasse realizan mediante funciones (Véase apartado 6.5).Lectura Carácterscanf(<formato>, &<Variable_cadena>[<indice>] );Ejemplosscanf("%c", &A[ 5 ]);scanf("%c", &A[ 0 ]);scanf("%c", &A[ p ]);Lectura Cadenagets(<Variable_cadena>);
  • Ejemplosgets(A);gets(B);Escritura Caracterprintf(<formato caracter>, <lista de elementos de cadena>);Ejemplosprintf("%c", A[ 5 ]);printf("%c y %c", A[ p ], B[ p ]);Escritura Cadenaprintf(<formato cadena>, <Variable cadena>);Ejemplosprintf("%s", A);printf("%s y %s", A, B);
  • 9.4 Arreglo de cadenasA continuación mostramos una matriz de tipo carácter de 5x16 elementos:char A[5][16]A[0][0]=J A[0][3]= <espacio> A[0][7]=A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 J O E R O C A 0 ? ? ? ? ? ? ? A[1][10]=S 1 M A R I A S A L A S 0 ? ? ? ? 2 J U L I O T E L L O 0 ? ? ? ? 3 P E D R O M O R E N O 0 ? ? ? A[2][9]=L 4 P I L A R 0 ? ? ? ? ? ? ? ? ? ?A[4][0]=P A[4][4]=R A[3][7]=O A[3][12]=09.5 Lectura y escritura de datosLectura Cadenagets(<Variable_cadena>[<índice fila>]);Ejemplosgets(A[0]);gets(B[p]);
  • Escritura Cadenaprintf(<formato cadena>, <Variable cadena>);Ejemplosprintf("%s", A[0]);printf("%s y %s", A[0], B[p]);Ejemplo 1:Ingrese una cadena de caracteres por teclado, desarrolle la simulación de la función extraer.Solución#include <iostream>using namespace std;void main(){const int LongitudMax = 100;char cadena[LongitudMax], Resultado[LongitudMax];int i, inicio, fin, nrocar, c;printf("nrIngrese Cadena: "); gets(cadena); fflush(stdin);printf("nrPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin);printf("nrNumero de caracteres a Extraer: "); scanf("%d", &nrocar);fflush(stdin);c=0;fin=(inicio-1) + nrocar;for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i];
  • c++;}Resultado[c]=0;printf("nnLa cadena extraida es %snn", Resultado);system("PAUSE");}Explicación del algoritmoconst int LongitudMax = 100;char cadena[LongitudMax], Resultado[LongitudMax];int i, inicio, fin, nrocar, c;Observamos la declaración de variables: una constante con la longitud máxima de la cadena, unavariable cadena para el ingreso y una variable resultado para mostrar lo que se va a extraer. Y unconjunto de variables numéricas.printf("nrIngrese Cadena: "); gets(cadena); fflush(stdin);printf("nrPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin);printf("nrNumero de caracteres a Extraer: "); scanf("%d", &nrocar);fflush(stdin);Las instrucciones mostradas son para el ingreso de variables. Observar la instrucción <fflush> despuésde cada instrucción de ingreso, para no perder caracteres.c=0;fin=(inicio-1) + nrocar;for(i=inicio-1 ; i < fin ; i++){ Resultado[c]=cadena[i]; c++;}
  • Inicializamos a la variable c a cero. La variable fin representa hasta donde se va a extraer, es iniciomenos uno más la cantidad de caracteres a extraer.En el bucle for la variable i comienza en inicio menos uno hasta fin y se va asignando a resultado elcontenido carácter a carácter. La variable c representa el índice de la variable resultado.Resultado[c]=0;Demarcamos el final de la cadena.printf("nnLa cadena extraida es %snn", Resultado);Mostramos por pantalla el resultado.Supongamos que los datos ingresados en el programa son los siguientes:cadena=”JUAN PEREZ”inicio=6nrocar=4Entonces:c=0fin = ( 6 - 1 ) + 4 = 9i=5
  • i c Resultado[c]5 0 P6 1 E7 2 R8 3 E