Está en la página 1de 86

UTP -1-

FACULTAD DE INGENIERIA DE TRANSPORTE Y


TELECOMUNICACION

INFORMATICA I

Prof. Ing. Alberto Moreno


UTP -2-

Indice
1.- Descripción General
• Estructura de datos
• Tipos de Datos, Variables
• Ejemplos de entrada y salida

2.- Estructura de Control


• Intrucciones if(), Switch(),?
• Repetitivas (while, do-while)

3.- Funciones
• Sintaxis de las funciones
• Parámetros por referncia y valor
• Recursividad

4.- Arrays Unidimesionales y Bidimensionales


• Definición
• Operaciones con arreglos
• Metodos de Ordenación
• Operaciones con bidimensionales
• Ejercicios propuestos

5.- Estructuras
• Definición
• Arreglos con estructuras
• Ejercicios propuestos

6.- Procesamiento de cadenas


• Almacenamiento de cadenas
• Procesamiento de cadeans
• Ejercicios propuestos

7.- Programación orientada a Objetos


• Definición ,
• Metodos y Constructores
• Herencia y sobrecarga

Profesores que colaboraron:


- Ing. Alberto Moreno
UTP -3-

CAPITULO 1.-CARACTERISTICAS DEL LENGUAJE C++


El lenguaje C se conoce como un lenguaje compilado. Existen dos tipos de lenguaje:
interpretados y compilados. Los interpretados son aquellos que necesitan del código fuente para
funcionar (P.ej: Basic). Los compilados convierten el código fuente en un fichero objeto y éste en un
fichero ejecutable. Este es el caso del lenguaje C.

Podemos decir que el lenguaje C es un lenguaje de nivel medio, ya que combina elementos de
lenguaje de alto nivel con la funcionalidad del lenguaje ensamblador. Es un lenguaje estructurado, ya
que permite crear procedimientos en bloques dentro de otros procedimientos. Hay que destacar que el
C es un lenguaje portable, ya que permite utilizar el mismo código en diferentes equipos y sistemas
informáticos: el lenguaje es independiente de la arquitectura de cualquier máquina en particular.

Por último solo queda decir que el C es un lenguaje relativamente pequeño; se puede describir
en poco espacio y aprender rápidamente. Este es sin duda el objetivo de éste curso. No pretende ser un
completo manual de la programación, sinó una base útil para que cualquiera pueda introducirse en este
apasionante mundo.

Aunque en principio cualquier compilador de C es válido, para seguir este curso se recomienda
utilizar el compilador Turbo C/C++ o bien el Borland C++ 5.0.
UTP -4-

ESTRUCTURA DE UN PROGRAMA EN C++


Estructura

Todo programa en C consta de una o más funciones, una de las cuales se llama main. El programa
comienza en la función main, desde la cual es posible llamar a otras funciones.

Cada función estará formada por la cabecera de la función, compuesta por el nombre de la misma y
la lista de argumentos (si los hubiese), la declaración de las variables a utilizar y la secuencia de
sentencias a ejecutar.

Ejemplo:

declaraciones globales

main( ) {
variables locales
bloque
}

funcion1( ) {
variables locales
bloque
}

Comentarios

A la hora de programar es conveniente añadir comentarios (cuantos más mejor) para poder saber
que función tiene cada parte del código, en caso de que no lo utilicemos durante algún tiempo. Además
facilitaremos el trabajo a otros programadores que puedan utilizar nuestro archivo fuente.

Para poner comentarios en un programa escrito en C usamos los símbolos /* y */:

/* Este es un ejemplo de comentario */

/* Un comentario también puede


estar escrito en varias líneas */

El símbolo /* se coloca al principio del comentario y el símbolo */ al final.

El comentario, contenido entre estos dos símbolos, no será tenido en cuenta por el compilador.

Palabras clave

Existen una serie de indicadores reservados, con una finalidad determinada, que no podemos utilizar
como identificadores.
UTP -5-

A continuación vemos algunas de estas palabras clave:

char int float double if


else do while for switch
short long extern static default
continue break register sizeof typedef

Identificadores

Un identificador es el nombre que damos a las variables y funciones. Está formado por una
secuencia de letras y dígitos, aunque también acepta el caracter de subrayado _. Por contra no acepta
los acentos ni la ñ/Ñ.

El primer caracter de un identificador no puede ser un número, es decir que debe ser una letra o el
símbolo _.

Se diferencian las mayúsculas de las minúsculas, así num, Num y nuM son distintos
identificadores.

A continuación vemos algunos ejemplos de identificadores válidos y no válidos:

Válidos No válidos

_num 1num

var1 número2

fecha_nac año_nac
UTP -6-

TIPOS DE DATOS
En 'C++' existen básicamente cuatro tipos de datos, aunque como se verá después, podremos
definir nuestros propios tipos de datos a partir de estos cuatro. A continuación se detalla su nombre, el
tamaño que ocupa en memoria y el rango de sus posibles valores.

TIPO Tamaño Rango de valores

char 1 byte -128 a 127


int 2 bytes -32768 a 32767
float 4 bytes 3. 4E-38 a 3.4 E+38
double 8 bytes 1.7 E-308 a 1.7 E+308

Calificadores de tipo

Los calificadores de tipo tienen la misión de modificar el rango de valores de un determinado tipo
de variable. Estos calificadores son cuatro:

• signed
Le indica a la variable que va a llevar signo. Es el utilizado por defecto.

TIPO Tamaño Rango de valores

signed char 1 byte -128 a 127


signed int 2 bytes -32768 a 32767

• unsigned
Le indica a la variable que no va a llevar signo (valor absoluto).

TIPO Tamaño Rango de valores

unsigned char 1 byte 0 a 255


unsigned int 2 bytes 0 a 65535

• short
Rango de valores en formato corto (limitado). Es el utilizado por defecto.

TIPO Tamaño Rango de valores

short char 1 byte -128 a 127


short int 2 bytes -32768 a 32767
UTP -7-

• long
Rango de valores en formato largo (ampliado).

TIPO Tamaño Rango de valores

long int 4 bytes -2.147.483.648 a 2.147.483.647


long double 10 bytes -3'36 E-4932 a 1'18 E+4932

También es posible combinar calificadores entre sí:

signed long int = long int = long


unsigned long int = unsigned long 4 bytes 0 a 4.294.967.295
(El mayor entero permitido en 'C')

Las variables

Una variable es un tipo de dato, referenciado mediante un identificador (que es el nombre de la


variable). Su contenido podrá ser modificado a lo largo del programa.

Una variable sólo puede pertenecer a un tipo de dato. Para poder utilizar una variable, primero tiene
que ser declarada:

[calificador] <tipo> <nombre>

Es posible inicializar y declarar más de una variable del mismo tipo en la misma sentencia:

[calificador] <tipo><nombre1>,<nombre2>=<valor>,<nombre3>=<valor>,…

/* Uso de las variables */

#include <iostream.h>

main() /* Suma dos valores */


{
int num1=4,num2,num3=6;
cout<<"El valor de num1:”<<num1;
cout<<"\nEl valor de num3 es:"<<num3;
num2=num1+num3;
cout<<(nnum1 + num3)<<” = “ <<num2;
}
UTP -8-

¿ Dónde se declaran ?

Las variables pueden ser de dos tipos según el lugar en que las declaremos: globales o locales.

La variable global se declara antes de la main( ). Puede ser utilizada en cualquier parte del
programa y se destruye al finalizar éste.

La variable local se declara después de la main( ), en la función en que vaya a ser utilizada. Sólo
existe dentro de la función en que se declara y se destruye al finalizar dicha función.

El identificador (nombre de la variable) no puede ser una palabra clave y los caracteres que
podemos utilizar son las letras: a-z y A-Z (ojo! la ñ o Ñ no está permitida), los números: 0-9 y el
símbolo de subrayado _. Además hay que tener en cuenta que el primer caracter no puede ser un
número.

/* Declaración de variables */

#include <iostream.h>

int a;
main() /* Muestra dos valores */
{
int b=4;
cout<<"b es local y vale:"<<b;
a=5;
cout<<"\na es global y vale:"<<a;
}

Constantes

Al contrario que las variables, las constantes mantienen su valor a lo largo de todo el programa.

Para indicar al compilador que se trata de una constante, usaremos la directiva #define:

#define <identificador> <valor>

Observa que no se indica el punto y coma de final de sentencia ni tampoco el tipo de dato.

La directiva #define no sólo nos permite sustituir un nombre por un valor numérico, sinó también
por una cadena de caracteres.

El valor de una constante no puede ser modificado de ninguna manera.

/* Uso de las constantes */

#include <iostream.h>
UTP -9-

#define pi 3.1416
main() /* Calcula el perímetro */
{
int r;
cout<<"Introduce el radio: ";
cin>>r;
cout<<"El perímetro es:"<<2*pi*r;
}

Secuencias de escape

Ciertos caracteres no representados gráficamente se pueden representar mediante lo que se conoce


como secuencia de escape.

A continuación vemos una tabla de las más significativas:

\n salto de línea
\b retroceso
\t tabulación horizontal
\v tabulación vertical
\\ contrabarra
\f salto de página
\' apóstrofe
\" comillas dobles
\0 fin de una cadena de caracteres

/* Uso de las secuencias de escape */

#include <iostream.h>

main() /* Escribe diversas sec. de escape */


{
cout<<"Me llamo \"Nemo\" el grande";
cout<<"\nDirección: C\\ Mayor 25";
cout<<"\nHa salido la letra \'L\'";
cout<<"\nRetroceso\b";
cout<<"\n\tEsto ha sido todo";
}

Inclusión de ficheros

En la programación en C es posible utilizar funciones que no esten incluídas en el propio programa.


Para ello utilizamos la directiva #include, que nos permite añadir librerías o funciones que se
encuentran en otros ficheros a nuestro programa.

Para indicar al compilador que vamos a incluir ficheros externos podemos hacerlo de dos maneras
(siempre antes de las declaraciones).
UTP -10-

1. Indicándole al compilador la ruta donde se encuentra el fichero.

#include "misfunc.h"
#include "c:\includes\misfunc.h"

2. Indicando que se encuentran en el directorio por defecto del compilador.

#include <misfunc.h>

NOTA : Se debe tener en cuenta que la mayoria de compiladores en “C”, utilizan la misma distribucion
de directorios es decir :

Carpeta include : Contine los archivos de cabecera (*.h).


Carpeta bin : Contiene los ejecutables del compilador “C”.
Carpeta lib : Contiena las bibliotecas del compilador.
UTP -11-

OPERADORES ARITMETICOS Y DE ASIGNACION

A continuación se explican los tipos de operadores (aritméticos y de asignación) que permiten realizar
operaciones matemáticas en lenguaje C.

Operadores aritméticos

Existen dos tipos de operadores aritméticos:

Los binarios:

+ Suma
- Resta
* Multiplicación
/ División
% Módulo (resto)

y los unarios:

++ Incremento (suma 1)
-- Decremento (resta 1)
- Cambio de signo

Su sintaxis es:

binarios:
<variable1><operador><variable2>

unarios:
<variable><operador> y al revés, <operador><variable>.

/* Uso de los operadores aritméticos */

#include <iostream.h>

main() /* Realiza varias operaciones */


{
int a=1,b=2,c=3,r;
r=a+b;
cout<<a<<”,”<<b<<”,”<<r;
r=c-a;
cout<<c<<”,”<<a<<”,”<<r;
b++;
cout<<"b + 1 = "<<b;
}
UTP -12-

Operadores de asignación

La mayoría de los operadores aritméticos binarios explicados en el capítulo anterior tienen su


correspondiente operador de asignación:

= Asignación simple
+= Suma
-= Resta
*= Multiplicación
/= División
%= Módulo (resto)

Con estos operadores se pueden escribir, de forma más breve, expresiones del tipo:
n=n+3 se puede escribir n+=3

k=k*(x-2) lo podemos sustituir por k*=x-2

/* Uso de los operadores de asignación */

#include <iostream.h>

main() /* Realiza varias operaciones */


{
int a=1,b=2,c=3,r;
a+=5;
cout<<"a + 5 ="<<a<<endl;
c-=1;
cout<<"c - 1 ="<<c<<endl;
b*=3;
cout<<"b * 3 ="<<b;
}

Jerarquía de los operadores

Será importante tener en cuenta la precedencia de los operadores a la hora de trabajar con ellos:

() Mayor precedencia
++, - -
*, /, %
+, - Menor precendencia

Las operaciones con mayor precedencia se realizan antes que las de menor precedencia.

Si en una operación encontramos signos del mismo nivel de precedencia, dicha operación se realiza
de izquierda a derecha. A continuación se muestra un ejemplo sobre ello:

a*b+c/d-e
UTP -13-

1. a*b resultado = x
2. c/d resultado = y
3. x+y resultado = z
4. z-e

Fijarse que la multiplicación se resuelve antes que la división ya que está situada más a la izquierda
en la operación. Lo mismo ocurre con la suma y la resta.

/* Jerarquía de los operadores */

#include <iostream.h>

main() /* Realiza una operación */


{
int a=6,b=5,c=4,d=2,e=1,x,y,z,r;
x=a*b;
cout<<a<<”,”<<b<<”,”<<x;
y=c/d;
cout<<c<<”,”<<d<<”,”<<y);
z=x+y;
cout<<x<<”,”<<y<<”,”<<z);
r=z-e;
cout<<<<r<<”,”<<(a*b+c/d-e);
}

1.- Determinar que tipo de constantes representan los siguientes ejemplos :

1.1) 13.25 ......


1.2) +125 ......
1.3) FIN ......
1.4) 2560 ......
1.5) -25 ........
1.6) EDAD ........
1.7) ........
1.8) true ........

2.- Escriba tres nombres de variable para cada nombre que se indica :

2.1) Libreta electoral .. .......... ........ ..


2.2) Número de postulantes ...... .......... ........ ..
2.3) Sueldo de un obrero ...... .......... ........ ..
2.4) Código de un alumno .......... .......... ..
2.5) Importe de venta .................... ..
UTP -14-

3.- Utilice los operadores matemáticos para transformar las siguientes expresiones algebraicas:

3.1) p ( p − a )( p − b)( p − c

b3 + c
3.2)
a −5

3.3) 2(A+B)

c − a + b3
3.4)
c − b2

3.5) W+T
K

3.6) A - 3B2
5K + 8J
UTP -15-

SEMANA 2.- Programas de Entrada y salida

Ejercicios propuestos.-
1. El calculo de un pago mensual de empleado de una empresa se efectúa de
la siguientes manera: el sueldo básico se calcula en base al número total de
horas trabajadas basada en una tarifa horaria, al sueldo básico se le aplica
una bonificación del 20% obteniéndose el sueldo bruto, al sueldo bruto se le
aplica un descuento del 10% obteniéndose el sueldo neto. Escriba un
programa que calcule e imprima el sueldo básico, el sueldo bruto y el
sueldo neto de un trabajador.
Datos a considerar: nombre, horas trabajadas y tarifa por hora

2. Diseñe un programa para convertir una cantidad de soles a Dólares y a


Euros. Considere el tipo de cambio 1Dolar= 3.15 soles y 1Dolar=1.09 Euros

3. Diseñe un programa que lea la capacidad de un disco duro en Gigabytes y


lo convierta en Megabytes, Kilobytes y Bytes 1 Kilobyte= 1024 Bytes
1 Megabyte= 1024 Kilobyte
1 Gigabyte= 1024 Megabyte

4.- Datos del programa descripción de un producto, el precio y la cantidad


vendida, calcular y mostrar:
a. Importe por la compra, multiplique precio por la cantidad vendida.
b. Impuesto general a las ventas (Igv), es 19% del importe de compra.
c. Importe final por la compra, sume el importe de compra más el Igv.

5.- Dato un número de cuatro cifras, calcular y mostrar:


a. Suma de las cifras
b. Promedio de las cifras.

6.- Crear un algoritmo para venta de Artefactos, datos nombre del cliente y el
precio del artefacto (no incluye el IGV), se deberá visualizar:
a. El precio final, precio del artefacto mas IGV.
b. El valor de la cuota inicial, 10% del precio final.
c. El valor de cada una de las 4 cuotas.

7.- Desarrolle un algoritmo para la telefónica que permita mostrar el pago por
consumo telefónico; Datos del programa código del usuario, el número
telefónico y la cantidad de minutos utilizados.
Visualice el código del usuario, el importe por los minutos utilizados, el IGV y el
pago total.

Tenga en cuenta que la empresa cobra S/0.30 por minuto utilizado, S/ 48.00 de
renta básica y que el IGV es 19% respecto al importe por minutos.
UTP -16-

8.- Elabore un algoritmo para EDELNOR,datos el código del suministro y la


cantidad de kilowatts consumidos. Calcule y muestre los siguientes pagos:
a. Importe inicial.
b. El pago del 3.5% por alumbrado publico.
c. El pago del 1.8 por mantenimiento.
d. El pago del 4.8 por reajuste de acuerdo a ley.
e. El 19% por pago del IGV
f. El pago total.
Los porcentajes son respecto al importe inicial.
Considerar que el Precio por Kilowats es S/ 0.09 .

9.- Desarrolle un algoritmo para SEDAPAL, los datos el código del usuario y la
cantidad de metros cúbicos consumidos. Calcule y visualice los siguientes
pagos:
a. Importe inicial.
b. Mantenimiento de parques y jardines (2.8%)
c. Relleno sanitario (1.4%)
d. Mantenimiento general (2.1%)
e. IGV (18%)
f. Pago total
Considere el precio que se paga por cada metro cúbico consumido se paga S/
0.45 y que los porcentajes son respecto al importe inicial.
UTP -17-

OPERADORES RELACIONALES
Los operadores relacionales se utilizan para comparar el contenido de dos variables.

En C existen seis operadores relacionales básicos:

> Mayor que


< Menor que
>= Mayor o igual que
<= Menor o igual que
== Igual que
!= Distinto que

El resultado que devuelven estos operadores es 1 para Verdadero y 0 para Falso.

Si hay más de un operador se evalúan de izquierda a derecha. Además los operadores ==


y != están por debajo del resto en cuanto al orden de precedencia.

/* Uso de los operadores relacionales. */

#include <iostream.h>

main() /* Compara dos números entre ellos */


{
int a,b;
cout<<"Introduce el valor de A: ";
cin>>a;
cout<<"Introduce el valor de B: ";
cin>>b;
if(a>b)
cout<<"A es mayor que B";
else if(a<b)
cout<<"B es mayor que A";
else
cout<<"A y B son iguales";

}
UTP -18-

CAPITULO 2.-ESTRUCTURAS DE CONTROL

Las estructuras de control controlan el flujo de ejecución de un programa o función .Las


estructuras de control permiten combinar instrucciones o sentencias individuales en una
simple unidad lógica con un punto de entrada y un punto de salida.
Las instrucciones o sentencias se organizan en tres tipos de estructuras de control que
sirven para controlar el flujo de la ejecución: secuencias, selección (decisión) y repetición.
Hasta este momento solo se ha utilizado el flujo secuencial. Una sentencia compuesta es
un conjunto de sentencias encerradas entre llaves ({ y }) que se utiliza para especificar un
flujo secuencial.

{
Sentencia1;
Sentencia 2;
Sentencia3;
.
.
.
.
Sentencia n;
}

El control fluye de la sentencia 1 a la sentencia 2 y así sucesivamente. Sin embargo, existen


problemas que requieren etapas con dos o más opciones o alternativas elegir en función
del valor de una condición o expresión.

LA SENTENCIA if ( simple )
En c++, la estructura de control de selección principal es una sentencia if. La sentencia if
tiene dos alternativas o formatos posibles. El formato más sencillo tiene la sintaxis
siguiente:

Nota: Las condiciones son expresiones booleanas.


UTP -19-

LA SENTENCIA if else (doble)

Un segundo formato de la sentencia if es la sentencia if-else. este formato de la sentencia


if tiene la siguiente sintaxis:

Nota: Las condiciones son expresiones booleanas.

LA SENTENCIA if- else (Anidadas)

Hasta este momento , las sentencias if implementan decisiones que implican una o dos
alternativas. En esta seccion se mostrara como se puede utilizar la sentencia if para
implementar decisiones que impliquen diferentes alternativas
Una sentencia if es anidada de la rama verdadera o la rama falsa es a su vez una sentencia
if. Una sentencia if anidada se puede utilizar para implementar decisiones con varias
alternativas o multi- alternativas.

Sintaxis:

Nota: Las condiciones son expresiones booleanas.


UTP -20-

Calcular el máximo valor de 2 notas ingresadas por teclado e imprimir si esa nota es
aprobatoria o no (notas de 0-20).
#include<iostream.h>
void main(){
int nota1,nota2,mayor;
cout<<" Ingresar nota 1:"<<endl;
cin>>nota1;
cout<<"Ingresar nota 2:"<<endl;
cin>>nota2;
if(nota1>nota2)
mayor=nota1;
else
mayor=nota2;
cout<<"El mayor nùmero es "<<mayor<<endl;
if(mayor>10)
cout<<"Aprobado”<<endl;
else
cout<<"Desaprobado”<<endl;
}

Diseñe un programa que ingrese el sueldo de un trabajador y calcule el aumento que


obtendrá de la siguiente tabla
SUELDO AUMENTO
Menos 2000 20%
2000<=sueldo<=3000 13%
Sueldo>3000 9%

#include<iostream.h>
void main(){
double sueldo, nuevoSueldo;
cout<<"Ingresar sueldo:"<<endl;
cin>>Sueldo;
if(sueldo<2000)
nuevoSueldo=sueldo*1.20;
else if(sueldo>=2000&&sueldo<=3000)
nuevoSueldo=sueldo*1.13;
else
nuevoSueldo=sueldo*1.09;
cout<<"El nuevo sueldo es:”<<nuevoSueldo<<endl;
}
UTP -21-

EJERCICIOS PROPUESTOS

1) Diseñe un programa que calcule el monto a pagar de una compra de un sòlo producto
considerando un descuento del 35% por la compra de 20 unidades.
2) Diseñe un programa que lea un nùmero entero y muestre lo siguiente: Si es negativo,
par, múltiplo de 5.
3) Se van a publicar la nota de un alumno, dependiendo de su nota se ubicará en una de
la siguientes categorías:
Algoritmos y Estructuras de Datos I Guía de Laboratorio
PROMEDIO CATEGORÍA
18 – 20 Excelente
15 – 17 Bueno
11 – 14 Regular
0 -10 Malo

4) Hallar los valores de x para una ecuación de segundo grado:


02=++cbxax que son dadas por : ()adbraiz21+ = y ()adbraiz22 =, siendo
acbd42 =
5) En una oficina de empleos categorizar a los postulantes en función al sexo y la
edad de acuerdo a lo siguiente :
Si la persona es de sexo femenino: categoría FA si tiene menos de 20 años y FB
caso contrario.
Si la persona es de sexo masculino:categoría MA si tiene menos de 30 años y MB
caso contrario.
6) Una persona està a punto de ver televisión , mostrar si según su edad esta apto para
ver el programa televisivo.

EDAD CATEGORÍA
18 -màs Contenido para adultos
14 -17 Mayores de 14
0 –13 apt

7) Diseñe un programa que lea la temperatura de un día e imprima el tipo de clima


de acuerdo a la siguiente tabla

Temperatura Promedio (TP) Tipo de Clima

TP<=10 Frio
10<TP<=20 Nublado
20<TP<=30 Caluroso
TP30 Trópico
UTP -22-

Condicional Simple
1. Datos del programa el nombre de un trabajador sus horas trabajadas y tarifa
normal, Si tiene horas extras (horas trabajadas mayores a 48 hrs.) calcular y
mostrar:
a. Pago normal
b. Horas extras
c. Pago extras será 10% de incremento de la tarifa normal por cada hora
extra.
d. Sueldo final.

2. Una empresa de transporte vendió una determinada cantidad de boletos


para adulto, ingrese por teclado, el número de primer y ultimo boleto
vendido así como también el precio por boleto. Solo si la cantidad de boletos
vendidos es mayor a 500. Calcular y mostrar.:
a. Importe de boletos vendidos.
b. Incentivo que será 25% del importe de boletos vendidos.

3. Dato del programa un numero cualquiera, solo si el número es múltiplo de 2


y 5 mostrar:
a. El doble del número ingresado.
b. Raíz cúbica del número ingresado.
c. El cubo del número ingresado.

4. Datos del Programa el nombre de un estudiante, año de ingreso y pensión,


solo en caso que el estudiante haya ingresado antes del 2000 calcular y
mostrar:
a. Años transcurridos, son los años que tiene el alumno en su centro de
estudios.
b. Descuento, será 0.7% de la pensión por cada año.
c. Nueva pensión, reste de la pensión descuento.
5. Dato del programa el precio de un producto, si este es mayor a 1000.00
soles increméntelo en 3% en caso contrario en 9%, mostrar el valor del
incremento y el nuevo precio.
6. Dato un numero de dos cifras, en caso que la primera cifra sea mayor
mostrar el cuadrado del número ingresado de no ser así el promedio de las
cifras.

7. Datos del programa el nombre de un cliente, condición de pago (E: efectivo,


C:crédito) y el precio del producto. Calcular y mostrar:
a. Descuento, será 10% del precio siempre que la compra se efectúe en
efectivo, sino cero.
b. Recargo, será 3% del precio si la compra fue a crédito, sino cero.
c. Precio final
UTP -23-

8. Ingresar como datos las horas y minutos respecto a las manecillas de las
agujas de un reloj, se pide calcular el ángulo que forman estas manecillas.
Por ejemplo horas= 3 y minutos= 30 ángulo formado =90

9. Se tiene como datos de ingreso los datos de un triángulo (lado1, lado2 y


lado3) en caso que forme triángulo calcular su área, de lo contrario muestre
un mensaje de error, no se forma triángulo. Para formar un triángulo un lado
siempre tiene que ser menor a la suma de los otros dos lados. Y su área de
la siguiente manera:

L1 + L 2 + L3
P=
2

Area = p ( P − L1)( P − L 2)( P − L3)

10. Escribir un algoritmo que determine si un año es bisiesto. Un año bisiesto es


múltiplo de 4, excepto los múltiplos de 100 que no son bisiesto salvo que a
su vez también sean mútiplos de 400.

11. Ingrese por teclado el tiempo en minutos empleado en una llamada


telefónica, mostrar el importe de la llamada, sabiendo que hasta por los 3
primeros minutos se paga 1.00. Por cada minuto adicional 0.50
12. Ingrese por teclado tres números cualquiera, mostrar el mayor de ellos.
Considerar que los números ingresados son diferentes.
13. Ingrese por teclado tres números cualquiera, mostrar los números ordenados
ascendentemente. Considerar que los números ingresados son diferentes.
14. Ingrese por teclado el nombre y dos notas (parcial y final de peso doble),
calcular su promedio y una observación de acuerdo a:
Promedio Clasificación

00 05 Deficiente
06 10 Malo
11 13 Regular
14 17 Bueno
18 20 Excelente

Intrucciones switch-case

La sentencia switch es una sentencia c++ que se utiliza para seleccionar una de entre
multiples alternativas.La sentencia switch es especialmente util cuando la selección se basa
en el valor de una variable simple o de una expresión simple denominada expresión de
UTP -24-

control o seledtor.El valor de esta expresión puede ser de tipo int o char , pero no de tipo
double.

switch( selector)
{
case etiqueta1 : { ………… break; }
case etiqueta2 : { …………. break; }
case etiquetan: { …………. break; }

default:{ ………. }

La expresión de control o selector se evalúa y se compara con cada una de las etiquetas de
case .La expresión selector debe ser un tipo ordinal(por ejemplo, int ,char pero no flota o
double) Cada etiqueta es un valor único , constante y cada etiqueta debe tener un valor
diferente de los otros . si el valor de la expresión selector es igual a una de las etiquetas
case – por ejemplo , etiqueta1- entonces la ejecución comenzara con la primera sentencia
de la secuencia secuencia n y continuación hasta que se encuentre una sentencia break(
o hasta que se encuentra el final de la sentencia de control switch)

Escriba un programa que lea un número desde el teclado entre 1 y 7 e imprima el nombre
del día de semana correspondiente. ( lunes, martes,...etc).
#include<iostream.h>
void main(){
int dia;

cout<<"Ingresar dia [1…7]:"<<endl;


cin>>dia;
switch(dia){
case 1: cout<<"Lunes”<<endl; break;
case 2: cout<<" Martes”<<endl; break;
case 3: cout<<" Miercoles”<<endl; break;
case 4: cout<<" Jueves”<<endl; break;
case 5: cout<<" Viernes”<<endl; break;
case 6: cout<<" Sabado”<<endl; break;
UTP -25-

case 7: cout<<" Domingo”<<endl; break;

Diseñe un programa que calcule el costo de un paciente, el costo depende del tipo de
enfermedad. De acuerdo a la siguiente tabla
TIPO ENFERMEDAD COSTO
1 122
2 150
3 200

#include<iostream.h>
void main(){
int tipo;
double costo;

cout<<" Ingresar tipo de enfermedad :"<<endl;


cin>> tipo;
switch(tipo){
case 1: costo=122; break;
case 2: costo=150; break;
case 3: costo=200; break;
}
cout<<" El costo del paciente es:”<< costo <<endl;

}
UTP -26-

EJERCICIOS PROPUESTOS

1) Un instituto ofrece cursos de programación, el costo de los cursos es de la siguiente


manera:

Básico Intermedio Avanzado


Profesor 50 70 100
Alumno 40 50 80
Externo 70 100 120

Se pide elaborar un programa para emitir el recibo por dicho curso, los datos que se
mostraran en el recibo son: nombre del participante, costo del curso y nivel del curso.

2) Escriba un programa que lea un número desde el teclado entre 1 y 12 e imprima el


nombre del mes del año correspondiente. ( Enero, Febrero,...etc).

3) Ingresar una fecha y calcular: el número de días de ese mes e identificar si el año es
bisiesto.

4) Diseñe un programa que ingrese el día, el mes y el año y calcule el numero de día
transcurridos a partir del 1 de enero
UTP -27-

Uso de la sentencia do....while:


La estructura do....while repite una acción o un conjunto de acciones mientras sea
verdadera una determinada condición, para lo cual ejecuta primera la acción y luego
verifica la condición. La acción puede ser una acción simple o una acción compuesta
(bloque de acciones encerradas en llaves).

do{
accion1;
accion2;
..
..
} while(condición)
Se usa la sentencia do..while para hacer validación de entrada de datos.
Ejemplo
Se necesita ingresar un número de 3 cifras:
Se necesita ingresar sexo(F/M):

char sexo;
do{

cout<<" ingrese sexo [F/M] :"<<endl;


cin>>sexo;

}while ( sexo!=’F’ && sexo!=’M’));

int n;
do{
cout<<" ingrese numero de 3 cifras”<< endl;
cin>>n;
}while ( ! (n>=100 && n<=999));
UTP -28-

Se necesita ingresar sexo(F/M):

char sexo;
do{
cout<<" ingrese sexo [F/M]”<< endl;
cin>>sexo;
}while ( sexo!=’F’ && sexo!=’M’));

Repetición de la ejecución del programa

void main(){
int op;
do{
// todo el programa ……
//……………………….
cout<<" Desea continuar [S=1/N=0]”<< endl;
cin>>op;
}while ( op==1);
}
UTP -29-

Uso de la sentencia while

La estructura while repite una acción o un conjunto de acciones mientras sea verdadera una
determinada condición, para lo cual primero verifica la condición y luego ejecuta la acción.
La acción puede ser una acción simple o una acción compuesta (bloque de acciones
encerradas en llaves).

while(condición){
accion1;
accion2;
..
}

Uso de contadores y acumuladores

Los contadores son variables del tipo entero cuya función es la de contar.
Los acumuladores son variables que almacenan sumas o productos. El tipo de variable
depende del tipo del cual se esta acumulando.
Los acumuladores de suma se inicializan en cero.
Los acumuladores de producto se inicializan en uno.

int c=0; // contador


int suma=0; //acumulador de suma de enteros
UTP -30-

Uso de menú
Para la creación de un menú tenemos que colocar lo siguiente:

int op; // (1 ) variable de lectura de opcion


do{

cout<<" “******** Menu ***********”);


cout<<" [ 1 ]Ingreso de datos” << endl;
cout<<" [ 2 ]Mostrar resultados ” << endl;
cout<<" [ 3 ]Salir” << endl;);
cout<<" Ingrese su opcion:” << endl;
cin>>op;
// ( 4 ) sentencia condicional para ejecutar las opciones
switch(op){
case 1: {// ingreso de datos
break; }
case 2:{ // mostrar resultados
break; }
}
}while(op!=3); // (2) sentencia do_while para ejecutar el menu

Impresión del menu


UTP -31-

Ejercicios
Diseñe un programa que reciba un 5 números enteros de 2 cifras y muestra la suma de ellos
y cantidad de pares e impares

#include<iostream.h>
void main(){
int num;
int suma=0; //acumulador
int cp=0, ci=0, c=0; // contadores
while(c<5){
// validando que sea de 2 cifras
do{
cout<<"Ingrese numero de 2 cifras” << endl;
cin>>num;
}while( !(num>=20&&num<=0));
// fin de validación
suma=suma+num;
if(num%2==0)
cp++;
else
ci++;
}
cout<<"La suma de los numeros es:” <<suma<< endl;;
cout<<"La cantidad de pares es :” <<cp<< endl;
cout<<"La cantidad de impares es :”<<ci<<endl;
}
}
UTP -32-

Ejercicios Propuestos
1) Diseñe un programa que ingrese las edades de 10 alumnos y que calcule lo siguiente:
• Suma de todas la edades
• Promedio de edades
• Promedio de edades pares
• Edad máxima
• Edad mínima

2) Elabore un programa para calcular el factorial de un numero entero positivo

3) Elabore un programa para calcular la cantidad de dígitos, la suma de dígitos, la cantidad


de dígitos par e impar de un número entero.

4) Diseñe un programa que imprima la tabla de multiplicar de un número n.


Dado un número natural escrito en base 10 encuentre su correspondiente en binario.

5) El proceso a seguir para transformar un número escrito en decimal a su correspondiente


en binario consiste en dividir el número en decimal entre 2, el residuo es el primer dígito
(de la derecha) del número en binario, se divide el cociente resultante de la división anterior
entre dos y el residuo es el segundo dígito (de la derecha) del número en binario, se
continúa este proceso hasta que el cociente de la división es 0. Ejemplo: Suponga que el
número en decimal que se desea transformar a su equivalente en binario es el 11:

Por lo tanto, (11)10 = (1011)2


UTP -33-

6) Escribe un algoritmo que lea un número natural N y un carácter. La salida debe ser un
rombo compuesto del carácter y de la anchura que especifica el número N. Por ejemplo, si
N es 5 y el carácter es *, el rombo sería:

*
**
***
****
*****
****
***
**
*

7) Escribe un algoritmo que imprima una pirámide de dígitos como la de la figura, tomando
como entrada el número de filas de la misma.

1
121
12321
1234321
123454321
UTP -34-

Uso de la sentencia for


La estructura de repetición for contempla todos los elementos de la repetición controlada
por contador (repetición en la que se conoce el numero de veces que se repetirá el cuerpo
del bucle) al incluir al contador como parte de la propia estructura.

for(inicialización; condición; incremento/decremento)


{
accion1;
accion2;
}

Ejemplo
Diseñe un programa que imprima la serie:
1,2,3,4,......n

int n ;
cin>>n;
for(int i=1;i<=n; i++){
cout<<i;
}

Diseñe un programa que imprima la serie:


1
2
3
..
n

int n;
cin>>n;
for(int i=1;i<=n; i++){
cout<<i<<endl;
}
UTP -35-

Ejercicio
Diseñe un programa que imprima una tabla de cuadrados y de cubos para los números del 1
al 10.
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

#include<iostream.h>
void main(){
for (int i=1;i<=10;i++)
cout<<i<<"\t"<<(i*i)<<"\t"<<(i*i*i)<<endl;
}

Ejercicio
Diseñe un programa para calcular la suma e imprimir de N términos de la siguiente serie
S = 1- 2 + 3- 4 + 5- 6...........
#include<iostream.h>
void main(){
int n;
int s=0;
cout<<“Ingrese n”<<endl;
cin>>n;
for (int i=1;i<=n; i++)
if (i==1){
s=s+i;
cout<<i;
}
else{
if(i%2==0){
s=s-i;
cout<<“-“<< i;
}
UTP -36-

else{
s=s+i;
cout<<“+”<<i;
}
}
}
cout<<“La suma de la serie es:”<<s<<ende;
}

Ejercicio
Diseñe un programa que imprima lo siguiente
%
%%
%%%
%%%%
%%%%%
%%%%%%
%%%%%%%

#include<iostream.h>
void main(){
for (int i=1;i<=7;i++)
for (int j=1;j<=i;j++)
cout<<“%”;
cout<<”\n”;
}
}
Ejercicio
Diseñe un programa que lea Nombre y edad de 5 alumnos y calcule la edad promedio asi
como también la mayor edad
#include<iostream.h>
void main(){
char nombre[50];
int edad;
int s=0, max=-1;
double p;
// ingreso de datos for (int i=1;i<=5;i++){
cout<<“Ingrese nombre”<<endl;
cin>>nombre;
cout<<“ Ingrese edad”<<endl;
cin>>edad;
s=s+edad
if(edad>max)
max=edad;
}
p=(double) s/5;
cout<<“El promedio de edades es:”<<+p<<endl;
UTP -37-

cout<<“La mayor edad es:”<<max<<endl;


}

Ejercicios Propuestos
1. Diseñe un programa que imprima N términos de la siguiente serie:
3, 8, 15, 24………
2. Diseñe un programa que halle los 3 primeros números perfectos
3. Diseñe un programa para hallar la suma de N términos de la siguiente serie:
2 2 2 2
1 + 1/3 + 1/5 + 1/7 + 1/9 +............................

4. Escriba un pequeño programa para imprimir los primeros cien números naturales
haciendo una pausa cada vez que se llene la pantalla e indicando con un mensaje adecuado
que al oprimir una tecla la lista continuará.

5. Escriba un programa que imprima los primeros n números naturales pares. Valide el
valor de n y emita un mensaje de error si no es natural.

6. Escribe un algoritmo que lea un número natural N y dibuje un triángulo de asteriscos con
base y altura N. Por ejemplo si N=5 debería dibujarse:

*
**
***
****
*****

7. Escriba un programa para calcular e imprimir todos los números enteros comprendidos
entre 100 y 999 tales que sean iguales a la suma de los cubos de sus dígitos, es decir, los
números de la forma abc, con:

abc = a3 + b 3 + c3

8. Dado un número natural n encuentre otro entero m que sea n al revés, invirtiendo el
orden de los dígitos y diga si n es un palíndromo. Si n es un palíndromo, entonces se lee
igual de izquierda a derecha que de derecha a izquierda.
Por ejemplo, si n es 242, entonces m será 242, por lo tanto n es un palíndromo. Mientras
que si n es 254, entonces m será 452, por lo tanto n no es palíndromo.
UTP -38-

CAPITULO 3.- FUNCIONES


Tiempo de vida de los datos

Según el lugar donde son declaradas puede haber dos tipos de variables.

Globales: las variables permanecen activas durante todo el programa. Se crean al


iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en
cualquier función.

Locales: las variables son creadas cuando el programa llega a la función en la que
están definidas. Al finalizar la función desaparecen de la memoria.

Si dos variables, una global y una local, tienen el mismo nombre, la local
prevalecerá sobre la global dentro de la función en que ha sido declarada.

Dos variables locales pueden tener el mismo nombre siempre que estén declaradas
en funciones diferentes.

/* Variables globales y locales. */

#include <iostream.h>

int num1=1;
void main() /* Escribe dos cifras */
{
int num2=10;
cout<<num1<<endl;
cout<<num2;

Funciones

Las funciones son bloques de código utilizados para dividir un programa en partes
más pequeñas, cada una de las cuáles tendrá una tarea determinada.

Su sintaxis es:

tipo_función nombre_función (tipo y nombre de argumentos)


{
bloque de sentencias
}

tipo_función: puede ser de cualquier tipo de los que conocemos. El valor devuelto
por la función será de este tipo. Por defecto, es decir, si no indicamos el tipo, la
función devolverá un valor de tipo entero ( int ). Si no queremos que retorne ningún
valor deberemos indicar el tipo vacío ( void ).

nombre_función: es el nombre que le daremos a la función.


UTP -39-

tipo y nombre de argumentos: son los parámetros que recibe la función. Los
argumentos de una función no son más que variables locales que reciben un valor.
Este valor se lo enviamos al hacer la llamada a la función. Pueden existir funciones que
no reciban argumentos.

bloque de sentencias: es el conjunto de sentencias que serán ejecutadas cuando se


realice la llamada a la función.

Las funciones pueden ser llamadas desde la función main o desde otras funciones.
Nunca se debe llamar a la función main desde otro lugar del programa. Por último
recalcar que los argumentos de la función y sus variables locales se destruirán al
finalizar la ejecución de la misma.

10.3.- Declaración de las funciones

Al igual que las variables, las funciones también han de ser declaradas. Esto es lo
que se conoce como prototipo de una función. Para que un programa en C sea
compatible entre distintos compiladores es imprescindible escribir los prototipos de las
funciones.

Los prototipos de las funciones pueden escribirse antes de la función main o bién
en otro fichero. En este último caso se lo indicaremos al compilador mediante la
directiva #include.

En el ejemplo adjunto podremos ver la declaración de una función ( prototipo ). Al


no recibir ni retornar ningún valor, está declarada como void en ambos lados. También
vemos que existe una variable global llamada num. Esta variable es reconocible en
todas las funciones del programa. Ya en la función main encontramos una variable
local llamada num. Al ser una variable local, ésta tendrá preferencia sobre la global.
Por tanto la función escribirá los números 10 y 5.

/* Declaración de funciones. */

#include <iostream.h>

void funcion(void); /* prototipo */


int num=5; /* variable global */
void main() /* Escribe dos números */
{
int num=10; /* variable local */
cout<<num<<endl;
funcion(); /* llamada */
}

void funcion(void){
cout<<num;
}

Paso de parámetros a una función

Como ya hemos visto, las funciones pueden retornar un valor. Esto se hace
mediante la instrucción return, que finaliza la ejecución de la función, devolviendo o
UTP -40-

no un valor.

En una misma función podemos tener más de una instrucción return. La forma de
retornar un valor es la siguiente:

return ( valor o expresión );

El valor devuelto por la función debe asignarse a una variable. De lo contrario, el


valor se perderá.

En el ejemplo puedes ver lo que ocurre si no guardamos el valor en una variable.


Fíjate que a la hora de mostrar el resultado de la suma, en el cout, también podemos
llamar a la función.

/* Paso de parámetros. */
#include <iostream.h>

int suma(int,int); /* prototipo */


void main() /* Realiza una suma */
{
int a=10,b=25,t;
t=suma(a,b); /* guardamos el valor */
cout<<"a+b= <<t;
}

int suma(int a,int b){


return (a+b);
}
Ahora veremos lo que se conoce como paso de parámetros.

Existen dos formas de enviar parámetros a una función:

Por valor: cualquier cambio que se realice dentro de la función en el argumento


enviado, NO afectará al valor original de las variables utilizadas en la llamada. Es
como si trabajaramos con una copia, no con el original. No es posible enviar por valor
arrays, deberemos hacerlo por referencia.

Por referencia: lo que hacemos es enviar a la función la dirección de memoria


donde se encuentra la variable o dato. Cualquier modificación SI afectará a las
variables utilizadas en la llamada. Trabajamos directamente con el original.

/* Paso por valor. */


#include <iostream.h>
void intercambio(int,int);
void main() /* Intercambio de valores */
{
int a=1,b=2;
cout<<"a= <<a<<endl;
cout<< b= <<b<<endl;
intercambio(a,b); /* llamada */
cout<<a<< , <<b;
}
UTP -41-

void intercambio (int x,int y)


{
int aux;
aux=x;
x=y;
y=aux;
cout<<"a= <<x<<endl;
cout<< b= <<y<<endl;

Para enviar un valor por referencia se utiliza el símbolo & ( ampersand ) delante de la
variable enviada. Esto le indica al compilador que la función que se ejecutará tendra
que obtener la dirección de memoria en que se encuentra la variable.

Vamos a fijarnos en los ejemplos. En el ejemplo anterior podrás comprobar que


antes y después de la llamada, las variables mantienen su valor. Solamente se
modifica en la función intercambio ( paso por valor ).

En el siguiente ejemplo podrás ver como las variables intercambian su valor tras la
llamada de la función ( paso por referencia ).

Las variables con un * son conocidas como punteros, el único dato en 'C' que
puede almacenar una dirección de memoria.

/* Paso por referencia. */

#include <iostream.h>

void intercambio(int *,int *);

void main() /* Intercambio de valores */


{
int a=1,b=2;
cout<<"a= a<<endl;
cout<< b= <<b<<endl;
intercambio(&a,&b); /* llamada */
}

void intercambio (int *x,int *y)


{
int aux;
aux=*x;
*x=*y;
*y=aux;
cout<<"a= <<*x<< , << b=<<*y;

}
UTP -42-

Los argumentos de la función main

Ya hemos visto que las funciones pueden recibir argumentos. Pues bién, la función
main no podía ser menos y también puede recibir argumentos, en este caso desde el
exterior.

Los argumentos que puede recibir son:

argc: es un contador. Su valor es igual al número de argumentos escritos en la


línea de comandos, contando el nombre del programa que es el primer argumento.

argv: es un puntero a un array de cadenas de caracteres que contiene los


argumentos, uno por cadena.

En este ejemplo vamos a ver un pequeño programa que escribirá un saludo por
pantalla (Programa : ARGUMENTO.C).

/* Argumentos de la main. */

#include <iostream.h>

main(int argc,char *argv[]) /* argumentos */


{
cout<<"\nCurso de Programación en C\n";
cout<<"Programa de ejemplo.\n\n";
if (argc<2)
{
cout<<"Teclee: ARGUMENTO su_nombre";
exit(1); /* fin */
}
cout<<"Hola: <<argv[1];

}
UTP -43-

PROBLEMAS PROPUESTOS

1. Especifique el resultado que se obtiene al ejecutar el siguiente programa.

#include <iostream.h>

void velresult (int distancia, int tiempo ) {


float vel;
vel = (float) distancia / tiempo;
cout<< La velocidad Kmph: <<vel;
}

void main ( )
{
int distancia, tiempo;
distancia = 100;
tiempo = 2;
velresult (distancia, tiempo);
velresult (400, 10);
}

2. Escriba una función llamada bisuma que calcule la suma de dos variables num1
y num2 enteras y regrese un resultado entero.

3. Escriba una función llamada media_de_3 que reciba como parámetro un dato
entero y lo divida entre 3. Suponga que el dato enviado a la función es el total
de sumar 3 números, por lo que el resultado de esta función será la media de
los 3 datos.

4. Escriba un programa completo que lea tres valores enteros para las variables a,
b, c, que enseguida invoque a las funciones bisuma y media_de_3 de los
ejercicios anteriores y que, por último, despliegue el valor promedio de los tres
datos con un mensaje apropiado. ¿Qué cambios necesitaría realizar a las
funciones para obtener el promedio de más de 3 datos?

5. Escriba una función llamada cuadrado que tenga un parámetro de entrada


llamado longitud y entregue como resultado el perímetro del cuadrado cuyo
lado sea la longitud especificada y su área. Todas las variables son reales.

6. Escriba una función llamada magnitud que tenga cuatro parámetros de entrada
llamados x1, x2, y1, y2 y que entregue como resultado la distancia entre dos
puntos cuyas coordenadas son (x1, y1) y (x2, y2) según la siguiente fórmula:

dist = ( y 2 − y1 ) 2 + ( x 2 − x1 ) 2
UTP -44-

7. Un piso rectangular que mide 12 metros por 15 metros está cubierto


parcialmente por tapetes circulares. El radio de un tapete es un metro. El radio
del otro es de dos metros.

Escriba un programa que encuentre el área de la parte del piso que está
descubierta.

El programa deberá tener:

a) Una función que reciba como parámetro el radio de un círculo y que


regrese el valor del área de ese círculo. Suponga que el radio y el área
son reales.

b) Una función con dos parámetros reales que calcule el área de un


rectángulo de base y altura dadas.

8. Escriba una función llamada digfinal que tenga un parámetro de entrada


llamado número y que entregue como resultado el dígito de las unidades del
número. Por ejemplo, si el número es 234, el resultado es 4.

9. Escribe una función que tome 3 parámetros: dos de tipo enteros y uno de tipo
carácter. La función deberá sumar, restar, multiplicar o dividir los valores de los
dos primeros parámetros dependiendo del código indicado en el tercer
parámetro, y devolver el resultado.

10. Escribe una función que devuelva el (a) factorial, (b) n-simo número de
Fibonacci, de su argumento.

11. Escribe una función que diga si sus dos argumentos son múltiplo el uno del otro
(no importa cuál de cuál).

12. Escribe una función que devuelva si su argumento n es o no es primo.

NOTA: Tener en cuenta que basta con probar la divisibilidad por los números
desde el 2 hasta la ,n . Lo cual ahorra muchas operaciones. Si además
consideramos que basta con saber si es par o no al principio, podemos
ahorrarnos la mitad de las pruebas de divisores, eliminando todos los
pares. Por fin una última mejora, importante, es eliminar los múltiplos de
tres.

13. Escribe una función que devuelva el n-símo número primo (1 es el primero),
recibiendo n como argumento.

14. Escribe una función que escriba los números primos hasta el numero que se le
pasa como parámetro.
UTP -45-

CAPITULO 4.- ARRAYS


Un array es un identificador que referencia un conjunto de datos del mismo tipo.
Imagina un tipo de dato int; podremos crear un conjunto de datos de ese tipo y
utilizar uno u otro con sólo cambiar el índice que lo referencia. El índice será un valor
entero y positivo. En C los arrays comienzan por la posición 0.

Vectores

Un vector es un array unidimensional, es decir, sólo utiliza un índice para


referenciar a cada uno de los elementos. Su declaración será:

tipo nombre [tamaño];

El tipo puede ser cualquiera de los ya conocidos y el tamaño indica el número de


elementos del vector ( se debe indicar entre corchetes [ ] ). En el ejemplo puedes
observar que la variable i es utilizada como índice, el primer for sirve para rellenar el
vector y el segundo para visualizarlo. Como ves, las posiciones van de 0 a 9 ( total 10
elementos ).

/* Declaración de un array. */

#include <iostream.h>

void main() /* Rellenamos del 0 - 9 */


{
int vector[10],i;
for (i=0;i<10;i++) vector[i]=i;
for (i=0;i<10;i++) cout<<vector[i]<<endl;
}

Podemos inicializar (asignarle valores) un vector en el momento de declararlo. Si lo


hacemos así no es necesario indicar el tamaño. Su sintaxis es:

tipo nombre []={ valor 1, valor 2...}

Ejemplos:

int vector[]={1,2,3,4,5,6,7,8};
char vector[]="programador";
char vector[]={'p','r','o','g','r','a','m','a','d','o','r'};

Una particularidad con los vectores de tipo char (cadena de caracteres), es que
deberemos indicar en que elemento se encuentra el fin de la cadena mediante el
caracter nulo (\0). Esto no lo controla el compilador, y tendremos que ser nosotros los
que insertemos este caracter al final de la cadena.

Por tanto, en un vector de 10 elementos de tipo char podremos rellenar un


máximo de 9, es decir, hasta vector[8]. Si sólo rellenamos los 5 primeros, hasta
vector[4], debemos asignar el caracter nulo a vector[5]. Es muy sencillo:
vector[5]='\0'; .
UTP -46-

Ahora veremos un ejemplo de como se rellena un vector de tipo char.

/* Vector de tipo char. */

#include <iostream.h>

void main() /* Rellenamos un vector char */


{
char cadena[20];
int i;
for (i=0;i<19 && cadena[i-1]!=13;i++)
cadena[i]=getche( );
if (i==19) cadena[i]='\0';
else cadena[i-1]='\0';
cout<<cadena<<endl;
}

Podemos ver que en el for se encuentran dos condiciones:

1.- Que no se hayan rellenado todos los elementos (i<19).

2.- Que el usuario no haya pulsado la tecla ENTER, cuyo código ASCII es 13.
(cadena[x-i]!=13).

También podemos observar una nueva función llamada getche( ), que se


encuentra en conio.h. Esta función permite la entrada de un caracter por teclado.
Después se encuentra un if, que comprueba si se ha rellenado todo el vector. Si es
cierto, coloca el caracter nulo en el elemento nº20 (cadena[19]). En caso contrario
tenemos el else, que asigna el caracter nulo al elemento que almacenó el caracter
ENTER.

En resumen: al declarar una cadena deberemos reservar una posición más que la
longitud que queremos que tenga dicha cadena.

Llamadas a funciones con arrays

Como ya se comentó en el tema anterior, los arrays únicamente pueden ser


enviados a una función por referencia. Para ello deberemos enviar la dirección de
memoria del primer elemento del array. Por tanto, el argumento de la función deberá
ser un puntero.

/* Envío de un array a una función. */

#include <iostream.h>

void visualizar(int []); /* prototipo */


void main() /* rellenamos y visualizamos */
{
int array[25],i;
for (i=0;i<25;i++)
{
UTP -47-

cout<<"Elemento:"<<(i+1)<< ;
cin>>array[i];
}
visualizar(&array[0]);
}

void visualizar(int array[]) /* desarrollo */


{
int i;
for (i=0;i<25;i++) cout<<array[i]<<endl;
}

En el ejemplo se puede apreciar la forma de enviar un array por referencia. La función


se podía haber declarado de otra manera, aunque funciona exactamente igual:

declaración o prototipo
void visualizar(int *);

desarrollo de la función
void visualizar(int *array)

Matrices

Una matriz es un array multidimensional. Se definen igual que los vectores excepto
que se requiere un índice por cada dimensión.

Su sintaxis es la siguiente:

tipo nombre [tamaño 1][tamaño 2]...;

Una matriz bidimensional se podría representar gráficamente como una tabla con
filas y columnas.

La matriz tridimensional se utiliza, por ejemplo, para trabajos gráficos con objetos
3D.

En el ejemplo puedes ver como se rellena y visualiza una matriz bidimensional. Se


necesitan dos bucles para cada una de las operaciones. Un bucle controla las filas y
otro las columnas.

/* Matriz bidimensional. */

#include <iostream.h>

void main() /* Rellenamos una matriz */


{
int x,i,numeros[3][4];
/* rellenamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
cin>>numeros[x][i];
/* visualizamos la matriz */
UTP -48-

for (x=0;x<3;x++)
for (i=0;i<4;i++)
cout<<numeros[x][i]<<endl;
}

Si al declarar una matriz también queremos inicializarla, habrá que tener encuenta el
orden en el que los valores son asignados a los elementos de la matriz. Veamos
algunos ejemplos:

int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

quedarían asignados de la siguiente manera:

numeros[0][0]=1 numeros[0][1]=2 numeros[0][2]=3 numeros[0][3]=4


numeros[1][0]=5 numeros[1][1]=6 numeros[1][2]=7 numeros[1][3]=8
numeros[2][0]=9 numeros[2][1]=10 numeros[2][2]=11 numeros[2][3]=12

También se pueden inicializar cadenas de texto:

char dias[7][10]={"lunes","martes","miércoles","jueves","viernes","sábado",
"domingo"};

Para referirnos a cada palabra bastaría con el primer índice:

cout<<dias[i]);
UTP -49-

PROGRAMAS DE APLICACIÓN - ARRAY


1. METODO DE ORDENAMIENTO POR BURBUJA

/*Programa que realiza una ordenacion por el metodo de la burbuja*/

#include <iostream.h>
#include <conio.h>
#define N 100 /*Maximo de elementos en el arreglo*/

void main()
{
int a[N];/*Declaracion del arreglo unimensional*/
int i,j,aux,sw,n;
cout<<" tama¤o del vector ";
cin>>&n;/*Tamaño del arreglo en el programa*/
cout<<"\n Valores del vector :\n";
for (i=0; i<n; i++)
cin>>a[i]);/*lectura de elementos que estaran en el
arreglo*/
i=1;
sw=0;/*variable para interrumpir el ordenamiento cuando
ya esta ordenado el arreglo*/
aux=0;/*variable auxiliar para el intercambio de valores del arreglo*/
while (sw!=1){
sw=1;
for (j=0; j<=n-i; j++) {
if (a[j] > a[j+1]) {/*obtiene el elemento a ordenar*/
aux=a[j]; /*copia el valor en la posicion
actual a la variable auxiliar*/
a[j]=a[j+1];/*copia el valor de la posicion
siguiente a la posicion actual*/
a[j+1]=aux; /*copia al valor de la variable auxiliar
a la posicion siguiente*/
sw=0;
}
}
i=i+1;
}
cout<<"El vector ordenado es :\n";
for (i=0; i<n; i++)
cout<<(a[i]<<endl;/*impresion de los elementos en el arreglo en
forma ordenada*/
getch();
return(0);
}
UTP -50-

2.- METODO DE ORDENAMIENTO POR INSERCION

/*Metodo de Ordenacion por Insercion*/

#include <iostream.h>
#include <conio.h>
#define N 100/*Elementos maximos en el arreglo*/

main ()
{
int a[N];/*declaracion del arreglo*/
int i, n, p, u;
int k, j, c, aux;

cout<<"Total de elementos del vector :";


cin>> n;/*Total de elementos en el arreglo*/
cout<<"Valores del vector :\n";
for (i=1; i<=n; i++)
cin>>a[i]);/*lectura y almacenamiento de los elementos en el arreglo*/
aux=0;/*variable auxiliar para copiar los elementos*/
c=0;/*nueva posicion en el arreglo*/
for (k=2; k<=n; k++){
aux=a[k];/*copia el elemento de la posicion k del arreglo a una
variable auxiliar*/
p=1;/*posicion a partir del cual empezara a comparar los elementos*/
u=k-1;/*posicion en el arreglo*/
while (p<=u){/*compara las posiciones*/
c=(p+u)/2;/*obtiene la nueva posicion del arreglo para
comparar*/
if (aux < a[c])/*compara el contenido del arreglo en la nueva
posicion y el valor de la variable auxiliar(elemento)*/
u=c-1;/*decrementa la posicion del arreglo*/
else
p=c+1;/*incrementa la posicion del arreglo en uno*/
}
for (j=k-1 ;j>=p; j--)/*busca la posicion del elemento a cambiar*/
a[j+1]=a[j];/*cambia el elemento en el arreglo que esta
contenido en aux por el nuevo elemento*/
a[p] = aux;/*cambia el elemento contenido en la posicion p del arreglo
por el elemento contenido en aux y empieza a ordenar el arreglo*/
}
cout<<"\n El vector ordenado es: \n";
for (i = 1; i<=n; i++)
cout<<a[i]<<endl;/*impresion del arreglo ordenado/
getch();
return 0;
}
UTP -51-

3.- ORDENAMIENTO POR SELECCIÓN

/*Metodo de Ordenacion por Seleccion*/

#include "iostream.h"
#include "conio.h"
#define N 100 /*Maximo de elementos*/

void main()
{

int a[N];/*Declaracion del arreglo*/


int i, j, k, menor, n;

cout<<"Introduzca el tamaño del vector \n \n";


cin>>n;/*Total de elemetos en el arreglo*/

cout<<"\n Introduce los elementos \n";


for (i=0; i<n; i++)
cin>>a[i];/*Lee y almacene los elementos en el arreglo*/

for (i=0; i<n-1; i++) {


menor=a[i];/*obtiene el elemento en la posicion actual a i*/
k=i;/*k toma la posicion i*/
for (j=i+1; j<n; j++){/*empieza a recorrer el arreglo una posicion adelante
a la de i*/
if (a[j] < menor){/*si el elemento en la posicion j del arreglo es
menor que el elemento contenido en menor*/
menor=a[j]; /*menor toma el elemento contenido en j*/
k=j;/*k toma la posicion j*/
}
}
a[k]=a[i];/*almacena en la posicion k del arreglo el elemento contenido en
la posicion i del arreglo*/
a[i]=menor;/*almacena el elemento contenido en menor en el arreglo en la
posicion i*/
}

cout<<"\t El vector ordenado es \n";


for (i=0; i<n; i++)
cout<<a[i]<<endl;/*imprime el arreglo ordenado*/
getch();

return 0;
}
UTP -52-

4.- ORDENAMIENTO POR METODO SHELL

/*Metodo de Ordenacion por Shell*/

#include <iostream.h>
#include <conio.h>
#define N 100/*Maximo de elementos*/
void main()
{

int a[N];/*declaracion del arreglo*/


int i, j, k, aux, inc, n;

cout<<"Introduzca el tamaño del vector \n \n";


cin>>n);/*tama¤o del arreglo*/

cout<<"\n Introduce los elementos \n";


for (i=1; i<=n; i++)
cin>>a[i];/*lee y almacena los elementos en el arreglo*/

inc=n/2;/*obtiene el valor de incremento para empezar a ordenar*/


while (inc>0) {
for (i=inc+1; i<=n; i++) {
j=i-inc;/*obtiene la posicion inicial del arreglo*/
while (j>0){
if (a[j] > a[j+inc]){/*obtiene el mayor de los elementos*/
aux=a[j];/*alamacena en la variable auxiliar aux el
elemento mayor*/
a[j]=a[j+inc];/*copia el elemento menor a la
posiscion en donde se encontraba el elemento mayor*/
a[j+inc]=aux;/*copia elemento mayor contenido en
aux a la posicion del arreglo en donde se encontraba el elemento menor*/
j=j-inc;/*decrementa la posicion del arreglo*/
}
else
j=0;
}
}
inc=inc/2;/*obtiene el valor de incrementos para empezar a ordenar*/
}

cout<<"\t El vector ordenado es \n";


for (i=1; i<=n; i++)
cout<<a[i]<<endl;/*Imprime el arreglo ordenado*/
getch();
return 0;
}
UTP -53-

5.- Metodo de Ordenacion por Quick Short

#include <iostream.h>
#include <conio.h>
#define N 100/*maximo de elementos*/
#define M 50 /*mitad de elementos que N*/

main(){
int mayor[M]={0}, /*arreglo auxiliar*/
menor[M]={0}, /*arreglo auxiliar*/
a[N]={0};/*arreglo principal*/
int aux, /*variable auxiliar para intercambio de elementos*/
n, /*tama¤o del arreglo*/
ban;
int der, /*posicion a la derecha*/
izq, /*posicion a la izquierda*/
top; /*tope del arreglo*/
int ini, /*posicion inicio*/
fin, /*posicion final*/
pos, /*posicion*/
i;

cout<<"Introduzca el tamaño del vector \n \n";


cin>>n);/*lee el tama¤o del arreglo*/

cout<<"valores para el vector: \n \n";


for (i=1; i<=n; i++)
cin>>a[i];/*lee y almacena los elementos en el arreglo principal*/

top=1; /*inicio del tope del arreglo*/


menor[top]=1; /*almacena el valor 1 en la posicion top del arreglo menor*/
mayor[top]=n; /*almacena el valor de n(tama¤o del arreglo) en la posicion
top del arreglo mayor*/

while (top > 0) {/*Mientras la posicion top sea mayor que 0*/
ini=menor[top];/*ini toma el elemento contenido en la posicion top del
arreglo menor*/
fin=mayor[top];/*fin toma el elemento contenido en la posicion top del
arreglo mayor*/
top--;/*decrementa la posicion top menos uno*/
izq=ini;/*izq toma el valor de ini*/
der=fin;/*der toma el valor de fin*/
pos=ini;/*pos toma el valor de ini*/
ban=1;/*variable de desicion a ordenar toma el valor 1*/

while (ban){/*mientras ban valga 1*/


while ((a[pos]<=a[der]) && (pos!=der))/*disminuye el valor de der
si el valor del elemento en a[pos] es menor*/
der--; /*que a[der] y ademas pos es diferente que der*/
UTP -54-

if (pos==der)/*si las posiciones son iguales*/


ban=0; /*cambia el valor de ban*/
else{/*hace el cambio de elementos*/
aux=a[pos];/*aux toma el valor mayor contenido en la
posicion pos del arreglo*/
a[pos]=a[der];/*el arreglo en la posicion pos almacena el
valor menor contenido en la posicion derecha*/
a[der]=aux;/*el arreglo en la posicion der toma el elemento
mayor contenido en aux*/
pos=der;/*la variable de posicion pos toma el valor de la
nueva posicion contenida en der*/
while ((a[pos] >= a[izq]) && (pos != izq))
/*mientras el elemento contenido en la posicion pos del arreglo sea mayor o igual*/
izq++;
/*que el elemento contenido en la posicion izq del arreglo y el valor de pos sea diferente
del valor de izq incrementa el valor de izq mas uno*/
if (pos==izq)
/*si las posiciones son iguales cambia el valor de ban*/
ban=0;
else{
/*si el valor contenido en la posicion pos es menor que el contenido en la posicion izq del
arreglo hace el cambio*/
aux=a[pos];
/*aux toma el elemento menor contenido en la posicion pos del arreglo*/
a[pos]=a[izq];
/*se almacena el elemento mayor contenido en la posicion izq en la posicion pos del
arreglo*/
a[izq]=aux;
/*se almacena el elemento menor contenido en aux en la posicion izq del arreglo*/
pos=izq;
/*pos toma la nueva posicion del arreglo almacenada en izq*/
}
}
}
if (ini<(pos-1)){
/*si el valor de la posicion ini es menor que el valor de la posicion pos-1*/
top++;/*se incrementa el valor de la posicion top mas uno*/
menor[top]=ini;
/*almacena el valor de la posicion ini en la posicion top del arreglo menor*/
mayor[top]=pos-1;
/*almacena el valor de la posicion pos-1 en la posicion top del arreglo mayor*/
}
if (fin>(pos+1)){
/*si el valor de la posicion fin es mayor que el valor de la posicion pos+1*/
top++;/*incrementa el valor de la posicion top mas uno*/
menor[top]=pos+1;
mayor[top]=fin;
}
UTP -55-

}
cout<"El vector ordenado es :\n";
for (i=1; i<=n; i++)
cout<<a[i]<<endl;/*imprime el arreglo ordenado*/
getch();
return 0;

}
UTP -56-

PROBLEMAS PROPUESTOS DE ARREGLOS UNIDIMENSIONALES

1. Una fábrica de llantas quiere un programa para calcular el costo total de


producción de los n modelos de llantas que produce. Los datos con que cuenta
son los siguientes:

n, ao, a1, ..., an-1, c0, c1, ..., cn-1,

con: 1 ≤ n ≤ 50, entero


ai enteros
ci enteros

Donde:

ai representa la cantidad de llantas producidas del modelo i


ci representa el costo de producción de una llanta del modelo i

2. Se tienen los siguientes datos:

n, ic0, ic1, ..., icn-1

con: 1 ≤ n ≤ 32, entero


ici reales

Donde:

ici representa el ingreso per cápita de cada entidad federativa de la


República Mexicana.

Elabore una función para calcular e imprimir el ingreso per cápita promedio de
la República, así como para escribir cuántas entidades tienen un ingreso menor
que este promedio y cuántas lo tienen mayor o igual.

3. Sean los datos:

n, x1, x2, . . . , xn

con: 1 ≤ n ≤ 25, entero


xi reales

Elabore un programa que realice funciones por cada inciso y la función principal
que las mande llamar e imprima los resultados:

a) Lea los datos y almacene los xi en un arreglo.


b) Calcule e imprima la media de los datos dada por la fórmula:

n
− ∑ xi
x= i =1
n
UTP -57-

c) Calcule e imprima la desviación estándar dada por la fórmula:

n −
∑ ( xi − x ) 2
a= i =1
n

4. Una compañía ha clasificado a sus n (1 ≤ n ≤ 50) empleados dentro de los


grupos 1 y 2. Cada empleado del grupo 1 recibirá, a partir de ahora, un
aumento de $250.00 a la semana sobre su sueldo actual, mientras que a cada
uno de los del grupo 2 sólo se le dará $150.00 adicionales por semana. La
información que se proporciona de cada empleado es: clave del empleado
(comprendida entre 100 y 2500, inclusive), grupo al que pertenece (1 o 2) y
sueldo semanal actual (entre $300.00 y $6000.00). Si un empleado del grupo 1
con el nuevo sueldo gana semanalmente más que el sueldo promedio del grupo,
entonces debe cambiar al grupo 2.

Elabore un programa modular que:

a) Lea la información de los n empleados e imprima la clave, grupo y sueldo


semanal nuevo para cada empleado, actualizando el grupo si es el caso.
b) Calcule el sueldo promedio de los empleados por grupo y calcule también
el promedio general de todos, sin considerar el grupo.
c) Indique cuántos empleados cambiaron del grupo 1 al 2.

5. Se tienen n alumnos (1 ≤ n ≤ 50) de los cuales se conoce la clave y la


calificación final. Elabore un programa modular que:

a) Lea dicha información, la cual se da ya ordenada en forma descendente,


con respecto a la clave.

b) Imprima la clave y calificación de todos los alumnos que obtuvieron


calificación superior al promedio del grupo.

c) Imprima la calificación que obtuvieron los alumnos cuyas claves


proporcionará el usuario. Se sabrá que el usuario ya no quiere conocer
más calificaciones cuando, en lugar de una clave, proporcione un cero.
Utilice búsqueda binaria para buscar las claves que el usuario solicita.

6. Se tiene un conjunto de n parejas de datos Xi, Yi donde cada pareja representa


las coordenadas del punto i de un polígono irregular de n lados. Suponga que
las coordenadas se proporcionarán en orden adyacente. Elabore una función
para leer el número de lados del polígono, leer las coordenadas de los puntos y
obtener el área del polígono irregular utilizando la siguiente fórmula:

Area = [(X0+X1)*(Y0-Y1 ) + (X1+X2)*(Y1-Y2)+. . .+ (Xn-1+X0)*(Yn-1-Y0)]


/2

Suponga que los Xi ,Yi son reales y n es entero con 1 ≤ n ≤ 50.


UTP -58-

7. Elabore una serie de funciones para leer una serie de n datos desordenados,
almacenarlos en el arreglo val (de máximo 50 localidades), ordenarlos de
manera creciente, utilizando el algoritmo de selección directa, en ese mismo
arreglo y, por último, imprimirlos en orden.

val
0 1 2 n-1 49
vo v1 v2 . . vn-1 ...

Variante: En el arreglo final no debe haber datos repetidos.

8. Partiendo del ejercicio anterior, elabore un programa que contenga funciones


para:

a) Buscar un valor x dentro del arreglo utilizando el algoritmo de búsqueda


secuencial. La función debe regresar como resultado la posición en la
que se encuentra el valor buscado. Si x no se encuentra en el arreglo, la
función calcula la posición en la que debería encontrarse y regresa:
posición 1).

b) Buscar un valor x dentro del arreglo utilizando el algoritmo de búsqueda


binaria.

c) Insertar un valor x en el arreglo de tal forma que se siga conservando el


orden ascendente de los valores. Al insertar se debe verificar que haya
espacio libre y que x no exista en el arreglo. La función debe regresar
como resultado 1 si se insertó x en el arreglo, 0 si x ya existía en el
arreglo y 1 si no existe espacio libre en el arreglo.

d) Eliminar un valor x del arreglo, compactando si es necesario para que no


haya espacios libres entre valores. La función debe regresar como
resultado 1 si se eliminó x, 0 si x no se encontraba en el arreglo y 1 si
el arreglo estaba vacío.

e) Sustituir un valor x ya existente en el arreglo con un valor y de tal


manera que el arreglo siga conservando su orden creciente. La función
debe regresar como resultado 1 si se hizo la sustitución, 0 si x no se
encontraba en el arreglo y 1 si el arreglo estaba vació.

9. Elabore un programa modular que lea dos arreglos de diferente número de


elementos, los ordene y posteriormente los mezcle en un tercer arreglo
guardando el orden.

Restricción: no se deben unir los arreglos en desorden, ni copiar un arreglo


completo, es decir, los elementos que se almacenen en el tercer arreglo se
deben ir guardando en orden.

10. Elabore un programa modular para leer un arreglo cuyos datos se proporcionan
en orden ascendente, leer un segundo arreglo cuyos datos se proporcionan en
orden descendente, mezclarlos en un tercer arreglo cuyos datos aparezcan en
orden ascendente, y por último, imprimir el arreglo resultante.
UTP -59-

11. Elabore un programa modular que lea los datos de dos polinomios como se
explica posteriormente y que, utilizando un menú, efectúe las siguientes
operaciones sobre polinomios:

a) Suma.
b) Resta.
c) Multiplicación.

Al seleccionar el usuario una de estas tres opciones dará los polinomios sobre
los cuales se realizará la operación solicitada.

Los datos que el usuario proporcionará son los coeficientes (reales) y los
exponentes (enteros, ≥ 0 y ≤ 15) de ambos polinomios, los cuales pueden o no
estar ordenados. El final de cada polinomio está dado por un 1 como
coeficiente y como exponente.

Los términos del polinomio resultante deberán ser desplegados en orden


descendente, observando el siguiente formato:

± cX ^e

Donde:

± representa el signo del término


c representa el coeficiente del término
^ significa exponenciación
e representa el valor del exponente

Por ejemplo, suponga que los datos son:

2.5 3 -4 2 6.5 1 3 4 -1 -1
-2 2 -3 4 9.1 1 6.9 8 -1 -1

Entonces, los polinomios que se van a operar son:

+2.5X3 - 4X2 + 6.5X1 + 3X 4


-2X2 - 3X4 + 9.1X1 + 6.9X8

De tal forma que el resultado de la suma es:

6.9X8 + 2.5X3 - 6X2 + 15.6X1

y se desplegaría como:

+ 6.9X^8 + 2.5X^3 - 6X^2 + 15.6X^1

12. Dado un número natural n de 4 cifras, no todas iguales, encuentre e imprima el


número mayor y el menor que se puede formar con las mismas cifras.

Por ejemplo, si n = 6174, entonces el número mayor que se puede formar es


7641 y el menor 1467.
UTP -60-

13. Elabore un programa que utilizando la criba de Eratóstenes encuentre los


números primos entre 1 y 999, la cual funciona como sigue:

a) Inicialice todos los elementos de un arreglo (comenzando en el índice 2),


de 1000 enteros, con 1 (verdadero). Los elementos con índices 0 y 1
deben inicializarse con 0 (falso).

b) Comience con el índice i=2 del arreglo. Recorra el arreglo, del elemento
i+1 al último, y cada vez que encuentre un elemento cuyo valor sea 1,
póngale 0 si su índice es múltiplo de i. Vuelva a hacer lo mismo, pero
ahora considerando el primer elemento que sea 1 y cuyo índice sea
mayor a i. Continúe este proceso hasta que haya probado todos los
elementos iguales a 1.

Cuando se haya terminado este proceso, los índices del arreglo cuyos
elementos sean 1 son primos.

14. En estadística, la moda de una serie de números es aquel número que aparece
con más frecuencia. Por ejemplo, dada la lista 1,2,2,3,6,4,7,5,4,6,9,4, la moda
es 4, ya que aparece tres veces. Calcule e imprima la moda. Si todos los
números son diferentes entonces no hay moda, con lo cual se debe indicar que
hubo error.
Haga un programa completo en C que deberá tener una función que lea la serie
de números, otra función que reciba como parámetro la serie de números y
arroje la moda o si no la hay 1 y la función principal que mande llamar las
anteriores e imprima la moda (número que mas veces se repitió en caso de
haber dos iguales o más mencione el primero).

15. Una cooperativa de productores de naranjas almacena el total de toneladas


cosechadas durante el último año en N parcelas (1≤ N ≤ 50). En cada parcela se
pueden cultivar dos tipos de naranjas: para jugo y para comer. Se conoce el
total de toneladas cosechadas de cada uno de los tipos de naranjas. Si en una
parcela no se hubiera cosechado alguno de los tipos, entonces habrá 0.

La información se almacena en un arreglo como se muestra en el siguiente


ejemplo:

Naranjas para Naranjas para


jugo comer

100 500 600 0 800 700 ... ...


0 1 2 3 4 5 MAX - 1
2N-2 2N-1
Parcela 1 Parcela 2 Parcela 3 Parcela N
UTP -61-

• En la parcela 1 se cosecharon: 100 toneladas de naranjas para jugo y 500


toneladas de naranjas para comer.
• En la parcela 2 se cosecharon: 600 toneladas de naranjas para jugo y 0
toneladas de naranjas para comer.

NOTA: Observe que la información de una misma parcela ocupa posiciones


consecutivas en el arreglo.

Se le pide que haga un programa en C, usando módulos, que pueda:

a) Leer la información: N (1≤ N ≤ 50) y las toneladas por tipo de naranja de


cada una las parcelas.
b) Calcular e imprimir el total de la producción por parcela.
c) Eliminar la información de una parcela. El dato requerido para esta opción
es el número de parcela a eliminar.
d) Buscar e imprimir el número de una parcela (si hubiera) que no haya tenido
producción de ninguno de los tipos de naranjas. Es decir, durante el último
año su producción total fue 0.
UTP -62-

PROBLEMAS PROPUESTOS DE MATRICES

1. Elabore un programa modular que lea una matriz de enteros de m renglones y


n columnas y calcule la suma de los elementos de cada columna.

2. Elabore un programa modular que lea una matriz de m X n y la escriba


poniendo las columnas como renglones y los renglones como columnas.

Por ejemplo, si la matriz que da el usuario es:

4 7 1 3 5
2 0 6 9 7
3 1 2 6 4

entonces el programa debe escribir la matriz transpuesta:

4 2 3
7 0 1
1 6 2
3 9 6
5 7 4

3. Elabore una función que reciba como entrada un entero n y una matriz
cuadrada (n x n) de enteros e imprima los elementos que conforman su
diagonal.

4. Elabore una función que reciba como entrada un entero n y una matriz
cuadrada (n x n) de enteros e imprima los elementos que conforman la diagonal
que inicia en la esquina superior derecha y termina en la esquina inferior
izquierda.

5. Una matriz cuadrada A se dice que es simétrica si A(i, j) = A(j, i) para todo i, j
dentro de los límites de la matriz. Elabore una función que lea una matriz y
regrese un 1 (uno) si es simétrica o un 0 (cero) no.

6. Elabore una función que lea una matriz de enteros de m X n (1 < n, m ≤ 50) y
otra función que encuentre el menor y el mayor valor y regrese sus posiciones.

7. Resuelva el siguiente sistema de ecuaciones lineales:

2 x 2y + z = 1
-x + y + z = 0
-x +3y + 5z = 0
UTP -63-

8. Una empresa automotriz tiene cinco agencias y cuenta con la información


acerca de las ventas mensuales de automóviles logradas el año pasado por cada
una de éstas. A partir de estos datos la empresa construyó la siguiente matriz
ventas:

Lomas Vallejo Perisur del Valle Oriente


Enero
Febrero
...
Noviembre
Diciembre

Elabore un programa modular para contestar las siguientes preguntas:

a) ¿Cuál fue el total de ventas en el año de la agencia Lomas?


b) ¿Cuál fue el promedio de ventas en el mes de diciembre?
c) ¿Qué agencia tuvo mayores ventas en el mes de mayo?
d) ¿En qué mes se registraron las menores ventas del año, considerando
todas las agencias?

9. Elabore un programa modular que genere las tablas de multiplicar del 1 al 10


en un solo arreglo de dos dimensiones y posteriormente imprima dicho arreglo.

10. Los resultados de las elecciones de un país se esquematizaron en una matriz


como la que se muestra a continuación.

e partidos
s P1 P2 P3 P4 P5 P6 P0(votos anulados)
t
a Edo.0
d Edo.2
o ...
Edo.31
s

La matriz almacena el número de votos que obtuvo cada partido en el estado


correspondiente, así como los votos anulados en cada estado.

Se desea conocer:

a) Total de votos de cada partido.

b) Total de votos por estado, para comparar con una tabla que indica el
número de personas que deben votar por estado con el fin de detectar
en qué estados votó menos del 60% de la población electora y tomar así
medidas de concientización cívica.

Número de personas que deben votar por estado:

Edo.0 Edo.2 ... Edo.31


UTP -64-

c) ¿Qué partido obtuvo el mayor número de votos en el cuarto estado?

d) ¿Cuál es el estado con mayor número de abstenciones y cuál es el


estado con mayor porcentaje de abstenciones? ¿Debe ser forzosamente
el mismo estado en ambos casos?

11. Se tienen los resultados de las últimas elecciones a gobernador en el estado X,


el cual está conformado por 5 municipios. En dichas elecciones hubo 4
candidatos.

Elabore un programa que:

a) Lea e imprima una tabla indicando los votos obtenidos en cada municipio
por los 4 candidatos.
b) Calcule el total de votos recibidos por cada candidato y el porcentaje del
total de votos emitidos.
c) Calcule el candidato más votado.
d) Si un candidato recibió más del 50% de los votos, indicar que es el
ganador. Si ningún candidato recibió más del 50% de los votos, el
programa debe imprimir los dos candidatos más votados, que serán los
que pasen a la segunda ronda de las elecciones.

12. Una agencia automotriz distribuye quince modelos diferentes de coches y tiene
diez vendedores. Se desea un programa que escriba un informe mensual de las
ventas por vendedor y modelo, así como el número de automóviles vendidos
por cada vendedor y el número total de cada modelo vendido por todos los
vendedores. Asimismo, para entregar el premio al mejor vendedor, necesita
saber cuál es el vendedor que más coches ha vendido.

Los datos se proporcionan por día (30 días), todos los vendedores informan la cantidad
de coches que vendieron de cada modelo ese día, el final de datos de las ventas del día
se conoce por un 0. Los vendedores no necesariamente informan sus ventas en orden,
ni por orden de vendedor ni de modelo.

13. El IFE te encargó un programa en C para poder contar los votos del 2 de junio.

La información de todos los electores del país viene dada de la siguiente forma:

estado, partido
:
-1 , -1

donde:
estado: representa el estado del elector (0 <= estado < 32)
partido: representa el partido por el que voto el elector (0<= partido < 6)

a) En un arreglo bidimensional de tamaño apropiado, guarda la suma de los


votos obtenidos por cada partido en cada estado. Los renglones
representan los estados y las columnas los partidos.
UTP -65-

b) Indica cuántas personas votaron en cada estado.


c) Determina cuál fue el partido por el que más personas votaron en el
país.
d) Dados como parámetros una matriz cuadrada de enteros y n, se pide un
módulo llamado paralelo que imprima de cada paralela superior al
diagonal principal, el valor máximo y de cada paralela inferior al diagonal
principal, el valor mínimo.

14. Los resultados de un torneo de futbol de 16 equipos se encuentran


almacenados en la tabla itorn de 16 renglones por 16 columnas. Por renglones
se tienen los goles que un equipo anotó a los demás, y por columnas se tienen
los goles que dicho equipo recibió de los demás. Por ejemplo:

Para un torneo de 4 equipos se tiene la siguiente tabla:

1 2 3 4
1 - 0 4 0
2 2 - 1 2
3 3 2 - 0
4 0 1 1 -

Se puede decir que los marcadores del equipo 1 fueron:

Perdió 0 2 con el equipo 2.


Ganó 4 3 con el equipo 3.
Empató 0 0 con el equipo 4.

Anotó 4 goles y recibió 5 goles en el torneo.

Se pide que elabore un solo programa que realice lo siguiente:

a) Lea la tabla itorn con los resultados del torneo.


b) Imprima los marcadores de los partidos jugados por el equipo 1,
indicando contra quién jugó y si ganó, perdió o empató cada partido.
c) Imprima los goles a favor y los goles en contra del equipo 1.
d) Imprima cuál es el equipo con mayor número de partidos ganados
(suponga que un solo equipo cumple con esta característica).

15. Una compañía de transportes que tiene sucursales en 20 ciudades de la


República, quiere saber la distancia que recorre un chofer al ir de una ciudad a
otra. Los datos referentes a las distancias están indicados como se muestra a
continuación:

0 dist0,1 dist0,2 . . . dist0,19


dist1,0 0 dist1,2 . . . dist1,19
dist2,0 dist2,1 0 . . . dist2,19
. . .
dist19,0 dist19,1 dist19,2 . . . 0

Donde:
UTP -66-

disti, j > 0 representa que hay carretera de la ciudad i a la ciudad j y la


distancia existente entre ambas ciudades.
disti, j = 0 si i diferente a j, representa que no hay carretera entre la ciudad i
y la ciudad j.

Se le pide que elabore un programa para:

e) Leer la tabla de distancias, determinando usted la mejor disposición de


los datos. (sólo es necesario leer una parte de la matriz)
f) Leer la ciudad de origen a y la ciudad destino b.
g) Encontrar la distancia que recorre el chofer al ir de la ciudad a a la
ciudad b. Si no existe carretera directa, entonces deberá encontrar una
ciudad intermedia c, para hacer el recorrido de la ciudad a a la ciudad c y
de la ciudad c a la cuidad b.
h) Si no existe ninguna ruta posible para llegar de a a b, deberá escribir un
mensaje. De otro modo, escriba el total de kilómetros recorridos para
llegar al destino.
i) Si hay varias ciudades intermedias entre a y b, encuentre la ruta más
corta.

16. Una fábrica de bombas hidráulicas tiene una matriz con los insumos necesarios
para la producción de un conjunto de motores. Por ejemplo, suponiendo que la
planta produce 7 motores y se utilizan 8 insumos en diferentes cantidades para
su producción, la matriz sería:

Insumos

1 2 3 4 5 6 7 8
M 1 10 20 30 40 0 60 10 80
o 2 0 70 0 50 40 30 0 10
t 3 5 10 15 0 10 15 5 0
o 4 10 20 10 20 10 0 10 20
r 5 4 0 8 0 6 8 4 0
e 6 0 6 9 12 15 0 1 24
s 7 20 18 0 14 0 10 8 6

Analizando la matriz anterior, podríamos ver que para producir un motor del tipo 3 es
necesario utilizar 5 unidades del insumo 1, 10 unidades del insumo 2, 15 unidades del
insumo 3, 10 unidades del insumo 5, 15 unidades del insumo 6 y 5 unidades del
insumo 7.

Por otro lado se tiene un arreglo con los costos unitarios en pesos de cada insumo:

Costo de Insumos

1 2 3 4 5 6 7 8
3.5 0.1 2.0 1.5 6.0 4.2 2.5 1.3

Se tiene otro arreglo con los pedidos a surtir en el presente mes:


UTP -67-

Pedidos del mes de cada motor

1 2 3 4 5 6 7
100 25 75 150 80 90 10

También se tiene un último arreglo con la existencia actual de cada uno de los
insumos:

Existencia de Insumos

1 2 3 4 5 6 7 8
120 0 20 60 40 90 10 0

Elabore un programa para:

a) Leer el número m de motores que fabrica la planta (máximo 50).


b) Leer el número n de insumos necesarios para la fabricación de los
motores (máximo 50).
c) Leer los datos de la matriz de Insumos/Motor.
d) Leer los datos del arreglo de costos unitarios de insumos.
e) Leer los datos del arreglo de pedidos del mes de cada motor.
f) Leer los datos del arreglo de insumos existentes en la planta.
g) Obtener e imprimir un arreglo de m elementos, con el costo de
producción de cada motor. Suponga que el costo de producción de un
motor consiste en sumar el producto de insumos necesarios por el costo
unitario de cada insumo.
h) Obtener e imprimir un arreglo de n elementos, con la cantidad de
unidades de cada insumo, necesaria para cumplir con los pedidos del
mes.
i) Obtener e imprimir un arreglo de n elementos, cuyos datos indiquen
cuál es el costo total por concepto de cada insumo para cumplir con los
pedidos del mes.
j) Obtenga e imprima el costo total (tomando en cuenta todos los insumos)
para cumplir con la producción del mes.
k) Obtenga e imprima un arreglo de n elementos, con la diferencia de los
insumos necesarios para la producción mensual menos los insumos
existentes en la planta, con el fin de poder surtir dichos insumos a
tiempo.
UTP -68-

CAPITULO 5.- ESTRUCTURAS

Concepto de estructura

Una estructura es un conjunto de una o más variables, de distinto tipo, agrupadas


bajo un mismo nombre para que su manejo sea más sencillo.

Su utilización más habitual es para la programación de bases de datos, ya que


están especialmente indicadas para el trabajo con registros o fichas.

La sintaxis de su declaración es la siguiente:

struct tipo_estructura
{
tipo_variable nombre_variable1;
tipo_variable nombre_variable2;
tipo_variable nombre_variable3;
};

Donde tipo_estructura es el nombre del nuevo tipo de dato que hemos creado.
Por último, tipo_variable y nombre_variable son las variables que forman parte de
la estructura.

Para definir variables del tipo que acabamos de crear lo podemos hacer de varias
maneras, aunque las dos más utilizadas son éstas:

Una forma de definir la estructura:

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
};
struct trabajador fijo, temporal;

Otra forma:

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
}fijo, temporal;

En el primer caso declaramos la estructura, y en el momento en que necesitamos


las variables, las declaramos. En el segundo las declaramos al mismo tiempo que la
UTP -69-

estructura. El problema del segundo método es que no podremos declarar más


variables de este tipo a lo largo del programa. Para poder declarar una variable de tipo
estructura, la estructura tiene que estar declarada previamente. Se debe declarar
antes de la función main.

El manejo de las estructuras es muy sencillo, así como el acceso a los campos ( o
variables ) de estas estructuras. La forma de acceder a estos campos es la siguiente:

variable.campo;

Donde variable es el nombre de la variable de tipo estructura que hemos creado, y


campo es el nombre de la variable que forma parte de la estructura. Lo veremos
mejor con un ejemplo basado en la estructura del capítulo 13.1:

temporal.edad=25;

Lo que estamos haciendo es almacenar el valor 25 en el campo edad de la variable


temporal de tipo trabajador.

Otra característica interesante de las estructuras es que permiten pasar el


contenido de una estructura a otra, siempre que sean del mismo tipo naturalmente:

fijo=temporal;

Al igual que con los otros tipos de datos, también es posible inicializar variables de
tipo estructura en el momento de su declaración:

struct trabajador fijo={"Pedro","Hernández Suárez", 32, "gerente"};

Si uno de los campos de la estructura es un array de números, los valores de la


inicialización deberán ir entre llaves:

struct notas
{
char nombre[30];
int notas[5];
};

struct notas alumno={"Carlos Pérez",{8,7,9,6,10}};

Estructuras y funciones

Podemos enviar una estructura a una función de las dos maneras conocidas:

1.- Por valor: su declaración sería:

void visualizar(struct trabajador);

Después declararíamos la variable fijo y su llamada sería:

visualizar(fijo);
UTP -70-

Por último, el desarrollo de la función sería:

void visualizar(struct trabajador datos)

/* Paso de una estructura por valor. */

#include <iostream.h>

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
};

void visualizar(struct trabajador);


main() /* Rellenar y visualizar */
{
struct trabajador fijo;
cout<<"Nombre: ";
cin>>fijo.nombre;
cout<<"\nApellidos: ";
cin>>fijo.apellidos;
cout<<"Edad: ";
cin>>&fijo.edad;
cout<< Puesto: ";
cin>>fijo.puesto;
visualizar(fijo);
}

void visualizar(struct trabajador datos)


{
cout<<("Nombre:"<<datos.nombre<<endl;
cout<<"Apellidos:"<<datos.apellidos<<endl;
cout<<"Edad:"<<datos.edad<<endl;
cout<<"Puesto:"<<datos.puesto<<endl;
}

2.- Por referencia: su declaración sería:

void visualizar(struct trabajador *);

Después declararemos la variable fijo y su llamada será:

visualizar(&fijo);

Por último, el desarrollo de la función será:

void visualizar(struct trabajador *datos)


UTP -71-

Fíjate que en la función visualizar, el acceso a los campos de la variable datos se


realiza mediante el operador ->, ya que tratamos con un puntero. En estos casos
siempre utilizaremos el operador ->. Se consigue con el signo menos seguido de
mayor que.

/* Paso de una estructura por referencia. */

#include <iostream.h>

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
};

void visualizar(struct trabajador *);


void main() /* Rellenar y visualizar */
{
struct trabajador fijo;
cout<<"Nombre: ";
cin>>fijo.nombre;
cout<<"Apellidos: ";
cin>>fijo.apellidos;
cout<<"Edad: ";
cin>>&fijo.edad;
cout<<"Puesto: ";
cin>>fijo.puesto;
visualizar(&fijo);
}

void visualizar(struct trabajador *datos)


{
cout<<"Nombre:"<<datos->nombre<<endl;
cout<<"Apellidos:"<<datos->apellidos<<endl;
cout<<"Edad:"<<datos->edad<<endl;
cout<<"Puesto:"<<datos->puesto;
}
Arrays de estructuras

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Esto


se conoce como array de estructuras:

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
};
UTP -72-

struct trabajador fijo[20];

Así podremos almacenar los datos de 20 trabajadores. Ejemplos sobre como


acceder a los campos y sus elementos: para ver el nombre del cuarto trabajador,
fijo[3].nombre;. Para ver la tercera letra del nombre del cuarto trabajador,
fijo[3].nombre[2];. Para inicializar la variable en el momento de declararla lo
haremos de esta manera:

struct trabajador fijo[20]={{"José","Herrero Martínez",29},{"Luis","García


Sánchez",46}};

Typedef

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Esto


se conoce como array de estructuras: El lenguaje 'C' dispone de una declaración
llamada typedef que permite la creación de nuevos tipos de datos. Ejemplos:

typedef int entero; /* acabamos de crear un tipo de dato llamado


entero */
entero a, b=3; /* declaramos dos variables de este tipo */

Su empleo con estructuras está especialmente indicado. Se puede hacer de varias


formas:

Una forma de hacerlo:

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;

};

typedef struct trabajador datos;


datos fijo,temporal;

Otra forma:

typedef struct
{
char nombre[20];
char apellidos[40];
int edad;
}datos;

datos fijo,temporal;
UTP -73-

Arrays de estructuras

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Esto


se conoce como array de estructuras:
struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
};
struct trabajador fijo[20];

Así podremos almacenar los datos de 20 trabajadores. Ejemplos sobre como


acceder a los campos y sus elementos: para ver el nombre del cuarto trabajador,
fijo[3].nombre;. Para ver la tercera letra del nombre del cuarto trabajador,
fijo[3].nombre[2];. Para inicializar la variable en el momento de declararla lo
haremos de esta manera:

struct trabajador fijo[20]={{"José","Herrero Martínez",29},{"Luis","García


Sánchez",46}};

Typedef

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Esto


se conoce como array de estructuras: El lenguaje 'C' dispone de una declaración
llamada typedef que permite la creación de nuevos tipos de datos. Ejemplos:

typedef int entero; /* acabamos de crear un tipo de dato llamado entero */


entero a, b=3; /* declaramos dos variables de este tipo */

Su empleo con estructuras se puede hacer de varias formas:


Una forma de hacerlo:

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
};

typedef struct trabajador datos;


datos fijo,temporal;

Otra forma:

typedef struct
{
char nombre[20];
char apellidos[40];
int edad;
}datos;

datos fijo,temporal;
UTP -74-

PROBLEMAS PROPUESTOS DE STRUCTURE

1. La información de todos los empleados de una cierta compañía está almacenada


en una variable llamada empresa definida como un arreglo de registros. La
información con que se cuenta de cada empleado es: nombre, sexo y sueldo.
Escriba la declaración para el registro y el arreglo empresa .

Considerando las declaraciones que hizo, escriba las instrucciones en C para:

a) Imprimir el nombre y el sexo del cuarto empleado.


b) Imprimir los nombres de todos los empleados que ganan más de
$2,500.00
c) Sumar al sueldo del tercer empleado $2,000.00.

2. Considerando la siguiente definición y declaraciones, indique para cada uno de


los siguientes incisos sin es correcto o no. En caso de ser incorrecto diga
brevemente por qué.

struct nombre{
char pila[20], apellido [20];
};

struct estudiante
{
struct nombre nom;
int calif;
char grado;
};

struct estudiante est1, est2, als[20];


int i;

a) struct Estudiante als1[30];

b) void leer (struct estudiante *al[20]){


gets(al[2]->nom.pila);
cin>>al[2]->calif);
}

c) cout<<als[10].pila[0]);

d) for (i = 0; i < =20; i++)


gets(als[i].nom);

e) als[5] = est1;

f) void leer(struct estudiante *est)


{
cin>>est->grado);
}

g) als[2].nom = als[5].nom;
UTP -75-

3. En muchas microcomputadoras, el valor MaxInt es 32767. Esto impide un límite


estricto sobre el tamaño de los enteros que puedan utilizarse. Existen diversas
formas de ampliar el intervalo de valores; una se sugiere por analogía con lo
que se hizo en el ejercicio anterior para representar el dinero.

Por ejemplo, para representar números positivos con hasta nueve cifras,
podríamos imaginar el número como lo escribimos comúnmente a mano, como
en estos ejemplos:

213 567 198


3 175 000

Podríamos optar por utilizar un registro con tres enteros para representar el
número de unidades de millón, unidades de millar y las unidades. Mediante el
uso de esta representación, escriba un subprograma para resolver cada una de
las siguientes operaciones:

a) Sume dos enteros.


b) Reste dos enteros, suponiendo que el primero es mayor.
c) Compare dos enteros para ver si son iguales.
d) Compare dos enteros para ver si el primero es mayor.
e) Multiplique dos enteros. Precaución: si multiplica dos números de tres
cifras, el resultado puede ser mayor que MaxInt. ¿Puede usted sugerir
algunas soluciones a este problema?

4. Considere las siguientes definiciones:

struct datos
{
char nombre[40], pais[25];
};

struct atleta
{
char deporte[30];
struct datos pers;
int medallas[20];
};

struct atleta ats[1000];

Escriba un módulo que lea del archivo f sólo las 20 medallas de cada uno de los
atletas (utilice el vector ats). El archivo se debe declarar como local al módulo
ya que en el resto del programa no se va a usar. No se sabe de cuántos atletas
hay almacenadas medallas en el archivo. El archivo no almacena toda la
información de los atletas, sólo las medallas.
UTP -76-

5. Se tiene un arreglo de una dimensión en el que cada uno de sus elementos


tiene la siguiente estructura:

CLAVE NOMBRE SEMESTRE MATERIAS

En MATERIAS se almacena información acerca de las 6 calificaciones obtenidas


por un alumno en el semestre indicado por SEMESTRE (entero). Suponiendo
que en el arreglo ya se almacena la información completa de n alumnos y que
está ordenado en forma ascendente por clave, escriba:

a) La definición del registro y la declaración de la variable donde se guarda


la información de los n alumnos.
b) Una función que busque en el arreglo una determinada clave, si ésta
existe regrese como valor el lugar en el arreglo donde se encuentra. Si la
clave buscada no existe deberá regresar un 1. Utilice búsqueda binaria.
c) Un módulo que calcule el promedio de un cierto alumno.
d) Un módulo que imprima la clave, nombre, semestre y promedio de un
determinado alumno.
e) Por último, escriba parte del programa principal donde se lean p claves
y, utilizando los módulos anteriores, se escriban los datos de los p
alumnos correspondientes.

6. En un archivo se tiene información sobre los miembros de un coro. La


información que se tiene de cada uno es:

Ø Nombre.
Ø Parte de voz: soprano, alto, tenor o grave.
Ø Extensión: alta o baja

Escriba:

a) La definición del registro y la declaración de la variable para guardar la


información de los miembros del coro.
b) Un módulo para leer la información del archivo y almacenarla en el
vector.
c) Un módulo que calcule el porcentaje de miembros del coro que tienen
una determinada parte de voz.
d) Un módulo que calcule el porcentaje de los miembros de una cierta parte
de voz que tienen una determinada extensión. Por ejemplo, el porcentaje
de los tenores que tienen extensión baja.
e) Un módulo que dado un nombre escriba su parte de voz y extensión.
f) Un módulo que calcule el total de miembros de cada una de las 4 partes
de voz.

7. Simule, por medio de un programa, un directorio telefónico que lea nombres


(20 caracteres como máximo) y números telefónicos (enteros) de un archivo de
texto en un arreglo de registros. Cuando el usuario teclee un nombre, el
programa debe verificar si éste ya está en el directorio, en cuyo caso imprimirá
el número telefónico. De no ser así, pedirá al usuario que escriba el teléfono y
agregará el nombre y el número en el arreglo.
UTP -77-

La información no se encuentra ordenada por lo que tendrá que hacer una


búsqueda secuencial.

8. Defina un registro para representar la información de los alumnos de una


escuela. La información que se desea guardar de cada uno es: nombre (pila,
apellido), teléfono, clave y calificación. Posteriormente, defina una variable para
poder almacenar 80 alumnos y escriba las instrucciones necesarias para leer el
apellido de los 80 alumnos.

9. Un grupo consta de n alumnos (máximo 50), donde cada alumno cursa 5


materias. La información con que se cuenta de cada alumno es la clave (entero)
y las 5 calificaciones (reales). Haga un programa que, utilizando un arreglo de
registros, lea la información de cada alumno e imprima la clave, promedio
redondeado a un entero y una barra horizontal de tantos asteriscos como fue su
promedio.

Dicha tabla deberá imprimirse en forma ascendente con respecto al promedio.

Por último, el programa debe crear un archivo de texto, que se utilizará como
reporte, con la clave, las 5 calificaciones y el promedio de los n alumnos.

10. El mundo está formado por cinco continentes, éstos están compuestos por
países conteniendo ciudades, las cuales, a su vez, tienen pueblos.

a) Haga las definiciones necesarias y la declaración de la variable del


mundo. Suponga que de cada continente, país, ciudad y pueblo se
conoce el nombre y el número de habitantes.
b) Obtenga en la variable pob el valor de la población del segundo
continente.
c) Obtenga el total de habitantes del cuarto continente, suponiendo que
sólo se conoce la población de los pueblos.
d) Escriba el quinto carácter del nombre de la segunda ciudad del octavo
país del segundo continente.
e) Lea el nombre de la sexta ciudad del décimo país del tercer continente.
f) Lea el nombre y la población de los veinte pueblos de las quince
ciudades de los doce países del quinto continente.

11. Tomando la estructura NOMINA del ejercicio anterior y considerando que está
ordenada por nombre, haga un programa que imprima el sueldo de un
determinado profesor. El programa deberá tener un módulo que realice una
búsqueda binaria para encontrar al profesor en cuestión en NOMINA, la
información que se proporciona es el nombre completo.

12. La información que tiene una empresa, almacenada en un archivo, sobre sus
empleados (máximo 100) es:

v Clave. Entero.
v Sueldo. Real
v Cantidad de tareas pendientes. Entero (máximo 30).
v Tareas pendientes. Vector.
• Descripción.
• Fecha de asignación.
UTP -78-

Haga un programa que:


a) Lea la información de los empleados y la almacene en un vector.
b) Dada una clave de un empleado, le asigne una nueva tarea pendiente.
La búsqueda del empleado se debe realizar recursivamente.
c) Recursivamente calcule el total de tareas pendientes de todos los
empleados.
d) Recursivamente cree dos vectores, almacenando en uno la información
de los empleados que no tienen tareas pendientes y en el otro los que sí
tienen.
UTP -79-

CAPITULO 6.- MANEJO DE CADENAS


Antes de entrar en el tema de los "arrays" también conocidos como arreglos, tablas o
matrices, veremos un caso especial de ellos. Se trata de las cadenas de caracteres o
"strings" (en inglés).

Una cadena en C es un conjunto de caracteres, o valores de tipo "char", terminados


con el carácter nulo, es decir el valor numérico 0. Internamente se almacenan en
posiciones consecutivas de memoria. Este tipo de estructuras recibe un tratamiento
especial, y es de gran utilidad y de uso continuo.

La manera de definir una cadena es la siguiente:

char <identificador> [<longitud máxima>];

Nota: En este caso los corchetes no indican un valor opcional, sino que son realmente
corchetes, por eso están en negrita.

Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar
una posición para almacenar el carácter nulo, de modo que si queremos almacenar la
cadena "HOLA", tendremos que declarar la cadena como:

char Saludo[5];

Cuatro caracteres para "HOLA" y uno extra para el carácter '\000'.

También nos será posible hacer referencia a cada uno de los caracteres individuales
que componen la cadena, simplemente indicando la posición. Por ejemplo el tercer
carácter de nuestra cadena de ejemplo será la 'L', podemos hacer referencia a él como
Saludo[2]. Los índices tomarán valores empezando en el cero, así el primer carácter de
nuestra cadena sería Saludo[0], que es la 'H'.

Una cadena puede almacenar informaciones como nombres de personas, mensajes de


error, números de teléfono, etc.

La asignación directa sólo está permitida cuando se hace junto con la declaración. Por
ejemplo:

char Saludo[5];
Saludo = "HOLA"

Producirá un error en el compilador, ya que una cadena definida de este modo se


considera una constante, como veremos en el capítulo de "arrays" o arreglos.

La manera correcta de asignar una cadena es:

char Saludo[5];
Saludo[0] = 'H';
Saludo[1] = 'O';
Saludo[2] = 'L';
Saludo[3] = 'A';
Saludo[4] = '\000';
UTP -80-

O bien:

char Saludo[5] = "HOLA";

Si te parece un sistema engorroso, no te preocupes, en próximos capítulos veremos


funciones que facilitarán la asignación de cadenas. Existen muchas funciones para el
tratamiento de cadenas, como veremos, que permiten compararlas, copiarlas, calcular
su longitud, imprimirlas, visualizarlas, guardarlas en disco, etc. Además,
frecuentemente nos encontraremos a nosotros mismos creando nuevas funciones que
básicamente hacen un tratamiento de cadenas.

Librería rutinas de manipulación de cadenas "string"

En esta librería se incluyen rutinas de manipulación de cadenas de caracteres y de


memoria. De momento veremos sólo algunas de las que se refieren a cadenas.

Función "strlen()"

Calcula la longitud de una cadena.

Sintaxis:

size_t strlen(const char *s);

"strlen" calcula la longitud de la cadena s.

Valor de retorno:

"strlen" devuelve el número de caracteres que hay en s, excluyendo el carácter nulo de


terminación de cadena.

Ejemplo:
#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena = "Una cadena C++ termina con cero";

cout << "La cadena: [" << cadena << "] tiene "
<< strlen(cadena) << " caracteres" << endl;
return 0;
}

Función "strcpy()"

Copia una cadena en otra.

Sintaxis:
UTP -81-

char *strcpy(char *dest, const char *orig);

Copia la cadena orig a dest, la copia de caracteres se detendrá cuando sea copiado el
carácter nulo. Valor de retorno:

"strcpy" devuelve el puntero dest.

Ejemplo:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena = "Cadena ejemplo";
char cad[32];

cout << strcpy(cad, cadena) << endl;


cout << cad << endl;
return 0;
}

Función "strcmp()"

Compara dos cadenas.

Sintaxis:

int strcmp(char *cad1, const char *cad2);

Compara las dos cadenas, si la cad1 es mayor que cad2 el resultado será mayor de 0,
si cad1 es menor que cad2, el resultado será menor de 0, si son iguales, el resultado
será 0. La comparación se realiza carácter a carácter. Mientras los caracteres
comparados sean iguales, se continúa con el siguiente carácter. Cuando se encuentran
caracteres distintos, aquél que tenga un código ASCII menor pertenecerá a la cadena
menor. Por supuesto, si las cadenas son iguales hasta que una de ellas se acaba, la
más corta es la menor.

Ejemplo:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";

if(strcmp(cadena1, cadena2) < 0)


UTP -82-

cout << cadena1 << " es menor que " << cadena2 << endl;
else if(strcmp(cadena1, cadena2) > 0)
cout << cadena1 << " es menor que " << cadena2 << endl;
else
cout << cadena1 << " es igual que " << cadena2 << endl;
cout << strcmp(cadena3, cadena2) << endl;
cout << strcmp(cadena3, cadena4) << endl;
return 0;
}

Función "strcat()"

Añade o concatena una cadena a otra.

Sintaxis:

char *strcat(char *dest, const char *orig);

"strcat" añade una copia de orig al final de dest. La longitud de la cadena resultante
será strlen(dest) + strlen(orig). Valor de retorno:

"strcat" devuelve un puntero a la cadena concatenada.

Ejemplo:
#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena1 = "Cadena de";
char *cadena2 = " ejemplo";
char cadena3[126];

strcpy(cadena3, cadena1);
cout << strcat(cadena3, cadena2) << endl;
return 0;
}

Función "strncpy()"

Copia un determinado número de caracteres de una cadena en otra.

Sintaxis:

char *strncpy(char *dest, const char *orig, size_t maxlong);

Copia maxlong caracteres de la cadena orig a dest, si hay más caracteres se ignoran,
si hay menos se rellenará con caracteres nulos. La cadena dest no se terminará con
nulo si la longitud de orig es maxlong o más. Valor de retorno:

"strncpy" devuelve el puntero dest.


UTP -83-

Ejemplo:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena = "Cadena ejemplo";
char cad[32];

strncpy(cad, cadena, 4);


cad[4] = '\0';
cout << cad << endl;
return 0;
}

Función "strncmp()"

Compara dos porciones de cadenas.

Sintaxis:

int strncmp(char *cad1, const char *cad2, size_t maxlong);

Compara las dos cadenas igual que strcmp, pero sólo se comparan los primeros
maxlong caracteres. Ejemplo:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena1 = "Cadena ejemplo 1";
char *cadena2 = "Cadena ejemplo 2";
char *cadena3 = "Cadena";
char *cadena4 = "Cadena";

if(strncmp(cadena1, cadena2, 6) < 0)


cout << cadena1 << " es menor que " << cadena2 << endl;
else if(strncmp(cadena1, cadena2, 6) > 0)
cout << cadena1 << " es menor que " << cadena2 << endl;
else
cout << cadena1 << " es igual que " << cadena2 << endl;
cout << strncmp(cadena3, cadena2, 5) << endl;
cout << strncmp(cadena3, cadena4, 4) << endl;
return 0;
}

Función "strncat()"

Añade o concatena una porción de una cadena a otra.


UTP -84-

Sintaxis:

char *strncat(char *dest, const char *orig, size_t maxlong);

"strncat" añade como máximo maxlong caracteres de la cadena orig al final de dest, y
después añade el carácter nulo. La longitud de la cadena resultante será strlen(dest) +
maxlong. Valor de retorno:

"strncat" devuelve un puntero a la cadena concatenada.

Ejemplo:

#include <iostream>
#include <cstring>
using namespace std;

int main() {
char *cadena1 = "Cadena de";
char *cadena2 = " ejemplo";
char cadena3[126];

strcpy(cadena3, cadena1);
cout << strncat(cadena3, cadena2, 5) << endl;
return 0;
}

PROBLEMAS PROPUESTO DE CADENAS

1. Elabore un programa que lea una cadena de, a lo más, 20 caracteres e imprima
todos los caracteres que se encuentran en una posición par.

2. Elabore un programa que lea una frase de, a lo más, 50 caracteres y cuente
cuántas veces aparece la letra en la frase.

3. Elabore un programa que lea una frase y cuente cada una de las vocales
minúsculas o mayúsculas que contiene.

4. Elabore un programa que lea una palabra, máximo de 10 caracteres, y escriba,


en orden alfabético, todas las letras de ella. En caso de que se repita una letra
se debe imprimir tantas veces como ocurra.

Por ejemplo, la palabra pelele debe escribirse como eeellp.

5. Elabore un programa que lea una palabra, máximo de 10 caracteres, y escriba,


en orden alfabético, todas las letras de ella. En este caso sólo se debe escribir
una vez cada letra, o sea, no se escribirán las repeticiones.

Por ejemplo, la palabra pelele debe escribirse como elp

6. Elabore un programa para decodificar una sucesión de a s y b s que aparece


codificada por medio de un conjunto de parejas de dígitos y letras donde el
UTP -85-

dígito indica el número de veces que se repite la letra que lo sucede. El


programa debe leer en una línea la sucesión codificada para después
decodificarla. Si la sucesión codificada leída es:

3a4b2a

su programa debe escribir: aaabbbbaa

Notas:
• Los números son de un sólo dígito (no hay 10,11, ...).
• Puede haber tantas sucesiones de a s y b s como se desee.
• Las letras no necesariamente vienen alternadas.
• En la línea de lectura, no hay ningún espacio.
• Considere que la sucesión decodificada será de longitud menor o igual a 80
caracteres.

7. Elabore un programa que lea un texto, transforme las letras que se encuentran
en minúsculas por mayúsculas e imprima el texto modificado.
UTP -86-

Los siguientes ejercicios deben resolverse utilizando las funciones de la


biblioteca string.h.

8. Elabore un programa que lea una frase y cuente el número de palabras que
contiene.
Nota: Las palabras se separan por un espacio y la frase termina con una
palabra.

9. Elabore un programa que lea una frase y una palabra y que cuente cuántas
veces aparece la palabra leída dentro de la frase, ya sea como una palabra
completa o como parte de otra palabra. La frase y la palabra tienen una
longitud máxima de 50 caracteres.

10. Elabore un programa que realice la concatenación de dos cadenas de


caracteres. Su programa debe leer dos cadenas de caracteres de, a lo más 20
caracteres, cada una, y obtener, en una tercera cadena, la concatenación de las
dos primeras.

11. Elabore un programa que lea una frase de, a lo más, 50 caracteres y que, si su
longitud es menor a 50, le añada tantos espacios al final como sea necesario
hasta que alcance los 50 caracteres.

12. Elabore un programa que lea una frase de, a lo más, 50 caracteres y cree una
segunda cadena con la primera palabra de la frase original que empiece con la
letra b , si existe.

13. El teclado de su computadora está descompuesto y cada vez que oprime la letra
ésta se imprime tres veces en vez de una. Se desea que Elabore un
programa en C que reciba como dato de entrada una línea tecleada en su
computadora y que genere e imprima una cadena resultado sin exceso de .
El programa también debe funcionar si la línea original no contiene ninguna .

14. Elabore un programa que:

a) Le pida al usuario el año actual.


b) Lea una serie de Registros Federales de Contribuyentes (RFC). El final de
datos estará dado por FIN o Fin o fin.
c) Para cada uno de los RFC recibidos debe imprimir la edad en años de la
persona.

El RFC de una persona está formado por 4 caracteres en mayúsculas (inicial del
primer apellido, primera vocal del primer apellido, inicial del segundo apellido e
inicial del primer nombre, 6 números (los dos últimos del año de nacimiento,
mes y día), un número y dos caracteres en mayúscula que representan una
clave.

Prof. Ing. Alberto Moreno Cueva


Enlaces de Interes:
http://www.mailxmail.com/curso/informatica/algoritmos/capitulo18.htm