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
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
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
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
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
......
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
↲↲
↲↲
↲↲
↲↲
↲↲
↲↲
↲↲
↲↲↲
↲↲
↲↲
↲↲
↲↲
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();
}}
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
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
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
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
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.
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
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
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
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.
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.
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