Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos PDF
Algoritmos PDF
UNIVERSIDADTECNOLGICADELPER
VicerrectoradodeInvestigacin
AlgoritmoyEstructuradeDatosI
TINSBsicos
IngenieradeTelecomunicaciones
TEXTOSDEINSTRUCCINBSICOS(TINS)/UTP
LimaPer
AlgoritmoyEstructuradeDatosI
AlgoritmoyEstructuradeDatosI
DesarrolloyEdicin:VicerrectoradodeInvestigacin
ElaboracindelTINS:Ing.CarlosLonKanPrado
DiseoyDiagramacin:JuliaSaldaaBalandra
Soporteacadmico:InstitutodeInvestigacin
Produccin:ImprentaGrupoIDAT
AlgoritmoyEstructuradeDatosI
stematerialesdeusoexclusivodelosalumnosydocentesdelaUniversidad
Tecnolgica del Per, preparado para fines didcticos en aplicacin del
Artculo41inc.CyelArt.43inc.A.,delDecretoLegislativo822,Leysobre
DerechosdeAutor.
AlgoritmoyEstructuradeDatosI
AlgoritmoyEstructuradeDatosI
Presentacin
ElpresentetextoelaboradoenelmarcodedesarrollodelaIngeniera,esunmaterialde
ayudainstruccional,enlaCarreradeIngenieradeTelecomunicaciones,paralaAsignatura
deAlgoritmosyEstructuradeDatosI.
Estaprimeraedicinapropiadamenterecopilada,dediversasfuentesbibliogrficas,deuso
frecuente en la enseanza de algoritmos, est ordenada en funcin del sillabus de la
Asignatura,arribamencionada.
Laconformacindeltextohasidoposiblegraciasalesfuerzoydedicacinacadmicadel
Profesor Ing.Carlos Lo Kan Prado, como fruto de su destacada experiencia profesional y
acadmica;contieneVIIcaptulos,cuyasdescripcionesgenricassoncomosigue:
EnelCaptuloIestreferidoalosconceptosfundamentalesdelosalgoritmos.
EnelCaptuloIIseexplicalosdiferentestiposdedatosqueseutilizanenlaprogramacin.
EnelCaptuloIIIseabordalaherramientainformticaqueseutilizaraparaeldesarrollode
lasaplicacionesenelcomputador.
EnelCaptuloIVseexplicalasdiversasestructurasdecontrolquesepresentan.
ElCaptuloVsecentraenlasolucindetemasdeprogramacinmodular.
EnelCaptuloVIseestudialostemasderecursividad.
YenelCaptuloVIIsepresentalasdiversasaplicacionesenlenguajeC.
Finalmente,alcierredeestaslneas,elagradecimientoinstitucionalalprofesorIng.Carlos
LoKanPradoporsucontribucinalaelaboracindelpresentetexto.
Ing.LucioH.HuamnUreta
VicerrectoradodeInvestigacin
AlgoritmoyEstructuradeDatosI
AlgoritmoyEstructuradeDatosI
ndice
CaptuloI
ConceptosFundamentales
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
Introduccin ...........................................................................................................
Definicindelenguaje ............................................................................................
Definicindealgoritmo ..........................................................................................
Tiposdealgoritmos ................................................................................................
Lenguajesalgortmicos ...........................................................................................
Metodologaparalasolucindeproblemaspormediodecomputadora ............
Definicindelproblema .........................................................................................
Anlisisdelproblema .............................................................................................
Diseodelalgoritmo ..............................................................................................
Codificacin ............................................................................................................
Pruebaydepuracin...............................................................................................
Documentacin ......................................................................................................
Mantenimiento.......................................................................................................
11
13
14
14
14
31
31
31
32
32
32
32
33
CaptuloII
TiposdeDatos
2.1
2.2
2.3
2.4
Tiposdedatos.........................................................................................................
Expresiones.............................................................................................................
Operadoresyoperandos........................................................................................
Identificadores........................................................................................................
35
35
36
40
CaptuloIII
LenguajedeProgramacinC
3.1
3.2
3.3
3.4
Introduccin ...........................................................................................................
Caractersticas ........................................................................................................
Procesodeedicinycompilacin ..........................................................................
Estructuradeunprograma ....................................................................................
43
43
43
44
AlgoritmoyEstructuradeDatosI
CaptuloIV
EstructurasdeControl
4.1
4.2
4.3
Tiposdeestructurasbsica ....................................................................................
Estructurasecuencial .............................................................................................
Problemassecuenciales..........................................................................................
59
59
60
CaptuloV
ProgramacinModular
5.1
5.2
6.1
6.2
6.3
Eldiseodescendente:subprogramas ..................................................................
Eldiseomodular...................................................................................................
CaptuloVI
Recursividad
89
90
Recursividad ........................................................................................................... 99
Prototiposdefunciones ......................................................................................... 107
Arreglosunidimensionalesymultidimensionales.................................................. 108
CaptuloVII
Aplicaciones
Ejercicios............................................................................................................................ 115
AlgoritmoyEstructuradeDatosI
DistribucinTemtica
Clase
N
1
ConceptosFundamentales
Conceptodealgoritmo.
Lenguajesdeprogramacin.
Herramientasdeprogramacin.
Tiposdedatos.
Constantes, variables, identificadores, expresiones,
funciones.
EstructuraGeneraldeunPrograma
EstructuradeunProgramaenC.
Estructuradealgoritmos.
Contadores,acumuladores.
EstructurasdeControl
ProgramacinEstructurada.
EstructurasdeControlTipos
Secuencial
Selectivasimple(SI).
Selectivadoble(SISINO).
Selectivamltiple(SISINOSI).
Semana
Horas
Selectivadecontrol(SEGNSEA).
Iterativa(REPETIRDESDE).
EstructuraIterativa(REPETIRMIENTRAS).
Ejerciciospropuestosynivelacin
10
11
12
13
10
11
12
13
Tema
EXAMENPARCIAL
Subprogramacin
ProgramacinModular.
SubprogramasTipos
Variablesglobalesylocales.
Funciones,pasodeparmetros.
Procedimientospasodeparmetros
Recursividad
Datosestructurados
AlgoritmoyEstructuradeDatosI
14
Tipos.
Arreglosunidimensionales,declaracinyacceso.
Clase
N
15
16
17
Tema
Arreglosbidimensionales,declaracinyacceso.
Registros
Concepto.
Declaracinyacceso.
Arregloderegistros.
Cadenadecaracteres.
14
Semana
Horas
15
16
17
18
ndices
18
19
Ejerciciospropuestosynivelacin.
19
20
EXAMENFINAL
20
10
AlgoritmoyEstructuradeDatosI
CAPTULOI
ConceptosFundamentales
1.1 Introduccin
Lacomputadoranosolamenteesunamquinaquepuederealizarprocesosparadarnos
resultados,sinquetengamoslanocinexactadelasoperacionesquerealizaparallegara
esos resultados. Con la computadora adems de lo anterior tambin podemos disear
solucionesalamedida,deproblemasespecficosquesenospresenten.Msaun,siestos
involucranoperacionesmatemticascomplejasy/orepetitivas,orequierendelmanejode
unvolumenmuygrandededatos.
A las soluciones creadas por computadora se les conoce como programas y no son ms
queunaseriedeoperacionesquerealizalacomputadoraparallegaraunresultado,con
ungrupodedatosespecficos.Loanteriornosllevaalrazonamientodequeunprograma
nossirveparasolucionarunproblemaespecfico.
Parapoderrealizarprogramas,adems deconocerlametodologamencionada,tambin
debemos de conocer, de manera especfica las funciones que pueden realizarse en la
computadoraylasformasenquesepuedenmanejarloselementosquehayenlamisma.
Computadora:Esundispositivoelectrnicoutilizadoparaprocesarinformacinyobtener
resultados. Los datos y la informacin se pueden introducir en la computadora como
entrada(input)yacontinuacinseprocesanparaproducirunasalida(output).
Procesodeinformacinenlacomputadora(Fig.1)
Datos de
Entrada
Proceso
Datos de
salida
Figura1.Proceso
11
AlgoritmoyEstructuradeDatosI
Organizacinfsicadeunacomputadora
CPU
Dispositivos de
Entrada
Unida de
Control
Unidad
Arit.-Log.
Dispositivos de
Salida
Memoria
Figura2.OrganizacindelComputador
LaUnidadCentraldeProcesamiento(C.P.U)sedivideendos:
9 Unidaddecontrol
9 UnidadAritmticoLgica
Unidad Aritmtica Lgica: Realiza operaciones aritmticas y lgicas, tales como suma,
resta,multiplicacin,divisinycomparaciones.
LaMemoriadelacomputadorasedivideendos:
9 MemoriaCentraloInterna
9 MemoriaAuxiliaroExterna
Lamemoriainternaconstadedosreasdememoria:
12
AlgoritmoyEstructuradeDatosI
LamemoriaROM(ReadOnlyMemory):Esunamemoriaestticaquenopuedecambiar,la
computadorapuedeleerlosdatosalmacenadosenlamemoriaROM,peronosepueden
introducirdatosenella,ocambiarlosdatosqueahseencuentran;porloquesediceque
estamemoriaesdesololectura.LosdatosdelamemoriaROMestngrabadosenforma
permanenteysonintroducidosporelfabricantedelacomputadora.
Memoria Auxiliar (Externa): Es donde se almacenan todos los programas o datos que el
usuario desee. Los dispositivos de almacenamiento o memorias auxiliares (externas o
secundarias)mscomnmenteutilizadosson:cintasmagnticasydiscosmagnticos.
1.2 DefinicindeLenguaje
Lenguaje:Esunaseriedesmbolosquesirvenparatransmitirunoomsmensajes(ideas)
entre dos entidades diferentes. A la transmisin de mensajes se le conoce comnmente
comocomunicacin.
La comunicacin es un proceso complejo que requiere una serie de reglas simples, pero
indispensablesparapodersellevaracabo.Lasdosprincipalessonlassiguientes:
Losmensajesdebencorrerenunsentidoalavez.
Debe forzosamente existir 4 elementos: Emisor, Receptor, Medio de Comunicacin y
Mensaje.
LenguajesdeProgramacin
Esunconjuntodesmbolos,caracteresyreglas(programas)quepermitenalaspersonas
comunicarseconlacomputadora.
Loslenguajesdeprogramacinseclasificanen:
LenguajeMaquina:Sonaquelloscuyasinstruccionessondirectamenteentendiblesporla
computadora y no necesitan traduccin posterior para que la CPU pueda comprender y
ejecutarelprograma.Lasinstruccionesenlenguajemaquinaseexpresanentrminosdela
unidaddememoriamaspequeaelbit(dgitobinario0o1).
13
AlgoritmoyEstructuradeDatosI
LenguajedeAltoNivel:Loslenguajesdeprogramacindealtonivel(BASIC,pascal,cobol,
frotran,etc.)sonaquellosenlosquelasinstruccionesosentenciasalacomputadorason
escritas con palabras similares a los lenguajes humanos (en general en ingles), lo que
facilitalaescrituraycomprensindelprograma.
1.3 DefinicindeAlgoritmo
Un algoritmo es una serie de pasos organizados que describe el proceso que se debe
seguir,paradarsolucinaunproblemaespecfico.
Un algoritmo es una secuencia finita de instrucciones cada una de las cuales tiene un
significadoclaroypuedeserefectuadaconunacantidadfinitadeesfuerzoenunalongitud
detiempotambinfinito.
Enlavidacotidianaseempleanalgoritmosenmultituddeocasionespararesolverdiversos
problemas.Algunosejemplosseencuentranenlosinstructivos(manualesdeusuario),los
cuales muestran algoritmos para usar el aparato en cuestin o inclusive en las
instruccionesquerecibeuntrabajadorporpartedesupatrn.Tambinexistenejemplos
de ndole matemtica, como el algoritmo de la divisin para calcular el cociente de dos
nmeros,elalgoritmodeEuclidesparacalcularelmximocomndivisordedosenteros
positivos,oelmtododeGausspararesolverunSistemalinealdeecuaciones.
1.4 TiposdeAlgoritmos
9 Cualitativos:Sonaquellosenlosquesedescribenlospasosutilizandopalabras.
9 Cuantitativos:Sonaquellosenlosqueseutilizanclculosnumricosparadefinir
lospasosdelproceso.
1.5 LenguajesAlgortmicos
Es una serie de smbolos y reglas que se utilizan para describir de manera explcita un
proceso.
TiposdeLenguajesAlgortmicos
Grficos: Es la representacin grfica de las operaciones que realiza un algoritmo
(diagramadeflujo).
14
AlgoritmoyEstructuradeDatosI
Mediosdeexpresindeunalgoritmo
Losalgoritmospuedenserexpresadosdemuchasmaneras,incluyendoallenguajenatural,
pseudocdigo, diagramas de flujo y lenguajes de programacin entre otros. Las
descripcionesenlenguajenaturaltiendenaserambiguasyextensas.Elusarpseudocdigo
ydiagramasdeflujoevitamuchasambigedadesdellenguajenatural.Dichasexpresiones
son formas ms estructuradas para representar algoritmos; no obstante, se mantienen
independientesdeunlenguajedeprogramacinespecfico.
Ladescripcindeunalgoritmousualmentesehaceentresniveles:
Descripcindealtonivel.Seestableceelproblema,seseleccionaunmodelomatemticoy
se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo
detalles.
Diagramadeflujo
Definicin
Es la representacin grfica de flujo de un
algoritmoodesecuenciarutinaria.Sebasanenla
utilizacin de diversos smbolos para representar
operacionesespecficas.Selesllamadiagramasde
flujo porque los smbolos utilizados se conectan
por mediodeflechaspara indicar la secuenciade
laoperacin.
Undiagramadeflujoesunaformaderepresentar
grficamente los detalles algortmicos de un
procesomultifactorial.Seutilizaprincipalmenteen
programacin, economa y procesos industriales,
pasando tambin a partir de estas disciplinas a
formar parte fundamental de otras, como la
Figura3.Diagramadeflujo
psicologa cognitiva. Estos diagramas utilizan una
15
AlgoritmoyEstructuradeDatosI
seriedesmbolosconsignificadosespeciales
y son la representacin grfica de los pasos
deunproceso.Encomputacin,sonmodelos
tecnolgicos utilizados para comprender los
rudimentosdelaprogramacinlineal.
Smbolosutilizados
Los smbolos que se utilizan para diseo se
someten a una normalizacin, es decir, se
hicieronsmboloscasiuniversales,yaque,en
un principio cada usuario podra tener sus
propios smbolos para representar sus
procesosenformadeDiagramadeflujo.Esto
trajocomoconsecuenciaquesloaquelque
conoca sus smbolos, los poda interpretar.
Lasimbologautilizadaparalaelaboracinde
diagramas de flujo es variable y debe
ajustarse a las normas preestablecidas
universalmente para dichos smbolos o
datos.
Losdiagramasdeflujosirvenpara
representaralgoritmosdemaneragrfica.
Figura4.Diagramadeflujo
Caractersticas que debe cumplir un
diagramadeflujo
Enlosdiagramasdeflujosepresuponenlossiguientesaspectos:
9 Existe siempre un camino que permite llegar a una solucin (finalizacin del
algoritmo).
9 Existeunnicoiniciodelproceso.
9 Existeunnicopuntodefinparaelprocesodeflujo(salvodelromboqueindica
unacomparacincondoscaminosposibles).
16
AlgoritmoyEstructuradeDatosI
DesarrollodelDiagramadeFlujo
Lassiguientessonaccionespreviasalarealizacindeldiagramadeflujo:
9 Identificarlasideasprincipalesaserincluidaseneldiagramadeflujo.Debenestar
presentes el dueo o responsable del proceso, los dueos o responsables del
proceso anterior y posterior y de otros procesos interrelacionados, otras partes
interesadas.
9 Definirquseesperaobtenerdeldiagramadeflujo.
9 Identificarquinloemplearycmo.
9 Establecerelniveldedetallerequerido.
9 Determinarloslmitesdelprocesoadescribir.Lospasosaseguirparaconstruirel
diagramadeflujoson:
9 Establecer el alcance del proceso a describir. De esta manera quedar fijado el
comienzo y el final del diagrama. Frecuentemente el comienzo es la salida del
procesoprevioyelfinallaentradaalprocesosiguiente.
9 Identificarylistarlasprincipalesactividades/subprocesosqueestnincluidosenel
procesoadescribirysuordencronolgico.
9 Sielniveldedetalledefinidoincluyeactividadesmenores,listarlastambin.
9 Identificarylistarlospuntosdedecisin.
9 Construir el diagrama respetando la secuencia cronolgica y asignando los
correspondientessmbolos.
9 Asignar un ttulo al diagrama y verificar que est completo y describa con
exactitudelprocesoelegido.
Recomendaciones
A su vez, es importante que al construir diagramas de flujo, se observen las siguientes
recomendaciones:
9 Evitarsumiderosinfinitos,burbujasquetienenentradasperonosalidas.
9 Evitar las burbujas de generacin espontnea, que tienen salidas sin tener
entradas,porquesonsumamentesospechosasygeneralmenteincorrectas.
9 Tenercuidadoconlosflujosyprocesosnoetiquetados.Estosueleserunindicio
de falta de esmero, pero puede esconder un error an ms grave: a veces el
analista no etiqueta un flujo o un proceso porque simplemente no se le ocurre
algnnombrerazonable.
17
AlgoritmoyEstructuradeDatosI
Ventajasdelosdiagramadeflujo
Favorecenlacomprensindelprocesoatravsde
mostrarlo como un dibujo. El cerebro humano
reconoce fcilmente los dibujos. Un buen
diagrama de flujo reemplaza varias pginas de
texto.
Tiposdediagramasdeflujos
Figura5.Diagramadeflujo
Formato vertical: En l el flujo o la secuencia de
lasoperaciones,vadearribahaciaabajo.Esunalistaordenadadelasoperacionesdeun
procesocontodalainformacinqueseconsiderenecesaria,segnsupropsito.
Formato panormico: El proceso entero est representado en una sola carta y puede
apreciarsedeuna solamiradamuchomsrpido queleyendo eltexto,loque facilitasu
comprensin,aunparapersonasnofamiliarizadas.Registranosoloenlneavertical,sino
tambinhorizontal,distintasaccionessimultneasylaparticipacindemsdeunpuestoo
departamentoqueelformatoverticalnoregistra.
Creardiagramasdeflujos
Un diagrama de flujo u organigrama es una representacin diagramtica que ilustra la
secuenciadelasoperacionesqueserealizarnparaconseguirlasolucindeunproblema.
18
AlgoritmoyEstructuradeDatosI
Losdiagramasdeflujosedibujangeneralmenteantesdecomenzaraprogramarelcdigo
frente a la computadora. Los diagramas de flujo facilitan la comunicacin entre los
programadoresylagentedelnegocio.Estosdiagramasdeflujodesempeanunpapelvital
enlaprogramacindeunproblemayfacilitanlacomprensindeproblemascomplicadosy
sobretodomuylargos.Unavezquesedibujaeldiagramadeflujo,llegaaserfcilescribir
el programa en cualquier idioma de alto nivel. Vemos a menudo cmo los diagramas de
flujo nos dan ventaja al momento de explicar el programa a otros. Por lo tanto, est
correctodecirqueundiagramadeflujoesunanecesidadparaladocumentacinmejorde
unprogramacomplejo.
Reglasparadibujarundiagramadeflujo
LosDiagramasdeflujosedibujangeneralmenteusandoalgunossmbolosestndares;sin
embargo, algunos smbolos especiales pueden tambin ser desarrollados cuando sean
requeridos.Algunossmbolosestndares,queserequierenconfrecuenciaparadiagramar
programasdecomputadorasemuestranacontinuacin:
Inicioofindelprograma
Pasos,procesosolneasdeinstruccindeprogramade
computo
Operacionesdeentradaysalida
TomadedecisionesyRamificacin
Conectorparaunirelflujoaotrapartedeldiagrama
Cintamagntica
Discomagntico
Conectordepagina
Lneasdeflujo
19
AlgoritmoyEstructuradeDatosI
Anotacin
Display,paramostrardatos
Envadatosalaimpresora
Figura6.Simbolosparaeldiseodediagramasdeflujo
Observacin: Para obtener la correcta elaboracin de los smbolos, existen plantillas. Las
puedesconseguirenPapeleras.
Smbolosgrficos
Dentrodelossmbolosfundamentalesparalacreacindediagramasdeflujo,lossmbolos
grficos son utilizados especficamente para operaciones aritmticas y relaciones
condicionales.Lasiguienteesunalistadelossmbolosmscomnmenteutilizados:
+
Sumar
Menos
*
Multiplicacin
/
Divisin
Masomenos
=
Equivalentea
>
Mayorque
<
Menorque
>=
Mayoroigualque
<=
Menoroigualque
<>
Diferentede
Figura7.Simboloscomunes
ReglasparalacreacindeDiagramas
a. LosDiagramasdeflujodebenescribirsedearribahaciaabajo,y/odeizquierdaa
derecha.
b. Los smbolos se unen con lneas, las cuales tienen en la punta una flecha que
indica la direccin que fluye la informacin procesos, se deben de utilizar
solamentelneasdeflujohorizontaloverticales(nuncadiagonales).
c. Se debe evitar el cruce de lneas, para lo cual se quisiera separar el flujo del
diagramaaunsitiodistinto,sepudierarealizarutilizandolosconectores.Sedebe
tener en cuenta que solo se van a utilizar conectores cuando sea estrictamente
necesario.
d. Nodebenquedarlneasdeflujosinconectar
20
AlgoritmoyEstructuradeDatosI
e. Todotextoescritodentrodeunsmbolodebeserlegible,preciso,evitandoeluso
demuchaspalabras.
f. Todos los smbolos pueden tener ms de una lnea de entrada, a excepcin del
smbolofinal.
g. Sololossmbolosdedecisinpuedenydebentenermsdeunalneadeflujode
salida.
Ejemplosdediagramasdeflujo
Diagramadeflujoqueencuentralasumadelosprimeros50nmerosnaturales
Figura8.Diagramadeflujo
Bueno,ahoraladescripcindetalladadeldiagramaanterior
Suma,eslavariablealaqueselevaagregandoelvalordecadanmeronatural.N,esel
contador.sterecorrerlosnmeroshastallegaral50.
21
AlgoritmoyEstructuradeDatosI
ElprimerbloqueindicaeliniciodelDiagramadeflujo
Porltimoindicamosqueelresultadosermostradoen
lapantalla(Display).
Findelprograma(odiagrama)
Pseudocdigo
Pseudocdigo es la descripcin de un algoritmo que asemeja a un lenguaje de
programacin pero con algunas convenciones del lenguaje natural. Tiene varias ventajas
con respecto a los diagramas de flujo, entre las que se destaca el poco espacio que se
requiere para representar instrucciones complejas. El pseudocdigo no est regido por
ningn estndar. Pseudo viene de falso y por ende es un cdigo al que aunque es
entendiblenoseaplicaalprocesoquedeberealizarlamquinaocomputador.
22
AlgoritmoyEstructuradeDatosI
Elpseudocdigodescribeunalgoritmoutilizandounamezcladefrasesenlenguajecomn,
instrucciones de programacin y palabras clave que definen las estructuras bsicas. Su
objetivoespermitirqueelprogramadorsecentreenlosaspectoslgicosdelasolucina
unproblema.
Nosiendoelpseudocdigounlenguajeformal,varandeunprogramadoraotro,esdecir,
nohayunaestructurasemnticaniarquitecturaestndar.Esunaherramientagilparael
estudio y diseo de aplicaciones, veamos un ejemplo, que podramos definir como:
lenguaje imperativo, de tercera generacin, segn el mtodo de programacin
estructurada.
Pseudocdigo=Pseudo(Supuesto)+Cdigo(Instruccin)
Digamosqueelpseudocdigoesunaformadediagramarunalgoritmopararesolverun
determinadoproblema,sinatenerseaningnlenguajedeprogramacinenespecial.
Unalgoritmoesunconjuntodeprocedimientosquepermitenresolverunproblema.
Envezdeescribirelprogramadirectamenteenunlenguajedeprogramacindeterminado
(C, C++, Visual Basic, etc.), crearemos un borrador entendible para todos, para luego de
tenerbienenclaroloquesedebehacer,pasaralaprogramacinpropiamentedicha.
Figura9.Pseudocodigo
23
AlgoritmoyEstructuradeDatosI
Nohayqueconfundirloconundiagramadeflujo.
Utilizacinenlaprctica
Eneltrabajodeuningenieroanalista,unadelaspartesmstrabajosasesladedeterminar
qu es lo que necesitan de un sistema los usuarios finales. Se dedican muchas horas a
hacerunrelevamientodelosdatosquesernnecesarios,lostiposdeprocesamientos,las
salidas,etc.Ydebeexistirunarealimentacinentreeldiseoyelusuario,paragarantizar
queelsistemacumplaconlosrequisitosdelusuario.
Figura10.Unsistema
Supongamosquetenemosunsistemaparaunaempresaqueutilizaunainterfazgrficaen
VisualBasic,algunasaplicacionesespecficasenC,ypginasPHPparatrabajovaInternet.
Seguramentequecrearundiagramaespecficoparacadalenguajeseraunatareatediosa.
Graciasaestaherramienta,podemosreuniratodoslosprogramadores,darlaspautasde
trabajo, y mediante el pseudocdigo,cada programador sabr lo quehaceel sistema, y
podrescribirelcdigocorrespondiente.
Inclusodosprogramadoresquedominenelmismolenguajepuedentenermetodologasde
trabajo distintas. Un problema puede ser resuelto de muchas maneras, cada una ms o
menoseficientequelaotra,perotodascumplenconelobjetivo.
24
AlgoritmoyEstructuradeDatosI
Figura11.Lenguajesyelpseudocodigo
Elpseudocdigoeliminaestasdiferencias,dandolibertadalosprogramadoresparaque
puedanajustarseasumetodologadetrabajo.
DefinicindedatosdelPseudocdigo
La definicin de datos se da por supuesta, sobre todo en las variables sencillas, si se
empleaformaciones:pilas,colas,vectoresoregistros,sepuedendefinirenlacabeceradel
algoritmo,ynaturalmentecuandoempleemoselpseudocdigoparadefinirestructurasde
datos,estaparteladesarrollaremosadecuadamente.
Funcionesyoperaciones
Como se haba mencionado antes, cada autor usa su propio pseudocdigo con sus
respectivasconvenciones.Porejemplo,considerelainstruccin"Reemplaceelvalordela
variable x por el valor de la variable y"; algunas de las posibles sintaxis para indicar lo
anteriorpodranser:
Asignea elvalorde
Lasoperacionesaritmticasserepresentandelaformausualenmatemticas.
25
AlgoritmoyEstructuradeDatosI
ylasoperacionescomplejasserepresentandelmismomodo:
Ejemplo1:Hacerunpseudocodigoqueimprimalosnmerosdel1al100.
PROGRAMAcontador1
ENTORNO:
c0
ALGORITMO:
Borrar_pantalla()
MIENTRASc<101HACER
ESCRIBIRc
cc+1
FINMIENTRAS
FINPROGRAMA
Ejemplo 2: Hacer un pseudocodigo que imprima los nmeros del 100 al 0, en orden
decreciente.
PROGRAMAcontador2
ENTORNO:
c100
ALGORITMO:
Borrar_pantalla()
MIENTRASc>=0HACER
ESCRIBIRc
cc1
FINMIENTRAS
FINPROGRAMA
26
AlgoritmoyEstructuradeDatosI
Ejemplo3:Hacerunpseudocodigoqueimprimalosnmerosparesentre0y100.
PROGRAMApares
ENTORNO:
c2
ALGORITMO:
Borrar_pantalla()
MIENTRASc<101HACER
ESCRIBIRc
cc+2
FINMIENTRAS
FINPROGRAMA
Ejemplo4:Hacerunprogramaqueimprimalasumadelos100primerosnmeros.
PROGRAMAsuma
ENTORNO:
c1
suma0
ALGORITMO:
Borrar_pantalla()
MIENTRASc<=100HACER
sumasuma+c
cc+1
FINMIENTRAS
ESCRIBIR"Lasumadelos100primerosnmeroses:"
ESCRIBIRsuma
FINPROGRAMA
27
AlgoritmoyEstructuradeDatosI
Ejemplo5:Hacerunpseudocdigoqueimprimalosnmerosimpareshastael100yque
imprimacuantosimpareshay.
PROGRAMAimpares
ENTORNO:
c1
son0
ALGORITMO:
Borrar_pantalla()
MIENTRASc<100
ESCRIBIRc
cc+2
sonson+1
FINMIENTRAS
ESCRIBIR"Elnumerodeimpares:"
ESCRIBIRson
FINPROGRAMA
Ejemplo 6: Hacer un pseudocodigo que imprima todos los nmeros naturales que hay
desdelaunidadhastaunnumeroqueintroducimosporteclado.
PROGRAMAnatural
ENTORNO:
i0
n0
ALGORITMO:
Borrar_pantalla()
ESCRIBIR"Introduceunnumero:"
LEERn
MIENTRASi<nHACER
ii+1
ESCRIBIRi
FINMIENTRAS
FINPROGRAMA
28
AlgoritmoyEstructuradeDatosI
Ejemplo7:Introducirunnumeroporteclado.Quenosdigasiesparoimpar.
PROGRAMAparidad
ENTORNO:
num0
ALGORITMO:
Borrar_pantalla()
ESCRIBIR"Introduceunnmero:"
LEERnum
SInum=int(num/2)*2ENTONCES
ESCRIBIR"espar"
SINO
ESCRIBIR"esimpar"
FINSI
FINPROGRAMA
Ejemplo 8: Imprimir y contar los mltiplos de 3 desde la unidad hasta un numero que
introducimosporteclado.
PROGRAMAmultiplo
ENTORNO:
i3
n0
c0
ALGORITMO:
Borrar_pantalla()
ESCRIBIR"Numero:"
LEERn
MIENTRASi<=nHACER
SIi=int(i/3)*3ENTONCES
ESCRIBIRi
cc+1
FINSI
ii+1
FINMIENTRAS
ESCRIBIR"Elnmerodemltiplosde3son:"
ESCRIBIRc
FINPROGRAMA
29
AlgoritmoyEstructuradeDatosI
EjerciciosPropuestos
ConstruirdiagramasdeFlujoyPseudoCdigosparalossiguientesenunciados:
1. MostrarsuNombreysuApellido
2. Mostrar el Nombre y Apellido de cualquier persona de quien se introduzcan los
datos.
3. Sumar 2 + 2 y mostrar el resultado (por pantalla, por impresora, por pantalla e
impresora)
4. Sumar2nmeroscualesquiera.
5. Dados 2 nmeros, estar en capacidad de sumarlos, restarlos, multiplicarlos y
dividirlos.
6. DadosloscoeficientesdeunaEcuacinde2doGrado,calcularymostrarx1yx2.
7. CalcularlaSeriedeFibonaccihastaunnmerodado.
8. Calcularlaedad
9 fcil:alintroducirsloelaodenacimiento
9 mediano:alintroducirelmesyaodenacimiento
9 complejo:alintroducirelda,mesyaodenacimiento
9. Calcularlanotadefinitivapara5alumnos,tomandoencuentalasponderaciones
siguientes:
9 1erPractica:30%
9 2doPractica:25%
9 3erPractica:20%
9 4taPractica:25%
10. 10.Calcularelsueldoquincenal,tomandoencuentalossiguientesparmetros:
9 Bs450.000porquincena
9 Bonode10%deprofesionalizacinalosquetienenttulouniversitario
9 BonoquincenaldetransportedeBs70.000
9 BonodealimentacindeBs5.000pordalaborado
9 Deducciones:
2%SeguroColectivo
1%ParoForzoso
2%SeguroSocial
2%CajadeAhorro
11. Calcularlosnmerosprimosenunrangodado.
12. Calcularlasumadetodoslosnmerosenterosimpares,enunrangodado.
13. Calcularelfactorialdeunnmero.
14. Problema:Buscarunacarta
Se tiene un mazo de cartas inglesas, el cual no est completo, pero se sabe que
tiene n cartas, y est desordenado. Se desea determinar si una carta
determinadaestonoenelmazo,ysiest,enquposicin
15. Problema:seriedeulam
Dadounvalorinicialx,sepidegenerarlostrminosdelaseriedeUlam.
30
AlgoritmoyEstructuradeDatosI
Se dice que cualquier nmero menor que 1800 converge a 1 si se calcula cada
trminosiguiendolasreglasdelaseriedeUlam.
Lareglaparacalculareltrminosiguienteaxes:
9 Sixpar,elsiguientetrminoseobtienedividiendoxpor2
9 Sixesimpar,elsiguientetrminoseobtienemultiplicandoxpor3ysumando
1alresultado.
16. Problema:cadalibre
La ecuacin que rige el movimiento uniformemente acelerado de una partcula
est dado por la siguiente frmula: x(t)= xo + vo * t + * a * t2, donde xo es la
posicininicialdelapartcula,voeslavelocidadinicialya,laaceleracin.
Elmovimientodecadalibreserigeporlamismaecuacinanterior,salvoquela
velocidadinicialescero,(sedejacaerelobjetodelreposo),ylaaceleracinesla
constanteg,quesepuedeaproximarpor10consignonegativo.
Construya un algoritmo que reciba como entrada una altura h, desde la cual se
dejacaerunobjeto,yentreguecomosalidalaposicindelapartcula,yeltiempo
transcurridoencadasegundodesdequeessoltadohastaquellegaalsuelo.
Indicacin.Considereposicininicialh,yposicinfinal0(suelo)
17. Problema:MquinadeSencillar
Setieneunamquinaquepermitesencillardinero.Lamquinaestdiseadapara
que, dado un monto cualquiera, indique cuantos billetes de 1000 y monedas de
100, 10 y 1 debe entregar, a cambio de ese monto. Una caracterstica de esta
mquinaesquesiempreintentardarlamenorcantidaddemonedas.
Construyaelalgoritmoquepermitaquelamquinafuncionedelaformadescrita.
Es decir, un algoritmo que reciba como entrada un monto de dinero, entero,
positivo y entregue como salida la cantidad de billetes y de monedas de las
distintasdenominacionesqueequivalenadichomonto.
1.6 Metodologaparalasolucindeproblemaspormediodecomputadora
1.7 DefinicindelProblema
Estafaseestdadaporelenunciadodelproblema,elcualrequiereunadefinicinclaray
precisa. Es importante que se conozca lo que se desea que realice la computadora;
mientras esto no se conozca del todo no tiene mucho caso continuar con la siguiente
etapa.
1.8 AnlisisdelProblema
Unavezquesehacomprendidoloquesedeseadelacomputadora,esnecesariodefinir:
9 Losdatosdeentrada.
9 Culeslainformacinquesedeseaproducir(salida)
9 Losmtodosyfrmulasquesenecesitanparaprocesarlosdatos.
31
AlgoritmoyEstructuradeDatosI
Unarecomendacinmuypracticaeselquenospongamosenellugardelacomputadoray
analicemosqueesloquenecesitamosquenosordenenyenquesecuenciaparaproducir
losresultadosesperados.
1.9 DiseodelAlgoritmo
Lascaractersticasdeunbuenalgoritmoson:
9 Debetenerunpuntoparticulardeinicio.
9 Debeserdefinido,nodebepermitirdoblesinterpretaciones.
9 Debe ser general, es decir, soportar la mayora de las variantes que se puedan
presentarenladefinicindelproblema.
9 Debeserfinitoentamaoytiempodeejecucin.
1.10Codificacin
Lacodificacineslaoperacindeescribirlasolucindelproblema(deacuerdoalalgica
del diagrama de flujo o pseudocodigo), en una serie de instrucciones detalladas, en un
cdigo reconocible por la computadora, la serie de instrucciones detalladas se le conoce
comocdigofuente,elcualseescribeenunlenguajedeprogramacinolenguajedealto
nivel.
1.11PruebayDepuracin
Los errores humanos dentro de la programacin de computadoras son muchos y
aumentanconsiderablementeconlacomplejidaddelproblema.Elprocesodeidentificary
eliminarerrores,paradarpasoaunasolucinsinerroresselellamadepuracin.
La depuracin o prueba resulta una tarea tan creativa como el mismo desarrollo de la
solucin,porellosedebeconsiderarconelmismointersyentusiasmo.
Resulta conveniente observar los siguientes principios al realizar una depuracin, ya que
deestetrabajodependeelxitodenuestrasolucin.
1.12Documentacin
Es la gua o comunicacin escrita es sus variadas formas, ya sea en enunciados,
procedimientos,dibujosodiagramas.
A menudo un programa escrito por una persona, es usado por otra. Por ello la
documentacinsirveparaayudaracomprenderousarunprogramaoparafacilitarfuturas
modificaciones(mantenimiento).
Ladocumentacinsedivideentrespartes:
DocumentacinInterna
DocumentacinExterna
ManualdelUsuario
32
AlgoritmoyEstructuradeDatosI
DocumentacinExterna:Sedefineenundocumentoescritolossiguientespuntos:
9 DescripcindelProblema
9 NombredelAutor
9 Algoritmo(diagramadeflujoopseudocodigo)
9 DiccionariodeDatos
9 CdigoFuente(programa)
ManualdelUsuario:Describepasoapasolamaneracmofuncionaelprograma,con
elfindequeelusuarioobtengaelresultadodeseado.
1.13Mantenimiento
Se lleva a cabo despus de terminado el programa, cuando se detecta que es necesario
haceralgncambio,ajusteocomplementacinalprogramaparaquesigatrabajandode
manera correcta. Para poder realizar este trabajo se requiere que el programa este
correctamentedocumentado.
33
AlgoritmoyEstructuradeDatosI
34
AlgoritmoyEstructuradeDatosI
CAPTULOII
TiposdeDatos
2.1 TiposDeDatos
Todoslosdatostienenuntipoasociadoconellos.Undatopuedeserunsimplecarcter,
tal como b, un valor entero tal como 35. El tipo de dato determina la naturaleza del
conjuntodevaloresquepuedetomarunavariable.
Simples
Tipos de
datos
Numricos
Lgicos
Alfanumricos (string)
TiposdeDatosSimples
DatosNumricos:Permitenrepresentarvaloresescalaresdeformanumrica,estoincluye
a los nmeros enteros y los reales. Este tipo de datos permiten realizar operaciones
aritmticascomunes.
Datos Lgicos: Son aquellos que solo pueden tener dos valores (cierto o falso) ya que
representan el resultado de una comparacin entre otros datos (numricos o
alfanumricos).
DatosAlfanumricos(String):Esunasecuenciadecaracteresalfanumricosquepermiten
representarvaloresidentificablesdeformadescriptiva,estoincluyenombresdepersonas,
direcciones,etc.Esposiblerepresentarnmeroscomoalfanumricos,peroestospierden
supropiedadmatemtica,esdecirnoesposiblehaceroperacionesconellos.Estetipode
datosserepresentanencerradosentrecomillas.
Ejemplo:
InstitutoTecnolgicodelosOlivos
2009
2.2 Expresiones
Las expresiones son combinaciones de constantes, variables, smbolos de operacin,
parntesisynombresdefuncionesespeciales.Porejemplo:
35
AlgoritmoyEstructuradeDatosI
a+(b+3)/c
Cada expresin toma un valor que se determina tomando los valores de las variables y
constantesimplicadasylaejecucindelasoperacionesindicadas.
Una expresin consta de operadores y operandos. Segn sea el tipo de datos que
manipulan,seclasificanlasexpresionesen:
9 Aritmticas
9 Relacinales
9 Lgicas
2.3 OperadoresyOperandos
Operadores:Sonelementosquerelacionandeformadiferente,losvaloresdeunaoms
variablesy/oconstantes.Esdecir,losoperadoresnospermitenmanipularvalores.
Tipos de Operadores
Aritmticos
Relacinales
Lgicos
Los operadores aritmticos pueden ser utilizados con tipos de datos enteros o reales. Si
ambossonenteros,elresultadoesentero;sialgunodeellosesreal,elresultadoesreal.
OperadoresAritmticos
+Suma
Resta
*Multiplicacin
/Divisin
ModModulo(residuodeladivisinentera)
36
AlgoritmoyEstructuradeDatosI
Ejemplos:
ExpresinResultado
9 7/2=3.5
9 12mod7=5
9 4+2*5=14
PrioridaddelosOperadoresAritmticos
Todaslasexpresionesentreparntesisseevalanprimero.Lasexpresionesconparntesis
anidadosseevalandedentroafuera,elparntesismsinternoseevalaprimero.
Dentrodeunamismaexpresinlosoperadoresseevalanenelsiguienteorden.
1.^Exponenciacin
2.*,/,modMultiplicacin,divisin,modulo.
3.+,Sumayresta.
Los operadores en una misma expresin con igual nivel de prioridad se evalan de
izquierdaaderecha.
Ejemplos:
4+2*5=14
23*2/5=9.2
46/5=9.2
3+5*(10(2+4))=23
3+5*(106)=
3+5*4=
3+20=23
3.5+5.0914.0/40=5.09
3.5+5.093.5=
8.593.5=5.09
2.1*(1.5+3.0*4.1)=28.98
2.1*(1.5+12.3)=
2.1*13.8=28.98
OperadoresRelacinales:
9 Seutilizanparaestablecerunarelacinentredosvalores.
9 Compara estos valores entre si y esta comparacin produce un resultado de
certezaofalsedad(verdaderoofalso).
37
AlgoritmoyEstructuradeDatosI
OperadoresRelacinales
>Mayorque
<Menorque
>=Mayoroigualque
<=Menoroigualque
<>Diferente
=Igual
Ejemplos:
Sia=10,b=20,c=30
a+b>cFalso
acVerdadero
ab=cFalso
a*b<>cVerdadero
Ejemplosnolgicos:
a<b<c
10<20<30
T<30(noeslgicoporquetienediferentesoperandos)
OperadoresLgicos:
9 Estosoperadoresseutilizanparaestablecerrelacionesentrevaloreslgicos.
9 Estosvalorespuedenserresultadodeunaexpresinrelacional.
OperadoresLgicos
AndY
OrO
NotNegacin
38
AlgoritmoyEstructuradeDatosI
OperandoAnd
Operando1
T
T
F
F
Operador
AND
Operando2
T
F
T
F
Resultado
T
F
F
F
Operando1
T
T
F
F
Operador
OR
Operando2
T
F
T
F
Resultado
T
T
T
F
Operando
T
F
Resultado
F
T
OperandoOr
OperandoNot
Ejemplos:
(a < b) and (b < c)
(10<20) and (20<30)
T and
T
T
39
AlgoritmoyEstructuradeDatosI
Ejemplos:
a = 10 b = 12 c = 13 d =10
1)
2)
3)
2.4 Identificadores
Losidentificadoresrepresentanlosdatosdeunprograma(constantes,variables,tiposde
datos). Un identificador es una secuencia de caracteres que sirve para identificar una
posicinenlamemoriadelacomputadora,quenospermiteteneraccesoasucontenido.
Ejemplo:
9 Nombre
9 Num_hrs
9 Calif2
ReglasparaformarunIdentificador
ConstantesyVariables
Constante:Unaconstanteesundatonumricooalfanumricoquenocambiadurantela
ejecucindelprograma.
Ejemplo:
pi=3.1416
40
AlgoritmoyEstructuradeDatosI
Ejemplo:
rea=pi*radio^2
Lasvariablesson:elradio,elreaylaconstateespi
ClasificacindelasVariables
Numricas
Por su Contenido
Lgicas
Alfanumricas (String)
Variables
De Trabajo
Contadores
Acumuladores
Por su Uso
PorsuContenido
VariableNumricas:Sonaquellasenlascualessealmacenanvaloresnumricos,positivos
onegativos,esdeciralmacenannmerosdel0al9,signos(+y)yelpuntodecimal.
Ejemplo:
IGV=0.15
pi=3.1416
costo=2500
Variables Lgicas: Son aquellas que solo pueden tener dos valores (cierto o falso) estos
representanelresultadodeunacomparacinentreotrosdatos.
Ejemplo:
letra=a
apellido=lopez
direccion=Av.Libertad#190
41
AlgoritmoyEstructuradeDatosI
PorsuUso
Variables de Trabajo: Variables que reciben el resultado de una operacin matemtica
completayqueseusannormalmentedentrodeunprograma.Ejemplo:
Suma=a+b/c
Contadores: Se utilizan para llevar el control del nmero de ocasiones en que se realiza
unaoperacinosecumpleunacondicin.Conlosincrementosgeneralmentedeunoen
uno.
Acumuladores:Formaquetomaunavariableyquesirveparallevarlasumaacumulativa
deunaseriedevaloresquesevanleyendoocalculandoprogresivamente.
42
AlgoritmoyEstructuradeDatosI
CAPTULOIII
LenguajedeProgramacinC
3.1 Introduccin
FuecreadoporDennisRitchiedeloslaboratoriosBELLen1972,cuandotrabajabajuntoa
Ken Thompson, en el diseo del sistema operativo UNIX. Se deriva del lenguaje B de
Thompson,queasuvezsederivadelBCPLdeMartnRichards.
3.2 Caractersticas
Esunlenguajemodernodepropsitogeneral,queincorporalascaractersticasdecontrol
apuntadascomodeseablesporlateorayprcticadelainformtica.
9 Planificacinescalonada.
9 Programacinestructurada.
9 Diseomodular.
9 Programascompactos.
9 Rapidezdeejecucin.
9 Porttil.
9 Derelativobajonivel.
9 Precisacompilarse.
3.3 Procesodeedicinycompilacin
LospasosnecesariosparadesarrollarunprogramaCsonlossiguientes:
a. Edicin:Utilizaruneditorparaescribirelprogramafuentetexto.
b. Compilacin: Compilar el programa fuente, es decir, traducir el programa a
lenguajemquina.
c. Ejecucin:Unavezcompiladoseprocedealaejecucindelprogramatecleandoel
nombredelficheroprograma.
43
AlgoritmoyEstructuradeDatosI
Figura1.Diagramadeflujo
3.4 Estructuradeunprograma
Un programa en C consiste en una o ms funciones, de las cuales una de ellas, debe
llamarsemain()yeslaprincipaldetodas.
9 Elprogramacomienzaconlafuncin:main()
9 Cadafuncinoprograma,constadeuncuerpodefuncindelimitadoporllavesde
comienzoyfin{}
9 En el cuerpo de la funcin irn incluidas: sentencias, variables, funciones, etc.
terminadascadaunadeellasporunpuntoycoma;
44
AlgoritmoyEstructuradeDatosI
Programaejemplo:
/*Esteprogramaimprimeunmensaje*/
#include<stdio.h>
main()
{
printf(LENGUAJEC\n);
}
Enelprogramaanterior,existendosfunciones:main()queeslaprincipaldelprogramaen
sylafuncinprintf()queesunafuncindelalibreraestndardellenguajeC.
Alejecutarelprograma,enpantallaapareceeltextoLENGUAJEC.
Programaejemplo:
/*Elprogramasolicitaelradioymuestrael*/
/*valordelreadelcrculoylalongitudde*/
/*lacircunferencia*/
#include<stdio.h>
#definePI3.14159
main()
{
intr;
floatl,a;
printf(Introduceradio(entero):);
scanf(%d,&r);
l=2*PI*r;a=PI*r*r;
printf(Lalongituddelacircunferenciavale%f\n,l);
printf(Elreadelcrculovale%f\n,a);
}
45
AlgoritmoyEstructuradeDatosI
LosdatosenC:VariablesyConstantes
TiposdeDatos
LosdatosmanejadosenCpuedenserdecincotiposbsicos.
IdentificadoresdeTipo
Todoslostiposbsicosexceptovoidpuedentenermodificadores.Seusanparaalterarel
significadodeuntipobasedeacuerdoconnuestrasnecesidades.
Losmodificadoresson:
9 signed
9 unsigned
9 long
9 short
Sepuedenaplicartodoslosmodificadoresparalostiposbasecarcteryentero.
Tambinsepuedeaplicarelmodificadorlongadouble.Acontinuacinmostramostodas
lasposiblescombinacionesdelostiposbsicosylosmodificadores.
46
AlgoritmoyEstructuradeDatosI
Figura2.Tiposdeidentificadores
NOTA: El espacio ocupado en la memoria por los tipos de datos aqu mostrados vendr
determinado por el tipo de compilador implementado. En cualquier caso, mediante la
funcinsizeof(tipodedato)sepodrdeterminarelnmerodebytesocupados.
Variables
Se utilizan para almacenar datos internamente en la memoria de trabajo del ordenador,
durantelaejecucindeunprograma.
Comonombresdevariablesseadmitenletrasynmeros(pornormaletrasminsculas).
9 Elprimercarcterdebeserunaletra.
9 Noseadmitenblancosperoselsignodesubrayado.
9 Sloseadmitenlosochoprimeroscaracteres.
9 Maysculasyminsculassediferencian.
9 Nosepuedenemplearpalabrasclavedellenguaje.
Lasvariablesdebenserdeclaradassegneltipodedatosquevanaalmacenar.
Bienalcomienzodelprogramaoantesdeserusadasporprimeravez.
Laformadedeclararlases:
9 Sedefineeltipodedatoaalmacenar.
9 Nombredelavariable.
9 Asignacindeunvalorinicial(noobligatorio).
47
AlgoritmoyEstructuradeDatosI
Ejemplo:
/*Declaracindevariables*/
#include<stdio.h>
main()
{
inta=3,b=7,c=0;
c=a*b;
printf(Elresultadoes:%d,c);
}
Constantes
Son valores que no varan durante la ejecucin de un programa. Pueden adoptar
cualquiera de los tipos de datos declarados anteriormente. Es conveniente declararlas al
principiodelprograma.
La sentencia #define es usada para definir las constantes y se coloca al principio del
programaantesdelafuncinmain().
#definePI3.14159
#definePRIMO13
Lasconstantescomonormasesuelenescribirconmaysculas.
OperadoresFundamentales
En C se utilizan operadores para representar operaciones matemticas. Por ejemplo, el
operador+hacequesesumenlosvaloressituadosasuizquierdayderecha.
Veamoslosquehemosdadoenllamarfundamentales.
bmw=2002;
Operadordeadicin:+Hacequelosdosvaloressituadosasuizquierdayderecha
sesumen.
bmw=10+20;
48
AlgoritmoyEstructuradeDatosI
Operadordesustraccin:Hacequeseresteelnmerosituadoasuderechadel
situadoasuizquierda.
costo=35025;
Elsignomenostambinseutilizaparaindicarocambiarelsignoalgebraicodeun
valor.
pepe=12;
paco=pepe;
Operadordemultiplicacin:*Hacequesemultipliquenlosdosvaloressituadosa
suizquierdayderecha.
pulg=10;
cm=2.54*pulg;
Operadordedivisin:/Hacequeelvalorsituadoasuizquierdaseadivididoporel
queseencuentraasuderecha.
cuatro=12.0/3.0;
OperadoresAdicionales
Alalistadelosoperadoresanteriores(quesonlosmscomunes),vamosaaadirahora
tresoperadoresqueresultanbastantestiles.
pepe=15%5;
Operadorincremento:++Realizalatareadeincrementarenunoelvalordesuoperando.
a++;modosufijo
++a;modoprefijo
Operadordecremento:Realizalatareadedisminuirenunoelvalordesuoperando.
b;modosufijo
b;modoprefijo
49
AlgoritmoyEstructuradeDatosI
Ladiferenciaentreambos,eslamismaqueenelcasoanterior.
OperadoresCondicionalesodeRelacin
Los operadores de relacin o condicionales se emplean para hacer comparaciones. A
continuacin,mostramosunalistacompletadeestosoperadoresenC.
OperadoresLgicos
Cuando necesitamos combinar dos o ms expresiones de relacin, hacemos uso de los
operadoreslgicos.ExistentresoperadoreslgicosenC.
OperadoresdeBit
Lasoperacionessobrebitsserefierenalacomprobacin,configuracinodesplazamiento
delosbitsrealesenunbyteopalabra,quecorrespondenalostiposdedatoschareint.
Nosepuedenusaroperacionessobrebitsenlostiposfloat,double,longdoublyvoid.
Losoperadoresqueexistenparaeltratamientodebits,sonlossiguientes:
50
AlgoritmoyEstructuradeDatosI
NormasdePrecedenciadelosOperadores
No todos los operadores tienen la misma prioridad, lo que quiere decir, que aquellas
operacionesqueutilizanciertosoperadoresseefectuarnantesqueotras.
Libreriastdio.h
stdio.h, que significa "standard inputoutput
header" (cabecera estandar E/S), es la
biblioteca estndar del lenguaje de
programacin C, el archivo de cabecera que
contiene las definiciones de macros, las
constantes,lasdeclaracionesdefuncionesyla
definicin de tipos usados por varias
operaciones estndar de entrada y salida. Por
motivos de compatibilidad, el lenguaje de
programacin C++ (derivado de C) tambin
tiene su propia implementacin de estas
funciones,quesondeclaradasconelarchivode
cabeceracstdio.
51
AlgoritmoyEstructuradeDatosI
Ejemplo:
EnlenguajeCysusderivados,todaslasfuncionessondeclaradasenarchivosdecabecera.
As,losprogramadorestienenqueincluirelarchivodecabecerastdio.hdentrodelcdigo
fuente para poder utilizar las funciones que estn declaradas. nota: el compilador
diferencialasmaysculasentrelasminsculas.
#include<stdio.h>
intmain(void)
{
intch;
while((ch=getchar())!=EOF)
putchar(ch);
putchar('\n');
return0;
}
El programa lee todas las entradas desde la entrada estndar y las muestra en la salida
estndar,lneaalnea.
Funcionesmiembro
Lasfuncionesdeclaradasenstdio.hpuedenclasificarseendoscategoras:
Funcionesdemanipulacindeficherosyfuncionesdemanipulacindeentradasysalidas.
Nombre
Descripcin
Funcionesdemanipulacindeficheros
fclose
cierraunficheroatravsdesupuntero
fopen,
freopen,
fdopen
abreunficheroparalectura,paraescritura/reescrituraoparaadicin
remove
eliminaunfichero
rename
cambiaalficherodenombre
rewind
Lafuncinrewindcolocaelindicadordeposicindeficheroparaelstream
apuntadoporstreamalcomienzodelfichero.
tmpfile
creayabreunficherotemporalqueesborradocuandocerramosconla
funcinfclose()
52
AlgoritmoyEstructuradeDatosI
Funcionesdemanipulacindeentradasysalidas
clearerr
Despejalosindicadoresdefinaldeficheroydeposicindeficheroparael
streamapuntadoporstreamalcomienzodelfichero.
feof
compruebaelindicadordefinaldefichero
ferror
compruebaelindicadordeerrores
fflush
fgetpos
devuelvelaposicinactualdelfichero
fgetc
devuelveuncarcterdeunfichero
fgets
consigueunacadenadecaracteresdeunfichero
fputc
escribeuncarcterenunfichero
fputs
escribeunacadenadecaracteresenunfichero
ftell
devuelvelaposicinactualdelficherocomonmerodebytes
fseek
sitaelpunterodeunficheroenunaposicinaleatoria
fsetpos
cambialaposicinactualdeunfichero
fread
leediferentestamaosdedatosdeunfichero
fwrite
getc
devuelveuncarcterdesdeunfichero
getchar
igualquegetc
gets
leecaracteresdeentradahastaqueencuentraunsaltodelnea,ylos
almacenaenunnicoargumento.
printf,
fprintf,
sprintf
snprintf
usadosparaimprimirsalidasdedatos
vprintf
tambinutilizadoparaimprimirsalidas
53
AlgoritmoyEstructuradeDatosI
perror
escribeunmensajedeerrorastderr
putc
devuelveuncarcterdeunfichero
putchar,
fputchar
igualqueputc(stdout)
scanf,
fscanf,
sscanf
utilizadoparaintroducirentradas.
vfscanf,
vscanf,
vsscanf
tambinutilizadoparaintroducirentradas.
setbuf
Estafuncinesequivalentealafuncinsetvbufpasandolosvalores_IOFBF
paramodoyBUFSIZparatamao,o(siacumuladoresunpunteronulo),con
elvalor_IONBFparamodo.
setvbuf
slo puede ser usada despus de que el stream apuntado por stream ha
sidoasociadoconunficheroabiertoyantesdeotraoperacincualquieraes
llevadaacaboalstream.El argumentomododeterminacmo streamser
almacenado segn lo siguiente: _IOFBF ocasiona la entrada/salida a ser
completamente almacenado; _IOLBF ocasiona la entrada/salida a
almacenar por lneas; _IONBF ocasiona la entrada/salida a no ser
almacenado. Si acumulador no es un puntero nulo, el array al que es
apuntado puede ser usado en vez de la acumulacin adjudicada por la
funcinsetvbuf.Elargumentotamanyoespecficaeltamaodelarray.
tmpnam
Generaunacadenadecaracteresqueesunnombrevlidoparaficherosy
que no es igual al nombre de un fichero existente. La funcin tmpnam
generaunacadenadiferentecadavezqueesllamada,hastaunmximode
TMP_MAX veces. Si la funcin es llamada ms veces que TMP_MAX,
entonces el comportamiento de la funcin est definido segn la
implementacindelcompilador.
ungetc
puts
imprimeunadecadenadecaracteres
FuncionesdeEntrada/Salida
Las funciones de entrada/salida permiten al programa comunicarse con el exterior. Son
utilizadasparasacardeterminadasinformacionesporlapantallaycapturarvaloresporel
teclado.SonestndardelapropialibreradeCporloquenohaynecesidaddedefinirlas
denuevo.
54
AlgoritmoyEstructuradeDatosI
Funcinprintf()
Leedatosdelprograma(variables,resultadosdeoperaciones,frases,mensajes,
etc.)ylosenvaalapantalla.Elformatoeselsiguiente:
printf(Cadenadecontrol,variables,operaciones,...);
Lacadenadecontrolseusaparaescribirmensajes,identificareltipodedatoquesevaa
mostrar, indicar controles tales como: salto de lnea, salto de pgina, etc. Los
identificadoresempleadossonlossiguientes:
Unnmerocolocadoentreel%yelordendeformato,actacomoespecificadormnimo
de ancho de campo. Este especificador completa la salida con blancos o ceros para
asegurar que al menos es la longitud mnima. Si la cadena o el nmero a representar es
mayor que el campo mnimo, el campo se ampla para imprimir la cadena o el nmero
completo.
Ejemplos:
%5d
ajustealaderecha,rellenaconespacios
%05d
justealaderecha,rellenaconceros
%10.4f
ajustealaderecha,rellenaconespaciosycuatrodecimales
%10.2f
ajustealaizquierda,rellenaconespaciosydosdecimales
Caracteresdecontrolson:
Control
Efectoenpantalla
\n
cambiadelnea
\r
retornodecarro
\t
tabulador
\b
retrocesodelcursorunaposicin
\f
cambiodepgina
55
AlgoritmoyEstructuradeDatosI
\\
\
\
barraatrs(\)
apstrofe()
comillas()
Funcinscanf()
Estafuncin,leedatosdeltecladoylosentregaalprograma.Elformatoeselsiguiente:
scanf(Cadenadecontrol,variable,variable,...);
La variable o variables que se van a introducir tendrn que ir acompaadas delante del
nombre por el signo (&). Si el dato que se va a introducir es una tira de caracteres tipo
char[],noesnecesarioelsigno.
Ejemplo:
/*Programadeempleodeprintf()yscanf()*/
main()
{
intedad;
charnombre[20];
printf(Introducenombre:\n);
scanf(%s,nombre);
printf(Introduceedad:\n);
scanf(%d,&edad);
printf(Tunombrees%sytienes%daos.\n,nombre,edad);
}
Libreraconio.h
Lasfuncionesdeconio(CONsoleInputOutput)permiten,comolasdeNcurses,cambiarel
color del texto y del fondo, mostrar caracteres en cualquier posicin de la consola, leer
datos de entrada sin necesidad de pulsar intro, y un montn de cosas ms. Eso s, es
bastantemsrestrictivaqueNcursesenotrosaspectos,comoladefinicinymanipulacin
deventanas.
Conioesunalibreranoestndar.Estabadisponibleenlamayorpartedeloscompiladores
deCparaentornosMSDOSyWindows3.x,perohabadiferenciassustancialesentreunas
implementacionesyotras,precisamentedebidoaquelalibreranoesestndar.
56
AlgoritmoyEstructuradeDatosI
EnlenguajeCestalibreracontienelosprototiposdelasfunciones,macros,yconstantes
paraprepararymanipularlaconsolaenmodotextoenelentornodeMSDOS.
Leeunsolocarcterdirectamentedesdeelteclado,sinmostrartalcarcterenpantalla.
Lafuncingetchretornaelcarcterledodesdeelteclado.
Ejemplo:
#include<conio.h>
intmain(){
cprintf("Pulsaunatecla:");
cprintf("\'%c\'\r\n",getch());
getch();
return0;
}
Funcionesimportantesparalalibreraconio
A continuacin se resumen las funciones ms relevantes de la librera conio. Puede
encontrarunareferenciacompletaenhttp://c.conclase.net/Borland.
gotoxy(columna,fila)
Sitaelcursorenlacolumnayfilaespecificada.Porejemplo,estainstruccin:
gotoxy(5,2);sitaelcursorenlafila2,columna5delapantalla.Lasiguienteinstruccin
deescrituraenconsolacomenzaraescribirapartirdeesascoordenadas.
cprintf()ycscanf()
Sonlasequivalentesaprintf()yscanf().Susintaxiseslamisma,yesrecomendableusarlas
enlugardelasfuncionesestndarparaevitarfuncionamientosextraos.
textcolor(color)
Cambiaelcolordeltexto.Loscolorespredefinidosson:BLACK,BLUE,RED,GREEN,CYAN,
MAGENTA,BROWN,DARKGRAY.Adems,existenlasvariedadesclarasdeestoscolores:
LIGHTBLUE,LIGHTRED,LIGHTGREEN,etc.
As,siejecutamos:
57
AlgoritmoyEstructuradeDatosI
textbackground(color)
Establece el color del fondo del texto. Los colores predefinidos son los mismos que para
textcolor().As,estecdigo:
textbackground(BLUE);hacequeeltextoqueseescribaacontinuacinaparezcaconel
fondoencolorazuloscuro.
getch()
Leeuncarcterdesdeelteclado,sinmostrarelecoysinnecesidadde
pulsar Return. Devuelve el cdigo ASCII del carcter tecleado. Ah va
unejemplo:
charc;
c=getch();clrscr()
Borralapantalla.Nonecesitaargumentos.
58
AlgoritmoyEstructuradeDatosI
CAPTULOIV
EstructurasdeControl
SentenciasdeControldelPrograma
4.1 TiposdeEstructurasBsicas
Lassentenciasdecontroldelosprogramasespecificanelordenenquesehanderealizar
lasoperaciones.Existentresformasbsicasdeflujoenlosprogramas.
Estructurassecuenciales:secomponendeunaseriedesentenciasqueseejecutan
unas tras otras en el orden escrito en el programa. Para estas estructuras no se
necesitaningunasentenciadecontroldelflujodelprograma.
Estructurascondicionales:dentrodelflujodelprogramasetomandecisionespara
realizar unas acciones u otras dependiendo de que se cumplan una serie de
condiciones.
Estructuras repetitivas: repeticin de una serie de sentencias mientras no se
cumplaunadeterminadacondicin.Tambindenominadasbucles.
- Asignacin
Secuenciales
- Entrada
- Salida
- Simples
Estructuras Condicionales
Algoritmicas
- Mltiples
- Hacer para
- Hacer mientras
- Repetir hasta
Cclicas
4.2 EstructuraSecuencial
La estructura secuencial es aquella en la que una accin (instruccin) sigue a otra en
secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la
siguiente y as sucesivamente hasta el fin del proceso. Una estructura secuencial se
representadelasiguienteforma:
59
AlgoritmoyEstructuradeDatosI
Inicio
Accion1
Accion2
.
.
AccionN
Fin
9 Simples:Consisteenpasarunvalorconstateaunavariable(a=15)
9 Contador: Consiste en usarla como un verificador del nmero de veces que se
realizaunproceso(a=a+1)
9 Acumulador:Consisteenusarlacomounsumadorenunproceso(a=a+b)
9 De trabajo: Donde puede recibir el resultado de una operacin matemtica que
involucremuchasvariables(a=c+b*2/4).
Lectura:Lalecturaconsisteenrecibirdesdeundispositivodeentrada(p.ej.elteclado)un
valor.Estaoperacinserepresentaenunpseudocodigocomosigue:
9 Leera,b
9 Dondeaybsonlasvariablesquerecibirnlosvalores
Escritura:Consisteenmandarporundispositivodesalida(p.ej.monitoroimpresora)un
resultadoomensaje.Esteprocesoserepresentaenunpseudocodigocomosigue:
9 EscribeElresultadoes:,R
9 DondeElresultadoes:esunmensajequesedeseaaparezcayResunavariable
quecontieneunvalor.
4.3 ProblemasSecuenciales
P1:Supongaqueunindividuodeseainvertirsucapitalenunbancoydeseasabercunto
dineroganaradespusdeunmessielbancopagaaraznde2%mensual.
Inicio
Leercap_inv
gan=cap_inv*0.02
Imprimirgan
Fin
60
AlgoritmoyEstructuradeDatosI
Inicio
Leersb,v1,v2,v3
tot_vta=v1+v2+v3
com=tot_vta*0.10
tpag=sb+com
Figura1.LenguajeC
Imprimirtpag,com
Fin
P3:Unatiendaofreceundescuentodel15%sobreeltotaldelacomprayunclientedesea
sabercuntodeberpagarfinalmenteporsucompra.
Inicio
Leertc
d=tc*0.15
tp=tcd
Imprimirtp
Fin
P4:UnalumnodeseasaberculsersucalificacinfinalenlamateriadeAlgoritmos.Dicha
calificacinsecomponedelossiguientesporcentajes:
55%delpromediodesustrescalificacionesparciales.
30%delacalificacindelexamenfinal.
15%delacalificacindeuntrabajofinal.
Inicio
Leerc1,c2,c3,ef,tf
prom=(c1+c2+c3)/3
ppar=prom*0.55
pef=ef*0.30
ptf=tf*0.15
cf=ppar+pef+ptf
Imprimircf
Fin
61
AlgoritmoyEstructuradeDatosI
P5:Unmaestrodeseasaberquporcentajedehombresyqueporcentajedemujereshay
enungrupodeestudiantes.
Inicio
Leernh,nm
ta=nh+nm
ph=nh*100/ta
pm=nm*100/ta
Imprimirph,pm
Fin
P6:Realizarunalgoritmoquecalculelaedaddeunapersona.
Inicio
Leerfnac,fact
edad=factfnac
Imprimiredad
Fin.
ProblemasPropuestos
masa=(presin*volumen)/(0.37*(temperatura+460))
Problema4: Calcular el nmero de pulsaciones que una persona debe tener por cada 10
segundosdeejercicio,silaformulaes:
num.pulsaciones=(220edad)/10
Problema5:Calcularelnuevosalariodeunobrerosiobtuvounincrementodel25%sobre
susalarioanterior.
62
AlgoritmoyEstructuradeDatosI
rea
Porcentajedelpresupuesto
Ginecologa
40%
Traumatologa
30%
Pediatra
30%
Obtenerlacantidaddedineroquerecibircadarea,paracualquiermontopresupuestal.
Problema9:Trespersonasdecideninvertirsudineroparafundarunaempresa.Cadauna
deellasinvierteunacantidaddistinta.Obtenerelporcentajequecadaquieninviertecon
respectoalacantidadtotalinvertida.
Problema10: Un alumno desea saber cul ser su promedio general en las tres materias
msdifcilesquecursayculserelpromedioqueobtendrencadaunadeellas.Estas
materiasseevalancomosemuestraacontinuacin:
LacalificacindeMatemticasseobtienedelasiguientemanera:
Examen90%
Promediodetareas10%
Enestamateriasepidiuntotaldetrestareas.
LacalificacindeFsicaseobtienedelasiguientemanera:
Examen80%
Promediodetareas20%
Enestamateriasepidiuntotaldedostareas.
63
AlgoritmoyEstructuradeDatosI
LacalificacindeQumicaseobtienedelasiguientemanera:
Examen85%
Promediodetareas15%
Enestamateriasepidiunpromediodetrestareas.
EstructurasCondicionales:
Las estructuras condicionales comparan una
variablecontraotro(s)valor(es),paraqueenbase
alresultadodeestacomparacin,sesigauncurso
de accin dentro del programa. Cabe mencionar
que la comparacin se puede hacer contra otra
variable o contra una constante, segn se
necesite. Existen dos tipos bsicos, las simples y
lasmltiples.
Si<condicin>entonces
Accin(es)
Finsi
Si<condicin>entonces
Accin(es)
sino
Accin(es)
Finsi
Sentenciaifelse.Elformatoeselsiguiente:
Formato1:
if(condicin)
{sentencias}
64
Figura4.EstructurasCondicionales
AlgoritmoyEstructuradeDatosI
Formato2:
if(condicin)
{sentencias1}
else
{sentencias2}
Ejemplo:
main()
{
floatcm,pul,valor;
charunidad;
printf(Introducenmeroyunidad(p=pulg.oc=cm:);
scanf(%f%c,&valor,&unidad);
if(unidad==p)
{
cm=valor*2.54;
printf(Las%fpulgadasson%fcentmetros\n,valor,cm);
}
if(unidad==c)
{
pul=valor/2.54;
printf(Los%fcentmetrosson%fpulgadas\n,valor,pul);
}
if(unidad!=p&&unidad!=c)
printf(Noestpuestacorrectamentelaunidad\n);
}
EnCexisteunaformaabreviadadeexpresarlasentenciaifelse.Sedenominaexpresin
condicionalyempleaeloperadorcondicional?:.Elformatoeselsiguiente:
expresin1?expresin2:expresin3
Sentenciaswitchcasedefault.
Elformatoeselsiguiente:
65
AlgoritmoyEstructuradeDatosI
switch(variable)
{
caseetiq1:sentencia1
caseetiq2:sentencia2
....................................
default:sentencia3
}
Ejemplo:
main()
{
floatcm,pul,valor;
charunidad;
printf(Introducenmeroyunidad(p=pulg.oc=cm:);
scanf(%f%c,&valor,&unidad);
switch(unidad)
{
casep:cm=valor*2.54;
pul=valor;
break;
casec:pul=valor/2.54;
cm=valor;
break;
default:
printf(Noestpuestacorrectamentelaunidad\n);
exit();
}
printf(\nLas%fpulgadasson%fcentmetros\n,pul,cm);
}
ProblemasCondicionales
ProblemasSelectivosSimples
Prob1:Unhombredeseasabercuntodinerosegeneraporconceptodeinteresessobrela
cantidadquetieneeninversinenelbanco.Eldecidirreinvertirlosinteresessiemprey
cuandoestosexcedana$7000,yenesecasodeseasabercuntodinerotendrfinalmente
ensucuenta.
66
AlgoritmoyEstructuradeDatosI
Inicio
Leerp_int,cap
int=cap*p_int
siint>7000entonces
capf=cap+int
finsi
Imprimircapf
fin
Inicio
Leercalif1,calif2,calif3
prom=(calif1+calif2+calif3)/3
Siprom>=70entonces
Imprimiralumnoaprobado
sino
Imprimiralumnoreprobado
Finsi
Fin
Inicio
Leercompra
Sicompra>1000entonces
desc=compra*0.20
sino
desc=0
finsi
tot_pag=compradesc
imprimirtot_pag
fin.
67
Figura5.Ejercicioscondicionales
AlgoritmoyEstructuradeDatosI
ProblemasSelectivosDobles
Prob4: Un obrero necesita calcular su salario semanal, el cual se obtiene de la siguiente
manera:
9 Sitrabaja40horasomenosselepaga$16porhora
9 Sitrabajamsde40horasselepaga$16porcadaunadelasprimeras40horasy
$20porcadahoraextra.
Inicio
Leerht
Siht>40entonces
he=ht40
ss=he*20+40*16
sino
ss=ht*16
Finsi
Imprimirss
Fin
Prob5:Unhombredeseasabercuntodinerosegeneraporconceptodeinteresessobrela
cantidadquetieneeninversinenelbanco.Eldecidirreinvertirlosinteresessiemprey
cuandoestosexcedana$7000,yenesecasodeseasabercuntodinerotendrfinalmente
ensucuenta.
Inicio
Leerp_int,cap
int=cap*p_int
siint>7000entonces
capf=cap+int
finsi
Imprimircapf
fin
Prob6:Queleadosnmerosylosimprimaenformaascendente
Inicio
Leernum1,num2
Sinum1<num2entonces
Imprimirnum1,num2
sino
Imprimirnum2,num1
finsi
fin
68
AlgoritmoyEstructuradeDatosI
Inicio
Leeract$,tiemp
Siact$=dormidoentonces
Figura6.Condicionalesdobles
cg=1.08*tiemp
sino
cg=1.66*tiemp
finsi
Imprimircg
Fin
Prob8:Hacerunalgoritmoqueimprimaelnombredeunarticulo,clave,preciooriginaly
su precio con descuento. El descuento lo hace en base a la clave, si la clave es 01 el
descuentoesdel10%ysilaclavees02eldescuentoendel20%(soloexistendosclaves).
Inicio
Leernomb,cve,prec_orig
Sicve=01entonces
prec_desc=prec_origprec_orig*0.10
sino
prec_desc=prec_origprec_orig*0.20
finsi
Imprimirnomb,cve,prec_orig,prec_desc
fin
Prob9: Hacer un algoritmo que calcule el total a pagar por la compra de camisas. Si se
comprantrescamisasomasseaplicaundescuentodel20%sobreeltotaldelacompray
sisonmenosdetrescamisasundescuentodel10%
69
AlgoritmoyEstructuradeDatosI
Inicio
Leernum_camisas,prec
tot_comp=num_camisas*prec
Sinum_camisas>=3entonces
tot_pag=tot_comptot_comp*0.20
sino
tot_pag=tot_comptot_comp*0.10
finsi
Imprimirtot_pag
fin
Prob10:Unaempresaquierehacerunacompradevariaspiezasdelamismaclaseauna
fbrica de refacciones. La empresa, dependiendo del monto total de la compra, decidir
quhacerparapagaralfabricante.
9 Sielmontototaldelacompraexcedede$500000laempresatendrlacapacidad
deinvertirdesupropiodineroun55%delmontodelacompra,pedirprestadoal
bancoun30%yelrestolopagarasolicitandouncrditoalfabricante.
9 Si el monto total de la compra no excede de $500 000 la empresa tendr
capacidad de invertir de su propio dinero un 70% y el restante 30% lo pagara
solicitandocrditoalfabricante.
Elfabricantecobraporconceptodeinteresesun20%sobrelacantidadqueselepaguea
crdito.
Inicio
Leercostopza,numpza
totcomp=costopza*numpza
Sitotcomp>500000entonces
cantinv=totcomp*0.55
prstamo=totcomp*0.30
crdito=totcomp*0.15
sino
cantinv=totcomp*0.70
crdito=totcomp*0.30
prstamo=0
finsi
int=crdito*0.20
Imprimircantinv,prstamo,crdito,int
Fin
70
AlgoritmoyEstructuradeDatosI
ProblemasPropuestos
1. Calculareltotalqueunapersonadebepagarenunallantera,sielpreciodecada
llantaesde$800sisecompranmenosde5llantasyde$700sisecompran5o
ms.
2. Enunsupermercadosehaceunapromocin,mediantelacualelclienteobtiene
un descuento dependiendo de un nmero que se escoge al azar. Si el numero
escogidoesmenorque74eldescuentoesdel15%sobreeltotaldelacompra,si
es mayor o igual a 74 el descuento es del 20%. Obtener cunto dinero se le
descuenta.
3. Calcular el nmero de pulsaciones que debe tener una persona por cada 10
segundos de ejercicio aerbico; la formula que se aplica cuando el sexo es
femeninoes:
a. num.pulsaciones=(220edad)/10
ysielsexoesmasculino:
b. num.pulsaciones=(210edad)/10
Obtenercuantodebepagarunalumno.
6. Una empresa de bienes races ofrece casas de inters social, bajo las siguientes
condiciones: Si los ingresos del comprador son menores de $8000 o ms el
enganche ser del 15% del costo de la casa y el resto se distribuir en pagos
mensuales, a pagar en diez aos. Si los ingresos del comprador son menos de
$8000omselengancheserdel30%delcostodelacasayelrestosedistribuir
enpagosmensualesapagaren7aos.
71
AlgoritmoyEstructuradeDatosI
Laempresaquiereobtenercuantodebepagaruncompradorporconcepto
deengancheycuantoporcadapagoparcial.
7. ElgobiernohaestablecidoelprogramaSAR(SistemadeAhorroparaelRetiro)que
consiste en que los dueos de la empresa deben obligatoriamente depositar en
unacuentabancariaunporcentajedelsalariodelostrabajadores;adicionalmente
los trabajadores pueden solicitar a la empresa que deposite directamente una
cuota fija o un porcentaje de su salario en la cuenta del SAR, la cual le ser
descontadadesupago.
UntrabajadorquehadecididoaportarasucuentadelSARdeseasaberla
cantidadtotaldedineroqueestardepositadoaesacuentacadames,yel
pagomensualquerecibir.
8. Unapersonadeseainiciarunnegocio,paralocualpiensaverificarcuantodinerole
prestara el banco por hipotecar su casa. Tiene una cuenta bancaria, pero no
quiere disponer de ella a menos que el monto por hipotecar su casa sea muy
pequeo.Sielmontodelahipotecaesmenorque$1000000entoncesinvertir
el 50% de la inversin total y un socio invertir el otro 50%. Si el monto de la
hipotecaesde$1000000oms,entoncesinvertirelmontototaldelahipoteca
y el resto del dinero que se necesite para cubrir la inversin total se repartir a
partesigualesentreelsocioyel.
9. ElgobiernodelPerdeseareforestarunbosquequemidedeterminadonmero
dehectreas.Silasuperficiedelterrenoexcedea1millndemetroscuadrados,
entoncesdecidirsembrardelasiguientemanera:
Porcentajedelasuperficiedelbosque
Tipoderbol
a. 70%
pino
b. 20%
oyamel
c. 10%
cedro
Porcentajedelasuperficiedelbosque
Tipoderbol
d. 50%
pino
e. 30%
oyamel
f. 20%
cedro
El gobierno desea saber el nmero de pinos, oyameles y cedros que tendr que
sembrarenelbosque,sisesabequeen10metroscuadradoscaben8pinos,en15
72
AlgoritmoyEstructuradeDatosI
metroscuadradoscaben15oyamelesyen18metroscuadradoscaben10cedros.
Tambinsesabequeunahectreaequivalea10milmetroscuadrados.
10. Unafbricahasidosometidaaunprogramadecontroldecontaminacinparalo
cual se efecta una revisin de los puntos IMECA generados por la fbrica. El
programa de control de contaminacin consiste en medir los puntos IMECA que
emitelafabricaencincodasdeunasemanaysielpromedioessuperioralos170
puntosentoncestendrlasancindepararsuproduccinporunasemanayuna
multadel50%delasgananciasdiariascuandonosedetienelaproduccin.Siel
promedio obtenido de puntos IMECA es de 170 o menor entonces no tendr ni
sancin ni multa. El dueo de la fbrica desea saber cunto dinero perder
despusdesersometidoalarevisin.
ProblemasSelectivosCompuestos
PP1: Leer 2 nmeros; si son iguales que los multiplique, si el primero es mayor que el
segundoquelosresteysinoquelossume.
Inicio
Leernum1,num2
sinum1=num2entonces
resul=num1*num2
sino
sinum1>num2entonces
resul=num1num2
sino
resul=num1+num2
finsi
finsi
fin
73
AlgoritmoyEstructuradeDatosI
PP2:Leertresnmerosdiferenteseimprimirelnmeromayordelostres.
Inicio
Leernum1,num2,num3
Si(num1>num2)and(num1>num3)entonces
mayor=num1
sino
Si(num2>num1)and(num2>num3)entonces
mayor=num2
sino
mayor=num3
finsi
finsi
Imprimirmayor
fin
PP3: Determinar la cantidad de dinero que recibir un trabajador por concepto de las
horas extras trabajadas en una empresa, sabiendo que cuando las horas de trabajo
excedende40,elrestoseconsideranhorasextrasyqueestassepaganaldobledeuna
hora normal cuando no exceden de 8; si las horas extras exceden de 8 se pagan las
primeras8aldobledeloquesepaganlashorasnormalesyelrestoaltriple.
Inicio
Leerht,pph
Siht<=40entonces
tp=ht*pph
sino
he=ht40
Sihe<=8entonces
pe=he*pph*2
sino
pd=8*pph*2
pt=(he8)*pph*3
pe=pd+pt
finsi
tp=40*pph+pe
finsi
Imprimirtp
fin
74
AlgoritmoyEstructuradeDatosI
PP4:Calcularlautilidadqueuntrabajadorrecibeenelrepartoanualdeutilidadessieste
seleasignacomounporcentajedesusalariomensualquedependedesuantigedadenla
empresadeacuerdoconlasiguientetabla:
Tiempo
Utilidad
Menosde1ao
5%delsalario
1aoomsymenosde2aos
7%delsalario
2aosomsymenosde5aos
10%delsalario
5aosomsymenosde10aos
15%delsalario
10aosoms
20%delsalario
Inicio
Leersm,antig
Siantig<1entonces
util=sm*0.05
sino
Si(antig>=1)and(antig<2)entonces
util=sm*0.07
sino
Si(antig>=2)and(antig<5)entonces
util=sm*0.10
sino
Si(antig>=5)and(antig<10)entonces
util=sm*0.15
sino
util=sm*0.20
finsi
finsi
finsi
finsi
Imprimirutil
fin
75
AlgoritmoyEstructuradeDatosI
Inicio
leertc,b$
sib$=blancaentonces
d=0
sino
sib$=verdeentonces
d=tc*0.10
sino
sib$=amarillaentonces
d=tc*0.25
sino
sib$=azulentonces
d=tc*0.50
sino
d=tc
finsi
finsi
finsi
finsi
fin
PP6:ElIMSSrequiereclasificaralaspersonasquesejubilaranenelaode1997.Existen
tres tipos de jubilaciones: por edad, por antigedad joven y por antigedad adulta. Las
personasadscritasalajubilacinporedaddebentener60aosomsyunaantigedaden
suempleodemenosde25aos. Las personas adscritas a la jubilacin por antigedad
jovendebentenermenosde60aosyunaantigedadensuempleode25aosoms.
Laspersonasadscritasalajubilacinporantigedadadultadebentener60aosomsy
unaantigedadensuempleode25aosoms.
Determinarenqutipodejubilacin,quedaraadscritaunapersona.
Inicio
leeredad,ant
siedad>=60andant<25entonces
imprimirlajubilacinesporedad
sino
siedad>=60andant>25entonces
imprimirlajubilacinesporedadadulta
sino
siedad<60andant>25entonces
imprimirlajubilacinesporantigedadjoven
76
AlgoritmoyEstructuradeDatosI
sino
imprimirnotieneporquejubilarse
finsi
finsi
finsi
fin
ProblemasPropuestos
Prob1:Enunafbricadecomputadorasseplaneaofreceralosclientesundescuentoque
dependerdelnmerodecomputadorasquecompre.Silascomputadorassonmenosde
cinco se les dar un 10% de descuento sobre el total de la compra; si el nmero de
computadoras es mayor o igual a cinco pero menos de diez se le otorga un 20% de
descuento; y si son 10 o ms se les da un 40% de descuento. El precio de cada
computadoraesde$11,000
Prob2:EnunallanterasehaestablecidounapromocindelasllantasmarcaPonchadas,
dichapromocinconsisteenlosiguiente:
9 Sisecompranmenosdecincollantaselprecioesde$300cadauna,de$250sise
comprandecincoa10yde$200sisecompranmsde10.
9 Obtenerlacantidaddedineroqueunapersonatienequepagarporcadaunade
lasllantasquecompraylaquetienequepagarporeltotaldelacompra.
Prob3:EnunjuegodepreguntasalasqueserespondeSioNoganaquienresponda
correctamente las tres preguntas. Si se responde mal a cualquiera de ellas ya no se
preguntalasiguienteyterminaeljuego.Laspreguntasson:
1.ColondescubriAmrica?
2.LaindependenciadePerfueenelao1866?
3.TheDoorsfueungrupoderockAmericano?
Prob4:Unproveedordeestreosofreceundescuentodel10%sobreelpreciosinIGV,de
algn aparato si este cuesta $2000 o ms. Adems, independientemente de esto, ofrece
un5%dedescuentosilamarcaesPONY.Determinarcuntopagara,conIGVincluido,
unclientecualquieraporlacompradesuartefacto.
77
AlgoritmoyEstructuradeDatosI
Prob5:Unafruteraofrecelasmanzanascondescuentosegnlasiguientetabla:
NUM.DEKILOSCOMPRADOS
%DESCUENTO
02
0%
2.015
10%
5.0110
15%
10.01enadelante
20%
Determinarcuntopagaraunapersonaquecompremanzanasesesafrutera.
Prob6:Eldueodeunaempresadeseaplanificarlasdecisionesfinancierasquetomaraen
elsiguienteao.Lamaneradeplanificarlasdependedelosiguiente:
Posteriormenterepartirsupresupuestodelasiguientemanera.
$5000paraequipodecomputo
$2000paramobiliario
yelrestolamitadserparalacompradeinsumosylaotraparaotorgarincentivos
alpersonal.
EDAD
NIVELHEMOGLOBINA
01mes
1326g%
>1y<=6meses
1018g%
>6y<=12meses
1115g%
>1y<=5aos
11.515g%
78
AlgoritmoyEstructuradeDatosI
>5y<=10aos
12.615.5g%
>10y<=15aos
1315.5g%
mujeres>15aos
1216g%
hombres>15aos
1418g%
Prob8:Unainstitucineducativaestableciunprogramaparaestimularalosalumnoscon
buenrendimientoacadmicoyqueconsisteenlosiguiente:
9 Sielpromedioesde19omsyelalumnoesdepreparatoria,entoncesestepodr
cursar55unidadesyseleharun25%dedescuento.
9 Si el promedio es mayor o igual a 18 pero menor que 19 y el alumno es de
preparatoria, entonces este podr cursar 50 unidades y se le har un 10% de
descuento.
9 Sielpromedioesmayorque14ymenorque18yelalumnoesdepreparatoria,
estepodrcursar50unidadesynotendrningndescuento.
9 Sielpromedioesde14omenor,elnumerodemateriasreprobadasesde0a3y
el alumno es de preparatoria, entonces podr cursar 45 unidades y no tendr
descuento.
9 Sielpromedioesde14omenor,elnumerodemateriasreprobadasesde4oms
y el alumno es de preparatoria, entonces podr cursar 40 unidades y no tendr
ningndescuento.
9 Sielpromedioesmayoroiguala19yelalumnoesdeprofesional,entoncespodr
cursar55unidadesyseleharun20%dedescuento.
9 Si el promedio es menor de 19 y el alumno es de profesional, entonces podr
cursar55unidadesynotendrdescuento.
Obtener el total que tendr que pagar un alumno si la colegiatura para alumnos de
profesionalesde$300porcadacincounidadesyparaalumnosdepreparatoriaesde$180
porcadacincounidades.
Prob9:Queleatresnmerosdiferentesydetermineelnmeromediodelconjuntodelos
tresnmeros(elnmeromedioesaquelnmeroquenoesnimayor,nimenor).
EstructurasCclicas
Sellamanproblemasrepetitivosocclicosaaquellosencuyasolucinesnecesarioutilizar
unmismoconjuntodeaccionesquesepuedanejecutarunacantidadespecficadeveces.
Estacantidadpuedeser fija(previamentedeterminadapor el programador) opuedeser
variable(estarenfuncindealgndatodentrodelprograma).Losciclosseclasificanen:
79
AlgoritmoyEstructuradeDatosI
Buclefor.Elformatoeselsiguiente:
for(inicio;condicin;incremento)
{
sentencias
}
Buclewhile.Elformatoeselsiguiente:
while(condicin)
{
sentencias
}
Bucledowhile.Elformatoeselsiguiente:
do
{
sentencias
}
while(condicin);
Ejemplo:
main()
{
longacum=1;
inti,n;
do
{
printf(Introducenmeropositivo:);
scanf(%d,&n);
}
while(n<0);
for(i=n;i>1;i)
acum*=i;
printf(\nElfactoriales%ld,acum);
}
80
AlgoritmoyEstructuradeDatosI
Problemas(Hacerpara)
Ejercicio1:Calcularelpromediodeunalumnoquetiene7calificacionesenlamateriade
DiseoEstructuradodeAlgoritmos
Inicio
Sum=0
LeerNom
Hacerparac=1a7
Leercalif
Sum=sum+calif
Finpara
prom=sum/7
Imprimirprom
Fin.
Ejercicio2:Leer10nmerosyobtenersucuboysucuarta.
Inicio
Hacerparan=1a10
Leernum
cubo=num*num*num
cuarta=cubo*num
Imprimircubo,cuarta
Finpara
Fin.
Ejercicio3:Leer10nmeroseimprimirsolamentelosnmerospositivos
Inicio
Hacerparan=1a10
Leernum
Sinum>0entonces
Imprimirnum
finsi
Finpara
Fin.
81
AlgoritmoyEstructuradeDatosI
Ejercicio4:Leer20nmeroseimprimircuantossonpositivos,cuantosnegativosycuantos
neutros.
Inicio
cn=0
cp=0
cneg=0
Hacerparax=1a20
Leernum
Sinnum=0entonces
cn=cn+1
sino
Sinum>0entonces
cp=cp+1
sino
cneg=cneg+1
Finsi
Finsi
Finpara
Imprimircn,cp,cneg
Fin.
Inicio
Hacerparax=1a15
Leernum
pos=num*1
Imprimirnum,pos
Finpara
Fin.
Ejercicio6:Supongaquesetieneunconjuntodecalificacionesdeungrupode40alumnos.
Realizarunalgoritmoparacalcularlacalificacinmediaylacalificacinmsbajadetodoel
grupo.
82
AlgoritmoyEstructuradeDatosI
Inicio
sum=0
baja=9999
Hacerparaa=1a40
Leercalif
sum=sum+calif
Sicalif<bajaentonces
baja=calif
finsi
Finpara
media=sum/2
Imprimirmedia,baja
fin
Ejercicio7:Calculareimprimirlatablademultiplicardeunnmerocualquiera.Imprimirel
multiplicando,elmultiplicadoryelproducto.
Inicio
Leernum
HacerparaX=1a10
resul=num*x
Imprimirnum,*,X,=,resul
Finpara
fin.
Ejercicio8:Simularelcomportamientodeunrelojdigital,imprimiendolahora,minutosy
segundosdeundadesdelas0:00:00horashastalas23:59:59horas
Inicio
Hacerparah=1a23
Hacerparam=1a59
Hacerparas=1a59
Imprimirh,m,s
Finpara
Finpara
Finpara
fin.
83
AlgoritmoyEstructuradeDatosI
ProblemasPropuestos
Prop1: Una persona debe realizar un muestreo con 50 personas para determinar el
promedio de peso de los nios, jvenes, adultos y viejos que existen en su zona
habitacional.Sedeterminanlascategorasconbaseenlasig,tabla:
CATEGORIA
EDAD
Nios
012
Jvenes
1329
Adultos
3059
Viejos
60enadelante
Prop2:Alcerrarunexpendiodenaranjas,15clientesqueaunnohanpagadorecibirnun
15% de descuento si compran ms de 10 kilos. Determinar cunto pagara cada cliente y
cuantopercibirlatiendaporesascompras.
Prop3:Enuncentrodeverificacindeautomvilessedeseasaberelpromediodepuntos
contaminantesdelosprimeros25automvilesquelleguen.Asimismosedeseasaberlos
puntoscontaminantesdelcarroquemenoscontaminoydelquemscontamino.
Prop4:Unentrenadorlehapropuestoaunatletarecorrerunarutadecincokilmetros
durante10das,paradeterminarsiesaptoparalapruebade5Kilmetrosodebebuscar
otraespecialidad.Paraconsiderarloaptodebecumplirporlomenosunadelassiguientes
condiciones:
9 Queenningunadelaspruebashagauntiempomayora16minutos.
9 Quealmenosenunadelaspruebasrealiceuntiempomayora16minutos.
9 Quesupromediodetiemposseamenoroiguala15minutos.
Son aquellos en que el nmero de iteraciones no se conoce con exactitud, ya que esta
dadoenfuncindeundatodentrodelprograma.
84
AlgoritmoyEstructuradeDatosI
HacerMientras:
Estaesuna estructuraquerepetirunproceso duranteNveces, donde Npuede ser
fijo o variable. Para esto, la instruccin se vale de una condicin que es la que debe
cumplirseparaquesesigaejecutando.Cuandolacondicinyanosecumple,entoncesya
noseejecutaelproceso.Laformadeestaestructuraeslasiguiente:
Figura7.Hacermientras
Ejemplo:
#include<stdio.h>
intmain(){
inti=1;
do{
printf("i=%i\n",i);
i++;
}while(i<=3);
}
Problemas(HacerMientras)
Ejemplo 1: Una compaa de seguros tiene contratados a n vendedores. Cada uno hace
tresventasalasemana.Supolticadepagosesqueunvendedorrecibeunsueldobase,y
un10%extraporcomisionesdesusventas.Elgerentedesucompaadeseasabercunto
dinero obtendr en la semana cada vendedor por concepto de comisiones por las tres
ventasrealizadas,ycuantotomandoencuentasusueldobaseysuscomisiones.
Ejemplo2:Enunaempresaserequierecalcularelsalariosemanaldecadaunodelosn
obrerosquelaboranenella.Elsalarioseobtienedelasiguienteforma:
85
AlgoritmoyEstructuradeDatosI
Sielobrerotrabaja40horasomenosselepaga$20porhora
Sitrabajamsde40horasselepaga$20porcadaunadelasprimeras40horasy$25
porcadahoraextra.
Ejemplo3:Determinarcuntoshombresycuantasmujeresseencuentranenungrupode
npersonas,suponiendoquelosdatossonextradosalumnoporalumno.
Ejemplo4:ElDepto.deSeguridadPublicayTransitodelD.F.deseasaber,delosnautos
que entran a la ciudad de Mxico, cuantos entran con calcomana de cada color.
Conociendoelltimodgitodelaplacadecadaautomvilsepuededeterminarelcolorde
lacalcomanautilizandolasiguienterelacin:
DGITO
COLOR
1o2
amarilla
3o4
rosa
5o6
roja
7o8
verde
9o0
azul
Ejemplo5:Obtenerelpromediodecalificacionesdeungrupodenalumnos.
Ejemplo6:Unapersonadeseainvertirsudineroenunbanco,elcualleotorgaun2%de
inters.Culserlacantidaddedineroqueestapersonatendralcabodeunaosila
gananciadecadamesesreinvertida?
Ejemplo8:Encontrarelmenorvalordeunconjuntodennmerosdados.
Ejemplo9:Encontrarelmayorvalordeunconjuntodennmerosdados.
Ejemplo 10: En un supermercado un cajero captura los precios de los artculos que los
clientescompraneindicaacadaclientecualeselmontodeloquedebenpagar.Alfinal
86
AlgoritmoyEstructuradeDatosI
deldaleindicaasusupervisorcuantofueloquecobroentotalatodoslosclientesque
pasaronporsucaja.
Ejemplo 11: Cinco miembros de un club contra la obesidad desean saber cunto han
bajadoosubidodepesodesdelaltimavezquesereunieron.Paraestosedeberealizar
unritualdepesajeendondecadaunosepesaendiezbsculasdistintasparaastenerel
promediomsexactodesupeso.Siexistediferenciapositivaentreestepromediodepeso
y el peso de la ltima vez que se reunieron, significa que subieron de peso. Pero si la
diferenciaesnegativa,significaquebajaron.Loqueelproblemarequiereesqueporcada
personaseimprimaunletreroquediga:SUBIOoBAJOylacantidaddekilosquesubi
obajodepeso.
RepetirHasta
Esta es una estructura similar en algunas
caractersticas,alaanterior.Repiteunprocesouna
cantidad de veces, pero a diferencia del Hacer
Mientras, el RepetirHasta lo hace hasta que la
condicin se cumple y no mientras, como en el
HacerMientras. Por otra parte, esta estructura
permite realizar el proceso cuando menos una vez,
ya que la condicin se evala al final del proceso,
mientras que en el HacerMientras puede ser que
nunca llegue a entrar si la condicin no se cumple
desdeunprincipio.Laformadeestaestructuraesla
siguiente:
Figura8.Repetirhasta
Ejemplo1: En una tienda de descuento las personas que van a pagar el importe de su
compra llegan a la caja y sacan una bolita de color, que les dir que descuento tendrn
sobreeltotaldesucompra.Determinarlacantidadquepagaracadaclientedesdequela
tiendaabrehastaquecierra.Sesabequesielcolordelabolitaesrojaelclienteobtendr
un40%dedescuento;siesamarillaun25%ysiesblancanoobtendrdescuento.
87
AlgoritmoyEstructuradeDatosI
Ejemplo2:Enunsupermercadounaamadecasaponeensucarritolosartculosqueva
tomandodelosestantes.Laseoraquiereasegurarsedequeelcajerolecobrebienloque
ellahacomprado,porloquecadavezquetomaunarticuloanotasupreciojuntoconla
cantidad de artculos iguales que ha tomado y determina cunto dinero gastara en ese
artculo;aestolesumaloqueiragastandoenlosdemsartculos,hastaquedecidequeya
tomotodoloquenecesitaba.Aydaleaestaseoraaobtenereltotaldesuscompras.
Ejemplo3:Unteatrootorgadescuentossegnlaedaddelcliente.Determinarlacantidad
dedineroqueelteatrodejadepercibirporcadaunadelascategoras.Tomarencuenta
quelosniosmenoresde5aosnopuedenentraralteatroyqueexisteunprecionico
enlosasientos.Losdescuentossehacentomandoencuentaelsiguientecuadro:
Edad
Descuento
Categora1
514
35%
Categora2
1519
25%
Categora3
2045
10%
Categora4
4665
25%
Categora5
66enadelante 35%
88
AlgoritmoyEstructuradeDatosI
CAPTULOV
ProgramacinModular
Lamodularizacin,esunatcnicausadaporlosprogramadoresparahacersuscdigosms
cortos,yaqueconsisteenreducirungranproblemacomplejo,enpequeosproblemitas
mssencillos,concentrndoseenlasolucinporseparado,decadaunodeellos.
Enlasfuncionesjueganunpapelmuyimportelasvariables,yaquecomosehadichoestas
puedenserlocalesoglobales.
Lossubprogramasseclasificanen:procedimientosyfunciones.
5.1 ElDiseoDescendente:Subprogramas
Unodelosmtodosfundamentalespararesolverunproblemaesdividirloenproblemas
mspequeos,llamadossubproblemas,enreferenciassucesivas.
Estosproblemasasuvezpuedenserdivididosrepetidamenteenproblemasmspequeos
hastaquelosproblemasmspequeospuedansersolucionados.
89
AlgoritmoyEstructuradeDatosI
Unsubprogramarealizaunatareaconcretaquesedescribeconunaseriedeinstrucciones.
Veamosunejemplo:
Leerelradiodeuncrculoycalculareimprimirsusuperficieylongitud.
Anlisis
EspecificacionesdeEntrada
Radio:Real
EspecificacionesdeSalida
Superficie:Real
Longitud:Real
Algoritmo
1. Leerelvalordelradio
2. CalcularlaSuperficie
3. CalcularlaLongitud
4. Visualizarlosvaloresdelasuperficieylalongitud
RefinamientodelAlgoritmo
1. Leerelvalordelradio
2. Calcularlasuperficie
1. pi<3.141592(constantepi)
2. S<pi*Radio*Radio
3. Calcularlalongitud
1. pi<3.141592
2. L<2*pi*Radio
4. Visualizarlosvaloresdelasuperficieylalongitud
5.2 ElDiseoModular
Lossubproblemasomdulossediseanconsubprogramas,queasuvezseclasificanen
procedimientosyfunciones.
Los procedimientos y las funciones son unidades de programas diseadas para ejecutar
unatareaespecfica.Porejemplo,losprocedimientospredefinidos,printf()yscanf(),estn
diseadospararealizaroperacionesdeentradaysalida.
Elprocesodedescomposicindeunproblemaenmdulosseconocecomomodulacinya
laprogramacinrelativaaellosprogramacinmodular.
Losprocedimientosyfuncionessonsimilares,aunquepresentannotablesdiferenciasentre
ellos:
90
AlgoritmoyEstructuradeDatosI
9 Losprocedimientospuedendevolvercero,unoovariosvalores.Enelcasodeno
devolver ningn valor, realizan alguna tarea tal como alguna operacin de
entrada/salida.
TransferenciadeInformacina/desdeMdulos
LosParmetros
Losmdulososubprogramassirvenparaejecutartareasconcretas,peronoutilizanningn
tipodedatodelrestodelprograma.Sinembargo,unadelascaractersticasimportantesy
diferenciadoradelossubprogramaseslaposibilidad decomunicacin entreel programa
principal y los subprogramas (o entre los subprogramas). Esta comunicacin se realiza a
travsdeunalistadeparmetros
Aspues,losmdulosseclasificanen:
Mdulos sin parmetros (no existe comunicacin entre el programa principal y los
mdulosoentremdulos).
Mdulosconparmetros(existecomunicacinentreelprogramaprincipalylosmdulos,
yentreellos).
Un parmetro es prcticamente, una variable cuyo valor debe ser o bien proporcionado
por el programa principal al mdulo o ser devuelto desde el mdulo hasta el programa
principal.Porconsiguientehaydostiposdeparmetros:entradaysalida.
Los parmetros de entrada son aquellos cuyos valores deben ser proporcionados por el
programa principal, y los de salida son aquellos cuyos valores se calcularn en el
subprograma o mdulo y se deben devolver al programa principal para su proceso
posterior.
91
AlgoritmoyEstructuradeDatosI
nombreSubprograma(pa1,pa2,...)
Enladeclaracindeunsubprograma,cuandoseincluyenparmetros,estossedenominan
parmetros formales o ficticios. Ellos sirven para contener los valores de parmetros
actualescuandosellamaalsubprograma.
Procedimientoofuncinnombresubprograma(pf1,pf2,...)
Losparmetrosactualesenlallamadaalsubprogramadebencoincidirennmero,ordeny
tipoconlosparmetrosficticiosdeladeclaracindelsubprograma.Esdecir,debeexistir
unacorrespondenciaentreparmetrosactualesyficticios.
ParmetrosValoryParmetrosVariable
Existen dos tipos de parmetros, como se indico anteriormente, que nos ayudan a
transferir/recibir informacin de otros subprogramas, o del programa principal, a saber:
parmetrosdeentrada(porvalor)yparmetrosdesalidaodeentrada/salida(variable).
ParmetrosValor
Son parmetros unidireccionales que se utilizan para proporcionar informacin a un
subprograma,peronopuedendevolvervalores,alprogramallamador.
ParmetrosVariable
Se utilizan tanto para recibir como para transmitir valores entre el subprograma y el
programallamador.Estepuedeactuarcomoparmetrodesalidaodeentrada/salida.
Nota:
Enlanotacindepseudocdigorepresentaraestosparmetrosanteponiendolapalabra
varantesdelidentificador;).
92
AlgoritmoyEstructuradeDatosI
procedimientopasar(D,E:entero;varF:entero)
inicio
escribir("Entradaalprocedimientopasar:")
imprimir(D,E,F)
F<D*F
escribir("Salidadelprocedimientopasar:")
imprimir(D,E,F)
fin_pasar
inicio
A<2
B<3
C<4
escribir("Antesdellamaralprocedimientopasar")
imprimir(A,B,C)
pasar(A,B,C)
escribir("Despuesdelretornodelprocedimientopasar")
imprimir(A,B,C)
fin
Lasalidadelprogramaenpantallaseralasiguiente:
Antesdellamaralprocedimientopasar
A=2,B=3,C=4
Entradaalprocedimientopasar
A=2,B=3,C=4
Salidadelprocedimientopasar
A=2,B=3,C=6
Despuesdelretornodelprocedimientopasar
A=2,B=3,C=6
VariablesLocalesyVariablesGlobales
Lasvariablesutilizadasenunprogramaconsubprogramaspuedenserdedostipos:locales
yglobales.
VariablesLocales
Unavariablelocalesunavariablequeestdeclaradadentrodeunsubprogramaysedice
que es local al subprograma. Una variable local solo est disponible durante el
funcionamiento del subprograma, al terminar su funcin el subprograma y regresar al
programallamador,sepierdeelvalorqueseencontrabaguardadoenlavariablelocal.
93
AlgoritmoyEstructuradeDatosI
VariablesGlobales
Las variables declaradas en el programa principal se denominan variables globales. Al
contrario que las variables locales cuyos valores se pueden utilizar solo dentro del
subprogramaenquefuerondeclaradas,lasvariablesglobalessepuedenutilizarentodoel
programaprincipalyentodoslossubprogramas,dondesehagareferenciaalidentificador
deestavariable.
mbitodeunIdentificador
Lamayoradelosprogramastienenunaestructuratiporbol,elprogramaprincipalesla
razydeestependenmuchasramas(procedimientosyfunciones).
Lossubprogramasenlosqueunidentificadorpuedeserutilizadoseconocencomombito
oalcancedelidentificador,dichodeotromodo,esenestaseccindondeelidentificador
esvlido.
Reglasdembito
a. El mbito de un identificador es el dominio en que est declarado. Por
consiguiente un identificador declarado en un bloque P puede ser usado en el
subprogramaPyentodoslossubprogramasllamadosenelsubprogramaP.
b. Si un identificador j declarado en el procedimiento P se redeclara en algn
subprograma interno Q invocado en P, entonces el subprograma Q y todas sus
invocacionesaotrossubprogramasseexcluyendelmbitodejdeclaradoenP.
ProcedimientosyFunciones
Los procedimientos y funciones son la base principal en la programacin modular,
estudiaremosaqusufuncionamientoysusintaxis.
Procedimientos
Unprocedimientoesunsubprogramaquerealizaunatareaespecfica.Puederecibircero
omsvaloresdelprogramaquellamaydevolverceroomsvaloresadichoprograma.
Ladeclaracinindicalasinstruccionesaejecutar.Susintaxises:
procedimientonombreproc(listadepar)
declaracioneslocales
inicio
cuerpodelprocedimiento(instrucciones)
fin.
94
AlgoritmoyEstructuradeDatosI
nombreproc
nombreproc(listapar.actuales)
Funciones
Unafuncinesunsubprogramaquerecibecomoargumentosoparmetros,datosdetipos
numrico o no numrico, y devuelve un nico resultado. Esta caracterstica le diferencia
esencialmentedeunprocedimiento.
Suformatoeselsiguiente:
funcionnombrefuncion(p1,p2,...):tipoadevolver
declaracioneslocales
inicio
cuerpodelafuncin
nombrefuncion<valoradevolver
fin
Unafuncinesllamadapormediodesunombre,enunasentenciadeasignacinoenuna
sentenciadesalida.
Sepuedellamaraunafuncinencualquieradelassiguientesformas:
nombrefunciononombrefuncion(par)
idVar<nombrefuncion.
95
AlgoritmoyEstructuradeDatosI
Funciones
TiposdeMdulos
Procedimientos
Funcin: Una funcin en matemticas, es una operacin que toma un o mas valores
(argumentos)ydevuelveunresultado(valordelafuncinparalosargumentosdados).Por
ejemplo:
F(X)=X/(1+X2)
Donde:
F..Nombredelafuncin
X.Eselargumento(tambinconocidocomoparmetroformal)
Definicindefunciones:Unadefinicindefuncinsepresentadelasiguientemanera:
Funcinnombre_funcion(p1,p2,,pn)
Inicio
Bloquedeinstrucciones
Fin
Donde:
Funcin Eslapalabraclavequenosindicaunadefinicindefuncin.
Nombre_funcion.Eselidentificadorconelcualsereconocealafuncinenelcuerpodel
algoritmoprincipal.
P1,p2,,pn... Eselgrupodeparmetrosquedefinealafuncin.
Llamadoaunafuncin
Cuandodefinimosunafuncinsololeindicamosalalgoritmoqueestafuncinexiste,pero
unadefinicindefuncinnoimplicalarealizacindelasinstruccionesquelaconstituyen.
Parahacerusodeunafuncin,elalgoritmoprincipalladebellamar.Porejemplo:
FuncinF(X)
Inicio
F=X/(1+X^2)
Fin
Inicio
ImprimirEsteeselalgoritmoprincipal
LeerN
96
AlgoritmoyEstructuradeDatosI
R=F(N)
llamadodelafuncin
ImprimirElresultadodelafuncines:,R
Fin
Podemosdefinirunafuncincualquieradelamismamaneraenquedefinimoslafuncin
main(). Basta con poner su tipo, su nombre, sus argumentos entre parntesis y luego,
entrellaves,sucdigo:
/*Inclusindearchivos*/
#include<stdio.h>
voidholamundo(void)/*Funcindondeseejecutalalgicadelprograma*/
{
printf("HolaMundo\n");/*imprimelacadena*/
return;/*saledelafuncin*/
}
intmain(void)/*Funcinprincipaldelprograma*/
{
holamundo();/*llamadaalafuncinquellevaelpeso*/
return0;/*saledelprograma:correcto*/
}
Estecdigoesentodoequivalenteal"HolaMundo"original,sloquenosmuestracmo
escribir y cmo utilizar una funcin. Y adems nos muestra un principio de buena
programacin:meterlassentenciasque"haceneltrabajo"enotrasfuncionesespecficas
para sacarlas de main(), dejando en sta tan slo un guin general de lo que hace el
programa, no las rdenes especficas. De esta manera se facilita la comprensin del
programa,yportantoelfuturotrabajodemodificarlo.
De la misma manera que tenemos que declarar una variable antes de utilizarla, no es
indiferenteelordenenquesesitenlasdiferentesfuncionesenelfichero:lasfunciones
debendeclararseantesdeserllamadas.
Igualmente vemos que, para una funcin void, la sentencia de control return no puede
llamarse como pseudofuncin, porque en dicho caso la funcin void (en nuestro caso
holamundo())devolveraunvalor,cosaquesudefinicinnopermite.
Las funciones tambin permiten recibir tipos de datos, as pues las funciones nos sirven
para hacer de un gran problema pequeas partes de un problema o sea dividir un gran
problemaendiferentesproblemasmspequeos.Asquelasfuncionestambinpueden
retornaruntipodedatoquehemosdefinidodentrodelamisma.
97
AlgoritmoyEstructuradeDatosI
Asquesidefinimosunafuncinparasumardosnmerosseriadelasiguientemanera:
/*
*suma.c
*
*JulioCalderonBramo<bramo@gmail.com>2009
*
*paraellibro"ProgramacinenC"
*adaptadodelDominioPblico
*/
#include<stdio.h>
intsumar(intnumero1,intnumero2);/*prototipodelafuncin*/
intmain(void)
{
intsuma;/*definimosunavariable*/
suma=sumar(5,3);
/*lavariableobtieneelvalorretornadodesumar
*puedeversequeentrelosparntesissemandanlosvalores
*delosnmerosquesedeseansumarenestecaso5y3
*puedenhabersedeclaradosestosdosnmerosenotrasvariables
*intdato=4,valor=3;
*suma=sumar(dato,valor);
*/
/*imprimimoslasumadelosdosnmeros*/
printf("Lasumaes:%d",suma);
return0;
}
intsumar(intnumero1,intnumero2)
{
intretsuma;/*creamoslavariablearetornar*/
retsuma=numero1+numero2;/*asignamosesavarialasumadenmero1y2*/
returnretsuma;/*retornamoslasumadelosnmeros*/
}
98
AlgoritmoyEstructuradeDatosI
CAPTULOVI
Recursividad
6.1 Recursividad:
La recursividad es una tcnica de programacin importante. Se utiliza para realizar una
llamadaaunafuncindesdelamismafuncin.Comoejemplotilsepuedepresentarel
clculo de nmeros factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de
nmerosmayoressecalculanmediantelamultiplicacinde1*2*...,incrementandoel
nmerode1en1hastallegaralnmeroparaelqueseestcalculandoelfactorial.
Elsiguienteprrafomuestraunafuncin,expresadaconpalabras,quecalculaunfactorial.
"Sielnmeroesmenorquecero,serechaza.Sinoesunentero,seredondeaalsiguiente
entero. Si el nmero es cero, su factorial es uno. Si el nmero es mayor que cero, se
multiplicaporlfactorialdelnmeromenorinmediato."
Para calcular el factorial de cualquier nmero mayor que cero hay que calcular como
mnimo el factorial de otro nmero. La funcin que se utiliza es la funcin en la que se
encuentra en estos momentos, esta funcin debe llamarse a s misma para el nmero
menor inmediato, para poder ejecutarse en el nmero actual. Esto es un ejemplo de
recursividad.
Larecursividadylaiteracin(ejecucinenbucle)estnmuyrelacionadas,cualquieraccin
que pueda realizarse con la recursividad puede realizarse con iteracin y viceversa.
Normalmente,unclculodeterminadoseprestaraunatcnicauotra,slonecesitaelegir
elenfoquemsnaturaloconelquesesientamscmodo.
Claramente,estatcnicapuedeconstituirunmododemeterseenproblemas.Esfcilcrear
unafuncinrecursivaquenollegueadevolvernuncaunresultadodefinitivoynopueda
llegaraunpuntodefinalizacin.Estetipoderecursividadhacequeelsistemaejecutelo
queseconocecomobucle"infinito".
0,1,1,2,3,5,8,13,21,34,...,
99
AlgoritmoyEstructuradeDatosI
Cadaelementoenestasecuenciaeslasumadelosprecedentes(porejemplo0+1=0,1+
1=2,1+2=3,2+3=5,...)seanfib(0)=0,fib(1)=1yassucesivamente,entoncespuede
definirse la secuencia de Fibonacci mediante la definicin recursiva (define un objeto en
trminosdeuncasomssimpledesmismo):
fib(n)=nifn==0orn==1
fib(n)=fib(n2)+fib(n1)ifn>=2
Porejemplo,paracalcularfib(6),puedeaplicarseladefinicindemanerarecursivapara
obtener:
Fib(6)=fib(4)+fib(5)=fib(2)+fib(3)+fib(5)=fib(0)+fib(1)+fib(3)+fib(5)=0+1fib
(3)+fib(5)
1.+fib(1)+fib(2)+fib(5)=
1.+1+fib(0)+fib(1)+fib(5)=
2.+0+1+fib(5)=3+fib(3)+fib(4)=
3.+fib(1)+fib(2)+fib(4)=
3+1+fib(0)+fib(1)+fib(4)=
4.+0+1+fib(2)+fib(3)=5+fib(0)+fib(1)+fib(3)=
5.+0+1+fib(1)+fib(2)=6+1+fib(0)+fib(1)=
6.+0+1=8
100
AlgoritmoyEstructuradeDatosI
redundancia de clculo. En ejemplo anterior, fib(3) se calcula tres veces por separado.
Sera mucho ms eficiente "recordar" el valor de fib(3) la primera vez que se calcula y
volver a usarlo cada vez que se necesite. Es mucho ms eficiente un mtodo iterativo
comoelquesiguepararcalcularfib(n).
If(n<=1)
return(n);
lofib=0;
hifib=1;
for(i=2;i<=n;i++)
x=lofib;
lofib=hifib;
hifib=x+lofib;
}/*findelfor*/
return(hifib);
Hasta el momento, las nicas funciones que hemos estudiado han sido llamadas desde
otrafuncin;peroesposiblecrearfuncionesquepuedanllamarseasmismas,estasson
llamadas:funcionesrecursivas.
Una funcin puede ser recursiva tanto de forma directa (si es llamada a s misma) o de
formaindirecta(sillamaaunafuncinqueluegolallama).
101
AlgoritmoyEstructuradeDatosI
Paraqueestonosucedaunafuncinrecursivadebesermuybienpensada.Principalmente
una funcin recursiva debe saber resolver el caso ms simple, llamado caso base. Si la
funcin es llamada con el caso base, inmediatamente retorna el resultado (no necesita
volverallamarseasmismaparapoderresolverlo).
Compreseelnumerodeadiciones(sinincluirlosincrementosdelavariablendice,i)que
seejecutanparacalcularfib(6)medianteestealgoritmoalusarladefinicinrecursiva.En
elcasodelafuncinfactorial,tienenqueejecutarseelmismonmerodemultiplicaciones
paracalcular n! Mediante ambosmtodos:recursivo eiterativo. Lomismoocurreconel
nmerodesumasenlosdosmtodosalcalcularlamultiplicacin.Sinembargo,enelcaso
delosnmerosdeFibonacci,elmtodorecursivoesmuchomscostosoqueeliterativo.
Paradefinirunafuncinenformarecursivaesnecesarioespecificar:
Caso(s)base:Dondelarecursividadsedetiene
intfactorial(intn){
if((n==0)||(n==1))
return(1);
else
return(n*factorial(n1));
}
intfactorial(intn){
inti,fact=1;
for(i=2;i<=n;i++)
fact=fact*i;
return(fact);
}
Sinembargo,losalgoritmositerativostienenunaventajaencuantoalusodememoria,si
se comparan con los iterativos. La recursividad requiere que se guarde el estado de la
ejecucinantesdecadallamadorecursivo,implicandoungastoconsiderabledememoria.
102
AlgoritmoyEstructuradeDatosI
Es probable que, por esta razn, las versiones recursivas tengan mayores limitaciones al
ejecutarseenuncomputador.
Ejemplo:
/*************************************************************************
**
*Ejemplo:Obtencindelmximoenunvectordenmeros(recursivamente).
**************************************************************************
*/
/*Definicindeltamaomximodelvector*/
#defineTAMANO_VECTOR100
/*************************************************************************
**
*Funcinrecursivaqueobtieneelmximoenunvectordenmerosenteros.
*Recibecomoargumentoelvectorquecontienelosnmerosyelnmero
*deposicionesdelvectorqueestnsiendoutilizadas.Lafuncin
*retornaelvalordelmximoelementodentrodelvector.
**************************************************************************
*/
intMaximo(intvector[],intn){
intmax,maxResto;
if(n==1)/*Casobase*/
max=vector[0];
else{
maxResto=Maximo(vector+1,n1);/*Maximodelrestodelvector*/
if(vector[0]>maxResto)
max=vector[0];
else
max=maxResto;
}
return(max);
}
103
AlgoritmoyEstructuradeDatosI
/*************************************************************************
**
*Programadeprueba:Leelosvaloresdelvectorydespliegaelmaximo
**************************************************************************
*/
main(){
inti;
intn=0;
intvec[TAMANO_VECTOR];
/*Garantizaqueelusuarioingresaunnumerodeelementos>0*/
while(n<1){
printf("Ingreseelnumerodeelementos:");
scanf("%d",&n);
}
/*Leeloselementosdelvector*/
for(i=0;i<n;i++){
printf("\tElemento[%d]:",i);
scanf("%d",&vec[i]);
}
/*Calculaelmaximoalavezquedespliegaelresultado*/
printf("\nMaximo:%d\n",Maximo(vec,n));
}
/*************************************************************************
**
*Ejemplo:Calculoiterativodelnesimoterminodefibonacci
*Pordefinicin:
*Fibonacci(0)=0
*Fibonacci(1)=1
*Fibonacci(n)=Fibonacci(n1)+Fibonacci(n2)
**************************************************************************
*/
/*************************************************************************
**
*Funcinquecalculaiterativamenteelnesimoterminodefibonacci
104
AlgoritmoyEstructuradeDatosI
**************************************************************************
*/
doubleFibonacci(intn){
inti;
doubleFibi,Fibn1,Fibn2;
switch(n){
case0:return0;
case1:return1;
default:
Fibn2=0;/*Fibonacci(n2)*/
Fibn1=1;/*Fibonacci(n1)*/
for(i=2;i<=n;i++){
Fibi=Fibn1+Fibn2;
Fibn2=Fibn1;
Fibn1=Fibi;
}
returnFibi;
}
}
/*************************************************************************
**
*Programaquecalcula,deformaiterativa,elterminonesimodela
*sucesindefibonacci,paraunvalorndadoporelusuario.
**************************************************************************
*/
main(){
intn;
/*Sesolicitaalusuarioelvalorden*/
printf("Ingreseelvalorden:");
scanf("%d",&n);/*scanfrequierepuntero:&*/
/*Imprimeelfibonacciden*/
printf("Eltermino%ddeFibonaccies:%.0lf\n",n,Fibonacci(n));
}
105
AlgoritmoyEstructuradeDatosI
/*************************************************************************
**
*Ejemplo:Obtencindelmaximoenunvectordenmeros(recursivamente).
**************************************************************************
*/
/*Definicindeltamaomximodelvector*/
#defineTAMANO_VECTOR100
/*************************************************************************
**
*Funcinrecursivaqueobtieneelmaximoenunvectordenmerosenteros.
*Recibecomoargumentoelvectorquecontienelosnmerosyelnmero
*deposicionesdelvectorqueestansiendoutilizadas.Lafuncin
*retornaelvalordelmaximoelementodentrodelvector.
**************************************************************************
*/
intMaximo(intvector[],intn){
intmax,maxResto;
if(n==1)/*Casobase*/
max=vector[0];
else{
maxResto=Maximo(vector+1,n1);/*Maximodelrestodelvector*/
if(vector[0]>maxResto)
max=vector[0];
else
max=maxResto;
}
return(max);
}
/*************************************************************************
**
*Programadeprueba:Leelosvaloresdelvectorydespliegaelmaximo
**************************************************************************
*/
main(){
106
AlgoritmoyEstructuradeDatosI
inti;
intn=0;
intvec[TAMANO_VECTOR];
/*Garantizaqueelusuarioingresaunnumerodeelementos>0*/
while(n<1){
printf("Ingreseelnumerodeelementos:");
scanf("%d",&n);
}
/*Leeloselementosdelvector*/
for(i=0;i<n;i++){
printf("\tElemento[%d]:",i);
scanf("%d",&vec[i]);
}
/*Calculaelmaximoalavezquedespliegaelresultado*/
printf("\nMaximo:%d\n",Maximo(vec,n));
}
6.2 Prototiposdefunciones
Antes de usar una funcin C debe tener conocimiento acerca del tipo de dato que
regresaryeltipodelosparmetrosquelafuncinespera.
ElestndarANSIdeCintrodujounanueva(mejor)formadehacerloanteriorrespectoa
lasversionespreviasdeC.
Laimportanciadeusarprototiposdefuncioneseslasiguiente:
Sehaceelcdigomsestructuradoyporlotanto,msfcildeleer.
SepermitealcompiladordeCrevisarlasintaxisdelasfuncionesllamadas.
Loanterioreshecho,dependiendodelalcancedelafuncin.Bsicamentesiunafuncin
hasidodefinidaantesdequeseausada(ollamada),entoncessepuedeusarlafuncinsin
problemas.
Sinoesas,entonceslafuncinsedebedeclarar.Ladeclaracinsimplementemanejael
tipodedatoquelafuncinregresayeltipodeparmetrosusadosporlafuncin.
Esunaprcticausualyconvenienteescribirelprototipodetodaslasfuncionesalprincipio
delprograma,sinembargoestonoesestrictamentenecesario.
107
AlgoritmoyEstructuradeDatosI
Para declarar un prototipo de una funcin se indicar el tipo de dato que regresar la
funcin,elnombredelafuncinyentreparntesislalistadeltipodelosparmetrosde
acuerdoalordenqueaparecenenladefinicindelafuncin.Porejemplo:
intlongcad(char[]);
Loanteriordeclaraunafuncinllamadalongcadqueregresaunvalorenteroyaceptauna
cadenacomoparmetro.
Ejercicios
Escribirunafuncin``reemplaza'',lacualtomaunacadenacomoparmetro,lereemplaza
todos los espacios de la cadena por un guin bajo, y devuelve el nmero de espacios
reemplazados.Porejemplo:
charcadena[]="Elgatonegro";
n=reemplaza(cadena);
deberdevolver:
cadenaconvertida"El_gato_negro"
n=2
Escribirunprogramaqueleaunalneadetextoenunbuffer(unacadenadecaracteres)
usandolafuncingetsycalculelalongituddelalnea(NOusarlafuncinstrlen).
Modificar el programa anterior para que lea un archivo de texto. El archivo deber
redireccionarsealprograma,debiendomostrarelcontenidodelmismo.Encasodequese
leaunalneaconlongitud0deberterminarelprograma.
6.3 Arreglosunidimensionalesymultidimensionales
Losarreglossonunacoleccindevariablesdelmismotipoquesereferencianutilizandoun
nombre comn. Un arreglo consta de posiciones de memoria contigua. La direccin ms
bajacorrespondealprimerelementoylamsaltaalltimo.Unarreglopuedetenerunao
varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa un
ndice.
Elformatoparadeclararunarreglounidimensionales:
tiponombre_arr[tamao]
Porejemplo,paradeclararunarreglodeenterosllamadolistanumcondiezelementosse
hacedelasiguienteforma:
108
AlgoritmoyEstructuradeDatosI
intlistanum[10];
En C, todos los arreglos usan cero como ndice para el primer elemento. Por tanto, el
ejemplo anterior declara un arreglo de enteros con diez elementos desde listanum[0]
hastalistanum[9].
listanum[2]=15;/*Asigna15al3erelementodelarreglolistanum*/
num=listanum[2];/*Asignaelcontenidodel3erelementoalavariablenum*/
Cpermitearreglosconmsdeunadimensin,elformatogenerales:
tiponombre_arr[tam1][tam2]...[tamN];
Porejemplounarreglodeenterosbidimensionalesseescribircomo:
inttabladenums[50][50];
Observarqueparadeclararcadadimensinllevasuspropiosparntesiscuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo
unidimensional,estoes,
tabladenums[2][3]=15;/*Asigna15alelementodela3filayla4columna*/
num=tabladenums[25][16];
main()
{
intt,i,num[3][4];
109
AlgoritmoyEstructuradeDatosI
for(t=0;t<3;++t)
for(i=0;i<4;++i)
num[t][i]=(t*4)+i*1;
for(t=0;t<3;++t)
{
for(i=0;i<4;++i)
printf("num[%d][%d]=%d",t,i,num[t][i]);
printf("\n");
}
EnCsepermitelainicializacindearreglos,debiendoseguirelsiguienteformato:
tiponombre_arr[tam1][tam2]...[tamN]={listavalores};
Porejemplo:
inti[10]={1,2,3,4,5,6,7,8,9,10};
intnum[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
Un arreglo es un conjunto de variables del mismo tipo que pueden ser referenciadas a
travs de un mismo nombre. La forma de identificar a un elemento determinado es a
travsdeunndice.
Ladeclaracin
int Array[10]; instruye al compilador a que reserve una cantidad de memoria suficiente
paraalmacenar10entidadesenterasyreferirseaesamemoriaatravesdelidentificador
Array. Dado que el nmero de elementos en un arreglo suele ser utilizado en distintos
lugaresdeunprograma,esbuenestilodeprogramacinelreferenciarloatravsdeuna
constantesimblica:
#defineN10
int Array[N]; Los elementos individuales del arreglo se comienza a numerar a partir del
elemento0,asi,Array[0]individualizaalprimerelementoyArray[9]alltimo.
Losarreglospuedensermultidimensionales,asiporejemplo
110
AlgoritmoyEstructuradeDatosI
doubleMatriz[10][20];Defineunaregindememoriacomoparaalmacenar200realesen
doble precisin. La forma en que se organizan en la memoria estos 200 elementos es la
siguiente:
floata[5]={0.1,1.2,2.3,3.4,4.5};
doubleb[100]={1.0};/*los99restantessern0.0*/
inta[]={2,3,5,7};/*equivaleaa[4]={2,3,5,7}*/
Ejemplo:
/*
Utilizacindearreglos.
Programaquecuentacuntasvecesserepitecadadgito,
cadacarcterseparador,yotroscarcteres.
*/
#include<stdio.h>
#defineND10
intmain()
{
intc,i,nWhite=0,nOther=0,nDigit[ND];
for(i=0;i<ND;i++)
nDigit[i]=0;
while((c=getchar())!=EOF)
if(c>='0'&&c<='9')
nDigit[c'0']++;
else
if(c==''||c=='\n'||c=='\t')
nWhite++;
else
nOther++;
for(i=0;i<ND;i++)
printf("Dgito%d:%d\n",i,nDigit[i]);
printf("Caracteresseparadores:%d\n",nWhite);
111
AlgoritmoyEstructuradeDatosI
printf("Otroscaracteres:%d\n",nOther);
return0;
}
Compileycorraelsiguienteprogramayexpliqueloqueocurre:
#include<stdio.h>
intmain(){
inta[4]={0,1,2,3};
intb[4]={4,5,6,7};
inti;
for(i=0;i<8;i++)
printf("a[%d]=%d\n",i,a[i]);
return0;
}
Cadenas
Adiferenciadeotroslenguajesdeprogramacinqueempleanuntipodenominadocadena
stringparamanipularunconjuntodesimbolos,enC,sedebesimularmedianteunarreglo
decaracteres,endondelaterminacindelacadenasedebeindicarconnulo.Unnulose
especificacomo'\0'.Porloanterior,cuandosedeclareunarreglodecaracteressedebe
consideraruncarcteradicionalalacadenamslargaquesevayaaguardar.Porejemplo,
sisequieredeclararunarreglocadenaqueguardeunacadenadediezcaracteres,sehar
como:
charcadena[11];
charnombre_arr[tam]="cadena";
Porejemplo,elsiguientefragmentoinicializacadenacon``hola'':
charcadena[5]="hola";
Elcdigoanterioresequivalentea:
charcadena[5]={'h','o','l','a','\0'};
112
AlgoritmoyEstructuradeDatosI
Paraasignarlaentradaestndaraunacadenasepuedeusarlafuncinscanfconlaopcin
%s(observarquenoserequiereusareloperador&),deigualformaparamostrarloenla
salidaestndar.
Porejemplo:
main()
{
charnombre[15],apellidos[30];
printf("Introducetunombre:");
scanf("%s",nombre);
printf("Introducetusapellidos:");
scanf("%s",apellidos);
printf("Ustedes%s%s\n",nombre,apellidos);
}
EllenguajeCnomanejacadenasdecaracteres,comosehaceconenterosoflotantes,por
loquelosiguientenoesvlido:
main()
{
charnombre[40],apellidos[40],completo[80];
nombre="JosMara";/*Ilegal*/
apellidos="MorelosyPavn";/*Ilegal*/
completo="Gral."+nombre+appellidos;/*Ilegal*/
}
113
AlgoritmoyEstructuradeDatosI
114
AlgoritmoyEstructuradeDatosI
CAPTULOVII
Aplicaciones
Ejercicio1:
/*Ejemplo1
ElprimerprogramaenC*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain(void)
{
printf("BienvenidoaC!\n");
return0;/*indicaqueelprogramaterminconexito*/
}/*findelafuncinmain*/
Ejercicio2:
/*Ejemplo2
Impresindeunalneamediantedosinstruccionesprintf*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
printf("Bienvenido");
printf("aC!\n");
return0;/*indicaqueelprogramaterminconxito*/
}/*findelafuncinmain*/
115
AlgoritmoyEstructuradeDatosI
Ejercicio3:
/*Ejemplo3.c
Impresindemltipleslneasmedianteunasolainstruccinprintf*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
printf("Bienvenido\na\nC!\n");
return0;/*indicaqueelprogramaterminconxito*/
}/*findelafuncinmain*/
Ejercicio4:
/*Ejercicio4.c
Programadesuma*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
intentero1;/*primernmerointroducidoporelusuario*/
intentero2;/*segundonmerointroducidoporelusuario*/
intsuma;/*variableenlacualsealmacenalasuma*/
printf("Introduzcaelprimerentero\n");/*indicador*/
scanf("%d",&entero1);/*leeunentero*/
printf("Introduzcaelsegundoentero\n");/*indicador*/
scanf("%d",&entero2);/*leeunentero*/
suma=entero1+entero2;/*asignaeltotalasuma*/
printf("Lasumaes%d\n",suma);/*imprimelasuma*/
return0;/*indicaqueelprogramaterminconxito*/
}/*findelafuncinmain*/
116
AlgoritmoyEstructuradeDatosI
Ejercicio5:
/*Ejercicio5.c
Usodeinstruccionesif,operadoresde
relacin,yoperadoresdeigualdad*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
main()
{
intnum1;/*primernmeroqueleeelusuario*/
intnum2;/*segundonmeroqueleeelusuario*/
printf("Introduzcadosenteros,yledire\n");
printf("lasrelacionesquesatisfacen:");
scanf("%d%d",&num1,&num2);/*lecturadelosenteros*/
if(num1==num2){
printf("%desigualque%d\n",num1,num2);
}/*findeif*/
if(num1!=num2){
printf("%dnoesigualque%d\n",num1,num2);
}/*findeif*/
if(num1<num2){
printf("%desmenorque%d\n",num1,num2);
}/*findeif*/
if(num1>num2){
printf("%desmayorque%d\n",num1,num2);
}/*findeif*/
if(num1<=num2){
printf("%desmenoroigualque%d\n",num1,num2);
}/*endif*/
if(num1>=num2){
printf("%desmayoroigualque%d\n",num1,num2);
}/*findeif*/
return0;/*indicaqueelprogramaterminconxito*/
}/*findelafuncinmain*/
117
AlgoritmoyEstructuradeDatosI
Ejercicio6:
/*elevaxalapotenciay*/
#include<stdio.h>
intmain()
{
intx,y,i,potencia;/*definicindelasvariables*/
i=1;
potencia=1;/*inicializalapotencia*/
scanf("%d",&x);/*lecturadexdelusuario*/
scanf("%d",&y);/*lecturadeydelusuario*/
while(i<=y){/*repetirelciclowhilemientrasiseamenoroigualay*/
potencia*=x;/*multiplicapotenciaporx*/
++i;/*incrementai*/
}/*findelwhile*/
printf("%d\n",potencia);/*despliegalapotencia*/
return0;
}/*findelafuncinmain*/
Ejercicio7:
#include<stdio.h>
intmain()
{
intx=1,total=0,y;
while(x<=10){
y=x*x;
printf("%d\n",y);
total+=y;
++x;
}
printf("Eltotales:%d\n",total);
return0;
}
118
AlgoritmoyEstructuradeDatosI
Ejercicio8:
/*Ejemplo8.c
Programa para obtener el promedio de calificaciones de una clase mediante una
repeticincontroladaporcontador*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
intcontador;/*nmerodelacalificacinsiguiente*/
intcalificacin;/*valordelacalificacin*/
inttotal;/*sumadelascalificacionesintroducidasporelusuario*/
intpromedio;/*promediodelascalificaciones*/
/*fasedeinicializacin*/
total=0;/*inicializatotal*/
contador=1;/*inicializaelcontadordelciclo*/
/*fasedeproceso*/
while(contador<=10){/*repite10veceselciclo*/
printf("Introduzcalacalificacin:");/*indicadorparalaentrada*/
scanf("%d",&calificacin);/*leelacalificacindelusuario*/
total=total+calificacin;/*sumalacalificacinaltotal*/
contador=contador+1;/*incrementaelcontador*/
}/*findewhile*/
/*fasedeterminacin*/
promedio=total/10;/*divisinentera*/
printf("Elpromediodelaclasees%d\n",promedio);/*despliegaelresultado*/
return0;/*indicaqueelprogramaterminconexito*/
}/*findelafuncinmain*/
119
AlgoritmoyEstructuradeDatosI
Ejercicio9:
main()
{
floatcm,pul,valor;
charunidad;
printf(Introducenmeroyunidad(p=pulg.oc=cm:);
scanf(%f%c,&valor,&unidad);
if(unidad==p)
{
cm=valor*2.54;
printf(Las%fpulgadasson%fcentmetros\n,valor,cm);
}
if(unidad==c)
{
pul=valor/2.54;
printf(Los%fcentmetrosson%fpulgadas\n,valor,pul);
}
if(unidad!=p&&unidad!=c)
printf(Noestpuestacorrectamentelaunidad\n);
}
Ejercicio10:
/*Ejemplo10.c
Programa para obtener el promedio de calificaciones de una clase mediante una
repeticincontroladaporcentinela*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
intcontador;/*nmerodecalificacionesintroducidas*/
intcalificacin;/*valordelacalificacin*/
inttotal;/*sumadelascalificaciones*/
floatpromedio;/*nmeroconpuntodecimalparaelpromedio*/
/*fasedeinicializacin*/
total=0;/*inicializaeltotal*/
contador=0;/*inicializaelcontadordelciclo*/
/*fasedeproceso*/
120
AlgoritmoyEstructuradeDatosI
/*obtienelaprimeracalificacindelusuario*/
printf("Introduzcalacalificacin,1paraterminar:");/*indicadorparalaentrada
*/
scanf("%d",&calificacin);/*leelacalificacindelusuario*/
/*realizaelciclomientrasnoseintroduzcaelvalorcentinela*/
while(calificacin!=1){
total=total+calificacin;/*sumacalificacinatotal*/
contador=contador+1;/*incrementaelcontador*/
/*obtienelasiguientecalificacindelusuario*/
printf("Introduzcalacalificacin,1paraterminar:");/*indicadorparalaentrada
*/
scanf("%d",&calificacin);/*leelasiguientecalificacin*/
}/*findewhile*/
/*fasedeterminacin*/
/*sielusuariointroducealmenosunacalificacin*/
if(contador!=0){
/*calculaelpromediodetodaslascalificacionesintroducidas*/
promedio=(float)total/contador;/*evitalatruncacin*/
/*despliegaelpromediocondosdgitosdeprecisin*/
printf("Elpromediodelaclasees:%.2f\n",promedio);
}/*findeif*/
else{/*sinoseintroducecalificacinalguna,despliegaelmensaje*/
printf("Noseintrodujeroncalificaciones\n");
}/*findeelse*/
return0;/*indicaqueelprogramaterminconexito*/
}/*findelafuncinmain*/
Ejercicio11:
/*Ejemplo11.c
Anlisisdelosresultadosdeunexamen*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
121
AlgoritmoyEstructuradeDatosI
/*inicializalasvariablesenlasdefiniciones*/
intaprobados=0;/*nmerodeaprobados*/
intreprobados=0;/*nmerodereprobados*/
intestudiante=1;/*contadordeestudiantes*/
intresultado;/*resultadodeunexamen*/
/*indicaalusuariolaintroduccindelvalordelusuario*/
printf("Introduzcaelresultado(1=aprobado,2=reprobado):");
scanf("%d",&resultado);
/*sielresultadoesiguala1,incrementaaprobados*/
if(resultado==1){
aprobados=aprobados+1;
}/*findeif*/
else{/*delocontrario,incrementareprobados*/
reprobados=reprobados+1;
}/*findeelse*/
estudiante=estudiante+1;/*incrementaelcontadordeestudiante*/
}/*findewhile*/
/*fasedeterminacin;despliegaelnmerodeaprobadosyreprobados*/
printf("Aprobados%d\n",aprobados);
printf("Reprobados%d\n",reprobados);
/*siaprobaronmsdeochoestudiantes,imprime"objetivoalcanzado"*/
if(aprobados>8){
printf("Objetivoalcanzado\n");
}/*findeif*/
return0;/*indicaqueelprogramaterminconexito*/
}/*findelafuncinmain*/
122
AlgoritmoyEstructuradeDatosI
Ejercicio12:
/*Ejemplo12.c
Preincremenoypostincremento*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
intc;/*definelavariable*/
/*demuestraelpostincremento*/
c=5;/*leasigna5ac*/
printf("%d\n",c);/*imprime5*/
printf("%d\n",c++);/*imprime5yhaceelpostincremento*/
printf("%d\n\n",c);/*imprime6*/
/*demuestraelpreincremento*/
c=5;/*leasigna5ac*/
printf("%d\n",c);/*imprime5*/
printf("%d\n",++c);/*preincrementaeimprime6*/
printf("%d\n",c);/*imprime6*/
return0;/*indicaqueelprogramaterminconexito*/
}/*findelafuncinmain*/
Ejercicio13:
/*Ejemplo13.c
Repeticincontroladaporcontador*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intcontador=1;/*inicializacin*/
while(contador<=10){/*condicinderepeticin*/
printf("%d\n",contador);/*despliegaelcontador*/
contador++;/*incremento*/
}/*findelwhile*/
123
AlgoritmoyEstructuradeDatosI
return0;/*indicaterminacinexitosa*/
}/*findelafuncinmain*/
Ejercicio14:
/*Ejemplo14.c
Repeticincontroladaporcontadormediantelainstruccinfor*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intcontador;/*definicindelcontador*/
/*lainicializacin,condicinderepeticin,eincremento
seincluyenenelencabezadodelainstruccinfor.*/
for(contador=1;contador<=10;contador++){
printf("%d\n",contador);
}/*findelfor*/
return0;/*indicaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
Ejercicio15:
/*Ejemplo15.c
Sumaconfor*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intsuma=0;/*inicializalasuma*/
intnumero;/*nmeroaadicionarasuma*/
for(numero=2;numero<=100;numero+=2){
suma+=numero;/*sumaelnmeroasuma*/
}/*findefor*/
124
AlgoritmoyEstructuradeDatosI
printf("Lasumaes%d\n",suma);/*muestralasuma*/
return0;/*indicaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
Ejercicio16:
/*Ejemplo16.c
Clculodelinterscompuesto*/
#include<stdio.h>
#include<math.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
doublemonto;/*montodeldepsito*/
doubleprincipal=1000.0;/*montoprincipal*/
doubletasa=.05;/*interscompuestoanual*/
intanio;/*contadordeaos*/
/*muestraelencabezadodesalidadelatabla*/
printf("%4s%21s\n","Anio","Montodeldeposito");
/*calculaelmontodeldepsitoparacadaunodelosdiezaos*/
for(anio=1;anio<=10;anio++){
/*calculaelnuevomontoparaelaoespecificado*/
monto=principal*pow(1.0+tasa,anio);
/*muestraunalneadelatabla*/
printf("%4d%21.2f\n",anio,monto);
}/*findefor*/
return0;/*indicaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
125
AlgoritmoyEstructuradeDatosI
Ejercicio17:
/*Ejemplo17.c
Cuentalascalificacionesconletras*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intcalificacin;/*unacalificacin*/
intcuentaA=0;/*nmerodeAs*/
intcuentaB=0;/*nmerodeBs*/
intcuentaC=0;/*nmerodeCs*/
intcuentaD=0;/*nmerodeDs*/
intcuentaF=0;/*nmerodeEs*/
printf("Introduzcalaletradelacalificacin.\n");
printf("IntroduzcaelcaracterEOFparafinalizarlaentradadedatos.\n");
/*repitehastaqueelusuariodigitalasecuenciadeteclasdefindearchivo*/
while((calificacin=getchar())!=EOF){
/*determinacualcalificacinseintrodujo*/
switch(calificacin){/*switchanidadodentrodelwhile*/
case'A':/*lacalificacinesA*/
case'a':/*oa*/
++cuentaA;/*incrementacuentaA*/
break;/*necesarioparasalirdeswitch*/
case'B':/*lacalificacinesB*/
case'b':/*ob*/
++cuentaB;/*incrementacuentaB*/
break;/*saledeswitch*/
case'C':/*lacalificacinesC*/
case'c':/*oc*/
++cuentaC;/*incrementacuentaC*/
break;/*saledeswitch*/
case'D':/*lacalificacinesD*/
case'd':/*od*/
++cuentaD;/*incrementacuentaD*/
126
AlgoritmoyEstructuradeDatosI
break;/*saledeswitch*/
case'F':/*lacalificacinesF*/
case'f':/*of*/
++cuentaF;/*incrementacuentaF*/
break;/*saledeswitch*/
case'\n':/*ignoranuevaslneas,*/
case'\t':/*tabuladores,*/
case'':/*yespaciosenlaentrada*/
break;/*findeswitch*/
default:/*atrapatodoslosdemscaracteres*/
printf("Introdujounaletraincorrecta.");
printf("Introduzcaunanuevacalificacin.\n");
break;/*opcional;detodasmanerassaldrdelswitch*/
}/*findeswitch*/
}/*findewhile*/
/*muestraelresumendelosresultados*/
printf("\nLostotalesporcalificacinson:\n");
printf("A:%d\n",cuentaA);/*despliegaelnmerodecalificacionesA*/
printf("B:%d\n",cuentaB);/*despliegaelnmerodecalificacionesB*/
printf("C:%d\n",cuentaC);/*despliegaelnmerodecalificacionesC*/
printf("D:%d\n",cuentaD);/*despliegaelnmerodecalificacionesD*/
printf("F:%d\n",cuentaF);/*despliegaelnmerodecalificacionesF*/
return0;/*indicaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
Ejercicio18:
/*Ejemplo18.c
Usodelainstruccinderepeticindo/while*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intcontador=1;/*inicializaelcontador*/
127
AlgoritmoyEstructuradeDatosI
do{
printf("%d",contador);/*despliegaelcontador*/
}while(++contador<=10);/*findeldo...while*/
return0;/*indicalaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
Ejercicio19:
/*Ejemplo19.c
Usodelainstruccinbreakdentrodelainstruccinfor*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intx;/*contador*/
/*repite10veceselciclo*/
for(x=1;x<=10;x++){
/*sixes5,terminaelciclo*/
if(x==5){
break;/*rompeelcicloslosixes5*/
}/*findeif*/
printf("%d",x);/*despliegaelvalordex*/
}/*findefor*/
printf("\nRompeelcicloenx==%d\n",x);
return0;/*indicalaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
128
AlgoritmoyEstructuradeDatosI
Ejercicio20:
/*Ejemplo20.c
Usodelainstruccincontinuedentrodeunainstruccinfor*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intx;/*contador*/
/*repiteelciclo10veces*/
for(x=1;x<=10;x++){
/*sixes5,continuaconlasiguienteiteracindelciclo*/
if(x==5){
continue;/*ignoraelrestodelcdigoenelcuerpodelciclo*/
}/*findeif*/
printf("%d",x);/*despliegaelvalordex*/
}/*findefor*/
printf("\nUtilizacontinueparaignorarlaimpresindelvalor5\n");
return0;/*indicalaterminacinexitosadelprograma*/
}/*findelafuncinmain*/
Ejercicio21:
/*Ejemplo21.c*/
/*Verificacindelasfuncionesmatemticasdelabiblioteca*/
#include<stdio.h>
#include<math.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
/*calculaydespliegalaraizcuadrada*/
printf("sqrt(%.1f)=%.1f\n",900.0,sqrt(900.0));
printf("sqrt(%.1f)=%.1f\n",9.0,sqrt(9.0));
129
AlgoritmoyEstructuradeDatosI
/*calculaydespliegalafuncinexponencialealax*/
printf("exp(%.1f)=%f\n",1.0,exp(1.0));
printf("exp(%.1f)=%f\n",2.0,exp(2.0));
/*calculaydespliegaellogaritmothelogorithm(basee)*/
printf("log(%f)=%.1f\n",2.718282,log(2.718282));
printf("log(%f)=%.1f\n",7.389056,log(7.389056));
/*calculaydespliegaellogaritmo(base10)*/
printf("log10(%.1f)=%.1f\n",1.0,log10(1.0));
printf("log10(%.1f)=%.1f\n",10.0,log10(10.0));
printf("log10(%.1f)=%.1f\n",100.0,log10(100.0));
/*calculaydespliegaelvalorabsoluto*/
printf("fabs(%.1f)=%.1f\n",13.5,fabs(13.5));
printf("fabs(%.1f)=%.1f\n",0.0,fabs(0.0));
printf("fabs(%.1f)=%.1f\n",13.5,fabs(13.5));
/*calculaydespliegaceil(x)*/
printf("ceil(%.1f)=%.1f\n",9.2,ceil(9.2));
printf("ceil(%.1f)=%.1f\n",9.8,ceil(9.8));
/*calculaydespliegafloor(x)*/
printf("floor(%.1f)=%.1f\n",9.2,floor(9.2));
printf("floor(%.1f)=%.1f\n",9.8,floor(9.8));
/*calculaydespliegapow(x,y)*/
printf("pow(%.1f,%.1f)=%.1f\n",2.0,7.0,pow(2.0,7.0));
printf("pow(%.1f,%.1f)=%.1f\n",9.0,0.5,pow(9.0,0.5));
/*calculaydespliegafmod(x,y)*/
printf("fmod(%.3f/%.3f)=%.3f\n",13.675,2.333,
fmod(13.675,2.333));
/*calculaydespliegasin(x)*/
printf("sin(%.1f)=%.1f\n",0.0,sin(0.0));
/*calculaydespliegacos(x)*/
printf("cos(%.1f)=%.1f\n",0.0,cos(0.0));
/*calculaydespliegatan(x)*/
printf("tan(%.1f)=%.1f\n",0.0,tan(0.0));
130
AlgoritmoyEstructuradeDatosI
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio22:
/*Ejemplo22.c
Creacinyusodeunafuncindefinidaporelusuario*/
#include<stdio.h>
intcuadrado(inty);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intx;/*contador*/
/*repite10veceselcicloycalculaeimprimecadavezelcuadradodex*/
for(x=1;x<=10;x++){
printf("%d",cuadrado(x));/*llamadaalafuncin*/
}/*findefor*/
printf("\n");
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*definicindelafuncincuadrado,devuelveelcuadradodelparmetro*/
intcuadrado(inty)/*yesunacopiadelargumentoparalafuncin*/
{
returny*y;/*devuelveelcuadradodeycomounint*/
}/*findelafuncincuadrado*/
131
AlgoritmoyEstructuradeDatosI
Ejercicio23:
/*Ejemplo23.c
Encuentraelmximodetresenteros*/
#include<stdio.h>
intmaximo(intx,inty,intz);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intnumero1;/*primerentero*/
intnumero2;/*segundoentero*/
intnumero3;/*tercerentero*/
printf("Introduzcatresenteros:");
scanf("%d%d%d",&numero1,&numero2,&numero3);
/*numero1,numero2ynumero3sonargumento
paralallamadaalafuncinmaximo*/
printf("Elmaximoes:%d\n",maximo(numero1,numero2,numero3));
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*Definicindelafuncinmximo*/
/*x,y,yzsonparmetros*/
intmaximo(intx,inty,intz)
{
intmax=x;/*asumequexeselmayor*/
if(y>max){/*siyesmayorquemax,asignayamax*/
max=y;
}/*findeif*/
if(z>max){/*sizesmayorquemax,asignazamax*/
max=z;
}/*findeif*/
returnmax;/*maxeselvalormsgrande*/
}/*findelafuncinmximo*/
132
AlgoritmoyEstructuradeDatosI
Ejercicio24:
/*Ejemplo24.c
Escalaycambiodeenterosproducidospor1+rand()%6.*/
#include<stdio.h>
#include<stdlib.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inti;/*contador*/
/*repite20veces*/
for(i=1;i<=20;i++){
/*obtieneunnmeroaleatorioentre1y6ylodespliega*/
printf("%10d",1+(rand()%6));
/*sielcontadoresdivisibleentre5,comienzaunanuevalneadesalida*/
if(i%5==0){
printf("\n");
}/*findeif*/
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio25:
/*Ejemplo25.c
Tirodeundadodeseislados6000veces*/
#include<stdio.h>
#include<stdlib.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intfrecuencia1=0;/*contadordeltiro1*/
intfrecuencia2=0;/*contadordeltiro2*/
intfrecuencia3=0;/*contadordeltiro3*/
133
AlgoritmoyEstructuradeDatosI
intfrecuencia4=0;/*contadordeltiro4*/
intfrecuencia5=0;/*contadordeltiro5*/
intfrecuencia6=0;/*contadordeltiro6*/
inttiro;/*contadordetiros,valoresde1a6000*/
intcara;/*representauntirodeldado,valoresde1a6*/
/*repite6000vecesyresumelosresultados*/
for(tiro=1;tiro<=6000;tiro++){
cara=1+rand()%6;/*nmeroaleatoriode1a6*/
/*determinaelvalordelacaraeincrementaelcontadorapropiado*/
switch(cara){
case1:/*tiro1*/
++frecuencia1;
break;
case2:/*tiro2*/
++frecuencia2;
break;
case3:/*tiro3*/
++frecuencia3;
break;
case4:/*tiro4*/
++frecuencia4;
break;
case5:/*tiro5*/
++frecuencia5;
break;
case6:/*tiro6*/
++frecuencia6;
break;/*opcional*/
}/*findeswitch*/
}/*findefor*/
/*despliegalosresultadosenformatabular*/
printf("%s%13s\n","Cara","Frecuencia");
134
AlgoritmoyEstructuradeDatosI
printf("1%13d\n",frecuencia1);
printf("2%13d\n",frecuencia2);
printf("3%13d\n",frecuencia3);
printf("4%13d\n",frecuencia4);
printf("5%13d\n",frecuencia5);
printf("6%13d\n",frecuencia6);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio26:
/*Ejemplo26.c
Randomizacindelprogramadedados*/
#include<stdlib.h>
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inti;/*contador*/
unsignedsemilla;/*nmeroqueseutilizaparaestablecerlasemilladelgenerador
denmerosaleatorios*/
printf("Introduzcalasemilla:");
scanf("%u",&semilla);/*observe%uparaununsigned*/
srand(semilla);/*establecelasemilladelgeneradordenmerosaleatorios*/
/*repite10veces*/
for(i=1;i<=10;i++){
/*tomaunnmeroaleatoriode1a6ylomuestra*/
printf("%10d",1+(rand()%6));
/*sicontadoresdivisibleentre5,comienzaunanuevalneadesalida*/
if(i%5==0){
printf("\n");
}/*findeif*/
}/*findefor*/
135
AlgoritmoyEstructuradeDatosI
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio27:
/*Ejemplo27.c
Craps*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>/*contieneelprototipodelafuncintime*/
/*constantesdeenumeracinquerepresentanesestatusdeljuego*/
enumEstatus{CONTINUA,GANA,PIERDE};
inttiraDados(void);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intsuma;/*sumadeltirodedatos*/
intmiPunto;/*puntoganado*/
enumEstatusestatusJuego;/*puedecontenerCONTINUA,GANAoPIERDE*/
suma=tiraDados();/*primertirodelosdados*/
/*determinaelestatusdeljuegobasadoenlasumadelosdados*/
switch(suma){
/*ganaenelprimertiro*/
case7:
case11:
estatusJuego=GANA;
break;
/*pierdeenelprimertiro*/
136
AlgoritmoyEstructuradeDatosI
case2:
case3:
case12:
estatusJuego=PIERDE;
break;
/*recuerdaelpunto*/
default:
estatusJuego=CONTINUA;
miPunto=suma;
printf("Supuntoes%d\n",miPunto);
break;/*opcional*/
}/*findeswitch*/
/*mientraseljuegonosecomplete*/
while(estatusJuego==CONTINUA){
suma=tiraDados();/*tiradenuevolosdados*/
/*determinaelestatusdeljuego*/
if(suma==miPunto){/*ganaporpunto*/
estatusJuego=GANA;/*findeljuego,ganaeljugador*/
}/*findeif*/
else{
if(suma==7){/*pierdealtirar7*/
estatusJuego=PIERDE;/*terminaeljuego,pierdeeljugador*/
}/*findeif*/
}/*findeelse*/
}/*findewhile*/
/*despliegaelmensajedelganadoroperdedor*/
if(estatusJuego==GANA){/*Ganeljugador?*/
printf("Ganaeljugador\n");
}/*findeif*/
else{/*pierdeeljugador*/
printf("Pierdeeljugador\n");
}/*findeelse*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
137
AlgoritmoyEstructuradeDatosI
/*tirodedados,calculalasumaydespliegalosresultados*/
inttiraDados(void)
{
intdado1;/*primerdado*/
intdado2;/*segundodado*/
intsumaTemp;/*sumadelosdados*/
dado1=1+(rand()%6);/*tomaelaleatorioparaeldado1*/
dado2=1+(rand()%6);/*tomaelaleatorioparaeldado2*/
sumaTemp=dado1+dado2;/*sumaeldado1yeldado2*/
/*despliegalosresultadosdeestetiro*/
printf("Eljugadortiro%d+%d=%d\n",dado1,dado2,sumaTemp);
returnsumaTemp;/*devuelvelasumadelosdados*/
}/*findelafuncintiraDados*/
Ejercicio28:
/*Ejemplo28.c
Ejemplodealcance*/
#include<stdio.h>
voidusoLocal(void);/*prototipodefuncin*/
voidusoStaticLocal(void);/*prototipodefuncin*/
voidusoGlobal(void);/*prototipodefuncin*/
intx=1;/*variableglobal*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intx=5;/*variablelocalamain*/
printf("xlocalfueradelalcancedemaines%d\n",x);
{/*comienzaelnuevoalcance*/
intx=7;/*variablelocalconnuevoalcance*/
printf("xlocalenelalcanceinternodemaines%d\n",x);
138
AlgoritmoyEstructuradeDatosI
}/*findenuevoalcance*/
printf("xlocalenelalcanceexternodemaines%d\n",x);
usoLocal();/*usoLocalcontieneaautomaticlocalx*/
usoStaticLocal();/*usoStaticLocalcontieneastaticlocalx*/
usoGlobal();/*usoGlobalutilizaglobalx*/
usoLocal();/*usoLocalreinicializaautomaticlocalx*/
usoStaticLocal();/*staticlocalxretienesuvalorprevio*/
usoGlobal();/*xglobaltambinretienesuvalor*/
printf("\nxlocalenmaines%d\n",x);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*usoLocalreinicializaalavariablelocalxdurantecadallamada*/
voidusoLocal(void)
{
intx=25;/*seinicializacadavezquesellamausoLocal*/
printf("\nxlocalenusoLocales%ddespusdeentrarausoLocal\n",x);
x++;
printf("xlocalenusoLocales%dantesdesalirdeusoLocal\n",x);
}/*findelafuncinusoLocal*/
/*usoStaticLocalinitializalavariablestaticlocalxslolaprimeravez
queseinvocaalafuncin;elvalordexseguardaentrelasllamadasaesta
funcin*/
voidusoStaticLocal(void)
{
/*seinicializaslolaprimeravezqueseinvocausoStaticLocal*/
staticintx=50;
printf("\nlocalstaticxes%dalentrarausoStaticLocal\n",x);
x++;
printf("localstaticxes%dalsalirdeusoStaticLocal\n",x);
}/*findelafuncinusoStaticLocal*/
/*lafuncinusoGlobalmodificalavariableglobalxdurantecadallamada*/
voidusoGlobal(void)
{
139
AlgoritmoyEstructuradeDatosI
printf("\nxglobales%dalentrarausoGlobal\n",x);
x*=10;
printf("xglobales%dalsalirdeusoGlobal\n",x);
}/*findelafuncinusoGlobal*/
Ejercicio29:
/*Ejemplo29.c
Funcinrecursivadelfactorial*/
#include<stdio.h>
longfactorial(longnumero);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inti;/*contador*/
/*repite11veces;durantecadaiteracin,calcula
elfactorial(i)ydespliegaelresultado*/
for(i=0;i<=10;i++){
printf("%2d!=%ld\n",i,factorial(i));
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*definicinrecursivadelafuncinfactorial*/
longfactorial(longnmero)
{
/*casobase*/
if(nmero<=1){
return1;
}/*findeif*/
else{/*pasorecursivo*/
return(numero*factorial(numero1));
}/*findeelse*/
}/*findelafuncinfactorial*/
140
AlgoritmoyEstructuradeDatosI
Ejercicio30:
/*Ejemplo30.c
Funcinrecursivadefibonacci*/
#include<stdio.h>
longfibonacci(longn);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
longresultado;/*valorfibonacci*/
longnumero;/*numeroaintroducirporelusuario*/
/*obtieneunenterodelusuario*/
printf("Introduzcaunentero:");
scanf("%ld",&numero);
/*calculaelvalorfibonaccidelnmerointroducidoporelusuario*/
resultado=fibonacci(numero);
/*despliegaelresultado*/
printf("Fibonacci(%ld)=%ld\n",numero,resultado);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*definicindelafuncinrecursivafibonacci*/
longfibonacci(longn)
{
/*casobase*/
if(n==0||n==1){
returnn;
}/*findeif*/
else{/*pasorecursivo*/
returnfibonacci(n1)+fibonacci(n2);
}/*findeelse*/
}/*findelafuncinfibonacci*/
141
AlgoritmoyEstructuradeDatosI
Ejercicio31:
/*Ejemplo31.c
inicializarunarreglo*/
#include<stdio.h>
/*lafuncinmaininicialaejecucindelprograma*/
intmain()
{
intn[10];/*nesunarreglode10enteros*/
inti;/*contador*/
/*inicializaloselementosna0delarreglo*/
for(i=0;i<10;i++){
n[i]=0;/*estableceelelementoia0*/
}/*findefor*/
printf("%s%13s\n","Elemento","Valor");
/*muestraelcontenidodelarreglonenformatabular*/
for(i=0;i<10;i++){
printf("%7d%13d\n",i,n[i]);
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio32:
/*Ejemplo32.c
Inicializaunarreglomedianteunalistadeinicializacin*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
/*utilizalalistadeinicializacinparainicializarelarreglon*/
intn[10]={32,27,64,18,95,14,90,70,60,37};
inti;/*contador*/
printf("%s%13s\n","Elemento","Valor");
142
AlgoritmoyEstructuradeDatosI
/*muestraelcontenidodelarregloenformatabular*/
for(i=0;i<10;i++){
printf("%7d%13d\n",i,n[i]);
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio33:
/*Ejemplo33.c
Inicializaloselementosdelarreglosa
losenterosparesde2a20*/
#include<stdio.h>
#defineTAMANIO10
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
/*sepuedeutilizarlaconstantesimblicaTAMANIOparaespecificareltamaodel
arreglo*/
ints[TAMANIO];/*elarregloscontiene10elementos*/
intj;/*conntador*/
for(j=0;j<TAMANIO;j++){/*establecelosvalores*/
s[j]=2+2*j;
}/*findefor*/
printf("%s%13s\n","Elemento","Valor");
/*muestraelcontenidodelarreglosenformatabular*/
for(j=0;j<TAMANIO;j++){
printf("%7d%13d\n",j,s[j]);
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
143
AlgoritmoyEstructuradeDatosI
Ejercicio34:
/*Ejemplo34.c
Calculalasumadeloselementosdelarreglo*/
#include<stdio.h>
#defineTAMANIO12
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
/*utilizaunalistadeinicializacinparainicializarelarreglo*/
inta[TAMANIO]={1,3,5,4,7,2,99,16,45,67,89,45};
inti;/*contadorr*/
inttotal=0;/*sumadelarreglo*/
/*sumaelcontenidodelarregloa*/
for(i=0;i<TAMANIO;i++){
total+=a[i];
}/*findefor*/
printf("Eltotaldeloselementosdelarregloes%d\n",total);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio35:
/*Ejemplo35.c
Programaderespuestasdeexamen*/
#include<stdio.h>
#defineTAMANIO_RESPUESTA40/*definelostamaosdelosarreglos*/
#defineTAMANIO_FRECUENCIA11
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intrespuesta;/*contadoratravsdelas40respuestas*/
intrango;/*contadorderangoesde1a10*/
/*inicializaloscontadoresdefrecuanciaa0*/
intfrecuencia[TAMANIO_FRECUENCIA]={0};
144
AlgoritmoyEstructuradeDatosI
/*colocalasrespuestasdelexmendentrodelarreglorespuestas*/
intrespuestas[TAMANIO_RESPUESTA]={1,2,6,4,8,5,9,7,8,10,
1,6,3,8,6,10,3,8,2,7,6,5,7,6,8,6,7,5,6,6,
5,6,7,5,6,4,8,6,8,10};
/*porcadarespuesta,selecionaelvalordeunelementodelarreglorespuestas
yutilizadichovalorcomosubndiceenelarreglofrecuenciapara
determinarelelementoaincrementar*/
for(respuesta=0;respuesta<TAMANIO_RESPUESTA;respuesta++){
++frecuencia[respuestas[respuesta]];
}/*findefor*/
/*despliegalosresultados*/
printf("%s%17s\n","Rango","Frecuencia");
/*muestralasfrecuenciasenformatabular*/
for(rango=1;rango<TAMANIO_FRECUENCIA;rango++){
printf("%6d%17d\n",rango,frecuencia[rango]);
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio36:
/*Ejemplo36.c
ProgramadeimpresindeunHistograma*/
#include<stdio.h>
#defineTAMANIO10
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
/*utilizaunalistadeinicializacinparainicializarelarreglon*/
intn[TAMANIO]={19,3,15,7,11,9,13,5,17,1};
inti;/*contadorforexternoparaelarregloelementos*/
intj;/*contadorforinternocuenta*sencadabarradelhistograma*/
printf("%s%13s%17s\n","Elemento","Valor","Histograma");
145
AlgoritmoyEstructuradeDatosI
/*paracadaelementodelarreglon,muestraunabarraenelhistograma*/
for(i=0;i<TAMANIO;i++){
printf("%7d%13d",i,n[i]);
for(j=1;j<=n[i];j++){/*imprimeunabarra*/
printf("%c",'*');
}/*findelforinterno*/
printf("\n");/*findeunabarradelhistograma*/
}/*findelforexterno*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio37:
/*Ejemplo37.c
Lanzaundadodeseislados6000veces*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineTAMANIO7
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intcara;/*valoraleatoriodeldadoentre1y6*/
inttiro;/*contadordetiros*/
intfrecuencia[TAMANIO]={0};/*inicializalacuenta*/
srand(time(NULL));/*generadordelasemilladenmerosaleatorios*/
/*tiraeldado6000veces*/
for(tiro=1;tiro<=6000;tiro++){
cara=1+rand()%6;
++frecuencia[ cara];/*remplazalainstruccin switch delalnea26 delafigura
5.8*/
}/*findefor*/
printf("%s%17s\n","Cara","Frecuencia");
146
AlgoritmoyEstructuradeDatosI
/*muestraloselementos16defrecuenciaenformatabular*/
for(cara=1;cara<TAMANIO;cara++){
printf("%4d%17d\n",cara,frecuencia[cara]);
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio38:
/*Figura6.10:fig06_10.c
Manipulacindearreglosdecaracterescomocadenas*/
#include<stdio.h>
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
charcadena1[20];/*reserva20caracteres*/
charcadena2[]="literaldecadena";/*reserva18caracteres*/
inti;/*contador*/
/*leelacadenadelusuarioylaintroduceenelarreglocadena1*/
printf("Introduceunacadena:");
scanf("%s",cadena1);/*entradaquefinalizaconunespacioenblanco*/
/*muestralascadenas*/
printf("Lacadena1es:%s\ncadena2es:%s\n"
"Lacadena1conespaciosentrecaractereses:\n",
cadena1,cadena2);
/*muestraloscaractereshastaqueencuentraelcaracternulo*/
for(i=0;cadena1[i]!='\0';i++){
printf("%c",cadena1[i]);
}/*findefor*/
printf("\n");
return0;/*indicaterminacinexitosa*/
}/*findemain*/
147
AlgoritmoyEstructuradeDatosI
Ejercicio39:
/*Ejemplo39.c
Arreglosestticosqueseinicializanencero*/
#include<stdio.h>
voidiniciaArregloEstatico(void);/*prototipodelafuncin*/
voidiniciaArregloAutomatico(void);/*prototipodelafuncin*/
/*lafuncinmaincomienzaleejecucindelprograma*/
intmain()
{
printf("Primerallamadaacadafuncin:\n");
iniciaArregloEstatico();
iniciaArregloAutomatico();
printf("\n\nSegundallamadaacadafuncin:\n");
iniciaArregloEstatico();
iniciaArregloAutomatico();
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*funcinparademostrarunarregloestticolocal*/
voidiniciaArregloEstatico(void)
{
/*inicializloselementosa0laprimeravezquesellamaalafuncin*/
staticintarreglo1[3];
inti;/*contador*/
printf("\nValoresalentrarainiciaArregloEstatico:\n");
/*muestraelcontenidodelarreglo1*/
for(i=0;i<=2;i++){
printf("arreglo1[%d]=%d",i,arreglo1[i]);
}/*findefor*/
printf("\nValoresalsalirdeiniciaArregloEstatico:\n");
/*modificaymuestraelcontenidodearreglo1*/
for(i=0;i<=2;i++){
printf("arreglo1[%d]=%d",i,arreglo1[i]+=5);
148
AlgoritmoyEstructuradeDatosI
}/*findefor*/
}/*findelafuncininiciaArregloEstatico*/
/*funcinparademostrarunarreglolocalautomtico*/
voidiniciaArregloAutomatico(void)
{
/*inicializaloeelementoscadavezquesellamaalafuncin*/
intarreglo2[3]={1,2,3};
inti;/*contador*/
printf("\n\nValoresalentrarainiciaArregloAutomatico:\n");
/*muestraelcontenidodearreglo2*/
for(i=0;i<=2;i++){
printf("arreglo2[%d]=%d",i,arreglo2[i]);
}/*findefor*/
printf("\nValoresalsalirdeiniciaArregloAutomatico:\n");
/*modificaymuestraelcontenidodearreglo2*/
for(i=0;i<=2;i++){
printf("arreglo2[%d]=%d",i,arreglo2[i]+=5);
}/*findefor*/
}/*findelafuncininiciaArregloAutomatico*/
Ejercicio40:
/*Ejemplo40.c
Pasodearreglosydeelementosdeunarregloafunciones*/
#include<stdio.h>
#defineTAMANIO5
/*prototiposdelasfunciones*/
voidmodificaArreglo(intb[],inttamanio);
voidmodificaElemento(inte);
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inta[TAMANIO]={0,1,2,3,4};/*inicializaa*/
149
AlgoritmoyEstructuradeDatosI
inti;/*contador*/
printf("Efectosdepasararregloscompletosporreferencia:\n\nThe"
"losvaloresdelarreglooriginalson:\n");
/*muestraelarreglooriginal*/
for(i=0;i<TAMANIO;i++){
printf("%3d",a[i]);
}/*findefor*/
printf("\n");
/*pasaelarregloamodificaArregloporreferencia*/
modificaArreglo(a,TAMANIO);
printf("Losvaloresdelarreglomodificadoson:\n");
/*muestraelarreglomodificado*/
for(i=0;i<TAMANIO;i++){
printf("%3d",a[i]);
}/*findefor*/
/*muestraelvalordea[3]*/
printf("\n\n\nEfectosdepasarunelementodelarreglo"
"porvalor:\n\nElvalordea[3]es%d\n",a[3]);
modificaElemento(a[3]);/*pasaelelementoa[3]delarregloporvalor*/
/*muestraelvalora[3]*/
printf("Elvalordea[3]es%d\n",a[3]);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*enlafuncinmodificaArreglo,"b"apuntaalarreglooriginal"a"
ememoria*/
voidmodificaArreglo(intb[],inttamanio)
{
intj;/*contador*/
/*multiplicacadaelementodelarreglopor2*/
for(j=0;j<tamanio;j++){
150
AlgoritmoyEstructuradeDatosI
b[j]*=2;
}/*findefor*/
}/*findelafuncinmodificaArreglo*/
/*enlafuncinmodificaElemento,"e"esunacopialocaldelelementoa[3]
delarreglosepasdesdemain*/
voidmodificaElemento(inte)
{
/*multiplicaelparmetropor2*/
printf("ElvalorenmodificaElementoes%d\n",e*=2);
}/*findelafuncinmodificaElemento*/
Ejercicio41:
/*Ejemplo41.c
Demostracindelcalificadordetipoconstconarreglos*/
#include<stdio.h>
voidintentaModifElArreglo(constintb[]);/*prototipodelafuncin*/
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inta[]={10,20,30};/*inicializaa*/
intentaModifElArreglo(a);
printf("%d%d%d\n",a[0],a[1],a[2]);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
151
AlgoritmoyEstructuradeDatosI
Ejercicio42:
/*Ejemplo42.c
Esteprogramaintroduceeltemadelanlisisdedatos.
Calculalamedia,lamedianaylamodadelosdatos*/
#include<stdio.h>
#defineTAMANIO99
/*prototiposdelasfunciones*/
voidmedia(constintresp[]);
voidmediana(intresp[]);
voidmoda(intfrec[],constintresp[]);
voidordenamBurbuja(inta[]);
voidimprimeArreglo(constinta[]);
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intfrecuencia[10]={0};/*inicializaelarreglofrecuencia*/
/*inicializaelarreglorespuestas*/
intrespuesta[TAMANIO]=
{6,7,8,9,8,7,8,9,8,9,
7,8,9,5,9,8,7,8,7,8,
6,7,8,9,3,9,8,7,8,7,
7,8,9,8,9,8,9,7,8,9,
6,7,8,7,8,7,9,8,9,2,
7,8,9,8,9,8,9,7,5,3,
5,6,7,2,5,3,9,4,6,4,
7,8,9,6,8,7,8,9,7,8,
7,4,4,2,5,3,8,7,5,6,
4,5,6,1,6,5,7,8,7};
/*procesalasrespuestas*/
media(respuesta);
mediana(respuesta);
moda(frecuencia,respuesta);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*calculaelpromediodetodoslosvaloresdelasrespuestas*/
152
AlgoritmoyEstructuradeDatosI
voidmedia(constintresp[])
{
intj;/*contadordeltotaldeelementosdelarreglo*/
inttotal=0;/*variableparamantenerlasumadeloselementosdelarreglo*/
printf("%s\n%s\n%s\n","********","Media","********");
/*totaldelosvaloresdelasrespuestas*/
for(j=0;j<TAMANIO;j++){
total+=resp[j];
}/*findefor*/
printf("Lamediaeselvalorpromediodelosdatos.\n"
"Lamediaesigualaltotalde\n"
"todosloselementosdedatosdivididospor\n"
"elnumerodeelementosdedatos(%d).Lamedia\n"
"enestaejecucines:%d/%d=%.4f\n\n",
TAMANIO,total,TAMANIO,(double)total/TAMANIO);
}/*findelafuncinmedia*/
/*ordenaelarregloydeterminaelvalordelamediana*/
voidmediana(intresp[])
{
printf("\n%s\n%s\n%s\n%s",
"********","Mediana","********",
"Elarregloderespuestasdesordenadoes");
imprimeArreglo(resp);/*muestraelarreglodesordenado*/
ordenamBurbuja(resp);/*ordenaelarreglo*/
printf("\n\nElarregloordenadoes");
imprimeArreglo(resp);/*muestraelarregloordenado*/
/*muestralamediana*/
printf("\n\nLamedianaeselelemento%ddel\n"
"arregloordenadodeelementos%d.\n"
"Paraestaejecucinlamedianaes%d\n\n",
TAMANIO/2,TAMANIO,resp[TAMANIO/2]);
}/*findelafuncinmediana*/
/*determinalasrespuestasmsfrecuentes*/
voidmoda(intfrec[],constintresp[])
153
AlgoritmoyEstructuradeDatosI
{
intrango;/*contadorparaaccederaloselementosde1a9delarreglofrec*/
intj;/*contadorparasumarloselementosde0a98desarreglorespuesta*/
inth;/*contadorparadesplegarhistogramasdeloselementosenelarreglofrec*/
intmasGrande=0;/*representalafrecuenciamsgrande*/
intvalorModa=0;/*respresentalarespuestamsfrecuente*/
printf("\n%s\n%s\n%s\n",
"********","Moda","********");
/*inicializalasfrecuenciasa0*/
for(rango=1;rango<=9;rango++){
frec[rango]=0;
}/*findefor*/
/*sumalasfrecuencias*/
for(j=0;j<TAMANIO;j++){
++frec[resp[j]];
}/*findefor*/
/*muestralosencabezadosdelascolumnastcolumns*/
printf("%s%11s%19s\n\n%54s\n%54s\n\n",
"Respuesta","Frecuencia","Histograma",
"1122","50505");
/*muestralosresultados*/
for(rango=1;rango<=9;rango++){
printf("%8d%11d",rango,frec[rango]);
/*siguelapistadelvalordelamodaydelvalordelafrecuenciamsgrande*/
if(frec[rango]>masGrande){
masGrande=frec[rango];
valorModa=rango;
}/*findeif*/
/*muestraloshistogramasdebarrasquerepresentanelvalordelafrecuencia*/
for(h=1;h<=frec[rango];h++){
printf("*");
}/*findelforinterno*/
printf("\n");/*nuevalneadesalida*/
}/*findelforexterno*/
154
AlgoritmoyEstructuradeDatosI
/*despliegaelvalordelamoda*/
printf("Lamodaeselvalormasfrecuente.\n"
"Paraestaejecucinlamodaes%delcualocurrio"
"%dveces.\n",valorModa,masGrande);
}/*findelafuncinmoda*/
/*funcinqueordenaunarreglomedianteelalgoritmodelmtododelaburbuja
algorithm*/
voidordenamBurbuja(inta[])
{
intpasada;/*contadordepasadas*/
intj;/*contaodrdepasadas*/
intalmacena;/*ubicacintemporalutilizadaparaintercambiarloselementos*/
/*cicloparacontrolarelnmerodepasadas*/
for(pasada=1;pasada<TAMANIO;pasada++){
/*cicloparacontrolarelnmerodecomparacionesporpasada*/
for(j=0;j<TAMANIO1;j++){
/*intercambialoselementossinoseencuentranenorden*/
if(a[j]>a[j+1]){
almacena=a[j];
a[j]=a[j+1];
a[j+1]=almacena;
}/*findeif*/
}/*findelforinterno*/
}/*findelforexterno*/
}/*findeordenamBurbuja*/
/*muestraelcontenidodelarreglo(20valoresporlnea)*/
voidimprimeArreglo(constinta[])
{
intj;/*contador*/
/*muestraelcontenidodelarreglo*/
for(j=0;j<TAMANIO;j++){
if(j%20==0){/*comienzaunanuevalneacada20valores*/
printf("\n");
155
AlgoritmoyEstructuradeDatosI
}/*findeifendif*/
printf("%2d",a[j]);
}/*findefor*/
}/*findelafuncinimprimeArreglo*/
Ejercicio43:
/*Ejemplo43.c
Bsquedalinealenunarreglo*/
#include<stdio.h>
#defineTAMANIO100
/*prototipodelafuncin*/
intbusquedaLineal(constintarreglo[],intllave,inttamanio);
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inta[TAMANIO];/*creaelarregloa*/
intx;/*contadorparainicializarloselementosde0a99delarregloa*/
intllaveBusqueda;/*valorparalocalizarenelarregloa*/
intelemento;/*variableparaalmacenarlaubicacindellaveBusquedao1*/
/*crealosdatos*/
for(x=0;x<TAMANIO;x++){
a[x]=2*x;
}/*findefor*/
printf("Introduzcalallavedebusquedaentera:\n");
scanf("%d",&llaveBusqueda);
/*intentalocalizarllaveBusquedaenelarregloa*/
elemento=busquedaLineal(a,llaveBusqueda,TAMANIO);
/*despliegalosresultados*/
if(elemento!=1){
printf("Encontreelvalorenelelemento%d\n",elemento);
}/*findeif*/
else{
printf("Valornoencontrado\n");
156
AlgoritmoyEstructuradeDatosI
}/*findeelse*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*comparalallaveconcadaelementodelarreglohastaquelocalizaelelemento
ohastaquealcanzaelfinaldelarreglo;devuelveelsubndicedelelemento
siloencontro1sinoloencontr*/
intbusquedaLineal(constintarreglo[],intllave,inttamanio)
{
intn;/*contador*/
/*cicloatravsdelarreglo*/
for(n=0;n<tamanio;++n){
if(arreglo[n]==llave){
returnn;/*devuelvelaubicacindelallave*/
}/*findeif*/
}/*findefor*/
return1;/*llavenoencontrada*/
}/*findelafuncinbusquedaLineal*/
Ejercicio44:
/*Ejemplo.c
Bsquedabinariadentrodeunarreglo*/
#include<stdio.h>
#defineTAMANIO15
/*prototiposdelasfunciones*/
intbusquedaBinaria(constintb[],intclaveDeBusqueda,intbajo,intalto);
voiddespliegaEncabezado(void);
voiddespliegaLinea(constintb[],intbajo,intmedio,intalto);
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
inta[TAMANIO];/*creaelarregloa*/
157
AlgoritmoyEstructuradeDatosI
inti;/*contadorparainicializarloselementosde0a14delarregloa*/
intllave;/*valoralocalizarenelarregloa*/
intresultado;/*variableparaalmacenarlaubicacindelallaveo1*/
/*crealosdatos*/
for(i=0;i<TAMANIO;i++){
a[i]=2*i;
}/*findefor*/
printf("Introduzcaunnumeroentre0y28:");
scanf("%d",&llave);
despliegaEncabezado();
/*buscalallaveenelarregloa*/
resultado=busquedaBinaria(a,llave,0,TAMANIO1);
/*despliegalosresultados*/
if(resultado!=1){
printf("\n%dseencuentraenelelemento%ddelarreglo\n",llave,resultado);
}/*findeif*/
else{
printf("\n%dnoseencuentra\n",llave);
}/*findeelse*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*funcinpararealizarlabsquedabinariaenunarreglo*/
intbusquedaBinaria(constintb[],intclaveDeBusqueda,intbajo,intalto)
{
intcentral;/*variableparamantenerelelementocentraldelarreglo*/
/*realizaelciclohastaqueelsubnicebajoesmayorqueelsubndicealto*/
while(bajo<=alto){
/*determinaelelementocentraldelsubarregloenelquesebusca*/
central=(bajo+alto)/2;
/*despliegaelsubarregloutilizadoenesteciclo*/
despliegaLinea(b,bajo,central,alto);
158
AlgoritmoyEstructuradeDatosI
/*siclaveDeBusquedacoincideconelelementocentral,devuelvecentral*/
if(claveDeBusqueda==b[central]){
returncentral;
}/*findeif*/
/*siclaveDeBusquedaesmenorqueelelementocentral,estableceelnuevovalor
dealto*/
elseif(claveDeBusqueda<b[central]){
alto=central1;/*buscaenlamitadinferiordelarreglosearchlowendofarray
*/
}/*findeelseif*/
/*siclaveDeBusquedaesmayorqueelelementocentral,estableceelnuevovalor
parabajo*/
else{
bajo=central+1;/*buscaenlamitadsuperiordelarreglo*/
}/*findeelse*/
}/*findewhile*/
return1;/*noseencontrclaveDeBusqueda*/
}/*findelafunciponbusquedaBinaria*/
/*Imprimeunencabezadoparalasalida*/
voiddespliegaEncabezado(void)
{
inti;/*contador*/
printf("\nSubindices:\n");
/*muestraelencabezadodelacolumna*/
for(i=0;i<TAMANIO;i++){
printf("%3d",i);
}/*findefor*/
printf("\n");/*comienzalanuevalneadesalida*/
/*muestraunalneadecaracteres*/
for(i=1;i<=4*TAMANIO;i++){
printf("");
}/*findefor*/
159
AlgoritmoyEstructuradeDatosI
printf("\n");/*iniciaunanuevalneadesalida*/
}/*findelafuncindespliegaEncabezado*/
/*Imprimeunalneadesalidaquemuestralaparteactual
delarregloqueseestaprocesando.*/
voiddespliegaLinea(constintb[],intbaj,intcen,intalt)
{
inti;/*contadorparalaiteracinatravsdelarreglob*/
/*cicloatravsdelarreglocompleto*/
for(i=0;i<TAMANIO;i++){
/*despliegaespaciossiseencuentrafueradelrangoactualdelsubarreglo*/
if(i<baj||i>alt){
printf("");
}/*findeif*/
elseif(i==cen){/*despliegaelelementocentral*/
printf("%3d*",b[i]);/*marcaelvalorcentral*/
}/*findeelseif*/
else{/*despliegaotroselementosenelsubarreglo*/
printf("%3d",b[i]);
}/*findeelse*/
}/*findefor*/
printf("\n");/*inicialanuevalneadesalida*/
}/*findelafuncindespliegaLinea*/
Ejercicio45:
/*Figura6.22:fig06_22.c
Ejemplodeunarreglodedoblesubndice*/
#include<stdio.h>
#defineESTUDIANTES3
#defineEXAMENES4
/*prototiposdelasfunciones*/
intminimo(constintcalificaciones[][EXAMENES],intalumnos,intexamenes);
intmaximo(constintcalificaciones[][EXAMENES],intalumnos,intexamenes);
doublepromedio(constintestableceCalif[],intexamenes);
160
);
AlgoritmoyEstructuradeDatosI
/*lafuncinmaincomienzalaejecucindelprograma*/
intmain()
{
intestudiante;/*contadordeestudiantes*/
/*inicializalascalificacionesparatresestudiantes(filas)*/
constintcalificacionesEstudiantes[ESTUDIANTES][EXAMENES]=
{{77,68,86,73},
{96,87,89,78},
{70,90,86,81}};
/*muestraelarreglocalificacionesEstudiantes*/
printf("Elarregloes:\n");
despliegaArreglo(calificacionesEstudiantes,ESTUDIANTES,EXAMENES);
/*determinaelvalormspequeoyelvalormsgrandedelascalificaciones*/
printf("\n\nCalificacionmasbaja:%d\nCalificacionmasalta:%d\n",
minimo(calificacionesEstudiantes,ESTUDIANTES,EXAMENES),
maximo(calificacionesEstudiantes,ESTUDIANTES,EXAMENES));
/*calculaelpromediodecalificacionesdecadaestudiante*/
for(estudiante=0;estudiante<ESTUDIANTES;estudiante++){
printf("Elpromediodecalificaciondelestudiante%des%.2f\n",
estudiante,promedio(calificacionesEstudiantes[estudiante],EXAMENES)
}/*findefor*/
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*Encuentralacalificacinmnima*/
intminimo(constintcalificaciones[][EXAMENES],intalumnos,intexamenes)
{
inti;/*contadordeestudiantes*/
intj;/*contadordeexamenes*/
intcalifBaja=100;/*inicializaalacalificacinmsaltaposible*/
/*cicloatravsdelasfilasdecalificaciones*/
for(i=0;i<alumnos;i++){
/*cicloatravsdelascolumnasdecalificaciones*/
161
AlgoritmoyEstructuradeDatosI
for(j=0;j<examenes;j++){
}/*findelforinterno*/
if(calificaciones[i][j]<califBaja){
califBaja=calificaciones[i][j];
}/*findeif*/
}/*findelforexterno*/
returncalifBaja;/*devuelvelacalificacinmnima*/
}/*findelafuncinmain*/
/*Encuentralacalificacinmsalta*/
intmaximo(constintcalificaciones[][EXAMENES],intalumnos,intexamenes)
{
inti;/*contadordeestudiantes*/
intj;/*contadordeexamenes*/
intcalifAlta=0;/*inicializaalacalificacinmsbajaposible*/
/*cicloatravsdelasfilasdecalificaciones*/
for(i=0;i<alumnos;i++){
/*cicloatravsdelascolumnasdecalificaciones*/
for(j=0;j<examenes;j++){
}/*findelforinterno*/
if(calificaciones[i][j]>califAlta){
califAlta=calificaciones[i][j];
}/*findeif*/
}/*findelforexterno*/
returncalifAlta;/*devuelvelacalificacinmxima*/
}/*findelafuncinmaximo*/
/*Determinalacalificacinpromedioparaunestudianteenespecial*/
doublepromedio(constintconjuntoDeCalificaciones[],intexamenes)
{
inti;/*contadordeexenes*/
162
AlgoritmoyEstructuradeDatosI
inttotal=0;/*sumadelascalificacionesdelexamen*/
/*totaldecalificacionesdeunestudiante*/
for(i=0;i<examenes;i++){
total+=conjuntoDeCalificaciones[i];
}/*findefor*/
return(double)total/examenes;/*promedio*/
}/*findelafuncinpromedio*/
/*Imprimeelarreglo*/
inti;/*contadordeestudiantes*/
intj;/*contadordeexamenes*/
/*muestraelencabezadodelascolumnas*/
printf("[0][1][2][3]");
/*muestralascalificacionesenformatabular*/
for(i=0;i<alumnos;i++){
/*muestralaetiquetadelafila*/
printf("\ncalificacionesEstudiantes[%d]",i);
/*muestralascalificacionesdeunestudiante*/
for(j=0;j<examenes;j++){
printf("%5d",calificaciones[i][j]);
}/*findelforinterno*/
}/*findelforexterno*/
}/*findelafuncindespliegaArreglo*/
Ejercicio46:
/*Ejemplo46.c
Usodelosoperadores&y**/
#include<stdio.h>
intmain()
163
AlgoritmoyEstructuradeDatosI
{
inta;/*aesunentero*/
int*ptrA;/*ptrAesunapuntadoraunentero*/
a=7;
ptrA=&a;/*ptrAtomaladireccindea*/
printf("Ladirecciondeaes%p"
"\nElvalordeptrAes%p",&a,ptrA);
printf("\n\nElvalordeaes%d"
"\nElvalorde*ptrAes%d",a,*ptrA);
printf("\n\nMuestradeque*y&soncomplementos"
"unodelotro\n&*ptrA=%p"
"\n*&ptrA=%p\n",&*ptrA,*&ptrA);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
Ejercicio47:
/*Figura7.6:fig07_06.c
Elevaalcubounavariablemedianteunallamadaporvalor*/
#include<stdio.h>
intcuboPorValor(intn);/*prototipo*/
intmain()
{
intnumero=5;/*inicializanumero*/
printf("Elvalororiginaldenumeroes%d",numero);
/*pasanumeroporvaloracuboPorValor*/
numero=cuboPorValor(numero);
printf("\nElnuevovalordenumeroes%d\n",numero);
return0;/*indicaterminacinexitosa*/
164
AlgoritmoyEstructuradeDatosI
}/*findemain*/
/*calculaydevuelveelcubodeunargumentoentero*/
intcuboPorValor(intn)
{
returnn*n*n;/*elevaalcubolavariablelocalnydevuelveelresultado*/
}/*findelafuncincuboPorValor*/
Ejercicio48:
/*Figura7.7:fig07_07.c
Eleva al cubo una variable mediante el uso de una llamada por referencia con un
apuntadorcomoargumento*/
#include<stdio.h>
voidcuboPorReferencia(int*ptrN);/*prototipo*/
intmain()
{
intnumero=5;/*inicializanumero*/
printf("Elvalororiginaldenumeroes%d",numero);
/*pasaladireccindenumeraacuboPorReferencia*/
cuboPorReferencia(&numero);
printf("\nElnuevovalordenumeroes%d\n",numero);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*calculaelcubode*ptrN;modificalavariablenumeroenmain*/
voidcuboPorReferencia(int*ptrN)
{
*ptrN=*ptrN**ptrN**ptrN;/*cubode*ptrN*/
}/*findelafuncincuboPorReferencia*/
165
AlgoritmoyEstructuradeDatosI
Ejercicio49:
/*Ejemplo49.c
Conversindeletrasminsculasaletrasmaysculas
medianteelusodeunapuntadornoconstanteaundatonoconstante*/
#include<stdio.h>
#include<ctype.h>
voidconvierteAmayusculas(char*ptrS);/*prototipo*/
intmain()
{
charcadena[]="caracteresy$32.98";/*inicializachararreglo*/
printf("Lacadenaantesdelaconversiones:%s",cadena);
convierteAmayusculas(cadena);
printf("\nLacadenadespuesdelaconversiones:%s\n",cadena);
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*convierteunacadenaaletrasmaysculas*/
voidconvierteAmayusculas(char*ptrS)
{
while(*ptrS!='\0'){/*elcaracteractualnoes'\0'*/
if(islower(*ptrS)){/*sielcaracteresminscula,*/
*ptrS=toupper(*ptrS);/*Loconvierteamayscula*/
}/*findeif*/
++ptrS;/*mueveptrSalsiguientecaracter*/
}/*findelwhile*/
}/*findelafuncinconvierteAmayusculas*/
166
AlgoritmoyEstructuradeDatosI
Ejercicio50:
/*Figura7.11:fig07_11.c
Impresindeunacadenacaracterporcaractermedianteeluso
deunapuntadornoconstanteaundatoconstante*/
#include<stdio.h>
voidimprimeCaracteres(constchar*ptrS);
intmain()
{
/*inicializaelarreglodecaracteres*/
charcadena[]="imprimeloscaracteresdeunacadena";
printf("Lacadenaes:\n");
imprimeCaracteres(cadena);
printf("\n");
return0;/*indicaterminacinexitosa*/
}/*findemain*/
/*ptrSnopuedemodificarelcaracteralcualapunta,
esdecir,ptrSesunapuntadorde"sololectura"*/
voidimprimeCaracteres(constchar*ptrS)
{
/*repiteelcicloparatodalacadena*/
for(;*ptrS!='\0';ptrS++){/*sininicializacin*/
printf("%c",*ptrS);
}/*findefor*/
}/*findelafuncinimprimeCaracteres*/
167
AlgoritmoyEstructuradeDatosI
168
AlgoritmoyEstructuradeDatosI
Bibliografa
BORESRosario,ROSALESRoman;"Computacin.Metodologa,lgicacomputacional
yprogramacin"McGrawHill2006
JEANPaulTremblay,B.BuntRichard;"Introduccinalacienciasdelascomputadoras
(enfoquealgoritmico)"McGrawHill2005
JOYANESAGUILARLuis;"Metodologadelaprogramacin"McGrawHill2006
JOYANESAGUILARLuis;"Fundamentosdeprogramacin,algoritmosyestructurade
datos".McGrawHill2006
LEVINEGuillermo;"Introduccinalacomputacinyalaprogramacinestructurada"
McGrawHill2006
169