fundamentos de la programacion u2
DESCRIPTION
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.TRANSCRIPT
Capítulo 6
Funciones Predefinidas de
C++ 6.1 Concepto de Función
6.2 Funciones Aritméticas
6.3 Funciones trigonométricas
6.4 Funciones de caracteres
6.5 Funciones de Cadena
6.6 Generador de números aleatorios
6.7 De Control de pantalla
Funciones Predefinidas de C++
Introducción
Los desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menos
posible 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 escribirlos
reiteradamente, En eso C++ nos facilita la labor pues cuenta con funciones predefinidas de diferentes
tipos y para cada tipo de situaciones. No obstante antes de mostrar las funciones predefinidas
mostraremos el concepto de función para ingresar con más visión a las funciones.
6.1 Concepto de Función
Una función es un conjunto de instrucciones con una tarea determinada, una función es utilizada para
dividir un programa en subprogramas con tareas propias de la función. Una función siempre devuelve
valor.
Para ver definición de funciones Véase capítulo 7.
6.2 Funciones Aritméticas
Función Descripción Tipo Dato
Argumento Tipo Dato devuelto
Ejemplo Valor
devuelto ejemplo
Librería (**)
sqrt Raíz cuadrada
double double sqrt(4.0) 2.0 math.h float float sqrt(4.0) 2.0
long long sqrt(4) 2
pow (*)
Potencias
double double
pow(2.0, 3.0) pow(2.0, 3)
8.0 8.0
math.h float
float
pow(2.0, 3.0) pow(2.0, 3)
8.0 8.0
long double
long double
pow(20.0, 3) 8000.0
6
abs Valor Absoluto
double double abs(-7.0) abs(7.0)
7 7
math.h
float float abs(-7.0) abs(7.0)
7 7
int int abs(-7) abs(7)
7 7
long long abs(-70000) abs(70000)
70000 70000
stdlib.h long double
long double
abs(-70000.0) abs(70000.0)
70000.0 70000.0
ceil Techo(redondeo arriba)
double double ceil(3.2) ceil(3.9)
4.0 4.0
math.h
float float ceil(3.2) ceil(3.9)
4.0 4.0
long double
long double
ceil(30000.2) ceil(30000.9)
30001.0 30001.0
floor Piso(redondeo abajo)
double double floor(3.2) floor (3.9)
3.0 3.0
math.h
float float floor (3.2) floor (3.9)
3.0 3.0
long double
long double
floor (30000.2) floor (30000.9)
30000.0 30000.0
exp Exponencial
double double exp(1.0) 2.7
math.h float float exp(1.0) 2.7 long double
long double
exp(10.0) 22026.5
log Logaritmo natural(ln)
double double log(5.0) 1.6
math.h float float log(5.0) 1.6 long double
long double
log(1000.0) 6.9
log10 Logaritmo base 10 (ln)
double double log10(10.0) 1.0
math.h float float log10(10.0) 1.0 long double
long double
log10(1000.0)
3.0
(*) Para la función pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de la
funció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("\n\nResultado: %8.1lf ", resultado);
o mostrar directamente por pantalla:
double base=2.0, exponente=3.0; printf("\n\nResultado: %8.1lf ", pow(base, exponente));
6.3 Funciones trigonométricas
Función Descripción Tipo Dato
Argumento Tipo Dato devuelto
Ejemplo(*) Valor
devuelto ejemplo
Librería (**)
cos Coseno
double double cos(0.0) 1.0 math.h float float cos(0.0) 1.0
long double long cos(1000.0) 0.6
acos Arco Coseno
double double acos(1.0) 0.0 math.h float float acos(1.0) 0.0
long double long double acos(0.5) 1.0
sin Seno
double double sin(0.5) 0.5 math.h
float float sin(0.5) 0.5 long double long double sin(10.0) -0.5
asin Arco Seno
double double asin(0.8) 0.9 math.h float float asin(0.8) 0.9
long double long double asin(1.0) 1.6
tan Tangente
double double tan(1.0) 1.6 math.h float float tan(1.0) 1.6
long double long double tan(100.0) -0.6
atan Arco Tangente
double double atan(0.8) 0.7 math.h float float atan(0.8) 0.7
long double long double atan(100.0) 1.6
cosh Coseno Hiperbólico
double double cosh(1.0) 1.5 math.h float float cosh(1.0) 1.5
long double long double cosh(10.0) 11013.2
tanh Tangente Hiperbólico
double double tanh(1.0) 0.8 math.h float float tanh(1.0) 0.8
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 aceptan
reales ya sea double, float o long double, no obstante también es posible asignar variables con
el tipo solicitado en la función.
6.4 Funciones de caracteres
Muchas 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úmero
de código de cada carácter. A continuación mostramos la tabla de código ascii con los caracteres
imprimibles.
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 32
que representa el espacio en blanco y el carácter número 95 es la línea inferior.
Funciones de caracteres
Función Descripción Tipo Dato
Argumento
Tipo Dato
devuelto Ejemplo(*)
Valor devuelt
o ejemplo
Librería (**)
isalnum
Devuelve true si su
argumento satisface isalpha o isdigit.
Caso contrario devuelve false.
char bool
isalnum('B') isalnum('1') isalnum('+')
true true false
ctype.h
isalpha
Devuelve true si su
argumento es letra (Mayúscula o Minúscula). Caso contrario devuelve false.
char bool
isalpha('B') isalpha('1') isalpha('+')
true false false
ctype.h
isdigit
Devuelve true si su
argumento es un digito. Caso contrario devuelve false.
char bool
isdigit('B') isdigit('1') isdigit('+')
false true false
ctype.h
ispunct
Devuelve true si su
argumento es un carácter imprimible que no satisface isalnum y
no es espacio en blanco (Caracteres de puntuación). Caso contrario devuelve false.
char bool
ispunct('B') ispunct('1') ispunct('+')
false false true
ctype.h
isspace
Devuelve true si su
argumento es un carácter de espacio en blanco (Tabular, Enter). Caso contrario devuelve false.
char bool
isspace( ' ') isspace(' ') isspace('\n')
true true true
ctype.h
iscntrl (*)
Devuelve true si su
argumento es un carácter de control. Caso contrario devuelve false.
char bool
iscntrl ( char(127) )
true ctype.h
islower Devuelve true si su
argumento es letra char bool
islower('a') islower('A')
true false
ctype.h
Minúscula. Caso contrario devuelve false.
islower('+')
false
isupper
Devuelve true si su
argumento es letra Mayúscula. Caso contrario devuelve false.
char bool
isupper ('a') isupper ('A') isupper ('+')
false true false
ctype.h
tolower
Devuelve la versión en minúscula de su argumento. Si no tiene minúscula devuelve el mismo argumento
char char
tolower('A') tolower('a') tolower('+')
a a +
ctype.h
toupper
Devuelve la versión en mayúscula de su argumento. Si no tiene mayúscula devuelve el mismo argumento
char char
toupper('A') toupper('a') toupper('+')
A A +
ctype.h
(*) Hay una forma de averiguar cuáles son caracteres de control y esto es con las siguientes
instrucciones:
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. Son
caracteres no imprimibles por ejemplo el número 10 que representa la tecla <Enter>
6.5 Funciones de Cadena
Prototipo Descripción Ejemplo Valor
devuelto ejemplo
Librería (**)
int atoi (char* <cadena>)
Convierte <cadena>
hacia un int
char cad[2]={'1','0'}; atoi(cad);
10 stdlib.h
long atol (char* <cadena>)
Convierte <cadena>
hacia un long
char cad[2]={'0','5'}; atol(cad);
5 stdlib.h
double atof (char* <cadena>)
Convierte <cadena>
hacia un double
char cad[3]={'0','.','5'}; atof(cad)
0.5 math.h
char* strcat( char* <cad_destino>, char* <cad_origen> )
Anexa o junta <cad_origen > al
final de <cad_destino>
char cad1[10]={'A','B'}; char cad2[2]={'C'}; strcat(cad1, cad2); printf("\n%s", cad1);
ABC string.h
int strcmp( char* <cadena1>, char* <cadena2>)
Devuelve 0, si las cadenas son iguales, 1 si <cadena1> es mayor
a <cadena2> y -1 si
es menor (*)
char cad1[1]={'A'}; char cad2[1]={'A'}; printf("\n%d", strcmp(cad1, cad2));
0 string.h
char* strcpy( char* <cad_destino>, char* <Expresioncad>)
Cambia el valor de <Expresioncad> hacia <cad_destino>
char cad[10]; strcpy(cad, "ABC"); printf("\n%s", cad);
ABC string.h
int strlen (char* <cadena>)
Devuelve la longitud de <cadena>
char cad[10]={'A','B'}; printf("\n%d", strlen(cad));
ABC string.h
char* strncat( char* <cad_destino>, char* <cad_origen>, int <n>)
Anexa o junta <n> caracteres de <cad_origen > al
final de <cad_destino>
char cad1[10]={'A','B'}; char cad2[2]={'C','D'}; strncat(cad1,cad2,1); printf("\n%s", cad1);
ABC string.h
int strncmp( char* <cadena1>, char* <cadena2>, int <n>)
Compara <n> caracteres de <cadena1> con
<cadena2>
char cad1[10]={'A','B'}; char cad2[2]={'A','C'}; printf("\n%d", strncmp(cad1, cad2, 1));
0 string.h
char* strstr( char* <cadena>, char* <Patrón>)
Devuelve un puntero a la primera ocurrencia de la cadena <Patrón> en <cadena> y NULL si no lo encuentra
char cad1[10]={'A','B','C'}; char cad2[10]={'B'}; char cad3[10]; strcpy(cad3, strstr(cad1, cad2)); printf("\n%s", cad3);
BC string.h
char* strchr( char* <cadena>, char <caracter>)
Devuelve un puntero a la primera ocurrencia de la cadena <
char cad1[10]={'A','B', 'A','B'}; char car='B'; char cad3[10];
BAB string.h
caracter> en <cadena> y NULL si no lo encuentra
strcpy(cad3, strchr(cad1, car)); printf("\n%s", cad3);
char* strrchr( char* <cadena>, char <caracter>)
Devuelve un puntero a la última ocurrencia de la cadena < caracter> en <cadena> y NULL si no lo encuentra
char cad1[10]={'A','B', 'A','B'}; char car='B'; char cad3[10]; strcpy( cad3, strrchr(cad1, car) ); printf("\n%s", cad3);
B string.h
(*) Devuelve 0, si son iguales en longitud y caracteres, 1 si <cadena1> es mayor a <cadena2> y -1 si
es 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 caracter mas 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 caracter mas 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 por
la ya conocida referencia:
#include <iostream> using namespace std;
6.6 Generador de números aleatorios
A menudo en los problemas computacionales es necesario generar números al azar o aleatorios. A
continuació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("%d\n", 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 7
Programación Modular 7.1 Diseño descendente
7.2 Subprogramas
7.3 Variables globales y locales
7.4 Funciones
7.4.1 Definición de funciones
7.4.2 Invocación a las funciones
7.5 Procedimientos
7.5.1 Definición de Procedimientos
7.5.2 Invocación a las Procedimientos
7.6 Tipos de Parámetros
7Programación Modular
Introducción
Los 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 aplicaciones
grandes y complejas. En C++ es esencial el trabajo modular ya sea por objetivos, abstracción o por
reutilización.
Un módulo representa un bloque abstracto de código, esto es el programa principal o subprogramas
en una solución a un problema computacional.
7.1 Diseño descendente
Las aplicaciones en C++ y varios lenguajes de programación tienen como característica el diseño descendente en la escritura de código, es decir “de arriba hacia abajo” esto significa que en una hoja de código el compilador va a hacer un barrido desde la primera hasta la última línea en la hoja de có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 Subprogramas
Son subdivisiones que bifurcan o alteran el flujo del código en un programa. Hacia la zona del
subprograma, 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
Línea 1 xxxxxxxx Línea 2 xxxxxxxx LLAMA SUBPROGRAMA X Línea 4 xxxxxxxx Línea 5 xxxxxxxx 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 Línea 12 xxxxxxxx …………………... …………………… Línea n-1 ...…….. Línea n...………..
Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja de có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 del subprograma. 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 X y 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 hizo el compilador con el subprograma X hace con Y, ejecuta las líneas del subprograma Y, al finalizar retorna al programa principal hasta terminar de ejecutar lo restante.
SUBPROGRAMA (X)
Línea 1 xxxxxxxx Línea 2 xxxxxxxx …………………… Línea n-1 ...…….. Línea n...………..
SUBPROGRAMA (Y)
Línea 1 xxxxxxxx Línea 2 xxxxxxxx Línea 3 xxxxxxxx …………………… Línea n...………..
El esquema representa el
flujo de un programa con
dos subprogramas.
7.3 Variables globales y locales
Una variable es global o local en función de la zona dentro de la hoja de código en donde es
declarada. Esto puede ser por el alcance del valor de la variable con la cual se necesita trabajar.
Variable global
Es una variable que es declarada fuera de todo modulo, su valor almacenado es mantenido hasta que
se termine el programa.
#include <iostream> using namespace std; int nro; //Variable global nro void main(){
Variable local
Es una variable que es declarada dentro de un módulo, su valor almacenado es mantenido hasta que
termine el modulo.
#include <iostream>
using namespace std;
void main(){
int nro; //Variable Local del programa principal
7.4 Funciones
Una 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, el
valor devuelto por la función puede ser almacenado o mostrado directamente por pantalla.
7.4.1 Definición de funciones
Para utilizar una función antes previamente debe ser definida. A continuación mostramos la definición
de 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 del
tipo 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 funciones
La 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 funcion printf("%d\n", resultado);//Muestra 15 system("PAUSE"); }
Una función no es necesariamente invocado de la función principal void main también es posible que
sea invocado desde cualquier función valida de C++, y todas ellas estarán en espera hasta que sean
invocados desde el modulo void main. A continuación mostraremos como se invoca una función
dentro 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_sumar return devolver; }
El programa completo es:
#include <iostream> using namespace std; //Definicion de la funcion f_sumar int f_sumar(int A, int B){ int devolver; devolver = A + B; return devolver; } //Definición de la funcion f_doble int f_doble(int A){ int devolver; devolver = f_sumar(A, A);//Invocacion a función f_sumar return devolver; } //Programa Principal void main(){ int A, resultado; A=10; resultado=f_doble(A);//Invocacion a función f_doble printf("%d\n", resultado);//Muestra 20 system("PAUSE"); }
7.5 Procedimientos
Un procedimiento es un tipo de función con la única restricción que NO retorna resultado(s). Por tanto
todas 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 un
procedimiento como bloque de código que es anexado al módulo que lo invoca.
7.5.1 Definición de Procedimientos
Para utilizar un procedimiento antes previamente debe ser definida. A continuación mostramos la
definició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("%d\n", A); system("PAUSE"); }
7.4.2 Invocación a los Procedimientos
El procedimiento f_mostrar es un código en espera sino hasta que es invocado desde el modulo
void 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_mostrar void f_mostrar(int A){ printf("%d\n", A); system("PAUSE"); } //Procedimiento Principal void 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ódulo
donde fueron declaradas, por lo tanto el argumento (int A) del procedimiento f_mostrar y la
variable int A de void main son distintas.
7.6 Tipos de Parámetros
En C++ los parámetros o argumentos de una función pueden ser de dos tipos: Por valor o por
referencia.
Parámetro Por Valor
Son aquellos parámetros en los cuales el valor o contenido de los parámetros es copiado, y dentro de
la función se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada en
contenido.
Parámetro Por Referencia
Son aquellos parámetros en los cuales la dirección de memoria es pasada hacia la función, esto indica
que dentro de la función se trabaja realmente con la variable que es pasada como argumento, por
tanto dicha variable puede ser modificada.
void f_incrementar(int A){//Argumento A es por valor A++; printf("%d\n", A); } void main(){ int A; A=10; f_incrementar(A);//Muestra 11 printf("%d\n", A);//Muestra 10 system("PAUSE"); }
Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variable
el símbolo de ampersand &.
void f_incrementar(int &A){ //Argumento A es por referencia A++; printf("%d\n", A); } void main(){ int A; A=10; f_incrementar(A);//Muestra 11 printf("%d\n", A);//Muestra 11 system("PAUSE"); }
Se recomienda usar parámetros por referencia en lo mínimo. Es posible también modificar variables en
funciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremos
que estamos modificando.
Capítulo 8
Arreglos
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
Arreglos
Introducción
Los arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo acceso
individual es numérico, este acceso individual es denominado índice. Un arreglo puede contener por
ejemplo 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 la
longitud del vector esta va a mantener su longitud hasta el final del programa.
8.1 Arreglos Unidimensionales
8.1.1 Representación Grafica
A 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 9
A[0]=7 A[3]=3 A[8]=15
8.1.2 Asignación de Valores
Asignar a un elemento del vector es mediante la variable seguida del índice entre corchetes así como
sigue a continuación:
<Variable_vector>[<indice>] = <variable / valor>;
8
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 datos
Leer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante la
variable seguida del índice entre corchetes así como sigue a continuación:
Lectura
scanf(<formato>, &<Variable_vector>[<indice>] );
Ejemplos
scanf("%d", &A[ 5 ]); scanf("%d", &A[ 0 ]); scanf("%d", &A[ p ]);
Escritura
printf(<formato>, <lista de elementos de vector>);
Ejemplos
printf("%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 vector
Recorrido
Para recorrer un vector ya sea para asignación, lectura o escritura utilizamos la sentencia for
ya 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("%d\n", A[i]); }
Inserción
Sabemos que la longitud del vector es de tipo estática por tanto la inserción es simulada, es decir no
aumenta la longitud declarada al inicio.
Para tal caso debemos declarar la longitud del vector con un valor máximo tope, que contemple la
longitud actual más las inserciones.
Debemos tener la longitud virtual del vector en una variable
A 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 4
Algoritmo 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 algoritmo
for(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 longitud
del 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 4
A[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 = 5
Eliminación
Sabemos que la longitud del vector es de tipo estática por tanto la eliminación es simulada, es decir no
decrementa 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 5
Algoritmo 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 vector
Explicación del algoritmo
for(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 a
eliminar < i= posicion > hasta la longitud del vector < i<N >. < A[i-1] = A[i] > significa el
elemento 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 5
N--;
Como N tenía el valor de 5 y se decrementa en uno entonces:
N = 4
8.2.1 Representación Grafica
A 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
0 2 3 5 6 7
1 5 6 0 8 6
2 2 6 3 9 5
3 1 2 7 2 8
4 7 8 9 3 4
A[4] [0]=7 A[3][3]=2
A[1] [1]=6 A[2] [3]=9 A[3] [1]=2
8.2.2 Asignación de Valores
Asignar 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 datos
Leer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediante
la variable seguida de los índices entre corchetes así como sigue a continuación:
Lectura
scanf(<formato>, &<Variable_matriz>[<índice_fila>][<índice_columna>]);
Ejemplos
scanf("%d", &A[ 5 ][ 5 ]); scanf("%d", &A[ 0 ][ 1 ]); scanf("%d", &A[ f ][ c ]);
Escritura
printf(<formato>, <lista de elementos de la matriz>);
Ejemplos
printf("%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 for
Uno 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 1
Ejemplo 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 veces
es 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("\n\n\t"); 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:
//Definition const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; //Ingreso printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin);
Ejemplo 7 Se tiene una matriz de orden N*M de tipo entero, se pide generar 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 matriz const int OrdenMax = 10; int A[OrdenMax][OrdenMax], N, M; int tiempo, desde, hasta, fila, columna; //Ingreso orden matriz printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin); printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M); fflush(stdin); tiempo=time(NULL); srand(tiempo); desde=1; hasta=16; //rango números a generar for(fila=0 ; fila<N ; fila++){ printf("\n\n\t"); 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("\n\n"); system("PAUSE"); }
8.3 Ordenamientos
En arreglos existen muchos métodos de ordenación de elementos a continuación mostraremos los
má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 algoritmo
El 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 j
0 1,2,3,4,5
1 2,3,4,5
2 3,4,5
3 4,5
4 5
Recordar 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 5
3 5 4 6 7 0
Como conocemos N=6, el recorrido de las variables <i> y <j> el algoritmo del intercambio es
entonces:
i j A[i] A[j] A[i] > A[j] Intercambio 0 1 3 5 false
0 2 3 4 false
0 3 3 6 false
0 4 3 7 false
0 5 3 0 true 0 5 4 6 7 3
1 2 5 4 true 0 4 5 6 7 3
1 3 4 6 false
1 4 4 7 false
1 5 4 3 true 0 3 5 6 7 4
2 3 5 6 false
2 4 5 7 false
2 5 5 4 true 0 3 4 6 7 5
3 4 6 7 false
3 5 6 5 true 0 3 4 5 7 6
4 5 7 6 0 3 4 5 6 7
El resultado final es el arreglo ordenado:
0 3 4 5 6 7
Capítulo 9
Cadenas
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 cadenas
Introducción
En el mundo de la programación y sistemas se trabajan con base de datos. Que no es más que datos
interrelacionados, 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 de
concatenación, extracción, filtros, etc.
En C++ existen dos tipos de cadenas: estáticas y dinámicas. Nosotros comenzaremos con las de tipos
estáticas para comprender el manejo interno y de cómo son las operaciones primitivas.
Representación Grafica
A continuación mostramos un vector de tipo carácter de 12 elementos:
9.2 Asignación de valores
Asignar 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>;
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 cadena
Ejemplos:
A[0] = '7'; A[3] = (char)65; A[8] = 'A';
9.3 Lectura y escritura de Datos
Leer o escribir un elemento de la cadena es similar a como se hace en los vectores, con la adición de
entrada completa de la cadena mediante la función < gets >. Muchas de las operaciones en cadenas
se realizan mediante funciones (Véase apartado 6.5).
Lectura Carácter
scanf(<formato>, &<Variable_cadena>[<indice>] );
Ejemplos
scanf("%c", &A[ 5 ]); scanf("%c", &A[ 0 ]); scanf("%c", &A[ p ]);
Lectura Cadena
gets(<Variable_cadena>);
Ejemplos
gets(A); gets(B);
Escritura Caracter
printf(<formato caracter>, <lista de elementos de cadena>);
Ejemplos
printf("%c", A[ 5 ]); printf("%c y %c", A[ p ], B[ p ]);
Escritura Cadena
printf(<formato cadena>, <Variable cadena>);
Ejemplos
printf("%s", A); printf("%s y %s", A, B);
9.4 Arreglo de cadenas
A 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 ? ? ? ? ? ? ?
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 ? ? ?
4 P I L A R \0 ? ? ? ? ? ? ? ? ? ?
A[4][0]=P A[4][4]=R A[3][7]=O A[3][12]=\0
A[1][10]=S A[2][9]=L
9.5 Lectura y escritura de datos
Lectura Cadena
gets(<Variable_cadena>[<índice fila>]);
Ejemplos
gets(A[0]); gets(B[p]);
Escritura Cadena
printf(<formato cadena>, <Variable cadena>);
Ejemplos
printf("%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("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero 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("\n\nLa cadena extraida es %s\n\n", Resultado); system("PAUSE"); }
Explicación del algoritmo
const 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, una
variable cadena para el ingreso y una variable resultado para mostrar lo que se va a extraer. Y un
conjunto de variables numéricas.
printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin); printf("\n\rPosicion de Inicio a Extraer: "); scanf("%d", &inicio); fflush(stdin); printf("\n\rNumero de caracteres a Extraer: "); scanf("%d", &nrocar); fflush(stdin);
Las instrucciones mostradas son para el ingreso de variables. Observar la instrucción <fflush> después
de 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 inicio
menos 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 el
contenido 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("\n\nLa cadena extraida es %s\n\n", Resultado);
Mostramos por pantalla el resultado.
Supongamos que los datos ingresados en el programa son los siguientes:
cadena=”JUAN PEREZ”
inicio=6
nrocar=4
Entonces:
c=0
fin = ( 6 - 1 ) + 4 = 9
i=5
i c Resultado[c]
5 0 P
6 1 E
7 2 R
8 3 E