47
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

Fundamentos de la programacion u2

Embed Size (px)

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.

Citation preview

Page 1: Fundamentos de la programacion u2

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

Page 2: Fundamentos de la programacion u2

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

Page 3: Fundamentos de la programacion u2

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;

Page 4: Fundamentos de la programacion u2

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

Page 5: Fundamentos de la programacion u2

(*) 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

Page 6: Fundamentos de la programacion u2

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

Page 7: Fundamentos de la programacion u2

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

Page 8: Fundamentos de la programacion u2

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

Page 9: Fundamentos de la programacion u2

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:

Page 10: Fundamentos de la programacion u2

#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:

Page 11: Fundamentos de la programacion u2

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)

Page 12: Fundamentos de la programacion u2

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

Page 13: Fundamentos de la programacion u2

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:

Page 14: Fundamentos de la programacion u2

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.

Page 15: Fundamentos de la programacion u2

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

Page 16: Fundamentos de la programacion u2

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>:

Page 17: Fundamentos de la programacion u2

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:

Page 18: Fundamentos de la programacion u2

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"); }

Page 19: Fundamentos de la programacion u2

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.

Page 20: Fundamentos de la programacion u2

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 }

Page 21: Fundamentos de la programacion u2

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"); }

Page 22: Fundamentos de la programacion u2

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.

Page 23: Fundamentos de la programacion u2

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

Page 24: Fundamentos de la programacion u2

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

Page 25: Fundamentos de la programacion u2

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 ]);

Page 26: Fundamentos de la programacion u2

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]); }

Page 27: Fundamentos de la programacion u2

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

Page 28: Fundamentos de la programacion u2

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

Page 29: Fundamentos de la programacion u2

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:

Page 30: Fundamentos de la programacion u2

< 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:

Page 31: Fundamentos de la programacion u2

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:

Page 32: Fundamentos de la programacion u2

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 ]);

Page 33: Fundamentos de la programacion u2

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

Page 34: Fundamentos de la programacion u2

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:

Page 35: Fundamentos de la programacion u2

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>

Page 36: Fundamentos de la programacion u2

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

Page 37: Fundamentos de la programacion u2

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;

Page 38: Fundamentos de la programacion u2

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

Page 39: Fundamentos de la programacion u2

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

Page 40: Fundamentos de la programacion u2

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

Page 41: Fundamentos de la programacion u2

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>);

Page 42: Fundamentos de la programacion u2

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);

Page 43: Fundamentos de la programacion u2

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]);

Page 44: Fundamentos de la programacion u2

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];

Page 45: Fundamentos de la programacion u2

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++; }

Page 46: Fundamentos de la programacion u2

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

Page 47: Fundamentos de la programacion u2

i c Resultado[c]

5 0 P

6 1 E

7 2 R

8 3 E