86
Algorítmica y Programación

Algorítmicay Programación - Comunidad … · IT204–AlgorítmicayProgramación Ing.RogerErnestoAlarcónGarcía. 5 El programa original escrito en lenguaje ensamblador se denomina

  • Upload
    donhi

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

Algorítmica yProgramación

IT204 –Algorítmica y Programación

2 Ing. Roger Ernesto Alarcón García.

INGENIERIATELEINFORMATICA

IT204–Algorítmica y Programación

Ing. Roger Ernesto Alarcón García. 3

IT204–Algorítmica y Programación

TEXTO INFORMATIVO

INTRODUCCION A LA PROGRAMACION

HISTORIA DE LA PROGRAMACIÓN

La historia de la informática y de la computación se ha caracterizado fundamentalmente en la existenciade centenares de lenguajes de programación, de forma tal que siempre se ha hablado de la “babel de loslenguajes”, aunque bien es cierto que son sólo unas decenas escasas los que han tenido un impactosignificativo, y unos pocos los utilizados en la industria, los negocios y la ciencia.

Muchos de los lenguajes de programación actuales tienen sus raíces en los lenguajes que nacieron afinales de los cincuenta y primeros años de los sesenta, tales como COBOL (1960), FORTRAN IV (1961),BASIC (1964), LOGO (1967). Estos lenguajes representaron la primera alternativa a los lenguajesensambladores. En la década de los setenta y primeros años de los ochenta emergieron nuevoslenguajes, como Pascal (1971), C (1972) y Ada (1979), que se convirtieron en dominantes, desplazandopor ejemplo, a otros como ALGOL y BASIC. Otros lenguajes como COBOL y FORTRAN, lograronadaptarse y se mantuvieron como lenguajes de referencia en el mundo de los negocios y en el campocientífico.

Todos estos lenguajes anteriores seguían el estilo de programación estructurada y se conocían comolenguajes de programación imperativos o estructurados. En paralelo con el desarrollo de estos lenguajessurgieron dos nuevos estilos o paradigmas de programación: programación funcional y la programaciónorientada a objetos.

A principios de los ochenta aparece C++ como lenguaje imperativo con propiedades de orientación aobjetos y que durante la década de los noventa ha sido el lenguaje de programación orientada a objetospor excelencia. En 1995 se presentó oficialmente por el constructor Sun el lenguaje Java, un lenguajeorientado a objetos y con una funcionalidad muy dirigida a la red Internet. En el año 2000 Microsoftpresentó C#.

Para mayor información ir a la siguiente dirección : http://oreilly.com/news/graphics/prog_lang_poster.pdf

LOS LENGUAJES DE PROGRAMACION

Un programa es un conjunto de órdenes para un ordenador. Estas órdenes se le deben dar en un ciertolenguaje, que el ordenador sea capaz de comprender.

El problema es que los lenguajes que realmente entienden los ordenadores resultan difíciles paranosotros, porque son muy distintos de los que nosotros empleamos habitualmente para hablar. Escribirprogramas en el lenguaje que utiliza internamente el ordenador (llamado “lenguaje máquina” o “códigomáquina”) es un trabajo duro, tanto a la hora de crear el programa como (especialmente) en el momentode corregir algún fallo o mejorar lo que se hizo.

Por eso, en la práctica se emplean lenguajes más parecidos al lenguaje humano, llamados “lenguajes dealto nivel”. Normalmente, estos son muy parecidos al idioma inglés, aunque siguen unas reglas muchomás estrictas.

Se debe diferenciar entre el acto de crear un programa y la acción de la computadora cuando ejecuta lasinstrucciones del programa. La creación de un programa se hace inicialmente en papel y a continuaciónse introduce en la computadora y se convierte en lenguaje entendible por la computadora.

El propósito de un lenguaje informático (lenguaje de computadora) es permitir a las personascomunicarse con una computadora. Los lenguajes de los humanos y los lenguajes d ela máquina sonmuy diferentes, ya que las características y posibilidades de las personas y de las máquinas son muydiferentes.

IT204 –Algorítmica y Programación

4 Ing. Roger Ernesto Alarcón García.

Los lenguajes de computadoras permiten a las personas escribir en un lenguaje que sea más apropiado alas características humanas y se pueda traducir al lenguaje máquina de diferentes tipos de máquinas.

Los principales tipos de lenguajes utilizados en la actualidad son tres:

− Lenguaje máquina− Lenguaje de bajo nivel (ensamblador)− Lenguaje de alto nivel

Lenguaje Máquina

Los lenguajes máquinas son aquellos que están escritos en lenguajes directamente inteligibles por lamáquina (computadora), ya que sus instrucciones son cadenas binarias (cadenas o series de caracteres-dígitos 0 y 1) que especifican una operación, y las posiciones (dirección) de memoria implicadas en laoperación se denominan instrucciones de máquina o código máquina. El código máquina es el conocidocódigo binario.

Las instrucciones en el lenguaje máquina dependen del hardware de la computadora y, por tanto,diferirán de una computadora a otra. El lenguaje máquina de una computadora personal será diferente deun sistema HP, Dell, Compaq o un sistema IBM.

Las ventajas de programar en lenguaje máquina se refieren, fundamentalmente, a la posibilidad de cargar(transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidadde ejecución superior a cualquier otro lenguaje de programación.

Los inconvenientes en la actualidad superan a las ventajas, lo que hace prácticamente no recomendableslos lenguajes máquina al programador de aplicaciones. Estos inconvenientes son:

− Dificultad y lentitud en la codificación− Poca fiabilidad− Dificulta grande de verificar y poner a punto los programas− Los programas solo son ejecutables en el mismo procesador (UPC)

Para evitar los lenguajes máquina, desde el punto de vista del usuario, se han creado otros lenguajes quepermiten escribir programas con instrucciones similares al lenguaje humano (por desgracia casi siempreen ingles), estos lenguajes se denominan de alto y bajo nivel.

Lenguajes de Bajo NivelLos lenguajes de bajo nivel son los más fáciles de utilizar que los lenguajes máquinas, pero, al igual queellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador(assembly language). Por ejemplo nemotécnicos típicos de operaciones aritméticas son: en ingles: ADD,SUB, DIV, etc. En español serías SUM, RES, DIV

Una instrucción tipica de suma sería

ADD, M, N, P

Esta instrucción podía significar “sumar el número contenido en la posición de memoria M al numeroalmacenado en la posición de memoria N y situar el resultado en la posición de memoria P”.Evidentemente es mucho más sencillo recordar la instrucción anterior con un nemotécnico que suequivalente en código máquina:

0110 1001 1010 1011

Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora,en esto se diferencia esencialmente del lenguaje máquina, sino que requiere una fase de traducción allenguaje máquina.

IT204–Algorítmica y Programación

Ing. Roger Ernesto Alarcón García. 5

IT204–Algorítmica y Programación

El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programatraducido en lenguaje máquina se conoce como programa objeto, ya directamente inteligible por lacomputadora.

El traductor de programas fuente a objeto es un programa llamado ensamblador (assembler), existenteen casi todas la computadoras.

Programa fuenteen ensamblador(assembly)

Programaensamblador(assembler)

Programa objetoen códigomáquina

Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su mayor facilidadde codificación y, en general, su velocidad de cálculo.

Los inconvenientes más notables de los lenguajes ensambladores son:− Dependencia total de la máquina, lo que impide la transportabilidad de los programas. El

programa ensamblador del PC es distinto del lenguaje ensamblador de Apple.− La formación de los programadores es más completa que la correspondiente a los

programadores de lato nivel, ya que exige no sólo las técnicas de programación, sino también elconocimiento del interior de la máquina.

Hoy día los lenguajes ensambladores tiene sus aplicaciones muy reducidas en la programación deaplicaciones y se centran en aplicaciones de tiempo real, control de procesos y de dispositivoselectrónicos, etc.

dosseg.model small.stack 100h.datahello_message db 'Hola',0dh,0ah,'$'.codemain procmov ax,@datamov ds,axmov ah,9mov dx,offset hello_messageint 21hmov ax,4C00hint 21hmain endpend main

Lenguajes de Alto NivelLos lenguajes de Alto Nivel son los más utilizados por los programadores. Están diseñados para que laspersonas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina yensambladores. Otra razón es que un programa escrito en lenguaje de alto nivel es independiente de lamáquina; esto es, las instrucciones del programa de la computadora no dependen del diseño delhardware o de una computadora en particular. En consecuencia los programas escritos en lenguaje dealto nivel son portables o transportables, lo que significa la posibilidad de poder ser ejecutados con pocao ninguna modificación en diferentes tipos de computadoras; al contrario de los programas en lenguajemáquina o ensamblador, que solo se pueden ejecutar en un determinado tipo de computadora. Loslenguajes de alto nivel presentan las siguientes ventajas:

IT204 –Algorítmica y Programación

6 Ing. Roger Ernesto Alarcón García.

− El tiempo de formación de los programadores es relativamente corto comparado con otroslenguajes.

− La estructura de programas se basa en reglas sintácticas similares a los lenguajes humanos.Nombres de las instrucciones, pueden se: READ, WRITE, PRINT, OPEN, etc.

− Las modificaciones y puestas a punto de los programas son más fáciles.− Reducción del coste de los programas.− Transportabilidad.

Los inconvenientes se concentran en:− Incremento del tiempo de puesta a punto, al necesitarse diferentes traducciones del programa

fuente para conseguir el programa definitivo.− No se aprovechan los recursos internos de la máquina, que se explotan mucho mejor en

lenguajes máquina y ensambladores.− Aumento de la ocupación de memoria.− El tiempo de ejecución de los programas es mucho mayor.

Los programas fuentes tienen que ser traducidos por los programas traductores, llamados en este casocompiladores e intérpretes.

Para mayor información ir al siguiente enlace:http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n

TRADUCTORES DE LENGUAJE

Los traductores de lenguaje son programas que traducen a su vez los programas fuente escritos en loslenguajes de alto nivel a código máquina. Los traductores se dividen en: compiladores e intérpretes.

Intérpretes

Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta. Losprogramas intérpretes clásicos, como BASIC, prácticamente ya no se utilizan, Los interpretes han vueltoa renacer con la aparición de Java, ya que para entender el código en bytes (bytecode) al que traduce uncompilador Java se necesita un intérprete.

Programa fuente

Intérprete

Traducción y ejecución línea alínea

Compilador

Después que se ha diseñado el algoritmo y escrito el programa en un papel, se debe comenzar elproceso de introducir el programa en un archivo de la computadora. La introducción y modificación de unarchivo se hace utilizando un editor de texto o simplemente un editor, un programa que viene con sucomputadora, normalmente, y que le permite el almacenamiento y recuperación de lo que se ha escritoen el disco.

IT204–Algorítmica y Programación

Ing. Roger Ernesto Alarcón García. 7

IT204–Algorítmica y Programación

Programa fuente

Compilador

Programa objeto

HERRAMIENTAS DE IMPLEMENTACION

Resolución de Problemas

¿Cómo se resuelve un problema mediante la programación?− Definir claramente el problema− Identificación de datos de entrada, de salida, de variables intermedias− Separar entreFase de solución general al problema: diseño de un algoritmoFase de solución específica: programa de ordenador escrito en algún lenguaje de programación

Problema Diseño delAlgoritmo

Programa deordenador

Análisis del Problema

− Una vez que se ha comprendido lo que se desea, es necesario definir:o Los datos de entradao Cual es la información que se desea produciro Los métodos y fórmulas que se necesitan para procesar los datos

− Una recomendación muy práctica es el que nos pongamos en el lugar del computador.

Diseño del Algoritmo

− Un algoritmo puede ser definido como la secuencia ordenada de pasos, sin ambigüedades, queconducen a la resolución de un problema dado y expresado en lenguaje natural, por ejemplo elcastellano.

− Para diseñar un algoritmo se debe comenzar por identificar las tareas más importantes para resolverel problema y disponerlas en el orden en el que han de ser ejecutadas. Los pasos en esta primeradescripción pueden requerir una revisión adicional antes de que podamos obtener un algoritmo claro,preciso y completo.

− Este método de diseño de algoritmos en etapas, yendo de los conceptos generales a los de detalle,se conoce como método descendente (top-down).

IT204 –Algorítmica y Programación

8 Ing. Roger Ernesto Alarcón García.

Codificación

La codificación es la operación de escribir la solución del problema (de acuerdo a la lógica del diagramade flujo o pseudocódigo) en una serie de instrucciones detalladas ó en un código reconocible por lacomputadora. La serie de instrucciones detalladas se le conoce como código fuente, el cual se escribe enun lenguaje de programación.

Notación para describir un algoritmo

− Método informalo Lenguaje Natural

Ventajas: comprensible e intuitivoInconveniente: impreciso

− Métodos formaleso Pseudocódigo

Lenguaje natural limitado y sin ambigüedado Diagramas

Diagramas de flujo.- Utiliza un conjunto de símbolos para representar cada estructurade control y mediante líneas de flujo se indica el orden en que se realiza el flujológico del algoritmo

PSEUDOCODIGO

Es un lenguaje de especificación de algoritmos. El uso de tal lenguaje hace el paso de codificación finalrelativamente fácil.

Sintaxis

algoritmo <nombre_algoritmo>[const

[tipos

[var

//declaración de constantes]

//declaración de tipos]

//declaración de variables]// cuerpo del algoritmoinicio……fin

Procedimientos de entrada y salida

− Entrada por TecladoLeer (<lista de variables>)

− Salida por pantallaEscribir (<lista de variables>)

Declaración de Variables

En esta sección se declaran todas las variables utilizadas en el algoritmo, listándose sus nombres yespecificando sus tipos.

varentero : Numeroreal : Horas

IT204–Algorítmica y Programación

Ing. Roger Ernesto Alarcón García. 9

IT204–Algorítmica y Programación

Declaración de Constantes

En esta sección se declaran todas las constantes que tengan nombre

constPI = 3.141592IGV = 0.19

Funciones predefinidas que se pueden utilizar en un pseudocódigo

Función Significado

abs(x) Devuelve el valor absoluto de la expresión numérica x

aleatorio() Devuelve un número aleatorio real mayor o igual que 0 y menor q

arctan(x) Devuelve la arco tangente de x

cos(x) Devuelve el coseno de x

entero(x) Devuelve el primer valor entero menor que la expresión numérica

exp(x) Devuelve el valor e x

ln(x) Devuelve el logaritmo neperiano de x

log10(x) Devuelve el logaritmo en base 10 de x

raiz2(x) Devuelve la raíz cuadrada de x

sen(x) Devuelve el seno de x

pow(x,y) Potencia x a la y

trunc(x) Trunca (elimina los decimales) de la expresión numérica x.

Ejemplo 01

algoritmo SumadeDosNumerosvar

inicio

fin

entero : N1, N2, S

Leer N1,N2S ← N1 + N2Escribir “La suma es: ”, S

Ejemplo 02

algoritmo AreaCirculoconst

var

inicio

fin

PI = 3.141592

entero : R, A

Leer RA ← PI * R * REscribir “El área es: ”, A

IT204 –Algorítmica y Programación

10 Ing. Roger Ernesto Alarcón García.

Listado de Ejercicios

− Calcule y escriba el cuadrado de un número.− Convertir una temperatura dada en grados Celsius a grados Farenheit (F=(9/5)C+32)− Determinar la hipotenusa de un triángulo rectángulo conocidas las longitudes de los catetos.− Calcular el área de un triángulo en función de las longitudes de sus lados. (

Area=raizcuadrada(p(p-a)(p-b)(p-c)), donde p = (a+b+c)/2 semiperímetro− Calcular el área de un triángulo en función de la base y la altura.− Calcular el salario de un trabajador conociendo la cantidad de días trabajados y el monto por día.

2 Ing. Roger Ernesto Alarcón García.

TEXTO INFORMATIVO

PSEUDOCÓDIGO

Estructura Selectiva

− En esta estructura se evalúa una condición y en función del resultado de la misma se realiza unaopción u otra. Las condiciones se representan utilizando expresiones lógicas

− Esta puede ser:• Simples• Dobles• Múltiples

Alternativa Simple

− Esta estructura se representa por si – entonces, ejecuta una determinada acción cuando secumple una condición

− La selección si-entonces evalúa la condición y• Si la condición es verdadera, entonces ejecuta la acción SI• Si la condición es falsa, entonces no hace nada

Sintaxis

si <condición> entonces<acción S1>

fin_si

si <condición> entonces<acción S1><acción S2><acción S3>…<acción Sn>

fin_si

Ejercicio: Determinar si una persona es adulta

algoritmo Edadesvar

inicioentero : edad

escribir “Ingrese edad”leer edadsi edad>=18 entonces

escribir “La persona es adulta”

finfin_si

Alternativa Doble

La estructura anterior es limitada, lo común es elegir entre dos opciones o alternativas posibles, enfunción de la condición.

3Ing. Roger Ernesto Alarcón García.

Sintaxis

si <condición> entonces<acción S1>

Si_no<acción S2>

fin_si

si <condición> entonces<acción S11><acción S12>…<acción S1n>

si_no<acción S21><acción S22>…<acción S2n>

fin_si

Ejercicio: Determinar si una persona es adulta o menor de edadalgoritmo Edades

var

inicioentero : edad

escribir “Ingrese edad”leer edadsi edad>=18 entonces

escribir “La persona es adulta”

fin

si_no

fin_siescribir “La persona es menor de edad”

Estructura selectiva anidada

Cuando dentro de una estructura selectiva utiliza otra estructura selectiva

si <condición> entonces<acción S1>si <condición> entonces

<acción S2>si_no

fin_sisi_no

<acción S3>

<acción S4>fin_si

Ejemplo: Determinar si una valor entero ingresado es positivo, negativo o cero.algoritmo Numerovar

inicioentero : valor

escribir “Ingrese un valor entero”leer valor

4 Ing. Roger Ernesto Alarcón García.

si valor>0 entoncesescribir “El número es positivo”

fin

si_no

fin_si

si valor<0 entoncesescribir “El número es negativo”

si_noescribir “El número es cero”

fin_si

Alternativa Múltiple

− Por lo general en algunos casos es necesario que existan más de dos opciones posibles.− Esta estructura evaluará una expresión que podrá tomas n valores distintos, 1, 2, 3, …, n. Según

se elija uno de estos valores en la condición, se realizará una de las n acciones.

según_sea <expresión> hacercaso expresión_constante:

<acción c1>caso expresión_constante :

<acción c2>caso expresión_constante :

<acción c3>caso expresión_constante n:

<acción cn>en_otro_caso

fin_según<acción n+1>

Ejercicio: Desarrollar un pseudocódigo que solicite un valor del día entre 1 y 7 y se muestre el nombredel día

algoritmo NombresdeDiasvar

inicioentero : dia

fin

escribir “Ingrese un valor entre 1 y 7”leer diaseún_sea dia hacer

caso 1: escribir “Lunes”caso 2: escribir “Martes”caso 3: escribir “Miércoles”caso 4: escribir “Jueves”caso 5: escribir “Viernes”caso 6: escribir “Sábado”caso 7: escribir “Domingo”en_otro_caso: escribir “Error”

fin_segun

Estructura Repetitiva

− Las estructuras están especialmente diseñadas para todas aquellas aplicaciones en las cualesuna operación o conjunto de ellas deben repetirse muchas veces.

− Las computadoras están especialmente diseñadas para todas aquellas aplicaciones en las cualesuna operación o conjunto de ellas deben repetirse muchas veces.

5Ing. Roger Ernesto Alarcón García.

− Las estructuras que repiten una secuencia de instrucciones un número determinado de veces sedenominan bucles y se denomina iteración al hecho de repetir la ejecución de una secuencia deacciones.

Estructura desde/para

− Cuando se conoce de antemano el número de veces que se desean ejecutar las acciones de unbucle

− En estos casos el número de iteraciones es fijo− Se debe usar la estructura desde o para.

Sintaxis

desde v← vi hasta vf [incremento inc] hacer<acciones>…..

fin_desde

para v ← vi hasta vf [incremento inc] hacer<acciones>…..

fin_para

Ejemplo: Mostrar los primeros 5 números

algoritmo mostrarnumerosvar

Inicioentero : i

fin

para i← 1 hasta 5 hacerescribir “Número ”, i

fin_para

Ejemplo: Calcular la suma de 5 números ingresados por el usuarioalgoritmo sumadenumeros

var

InicioS ← 0

entero : N, S, i

fin

para i← 1 hasta 5 hacerescribir “Ingrese número”leer NS ← S + N

fin_paraescribir “La suma total es : “ , S

IT204 –Algorítmica y Programación

TEXTO INFORMATIVO

Estructuras Repetitivas

Estructuras Repetitivas Mientras

− Es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición.− Cuando se ejecuta la instrucción mientras, lo primero que sucede es que se evalúa la condición (unaexpresión booleana). Si se evalúa falsa, no se toma ninguna acción y el programa prosigue en lasiguiente instrucción del bucle. Si la expresión boolena es verdadera, entonces se ejecuta el cuerpodel bucle, después de lo cual se evalúa de nuevo la expresión booleana.

Sintaxis

mientras condicion haceraccion S1accion S2….accion Sn

fin_mientras

Ejercicios

Calcular la suma de N números ingresados por el usuarioalgoritmo sumadenumeros

var

inicioS ← 0i← 0

entero : N, S, num, i

fin

escribir “Ingrese cantidad de números: ”leer Nmientras i < N hacer

escribir “Ingrese número”leer numS ← S + numi← i + 1

fin_mientrasescribir “La suma total es : “ , S

Contar los números enteros positivos introducidos por teclado.algoritmo sumadenumeros

var

inicio

fin

entero : num, cont

cont ← 0escribir “Ingrese número”leer nummientras num > 0 hacer

cont ← cont + 1escribir “Ingrese número”leer num

fin_mientrasescribir “El número de enteros positivos es : “ , cont

2 Ing. Roger Ernesto Alarcón García.

IT204 –Algorítmica y Programación

Estructura repetitiva hacer-mientras

− Bucle post-test o bucles controlados por la salida.− Este bucle es análogo al bucle mientras y el cuerpo del bucle se ejecuta una y otra vez mientras lacondición es verdadera.

− Existe una gran diferencia y es que el cuerpo del bucle está encerrado entre las palabras reservadashacer y mientras de modo que las sentencias de dicho cuerpo se ejecutan, al menos una vez, antesde que se evalúe la expresión booleana.

Sintaxis

haceraccion S1accion S2….accion Sn

mientras condicion

Ejercicios

Leer por teclado una nota validadaalgoritmo validanota

var

iniciohacer

entero : nota

escribir “Ingrese nota”leer nota

fin

mientras (nota <0 or nota > 20)escribir “La nota es : “ , nota

Leer por el número del mesalgoritmo mes

var

iniciohacer

entero : mes

escribir “Ingrese mes”leer mes

fin

mientras (mes <1 or mes > 12)escribir “El mes es : “ , mes

Listado de Ejercicios

− Desarrollar un programa que calcule e imprima la suma de los N primeros número naturales.− Desarrollar un programa que dados como datos N números enteros, determine cuántos de ellosson pares y cuántos impares.

− Desarrollar un programa para obtener la tabla de multiplicar de un número entero k.− Desarrollar un programa que lea un número entero N y calcule el resultado de la siguiente serie

1 + ½ + 1/3 + ¼ + ……….. + 1/N− Dado el sueldo de N trabajadores, considere un aumento de 15% a cada uno de ellos, si susueldo es inferior a 800 soles. Imprima el sueldo con el aumento incluido.

Ing. Roger Ernesto Alarcón García. 3

IT204–Algorítmica y Programación

2 Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

VI. ANEXO: TEXTO INFORMATIVO

Diagramas de Flujo

Concepto

Un diagrama de flujo es una de las técnicas de representación de algoritmos. Es un diagrama que utilizalos símbolos estándar que se muestran a continuación y que tienen los pasos de algoritmos escritos enesas cajas unidad por fechas, denominadas líneas de flujo que indican la secuencia en que se debeejecutar.

Simbología

− Terminal (representa el inicio y el fin. Puederepresentarse también una parada o interrupciónprogramada que sea necesario realizar en elprograma.

− Entrada/Salida (cualquier tipo de introducción de datosen la memoria desde los periféricos)

− Proceso (cualquier tipo de operación que puedaoriginar cambio de valor, formato o posición de lainformación almacenada en memoria, operacionesaritméticas, de transferencia, etc.)

− Decisión (indica operaciones lógicas o decomparación entre datos –normalmente dos- y enfunción del resultado de la misma determina cuál de NOlos distintos caminos alternativos del programa sedebe seguir)

SI

− Decisión múltiple (en función del resultado de lacomparación se seguirá uno de los diferentes caminosde acuerdo con dicho resultado)

− Conector (sirve para enlazar dos partes cualesquierade un ordinograma a través de un conector en lasalida y otro conector en la entrada. Se refiere a laconexión en la misma página del diagrama)

− Indicador de dirección o línea de flujo (indica elsentido de ejecución de las operaciones)

− Conector (conexión entre dos puntos del organigramasituado en páginas diferentes)

3Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

− Llamada subrutina o a un proceso determinado (unasubrutina es un módulo independiente del programaprincipal, que recibe una entrada procedente de dichoprograma, realiza un tarea determinada y regresa, alterminar, al programa principal)

− Pantalla (se utiliza en ocasiones en lugar del símbolode E/S)

− Impresora (se utiliza en ocasiones en lugar delsímbolo de E/S)

− Teclado (se utiliza en ocasiones en lugar del símbolode E/S)

Ejemplo 01

algoritmo SumadeDosNumerosvar

entero : N1, N2, SInicio

inicio

fin

Leer N1,N2S ← N1 + N2Escribir “La suma es: ”, S

leer N1, N2

S← N1 + N2

escribir “La suma es: ”, S

fin

4 Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

Inicio

Ejercicio 02

algoritmo AreaCirculoconst

PI = 3.141592

PI ← 3.141592

var

inicio

fin

entero : R, A

Leer RA ← PI * R * REscribir “El área es: ”, A

leer R

A ← PI * R * R

escribir “El área es: ”, A

fin

Inicio

Ejercicio 03Determinar si una persona es adulta

algoritmo Edadesvar

escribir “Ingrese edad: ”

inicioentero : edad

escribir “Ingrese edad”leer edad

leer edad

si edad>=18 entoncesescribir “La persona es adulta”

finfin_si

edad >= 18

SI

escribir“La persona es adulta”

fin

5Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

Ejercicio 04Determinar si una persona es adulta o menor de edad

algoritmo Edadesvar

inicioentero : edad

escribir “Ingrese edad”leer edad

si edad>=18 entoncesescribir “La persona es adulta”

fin

si_no

fin_siescribir “La persona es menor de edad”

Inicio

escribir “Ingrese edad: ”

leer edad

NOedad >= 18

SI

escribir“La persona es

adulta”

escribir“La persona esmenor de edad”

fin

6 Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

Ejercicio 05Determinar si una valor entero ingresado es positivo, negativo o cero.algoritmo Numero

var

inicioentero : valor

escribir “Ingrese un valor entero”leer valorsi valor>0 entonces

escribir “El número es positivo”

fin

si_no

fin_si

si valor<0 entoncesescribir “El número es negativo”si_noescribir “El número es cero”fin_si

Inicio

escribir “Ingrese unvalor entero: ”

leer valor

NOValor > 0

SIescribir NO

“El número espositivo”

Valor < 0

SIescribir

“El número esnegativo”

escribir“El número es

cero”

fin

7Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

Ejercicio 06Desarrollar un pseudocódigo que solicite un valor del día entre 1 y 7 y se muestre el nombre del díaalgoritmo NombresdeDias

var

inicio

fin

entero : dia

escribir “Ingrese un valor entre 1 y 7”leer diaseún_sea dia hacer

caso 1: escribir “Lunes”caso 2: escribir “Martes”caso 3: escribir “Miércoles”caso 4: escribir “Jueves”caso 5: escribir “Viernes”caso 6: escribir “Sábado”caso 7: escribir “Domingo”en_otro_caso: escribir “Error”

fin_segun

Lista de ejercicios

− Calcule y escriba el cuadrado de un número.− Convertir una temperatura dada en grados Celsius a grados Farenheit (F=(9/5)C+32)− Determinar la hipotenusa de un triángulo rectángulo conocidas las longitudes de los catetos.− Calcular el área de un triángulo en función de las longitudes de sus lados.

( Area=raizcuadrada(p(p-a)(p-b)(p-c)), donde p = (a+b+c)/2 semiperímetro− Calcular el área de un triángulo en función de la base y la altura.− Calcular el salario de un trabajador conociendo la cantidad de días trabajados y el monto por día.

IT204–Algorítmica y Programación

Inicio

escribir “Ingreseun valor entre 1 y 7 : ”

leer dia

según sea dia

1 2 3 4 5 6 7 en otro caso

escribir“Lunes”

escribir“Martes”

escribir“Miércoles”

escribir“Jueves”

escribir“Viernes”

escribir“Sábado”

escribir“Domingo”

escribir“Error”

fin

IT204–Algorítmica y Programación

2 Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y Programación

VI. ANEXO: TEXTO INFORMATIVO

Estructura repetitiva Para

indices

acciones

Ejemplo 01

Mostrar los primeros 5 númerosalgoritmo mostrarnumeros

var

Inicio

fin

entero : i

para i← 1 hasta 5 hacerescribir “Número ”, i

fin_para

Inicio

i← 1 hasta 5

escribir “Numero ”, i

fin

2 Ing. Roger Ernesto Alarcón García.

Ejercicio 2

IT204–Algorítmica y Programación

Calcular la suma de 5 números ingresados por el usuarioalgoritmo sumadenumeros

var

InicioS ← 0

entero : N, S, i

fin

para i← 1 hasta 5 hacerescribir “Ingrese número”leer NS ← S + N

fin_paraescribir “La suma total es : “ , S

Inicio

S← 0

i← 1 hasta 5

escribir “ingrese numero ”

leer N

S← S + N

escribir “La suma total es: ”, S

fin

Estructura Repetitiva Mientras

NOcondicion

SI

acciones

3Ing. Roger Ernesto Alarcón García.

IT204–Algorítmica y ProgramaciónEjercicio 03Calcular la suma de N números ingresados por el usuario

algoritmo sumadenumerosvar

inicioS ← 0i← 0

entero : N, S, num, i

fin

escribir “Ingrese cantidad de números: ”leer Nmientras i < N hacer

escribir “Ingrese número”leer numS ← S + numi← i + 1

fin_mientrasescribir “La suma total es : “ , S

Inicio

S← 0i← 0

escribir “ingrese numero ”

leer N

NOi < N

SI

escribir “ingrese numero ”

leer num

S← S + numi← i + 1

escribir “La suma total es: ”, S

fin

Ejercicio 5

5Ing. Roger Ernesto Alarcón García.

Contar los números enteros positivos introducidos por teclado.

algoritmo sumadenumerosvar

inicio

fin

entero : num, cont

cont ← 0escribir “Ingrese número”leer nummientras num > 0 hacer

cont ← cont + 1escribir “Ingrese número”leer num

fin_mientrasescribir “El número de enteros positivos es : “ , cont

Inicio

cont ← 0

escribir “ingrese numero ”

leer num

NOnum > 0

SI

cont ← cont + 1

escribir “ingrese numero ”

leer num

escribir “el numero de enterosPositivos es: ”, cont

fin

6 Ing. Roger Ernesto Alarcón García.

Estructura repetitiva Hacer

acciones

NO

condicionSI

Ejercicio 05

Leer por teclado una nota validada

algoritmo validanotavar

iniciohacer

entero : nota

escribir “Ingrese nota”leer nota

fin

mientras (nota <0 or nota > 20)escribir “La nota es : “ , nota

Inicio

escribir “ingrese nota ”

leer nota

nota < 0 or nota > 20

escribir “La nota es: ”, nota

fin

7Ing. Roger Ernesto Alarcón García.

Ejercicio 06Leer por el número del mes

algoritmo mesvar

entero : mesinicio

hacerescribir “Ingrese mes”leer mes

fin

mientras (mes <1 or mes > 12)escribir “El mes es : “ , mes

Inicio

escribir “ingrese mes ”

leer mes

mes < 1 or mes > 12

escribir “El mes es: ”, mes

fin

Listado de Ejercicio

− Desarrollar un programa que calcule e imprima la suma de los N primeros número naturales.− Desarrollar un programa que dados como datos N números enteros, determine cuántos de ellos son

pares y cuántos impares.− Desarrollar un programa para obtener la tabla de multiplicar de un número entero k.− Desarrollar un programa que lea un número entero N y calcule el resultado de la siguiente serie

1 + ½ + 1/3 + ¼ + ……….. + 1/N− Dado el sueldo de N trabajadores, considere un aumento de 15% a cada uno de ellos, si su sueldo es

inferior a 800 soles. Imprima el sueldo con el aumento incluido.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

INTRODUCCIÓN A LA PROGRAMACIÓN EN CResumen recopilado por el docente

En este capítulo se brinda los conocimientos del entorno de trabajo del Turbo C y los conceptos básicosde la programación, su evolución y la sintaxis básica de la construcción de programas con este lenguaje.

HISTORIADennis Ritchie de AT&T Bell Laboratories inventó e implementó en 1972 el primer C en un DEC PDP-11que usaba el sistema operativo UNIX. El lenguaje C es el resultado de un proceso de desarrollo de unlenguaje llamado BCLP. Dicho lenguaje fue desarrollado en 1967 por Martín Richards con la idea deescribir software y compiladores en lenguaje ensamblador. A su vez el BCLP influyó en un lenguajellamado B que inventó Ken Thompson en 1970, este lenguaje surge para crear las primeras versiones delsistema operativo UNIX y se instaló en una máquina PDP-7, por los laboratorios BELL.

C surge de la necesidad de re-escribir el UNIX en un lenguaje de alto nivel, pero que algunosprocedimientos se manejaban a nivel ensamblador, es entonces cuando se comienza a desarrollar unlenguaje que solucionara dicho problema. C es un lenguaje de aplicación general que sirve para escribircualquier tipo de programa, pero su éxito y popularidad están íntimamente ligados al sistema operativoUNIX. Si se quiere dar mantenimiento a un sistema UNIX, es preciso emplear C.

C y Unix se acoplaron tan bien que pronto no sólo los programa de sistemas, sino casi todos losprogramas comerciales que se ejecutaban bajo UNIX se escribieron en C. Este lenguaje se volvió tanpopular que se escribieron versiones de él para otros sistemas operativos populares, así que su uso noestá limitado a las computadoras que utilizan UNIX.

El sistema operativo UNIX se inició en una DEC PDP-7, en los Laboratorios Bell durante 1969. En 1973,Ritchie y Thompson re-escribieron el kernel (núcleo) de UNIX en C, rompiendo así con la tradición de queel software de sistemas está escrito en lenguaje ensamblador. Hacia 1974 fue introducido en lasuniversidades “con fines educacionales” y al cabo de pocos años estaba ya disponible para usocomercial.

El UNIX es un sistema portable (se ejecutan en una extensa variedad de computadoras), flexible, potente,con entorno programable, multiusuario y multitarea.

C trabaja con tipos de datos que son directamente tratables por el hardware de la mayoría decomputadoras actuales, como son los caracteres, números y direcciones. Estos tipos de datos pueden sermanipulados por las operaciones aritméticas que proporcionan las computadoras. No proporcionamecanismos para tratar tipos de datos que no sean los básicos, debiendo ser el programador el que losdesarrolle. Esto permite que el código generado sea muy eficiente y de ahí el éxito que ha tenido comolenguaje de desarrollo de sistemas.

¿QUÉ ES UN PROGRAMA?Un programa en sentido informático está constituido por un conjunto de instrucciones que se ejecutan demodo secuencial, es decir, cada una a continuación de la anterior.

Análogamente a los datos que maneja, las instrucciones que un procesador digital es capaz de entenderestán constituidas por conjuntos de unos y ceros. A esto se le llama lenguaje de máquina o binario, y esmuy difícil de manejar. Por ello, desde casi los primeros años de los ordenadores, se comenzaron adesarrollar los llamaos lenguajes de alto nivel, que están mucho más cerca del lenguaje natural. Estoslenguajes están basados en el uso de identificadores, tanto para los datos como para los componenteselementales del programa, que en algunos lenguajes se llaman rutinas o procedimientos, y que en ellenguaje C se denominaba funciones.

LENGUAJES DE PROGRAMACIÓNLos lenguajes de alto nivel son más o menos comprensibles para el usuario, pero no para el procesador.Para que éste pueda ejecutarlos es necesario traducirlos a su propio lenguaje de máquina. Esta es unatarea que realiza un programa especial llamado compilador. Una de las ventajas más importantes de loslenguajes de alto nivel es la portabilidad de los ficheros fuentes resultantes. Quiere esto decir que unprograma desarrollado en un PC podrá ser ejecutado en un Macintosh o en una máquina UNIX, conmínimas modificaciones y una simple recompilación.

PALABRAS RESERVADASUna característica del Lenguaje C es que posee muy pocas palabras claves, todas estas palabras son escritas enminúsculas, en total son 32 las palabras que el Leguaje C las especifica como palabras reservadas.auto break case char const continue default dodouble else enum extern float for goto ifint long register return short signed sizeof staticstruct switch typedef union unsigner void volatile while

ESTRUCTURA GENERAL DE UN PROGRAMALos programas en C consisten en una o más funciones. La única función que debe estar absolutamente presente esla denominada main, siendo la primera función que es llamada cuando comienza la ejecución del programa. Aunquemain no forma parte del Lenguaje C, hay que tratarla como si lo fuera, pues si se emplea de otra manera,probablemente el compilador se confundirá.

La forma general de un programa en C es:

instrucciones del preprocesadordeclaraciones globales

tipo_devuelto main(lista de parámetros){

secuencia de sentencias}

tipo_devuelto funcion_1(lista de parámetros){

secuencia de sentencias}tipo_devuelto funcion_2(lista de parámetros){

secuencia de sentencias}….tipo_devuelto funcion_N(lista de parámetros){

secuencia de sentencias}El programa así escrito se denomina programa fuente y puede estar escrito en uno o varios ficheros.

Para que el programa pueda ser ejecutado se debe compilar y enlazar con todas aquellas funciones de la bibliotecaque se necesiten.

El proceso de compilar consiste en traducir el programa fuente a código o lenguaje máquina.

El proceso de linkaje (enlazado) consiste en añadir rutinas (propias o bibliotecas existentes) que también están encódigo máquina, es decir, están en objeto.

Una vez enlazado el programa objeto, tenemos un programa ejecutable (aplicación) que se puede ejecutar en elcomputador.

IDENTIFICADORESUn identificador es un nombre con el que se hace referencia a una función o al contenido de una zona de memoria.Cada lenguaje tiene sus propias reglas. En el Lenguaje C estas reglas son las siguientes:− Un identificador se forma con una secuencia de letras (minúsculas de la a a la z; mayúsculas de la A a la Z;

y dígitos del 0 al 9)− El carácter subrayado (_) se considera como una letra más.− Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los citados, como por

ejemplo (*; : +, etc).− El primer carácter de un identificador debe ser siempre una letra o un (_), es decir, no puede ser un dígito.− Se hace distinción entre letras mayúsculas y minúsculas. Esto quiere decir que Dato es considerado como

un identificador distinto de dato y de DATO.− No se pueden utilizar palabras reservadas como int, char o while.− Muchos compiladores no permiten contener caracteres españoles (acentos y eñes).− ANSI C permite definir identificadores de hasta 31 caracteres de longitud.

4 Ing. Roger Ernesto Alarcón García.

Es aconsejable seleccionar los nombres de las funciones y las variables de forma que permitan conocer a simplevista qué tipo de variables o funciones representan, utilizando para ello tantos caracteres como sean necesarios. Estosimplifica enormemente la tarea de programación y –sobre todo- de corrección y mantenimiento de los programas.

Ejemplos: LetraDatovalorinfopreciocantidad_cajasnota1

Ejemplos no válidos:123info // empieza con dígitosint // es una palabra reservadaUS$ // contiene el símbolo $var.nueva // contiene un puntonombre? // no puede ir signos de admiración o interrogación

COMENTARIOSNormalmente es recomendable incluir comentarios dentro del programa, esto permitirá que sea más entendible elprograma. Para el compilador, los comentarios son inexistentes, por lo que no generan líneas de código.

En el lenguaje C se toma como comentario todo carácter interno a los símbolos: /* */./* Aquí se escribe el comentario corto */

/*Esto es un comentarioque puede tener muchas líneas

*/

El lenguaje C permite también crear comentarios de una sola línea para lo cual se debe utilizar las //. Ejemplo:

// Esta línea es un comentario

TIPOS DE DATOSCuando en C, se dice que un objeto es de un tipo, se quiere decir que ese objeto pertenece a un conjunto específicode valores con los cuales se pueden realizar un conjunto de operaciones también determinadas.

Existen cinco tipos básicos: carácter, entero, como flotante, coma flotante de doble precisión y void.

Los demás tipos se basan en algunos de estos tipos básicos. El tamaño y el rango de estos tipos de datos varían concada tipo de procesador y con la implementación del compilador de C.

El tipo void, o bien declara explícitamente una función como que no devuelve valor alguno, o bien crea un punterogenérico.

Tipo Formato Tamaño en bits Rangochar %c 8 -127 a 127

unsigned char %u 8 0 a 255

signed char 8 -127 a 127

int %d, %i 16 -32767 s 32767

unsigned int %u 16 0 a 65535

signed int %d 16 -32767 a 32767

short int %d 16 -32767 a 32767unsigned short int %u 16 0 a 65535signed short int %d 16 -32767 a 32767

long int %ld 32 -2147483647 a 2147483647signed long int %ld 32 -2147483647 a 2147483647

unsigned long int %ld 32 0 a 4294967295float %f, %g, %e, %E 32 Seis dígitos de precisión

double %f, %g, %e, %E 64 Diez dígitos de precisiónlong double %f, %g, %e, %E 64 Diez dígitos de precisión

Ing. Roger Ernesto Alarcón García. 5

El lenguaje C utiliza unos tipos de elementos creados, como son las enumeraciones, estructuras, uniones y tiposdefinidos por el usuario.

CONSTANTES

Las constantes son expresiones con un significado invariable. La representación más simple de un concepto de estelenguaje son las constantes. Pueden ser:− Números enteros: Los dígitos se pueden escribir en notación decimal, octal (base 8) o en hexadecimal (base

16)− Números reales: Con parte decimal. Su formato es “signo dígitos e signo_exponente exponente marcador”.

El signo indica el signo de la mantisa. Dígitos indican una secuencia de números que pueden llevar un puntoseparando la parte entera y la decimal, e indica el comienzo del valor del exponente de base 10. Exponentees una constante entera decimal. Marcador es una (f o F) y/o (1 o L), donde las primeras indican unaconstante float y las segundas una doble precisión.

− Caracteres: Su forma es ‘carácter’ (carácter entre apóstrofos). El carácter puede ser escribible (esimprimible desde teclado) o de escape en los que hay que poner un carácter especial (\) para avisar alcompilador. Todos los caracteres escribibles se pueden poner en forma de escape con el código octalcorrespondiente (‘a’ es igual a ‘\141’). El carácter nulo (NULL) se puede representar como ‘\0’. Este carácteres puesto siempre por el compilador al final de cualquier cadena de caracteres.

− Cadenas de caracteres: es una secuencia de caracteres (escribibles o de escape) encerrada entre doblescomillas.

VARIABLES

Una variable es una posición de memoria con nombre que se usa para mantener un valor que puede ser modificadoen el programa. Todas las variables deben ser declaradas antes de poder usarlas. Una variable puede ser fijada auna constante con las sintaxis:

const tipo identificador = valor (Ejemplo : const int a = 100)Ejemplos de variables:

int dato; floatcosto; doubleprecio;

OPERADORESUn operador es un carácter o grupo de caracteres que actúa sobre una, dos o más variables para realizar unadeterminada operación con un determinado resultado.

En C existen muchos operadores de diversos tipos.

Operadores AritméticosEstos operadores son los más sencillos de entender y de utilizar. Todos ellos son operadores binarios.

Operadores matemáticosOperador Operación

+ Suma- Resta* Multiplicación/ División

% Módulo (residuo de la división entera)

Todos estos operadores se pueden aplicar a constantes, variables y expresiones. El resultado es el que se obtienede aplicar la operación correspondiente entre los dos operandos.

Operadores de asignación aritméticosOperador Operación

= Igual+= Suma igual-= Resta igual*= Multiplicación igual/= División igual

Estos resultan de la unión de los operadores aritméticos con el operador de asignación (=).

6 Ing. Roger Ernesto Alarcón García.

Estos operadores se aplican de la siguiente manera: ( x+= 5;), en este caso se toma el operando de la izquierda losuma con el operando de la derecha y los asigna al operando de la izquierda, para este caso la variable x. Elresultado seria el mismo si se escribe ( x = x + 5)

Operadores de Incremento y Decremento

Operador Operación++ Incremento- - Decremento

Son operadores unitarios de muy elevada prioridad y sirven para incrementar o decrementar una unidad el valor de lavariable a la que afectan.Ejemplo: si la variable x tiene como valor 5

x++;Esta instrucción modificará el valor de x a 6.

Operadores relacionalesOperador Operación

a < b a es menor que ba > b a es mayor que b

a == b a es igual a ba != b a es diferente a ba <= b a es menor o igual a ba >= b a es mayor o igual a b

Recordemos que estas operaciones nos dan resultados lógicos de 1 o 0 es decir valores de verdadero o falso; elLenguaje C considera todo valor no cero como un valor verdadero.

Operadores lógicosOperador Operación

&& And|| Or! Not

El lenguaje C proporciona operadores lógicos para combinar los resultados de varias condiciones. Una expresióncompuesta es aquella que utiliza operadores como estos y que se pueden evaluar para obtener un único resultado deverdadero o falso.

Los operadores and (&&) y or (||) son binarios.

Operadores de direcciónOperador Operación

* Operador de contenido de apuntado uoperador de indirección

& Operador de dirección

Jerarquía de OperadoresOperadores Unario/ Binario Comentario! & + - sizeof() Unario Operadores unarios

* / % Binario Multiplicador Aritmético+ - Binario Aditivos Aritméticos

< <= > >= Binario Operadores relacionales== != Binario Operadores de igualdad&& Binario Multiplicador lógico|| Binario Aditivo lógico= Binario Operador de asignación

DECLARACIONESLas declaraciones de objetos en C tienen como finalidad dar a conocer el tipo y propiedades de los identificadores.

En general la forma de una declaración es:

(durabilidad) tipo identificador (=expresión de inicialización);

Por ejemplo, static int b = 10;

Ing. Roger Ernesto Alarcón García. 7

Todas las variables deben ser declaradas. En las declaraciones es obligatorio especificar el tipo de dato.

De cada objeto en un programa en C se puede establecer tres propiedades que le afectan en su relación: el alcance,la visibilidad y la durabilidad.

AlcanceEl alcance sirve para saber en qué región del código una declaración de un objeto está activa, es decir, el objetoexiste.

Si la declaración es realizada en un bloque de código entre llaves, el alcance es la región que va entre las llaves. Sise declara en la parte de arriba del fichero (normalmente) o en una parte que no va entre llaves, el alcance seestablece en todo el fichero. Los identificadores establecidos con la sentencia #define tienen alcance durante todo elfichero o hasta que lo elimine la sentencia #undef. Las etiquetas de sentencia tienen como alcance el cuerpo de lafunción donde se han establecido.

VisibilidadLa visibilidad nos indica en qué región del código un objeto está activo. La diferencia con el alcance es que en unamisma región pueden estar dos objetos con el mismo identificador, ocultando un objeto a otro.

DurabilidadLa durabilidad es el tiempo de ejecución del programa donde el objeto existe en la memoria. La durabilidad puedeser:

− Estática: el objeto perdura desde la compilación hasta el final. Esta durabilidad la tienen todas las funcionesdeclaradas, las variables no declaradas en ningún cuerpo de función (incluido main) y las variablesdeclaradas con static.

− Local: El objeto es creado en la entrada de un bloque y es borrados a la salida. Esta durabilidad la tienen losargumentos formales y las variables declaradas con auto (es la declaración por defecto y no se sueleponer). Las variables declaradas en un bloque son a menos que se especifique) variables locales.

Existen otros dos tipos de durabilidad:

extern: los objetos especificados tienen durabilidad static e informa al enlazador de programas para que realice lasunificaciones pertinente entre ficheros. Es decir, convierten su alcance al total del programa. La declaración delmismo objeto en otros ficheros se toma como referencia y debe tener obligatoriamente el especificador extern. Si sepone un valor de inicialización, se debe inicializar en la declaración de la variable que no lleva extern.

register: se puede utilizar para variables locales y argumentos de funciones. Establece una durabilidad local peroinforma de un uso intensivo de memoria, haciendo que el compilador le asocie un acceso de memoria rápido.

SENTENCIASUna sentencia es cualquier expresión en C que se espera que tenga alguna consecuencia. Pueden ser asignaciones,operaciones, llamadas a funciones o combinaciones de ellas.

Toda sentencia termina con un punto y coma (;)

Ejemplo:monto = precio * cantidad ;

Este fue un ejemplo de sentencia simple.

Sentencia compuesta: Muchas veces es necesario poner varias sentencias en un lugar del programa donde deberíahaber una sola. Esto se realiza por medio de sentencias compuestas. Una sentencia compuesta es un conjunto dedeclaraciones y de sentencias agrupadas dentro de llaves { … } También se conocen con el nombre de bloques.Una sentencia compuesta puede incluir otras sentencias simples y compuestas.

Ejemplo:

{int i = 1; j = 3, k;double peso;

peso = 3.0;k = y * j;

}

8 Ing. Roger Ernesto Alarcón García.

Las sentencias compuestas se utilizarán con mucha frecuencia en el desarrollo de programas.

SENTENCIAS DE CONTROL DE FLUJO

Las sentencias en un programa en C se ejecutan secuencialmente, esto es, cada una a continuación de la anteriorempezando por la primera y acabando por la última. El lenguaje C dispone de varias sentencias para modificar esteflujo secuencial de ejecución. Las más utilizadas se agrupan en dos familias: las bifurcaciones, que permiten elegirentre dos o más opciones según ciertas condiciones, y los bucles, que permiten ejecutar repetidamente un conjuntode instrucciones tantas veces como se desee, cambiando o actualizando ciertos valores.

BIFURCACIONESEl operador condicional es un operador con tres operandos (ternario).Sintaxis:

expresión_1 ? expresión_2 : expresión_3

Donde se evalúa la expresión_1. Si el resultado de dicha evaluación es verdadero (diferente de cero), se ejecutaexpresión_2; si el resultado es falso, se ejecuta expresión_3.

Instrucción if

Esta sentencia de control permite ejecutar o no una sentencia según se cumpla o no una determinada condición.Sintaxis:

if (expresion){

sentencia(s)}

Se evalúa expresion. Si el resultado es verdadero, se ejecuta la sentencia o sentencias que están en el bloque. Si elresultado es falso simplemente continua con la siguiente línea de código.

Ejemplo:

#include <stdio.h>#include <conio.h>

void main(){

int edad;clrscr();printf(“Ingrese edad: “);scanf(“%d”, &edad);if (edad >= 18)

printf(“La persona es adulta”);getch();

}

Instrucción if … else

Esta sentencia de control permite realizar una bifurcación, ejecutando una parte u otra del programa según se cumplao no una cierta condición.

Sintaxis:if (expresion){

sentencia1(s)}else (expresion){

sentencia2(s)}

Se evalúa la expresion. Si el resultado es verdadero, se ejecuta las sentencias del primero bloque; si el resultado esfalso, se salta el primer bloque y se ejecuta lo que esta en el segundo bloque.

Ing. Roger Ernesto Alarcón García. 9

Ejemplo:

#include <stdio.h>#include <conio.h>

void main(){

int edad;clrscr();printf(“Ingrese edad: “);scanf(“%d”, &edad);if (edad >= 18)

printf(“La persona es adulta”);else

getch();}

printf(“La persona es menor de edad”);

Ejercicios a desarrollar

Calcule y escriba el cuadrado de un número.Convertir una temperatura dada en grados Celsius a grados Farenheit (F=(9/5)C+32)Determinar la hipotenusa de un triángulo rectángulo conocidas las longitudes de los catetos.Calcular el área de un triángulo en función de las longitudes de sus lados. ( Area=raizcuadrada(p(p-a)(p-b)(p-c)), donde p = (a+b+c)/2 semiperímetroCalcular el área de un triángulo en función de la base y la altura.Calcular el salario de un trabajador conociendo la cantidad de días trabajados y el monto por día.

Una agencia automotriz ofrece planes de crédito para la adquisición de los diferentes modelos deautomóviles. Si el automóvil vale más de $250,000.00 la agencia solicita un 35% de inicial y el resto debecubrirse en 24 mensualidades sin intereses. Si el automóvil tiene un valor máximo de $250,000.00 serequiere una inicial del 25% y el resto se debe pagar en 18 mensualidades sin intereses. La agencia deseasaber, en base al precio de un automóvil que un determinado cliente elija, cuál es el monto de la inicial; ycuál es el número y el monto de las mensualidades que éste debe cubrir.Determinar el menor de dos númerosDeterminar el mayor de dos números

2 Ing. Roger Ernesto Alarcón García.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

SENTENCIAS CONDICIONALES Y BUCLESResumen recopilado por el docente

Instrucción if … else Múltiple

Esta sentencia permite realizar una ramificación múltiple, ejecutando una entre varias partes del

programa según se cumpla una entre n condiciones.

Sintaxis:

if (expresion1)

Sentencia1(s)

else if (expresion2)

Sentencia2(s)

else if (expresion3)

Sentencia3(s)

else if (…)

….

[else

Sentencia_n(s) ]

Se evalúa expresion1. Si el resultado es verdadero, se ejecuta sentencia1. Si el resultado es falso, se

salta sentencia1 y se evalúa expresion2. Si el resultado es verdadero se ejecuta sentencia2, mientras

que si es falso se evalúa expresion3 y así sucesivamente. Si ninguna de las expresiones o condiciones

es verdadera se ejecuta expresión_n que es opción por defecto.

Ejemplo:

#include <stdio.h>#include <conio.h>

void main(){

int valor;clrscr();printf(“Ingrese un valor entero: ”);scanf(“%d”, &valor);if (valor>0)printf(“El número es positivo”);

else{

Ing. Roger Ernesto Alarcón García. 3

if (valor<0)printf(“El número es negativo”);

elseprintf(“El número es cero”);

}getch();

}

Instrucción switch

Permite realizar una función similar a la de la sentencia if … else con múltiples ramificaciones, aunque

como se puede ver presenta también importantes diferencias.

Sintaxis:

switch (expresion)

{

case expresión_cte_1:

sentencia1(s)

break;

case expresión_cte_2:

sentencia2(s)

break;

....

case expresión_cte_n:

sentencia_n(s)

[default:

sentencia(s) ]

}

Se evalúa expresion y se considera el resultado de dicha evaluación. Si dicho resultado coincide con el

valor constante expresión_cte_1, se ejecuta el bloque sentencia1 y luego continua con las líneas

posteriores al switch. Si el resultado coincide con el valor constante expresión_cte_2, se ejecuta el

bloque sentencia2 y luego continua con las líneas posteriores al switch. La sentencia break permite salir

del switch.

Ejemplo:

4 Ing. Roger Ernesto Alarcón García.

#include <stdio.h>

#include <conio.h>

void main()

{

int dia;

clrscr();

printf(“Ingrese un valor entre 1 y 7”);

scanf(“%d”, &dia);

switch( dia )

{

case 1: printf(“Lunes”);

break;

case 2: printf(“Martes”);

break;

case 3: printf(“Miércoles”);

break;

case 4: printf(“Jueves”);

break;

case 5: printf(“Viernes”);

break;

case 6: printf( “Sábado”);

break;

case 7: printf(“Domingo”);

break;

default:

}

printf(“Error”);

getch();

}

SENTENCIAS REPETITIVAS

Además de bifurcaciones, en el lenguaje C existen también varias sentencias que permiten repetir una

seri de veces la ejecución de unas líneas de código. Esta repetición se realiza, bien un numero

determinado de veces, bien hasta que se cumpla una determinada condición de tipo lógico o aritmético.

De modo genérico, a estas sentencias se les denomina bucles. Las tres instrucciones del Lenguaje C

para realizar bucles son el for, while y do … while.

Ing. Roger Ernesto Alarcón García. 5

Instrucción for

Esta instrucción es el tipo de bucle más versátil y utilizado en el Lenguaje C.

Sintaxis:

for ( inicialización; expresión_de_control; incremento)

{

sentencia(s)

}

Antes de empezar el bucle se ejecuta la inicialización, que es una o más sentencias que asignan valores

iniciales a viertas variables o contadores. A continuación se evalúa expresión_de_control y si el

resultado es falso se prosigue con la instrucciones fuera del bucle, si el resultado es verdadero entonces

se ejecuta las sentencia o sentencias del bloque y luego se incrementa el valor de la variable de control y

se vuelve a evaluar la expresión_de_control. El proceso prosigue hasta que la expresión_de_control

sea falsa.

Ejemplo 01:

#include <stdio.h>

#include <conio.h>

void main()

{

int i;

clrscr();

for( i=1; i<=5; i++)

printf(“Número %d\n”, i);

getch();

}

Ejemplo 02:

#include <stdio.h>

#include <conio.h>

void main()

{

int i, S, N;

6 Ing. Roger Ernesto Alarcón García.

clrscr();

S = 0;

for( i=1; i<=5; i++)

{

printf(“Ingrese Número :”);

scanf(“%d”,&N);

S = S + N;

}

printf(“La suma total es : %d”, S);

getch();

}

Ejercicios

Crear un programa que solicite los valores de P y Q y determine si satisfacen la siguiente

expresión: P2 + Q4 + 2P2 < 680

Hallar las raíces de la ecuación de segundo grado : ax2 + bx + c

Crear un programa que permita solicitar el sueldo de un trabajador y calcule su aumento, según

el siguiente criterio:

Sueldo < 1000 entonces aumento 25%

1000<=Sueldo<= 1500 entonces aumento 21%

Sueldo > 1500 entonces aumento 18%

Desarrollar un programa que dado como dato el valor de Y, calcule el resultado de la siguiente

expresión:

F(x) = 3Y + 36 si 0 < Y <= 11

F(x) = Y2 - 10 si 11 < Y <= 33

F(x) = Y3 + Y2 - 1 si 33 < Y <= 64

F(x) = 3Y + 36 para cualquier otro valor de Y

Construir un programa que calcule e imprima la suma de los N primeros números naturales.

Calcular el promedio de las evaluaciones de un grupo de alumnos en un examen.

Construir un programa que dados 250 números enteros, obtenga la suma de los números

impares y el promedio de los numero pares.

Construir un programa que permita obtener la suma e imprima los términos de la siguiente serie:

2, 5, 7, 10, 12, 15, 17, …….., 1800

Construir un programa que solicite la altura y el peso de N personas, y obtenga el promedio del

peso y la altura.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

ESTRUCTURAS REPETITIVASResumen recopilado por el docente

Instrucción while

Esta sentencia permite ejecutar repetidamente, mientras se cumpla una determinada condición, una

sentencia o bloque de sentencias.

Sintaxis:

while (expresion_control)

{

sentencia(s)

}

Se evalúa la expresión_control y si el resultado es verdadero entonces ejecuta las sentencias o el

bloque de sentencias que contiene, si el resultado es falso se salta las sentencias y prosigue con la

siguiente línea de código.

Ejemplo 01:

#include <stdio.h>#include <conio.h>

void main(){

int i, S, N, num;clrscr();S = 0;i = 0;printf(“ingrese cantidad de números:”);scanf(“%d”, &N);while( i<N ){

printf(“Ingrese Número :”);scanf(“%d”,&num);S = S + num;i = i +1;

}printf(“La suma total es : %d”, S);getch();

}

Ejemplo 02:

#include <stdio.h>#include <conio.h>

void main(){

2 Ing. Roger Ernesto Alarcón García.

int num, cont;clrscr();cont = 0;printf(“Ingrese número : ”);scanf(“%d”, &num);while( num>0 ){

cont++;printf(“Ingrese Número :”);scanf(“%d”, &num);

}printf(“El numero de enteros positivos es : %d”, cont);getch();

}

Instrucción do … while

Esta sentencia funciona de modo análogo a while, con la diferencia de que la evaluación de

expresión_control se realiza al final del bucle, después de haber ejecutado al menos una vez las

sentencias entre llaves; éstas se vuelven a ejecutar mientras expresión_control sea verdadera.

Sintaxis:

do{

sentencia(s);

}while(expresión_control);

Donde sentencia puede ser una única sentencia o un bloque, y en la que debemos observar que hay que

colocar punto y coma (;) a continuación del paréntesis que encierra a expresión_control.

Ejemplo#include <stdio.h>#include <conio.h>

void main(){

int nota;clrscr();do{

printf(“Ingrese nota :”);scanf(“%d”, &nota);

}while( nota < 0 || nota > 20);printf(“La nota es : %d”, nota);getch();

}

Ejemplo 02:

#include <stdio.h>#include <conio.h>

Ing. Roger Ernesto Alarcón García. 3

void main(){

int mes;clrscr();do{

printf(“Ingrese mes :”);scanf(“%d”, &mes);

}while( mes < 1 || mes > 12);printf(“El mes es : %d”, mes);getch();

}

Instrucción break, continue, goto

La instrucción break interrumpe la ejecución del bucle donde se ha incluido, haciendo al programa salir

de él aunque la expresión_control correspondiente a ese bucle sea verdadera.

La sentencia continue hace que el programa comience el siguiente ciclo del bucle donde se halla,

aunque no haya llegado al final de las sentencias compuestas o bloque.

La sentencia goto etiqueta hace saltar al programa a la sentencia donde se haya escrito la etiqueta

correspondiente.

Ejercicios a Desarrollar

Desarrollar un programa que calcule e imprima la suma de los N primeros número naturales.

Desarrollar un programa que dados como datos N números enteros, determine cuántos de ellos

son pares y cuántos impares.

Desarrollar un programa para obtener la tabla de multiplicar de un número entero k.

Desarrollar un programa que lea un número entero N y calcule el resultado de la siguiente serie

1 + ½ + 1/3 + ¼ + ……….. + 1/N

Dado el sueldo de N trabajadores, considere un aumento de 15% a cada uno de ellos, si su

sueldo es inferior a 800 soles. Imprima el sueldo con el aumento incluido.

4 Ing. Roger Ernesto Alarcón García.

2 Ing. Roger Ernesto Alarcón García.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

Manipulación de ArreglosResumen recopilado por el docente

En este capítulo se describirán las herramientas que proporciona el lenguaje C para trabajar con tipos y

estructuras de datos, flexibilizando de esta forma la creación de programas por parte del programador.

VECTORES

Un vector es una porción de memoria que es utilizada para almacenar un grupo de elementos del mismo

tipo y se diferencian en base al índice, todos tienen el mismo nombre o identificador.

Sintaxis:

tipo nombre [ cantidad_elementos ];

Los elementos se numeran desde el 0 hasta (cantidad_elementos -1). El tamaño de un vector puede

definirse con cualquier expresión constante entera. En C no se puede operar con todo un vector o toda

una matriz como una única entidad, sino que hay que tratar sus elementos uno a uno. Los elementos de

un vector se utilizan en expresiones de C como cualquier otra variable.

Ejemplo:

double datos[20];

Se reserva un espacio para 20 valores de tipo double. El acceso a un elemento del arreglo es de la

siguiente forma.

datos[0] = 25;

Ejemplo 01:

#include <stdio.h>void main(){int numero[5]; /* Un array de 5 números enteros */int suma; /* Un entero que será la suma */

numero[0] = 200; /* Les damos valores */numero[1] = 150;numero[2] = 100;numero[3] = -50;numero[4] = 300;suma = numero[0] + numero[1] + numero[2] + numero[3] + numero[4]; /* Y hallamos la suma */

printf("Su suma es %d", suma);}

3Ing. Roger Ernesto Alarcón García.

Ejemplo 02:

#include <stdio.h>#include <conio.h>

void main(){int notas[5]; // Un array de 5 valores enterosint suma=0; // Un entero que será la sumaint i; // Variable que sirve para el bucle

//lectura de las notasfor( i=0; i<5; i++){

printf(“Ingrese nota %d”, i+1);scanf(“%d”, &notas[i] );

}//mostrando y calculando la suma

for( i=0; i<5; i++){

printf(“Nota %d : %d”, i+1, notas[i] );suma+= notas[i];

}

//calculando y mostrando el promedioprintf(“El promedio es : %d”, suma / 5 );getch():

}

Ejercicio Mejorado

#include <stdio.h>#include <conio.h>#define MAX 5void main(){int notas[MAX]; // Un array de 5 valores enterosfloat suma=0.0; // Un entero que será la sumaint i; // Variable que sirve para el bucle

//lectura de las notasfor( i=0; i<MAX; i++)

{do{

printf(“Ingrese nota %d”, i+1);scanf(“%d”, &notas[i] );

}while(notas[i]<0 || notas[i]>20);}

//mostrando y calculando la sumafor( i=0; i<MAX; i++){

printf(“Nota %d : %d”, i+1, notas[i] );suma+= notas[i];

}

//calculando y mostrando el promedio

4 Ing. Roger Ernesto Alarcón García.

printf(“El promedio es : %f”, suma / MAX );getch():}

Ordenación de los elementos de un arreglo.

Para realizar ordenación se debe utilizar el método de la burbuja que es el más práctico y conocido portodos.

Sintaxis

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

if(datos[ i ] > datos[ j ]){

aux = datos[ i ];datos[ i ]= datos[ j ];datos[ j ]= aux;

}}

El método de la burbuja se basa en dos bucles uno dentro de otro, el primero va del índice 0 al índice quecorresponde con la cantidad total de elementos menos uno, y el bucle interno comienza con el valor de imas uno hasta el numero total de elementos. Internamente se evalúa una condición que permite realizarel ordenamiento ya sea ascendente o descendente, para esto se aplica una condición. En la sintaxisanterior se expresa: if(datos[ i ] > datos[ j ]) por lo tanto lo que se esta ordenando es en formaascendente.

Ejemplo

#include <stdio.h>#include <conio.h>

#define MAX 5

void main(){int notas[MAX]; // Un array de 5 valores enterosint i, j; // Variable que sirve para el ordenamientoint aux; // variable que sirve para el intercambio

//lectura de las notasfor( i=0; i<MAX; i++)

{do{

printf(“Ingrese nota %d”, i+1);scanf(“%d”, &notas[i] );

}while(notas[i]<0 || notas[i]>20);}

//mostrando sin ordenarfor( i=0; i<MAX; i++){

}getch();

printf(“Nota %d : %d”, i+1, notas[i] );

5Ing. Roger Ernesto Alarcón García.

// ordenandofor( i=0; i<MAX-1; i++){

for( j= i+1; i<MAX; j++){

if(datos[ i ] > datos[ j ]){

aux = datos[ i ];datos[ i ]= datos[ j ];datos[ j ]= aux;

}}

}

//mostrando los datos nuevamente pero ya aparecerían ordenadosfor( i=0; i<MAX; i++){

}getch():

}

printf(“Nota %d : %d”, i+1, notas[i] );

Búsqueda

La búsqueda consiste en tratar de encontrar un valor determinado en el arreglo, lógicamente que puedeexistir el dato buscado o simplemente no existir dentro del arreglo.

El proceso es simplemente recorrer el arreglo mediante un bucle e ir condicionando si el dato que seencuentra en el índice que se esta analizando coincide con el dato buscado entonces se almacena enuna variable auxiliar la posición donde se encontró el dato.

Crear un programa que permita registrar 15 numero y busque dentro de estos al numero 33.

#include <stdio.h>#include <conio.h>

#define MAX 15

void main(){int datos[MAX]; // Un array de 15 valores enterosint i; // Variable que sirve para el recorrido del arregloint pos; // variable que sirve para en el guardar la posición del elemento encontrado

//lectura de los datosfor( i=0; i<MAX; i++)

{printf(“Ingrese valor %d”, i+1);scanf(“%d”, &datos[ i ] );

}

//mostrando los datos

6 Ing. Roger Ernesto Alarcón García.

clrscr();for( i=0; i<MAX; i++){

}getch();

printf(“Dato %d : %d”, i+1, datos[ i ] );

// buscandopos = -1;for( i=0; i<MAX; i++){

if(datos[ i ] = 33 ){

pos = i;break;

}}

if ( pos != -1 )printf(“El dato se encontró en la posición: %d” , pos);

else

getch():}

printf(“No se encontró el dato dentro del arreglo”);

Ejercicios

Crear un arreglo que permita registrar la evaluación en un examen de un grupo de 20estudiantes, y determine cual es el estudiante que obtuvo la mas baja nota.Crear un arreglo y almacenar los sueldos de 50 empleados, luego mostrar la informaciónordenada descendentemente.Crear un arreglo y almacenar 35 números enteros, luego determinar cuantos de estos sonpositivos y cuantos son negativos.Crear un arreglo en el que se almacene el total de la venta producida mensualmente del año2008. Y determine en que mes se realizó la mayor venta.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

MatricesResumen recopilado por el docente

Se declaran de forma análoga a los arreglos, con corchetes independientes para cada subíndice.

Sintaxis:

Tipo_de_dato nombredelaMatriz [numero_filas] [numero_columnas];

Donde tanto las filas como las columnas se numeran también a partir de 0. La forma de acceder a los

elementos de la matriz es utilizando su nombre, seguido de las expresiones enteras correspondientes a

los dos subíndices, entre corchetes.

En C tanto los vectores como las matrices admiten los tipos de las variables escalares (char, int, long,

float, double, etc).

Las matrices en C se almacenan por filas, en posiciones consecutivas de memoria. En cierta forma, una

matriz se puede ver como un vector de vectores-fila. Si una matriz tiene N filas (numeradas de 0 a N-1) y

M columnas (numeradas de 0 a M-1), el elemento (i , j) ocupa el lugar:

Posición_elemento (0,0) + i * M + j

A esta formula se le llama formula de direccionamiento de la matriz.

Ejemplo de matrices:int Datos[ 3 ][ 4 ]

0 1 2 3012

En cada posición se puede almacenar un valor entero, pero para especificar una celda tengo que hacerreferencia a la fila y a la columna en la que me debo posicionar.Por ejemplo si quisiera asignarle el valor 20 a la celda ubicada en la fila 0 y columna 0 se deberáexpresar:

Datos [ 0 ] [ 0 ] = 20;Si fuera el caso de solicitarle al usuario un valor en la posición de índices (1,1) entonces la sintaxis enLenguaje C sería:

scanf(“%d”, &Datos[ 1 ][ 1 ]);

Ejercicio 01Implementar un programa que permita solicitar los datos de una matriz de enteros del orden 2x2 ymuestra en pantalla dicha matriz.

#include <stdio.h>#include <conio.h>void main(){int numeros[ 2 ][ 2 ];int i, j ;

/* Lectura de los valores de la Matriz*/clrscr();for( i = 0; i<2; i ++)

for( j = 0; j<2 ; j++){

printf(”Ingrese valor [%d][%d] : ”, i+1, j+1);

2 Ing. Roger Ernesto Alarcón García.

scanf(”%d”, numeros[ i ][ j ] );}

/* Mostrando los valores de la matriz */clrscr();for( i = 0; i<2; i ++){

for( j = 0; j<2; j++)printf(”%d\t”, numeros[ i ][ j ] );

printf (”\n”);}

getch();}

Ahora utilizaremos las declaraciones #define para especificar las cantidades para cada una de lasdimensiones (FIL = filas y COL = columnas) que tendrá la matriz, con esto se mejora la programación yaque fácilmente puedo variar los valores de las filas y las columnas de la matriz sin realizar demasiadoscambios en el programa.

#include <stdio.h>#include <conio.h>#define FIL 2#define COL 2void main(){int numeros[ FIL ][ COL ];int i, j ;

/* Lectura de los valores de la Matriz*/clrscr();for( i = 0; i<FIL; i ++)

for( j = 0; j<COL ; j++){

printf(”Ingrese valor [%d][%d] : ”, i+1, j+1);scanf(”%d”, numeros[ i ][ j ] );

}

/* Mostrando los valores de la matriz */clrscr();for( i = 0; i<FIL; i ++){

for( j = 0; j<COL; j++)printf(”%d\t”, numeros[ i ][ j ] );

printf (”\n”);}

getch();}

Ejercicio 02Implementar un programa que permita solicitar los datos de dos matrices de enteros del orden 4x3 ymuestra en pantalla la suma de dichas matrices.

#include <stdio.h>#include <conio.h>#define FIL 4#define COL 3void main(){int matrizA[ FIL ][ COL ];int matrizB[ FIL ][ COL ];

Ing. Roger Ernesto Alarcón García. 3

int matrizRes[ FIL ][ COL ];int i, j ;

/* Lectura de la primera Matriz*/clrscr();printf(”Ingresando los datos de la primera matriz\n”);for( i = 0; i<FIL; i ++)

for( j = 0; j<COL ; j++){

printf(”Ingrese valor [%d][%d] : ”, i+1, j+1);scanf(”%d”, matrizA[ i ][ j ] );

}

/* Lectura de la segunda Matriz*/clrscr();printf(”Ingresando los datos de la segunda matriz\n”);for( i = 0; i<FIL; i ++)

for( j = 0; j<COL ; j++){

printf(”Ingrese valor [%d][%d] : ”, i+1, j+1);scanf(”%d”, matrizB[ i ][ j ] );

}

// Sumando ambas matricesfor( i = 0; i<FIL; i ++)

for( j = 0; j<COL ; j++)matrizRes[ i ][ j ] = matrizA[ i ][ j ] + matrizB[ i ][ j ];

/* Mostrando los valores de la matriz resultante*/clrscr();for( i = 0; i<FIL; i ++){

for( j = 0; j<COL; j++)printf(”%d\t”, matrizRes[ i ][ j ] );

printf (”\n”);}

getch();}

Ejercicios Planteados

1. Desarrollar un programa que lea una matriz cuadrada de tamaño 3 y determine si se tratade una matriz simétrica o no. Una matriz es simétrica si los valores de cada fila soniguales los de su columna correspondiente; por ejemplo la siguiente matriz es simétrica:

1 4 74 2 97 9 3

2. Elabore un programa que lea los datos de una matriz cuadrada de tamaño 6 y realice lassiguientes operaciones:a) Imprima la suma de los elementos de la diagonal principalb) Imprima cuántos "0" hay en la matrizc) Imprima el número mayor de la matriz

4 Ing. Roger Ernesto Alarcón García.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

INTRODUCCIÓN A LA CONSTRUCCIÓN DE FUNCIONESResumen recopilado por el docente

En esta sesión se aplican los conceptos de modularización que no es más que dividir el programa envarios procesos que hacen una determinada acción. A esto se le conoce en el lenguaje c como lacreación de funciones.

Una función es una parte de código independiente del programa principal y de otras funciones, que puedeser llamada enviándole unos datos o no, para que realice una determinada tarea y/o proporcione unosresultados. Las funciones son una parte muy importante del Lenguaje C.

UTILIDADParte esencial del correcto diseño de un programa de ordenador es su modularidad, esto es su divisiónen partes más pequeñas de finalidad muy concreta, que en C reciben el nombre de funciones. Lasfunciones facilitan el desarrollo y mantenimiento de los programa, evitan errores, y ahorran memoria ytrabajo innecesario. Una misma función puede ser una parte de código independiente del programaprincipal y de otras funciones, manteniendo una gran independencia entre las variables respectivas, yevitando errores y otros efectos colaterales de las modificaciones que se introduzcan.

DEFINICIÓNLa definición de una función consiste en la definición del código necesario para que ésta realice las

tareas para las que ha sido prevista. La definición de una función se debe realizar en alguno de losficheros que forman parte del programa.

Sintaxis:

tipo_valor_retorno nombre_funcion ( lista de parámetros )

{

declaración de variables

sentencia(s)

return expresión;

}

Donde el tipo_valor_retorno es el tipo de valor que devuelve la sentencia return de la función. El valorpuede ser cualquier tipo válido; si no se especifica alguno, se asume un resultado entero.

La lista de parámetros es la lista de nombres de variables separados por comas con sus tipos asociadosque recibe los valores de los argumentos cuando se llama a la función. Una función puede no tenerparámetros, en cuyo caso la lista de parámetros está vacía; sin embargo, los paréntesis son necesarios.

LLAMADAS A FUNCIONLas funciones son llamadas para su ejecución desde cualquier parte del código, teniendo en cuenta queantes deben haber sido declaradas (y por supuesto definidas).

La llamada de una función se produce mediante el uso de su nombre en una sentencia, pasando una listade argumentos que deben coincidir en número y tipo con los especificados en la declaración (en otrocaso se producirá una conversión de tipos o resultados inesperados)

Llamadas por valor y por referenciaEn general, se pueden pasar argumentos a las funciones de dos formas, por valor y por referencia.

La llamada por valor copia el valor de un argumento en el parámetro formal de la función. De esta forma,los cambios en los parámetros de la función no afectan a las variables que se usan en la llamada (es la

2 Ing. Roger Ernesto Alarcón García.

llamada más usual, es decir, en general no se pueden alterar las variables usadas para llamar a lafunción).

La llamada por referencia copia la dirección del argumento en el parámetro. Dentro de la función se usala dirección para acceder al argumento usado, significando que los cambios hechos a los parámetrosafectan a la variable usada en la llamada.

Es posible simular una llamada por referencia pasando un puntero al argumento, entonces al pasar ladirección, es posible cambiar el valor de la variable usada en la llamada.

#include <stdio.h>

#include <conio.h>

int mul(int a, int b)

{

return a*b;

}

void main()

{

int x, y, z;

x = 12;

y = 60;

z = mul(x, y);

printf(”El valor de Z es %d”, z);

getch();

}

Programa que obtiene el factorial de un número haciendo uso de funciones.

#include <stdio.h>

#include <conio.h>

double factorial(int num)

{

double f=1.0;

for(int i=1; i<=num; i++)

f *= i;

return f;

}

void main()

{

int num;

double res;

Ing. Roger Ernesto Alarcón García. 3

clrscr() ;

printf(”Ingrese el valor del numero: ”) ;

scanf(“%d” , &num);

res = factorial(num);

printf(”El valor del factorial de %d es %ld”, num, res);

getch();

}

Programa que calcula el promedio de 10 notas ingresadas por el usuario.

#include <stdio.h>

#include <conio.h>

int leernumero(int min, int max)

{

int dato;

do{

printf(”ingrese valor: ”);

scanf(”%d”, &dato);

}while( ! (dato>=min && dato<=max) );

return dato;

}

void main()

{

int nota, S=0;

float prom;

clrscr();

for(int i=1; i<=10; i++)

{

printf(”Ingrese nota %d : ”, i) ;

nota =leernumero(0,20);

S += nota;

}

printf(”El promedio es %f”, S/10.0);

getch();

}

4 Ing. Roger Ernesto Alarcón García.

2 Ing. Roger Ernesto Alarcón García.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

LIBRERÍA DE FUNCIONES EN LENGUAJE CResumen recopilado por el docente

El Lenguaje C brinda un conjunto de librerías que permiten al programador utilizar funciones, tipos relacionados ymacros ya prediseñadas por el lenguaje.

Todas las librerías son declaradas en un fichero cabecera. Para que sea visible al programa, se añade el comandodel preprocesador #include. Por ejemplo:

#include <stddef.h>

Se describe a continuación un conjunto de librerías estándar y funciones básica que todo programador debe deconocer al empezar a programar en Lenguaje C.

Librería Descripciónassert.h Contiene una macro para el diagnóstico dentro de los programas.ctype.h Contiene varias funciones para comprobación de tipos y transformación de caracteres.errno.h Contiene varias macros usadas para informar de errores.limits.h Contienen varias macros que definen constantes para el tamaño de tipo enteros.float.h Contienen varias macros que definen constantes para el tamaño de tipo fllotante.locale.h Contiene varias macros, funciones y tipos para unidades locales, como unidad monetaria,

tiempo, dígitos, etc.math.h Contiene una macro y varias funciones matemáticas.stddef.h Contiene varios tipos y macros que también están definidas en otras librerías, como size_t.stdio.h Contiene tipos, macros y funciones para la realización de tareas de E/S.stdlib.h Contiene tipos, macros y funciones para la conversión numérica, generación de números

aleatorios, búsquedas y ordenación, gestión de memoria y tareas similares.string.h Contiene tipos, macros y funciones para la manipulación de cadenas de caracteres.time.h Contiene tipos, macros y funciones para la manipulación de información sobre fechas y

horas.

Librería: math.hContiene la declaración de algunas funciones para realizar operaciones matemáticas comunes sobre valores de tipo"double".

Una excepción por error de dominio ocurre cuando la función no está definida para el valor o valores de susargumentos. La función informa almacenando el valor "EDOM" en "errno" y devolviendo un valor peculiar propio decada implementación.

Una excepción por error de rango ocurre cuando el valor de la función está definido pero no puede ser representadopor un valor de tipo "double". La función informa almacenando el valor "ERANGE" en "errno" y devolviendo uno delos siguientes valores: "HUGE_VAL" si el valor es positivo y demasiado grande, "0" si el valor es demasiado pequeñopara ser representado, "-HUGE_VAL" si el valor es negativo y con valor absoluto demasiado grande.

HUGE_VAL#define HUGE_VAL <valor_double>Valor devuelto por algunas funciones debido a un error de rango, que puede ser una representación de infinitud.

acosdouble acos (double x);Angulo cuyo coseno es "x", en el rango [0,p] radianes.

asindouble asin (double x);Angulo cuyo seno es "x", en el rango [-p/2, +p/2] radianes.

atandouble atan (double x);Angulo cuya tangente es "x", en el rango [-p/2, +p/2] radianes.

atan2double atan2 (double y, double x);

Ing. Roger Ernesto Alarcón García. 3

Angulo cuya tangente es "y/x", en el rango [-p, +p] radianes.

ceildouble ceil (double x);Valor entero más pequeño no menor que "x".

cosdouble cos (double x);Coseno de "x" (en radianes).

coshdouble cosh (double x);Coseno hiperbólico de "x".

expdouble exp (double x);Exponencial de "x", ex.

fabsdouble fabs (double x);Valor absoluto de "x", "|x|".

floordouble floor (double x);Mayor valor entero menor que "x".

fmoddouble fmod (double x, double y);Resto de "x/y", el cual es "x-i*y" para algún entero "i", tal que "i*y<x<(i+1)*y". Si "y" es cero, la función o informa de unerror de dominio o simplemente devuelve el valor 0.

frexpdouble frexp (double x, int *pexp);Determina una fracción "f" y un entero "i" en base 2 que representa el valor de "x". Devuelve el valor "f" y almacena elentero "i" en "*pexp" tal que "f" está en el intervalo [1/2, 1) o tiene el valor 0, y "x" se iguala a "f*(2i)". Si "x" es 0,"*pexp" es también 0.

ldexpdouble ldexp (double x, int exponente);Devuelve "x*2exponente".

logdouble log (double x);Devuelve el logaritmo natural de "x".

log10double log10 (double x);Devuelve el logaritmo en base 10 de "x".

modfdouble modf (double x, double *pint);Determina un entero "i" más una fracción "f" que representan el valor de "x". Devuelve el valor "f" y almacena elentero "i" en "*pint", tal que "f+i" se iguala a "x", "|f|" está en el intervalo [0,1), y tanto "f" como "i" tienen el mismosigno que "x".

powdouble pow (double x, double y);Devuelve "x" elevado a la potencia "y".

sindouble sin (double x);Devuelve el seno de "x" (en radianes).

sinhdouble sinh (double x);Devuelve el seno hiperbólico de "x".

4 Ing. Roger Ernesto Alarcón García.

sqrtdouble sqrt (double x);Devuelve la raíz cuadrada de "x".

tandouble tan (double x);Devuelve la tangente de "x" (en radianes).

tanhdouble tanh (double x);Devuelve la tangente hiperbólica de "x".

Librería : stdio.h

Incluye macros y funciones para realizar operaciones de entrada y salida sobre ficheros y flujos de datos.

_IOFBF#define _IOFBF <expresion constante entera>Valor del argumento "modo" para "setvbuf" para indicar "buffer" completo.

_IOLBF#define _IOLBF <expresion constante entera>Valor del argumento "modo" para "setvbuf" para indicar el "buffer" de línea.

_IONBF#define _IONBF <expresion constante entera>Valor del argumento "modo" para "setvbuf" para indicar que no se usa "buffer".

BUFSIZ#define BUFSIZ <expresion constante entera 256>Tamaño del "buffer" de flujo de datos utilizado por "setbuf".

EOF#define EOF <expresion constante entera 0>Valor de retorno utilizado para señalar el fin de fichero.

FILEtypedef d-tipo FILE;Es el tipo de datos que almacena toda la información de control para un flujo de datos.

FILENAME_MAX#define FILENAME_MAX <expresion constante entera>Máximo tamaño de un "array" de caracteres para almacenar el nombre de un fichero.

FOPEN_MAX#define FOPEN_MAX <expresion constante entera 8>Máximo número de ficheros que el entorno operativo permite que estén abiertos simultáneamente (incluyendo"stderr", "stdin", "stdout").

L_tmpnam#define L_tmpnam <expresion constante entera>Número de caracteres que requiere el entorno operativo para representar nombres de ficheros temporales creadospor "tmpnam".

NULL#define NULL <0, 0L, o (void *)0>Constante de puntero nulo que es utilizable como una expresión de direccionamiento constante.

SEEK_CUR#define SEEK_CUR <expresion constante entera>Valor del argumento "modo" para "fseek" para indicar la búsqueda relativa a la posición actual del fichero.

SEEK_END#define SEEK_END <expresion constante entera>Valor del argumento "modo" para "fseek" para indicar la búsqueda relativa al final del fichero.

SEEK_SET

Ing. Roger Ernesto Alarcón García. 5

#define SEEK_SET <expresion constante entera>Valor del argumento "modo" para "fseek" para indicar la búsqueda relativa al comienzo del fichero.

TMP_MAX#define TMP_MAX <expresion constante entera 25>Número máximo de nombres de ficheros diferentes creados por la función "tmpnam".

clearerrvoid clearerr (FILE *flujo);Limpia los indicadores de error y de fin de fichero para el flujo de datos "flujo".

fcloseint fclose (FILE *flujo);Cierra el fichero asociado con "flujo". Previamente, escribe lo que queda en el "buffer", descarta cualquier entrada por"buffer" incompleta y libera cualquier "buffer". Devuelve 0 en caso de éxito y EOF en caso contrario.

feofint feof (FILE *flujo);Devuelve un valor distinto de 0 si el indicador de final de fichero está a 1.

ferrorint ferror (FILE *flujo);Devuelve un valor distinto de 0 si el indicador de error está puesto a 1.

fflushint fflush (FILE *flujo);Se escibe cualquier salida por "buffer" que esté pendiente. Devuelve 0 si tiene éxito; en caso contrario, devuelveEOF;

fgetcint fgetc (FILE *flujo);Lee el siguiente carácter por "flujo", avanza el indicador de posición y devuelve "(int) (unsigned char)". Devuelve EOFsi pone a 1 el indicador de fin de fichero o el de error.

fgetposint fgetpos (FILE *flujo, fpos_t *pos);Almacena el indicador de posición de fichero en "pos" y devuelve 0 si tiene éxito; en caso contrario, almacena unvalor positivo en "errno" y devuelve un valor distinto de cero.

fgetschar *fgets (char *s, int n, FILE *flujo);Lee caracteres por "flujo" y los almacena en elementos sucesivos del "array" que comienza en "s", continuando hastaque almacene "n-1" caracteres, almacene un carácter "NL" o ponga a 1 los indicadores de error o fin de fichero. Sialmacena un carácter, concluye almacenando un carácter nulo en el siguiente elemento del "array". Devuelve "s" sialmacena algún carácter y no ha puesto a 1 el indicador de error; en caso contrario, devuelve un puntero nulo.

fopenFILE *fopen(const char *nombre_fichero, const char *modo);Abre el fichero de nombre "nombre_fichero", lo asocia con un flujo de datos y devuelve un puntero al mismo. Si falla,devuelve un puntero nulo.Los caracteres iniciales de "modo" deben ser alguno de los siguientes:"r", "w", "a", "rb", "wb", "ab", "r+", "w+", "a+", "rb+", "wb+", "ab+""r", para abrir fichero de texto existente para lectura."w", para crear fichero de texto o abrir y truncar uno existente, para escritura."a", para crear fichero de texto o abrir uno existente, para escritura. El indicador de posición secoloca al final del fichero antes de cada escritura."rb", para abrir fichero binario existente para lectura."r+", para abrir fichero de texto existente para lectura y escritura."rb+", para abrir fichero binario existente para lectura y escritura.

fpos_ttypedef do-tipo fpos_t;Tipo de datos para contener el valor del indicador de posición del fichero almacenado por "fsetpos" y accedido por"fgetpos".

fprintfint fprintf (FILE *flujo, const char *formato, ...);

6 Ing. Roger Ernesto Alarcón García.

Genera texto formateado, bajo el control del formato "formato" y escribe los caracteres generados por "flujo".Devuelve el número de caracteres generados o un valor negativo en caso de error.

fputcint fputc (int c, FILE *flujo);Escribe el carácter "(unsigned char) c" por "flujo", avanza el indicador de posición del fichero y devuelve"(int)(unsigned char) c". En caso de error, devuelve "EOF".

fputsint fputs (const char *s, FILE *flujo);Escribe los caracteres de la cadena "s" por "flujo". No escribe el carácter nulo de terminación. En caso de éxito,devuelve un valor no negativo; en caso de error, devuelve "EOF".

freadsize_t fread (void *p, size_t longitud, size_t nelem, FILE *flujo);Lee caracteres por "flujo" y los almacena en el "array" que comienza en "p" hasta que se almacenen "longitud*nelem"caracteres o se active la condicion de error o la de fin de fichero. Devuelve "n/longitud", siendo "n" el número decaracteres leidos. Si "n" no es múltiplo de "longitud", el valor almacenado en el último elemento queda indeterminado.

freopenFILE *freopen (const char *nombre_fichero, const char *modo, FILE *flujo);Cierra el fichero asociado con "flujo" y abre el fichero "nombre_fichero" y lo asocia a "flujo". Devuelve "flujo" si laapertura tiene éxito; en caso contrario, devuelve un puntero nulo.

fscanfint fscanf (FILE *flujo, const char *formato, ...);Lee texto y convierte a la representación interna según el formato especificado en "formato".Devuelve el número de entradas emparejadas y asignadas, o "EOF" si no se almacenan valores antes de que seactive el indicador de error o de fin de fichero.

fseekint fseek (FILE *flujo, long desp, int origen);Activa el indicador de posición de "flujo" según los valores de "desp" y "origen", limpia el indicador de fin de fichero ydevuelve 0 si hay éxito.Valores de "origen": "SEEK_SET" indica el principio de fichero, "SEEK_CUR" indica la posición actual, "SEEK_END"indica el final de fichero.Para un fichero binario, "desp" es un desplazamiento con signo expresado en número de "bytes", que se añade alindicador de posición indicado por "origen".Para un fichero de texto, el valor de "desp" puede ser 0 o el valor devuelto por "ftell".

fsetposint fsetpos (FILE *flujo, const fpos_t *pos);Asigna el valor de "pos" al indicador de posición de "flujo", limpia el indicador de fin de fichero y devuelve 0 si hatenido éxito.

ftelllong ftell (FILE *flujo);Devuelve una forma codificada del indicador de posición. Para un fichero binario, devuelve el número de "bytes"desde el principio de fichero. Para un fichero de texto, le efecto depende del entorno operativo.En caso de error, devuelve -1.

fwritesize_t fwrite(const void *p, size_t longitud, size_t nelem, FILE *flujo);Escribe caracteres por "flujo", tomandolos a partir de la dirección "p", hasta que se hayan escrito "longitud*nelem"caracteres o se produzca error. Devuelve "n/longitud", siendo "n" el número de caracteres escritos.

getcint getc (FILE *flujo);Tiene el mismo efecto que "fgetc".

getcharint getchar (void);Tiene el mismo efecto que "fgetc(stdin)".

getschar *gets (char *s);

Ing. Roger Ernesto Alarcón García. 7

Lee caracteres por el flujo estándar de entrada ("stdin") y los almacena en el "array" que comienza en "s" hasta quese almacena un carácter "NL" o se active el indicador de error o el de fin de fichero. Si almacena algún elemento,termina almacenando un carácter nulo. Devuelve "s" si almacena algún carácter. Sustituye el carácter NL por ‘\0’.

perrorvoid perror (const char *s);Escribe una línea de texto por "stderr". Escribe la cadena "s", seguida por dos puntos (":") y un espacio. Despuésescribe la misma cadena que devuelve "strerror(errno)" seguida por "NL".

printfint printf (const char *formato, ...);Escribe texto formateado por el flujo "stdout", según las especificaciones de "formato" y la lista de expresiones.Devuelve el número de caracteres escritos o un valor negativo en caso de error.

putcint putc (int c; FILE *flujo);Tiene el mismo efecto que "fputc".

pucharint puchar (int c);Tiene el mismo efecto que "fputc(c, stdout)".

putsint puts (const char *s);Escribe los caracteres de la cadena "s" por el flujo "stdout". Escribe un carácter "NL" en lugar del nulo de terminación.Devuelve un valor no negativo. En caso de error, devuelve EOF.

removeint remove <9const char *nombre_fichero);Elimina el fichero "nombre_fichero".

renameint rename (const char *viejo, const char *nuevo);Renombra al fichero de nombre "viejo", poniendole el nombre "nuevo".

rewindvoid rewind (FILE *flujo)La función llama a "fseek(flujo, 0L, SEEK_SET)" y limpia el indicador de error para "flujo".

scanfint scanf (const char *formato, ...);Lee texto por el flujo "stdin" y lo almacena según las especificaciones de "formato". Devuelve el número de valoresasignados o "EOF" si se produce error o se alcanza fin de fichero sin producirse lectura.

setbufvoid setbuf (FILE *flujo, char *buf);Si "buf" es un puntero nulo, se desactiva el uso de "buffer", en caso contrario llama a "setvbuf(flujo, buf_IOFBF,BUFSIZ)".

setvbufint setvbuf (FILE *flujo, char *buf, int modo, size_t longitud);Establece el uso de "buffer" para "flujo". Debe invocarse después de abrir el fichero y antes de realizar cualquieroperación sobre él.EL "modo" "_IOFBF" es para uso completo de "buffer".El "modo" "_IOLBF" es para usar "buffer" de linea con ficheros de texto.EL "modo" "_IONBF" es para no usar "buffer".Si "buf" no es un puntero nulo , se tomará como la dirección base de un "array" que se usará como"buffer". Si "buf" es nulo, se asigna otro "buffer" que será liberado al cerrar el fichero.

size_ttypedef ui-tipo size_t;Tipo entero sin signo que se declara para contener el resultado de "sizeof".

sprintfint sprintf (char *s, const char *format, ...);Genera texto formateado y lo almacena en un "array" que comienza en "s", poniendo un carácter nulo al final.

8 Ing. Roger Ernesto Alarcón García.

sscanfint sscanf (const char *s, const char *format, ...);Lee texto formateado tomandolo del "array" que comienza en "s".

stderr#define stderr <puntero a FILE>Produce un puntero al flujo de salida estándar para mensajes de error.

stdin#define stdin <puntero a FILE>Produce un puntero al flujo de entrada estándar.

stdout#define stdout <puntero a FILE>Produce un puntero al flujo de salida estándar.

tmpfileFILE *tmpfile (void);Crea un fichero binario temporal que se elimina cuando se cierra o cuando termina la ejecución del programa. Tieneel mismo efecto que abrir con "fopen" y "modo" "wb+".

tmpnamchar *tmpnam (char s[L_tmpnam]);"tmpnam(NULL)" crea una cadena que sirve como nombre de fichero único y devuelve un puntero a un "array" internoestático. Invocando "tmpnam(s)", la cadena se almacena en "s" y se devuelve su dirección como valor de la función.Se genera un nombre distinto cada vez que se invoca. Se garantiza un número "TMP_MAX" de nombres distintosdurante la ejecución del programa.

ungetcint ungetc (int c, FILE *flujo);Devuelve "c" (convertido en "unsigned char") al flujo de datos, donde podrá recuperarse en la siguiente lectura.

vfprintf, vprintf, vsprintfint vfprintf (FILE *flujo, const char *formato, va_list ap);int vprintf (const char *formato, va_list ap);int vsprintf (char *s, const char *formato, va_list ap);Son equivalentes a las correspondientes formas de "printf", con la diferencia de que usan la información de contextodesignada por "ap" para acceder a los argumentos adicionales. Con "va_start" se inicializa "ap", con "va_arg" seasigna otro valor que es el tipo y valor del siguiente argumento. Hay que llamar a "va_end" después de haberprocesado todos los argumentos, pero antes de que termine la función.

Librería : string.h

Contiene la declaración de una colección de funciones útiles para manejar cadenas y otros arrays de caracteres.

NULL#define NULL <0, 0L, o (void *)0>Produce una constante de puntero nulo que es utilizable como una expresión de direccionamiento constante.

memchrvoid *memchr (const void *s, int c, size_t n);Busca el primer elemento de un "array de unsigned char" que es igual a "(unsigned char) c". El "array" comienza en"s" y tiene "n" elementos.En caso de éxito, devuelve la dirección de elemento buscado; en caso contrario, devuelve un puntero nulo.

memcmpint memcmp (const void *s1, const void *s2, size_t n);Compara los elementos de dos "arrays de unsined char", con direcciones base "s1" y "s2", y "n" elementos, hasta queencuentra elementos diferentes. Si todos los elementos son iguales, devuelve 0. Si el elemento diferente de "s1" esmayor que el de "s2", devuelve un valor positivo; en caso contrario, devuelve un valor negativo.

memcpyvoid *memcpy (void *s1, const void *s2, size_t n);Copia el "array de char" que empieza en "s2" en el "array de char" que empieza en "s1". Devuelve "s1".

memmovevoid *memmove (void *s1, const void *s2, size_t n);

Ing. Roger Ernesto Alarcón García. 9

Tiene el mismo efecto que "memcpy", pero actúa incluso si los "arrays" se solapan. En este caso, se accede a cadavalor de "s2" antes de almacenar un nuevo valor en ese elemento.

memsetvoid *memset (void *s, int c, size_t n);Almacena "(unsigned char) c" en cada uno de los elementos del "array de unsigned char" que empieza en "s" y tiene"n" elementos. Devuelve "s".

size_ttypedef ui-tipo size_t;Es el tipo entero sin signo de un objeto de datos declarado para contener el resultado del operador "sizeof".

strcatchar *strcat (char *s1, const char *s2);Copia la cadena "s2", incluyendo el nulo de terminación, en elementos sucesivos del "array de char" que almacena lacadena "s1", empezando en el elemento que almacena el nulo de terminación de "s1". Devuelve "s1".

strchrchar *strchr (const char *s, int c);Busca el primer elemento de la cadena "s" que sea igual a "(char)c". Considera el nulo de terminación como parte dela cadena. En caso de éxito, devuelve la dirección del elemento emparejado; en caso contrario, devuelve un punteronulo.

strcmpint strcmp (const char *s1, const char *s2);Compara los elementos de dos cadenas "s1" y "s2" hasta que encuentra elementos diferentes. Si todos son iguales,devuelve 0. Si el elemento diferente de "s1" es mayor que el de "s2", devuelve un valor mayor que cero; en casocontrario, devuelve un valor menor que cero.

strcollint strcoll (const char *s1, const char *s2);Compara dos cadenas "s1" y "s2" utilizando una secuencia de ordenación especial diferente de la ASCII.

strcpychar *strcpy (char *s1, const char *s2);Copia la cadena "s2", incluyendo el nulo, en el "array de char" que comienza en "s1". Devuelve "s1".

strcspnsize_t strcspn (const char *s1, const char *s2);Busca el primer elemento "s1[i]" de la cadena "s1" que sea igual a cualquiera de los elementos de la cadena "s2" ydevuelve "i".

strerrorchar *strerror (int codigo_error);Devuelve un puntero a un objeto de datos interno de duración estática que contiene el mensaje correspondiente alcódigo de error "codigo_error".

strlensize_t strlen (const char *s);Devuelve el número de caracteres de la cadena "s", sin incluir el nulo de terminación.

strncatchar *strncat (char *s1, const char *s2, size_t n);Copia "n" elementos de la cadena "s2" en la cadena "s1" a partir de su nulo de terminación. Al final pone el nulo determinación y devuelve "s1".

strncmpint strncmp (const char *s1, const char *s2, size_t n);Compara los elementos de las cadenas "s1" y "s2" hasta que encuentra alguno diferente o hasta que se hancomparado "n" elementos. Si todos los elementos son iguales, devuelve 0. Si el elemento diferente de "s1" es mayorque el de "s2" (tomados como "unsigned char"), devuelve un número positivo. En caso contrario, devuelve un númeronegativo.

strncpychar *strncpy (char *s1, const char *s2, size_t n);Copia la cadena "s2", sin incluir el nulo, en la cadena "s1". Copia no más de "n" caracteres de "s2". Entoncesalmacena, cero o más caracteres nulos si son necesarios para completar un total de "n" caracteres. Devuelve "s1".

10 Ing. Roger Ernesto Alarcón García.

strpbrkchar *strpbrk (const char *s1, const char *s2);Busca el primer elemento "s1[i]" en la cadena "s1" que sea igual a cualquiera de los elementos de "s2". Si "s1[i]" noes el nulo de terminación, devuelve "&s1[i]"; en caso contrario, devuelve un puntero nulo.

strrchrchar *strrchr (const char *s, int c);Busca el último elemento de la cadena "s" que es igual a "(char)c". En caso de éxito, devuelve la dirección de talelemento; en caso contrario, devuelve un puntero nulo.

strspnsize_t strspn (const char *s1, const char *s2);Busca el primer elemento "s1[i]" en la cadena "s1" que no sea igual a ninguno de los elementos de "s2" y devuelve"i".

strstrchar *strstr (const char *s1, const char *s2);Busca la primera secuencia de elementos en la cadena "s1" que se empareje con los elementos de la cadena "s2",sin incluir su nulo. En caso de éxito, devuelve la dirección del primer elemento emparejado; en caso contrario,devuelve un puntero nulo.

strtokchar *strtok (char *s1, const char *s2);Permite separar una cadena "s1" en partes usando como delimitadores los caractes de otra "s2".Cada vez que se invoca, devuelve un puntero a la siguiente palabra de la cadena "s1". Devuelve un puntero nulocuando no existe ninguna palabra que devolver.La primera vez que se llama a "strtok", se utiliza realmente "s1" en la llamada. Las llamadas posteriores utilizan unpuntero nulo como primer argumento. Se puede usar un conjunto diferente de delimitadores en cada llamada.Esta función modifica la cadena "s1". Cada vez que se encuentra una palabra, se pone un carácter nulo dondeestaba el delimitador.

strxfrmsize_t strxfrm (char *s1, const char *s2, size_t n);Se usa en entornos de lenguajes extranjeros que no utilicen el secuenciamiento ASCII.Transforma los "n" primeros elementos de la cadena "s2" para que pueda usarse con la función "strcmp". La función"strxfrm" coloca entonces el resultado en la cadena "s1". Después de la transformación, el resultado de "strcmp" con"s1" y de "strcoll" con la cadena original "s2" será el mismo. La función devuelve la longitud de la cadenatransformada.

Librería: time.h

Contiene la declaración de algunas funciones para manejar fechas. Las funciones comparten dos objetos de datos deduración estática, una cadena de tiempo de tipo "array de char" y una estructura de tiempo de tipo "struct tm".

CLOCKS_PER_SECOND#define CLOCKS_PER_SECOND <valor_aritmetico>Produce el número de pulsos de reloj, devuelto por "clock" en un segundo.

NULL#define NULL <0, 0L, o (void *)0>Produce una constante de puntero nulo que se puede utilizar como una expresión constante de direccionamiento.

asctimechar *asctime (const struct tm *tp);Convierte la información almacenada en la estructura apuntada por "tp" en una cadena de caracteres que expresa lafecha y hora en lengua inglesa con la forma: Mon Apr 12 09:12:05 1993\n\0. Devuelve la dirección de la cadena.El puntero que se pasa, "tp", puede obtenerse con "localtime" o con "gmtime".

clockclock_t clock (void);Devuelve el número de pulsaciones de reloj de un lapso de tiempo del procesador, contando desde el momento dearranque del programa. Devuelve "-1" si el entorno operativo no puede hacer esa medida.

clock_ttypedef a-tipo clock_t;

Ing. Roger Ernesto Alarcón García. 11

Es el tipo aritmético "a-tipo" de un objeto de datos que se declara para contener el valor que devuelve "clock". El valorrepresenta el lapso de tiempo del procesador.

ctimechar *ctime (const time_t *cal);Convierte el tiempo de calendario que está en "*cal" a una representación de texto de la hora local. Es equivalente a"asctime(localtime(cal))". La hora de calendario se obtiene normalmente con una llamada a "time".

difftimedouble difftime (time_t t1, time_t t0);Devuelve la diferencia, en segundos, entre los tiempos de calendario "t0" y "t1".

gmtimestruct tm *gmtime (const time_t *tod);Almacena en la estructura de tiempo una codificación del tiempo de calendario apuntado almacenado en "*tod",expresado en Tiempo Universal Coordinado (UTC, antes GMT). Devuelve la dirección a la estructura de tiempo.El valor de "*tod" se obtiene normalmente llamando a "time".localtimestruct tm *gmtime (const time_t *tod);Almacena en la estructura de tiempo una codificación del tiempo de calendario almacenado en "*tod", expresadocomo hora local. Devuelve la dirección de la estructura. El valor de "*tod" se obtiene normalmente llamando a "time".

mktimetime_t mktime (struct tm *tp);Devuelve la hora de calendario,con la representación propia de "time", correspondiente a la hora local almacenadaen la estructura apuntada por "tp". Devuelve "-1" si la información no corresponde a una hora de calendario válida.

size_ttypedef ui-tipo size_t;Es el tipo entero sin signo de un objeto de datos que se declara para contener el resultado del operador "sizeof".

strftimesize_t strftime (char *s, size_t n, const char *formato,const struct tm *tp);Toma los valores de la estructura de tiempo apuntada por "tp" y genera texto formateado, según las especificacionesde "formato", almacenándolo en la cadena "s" de tamaño "n". Hay 22 especificaciones de formato.

timetime_t time (time_t *tod);Devuelve la hora actual de calendario del sistema. Si el entorno operativo no puede determinarla, devuelve "-1".Si "tod" no es un puntero nulo, la hora también queda asignada a "*tod".

time_ttypedef a-tipo time_t;Es el tipo aritmético de un objeto de datos que se declara para almacenar el valor devuelto por "time". El valorrepresenta la hora de calendario.

tmstruct tm {int tm_sec; /* segundos después del minuto, 0-59 */int tm_min; /* minutos después de la hora, 0-59 */int tm_hour; /* hora del día, 0-23 */int tm_mday; /* día del mes, 1-31 */int tm_mon; /* mes del año, 0-11 */int tm_year; /* años desde 1900 */int tm_wday; /* días desde el domingo, 0-6 */int tm_yday; /* día del año, 0-365 */int tm_isdst; /* indicador de ajuste horario */};

Se utiliza para mantener la fecha y hora separadas en sus componentes. El miembro "tm_isdst" tiene un valorpositivo si el ajuste horario es efectivo, tiene el valor "0" si no es efectivo o un valor negativo si el entorno operativono puede determinar su estado.

2 Ing. Roger Ernesto Alarcón García.

IT204 Algorítmica y ProgramaciónTEXTO INFORMATIVO

IMPLEMENTACION DE FUNCIONES PROPIAS EN LENGUAJE CResumen recopilado por el docente

El Lenguaje C nos brinda la posibilidad de implementar nuestras propias operaciones (funciones) que

permitan simplificar el trabajo al momento de programar, a esto se le conoce como modularización.

Una función es una entidad formada por un grupo de sentencias destinadas a hacer un trabajo concreto.

Los objetivos básicos de la utilización de funciones son tres:

1. Evitar repeticiones de código

Supongamos que en uno de los programas tiene una sección de código destinado a calcular la

potencia de un número. Si después, en el mismo programa necesita calcular la potencia de otro

numero, seria deseable, en lugar de escribir otra vez las sentencias que calculan la potencia,

poder saltar hacia la sección que calcula la potencia y volver, una vez hecho el calculo, hacia el

flujo normal del programa. Observe el siguiente esquema, en el cuadro de la izquierda se observa

que hay código repetido (podría ser el código que calcula la potencia de un numero), mientras

que en el cuadro de su izquierda el código solo aparece una vez, cuando este es requerido se

llama y punto.

2. Organización del programa

La utilización de funciones permite dividir el programa en actividades. Cada función realiza una

tarea determinada, y cada función puede comprobarse, mas o menos, de forma independiente,

facilitando así el diseño, la comprensión de los programas, y la detección de errores.

Ing. Roger Ernesto Alarcón García. 3

3. Independencia

Utilizar funciones independientes del programa principal y entre si, permite su reutilización en

diferentes programas. En el ejemplo de calcular la potencia de un numero, se podría seleccionar

la función que hace esta operación, e incluirla en cualquier programa que la necesite sin tenerla

que escribir cada vez.

Estructura de las funciones

Para poder utilizar una función, se han de definir tres elementos en el programa:

1. definición de la función

2. prototipo de la función

3. llamada a la función

Ejemplos de declaraciones de funciones:

int mayor (int a, int b); int

menor (int a, int b);

double raiz(double valor);

void presenta();

Ejemplo 01: Creando una operación (procedimiento) que recibe como parámetro dos valores enteros y

los compara mostrando cual es el mayor uno con respecto al otro.

#include <stdio.h>

#include <conio.h>

void compara(int a, int b)

{

if (a > b)

printf(“ %d es mayor que %d” , a, b);

else

}

printf(“ %d es mayor que %d” , b, a);

void main()

{

int x, y;

clrscr();

printf(“ingrese dos números:“);

scanf(“%d %d“, &x, &y) ;

compara(x, y);

getch();

}

4 Ing. Roger Ernesto Alarcón García.

Ahora implementamos el mismo ejercicio pero manipulándola como una función.

#include <stdio.h>

#include <conio.h>

int compara(int a, int b)

{

int mayor;

if (a > b)

mayor = a;

else

mayor = b;

return mayor;

}

void main()

{

int x, y;

int resultado;

clrscr();

printf(“ingrese dos números:“);

scanf(“%d %d“, &x, &y) ;

resultado = compara(x, y);

printf(“El mayor de los dos es : %d” , resultado);

getch();

}

Otra opción de realizar la llamada a la operación es incluirla directamente en la presentación (en el printf )

sin necesidad de crear una variable auxiliar (resultado)

printf(“El mayor de los dos es : %d” , compara(x,y) );

Ahora implementaremos el mismo programa pero haciendo uso de la zona de prototipos.

#include <stdio.h>

#include <conio.h>

int compara(int a, int b); // solo se define la cabecera de la función

void main()

{

int x, y;

Ing. Roger Ernesto Alarcón García. 5

int resultado;

clrscr();

printf(“ingrese dos números:“);

scanf(“%d %d“, &x, &y) ;

resultado = compara(x, y);

printf(“El mayor de los dos es : %d” , resultado);

getch();

}

int compara(int a, int b) // aquí se implementa el código propio de la función

{

int mayor;

if (a > b)

mayor = a;

else

mayor = b;

return mayor;

}

Ejemplo 02: Crear un programa que permita calcular el máximo de 3 elementos ingresados.

#include <stdio.h>

#include <conio.h>

int maximo(int, int, int);

void main(void)

{

int x, y, z;

clrscr();

printf("Introduzca tres valores:\n");

printf("primero: ");

scanf("%d", &x);

printf("segundo: ");

scanf("%d", &y);

printf("tercero: ");

scanf("%d", &z);

printf("El máximo de los tres valores introducidos es: \n");

printf("%d\n", maximo(x, y, z) );

getch();

6 Ing. Roger Ernesto Alarcón García.

}

int maximo(int a, int b, int c)

{

int max;

max = a;

if (b > max)

max = b;

if (c > max)

max = c;

return max;

}

Ejercicio 03: Crear un programa modularizado que permita intercambiar dos números.

#include <stdio.h>

#include <conio.h>

/* Intercambio de los valores en las variables haciendo uso de parámetros por referencia */

void intercambio(int &, int &);

void main()

{

int a=1,b=2;

printf("a=%d y b=%d",a, b);

intercambio(a,b); /* llamada */

printf("a=%d y b=%d",a,b);

getch();

}

void intercambio (int &x, int &y)

{

int aux;

aux=x;

x=y;

y=aux;

}