edatos manual

86
UTP -1- INFORMATICA I Prof. Ing. Alberto Moreno FACULTAD DE INGENIERIA DE TRANSPORTE Y TELECOMUNICACION

Upload: juanjo23

Post on 08-Jun-2015

3.618 views

Category:

Documents


3 download

DESCRIPTION

funciones en c++ del curso de informatica 1

TRANSCRIPT

Page 1: EDatos Manual

UTP -1-

INFORMATICA I

Prof. Ing. Alberto Moreno

FACULTAD DE INGENIERIA DE TRANSPORTE YTELECOMUNICACION

Page 2: EDatos Manual

UTP -2-

Indice1.- 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

Page 3: EDatos Manual

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 parafuncionar (P.ej: Basic). Los compilados convierten el código fuente en un fichero objeto y éste en unfichero ejecutable. Este es el caso del lenguaje C.

Podemos decir que el lenguaje C es un lenguaje de nivel medio, ya que combina elementos delenguaje de alto nivel con la funcionalidad del lenguaje ensamblador. Es un lenguaje estructurado, yaque permite crear procedimientos en bloques dentro de otros procedimientos. Hay que destacar que elC es un lenguaje portable, ya que permite utilizar el mismo código en diferentes equipos y sistemasinformá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 describiren poco espacio y aprender rápidamente. Este es sin duda el objetivo de éste curso. No pretende ser uncompleto manual de la programación, sinó una base útil para que cualquiera pueda introducirse en esteapasionante mundo.

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

Page 4: EDatos Manual

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 programacomienza 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 yla lista de argumentos (si los hubiese), la declaración de las variables a utilizar y la secuencia desentencias 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 saberque función tiene cada parte del código, en caso de que no lo utilicemos durante algún tiempo. Ademásfacilitaremos 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 utilizarcomo identificadores.

Page 5: EDatos Manual

UTP -5-

A continuación vemos algunas de estas palabras clave:

char int float double ifelse do while for switchshort long extern static defaultcontinue break register sizeof typedef

Identificadores

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

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

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

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

Page 6: EDatos Manual

UTP -6-

TIPOS DE DATOS

En 'C++' existen básicamente cuatro tipos de datos, aunque como se verá después, podremosdefinir nuestros propios tipos de datos a partir de estos cuatro. A continuación se detalla su nombre, eltamañ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 tipode variable. Estos calificadores son cuatro:

• signedLe 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 127signed int 2 bytes -32768 a 32767

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

TIPO Tamaño Rango de valores

unsigned char 1 byte 0 a 255unsigned int 2 bytes 0 a 65535

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

TIPO Tamaño Rango de valores

short char 1 byte -128 a 127short int 2 bytes -32768 a 32767

Page 7: EDatos Manual

UTP -7-

• longRango de valores en formato largo (ampliado).

TIPO Tamaño Rango de valores

long int 4 bytes -2.147.483.648 a 2.147.483.647long 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 = longunsigned 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 lavariable). 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 tieneque 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;}

Page 8: EDatos Manual

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 delprograma 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óloexiste 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 quepodemos utilizar son las letras: a-z y A-Z (ojo! la ñ o Ñ no está permitida), los números: 0-9 y elsímbolo de subrayado _. Además hay que tener en cuenta que el primer caracter no puede ser unnú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énpor una cadena de caracteres.

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

/* Uso de las constantes */

#include <iostream.h>

Page 9: EDatos Manual

UTP -9-

#define pi 3.1416main() /* 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 conocecomo 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 seencuentran 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).

Page 10: EDatos Manual

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 distribucionde 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.

Page 11: EDatos Manual

UTP -11-

OPERADORES ARITMETICOS Y DE ASIGNACION

A continuación se explican los tipos de operadores (aritméticos y de asignación) que permiten realizaroperaciones 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;}

Page 12: EDatos Manual

UTP -12-

Operadores de asignación

La mayoría de los operadores aritméticos binarios explicados en el capítulo anterior tienen sucorrespondiente 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 realizade izquierda a derecha. A continuación se muestra un ejemplo sobre ello:

a*b+c/d-e

Page 13: EDatos Manual

UTP -13-

1. a*b resultado = x2. c/d resultado = y3. x+y resultado = z4. z-e

Fijarse que la multiplicación se resuelve antes que la división ya que está situada más a la izquierdaen 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 .................... ..

Page 14: EDatos Manual

UTP -14-

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

3.1) cpbpapp −−− )()((

3.2)5

3

−+

acb

3.3) 2(A+B)

3.4)2

3

bcbac

+−

3.5) W + T K

3.6) A - 3B2

5K + 8J

Page 15: EDatos Manual

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 dehoras trabajadas basada en una tarifa horaria, al sueldo básico se le aplicauna bonificación del 20% obteniéndose el sueldo bruto, al sueldo bruto se leaplica un descuento del 10% obteniéndose el sueldo neto. Escriba unprograma que calcule e imprima el sueldo básico, el sueldo bruto y elsueldo 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 aEuros. 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 ylo convierta en Megabytes, Kilobytes y Bytes 1 Kilobyte= 1024 Bytes1 Megabyte= 1024 Kilobyte1 Gigabyte= 1024 Megabyte

4.- Datos del programa descripción de un producto, el precio y la cantidadvendida, 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 cifrasb. Promedio de las cifras.

6.- Crear un algoritmo para venta de Artefactos, datos nombre del cliente y elprecio 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 porconsumo telefónico; Datos del programa código del usuario, el númerotelefónico y la cantidad de minutos utilizados.Visualice el código del usuario, el importe por los minutos utilizados, el IGV y elpago total.

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

Page 16: EDatos Manual

UTP -16-

8.- Elabore un algoritmo para EDELNOR,datos el código del suministro y lacantidad 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 IGVf. 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 lacantidad de metros cúbicos consumidos. Calcule y visualice los siguientespagos: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 totalConsidere 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.

Page 17: EDatos Manual

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

}

Page 18: EDatos Manual

UTP -18-

CAPITULO 2.-ESTRUCTURAS DE CONTROL

Las estructuras de control controlan el flujo de ejecución de un programa o función .Lasestructuras de control permiten combinar instrucciones o sentencias individuales en unasimple 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 quesirven 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 esun conjunto de sentencias encerradas entre llaves ({ y }) que se utiliza para especificar unflujo secuencial.

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

El control fluye de la sentencia 1 a la sentencia 2 y así sucesivamente. Sin embargo, existenproblemas que requieren etapas con dos o más opciones o alternativas elegir en funcióndel 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 iftiene dos alternativas o formatos posibles. El formato más sencillo tiene la sintaxissiguiente:

Nota: Las condiciones son expresiones booleanas.

Page 19: EDatos Manual

UTP -19-

LA SENTENCIA if else (doble)

Un segundo formato de la sentencia if es la sentencia if-else. este formato de la sentenciaif 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 dosalternativas. En esta seccion se mostrara como se puede utilizar la sentencia if paraimplementar decisiones que impliquen diferentes alternativasUna sentencia if es anidada de la rama verdadera o la rama falsa es a su vez una sentenciaif. Una sentencia if anidada se puede utilizar para implementar decisiones con variasalternativas o multi- alternativas.

Sintaxis:

Nota: Las condiciones son expresiones booleanas.

Page 20: EDatos Manual

UTP -20-

Calcular el máximo valor de 2 notas ingresadas por teclado e imprimir si esa nota esaprobatoria 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;elsemayor=nota2;

cout<<"El mayor nùmero es "<<mayor<<endl;if(mayor>10)cout<<"Aprobado”<<endl;elsecout<<"Desaprobado”<<endl;

}

Diseñe un programa que ingrese el sueldo de un trabajador y calcule el aumento queobtendrá de la siguiente tabla

SUELDO AUMENTOMenos 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;

elsenuevoSueldo=sueldo*1.09;

cout<<"El nuevo sueldo es:”<<nuevoSueldo<<endl;}

Page 21: EDatos Manual

UTP -21-

EJERCICIOS PROPUESTOS

1) Diseñe un programa que calcule el monto a pagar de una compra de un sòlo productoconsiderando 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 dela siguientes categorías:

Algoritmos y Estructuras de Datos I Guía de LaboratorioPROMEDIO CATEGORÍA18 – 20 Excelente15 – 17 Bueno11 – 14 Regular0 -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 FBcaso contrario.Si la persona es de sexo masculino:categoría MA si tiene menos de 30 años y MBcaso contrario.

6) Una persona està a punto de ver televisión , mostrar si según su edad esta apto paraver el programa televisivo.

EDAD CATEGORÍA18 -màs Contenido para adultos14 -17 Mayores de 140 –13 apt

7) Diseñe un programa que lea la temperatura de un día e imprima el tipo de climade acuerdo a la siguiente tabla

Temperatura Promedio (TP) Tipo de Clima

TP<=10 Frio10<TP<=20 Nublado20<TP<=30 Caluroso

TP30 Trópico

Page 22: EDatos Manual

UTP -22-

Condicional Simple

1. Datos del programa el nombre de un trabajador sus horas trabajadas y tarifanormal, Si tiene horas extras (horas trabajadas mayores a 48 hrs.) calcular ymostrar:

a. Pago normalb. Horas extrasc. 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 boletospara adulto, ingrese por teclado, el número de primer y ultimo boletovendido así como también el precio por boleto. Solo si la cantidad de boletosvendidos 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 2y 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 ymostrar:

a. Años transcurridos, son los años que tiene el alumno en su centro deestudios.

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.00soles increméntelo en 3% en caso contrario en 9%, mostrar el valor delincremento y el nuevo precio.

6. Dato un numero de dos cifras, en caso que la primera cifra sea mayormostrar el cuadrado del número ingresado de no ser así el promedio de lascifras.

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 enefectivo, sino cero.

b. Recargo, será 3% del precio si la compra fue a crédito, sino cero.c. Precio final

Page 23: EDatos Manual

UTP -23-

8. Ingresar como datos las horas y minutos respecto a las manecillas de lasagujas 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 ylado3) en caso que forme triángulo calcular su área, de lo contrario muestreun mensaje de error, no se forma triángulo. Para formar un triángulo un ladosiempre tiene que ser menor a la suma de los otros dos lados. Y su área dela siguiente manera:

10. Escribir un algoritmo que determine si un año es bisiesto. Un año bisiesto esmúltiplo de 4, excepto los múltiplos de 100 que no son bisiesto salvo que asu vez también sean mútiplos de 400.

11. Ingrese por teclado el tiempo en minutos empleado en una llamadatelefónica, mostrar el importe de la llamada, sabiendo que hasta por los 3primeros 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 ordenadosascendentemente. 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 Deficiente06 10 Malo11 13 Regular14 17 Bueno18 20 Excelente

Intrucciones switch-case

La sentencia switch es una sentencia c++ que se utiliza para seleccionar una de entremultiples alternativas.La sentencia switch es especialmente util cuando la selección se basaen el valor de una variable simple o de una expresión simple denominada expresión de

2321 LLLP ++

=

)3)(2)(1(rea LPLPLPpA −−−=

Page 24: EDatos Manual

UTP -24-

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

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 decase .La expresión selector debe ser un tipo ordinal(por ejemplo, int ,char pero no flota odouble) Cada etiqueta es un valor único , constante y cada etiqueta debe tener un valordiferente de los otros . si el valor de la expresión selector es igual a una de las etiquetascase – por ejemplo , etiqueta1- entonces la ejecución comenzara con la primera sentenciade 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 nombredel 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;

Page 25: EDatos Manual

UTP -25-

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

}

}

Diseñe un programa que calcule el costo de un paciente, el costo depende del tipo deenfermedad. De acuerdo a la siguiente tabla

TIPO ENFERMEDAD COSTO1 1222 1503 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;

}

Page 26: EDatos Manual

UTP -26-

EJERCICIOS PROPUESTOS

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

Básico Intermedio AvanzadoProfesor 50 70 100Alumno 40 50 80Externo 70 100 120

Se pide elaborar un programa para emitir el recibo por dicho curso, los datos que semostraran 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 elnombre 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 esbisiesto.

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

Page 27: EDatos Manual

UTP -27-

Uso de la sentencia do....while:

La estructura do....while repite una acción o un conjunto de acciones mientras seaverdadera una determinada condición, para lo cual ejecuta primera la acción y luegoverifica 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.EjemploSe 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));

Page 28: EDatos Manual

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

Page 29: EDatos Manual

UTP -29-

Uso de la sentencia while

La estructura while repite una acción o un conjunto de acciones mientras sea verdadera unadeterminada 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 accionesencerradas 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 variabledepende 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; // contadorint suma=0; //acumulador de suma de enteros

Page 30: EDatos Manual

UTP -30-

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

int op; // (1 ) variable de lectura de opciondo{

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 opcionesswitch(op){

case 1: {// ingreso de datosbreak; }case 2:{ // mostrar resultados

break; }}

}while(op!=3); // (2) sentencia do_while para ejecutar el menu

Impresión del menu

Page 31: EDatos Manual

UTP -31-

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

#include<iostream.h> void main(){

int num;int suma=0; //acumuladorint cp=0, ci=0, c=0; // contadoreswhile(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ónsuma=suma+num;if(num%2==0)cp++;elseci++;}

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;

}}

Page 32: EDatos Manual

UTP -32-

Ejercicios Propuestos1) 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 cantidadde 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 correspondienteen 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 anteriorentre dos y el residuo es el segundo dígito (de la derecha) del número en binario, secontinúa este proceso hasta que el cociente de la división es 0. Ejemplo: Suponga que elnúmero en decimal que se desea transformar a su equivalente en binario es el 11:

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

Page 33: EDatos Manual

UTP -33-

6) Escribe un algoritmo que lea un número natural N y un carácter. La salida debe ser unrombo compuesto del carácter y de la anchura que especifica el número N. Por ejemplo, siN 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, tomandocomo entrada el número de filas de la misma.

1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1

Page 34: EDatos Manual

UTP -34-

Uso de la sentencia forLa estructura de repetición for contempla todos los elementos de la repetición controladapor contador (repetición en la que se conoce el numero de veces que se repetirá el cuerpodel bucle) al incluir al contador como parte de la propia estructura.

for(inicialización; condición; incremento/decremento){accion1;accion2;}

EjemploDiseñ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:123..n

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

Page 35: EDatos Manual

UTP -35-

EjercicioDiseñe un programa que imprima una tabla de cuadrados y de cubos para los números del 1al 10.1 1 12 4 83 9 274 16 645 25 1256 36 2167 49 3438 64 5129 81 72910 100 1000

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

EjercicioDiseñ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;}

Page 36: EDatos Manual

UTP -36-

else{s=s+i;cout<<“+”<<i;}

}}cout<<“La suma de la serie es:”<<s<<ende;}

EjercicioDiseñ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”;}}EjercicioDiseñe un programa que lea Nombre y edad de 5 alumnos y calcule la edad promedio asicomo 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+edadif(edad>max)max=edad;}p=(double) s/5;cout<<“El promedio de edades es:”<<+p<<endl;

Page 37: EDatos Manual

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 perfectos3. Diseñe un programa para hallar la suma de N términos de la siguiente serie:

1 + 1/32+ 1/5

2+ 1/7

2+ 1/9

2+............................

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

5. Escriba un programa que imprima los primeros n números naturales pares. Valide elvalor 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 conbase y altura N. Por ejemplo si N=5 debería dibujarse:

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

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

abc = a3 + b3 + c3

8. Dado un número natural n encuentre otro entero m que sea n al revés, invirtiendo elorden de los dígitos y diga si n es un palíndromo. Si n es un palíndromo, entonces se leeigual 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. Mientrasque si n es 254, entonces m será 452, por lo tanto n no es palíndromo.

Page 38: EDatos Manual

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 aliniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas encualquier función.

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

Si dos variables, una global y una local, tienen el mismo nombre, la localprevalecerá 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 declaradasen 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 partesmá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 devueltopor la función será de este tipo. Por defecto, es decir, si no indicamos el tipo, lafunción devolverá un valor de tipo entero ( int ). Si no queremos que retorne ningúnvalor deberemos indicar el tipo vacío ( void ).

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

Page 39: EDatos Manual

UTP -39-

tipo y nombre de argumentos: son los parámetros que recibe la función. Losargumentos 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 queno reciban argumentos.

bloque de sentencias: es el conjunto de sentencias que serán ejecutadas cuando serealice 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 últimorecalcar que los argumentos de la función y sus variables locales se destruirán alfinalizar 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 loque se conoce como prototipo de una función. Para que un programa en C seacompatible entre distintos compiladores es imprescindible escribir los prototipos de lasfunciones.

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

En el ejemplo adjunto podremos ver la declaración de una función ( prototipo ). Alno recibir ni retornar ningún valor, está declarada como void en ambos lados. Tambiénvemos que existe una variable global llamada num. Esta variable es reconocible entodas las funciones del programa. Ya en la función main encontramos una variablelocal 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 hacemediante la instrucción return, que finaliza la ejecución de la función, devolviendo o

Page 40: EDatos Manual

UTP -40-

no un valor.

En una misma función podemos tener más de una instrucción return. La forma deretornar 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, elvalor 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 podemosllamar 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 argumentoenviado, NO afectará al valor original de las variables utilizadas en la llamada. Escomo si trabajaramos con una copia, no con el original. No es posible enviar por valorarrays, deberemos hacerlo por referencia.

Por referencia: lo que hacemos es enviar a la función la dirección de memoriadonde se encuentra la variable o dato. Cualquier modificación SI afectará a lasvariables 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;}

Page 41: EDatos Manual

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 lavariable enviada. Esto le indica al compilador que la función que se ejecutará tendraque 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 queantes y después de la llamada, las variables mantienen su valor. Solamente semodifica en la función intercambio ( paso por valor ).

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

Las variables con un * son conocidas como punteros, el único dato en 'C' quepuede 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;

}

Page 42: EDatos Manual

UTP -42-

Los argumentos de la función main

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

Los argumentos que puede recibir son:

argc: es un contador. Su valor es igual al número de argumentos escritos en lalí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 losargumentos, uno por cadena.

En este ejemplo vamos a ver un pequeño programa que escribirá un saludo porpantalla (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];

}

Page 43: EDatos Manual

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 num1y num2 enteras y regrese un resultado entero.

3. Escriba una función llamada media_de_3 que reciba como parámetro un datoentero y lo divida entre 3. Suponga que el dato enviado a la función es el totalde sumar 3 números, por lo que el resultado de esta función será la media delos 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 losejercicios anteriores y que, por último, despliegue el valor promedio de los tresdatos con un mensaje apropiado. ¿Qué cambios necesitaría realizar a lasfunciones para obtener el promedio de más de 3 datos?

5. Escriba una función llamada cuadrado que tenga un parámetro de entradallamado longitud y entregue como resultado el perímetro del cuadrado cuyolado 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 entradallamados x1, x2, y1, y2 y que entregue como resultado la distancia entre dospuntos cuyas coordenadas son (x1, y1) y (x2, y2) según la siguiente fórmula:

212

212 )()( xxyydist −+−=

Page 44: EDatos Manual

UTP -44-

7. Un piso rectangular que mide 12 metros por 15 metros está cubiertoparcialmente por tapetes circulares. El radio de un tapete es un metro. El radiodel 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 queregrese el valor del área de ese círculo. Suponga que el radio y el áreason reales.

b) Una función con dos parámetros reales que calcule el área de unrectángulo de base y altura dadas.

8. Escriba una función llamada digfinal que tenga un parámetro de entradallamado número y que entregue como resultado el dígito de las unidades delnú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 tipocarácter. La función deberá sumar, restar, multiplicar o dividir los valores de losdos primeros parámetros dependiendo del código indicado en el tercerparámetro, y devolver el resultado.

10. Escribe una función que devuelva el (a) factorial, (b) n-simo número deFibonacci, 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úmerosdesde el 2 hasta la ,n . Lo cual ahorra muchas operaciones. Si ademásconsideramos que basta con saber si es par o no al principio, podemosahorrarnos la mitad de las pruebas de divisores, eliminando todos lospares. Por fin una última mejora, importante, es eliminar los múltiplos detres.

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 lepasa como parámetro.

Page 45: EDatos Manual

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 yutilizar uno u otro con sólo cambiar el índice que lo referencia. El índice será un valorentero 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 parareferenciar 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 deelementos del vector ( se debe indicar entre corchetes [ ] ). En el ejemplo puedesobservar que la variable i es utilizada como índice, el primer for sirve para rellenar elvector y el segundo para visualizarlo. Como ves, las posiciones van de 0 a 9 ( total 10elementos ).

/* 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 lohacemos 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 quedeberemos indicar en que elemento se encuentra el fin de la cadena mediante elcaracter nulo (\0). Esto no lo controla el compilador, y tendremos que ser nosotros losque insertemos este caracter al final de la cadena.

Por tanto, en un vector de 10 elementos de tipo char podremos rellenar unmáximo de 9, es decir, hasta vector[8]. Si sólo rellenamos los 5 primeros, hastavector[4], debemos asignar el caracter nulo a vector[5]. Es muy sencillo:vector[5]='\0'; .

Page 46: EDatos Manual

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 seencuentra 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 escierto, coloca el caracter nulo en el elemento nº20 (cadena[19]). En caso contrariotenemos el else, que asigna el caracter nulo al elemento que almacenó el caracterENTER.

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

Llamadas a funciones con arrays

Como ya se comentó en el tema anterior, los arrays únicamente pueden serenviados a una función por referencia. Para ello deberemos enviar la dirección dememoria 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++) {

Page 47: EDatos Manual

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ónse podía haber declarado de otra manera, aunque funciona exactamente igual:

declaración o prototipovoid visualizar(int *);

desarrollo de la funciónvoid visualizar(int *array)

Matrices

Una matriz es un array multidimensional. Se definen igual que los vectores exceptoque 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 confilas y columnas.

La matriz tridimensional se utiliza, por ejemplo, para trabajos gráficos con objetos3D.

En el ejemplo puedes ver como se rellena y visualiza una matriz bidimensional. Senecesitan dos bucles para cada una de las operaciones. Un bucle controla las filas yotro 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 */

Page 48: EDatos Manual

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 elorden en el que los valores son asignados a los elementos de la matriz. Veamosalgunos 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]=4numeros[1][0]=5 numeros[1][1]=6 numeros[1][2]=7 numeros[1][3]=8numeros[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]);

Page 49: EDatos Manual

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

Page 50: EDatos Manual

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

Page 51: EDatos Manual

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

Page 52: EDatos Manual

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

Page 53: EDatos Manual

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*/

Page 54: EDatos Manual

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 diferentedel 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 delarreglo 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 delarreglo*/ 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; }

Page 55: EDatos Manual

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;

}

Page 56: EDatos Manual

UTP -56-

PROBLEMAS PROPUESTOS DE ARREGLOS UNIDIMENSIONALES

1. Una fábrica de llantas quiere un programa para calcular el costo total deproducción de los n modelos de llantas que produce. Los datos con que cuentason los siguientes:

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

con: 1 ≤ n ≤ 50, enteroai enterosci enteros

Donde:

ai representa la cantidad de llantas producidas del modelo ici 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, enteroici reales

Donde:

ici representa el ingreso per cápita de cada entidad federativa de laRepública Mexicana.

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

3. Sean los datos:

n, x1, x2, . . . , xn

con: 1 ≤ n ≤ 25, enteroxi reales

Elabore un programa que realice funciones por cada inciso y la función principalque 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

xn

ii

x∑−== 1

Page 57: EDatos Manual

UTP -57-

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

ax x

n

ii

n

=−

=∑ ( )2

1

4. Una compañía ha clasificado a sus n (1 ≤ n ≤ 50) empleados dentro de losgrupos 1 y 2. Cada empleado del grupo 1 recibirá, a partir de ahora, unaumento de $250.00 a la semana sobre su sueldo actual, mientras que a cadauno de los del grupo 2 sólo se le dará $150.00 adicionales por semana. Lainformación que se proporciona de cada empleado es: clave del empleado(comprendida entre 100 y 2500, inclusive), grupo al que pertenece (1 o 2) ysueldo semanal actual (entre $300.00 y $6000.00). Si un empleado del grupo 1con 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 sueldosemanal nuevo para cada empleado, actualizando el grupo si es el caso.

b) Calcule el sueldo promedio de los empleados por grupo y calcule tambiénel 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 lacalificació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 obtuvieroncalificación superior al promedio del grupo.

c) Imprima la calificación que obtuvieron los alumnos cuyas clavesproporcionará el usuario. Se sabrá que el usuario ya no quiere conocermá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 representalas coordenadas del punto i de un polígono irregular de n lados. Suponga quelas coordenadas se proporcionarán en orden adyacente. Elabore una funciónpara leer el número de lados del polígono, leer las coordenadas de los puntos yobtener 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.

Page 58: EDatos Manual

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 demanera creciente, utilizando el algoritmo de selección directa, en ese mismoarreglo y, por último, imprimirlos en orden.

val0 1 2 n-1 49vo v1 v2 . . vn-1 . . .

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

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

a) Buscar un valor x dentro del arreglo utilizando el algoritmo de búsquedasecuencial. La función debe regresar como resultado la posición en laque se encuentra el valor buscado. Si x no se encuentra en el arreglo, lafunció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úsquedabinaria.

c) Insertar un valor x en el arreglo de tal forma que se siga conservando elorden ascendente de los valores. Al insertar se debe verificar que hayaespacio libre y que x no exista en el arreglo. La función debe regresarcomo resultado 1 si se insertó x en el arreglo, 0 si x ya existía en elarreglo y 1 si no existe espacio libre en el arreglo.

d) Eliminar un valor x del arreglo, compactando si es necesario para que nohaya espacios libres entre valores. La función debe regresar comoresultado 1 si se eliminó x, 0 si x no se encontraba en el arreglo y 1 siel arreglo estaba vacío.

e) Sustituir un valor x ya existente en el arreglo con un valor y de talmanera que el arreglo siga conservando su orden creciente. La funcióndebe regresar como resultado 1 si se hizo la sustitución, 0 si x no seencontraba en el arreglo y 1 si el arreglo estaba vació.

9. Elabore un programa modular que lea dos arreglos de diferente número deelementos, los ordene y posteriormente los mezcle en un tercer arregloguardando el orden.

Restricción: no se deben unir los arreglos en desorden, ni copiar un arreglocompleto, es decir, los elementos que se almacenen en el tercer arreglo sedeben ir guardando en orden.

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

Page 59: EDatos Manual

UTP -59-

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

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

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

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

Los términos del polinomio resultante deberán ser desplegados en ordendescendente, observando el siguiente formato:

± cX ^e

Donde:

± representa el signo del términoc representa el coeficiente del término^ significa exponenciacióne 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 + 3X4

-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 elnú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 es7641 y el menor 1467.

Page 60: EDatos Manual

UTP -60-

13. Elabore un programa que utilizando la criba de Eratóstenes encuentre losnú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 1deben inicializarse con 0 (falso).

b) Comience con el índice i=2 del arreglo. Recorra el arreglo, del elementoi+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, peroahora considerando el primer elemento que sea 1 y cuyo índice seamayor a i. Continúe este proceso hasta que haya probado todos loselementos iguales a 1.

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

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

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

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

100 500 600 0 800 700 . . . . . .0 1 2 3 4 5 2N-2 2N- 1 MAX -1

Parcela 1 Parcela 2 Parcela 3 Parcela N

Naranjas parajugo

Naranjas paracomer

100 500 600 0 800 700 . . . . . .0 1 2 3 4 5 2N-2 2N- 1 MAX -1

Parcela 1 Parcela 2 Parcela 3 Parcela N

Naranjas parajugo

Naranjas paracomer

Page 61: EDatos Manual

UTP -61-

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

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

NOTA: Observe que la información de una misma parcela ocupa posicionesconsecutivas 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 decada 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 últimoaño su producción total fue 0.

Page 62: EDatos Manual

UTP -62-

PROBLEMAS PROPUESTOS DE MATRICES

1. Elabore un programa modular que lea una matriz de enteros de m renglones yn 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 escribaponiendo las columnas como renglones y los renglones como columnas.

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

4 7 1 3 52 0 6 9 73 1 2 6 4

entonces el programa debe escribir la matriz transpuesta:

4 2 37 0 11 6 23 9 65 7 4

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

4. Elabore una función que reciba como entrada un entero n y una matrizcuadrada (n x n) de enteros e imprima los elementos que conforman la diagonalque inicia en la esquina superior derecha y termina en la esquina inferiorizquierda.

5. Una matriz cuadrada A se dice que es simétrica si A(i, j) = A(j, i) para todo i, jdentro de los límites de la matriz. Elabore una función que lea una matriz yregrese 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) yotra 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

Page 63: EDatos Manual

UTP -63-

8. Una empresa automotriz tiene cinco agencias y cuenta con la informaciónacerca de las ventas mensuales de automóviles logradas el año pasado por cadauna de éstas. A partir de estos datos la empresa construyó la siguiente matrizventas:

Lomas Vallejo Perisur del Valle OrienteEneroFebrero. . .NoviembreDiciembre

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 10en 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 matrizcomo la que se muestra a continuación.

e partidoss P1 P2 P3 P4 P5 P6 P0(votos anulados)

Edo.0

Edo.2. . .

tado

Edo.31s

La matriz almacena el número de votos que obtuvo cada partido en el estadocorrespondiente, 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 elnúmero de personas que deben votar por estado con el fin de detectaren 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

Page 64: EDatos Manual

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 elestado con mayor porcentaje de abstenciones? ¿Debe ser forzosamenteel 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 4candidatos.

Elabore un programa que:

a) Lea e imprima una tabla indicando los votos obtenidos en cada municipiopor los 4 candidatos.

b) Calcule el total de votos recibidos por cada candidato y el porcentaje deltotal 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, elprograma debe imprimir los dos candidatos más votados, que serán losque pasen a la segunda ronda de las elecciones.

12. Una agencia automotriz distribuye quince modelos diferentes de coches y tienediez vendedores. Se desea un programa que escriba un informe mensual de lasventas por vendedor y modelo, así como el número de automóviles vendidospor cada vendedor y el número total de cada modelo vendido por todos losvendedores. Asimismo, para entregar el premio al mejor vendedor, necesitasaber 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 cantidadde coches que vendieron de cada modelo ese día, el final de datos de las ventas del díase 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 losvotos obtenidos por cada partido en cada estado. Los renglonesrepresentan los estados y las columnas los partidos.

Page 65: EDatos Manual

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 aldiagonal principal, el valor máximo y de cada paralela inferior al diagonalprincipal, el valor mínimo.

14. Los resultados de un torneo de futbol de 16 equipos se encuentranalmacenados en la tabla itorn de 16 renglones por 16 columnas. Por renglonesse tienen los goles que un equipo anotó a los demás, y por columnas se tienenlos 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 41 - 0 4 02 2 - 1 23 3 2 - 04 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 laRepública, quiere saber la distancia que recorre un chofer al ir de una ciudad aotra. Los datos referentes a las distancias están indicados como se muestra acontinuació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:

Page 66: EDatos Manual

UTP -66-

disti, j > 0 representa que hay carretera de la ciudad i a la ciudad j y ladistancia existente entre ambas ciudades.

disti, j = 0 si i diferente a j, representa que no hay carretera entre la ciudad iy la ciudad j.

Se le pide que elabore un programa para:

e) Leer la tabla de distancias, determinando usted la mejor disposición delos 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 unaciudad intermedia c, para hacer el recorrido de la ciudad a a la ciudad c yde la ciudad c a la cuidad b.

h) Si no existe ninguna ruta posible para llegar de a a b, deberá escribir unmensaje. De otro modo, escriba el total de kilómetros recorridos parallegar al destino.

i) Si hay varias ciudades intermedias entre a y b, encuentre la ruta máscorta.

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

Insumos

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

Analizando la matriz anterior, podríamos ver que para producir un motor del tipo 3 esnecesario utilizar 5 unidades del insumo 1, 10 unidades del insumo 2, 15 unidades delinsumo 3, 10 unidades del insumo 5, 15 unidades del insumo 6 y 5 unidades delinsumo 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 83.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:

Page 67: EDatos Manual

UTP -67-

Pedidos del mes de cada motor

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

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

Existencia de Insumos

1 2 3 4 5 6 7 8120 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 unmotor consiste en sumar el producto de insumos necesarios por el costounitario de cada insumo.

h) Obtener e imprimir un arreglo de n elementos, con la cantidad deunidades de cada insumo, necesaria para cumplir con los pedidos delmes.

i) Obtener e imprimir un arreglo de n elementos, cuyos datos indiquencuál es el costo total por concepto de cada insumo para cumplir con lospedidos 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 losinsumos necesarios para la producción mensual menos los insumosexistentes en la planta, con el fin de poder surtir dichos insumos atiempo.

Page 68: EDatos Manual

UTP -68-

CAPITULO 5.- ESTRUCTURAS

Concepto de estructura

Una estructura es un conjunto de una o más variables, de distinto tipo, agrupadasbajo 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 queestá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 dela estructura.

Para definir variables del tipo que acabamos de crear lo podemos hacer de variasmaneras, 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 necesitamoslas variables, las declaramos. En el segundo las declaramos al mismo tiempo que la

Page 69: EDatos Manual

UTP -69-

estructura. El problema del segundo método es que no podremos declarar másvariables de este tipo a lo largo del programa. Para poder declarar una variable de tipoestructura, la estructura tiene que estar declarada previamente. Se debe declararantes de la función main.

El manejo de las estructuras es muy sencillo, así como el acceso a los campos ( ovariables ) 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, ycampo es el nombre de la variable que forma parte de la estructura. Lo veremosmejor 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 variabletemporal de tipo trabajador.

Otra característica interesante de las estructuras es que permiten pasar elcontenido 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 detipo 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 lainicializació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);

Page 70: EDatos Manual

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)

Page 71: EDatos Manual

UTP -71-

Fíjate que en la función visualizar, el acceso a los campos de la variable datos serealiza mediante el operador ->, ya que tratamos con un puntero. En estos casossiempre utilizaremos el operador ->. Se consigue con el signo menos seguido demayor 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. Estose conoce como array de estructuras:

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

Page 72: EDatos Manual

UTP -72-

struct trabajador fijo[20];

Así podremos almacenar los datos de 20 trabajadores. Ejemplos sobre comoacceder 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 loharemos de esta manera:

struct trabajador fijo[20]={{"José","Herrero Martínez",29},{"Luis","GarcíaSánchez",46}};

Typedef

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Estose conoce como array de estructuras: El lenguaje 'C' dispone de una declaraciónllamada typedef que permite la creación de nuevos tipos de datos. Ejemplos:

typedef int entero; /* acabamos de crear un tipo de dato llamadoentero */ entero a, b=3; /* declaramos dos variables de este tipo */

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

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;

Page 73: EDatos Manual

UTP -73-

Arrays de estructuras

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Estose 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 comoacceder 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 loharemos de esta manera:

struct trabajador fijo[20]={{"José","Herrero Martínez",29},{"Luis","GarcíaSánchez",46}};

Typedef

Es posible agrupar un conjunto de elementos de tipo estructura en un array. Estose conoce como array de estructuras: El lenguaje 'C' dispone de una declaraciónllamada 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;

Page 74: EDatos Manual

UTP -74-

PROBLEMAS PROPUESTOS DE STRUCTURE

1. La información de todos los empleados de una cierta compañía está almacenadaen una variable llamada empresa definida como un arreglo de registros. Lainformació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.00c) Sumar al sueldo del tercer empleado $2,000.00.

2. Considerando la siguiente definición y declaraciones, indique para cada uno delos siguientes incisos sin es correcto o no. En caso de ser incorrecto digabrevemente 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;

Page 75: EDatos Manual

UTP -75-

3. En muchas microcomputadoras, el valor MaxInt es 32767. Esto impide un límiteestricto sobre el tamaño de los enteros que puedan utilizarse. Existen diversasformas de ampliar el intervalo de valores; una se sugiere por analogía con loque 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, comoen estos ejemplos:

213 567 1983 175 000

Podríamos optar por utilizar un registro con tres enteros para representar elnúmero de unidades de millón, unidades de millar y las unidades. Mediante eluso de esta representación, escriba un subprograma para resolver cada una delas 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 sugeriralgunas 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 losatletas (utilice el vector ats). El archivo se debe declarar como local al móduloya que en el resto del programa no se va a usar. No se sabe de cuántos atletashay almacenadas medallas en el archivo. El archivo no almacena toda lainformación de los atletas, sólo las medallas.

Page 76: EDatos Manual

UTP -76-

5. Se tiene un arreglo de una dimensión en el que cada uno de sus elementostiene la siguiente estructura:

CLAVE NOMBRE SEMESTRE MATERIAS

En MATERIAS se almacena información acerca de las 6 calificaciones obtenidaspor un alumno en el semestre indicado por SEMESTRE (entero). Suponiendoque en el arreglo ya se almacena la información completa de n alumnos y queestá ordenado en forma ascendente por clave, escriba:

a) La definición del registro y la declaración de la variable donde se guardala información de los n alumnos.

b) Una función que busque en el arreglo una determinada clave, si éstaexiste regrese como valor el lugar en el arreglo donde se encuentra. Si laclave 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 palumnos correspondientes.

6. En un archivo se tiene información sobre los miembros de un coro. Lainformació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 lainformación de los miembros del coro.

b) Un módulo para leer la información del archivo y almacenarla en elvector.

c) Un módulo que calcule el porcentaje de miembros del coro que tienenuna determinada parte de voz.

d) Un módulo que calcule el porcentaje de los miembros de una cierta partede voz que tienen una determinada extensión. Por ejemplo, el porcentajede 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 detexto en un arreglo de registros. Cuando el usuario teclee un nombre, elprograma 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 yagregará el nombre y el número en el arreglo.

Page 77: EDatos Manual

UTP -77-

La información no se encuentra ordenada por lo que tendrá que hacer unabúsqueda secuencial.

8. Defina un registro para representar la información de los alumnos de unaescuela. La información que se desea guardar de cada uno es: nombre (pila,apellido), teléfono, clave y calificación. Posteriormente, defina una variable parapoder almacenar 80 alumnos y escriba las instrucciones necesarias para leer elapellido de los 80 alumnos.

9. Un grupo consta de n alumnos (máximo 50), donde cada alumno cursa 5materias. 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 deregistros, lea la información de cada alumno e imprima la clave, promedioredondeado a un entero y una barra horizontal de tantos asteriscos como fue supromedio.

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

Por último, el programa debe crear un archivo de texto, que se utilizará comoreporte, 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 porpaíses conteniendo ciudades, las cuales, a su vez, tienen pueblos.

a) Haga las definiciones necesarias y la declaración de la variable delmundo. Suponga que de cada continente, país, ciudad y pueblo seconoce el nombre y el número de habitantes.

b) Obtenga en la variable pob el valor de la población del segundocontinente.

c) Obtenga el total de habitantes del cuarto continente, suponiendo quesólo se conoce la población de los pueblos.

d) Escriba el quinto carácter del nombre de la segunda ciudad del octavopaí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 undeterminado profesor. El programa deberá tener un módulo que realice unabúsqueda binaria para encontrar al profesor en cuestión en NOMINA, lainformación que se proporciona es el nombre completo.

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

v Clave. Entero.v Sueldo. Realv Cantidad de tareas pendientes. Entero (máximo 30).v Tareas pendientes. Vector.

• Descripción.• Fecha de asignación.

Page 78: EDatos Manual

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.

Page 79: EDatos Manual

UTP -79-

CAPITULO 6.- MANEJO DE CADENAS

Antes de entrar en el tema de los "arrays" también conocidos como arreglos, tablas omatrices, 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", terminadoscon el carácter nulo, es decir el valor numérico 0. Internamente se almacenan enposiciones consecutivas de memoria. Este tipo de estructuras recibe un tratamientoespecial, 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 realmentecorchetes, por eso están en negrita.

Cuando se declara una cadena hay que tener en cuenta que tendremos que reservaruna posición para almacenar el carácter nulo, de modo que si queremos almacenar lacadena "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 individualesque componen la cadena, simplemente indicando la posición. Por ejemplo el tercercarácter de nuestra cadena de ejemplo será la 'L', podemos hacer referencia a él comoSaludo[2]. Los índices tomarán valores empezando en el cero, así el primer carácter denuestra cadena sería Saludo[0], que es la 'H'.

Una cadena puede almacenar informaciones como nombres de personas, mensajes deerror, números de teléfono, etc.

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

char Saludo[5];Saludo = "HOLA"

Producirá un error en el compilador, ya que una cadena definida de este modo seconsidera 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';

Page 80: EDatos Manual

UTP -80-

O bien:

char Saludo[5] = "HOLA";

Si te parece un sistema engorroso, no te preocupes, en próximos capítulos veremosfunciones que facilitarán la asignación de cadenas. Existen muchas funciones para eltratamiento de cadenas, como veremos, que permiten compararlas, copiarlas, calcularsu longitud, imprimirlas, visualizarlas, guardarlas en disco, etc. Además,frecuentemente nos encontraremos a nosotros mismos creando nuevas funciones quebá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 dememoria. 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 determinació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:

Page 81: EDatos Manual

UTP -81-

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

Copia la cadena orig a dest, la copia de caracteres se detendrá cuando sea copiado elcará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 resultadoserá 0. La comparación se realiza carácter a carácter. Mientras los caracterescomparados sean iguales, se continúa con el siguiente carácter. Cuando se encuentrancaracteres distintos, aquél que tenga un código ASCII menor pertenecerá a la cadenamenor. Por supuesto, si las cadenas son iguales hasta que una de ellas se acaba, lamá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)

Page 82: EDatos Manual

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 resultanteserá 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á connulo si la longitud de orig es maxlong o más. Valor de retorno:

"strncpy" devuelve el puntero dest.

Page 83: EDatos Manual

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 primerosmaxlong 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.

Page 84: EDatos Manual

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, ydespué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 imprimatodos 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 cuentecuántas veces aparece la letra en la frase.

3. Elabore un programa que lea una frase y cuente cada una de las vocalesminú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 letrase 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 escribiruna 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 aparececodificada por medio de un conjunto de parejas de dígitos y letras donde el

Page 85: EDatos Manual

UTP -85-

dígito indica el número de veces que se repite la letra que lo sucede. Elprograma debe leer en una línea la sucesión codificada para despuésdecodificarla. 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 encuentranen minúsculas por mayúsculas e imprima el texto modificado.

Page 86: EDatos Manual

UTP -86-

Los siguientes ejercicios deben resolverse utilizando las funciones de labiblioteca string.h.

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

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

10. Elabore un programa que realice la concatenación de dos cadenas decaracteres. Su programa debe leer dos cadenas de caracteres de, a lo más 20caracteres, cada una, y obtener, en una tercera cadena, la concatenación de lasdos primeras.

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

12. Elabore un programa que lea una frase de, a lo más, 50 caracteres y cree unasegunda cadena con la primera palabra de la frase original que empiece con laletra 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 sucomputadora 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 delprimer apellido, primera vocal del primer apellido, inicial del segundo apellido einicial 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 unaclave.

Prof. Ing. Alberto Moreno CuevaEnlaces de Interes:http://www.mailxmail.com/curso/informatica/algoritmos/capitulo18.htm