fundamentos de la programación 5 - ucmolimpiadas.informatica.ucm.es/files/fp/05...fundamentos de la...

40
5 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez/Pablo Moreno Ger Facultad de Informática Universidad Complutense Fundamentos de la programación Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Tipos de datos 514 Arrays de nuevo 517 Arrays y bucles for 520 Más sobre arrays 522 Inicialización de arrays 523 Enumerados como índices 524 Paso de arrays a subprogramas 525 Implementación de listas 528 Cadenas de caracteres 531 Cadenas de caracteres de tipo string 535 Entrada/salida con string 539 Operaciones con string 541 Estructuras 543 Estructuras dentro de estructuras 549 Arrays de estructuras 550 Arrays dentro de estructuras 551 Listas de longitud variable 552 Un ejemplo completo 558 El bucle do..while 562

Upload: others

Post on 05-Aug-2021

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

5

GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

GradoenIngenieríadeComputadores

LuisHernándezYáñez/PabloMorenoGer

FacultaddeInformáticaUniversidadComplutense

Fundamentos de la programaciónLuis Hernández Yáñez/Pablo M

oreno Ger

Fundamentos de la programación: Tipos de datos estructurados

Tipos de datos 514Arrays de nuevo 517Arrays y bucles for 520Más sobre arrays 522

Inicialización de arrays 523Enumerados como índices 524Paso de arrays a subprogramas 525

Implementación de listas 528Cadenas de caracteres 531Cadenas de caracteres de tipo string 535

Entrada/salida con string 539Operaciones con string 541

Estructuras 543Estructuras dentro de estructuras 549Arrays de estructuras 550Arrays dentro de estructuras 551

Listas de longitud variable 552Un ejemplo completo 558El bucle do..while 562

Page 2: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 514Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Clasificacióndetipos

Simples Estándar:int,float,double,char,bool

Conjuntodevalorespredeterminado

Definidosporelusuario:enumeradosConjuntodevaloresdefinidoporelprogramador

Estructurados Coleccioneshomogéneas:arrays

Todosloselementosdelmismotipo

Coleccionesheterogéneas:estructurasLoselementospuedenserdetiposdistintos

Página 515Fundamentos de la programación: Tipos de datos estructurados

Page 3: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Coleccionesotiposaglomerados

Agrupacionesdedatos(elementos): Todos del mismo tipo: array o tabla

De tipos distintos: estructura, registro o tupla

Arrays(tablas) Elementosorganizadosporposición:0,1,2,3,...

Accesoporíndice:0,1,2,3,...

Unaovariasdimensiones

Estructuras(tuplas,registros) Elementos(campos)sinordenestablecido

Accesopornombre

Página 516Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 517Fundamentos de la programación: Tipos de datos estructurados

Page 4: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 518Fundamentos de la programación: Tipos de datos estructurados

[]

EstructurasecuencialCadaelementoseencuentraenunaposición(índice):

Losíndicessonenterospositivos

Elíndicedelprimerelementosiemprees0

Losíndicesseincrementandeunoenuno

Accesodirecto

Acadaelementoseaccedeatravésdesuíndice:ventas[4] accedeal5ºelemento(contieneelvalor435.00)cout << ventas[4];

ventas[4] = 442.75;

ventas 125.40 76.95 328.80 254.62 435.00 164.29 0.00

0 1 2 3 4 5 6

Datosdeunmismotipobase:SeusancomocualquiervariableDatosdeunmismotipobase:Seusancomocualquiervariable

Luis Hernández Yáñez/Pablo M

oreno Ger

Declaracióndetiposdearraysconst int Dimensión = ...;

typedef tipo_base tNombre[Dimensión];

Ejemplo:const int Dias = 7;

typedef double tVentas[Dias];

Declaracióndevariablesdetiposarray:comocualquierotratVentas ventas;

¡NOseinicializanloselementosautomáticamente!

¡Esresponsabilidaddelprogramadorusaríndicesválidos!Nosepuedencopiararraysdirectamente(array1 = array2)

Hayquecopiarloselementoaelemento

Página 519Fundamentos de la programación: Tipos de datos estructurados

Page 5: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Procesamientodearrays Recorridos Búsquedas Ordenación etcétera...

RecorridodearraysconbuclesforArrays:tamañofijo Buclesderecorridofijo(for)tVentas ventas;double media, total = 0; ...for (int i = 0; i < Dias; i++) {

total = total + ventas[i];}media = total / Dias;

Página 520Fundamentos de la programación: Tipos de datos estructurados

const int Dias = 7;

typedef double tVentas[Dias];

Luis Hernández Yáñez/Pablo M

oreno Ger

tVentas ventas;double media, total = 0; ...for (int i = 0; i < Dias; i++) {

total = total + ventas[i];}

Memoria

Dias 7

ventas[0] 12.40

ventas[1] 10.96

ventas[2] 8.43

ventas[3] 11.65

ventas[4] 13.70

ventas[5] 13.41

ventas[6] 14.07

media ?

total 0.00

i 0

12.40

1

23.36

2

31.79

3

43.44

4

84.62

7

Página 521Fundamentos de la programación: Tipos de datos estructurados

12.40 10.96 8.43 11.65 13.70 13.41 14.07

0 1 2 3 4 5 6

falsefalsetruetrue

total+=ventas[i]

i++

i<Dias

i = 0

......

Page 6: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 522Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Podemosinicializarloselementosdelosarraysenladeclaración

Asignamos unaseriedevaloresalarray:const int DIM = 10;

typedef int tTabla[DIM];

tTabla i = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Seasignanlosvaloresporsuorden:i[0] i[1] i[2] i[3] i[4] ... i[9]

1º 2º 3º 4º 5º  ...  10º

Sihaymenosvaloresqueelementos,losrestantesseponena0

tTabla i = { 0 }; // Pone todos los elementos a 0

Página 523Fundamentos de la programación: Tipos de datos estructurados

Page 7: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

const int Colores = 3,

typedef enum { rojo, verde, azul } tRGB;

typedef int tColor[Colores];

tColor color;

...

cout << "Cantidad de rojo (0‐255): ";

cin >> color[rojo];

cout << "Cantidad de verde (0‐255): ";

cin >> color[verde];

cout << "Cantidad de azul (0‐255): ";

cin >> color[azul];

Página 524Fundamentos de la programación: Tipos de datos estructurados

Recuerdaqueinternamenteseasignanenterosapartirde0alosdistintossímbolosdelenumerado

rojo 0verde 1azul 2

Luis Hernández Yáñez/Pablo M

oreno Ger

Simulacióndepasodeparámetroporreferencia

Sinponer&enladeclaracióndelparámetro

Lossubprogramasrecibenladirecciónenmemoriadelarray

const int Max = 10;

typedef int tTabla[Max];

void inicializa(tTabla tabla); // Sin poner &

Lasmodificacionesdelarrayquedanreflejadasenelargumento

inicializa(array);

Siinicializa()modificaalgúnelementodetabla,automáticamentequedamodificadoeseelementodearray

¡Sonelmismoarray!

Página 525Fundamentos de la programación: Tipos de datos estructurados

Page 8: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 526Fundamentos de la programación: Tipos de datos estructurados

0 1 2 3 4 5 6 7 8 9

const int Dim = 10;typedef int tTabla[Dim];void inicializa(tTabla tabla); // no se usa &

void inicializa(tTabla tabla) {for (int i = 0; i < Dim; i++)

tabla[i] = i;}int main() {

tTabla array;inicializa(array); // array queda modificadofor (int i = 0; i < Dim; i++)

cout << array[i] << " ";...

Luis Hernández Yáñez/Pablo M

oreno Ger

¿Cómoevitarquesemodifiqueelarray?Usandoelmodificadorconst enladeclaracióndelparámetro:

const tTabla tabla Unarraydeconstantes

void muestra(const tTabla tabla);

Elargumentosetratarácomounarraydeconstantes

Sienelsubprogramahayalgunainstrucciónqueintentemodificarunelementodelarray:errordecompilaciónvoid muestra(const tTabla tabla) {

for (int i = 0; i < Dim; i++) {cout << tabla[i] << " ";// OK. Se accede, pero no se modifica

}}

Página 527Fundamentos de la programación: Tipos de datos estructurados

Page 9: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 528Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

ListasconunnúmerofijodeelementosArrayconelnºdeelementoscomodimensiónconst int NUM = 100;

typedef double tLista[NUM]; // Exactamente 100 double

tLista lista;

Recorridodelalista:for (int i = 0; i < NUM; i++) {

...

Búsquedaenlalista:while ((i < NUM) && !encontrado) { 

...

Página 529Fundamentos de la programación: Tipos de datos estructurados

Page 10: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

ListasconunnúmerovariabledeelementosArrayconunmáximodeelementos+Contadordeelementosconst int MAX = 100;

typedef double tLista[MAX]; // Hasta 100 elementos

tLista lista; 

int contador = 0; // Se incrementa al insertar

Recorridodelalista:for (int i = 0; i < contador; i++) {

...

Búsquedaenlalista:while ((i < contador) && !encontrado) {

...

Página 530Fundamentos de la programación: Tipos de datos estructurados

¿Arrayycontadorporseparado? Estructuras

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 531Fundamentos de la programación: Tipos de datos estructurados

Page 11: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

ArraysdecaracteresCadenas:secuenciasdecaracteresdelongitudvariable

"Hola" "Adiós" "Supercalifragilístico" "1234 56 7"

Variablesdecadena:contienensecuenciasdecaracteres

Seguardanenarraysdecaracteres:tamañomáximo(dimensión)

Notodaslasposicionesdelarraysonrelevantes:

Longituddelacadena:númerodecaracteres,desdeelprimero,querealmenteconstituyenlacadena:

Longitudactual:4

Página 532Fundamentos de la programación: Tipos de datos estructurados

H o l a

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Luis Hernández Yáñez/Pablo M

oreno Ger

Longituddelacadena

Longitud:5

Longitud:21

Necesidaddesaberdóndeterminanloscaracteresrelevantes:

Mantenerlalongituddelacadenacomodatoasociado

Colocaruncarácterdeterminaciónalfinal(centinela)

Página 533Fundamentos de la programación: Tipos de datos estructurados

A d i ó s

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

S u p e r c a l i f r a g i l í s t i c o

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

A d i ó s \0

0 1 2 3 4 5 6 7 8 9 10

Page 12: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

CadenasdecaracteresenC++Dosalternativasparaelmanejodecadenas:

CadenasalestilodeC(terminadasennulo) Tipostring

CadenasalestilodeC Anexodeltema Arraysdetipochar conunalongitudmáxima

Unúltimocarácterespecialalfinal:'\0'

Tipostring

Cadenasmássofisticadas

Sinlongitudmáxima(gestiónautomáticadelamemoria) Multituddefuncionesdeutilidad(bibliotecastring)

Página 534Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 535Fundamentos de la programación: Tipos de datos estructurados

Page 13: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Eltipostring Eltipoasumelaresponsabilidaddelagestióndememoria

Defineoperadoressobrecargados(+paraconcatenar)

Cadenasmáseficientesysegurasdeusar

Bibliotecastring

Requiereestablecerelespaciodenombresa std

Sepuedeninicializarenladeclaración

Sepuedencopiarconeloperadordeasignación

Sepuedenconcatenarconeloperador+

Multituddefuncionesdeutilidad

Página 536Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

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

int main() {string cad1("Hola");   // inicializaciónstring cad2 = "amigo"; // inicializaciónstring cad3;cad3 = cad1; // copiacout << "cad3 = " << cad3 << endl;cad3 = cad1 + " "; // concatenacióncad3 += cad2;      // concatenacióncout << "cad3 = " << cad3 << endl;cad1.swap(cad2);  // intercambiocout << "cad1 = " << cad1 << endl;cout << "cad2 = " << cad2 << endl;

return 0;}

Página 537Fundamentos de la programación: Tipos de datos estructurados

string.cppstring.cpp

Page 14: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Longituddelacadena:cadena.length() ocadena.size()

Sepuedencompararconlosoperadoresrelacionales:if (cad1 <= cad2) { ...

Accesoaloscaracteresdeunacadena: Comoarraydecaracteres:cadena[i]

Sincontroldeaccesoaposicionesinexistentesdelarray

Sólodebeusarsesiseestásegurodequeelíndiceesválido Funciónat(índice):cadena.at(i)

Errordeejecuciónsiseaccedeaunaposicióninexistente

Página 538Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Semuestranenlapantallaconcout <<

Lecturaconcin >>:terminaconespacioenblanco(inc.Intro)

Elespacioenblancoquedapendiente

Descartarelrestodeloscaracteresdelbúfer:cin.sync();

Lecturaincluyendoespaciosenblanco:getline(cin, cadena)

Guardaenlacadena loscaracteresleídoshastaelfindelínea

Lecturadearchivosdetexto:Igualquedeconsola;sync() notieneefectoarchivo >> cadena      getline(archivo, cadena)

Página 539Fundamentos de la programación: Tipos de datos estructurados

Page 15: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 540Fundamentos de la programación: Tipos de datos estructurados

string2.cppstring2.cpp

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

int main() {string nombre, apellidos;cout << "Introduzca un nombre: ";cin >> nombre;cout << "Introduzca los apellidos: ";cin.sync();getline(cin, apellidos);cout << "Nombre completo: " << nombre << " "

<< apellidos << endl;

return 0;}

Luis Hernández Yáñez/Pablo M

oreno Ger

cadena.substr(posición, longitud)

Subcadenadelongitud caracteresdesdeposiciónstring cad = "abcdefg";cout << cad.substr(2, 3); // Muestra cde

cadena.find(subcadena)

Posicióndelaprimeraocurrenciadesubcadena encadenastring cad = "Olala";cout << cad.find("la"); // Muestra 1

(Recuerdaquelosarraysdecaracterescomienzanconelíndice0)

cadena.rfind(subcadena)

Posicióndelaúltimaocurrenciadesubcadena encadenastring cad = "Olala";cout << cad.rfind("la"); // Muestra 3

Página 541Fundamentos de la programación: Tipos de datos estructurados

Page 16: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

cadena.erase(ini, num)

Eliminanum caracteresapartirdelaposicióninistring cad = "abcdefgh";cad.erase(3, 4); // cad ahora contiene "abch"

cadena.insert(ini, cadena2)

Insertacadena2 apartirdelaposicióninistring cad = "abcdefgh";cad.insert(3, "123"); // cad ahora contiene "abc123defgh"

http://www.cplusplus.com/reference/string/string/

Página 542Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 543Fundamentos de la programación: Tipos de datos estructurados

Page 17: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Coleccionesheterogéneas(tuplas,registros)Elementosde(posiblemente)distintostipos:campos

Camposidentificadosporsunombre

InformaciónrelacionadaquesepuedemanejarcomounaunidadAccesoacadaelementoporsunombredecampo(operador.)

Página 544Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

typedef struct {... // declaraciones de campos (como variables)

} tTipo; // nombre de tipo ‐ ¡al final!

typedef struct {string nombre;string apellidos;int edad;string nif;

} tPersona;

Campos:

Tiposestándaropreviamentedeclarado

Página 545Fundamentos de la programación: Tipos de datos estructurados

Page 18: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

tPersona persona;

LasvariablesdetipotPersona contienencuatrodatos(campos):nombre apellidos edad nif

Accesoaloscamposconeloperadorpunto(.):persona.nombre // una cadena (string)

persona.apellidos // una cadena (string)

persona.edad // un entero (int)

persona.nif // una cadena (string)

Podemoscopiardosestructurasdirectamente:tPersona persona1, persona2;

...

persona2 = persona1;

Secopiantodosloscamposalavez

Página 546Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

typedef struct {string nombre;string apellidos;int edad;string nif;

} tPersona;tPersona persona;

Página 547Fundamentos de la programación: Tipos de datos estructurados

Luis Antonionombre Luis Antonionombrenombre

Hernández Yáñezapellidos Hernández Yáñezapellidosapellidos

22edad 22edadedad

00223344Fnif 00223344Fnifnif

Memoria

persona.nombreLuis 

Antonio

persona.apellidosHernández 

Yáñez

persona.edad 22

persona.nif 00223344F

personapersona

Page 19: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

typedef struct {string nombre;string apellidos;int edad;string nif;

} tPersona;tPersona persona;

LoscamposnosiguenningúnordenestablecidoAccesodirectopornombredecampo(operador.)

Concadacamposepuedehacerloquepermitasutipo

Página 548Fundamentos de la programación: Tipos de datos estructurados

Lasestructurassepasanporvalor(sin&)oporreferencia(con&)alossubprogramasLasestructurassepasanporvalor(sin&)oporreferencia(con&)alossubprogramas

Luis Hernández Yáñez/Pablo M

oreno Ger

typedef struct { typedef struct { string dni; ...char letra; tNif nif;

} tNif; } tPersona;

tPersona persona;

AccesoalNIFcompleto:persona.nif // Otra estructura

AccesoalaletradelNIF:persona.nif.letra

AccesoalDNI:persona.nif.dni

Página 549Fundamentos de la programación: Tipos de datos estructurados

nombre

apellidos

edad

nif

tPersona

nombrenombre

apellidosapellidos

edadedad

nifnif

tPersonatPersona

dnidni

letraletra

tNiftNif

Page 20: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

const int DIM = 100;typedef struct {

string nombre;string apellidos;int edad;string nif;

} tPersona;typedef tPersona tArray[DIM];tArray personal;

Nombredelatercerapersona:personal[2].nombre

Edaddeladuodécimapersona:personal[11].edad

NIFdelaprimerapersona:personal[0].nif

Página 550Fundamentos de la programación: Tipos de datos estructurados

nombre

apellidos

edad

nif

tPersona

nombrenombre

apellidosapellidos

edadedad

nifnif

tPersonatPersonanombre

apellidos

edad

nif

nombre

apellidos

edad

nif

nombre

apellidos

edad

nif

nombre

apellidos

edad

nif

1

0

2

DIM‐1

personalnombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

11

00

22

DIM‐1DIM‐1

personalpersonal

Luis Hernández Yáñez/Pablo M

oreno Ger

const int MAX = 100;typedef struct {

string nombre;string apellidos;int edad;string nif;

} tPersona;typedef tPersona tArray[MAX];typedef struct {

tArray elementos;int contador;

} tLista;tLista lista;

Nombredelatercerapersona:lista.elementos[2].nombre

Edaddeladuodécimapersona:lista.elementos[11].edad

NIFdelaprimerapersona:lista.elementos[0].nif

Página 551Fundamentos de la programación: Tipos de datos estructurados

nombre

apellidos

edad

nif

nombre

apellidos

edad

nif

nombre

apellidos

edad

nif

nombre

apellidos

edad

nif

1

0

2

MAX‐1

elementos

nombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

nombrenombre

apellidosapellidos

edadedad

nifnif

11

00

22

MAX‐1MAX‐1

elementoselementos contadorcontadorcontadorlistalista

Page 21: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 552Fundamentos de la programación: Tipos de datos estructurados

/ Pablo M

oreno Ger

Luis Hernández Yáñez/Pablo M

oreno Ger

Estructuraqueagrupeelarrayyelcontador:const int MAX = 10;typedef double tArray[MAX];typedef struct {

tArray elementos;int contador;

} tLista;

Operacionesprincipales:inserciónyeliminacióndeelementos

6contador 6contadorcontador

Página 553Fundamentos de la programación: Tipos de datos estructurados

elementos

12.0 ‐2.2 5.4 0.0 36.2 35.0 X X X X

0 1 2 3 4 5 6 7 8 9

Nºdeelementos(yprimeríndicesinelemento)Nºdeelementos(yprimeríndicesinelemento)Nºdeelementos(yprimeríndicesinelemento)

Elementossinusar(datosbasura)

Elementossinusar(datosbasura)

Page 22: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

InsertarunnuevoelementoenunaposiciónPosicionesválidas:0acontador

Hayqueasegurarsedequehayasitio(contador<máximo)

Operaciónen3pasos:

1.‐ Abrirhuecoparaelnuevoelemento(desdelaposición)

2.‐ Colocarelelementonuevoenlaposición

3.‐ Incrementarelcontador

6

12.0 ‐2.2 5.4 0.0 36.2 35.0 X X X X

0 1 2 3 4 5 6 7 8 9

42.0

nuevonuevo

Página 554Fundamentos de la programación: Tipos de datos estructurados

3

pospos

Luis Hernández Yáñez/Pablo M

oreno Ger

if (lista.contador < N) {// Abrir huecofor (int i = lista.contador; i > pos; i‐‐) {

lista.elementos[i] = lista.elementos[i ‐ 1];}// Insertar e incrementar contadorlista.elementos[pos] = nuevoElemento;lista.contador++;

}

Página 555Fundamentos de la programación: Tipos de datos estructurados

7

12.0 ‐2.2 5.4 42.0 0.0 36.2 35.0 X X X

0 1 2 3 4 5 6 7 8 9

42.0

nuevonuevo

3

pospos

Page 23: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

EliminarelelementoenunaposiciónPosicionesválidas:0acontador‐1

Desplazaralaizquierdadesdeelsiguienteydecrementarelcontador:

for (int i = pos; i < lista.contador ‐ 1 ; i++) {

lista.elementos[i] = lista.elementos[i + 1];

}

lista.contador‐‐;

6

12.0 ‐2.2 5.4 0.0 36.2 35.0 X X X X

0 1 2 3 4 5 6 7 8 9

Página 556Fundamentos de la programación: Tipos de datos estructurados

3

pospos

Luis Hernández Yáñez/Pablo M

oreno Ger

5

3

pospos

for (int i = pos; i < lista.contador ‐ 1 ; i++) {

lista.elementos[i] = lista.elementos[i + 1];

}

lista.contador‐‐;

6

12.0 ‐2.2 5.4 0.0 36.2 35.0 X X X X

0 1 2 3 4 5 6 7 8 9

Página 557Fundamentos de la programación: Tipos de datos estructurados

3

pospos

12.0 ‐2.2 5.4 36.2 35.0 35.0 X X X X

0 1 2 3 4 5 6 7 8 9

Page 24: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 558Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 559Fundamentos de la programación: Tipos de datos estructurados

DescripciónProgramaquemantengaunalistadelosestudiantesdeunaclase

Decadaestudiante:nombre,apellidos,edad,NIFynota

Sedesconoceelnúmerototaldeestudiantes(máximo100)

Lainformacióndelalistasemantieneenunarchivoclase.txt

Secargaalempezaryseguardaalfinalizar

Elprogramadebeofrecerestasopciones:

— Añadirunnuevoalumno

— Eliminarunalumnoexistente

— Calificaralosestudiantes

— Listadodenotas,identificandolamayorylamedia

Page 25: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

#include <iostream>#include <string>using namespace std;#include <fstream>#include <iomanip>

const int MAX = 100;typedef struct {

string nombre;string apellidos;int edad;string nif;double nota;

} tEstudiante;typedef tEstudiante tArray[MAX];typedef struct {

tArray elementos;int contador;

} tLista;

Página 560Fundamentos de la programación: Tipos de datos estructurados

bd.cppbd.cpp

Declaracionesdeconstantesytiposglobales

Traslasbibliotecas

Declaracionesdeconstantesytiposglobales

Traslasbibliotecas

Luis Hernández Yáñez/Pablo M

oreno Ger

// Prototiposint menu(); // Menú del programa ‐ devuelve la opción elegidavoid cargar(tLista &lista, bool &ok); // Carga del archivovoid guardar(const tLista &lista); // La guarda en el archivovoid leerEstudiante(tEstudiante &estudiante); // Lee los datosvoid insertarEstudiante(tLista &lista, tEstudiante estudiante,

bool &ok); // Inserta un nuevo estudiante en la listavoid eliminarEstudiante(tLista &lista, int pos, bool &ok);// Elimina el estudiante en esa posiciónstring nombreCompleto(tEstudiante estudiante);void calificar(tLista &lista); // Notas de los estudiantesdouble mediaClase(const tLista &lista); // Nota mediaint mayorNota(const tLista &lista);// Índice del estudiante con mayor notavoid mostrarEstudiante(tEstudiante estudiante);void listado(const tLista &lista, double media, int mayor);// Listado de la clase

Página 561Fundamentos de la programación: Tipos de datos estructurados

Losprototipos,despuésdelostiposglobales

Page 26: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 562Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Elbucledo..whiledo cuerpo while (condición);

int i = 1;do {

cout << i << endl;i++;

} while (i <= 100);

Elcuerpo siempreseejecutaalmenosunavez

Elcuerpo esunbloquedecódigo

Página 563Fundamentos de la programación: Tipos de datos estructurados

CondiciónalfinaldelbucleCondiciónalfinaldelbucle

condicióncuerpodo ( ) ;while

Page 27: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

int i = 1;do {

cout << i << endl;i++;

} while (i <= 100);

Página 564Fundamentos de la programación: Tipos de datos estructurados

truetrue

falsefalse

Condición

Cuerpo

falsefalse

truetruei <= 100

cout << i << endl; i++;

i = 1;

Elcuerposeejecutaalmenosunavez

Elcuerposeejecutaalmenosunavez

Luis Hernández Yáñez/Pablo M

oreno Ger

¿Hadeejecutarsealmenosunavezelcuerpodelbucle?cin >> d; // Lectura del 1º do {

while (d != 0) { cin >> d;

suma = suma + d; if (d != 0) { // ¿Final?

cont++; suma = suma + d;

cin >> d; cont++;

} }

} while (d != 0);

cout << "Opción: ";  do { // Más simple

cin >> op; // Lectura del 1º  cout << "Opción: ";

while ((op < 0) || (op > 4)) { cin >> op;

cout << "Opción: ";  } while ((op < 0) || (op > 4));

cin >> op;

}

Página 565Fundamentos de la programación: Tipos de datos estructurados

Page 28: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

int menu() {int op;

do {cout << "1 ‐ Añadir un nuevo estudiante" << endl;cout << "2 ‐ Eliminar un estudiante" << endl;cout << "3 ‐ Calificar a los estudiantes" << endl;cout << "4 ‐ Listado de estudiantes" << endl;cout << "0 ‐ Salir" << endl;cout << "Opción: ";cin >> op;

} while ((op < 0) || (op > 4));

return op;}

Página 566Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 567Fundamentos de la programación: Tipos de datos estructurados

Elarchivoclase.txtUndatoencadalínea

Porcadaestudiante: Nombre(cadena)

Apellidos(cadena)

Edad(entero)

NIF(cadena)

Nota(real;‐1sinocalificado)

TerminaconXXXcomonombre

Elarchivosesuponecorrecto

↲↲

↲↲

↲↲

↲↲

↲↲

↲↲

↲↲

↲↲↲

↲↲

↲↲

↲↲

↲↲

Page 29: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 568Fundamentos de la programación: Tipos de datos estructurados

LecturadelainformacióndeunestudianteNombreyapellidos:Puedehabervariaspalabras getline()

Edad extractor(>>)

NIF:Unasolapalabra extractor(>>)

Nota extractor(>>)

QuedapendientedeleerelIntro

Hayquesaltar(leer)esecarácterconget()

Sino,enelsiguientenombreseleeríaunacadenavacía(Intro)

Noleasdirectamenteenlalista:getline(archivo, lista.elementos[lista.contador].nombre);

LeeenunavariableauxiliardetipotEstudiante

Noleasdirectamenteenlalista:getline(archivo, lista.elementos[lista.contador].nombre);

LeeenunavariableauxiliardetipotEstudiante

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 569Fundamentos de la programación: Tipos de datos estructurados

void cargar(tLista &lista, bool &ok) {tEstudiante estudiante; // Variable auxiliar para leerifstream archivo;char aux;lista.contador = 0; // Inicializamos la listaarchivo.open("clase.txt");if (!archivo.is_open()) {

ok = false;}else {

ok = true;getline(archivo, estudiante.nombre); // Leemos el primer nombrewhile ((estudiante.nombre != "XXX") && (lista.contador < MAX)) {

getline(archivo, estudiante.apellidos);archivo >> estudiante.edad;archivo >> estudiante.nif;archivo >> estudiante.nota;archivo.get(aux); // Saltamos el Introlista.elementos[lista.contador] = estudiante; // Al finallista.contador++; getline(archivo, estudiante.nombre); // Siguiente nombre

} // Si hay más de MAX estudiantes, ignoramos el restoarchivo.close();

}}

Page 30: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 570Fundamentos de la programación: Tipos de datos estructurados

Simplemente,undatoencadalíneayenorden:

void guardar(const tLista &lista) {ofstream archivo;archivo.open("clase.txt");for (int i = 0; i < lista.contador; i++) {

archivo << lista.elementos[i].nombre << endl;archivo << lista.elementos[i].apellidos << endl;archivo << lista.elementos[i].edad << endl;archivo << lista.elementos[i].nif << endl;archivo << lista.elementos[i].nota << endl;

}archivo << "XXX" << endl; // Centinela finalarchivo.close();

}

const tLista &lista ReferenciaconstantePasoporreferenciaperocomoconstante Pasoporvalor

Evitalacopiadelargumentoenelparámetro(estructurasgrandes)

Luis Hernández Yáñez/Pablo M

oreno Ger

void leerEstudiante(tEstudiante &estudiante) {cin.sync(); // Descartamos cualquier entrada pendientecout << "Nombre: ";getline(cin, estudiante.nombre);cout << "Apellidos: ";getline(cin, estudiante.apellidos);cout << "Edad: ";cin >> estudiante.edad;cout << "NIF: ";cin >> estudiante.nif;estudiante.nota = ‐1; // Sin calificar de momentocin.sync(); // Descartamos cualquier entrada pendiente

}

Página 571Fundamentos de la programación: Tipos de datos estructurados

Page 31: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

void insertarEstudiante(tLista &lista, tEstudiante estudiante,bool &ok) {

ok = true;if (lista.contador == MAX) {

ok = false;}else {

lista.elementos[lista.contador] = estudiante;// Insertamos al finallista.contador++;

}}

Página 572Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

void eliminarEstudiante(tLista &lista, int pos, bool &ok) {// Espera el índice del elemento en pos

if ((pos < 0) || (pos > lista.contador ‐ 1)) {ok = false; // Elemento inexistente

}else {

ok = true;for (int i = pos; i < lista.contador ‐ 1; i++) {

lista.elementos[i] = lista.elementos[i + 1];}lista.contador‐‐;

}}

Página 573Fundamentos de la programación: Tipos de datos estructurados

Page 32: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

string nombreCompleto(tEstudiante estudiante) {return estudiante.nombre + " " + estudiante.apellidos;

}

void calificar(tLista &lista) {

for (int i = 0; i < lista.contador; i++) {cout << "Nota del estudiante "

<< nombreCompleto(lista.elementos[i]) << ": ";cin >> lista.elementos[i].nota;

}}

Página 574Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

double mediaClase(const tLista &lista) {double total = 0.0;for (int i = 0; i < lista.contador; i++) {

total = total + lista.elementos[i].nota;}return total / lista.contador;

}

int mayorNota(const tLista &lista) {double max = 0;int pos = 0;for (int i = 0; i < lista.contador; i++) {

if (lista.elementos[i].nota > max) {max = lista.elementos[i].nota;pos = i;

}}return pos;

}

Página 575Fundamentos de la programación: Tipos de datos estructurados

Page 33: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Página 576Fundamentos de la programación: Tipos de datos estructurados

void mostrarEstudiante(tEstudiante estudiante) {cout << setw(35) << left << nombreCompleto(estudiante);cout << estudiante.nif << " ";cout << setw(2) << estudiante.edad << " años ";cout << fixed << setprecision(1) << estudiante.nota;

}

void listado(const tLista &lista, double media, int mayor) {for (int i = 0; i < lista.contador; i++) {

cout << setw(3) << i << ": ";mostrarEstudiante(lista.elementos[i]);if (i == mayor) {

cout << " <<< Mayor nota!";}cout << endl;

}cout << "Media de la clase: " << fixed << setprecision(1)

<< media << endl << endl;}

Luis Hernández Yáñez/Pablo M

oreno Ger

int main() {tLista lista;tEstudiante estudiante;bool exito;int op, pos;

cargar(lista, exito);if (!exito) {

cout << "No se ha podido cargar la lista!" << endl;}else {

do { // El bucle do evita tener que leer antes la primera opciónop = menu();switch (op) {case 1:

{leerEstudiante(estudiante);insertarEstudiante(lista, estudiante, exito);if (!exito) {

cout << "Lista llena: imposible insertar" << endl;}

}break;

Página 577Fundamentos de la programación: Tipos de datos estructurados

Page 34: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

case 2:{

cout << "Posición: ";cin >> pos;eliminarEstudiante(lista, pos ‐ 1, exito);if (!exito) {

cout << "Elemento inexistente!" << endl;}

}break;

case 3:{

calificar(lista);}break;

case 4:{

listado(lista, mediaClase(lista), mayorNota(lista));}

}} while (op != 0);guardar(lista);

}return 0;

}

Página 578Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo M

oreno Ger

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: Tipos de datos estructurados Página 579

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.

Page 35: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

5A

GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

GradoenIngenieríadeComputadores

LuisHernándezYáñez/PabloMorenoGer

FacultaddeInformáticaUniversidadComplutense

Fundamentos de la programaciónLuis Hernández Yáñez/Pablo M

oreno Ger

Fundamentos de la programación: Cadenas al estilo de C (Anexo)

Cadenas al estilo de C 582E/S con cadenas al estilo de C 583La biblioteca cstring 584Ejemplo 585

Page 36: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

Arraysdecaracteresterminadosennuloconst Max = 15;typedef char tCadena[Max];tCadena cadena = "Adiós"; // Inicialización al declarar

Siemprehayalfinaluncarácternulo(códigoASCII0 – '\0')

Indicaqueenesaposiciónterminalacadena(exclusive)

EnelarraycabenMAX‐1caracteressignificativosLongitudmáximadelavariablecadena:14

No sepuedenasignarcadenasliterales:cadena = "Hola";

Ni copiarcadenasdirectamente:cad2 = cad1;

Ni compararconop.relacionales:if (cad1 < cad2) ...

Página 582Fundamentos de la programación: Cadenas al estilo de C (Anexo)

cadena A d i ó s \0

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Luis Hernández Yáñez/Pablo M

oreno Ger

tCadena cadena;

cin >> cadena; // Se añade un nulo al final

Extractor:lalecturaterminaenelprimerespacioenblanco

¡Nosecompruebasiseleenmáscaracteresdelosquecaben!setw():máximodecaracteresacolocar(incluyendoelnulo)cin >> setw(15) >> cadena;

cin.getline(cadena_estilo_C, máx):

Paraleertambiénlosespaciosenblancoynomásdemáx‐1cin.getline(cadena, 15); // Hasta 14 caracteres

cout << cadena << endl; // El nulo no se muestra

Página 583Fundamentos de la programación: Cadenas al estilo de C (Anexo)

cin.getline(cad, máx) CadenasalestilodeCgetline(cin, cad) Cadenasdetipostringcin.getline(cad, máx) CadenasalestilodeCgetline(cin, cad) Cadenasdetipostring

Page 37: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

strlen(cadena):longitudactualdelacadenacout << "Longitud: " << strlen(cadena);

strcpy(destino, origen):copiaorigen endestinostrcpy(cad2, cad1); strcpy(cad, "Me gusta C++");

strcat(destino, origen):añadeorigen alfinaldedestinotCadena cad1 = "Hola", cad2 = "Adiós";strcat(cad1, cad2); // cad1 contiene "HolaAdiós"

strcmp(cad1, cad2):comparalexicográficamentelascadenas0 sisoniguales,1 sicad1 >cad2 ó‐1 sicad1 <cad2tCadena cad1 = "Hola", cad2 = "Adiós";strcmp(cad1, cad2) // Devuelve 1 ("Hola" > "Adiós")

...http://www.cplusplus.com/reference/clibrary/cstring/

Página 584Fundamentos de la programación: Cadenas al estilo de C (Anexo)

Luis Hernández Yáñez/Pablo M

oreno Ger

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

int main() {const int MAX = 20;typedef char tCad[MAX];tCad cadena = "Me gusta C++";cout << cadena << endl;cout << "Cadena: ";cin >> cadena; // Lee hasta el primer espacio en blancocout << cadena << endl;cin.sync(); // Sincronizar la entradacout << "Cadena: ";cin.getline(cadena, MAX);cout << cadena << endl;cout << "Longitud: " << strlen(cadena) << endl;strcpy(cadena, "Hola");...

Página 585Fundamentos de la programación: Cadenas al estilo de C (Anexo)

cadenas.cppcadenas.cpp

Page 38: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Luis Hernández Yáñez/Pablo M

oreno Ger

tCad cadena2 = " amigo";strcat(cadena, cadena2);cout << cadena << endl;if (strcmp(cadena, cadena2) == 0) {

cout << "Iguales";}else if (strcmp(cadena, cadena2) > 0) {

cout << cadena << " es mayor que " << cadena2;}else {

cout << cadena << " es menor que " << cadena2;}cout << endl;

return 0;}

Página 586Fundamentos de la programación: Cadenas al estilo de C (Anexo)

Luis Hernández Yáñez/Pablo M

oreno Ger

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 587

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.

Page 39: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Fundamentos de la programación    Ejercicios del Tema 5 — Pág. 1 

Facultad de Informática – Universidad Complutense 

Fundamentos de la programación Curso 2013–2014 

HojadeejerciciosdelTema5

1. Implementa un programa que permita realizar operaciones sobre vectores dedimensiónN.Elprogramadeberámostrarunmenúconunaopciónparacadaunadelassiguientesoperaciones:

1. Sumadevectores

2. Restadevectores

3. Módulodeunvector

4. Productoescalarde2vectores

5. Normalizacióndeunvector

6. Obtencióndelacomponentedemayorvalor

Además,habráunaopcióndefinalizacióndelprograma.Losvectoressobrelosque se realizan las operaciones deberán solicitarse por teclado. Estructura elprograma con subprogramas que realicen las distintas operaciones y algunasotrascomoleeromostrarvectores.

2. Implementaunprogramaquedeterminelafrecuenciadeaparicióndecadaletradelabecedarioenunacadenadecaracteresintroducidaporteclado.Comenzarásolicitandolacadenay,posteriormente,construiráunarrayconlasfrecuenciasdecadaletra.Finalmente,imprimiráelarraydefrecuenciasporpantalla.

NOTA: El programa ignorará los espacios y los caracteres especiales como lasletrasacentuadasolaletra“ñ”.Ynodebesersensibleamayúsculas/minúsculas.

3. Crea una estructura que represente una fecha y escribe un subprograma que,dadasdosfechas,determinesilaprimeraesmayor,menoroigualquelasegunda.Implementalosseisoperadoresrelacionales.

4. UnaempresaguardainformaciónacercadesusNempleados(niunomásniunomenos).Lainformaciónalmacenadasobrecadaempleadoconsisteensunombre,suedad,sugradodeestudios(ESO,Bachillerato,FPdeGradoMedio,FPdeGradoSuperior,Grado,Máster,Doctorado)yeltipodecontratación(Fijo,Enprácticas,Eventual o Becario). Realiza las declaraciones de tipos apropiadas pararepresentar la citada información y escribe un subprograma quemuestre porpantallaelnombreylatitulacióndetodoslosbecarios.

Page 40: Fundamentos de la programación 5 - UCMolimpiadas.informatica.ucm.es/files/fp/05...Fundamentos de la programación: Tipos de datos estructurados Página 514 Luis Hernández Yáñez/Pablo

Fundamentos de la programación    Ejercicios del Tema 5 — Pág. 2 

5. RepiteelejercicioanteriorsuponiendoqueNeselnúmeromáximodeempleadosyqueelnúmerodeempleadosdelaempresavaríaalolargodeltiempoentre0yN.Asimismo,implementalossiguientessubprogramasparagestionarlaplantilla:

a) Añadirunnuevoempleadoalaplantillaalfinaldelalista.

b) Añadirunnuevoempleadoalaplantillaalprincipiodelalista.

c) Eliminarelúltimoempleadodelalista.

d) Eliminarelprimerempleadodelalista.

e) EliminarTODOSlosempleadosdelaplantilla.

6. DesarrollaunprogramaenC++paracalcularloquecadaclientedeunaempresagasta en sus llamadas de teléfono. La empresa gestiona un máximo de 100clientes.Paracadaclientesemantienelasiguienteinformación:

NIF(cadenacon8dígitosyunaletramayúsculafinal;p.e.,00112233A)

Gastotelefónicototal

Listadelasllamadasrealizadas(hasta50llamadas)

Decadallamadaseguardalasiguienteinformación:

Fechadelallamada(cadenaconelformatoAA/MM/DD)

Duracióndelallamada(ensegundos)

Costedelallamada(0,15€deestablecimiento+0,08€porminutoofracción)

Larelacióndellamadasdelosclientesestáenunarchivodetextollamadas.txtqueelprogramadeberá leer.Contieneuna seriede líneas, cadaunaconestosdatosseparadosporunespacio:NIFdelcliente,fechadelallamadaysegundosquedurólallamada.TerminaconunalíneaconXcomoNIF.

Ejemplodearchivollamadas.txt:

00112233A 13/05/02 232 95637245G 13/05/02 112 00112233A 13/05/01 128 00112233A 13/05/02 94 12345678K 13/05/01 657 ... X 

Elprogramadeberácomenzarcargando la informacióndelarchivo,para luegomostrar un listado de clientes, cada uno con su lista de llamadas y el gastotelefónicototal.Cadacliente,conesteformato:

00112233A     13/05/02  232 seg. 0.47 Eur     13/05/01  128 seg. 0.39 Eur     13/05/02   94 seg. 0.31 Eur      ... Coste total de las llamadas: 4.55 Eur