Curso de Filosofía elemental (27)

XXXII

La sociedad

 

158. LA SOCIEDAD HUMANA

   El hombre, en todo tiempo y lugar, ha vivido en sociedad. A diferencia de los animales, que generalmente viven aislados, o se unen sólo transitoriamente para los fines de la procreación, el hombre habita siempre un medio social (sociedad política) en la cual encuentra su modo normal de vivir y la expansión de su personalidad.
   Esto es para el hombre una necesidad, ante todo; los animales poseen en su cuerpo medios individuales de defensa, así como piel adecuada para protegerse, y en su naturaleza instintos muy vigorosos para procurarse lo necesario. El hombre, inerme, delicado en su organismo y único ser del universo que vacila, sería el más desvalido de todos los animales si no viviera en sociedad. De aquí que sólo rarísimamente y por accidente pueda hallarse un hombre que viva en aislamiento absoluto (por abandono en su infancia o por naufragio o causa similar), y en estos casos o se trata de una vida profundamente antinatural (animalizada), o es una situación transitoria, en espera siempe de retornar al medio social.
   La sociedad, sin embargo, suple con creces en el hombre cuanto de defensa o instinto puede faltarle, y hace de él el animal menos sometido al riesgo o a la servidumbre natural, el más libre y menos indigente. En forma tal que puede decirse del hombre con toda propiedad que es animal social. Pero también, a diferencia de los animales gregarios (hormigas, ejambres de abejas), la sociedad no es algo que absorba la individualidad de cada hombre haciéndole mero operario del grupo, pieza de un quehacer colectivo, sino que es en la sociedad precisamente donde el hombre desarrolla y hace fructificar su propia personalidad, que siempre conserva, dentro de ella, un sentido y una finalidad propios, independientes del grupo.
   Podemos así decir, en términos generales, que sociedad política es la unión estable de hombres que determina entre ellos relaciones de convivencia, de jerarquía y de comunidad espiritual.

159. NOCIONES ERRÓNEAS SOBRE EL ORIGEN Y NATURALEZA DE LA SOCIEDAD. EL INDIVIDUALISMO O TEORÍA DEL PACTO SOCIAL

   Este hecho universal y constante de que el hombre viva en sociedad ha hecho preguntarse a los pensadores: ¿qué es la sociedad? ¿Se trata de algo anterior y superior a los individuos que la componen, o es, por el contrario, resultado de un pacto o acuerdo entre ellos? ¿Cuál es, en fin, su naturaleza y origen?
   Durante los siglos XVII al XIX estuvo muy en boga la teoría individualista o del pacto social sobre el origen de la sociedad, teoría que es consecuencia del racionalismo moderno.
   Según esta concepción, la sociedad nace de un pacto o acuerdo voluntario entre los hombres que vivían primitivamente en aislamiento o soledad y renunciaron así a parte de su primitiva libertad para adquirir la seguridad y cooperación que la sociedad podía ofrecerles. La sociedad es, pues, posterior al individuo e inesencial, accesoria, respecto a su naturaleza, ya que puede el hombre vivir, y de hecho vivió, según esta teoría, sin formar sociedad.
   J.J. ROUSSEAU (1712-1778), en su obra El Contrato Social, enseñó que el hombre es libre y bueno por naturaleza, y que es presicamente en la convivencia social donde se corrompe y malea. Para ROUSSEAU, la sociedad sólo puede justificarse con un pacto libre o contrato entre los hombres, y únicamente es justa cuando permite en su seno toda la libertad posible del individuo; es decir, la máxima expansión de su bondadosa naturaleza. Como consecuencia, el poder y las funciones de la autoridad política deben ser los mínimos, no más que lo necesario para asegurar la convivencia y permitir la más amplia libertad de todo. ROUSSEAU es por esto, como veremos, uno de los fundadores del liberalismo político moderno.
   Sin embargo, los hechos no han confirmado nunca, en ninguno de sus aspectos, esta teoría que hace de la sociedad un mero acuerdo o pacto entre individuos ya hechos y libres. Los hombres y los pueblos, cuanto más primitivos son nos aparecen vinculados a sociedades más estrechas, con ritos, costumbres o autoridades más poderosos. Las investigaciones arqueológicas y antropológicas tampoco han descubierto nunca al salvaje libre y feliz de la teoría individualista, sino, al contrario, unidades tribales más cerradas y vinculares cuanto más alejadas en la remota antigüedad. Parece, pues, que la sociedad no puede considerarse como algo posterior al individuo ni producto de su libre y voluntaria convención o acuerdo.

160. EL UNIVERSALISMO SOCIAL. LA SOCIEDAD COMO REALIDAD PRIMERA SUPRAINDIVIDUAL

   En el extremo contrario del individualismo se encuentran las doctrinas universalistas o totalitarias sobre el origen de la sociedad. Según ellas, la sociedad es una realidad anterior y superior al individuo, de la cual recibe éste su personalidad y sus derechos. No es que los partidarios de estas teorías supongan la existencia de una sociedad sin individuos, es decir, anterior a éstos, lo cual sería imposible de concebir e imaginar. Pero suponen la sociedad primitiva como algo semejante a una colmena o un hormiguero en los que apenas cabe apreciar diferencias individuales entre los animales que los componen, dominados enteramente por la labor y la finalidad común. Según ellos, es el desarrollo progresivo de las sociedades lo que va permitiendo la diferenciación y la autonomía de sus miembros mediante un constante aflojamiento de sus vínculos internos a medida que se va haciendo fuerte y organizada. La individualidad nace así de la sociedad y de ella prceden también todos los derechos y libertades de que pueden disfrutar los individuos, sus miembros.
   Existen diversos tipos de universalismo social. Para unos, esa sociedad originaria de que ha ido brotando la individualidad y el carácter de los hombres es la Nación o el estado histórico (nacionalismos totalitarios); para otros, la raza (racismo); para otros, una especie de organismo social con leyes propias (sociologismos biológicos). Cabe citar como representantes de esta teoría a los grandes filósofos del Idealismo alemán del siglo XIX (FICHTE, SCHELING, HEGEL), a los sociólogos de tipo organicista (SPENCER), a los partidarios de la psicosociología (DURKHEIM) y a los nacionalismos totalitarios de este siglo.
   También la experiencia común y la investigación histórica pugnan con esta teoría en cualquiera de sus expresiones. En ninguna sociedad humana, por cerrada y primitiva que sea, llega a perderse la personalidad de cada hombre hasta el extremo de referirse por entero a la vida del grupo, ni puede explicarse el progreso o la evolución de las sociedades sin la iniciativa o la acción de hombres concretos de destacada personalidad. La sociedad es siempre sociedad de hombres, y nada sucede en el terreno de lo humano en que no intervenga la decisión y el empeño de hombres individuales.

161. LA SOCIEDAD COMO FRUTO DE LA NATURALEZA SOCIAL DEL HOMBRE. TEORÍA ARISTOTÉLICA

   Aristóteles llamó al hombre <<animal político>>, con lo que quiso significar que el hombre es social por naturaleza. Supone esto que, según la doctrina del filósofo griego, la sociedad no es algo que existe fuera o por encima del hombre, como afirma el universalismo social; ni es tampoco resultado de un pacto voluntario entre hombres que vivían en aislamiento, pacto que nacería de un puro acuerdo y que bien podrían no haberlo hecho, como pretende el individualismo. La sociedad es para Aristóteles algo que brota de la naturaleza misma del hombre. O, lo que es igual, el hombre es un ser referido u orientado en su mismo ser a vivir en sociedad.
   Esta profunda doctrina de Aristóteles, que resuelve la contradicción entre el individualismo y el socialismo, tiene varias consecuencias muy importantes:
   En primer lugar, nos hace ver que ni el individuo puro ni la sociedad en sí existen en la realidad, sino que sólo existen hombres concretos, personales, que son a la vez individuales y sociales. Los hombres tienen todos algo puramente suyo, individual, que los diferencia de los demás (su idividualidad); pero lo que son, lo que quieren y piensan lo han recibido de la sociedad, sea por herencia, por educación o por ambiente. Si quitáramos a un hombre todo esto nos quedaríamos casi sin nada, con una pura potencialidad de ser que ha de actualizarse a lo largo de su vida en relación con los demás; es decir, formando parte de una sociedad. Individualidad y sociedad son así aspectos de una sola realidad, el hombre concreto, que es a la vez individual y social. Ni el puro individuo aislado ni la sociedad en sí existen realmente, sino hombres que son individuales y viven en una sociedad formándola y, a la vez, nutriendo a su espíritu de ella, realizándose en ella.

Raices de la sociedad en el ser humano.
   Una segunda consecuencia de esta doctrina es que la sociedad humana, su estructura interna y su gobierno no pueden ser algo que se establezca en virtud de un mero acuerdo racional, como pretendían las teorías racionalistas e individualistas que produjeron la Revolución Francesa. A partir de la Revolución se pretendió constituir de nuevo la sociedad política partiendo de una asamblea constituyente que redactaría una Constitución o Ley racional y perfecta que la regiría para siempre. Si la sociedad brota de la naturaleza humana, toda entera, no podrá ser asunto solo de la razón o de la voluntad racional de sus miembros, sino que los demás estratos y facultades de la naturaleza humana –el sentimiento, la memoria colectiva, el instinto– participarán igualmente en su formación concreta y temporal.
   Así vemos, en efecto, que las sociedades históricas (las naciones, por ejemplo) son un complejo de sentimientos, creencias, emociones y hábitos colectivos, recuerdos e impulsos comunes, difíciles de discriminar. Y que en el decurso de su vida colectiva influyen, tanto como las decisiones y proyectos racionales que le dan su dinamismo y renovación, las costumbres y creencias que le deparan su estabilidad y carácter profundo.

 

XXXIII

Las formas de sociabilidad

 

162. LAS FORMAS DE SOCIABILIDAD

   La sociedad –lo hemos visto– no es el resultado de un acuerdo o pacto racional entre los hombres, como pretendía el racionalismo individualista o la teoría del Pacto Social. No cabe, por ello mismo, concebirla como organizada de una manera uniforme a partir de un solo orden y un solo poder, como pretendía el constitucionalismo de la Revolución Francesa.
   La sociedad, por el contrario, brota de la naturaleza huamana y, por lo mismo, los diversos impulsos naturales del ser humano se ven representados en la sociedad, que viene a ser así un conjunto de formas diversas que se armonizan entre sí como se armoniza en el espíritu humano sus diversas facultades.
   Varias son las formas de sociabilidad, correspondientes a otros tantos impulsos sociales de la naturaleza humana:
   El instinto genésico y el de paternidad –que son los más fuertes impulsos que unen a los seres humanos– determinan la institución familiar, la primera y más universal de las formas de sociabilidad.
   El impulso de cooperación y mutua defensa con quienes tienen un modo común de vida y unos mismos intereses determina la forma municipal (local) y la gremial (profesional), que tienen un fundamento común: la natural tendencia de asociación con quienes poseen una misma vinculación a la tierra o al género de vida.
   La necesidad de armonía en el orden social y a tendencia de la razón hacia la unidad superior determinan la forma política o superior autoridad civil.
   Por otra parte, la misma tendencia natural de asociación y la necesidad de jerarquización, cuando se aplican no a la convivencia natural terrena, sino a la consecución de un fin sobrenatural o religioso, da lugar a la sociedad religiosa (tal como la Iglesia), que en todas las civilizaciones se instituye y mantiene con separación más o menos acusada del orden y jerarquía civil.
   En fin, la sociedad que brota de la naturaleza humana tiene también el carácter individualizado, distinto de los demás, que tiene en sí todo hombre determinado: lo mismo que no existe el hombre en abstracto, sino hombres concretos, individuales, así tampoco existe una sociedad universal y abstracta, sino sociedades concretas e históricas, todas diferentes entre sí y en constante evolución, como diferentes y cambiantes son los seres humanos. Aunque en toda sociedad se den estas formas generales (familia, coporaciones locales y profesionales, autoridad política, convivente sociedad religiosa), las sociedades son siempre concretas, históricas y marcadas con el sello de la personalidad humana. (Esta familia es distinta de aquélla; Francia, distinta de España, etc.)
   Platón, maestro e inspirador de Aristóteles, deducía ya las clases en que dividía la Ciudad (o polis) de las facultades del alma humana: el pueblo, que se empleaba en labores materiales, representaba el apetito o pasión: la clase militar (guerreros) correspondía al ánimo noble; la clase gobernante (sabios) simbolizaba, en fin, a la razón o intelecto del hombre.

163. LA FAMILIA

   La primera y más compacta célula de la sociedad es la familia, creada por el doble instinto de la procreación y de la paternidad, los más firmes y espontáneos impulsos que orientan al hombre hacia la sociabilidad.
   No puede imaginarse un comienzo histórico de la sociedad sin recurrir a alguna forma familiar, por primitiva y elemental que se la suponga. La teoría según la cual precedió a la formación de la familia un estado gregario de hordas en promiscuidad de sexos puede considerarse abandonada, ya que careción de fundamento, tanto etnológico como psicológico. La hipótesis de la horda sólo puede admitirse como un estado de degradación episódica, pero no como una situación estable donde haya surgido, con la familia, la estructura de la sociedad.
   Se carece de datos suficientes para determinar la estructura de la familia primitiva. Las indagaciones históricas son siempre vagas y se refieren a un tiempo muy limitado, y lo que puede saberse sobre las tribus salvajes de Oceanía o Africa se refiere a sociedades largamente evolucionadas. No puede, pues, probarse científicamente que la familia prehistórica no fuera monógama y que más tarde degenerase. Lo que puede afirmarse como un hecho constante, no contradictorio por ningún dato histórico ni etnográfico y apoyado en fundamentos psicológicos ciertos, es que la familia ha existido desde que hubo hombres y mujeres en la tierra, aunque adaptándose a las condiciones espirituales y económicas de los diversos pueblos y de las diversas épocas.
   En todo pueblo, época y civilización, la familia ha tenido, de una parte, conciencia de sí y una interna jerarquía, y, de otra, un reconocimiento por parte de la colectividad, tanto civil como religiosa. Así, en la familia como célula permanente y universal de toda sociedad pueden hallarse siempre tres características o líneas estructurales:
   Es la primera el sentimiento de mutua pertenencia entre los cónyuges, el sentimiento asimismo de intimidad diferenciada respecto al exterior y de subordinación afectuosa de la mujer respecto al marido y de los hijos respecto a ambos. Es la segunda un reconocimiento legar por parte de la sociedad y del Estado, que, aun en las más audaces intervenciones estatistas, ha visto siempre en la familia un origen y un fuero interno inviolables, y en los hijos algo que por derecho propio le pertenece. Es la tercera, en fin, un cierto carácter religioso, al haberse reconocido siempre a la familia, en su origen y en su estructura, una significación sagrada superior a la mera convención o contrato. Ya se exprese en ritos referidos al vínculo superior del totem o dios de la casa, o a los antepasados, o se funde, como en el cristianismo, en el sacramento del matrimonio, el carácter sagrado nunca ha faltado a esta primera y básica institución social que es la familia.
   Puede, pues, definirse la familia como una sociedad natural fundada en los vínculos de la sangre, de la intimidad afectiva y de la interna jerarquía, instituida por Dios para proveer a la vida humana cuando diariamente le es preciso y para perpetuarla. Constituye la familia el conjunto de personas sujetas a la autoridad del padre.
   La familia, como institución social, tuvo en otras épocas una proyección mucho más amplia que la que hoy posee. La libertad de testar y los patrimonios familiares indivisibles –que fueron abolidos a principios del siglo pasado– daban a la familia una prolongación a través de las generaciones, lo que se acompañaba de un mayor vigor en las costumbres propias de cada familia y en la autoridad paterna. Por efecto del estatismo y del individualismo, que son consecuencias paralelas de la Revolución Francesa y del movimiento racionalista moderno, muchas de las funciones de educación y previsión que antes realizaba la familia van pasando al Estado, y la vida individual tiende progresivamente a desarrollarse más fuera de la familia que dentro de ella.

164. SOCIEDAD CONYUGAL, PATERNO-FILIAL Y HERIL

   La familia está integradapor tres sociedades parciales, aunque sólo la primera es esencial para su existencia: la sociedad conyugal o matrimonio, que es fundamento y origen de la familia; la sociedad paterno-filial, que forman los padres y los hijos; la sociedad heril, que integran aquellas personas que voluntariamente se ponen bajo la autoridad de la familia para su servicio.
   <<Prima societas –dice Cicerón– in ipso conjugio est, proxima in liberis, deinde una domus. Id autem es principium et quasi seminarium reipublicae.>><<La primera sociedad está en el matrimonio, la segunda la forman los hijos, y, unida a éstas, la de los criados, se constituye la casa o familia, que es, por decirlo así, el principio y como el germen del estado o sociedad civil.>>.
   A) La sociedad conyugal. –Llámase matrimonio o sociedad conyugal a la unión legítima de hombe y mujer para la procreación y educación de los hijos y para el mutuo apoyo de los cónyuges.
   El matrimonio fue instituido por Dios al crear a los primeros hombres, como función y exigencia de la propia naturaleza humana, tanto en el aspecto de su instinto genésico y de paternidad como en su aspecto racional y volitivo, a los que responde esta forma de unión permanente y espiritualizada. Todas las sociedades y épocas han otorgado un carácter sagrado al matrimonio y reconocido en su institución algo anterior a la misma sociedad civil y respetable por ésta. Jesucristo lo elevó a la dignidad de sacramento, y en la nueva Ley se lo compara con la unión y amor que unen a Cristo con su Iglesia. La iglesia, más tarde, rodeó su celebración de ritos litúrgicos y lo sometió a disposiciones canónicas. La legislación civil, por su parte, regula también el matrimonio y establece para los no cristianos el matrimonio civil, cuyas condiciones de celebración y vigencia resultan de su carácter de contrato.
   Son propiedades del matrimonio, tanto por sus exigencias y tendencias naturales como por su carácter de sacramento, la unidad y la indisolubilidad. Se opone a la primera la poligamia, y a la segunda, el divorcio.
   B) La sociedad paterno-filial. –Llámase sociedad paterno-filial a la constituida por los padres y los hijos, consistente en los lazos de inmediata consanguinidad y mutuo amor, orientada por la naturaleza y por la ley a la crianza y educación de los hijos.
   Esta sociedad parcial dentro de la familia emana asimismo de la naturaleza humana, que requiere una prolongada crianza y educación de los hijos y unas condiciones de amor o intimidad que sólo el ambiente familiar puede deparar. Las leyes eclesiásticas y civiles respetan y protegen esta sociedad como elemento constitutivo y fin primordial de la familia.
   Se denomina patria potestad al conjunto de derechos y deberes que la ley natural otorga a los padres en orden a la educación de los hijos. Esta potestad no es sólo directiva u orientadora, sino también coactiva, y el derecho de corregir y castigar según prudencia adviene a los padres de la misma autoridad divina a través de la paternidad, por ley natural.
   Se oponen al concepto natural y cristiano de la patria potestad las teorías socialistas y totalitarias, según las cuales la educación es función nacional o del Estado, y puede éste separar a los hijos de los padres con fines educativos. Igualmente se oponen a la patria potestad el monopolio estatal de la enseñanza, con la imposición de textos oficiales y de doctrinas sociales y políticas, opuestas a menudo al parecer y voluntad de los padres. La misión de la autoridad civil en orden a la enseñanza sólo puede ser la de facilitar a los padres los medios que puedan servir al fin de la educación, pero sin conculcar ni lesionar los derechos naturales de la patria potestad.
   C) La sociedad heril (de herus, señor). –Es la que forman los criados o sirvientes con los restantes miembros de la familia. En la sociedad cristiana se consideró a los criados como miembros de la familia, y a esta sociedad como una parte, aunque no esencial, de la sociedad familiar. Es esto consecuencia del carácter casi sagrado que se otorgó siempre a la familia y al matrimonio en que se origina. La convivencia dentro de tal medio no consiente la relación puramente laboral del asalariado, sino que ha de penetrarse de la inspiración cordial y religiosa que debe presidir la vida familiar. En la época actual, con la relajación de los vínculos familiares y la difusión del trabajo industrial, la sociedad heril ha venido casi a desaparecer, reducida ya a algunos ambientes campesinos y al servicio doméstico en los medios ciudadanos.

165. LA SOCIEDAD MUNICIPAL. EL MUNICIPIO. SU AUTONOMÍA Y SUS LÍMITES.

   El municipio fue en su origen como el germen de la sociedad civil, nacido del instinto de asociación entre quienes se hallan vinculados a la misma tierra y mantienen entre sí relaciones de vecindad. Por lo mismo requiere, como la sociedad civil, un poder que guarda la misma analogía con la superior potestad civil. Este poder no emana de la autoridad del Estado, aunque, como integrado en éste, guarde con su autoridad unas relaciones de subordinación y representación.
   La sociedad municipal se encuentra profundamente vinculada al origen histórico de la sociedad política o civil. De la multiplicación y desarrollo de familias en un medio determinado nació la gens como entidad superior y coordinadora de los poderes patriarcales (gens romana o fratia griega); y de ésta, gradualmente, la tribu y la ciudad, cuya organización y autoridad coincidían en la antigüedad con lo que hoy llamamos sociedad civil o Estado (recuérdense las antiguas ciudades griegas y la misma Roma). La formación posterior de la nacionalidad y del Estado moderno no puede verse en un desarrollo orgánico de la Ciudad o Municipio, sino en un proceso, a menudo violente y complejo, de incorporación y de conquista. Pero en el seno de las nacionalidades dotadasde un superior poder civil los municipios conservan su entidad peculiar y relativamente autónoma, capaz, en ocasiones, de integrarse sucesivamente en distintas agrupaciones nacionales.
   El municipio típicamente español –el castellano-leonés– tiene su primer desarrollo en el siglo X, y con él se extiende por nuestro suelo una organización local verdaderamente corporativa y en ciero modo democrática, paralela en su desarrollo a la estructura aristocática que crece a la sombra del sistema feudal. El municipio fue –en frase de Menéndez Pelayo– <<expresión de la verdadera, legítima y sacrosanta libertad española>>, y constituyó la célula política que los españoles llevaron a América, sobre la que se edificó la civilización política de aquellos pueblos.
   Existían en España municipios de concejo abierto en pueblos pequeños, con participación de todos los vecinos o cabezas de familia; existían también concejos restringidos a un cierto número de regidores de designación automática, y, en fin, el municipio de representación, por elección de concejales. El municipio tradicional se regía por unas ordenanzas propias y poseía generalmente bienes comunales, con los que atendía a sus necesidades corporativas y, en algún grado, a las de los vecinos. Modernamente, los municipios se vieron privados de sus bienes por las leyes desamortizadoras, y fueron sometidos a una ley común. Se rigen hoy por un Ayuntamiento formado por un número de concejales proporcional a la población, que se agrupan en tres tercios: uno que representa a los vecinos o padres de familia, y se elige por sufragio de éstos; otro, a los sindicatos laborales, y se elige en el seno de los mismos, y otro, en fin, a las entidades culturales, y es de propuesta gubernativa y elección de los otros dos tercios de concejales. Preside el Ayuntamiento un alcalde, que une en sí la presidencia de la corporación y la representación gubernativa, y que es designado por el gobernador de la provincia.

166. LA SOCIEDAD LABORAL O GREMIAL

   Además de la sociedad local, los hombres forman otro género de asociación motivada por el trabajo u ocupación que comparten. Tal es la sociedad gremial o profesional, que ha recibido distintos nombres y estructuras en las diversas épocas y países, pero que es un hecho universal y constante. (Estudiaremos este tipo de asociación y los problemas con que se enfrenta en la actualidad en el capítuo XXXVI.)

Anuncios

Fundamentos de programación con Módula-2 (11)

 

TEMA 5
Estructuras Básicas de la Programación Imperativa

 

Este Tema se dedica a introducir las estructuras básicas de la programación imperativa: Secuencias, Selección e Iteración, indicando la manera de realizar dichas estructuras en Modula-2. Aunque existen otras estructuras, que se introducen en temas posteriores, en este tema se ha preferido insistir fundamentalmente en los conceptos subyacentes en estas estructuras básicas, prescindiendo de los aspectos específicos de un lenguaje particular.

Inicialmente se presentan sólo las estructuras básicas IF-THEN-ELSE y WHILE, y su codificación en Modula-2. Posteriormente se mencionan las estructuras particulares IF-ELSIF-ELSE y FOR derivadas de las anteriores, justificándolas por la comodidad de su uso.


5.1 Programación estructurada

La programación estructurada es una metodología de programación que fundamentalmente trata de construir programas que sean fácilmente comprensibles. Un programa no solamente debe funcionar correctamente, sino que además debe estar escrito de manera que se facilite su comprensión posterior.

Normalmente en todos los programas se tienen que realizar algunas correcciones o modificaciones después de trascurrido un cierto tiempo. En ese momento se trata de evitar lo que a veces llega a suceder, desgraciadamente: si el programa no está claramente escrito, ni el mismo programador que construyó el programa es capaz de entender cómo funciona.

Esta metodología está basada en la técnica de desarrollo de programas por refinamientos sucesivos, tal como se ha expuesto en el Tema anterior. Inicialmente, se plantea la operación global a realizar por el programa, y se descompone en otras más sencillas. A su vez, estas últimas vuelven a ser descompuestas nuevamente en otras todavía más elementales. Este proceso de descomposición continúa hasta que todo se puede escribir utilizando las estructuras básicas disponibles en el lenguaje de programación que se está empleando.

5.1.1 Representación de la estructura de un programa
La estructura de los programas imperativos se representa tradicionalmente mediante diagramas de flujo, llamados en inglés "flow-chart". Estos diagramas contienen dos elementos básicos, correspondientes a condiciones y acciones (Figura 5.1). Las acciones se representan mediante rectángulos, y las condiciones mediante rombos. Las condiciones equivalen a preguntas a las que se puede responder SI o No.

figura(5_1) 
    Figura 5.1 Símbolos de acción y condición.

El flujo de control durante la ejecución del programa se refleja mediante líneas o vías que van de un elemento a otro. Las acciones tienen una sola vía de entrada o comienzo y una de terminación o salida. Las condiciones tienen una vía de entrada, y dos vías de salida marcadas con SI y NO. Durante la ejecución, cuando el flujo llega a la entrada de una acción, la acción se realiza y el flujo se dirige a su salida. Cuando se llega a la entrada de una condición, la condición se evalúa, y si resulta

figura(5_2) 
     Figura 5.2 Ejemplo de diagrama de flujo (a) y acción compuesta (b).

ser cierta se continúa por la salida SI, mientras que si es falsa se continúa por la salida NO. La figura 5.2 contiene un ejemplo sencillo de diagrama de flujo. En esta figura se indica también cómo un fragmento del diagrama, que tenga un solo punto de entrada y uno de salida, puede ser visto globalmente como una acción única, pero compuesta.

La parte de diagrama de flujo en el interior de una acción compuesta constituye la estructura o esquema de dicha acción. La programación estructurada recomienda descomponer las acciones usando las estructuras más sencillas posibles. Entre ellas se reconocen tres estructuras básicas, que son: Secuencia, Selección e Iteración. Estas tres estructuras están disponibles en todos los lenguajes modernos de programación imperativa en forma de sentencias del lenguaje. Combinando unos esquemas con otros se pueden llegar a construir programas con una estructura tan complicada como sea necesario.

figura(5_3)
    Figura 5.3. Secuencia

5.1.2 Secuencia
La estructura más sencilla para emplear en la descomposición es utilizar una secuencia de acciones o partes que se ejecuten de forma sucesiva. En la figura 5.3 se muestra una secuencia de acciones.

La estructura secuencial ya ha sido utilizada en los ejemplos realizados en los temas anteriores. Todos ellos han sido resueltos como una secuencia de sentencias elementales del lenguaje.

5.1.3 Selección
La estructura de Selección consiste en ejecutar una acción u otra, dependiendo de una determinada condición que se analiza a la entrada de la estructura. En la Figura 5.4 se puede ver la estructura de selección. Si la condición analizada (?) da como resultado SI se realiza la acción A y si el resultado es NO se realiza la acción B. Como se puede observar sólo tiene una única entrada y una única salida.

Figura(5_4)
     Figura 5.4 Selección

5.1.4 Iteración
La Iteración es la repetición de una acción mientras que se cumpla una determinada condición. La estructura de iteración más general es aquella en que la condición se analiza a la entrada de la estructura y antes de iniciar cada nueva repetición. En la Figura 5.5 se muestra esta estructura de iteración. Cada vez que se analiza la condición (?) se pueden dar dos resultados.

Figura(5_5)
     Figura 5.5 Iteración

Si el resultado es SI se ejecuta nuevamente la acción. Una vez ejecutada la acción se vuelve a analizar la condición (?). En el momento que el resultado es NO se alcanza el punto final de la estructura. También en este caso sólo existe un punto de entrada y un punto de salida.

Puesto que el flujo de ejecución vuelve hacia atrás siguiendo un camino cerrado, la estructura de iteración se denomina también bucle.

5.1.5 Estructuras anidadas
Cualquier parte o acción del programa puede a su vez estar constituida por cualquiera de las estructuras descritas. Por tanto, el anidamiento entre ellas puede ser tan complejo como sea necesario.

Mediante la técnica de refinamientos sucesivos se definen inicialmente las estructuras más externas del programa y en los pasos sucesivos se va detallando la estructura de cada acción compuesta. Este proceso finalmente da lugar a que todo el programa quede escrito utilizando las estructuras básicas descritas en este apartado anidadas unas dentro de otras.

5.2 Expresiones condicionales

Para poder utilizar las estructuras de Selección e Iteración es necesario expresar las condiciones (?) que controlan ambas estructuras. Esto se realiza mediante la construcción de expresiones condicionales. Estas expresiones sólo pueden dar como resultado dos valores: SI (cierto), cuando se cumple la condición de la expresión, y NO (falso), en caso de que no se cumpla.

Una primera forma de construir expresiones condicionales es mediante el empleo de operadores de comparación en expresiones aritméticas. Estos operadores permiten realizar comparaciones entre dos valores del mismo tipo. Las operaciones de comparación disponibles y sus operadores en Modula-2 son las siguientes:

                     Comparación                         Operador Modula-2
                > Mayor que                                 >
                < Menor que                                 <
                = Igual a                                       =
                >= Mayor o igual que                     >=
                <= Menor o igual que                     >=
                <> Diferente a                               <>    #

Los símbolos de operadores Modula-2 con dos caracteres deben escribirse precisamente en ese orden, y sin espacios en blanco entre ellos. El operador de desigualdad puede escribirse de dos maneras, tal como se indica.

Veamos un ejemplo. Sean las variables declaradas siguientes:

VAR
   largo, ancho : INTEGER;
   presion, temperatura : REAL;
   letra, modelo : CHAR;

Con los operadores de comparación se pueden formar expresiones condicionales tales como las siguientes:

largo > 5
ancho = largo
presion <= 23.5
modelo = "Z"
letra <> modelo
presion # temperatura

Con los operadores de comparación sólo es posible realizar un única comparación entre dos valores. Sin embargo, es bastante normal que las condiciones sean más complejas. Pueden construirse condiciones que impliquen a más de dos valores como condiciones compuestas de varias condiciones simples.

Las condiciones compuestas se construyen como expresiones lógicas. Cada término de una expresión lógica podrá ser una expresión condicional simple. Las operaciones lógicas entre dos expresiones simples E1, E2 y los correspondientes operadores disponibles en Modula-2 son los siguientes:

                 Operación lógica                    Operador Modula-2
         Conjunción (E1 y E2)                        AND    &
         Disyunción (E1 o E2)                        OR
         Negación (no E1)                              NOT   ~

Los símbolos de los operadores lógicos de Modula-2 son las palabras que se indican, y que deben escribirse precisamente así, en mayúsculas (los operadores de conjunción y negación pueden escribirse también con los signos especiales "ampersand" y "tilde", respectivamente).

La operación de conjunción E1 AND E2 da resultado cierto si tanto E1 como E2 son ciertas. La operación de disyunción E1 OR E2 da resultado cierto si una de las dos, E1 o E2, o ambas, son ciertas. El operador NOT se aplica a un solo término y niega el resultado de dicho término. Este operador se utiliza cuando una condición queda expresada de manera más sencilla como complemento de otra.

Con estos nuevos operadores es posible construir condiciones complejas tales como las siguientes:

(largo > 5) AND (ancho < 7)
(modelo = "A") OR (modelo = "Z")
NOT (letra = "Q")
(temperatura <= 123.7) & (presion < 12.3)

con el significado que fácilmente se puede deducir. La razón del empleo de paréntesis es indicar el orden preciso de ejecución de las operaciones: primero las comparaciones y posteriormente las operaciones lógicas. Por defecto, se realizan primero las operaciones lógicas y posteriormente las comparaciones.

La complejidad de las expresiones puede ser tan grande como sea necesario; el número de términos lógicos que pueden combinarse es ilimitado. Además, cada valor numérico se puede obtener mediante una expresión aritmética. Por ejemplo, son expresiones condicionales válidas las siguientes:

(largo < 3) AND (ancho < 9) AND (largo*ancho < 25)
NOT ((letra = "Q") OR (letra = "Z"))
(3.5*temperatura – presion/5.6) < 54.6

En la evaluación de estas expresiones complejas el orden que se sigue viene fijado por un nivel de prioridad que tienen asignadas las distintas operaciones. Es decir, cada operador tiene una prioridad determinada. Si no se utilizan paréntesis el orden de evaluación es el siguiente:

1º Operador de Negación:                NOT ~
2º Operadores Multiplicativos:          * / DIV MOD AND &
3º Operadores Aditivos:                   + – OR
4º Operadores de Comparación:       > < = >= <= <> #

Dentro del mismo nivel las operaciones se evalúan en el orden en que están escritas en la expresión, de izquierda a derecha. Así, si se hubiera prescindido de los paréntesis en las últimas expresiones:

largo < 3 AND ancho < 9 AND largo*ancho < 25
NOT letra = "Q" OR letra = "Z"
3.5*temperatura – presion/5.6 < 54.6

y siguiendo los criterios de evaluación anteriores, estas expresiones serían equivalentes a las que se indican a continuación, en las que se ha marcado con paréntesis el orden de la evaluación por defecto:

largo < (3 AND ancho) < ((9 AND largo)*ancho) < 25
(NOT letra) = ("Q" OR letra) = "Z"
((3.5*temperatura) – (presion/5.6)) < 54.6

Con estas expresiones sólo se trata de mostrar las reglas de evaluación por defecto, dado que como se puede observar, las dos primeras expresiones están sintácticamente mal construidas y no tienen ningún sentido.

Las reglas BNF que definen cómo se pueden escribir expresiones, además de las expresiones aritméticas, incluyen aquellas expresiones que expresan condiciones y son las siguientes:

Expresión ::=
   Expresión_simple [ Operador_comparador Expresión_simple ]

Expresión_simple ::= [ + | – ] Termino { Operador_sumador Termino }

Termino ::= Factor { Operador_multiplicador Factor }

Factor ::=
   Identificador_de_Variable | Identificador_de_Constante | Valor_Constante | (Expresión) | NOT Factor

Operador_comparador ::= > | < | = | >= | <= | <> | #
Operador_sumador ::= + || OR
Operador_multiplicador ::= * | / | DIV | MOD | AND | &

Curso de Filosofía elemental (26)

xxx

Los deberes del hombre

 

150. RELACIÓN ENTRE DERECHO Y DEBER. CONCEPTO DE DEBER

   En su sentido subjetivo el derecho es, como hemos visto, la facultad moral de hacer o de exigir algo que por ley (natural o positiva) nos corresponde. Dado que sólo de otra persona podemos tener tal exigencia moral, sucede que a todo derecho en una persona corresponde un deber en otra, ante todo, de respetarlo. El derecho, considerado en sí mismo, es anterior al deber; incluso el deber radical en el hombre de obedecer la ley divina sigue al derecho del mismo Dios de ser acatado por la criatura.
   Deber es así la vinculación o atadura moral que nos exige respetar el derecho de una persona, ante todo el de Dios, autor del orden y las leyes naturales.
   El derecho, hemos dicho, puede ser natural o positivo. Recíprocamente, el deber será también natural o positivo. En el primer caso hay una relación de tipo moral, puesto que el deber se mantiene simplemente en un ámbito natural. En el segundo caso, la relación es jurídica, dado que nace con una sanción de tipo legal positivo.

151. CLASIFICACIÓN DE LOS DEBERES

   Los deberes pueden clasificarse atendiendo al fundamento y atendiendo al término de los mismos.
   Por el fundamento, los deberes se dividen en absolutos y derivados.
   Los deberes absolutos emanande la misma condición de la persona humana y se corresponden con los derechos innatos. Por ejemplo, el deber de respetar la vida del prójimo.
   Los deberes derivados emanan de las situaciones concretas de las personas en la sociedad y se corresponden con los derechos adquiridos. Así, el deber de obedecer al gobernante concreto deriva de la situación de éste como tal y de nuestra vinculación a la comunidad que gobierna circunstancias ambas que pueden variar.
   Por su término, los deberes se clasifican según las personaspara quienes se tienen. El deber es la inclinación moral al reconocimiento de un derecho. Como sólo las personas son sujeto de derecho, se deduce que sólo las personas pueden formalmente ser término de nuestros deberes. Por consiguiente, según las clases de personas, así también las clases de deberes: para con Dios, para con los demás y para con nosotros mismos.

152. DEBERES PARA CON DIOS

   Siendo Dios el creador de nuestro ser, se comprenderá:
A) Que nuestro ser se lo debemos a El; por consiguiente, tenemos deberes de justicia hacia El, aunque nunca podamos compensar todo lo que de El hemos recibido.
B) Pero no sólo deberes de justicia, sino también deberes de caridad, por cuanto El es el supremo bien y, por tanto, el máximamente amado. Amar a Dios sobre todas las cosas, es decir, preferir perderlas todas antes que negarle o que ofenderle es el fundamento de la vida religiosa.
   Estos deberes de justicia y de caridad para con Dios se concretan en la virtud de la religión, por la que otorgamos a Dios el debido tributo de fe, amor, adoración y culto.

153. DEBERES PARA CON EL PRÓJIMO

   En la persona del prójimo podemos distinguir su cuerpo y su alma. Consecuentemente distinguiremos:
a) Deberes para con el cuerpo ajeno: El principal deber es el de respetar la vida y la integridad física del prójimo: "no matar". Este deber queda dispensado en el caso de la defensa de la propia vida o en el caso del verdugo, que es puro instrumento.
b) Deberes para con el alma ajena:
   Deberes relativos al entendimiento. El principal deber es la veracidad; es decir, la adecuación de las palabras con el propio pensamiento. El fin natural de la palabra y el derecho del prójimo a no ser engañado así lo exigen. Algunos autores defienden la mentira como arma política indispensable; así, los socialistas y totalitarios, que afirman la necesidad estatal de una información dirigida y de una diplomacia exterior a cuyo servicio se coloquen la verdad y el error. Pero esto es desconocer que el gobernante humano recibe su autoridad de Dios y que el orden jurídico ha de basarse, para serlo, en la ley moral natural.
   Es cierto que no a todo el mundo ni en toda ocasión estamos obligados a decir toda la verdad. Pero no declarar la verdad por un serio motivo no supone faltar a ella ni decir mentira. La mentira y la hipocresía (mentira en acción) no son nunca lícitas porque constituyen una violación de los fines intrínsecos del lenguaje y medios de expresión, y se oponen al derecho del prójimo a poseer la verdad y a no ser inducidos a error.
   Deberes relativos a la voluntad. El deber principal es no perturbar la voluntad del prójimo, respetándola en su naturaleza íntima, en su libertad. Por ello no es lícito mantener la esclavitud en ninguna de sus formas, antigua o moderna.
c) Deberes para con los bienes ajenos: El más preciado bien de cada uno es –o debe ser– su propia reputación; es decir, el buen nombre que su vida moral ha merecido de los demás. La calumnia, la murmuración o maledicencia se oponen al primer deber para con los bienes del prójimo. Es asimismo para con los bienes ajenos el respeto a su legítima propiedad privada, tanto en la actuación privada como en la pública.

154. DEBERES PARA CON NOSOTROS MISMOS

   El deber primero para con nosotros mismos consiste en la recta estimación de sí propio, respetando y amando la vida que Dios nos dio y la tendencia a la verdad y al bien que con la vida racional nos infundió. Este deber se especifica en deberes varios para con el alma y para con el cuerpo.
a) Para con el alma: Es el primero procurar con nuestras fuerzas una recta ordenación de la vida propia que, asentándola en la verdad, nos lleve a la formación de las virtudes tanto intelectuales como morales.
b) Para con el cuerpo: El principal deber estriba en la preservación de la vida que Dios nos dio evitando malgastarla en el vicio o la temeridad, y evitando sobre todo el suicidio que, cuando es plenamente consciente, entraña una rebeldía íntima contra el ser y la vida en que Dios nos mantiene contra el mismo Dios en definitiva.

 

FILOSOFIA DE LA SOCIEDAD

 

XXXI

Sociología

 

155. CONCEPTO Y OBJETO DE LA SOCIOLOGÍA

   El estudio de justicia, del derecho y de los deberes nos conducen a la noció de sociedad, esa realidad que forma el hombre con sus semejantes, en la cual se ejerce la virtud de la justicia y se entabla la relación de derecho y de deber.
   Qué sea la sociedad, cuál su origen y sus fines, cómo su forma ideal, han sido siempre temas de la reflexión humana de los que se han ocupado los filósofos desde la misma antigüedad clásica. PLATÓN y ARISTÓTELES tuvieron una filosofía de la sociedad, como lo han tenido todos los grandes pensadores y sistemas de filosofía.
   Esta reflexión filosófica sobre la sociedad, que es tan antigua como la filosofía misma, difiere, sin embargo, de lo que modernamente se ha llamado Sociología, con nombre híbrido del latín y griego. Se considera fundador de esta nueva ciencia al francés AUGUSTO COMTE, que vivió en la primera mitad del siglo pasado, y cuyo sistema de pensamiento se llamó positivismo. Para el positivismo, el único conocimiento posible para el hombre (y el verdadero) es el que utilizan las ciencias físico-matemáticas, conocimiento que prescinde de causas o principios últimos y se atiene sólo a los hechos concretos, experimentales, para obtener de ellos un conocimiento asimismo relativo y experimental. Según Augusto Comte, también de los hechos sociales se puede obtener un conocimiento de este género que sirva para prever su desarrollo y para organizar la sociedad del futuro.
   En consecuencia, así como la antigu Filosofía de la Sociedad consideraba a ésta y a los hechos sociales como resultados comprensibles a partir de la vida personal y de la naturaleza humana, la sociología moderna pretende ver como hechos originales las formas y realidades sociales y estudiarlas por procedimientos propios y científicos, semejantes a los que las ciencias particulares emplean para el sector de la realidad que tratan.

156. POSIBILIDAD Y LÍMITES DE LA SOCIOLOGÍA

   A) Posibilidad de la sociología. –La sociología, en cuanto a ciencia es posible en tanto que existen hechos y relaciones característicamente sociales y que sobre estos hechos pueden descubrise conexiones causales, leyes de funcionamiento u otra forma de conexión cualquiera que signifique un conocimiento de sus regularidades internas.
   Generalmente, el conocimiento de un campo de objetos permite predecir hechos nuevos. Así, cuando logramos conocer y organizar mentalmente los movimientos de los planetas, podemos predecir eclipses, esto es, construir mentalmente hechos que luego se ven comprobados.
   La sociología en este sentido es ciencia, por cuanto predice multitud de fenómenos sociales.
   B) Límites de la sociología. –Sin embargo, las formas sociales están encarnadas en individuos humanos, los cuales son seres libres, que en gran medida pueden reaccionar sobre esas formas, y, por tanto, sustraerse a las leyes sociológicas. Por ello:
   a) Ni las leyes sociales pueden agotar la totalidad de la vida humana, que es mucho más compleja e imprevisible.
   b) Ni sus predicciones son nunca fatales o matemáticas. Son, sin embargo, probables, según las leyes de los grandes números. Así, si en una ciudad de un millón de habitantes es ley sociológica que haya anualmente diez asesinatos o doscientos muertos por accidente; estas leyes, ciertamente, no se refieren a los individuos concretos, no establecen que determinado ciudadano vaya a resultar asesinado, pero se cumplen numéricamente con relativa exactitud.
   Esto limita a la sociología, que no puede emitir leyes necesarias, contra lo que pensaban algunos sociólogos de finales del siglo pasado. Pero ello no anula el carácter científico de la sociología. Puede, pues admitirse una sociología científica junto a la filosofía de la sociedad siempre que se acepten los límites que la individualiadd y la libertad humanas imponen a la previsión y a las leyes sociológicas; y siempre también que se prescinda de las pretensiones del sociologismo de organizar técnicamente a la sociedad mediante el conocimiento y la previsión sociológica. Con estas limitaciones, el estudio de la sociología es útil a muchas esferas del saber y del hacer, especialmente a la política, como arte de la gobernación de las sociedades humanas.

157. MÉTODOS SOCIOLÓGICOS

   La investigación de las estructuras y leyes sociológicas puede desarrollarse según diferentes métodos que nos permiten alcanzar distintos aspectos y niveles de la realidad social:
   A) El método filosófico, que busca la comprensión de las últimas razones determinantes de los fenómenos sociales y su significación más profunda, tanto en el hombre como en el mundo. El método filosófico aplicado a la sociología es lo que hemos llamado teoría o Filosofía de la Sociedad.
   B) El método de las ciencias positivas. No buscamos con él los últimos principios, pero sí, en cambio, conceptos y enlaces causales, más concretos y útiles para organizar con precisión y detalle el campo de los hechos sociológicos. Pueden señalarse varios métodos aplicables a la sociología.
a) Existe, en primer término, una dirección de la sociología eminentemente empírica, inclinada a la sociología histórica, o a la sociografía. Se preocupa por registrar los hechos y formas concretas, buscando la filiación histórica (por ejemplo: sociología de la familia monógama, de determinada sociedad secreta, etc.). LE PLAY es autor clásico de esta dirección, con sus monografías sociológicas.
b) Otra corriente sociológica trata los hechos sociales como realidades físicas, procurando hallar sus factores internos, su grado de cohesión, sus correlaciones causales, etc. Para ello emplea los métodos de encuesta y sondeo, así como la determinación de actitudes psicosociológicas, siempre auxiliada por procedimientos estadísticos. La actual sociología norteamericana discurre por este cauce (DEWEY, LEWIN, SOROKIN, etc.).
c) Hay, en fin, otra dirección de la sociología positiva, llamada sociología pura, que busca más bien delimitar figuras o formas sociológicas abstractas, por encima de tiempos y lugares, al modo como la geometría estudia las figuras y formas geométricas en abstracto y no en sus realizaciones. Entre estas formas sociológicas distingue VON WIESSE, por ejemplo, las masas, los grupos y las colectividades abstractas, cada una de las cuales posee características de cohesión y de relaciones propias. VON WIESSE, MAX WEBER, MANNHEIM, son sociólogos inclinados hacia esta dirección de la sociología.

Fundamentos de programación con Módula-2 (10)

 

4.4.3 Elección de nombres
Otro aspecto de estilo, fundamental para la claridad de un programa, es la elección correcta de los nombres o identificadores utilizados para designar sus diferentes elementos. Los nombres que haya de inventar el programador deben ser elegidos con un criterio nemotécnico, de manera que recuerden fácilmente el significado de los elementos nombrados.

Para evidenciar la importancia de usar nombres adecuados, compararemos dos redacciones de un mismo programa. La primera, con nombres carentes de significado sería:

MODULE xyz;
   FROM InOut IMPORT
      ReadInt, WriteInt, WriteString, WriteLn;
   VAR
      x, y, z: INTEGER;
BEGIN
   ReadInt( x );
   ReadInt( y );
   z := x * y;
   WriteString( "Area = " );
   WriteInt( z, 10 )
END xyz.

La segunda redacción del programa, con nombres significativos, podría se:

MODULE CalcularAreaRectangulo;
   FROM InOut IMPORT
      ReadInt, WriteInt, WriteString, WriteLn;
   VAR
      base, altura, area: INTEGER;
BEGIN
   ReadInt( base );
   ReadInt( altura );
   area := base * altura;
   WriteString( "Area = " );
   WriteInt( area, 10 )
END CalcularAreaRectangulo.

Comprando ambas redacciones es muy fácil darse cuenta de la ventaja de la segunda, cuyo significado puede adivinarse fácilmente incluso con la total ausencia de comentarios explicativos en el programa.

Para que los nombres o identificadores resulten significativos hay que procurar que tengan la categoría gramatical adecuada al elemento nombrado. En concreto:

  • Los valores (constantes, variables, etc.) deben ser designados mediante sustantivos.
  • Las acciones (procedimientos, etc.) deben ser designadas mediante verbos.
  • Los tipos deben ser designados mediante nombres genéricos.

En programas largos con muchos identificadores resulta a veces difícil inventar nombres significativos que distingan fácilmente entre valores y tipos. Un recurso de estilo puede ser construir los identificadores de tipo usando sistemáticamente el prefijo Tipo o similar en todos ellos; por ejemplo TipoLongitud.

Al usar verbos, conviene emplearlos de manera uniforme utilizando siempre el mismo tiempo gramatical. En inglés suelen aparecer en imperativo. En español resulta quizá más eficaz emplear sistemáticamente el infinitivo. Por ejemplo, el equivalente en español de los nombres de los procedimientos de lectura y escritura podría ser:

         WriteString                EscribirRistra
         WriteLn                     EscribirFinDeLinea
         WriteInt                     EscribirEntero
         ReadInt                     LeerEntero
            …                               …

A continuación se presenta un ejemplo de programa completo, incluyendo identificadores de diferentes clases elegidos según las recomendaciones anteriores. En este ejemplo se ha supuesto que existe un módulo llamado Fechas que define procedimientos para manipular datos de tipo fecha. El estilo seguido para elegir los nombres inventados por el programador ha sido:

  • Los nombres de operaciones (procedimientos y programa principal) son verbos en infinitivo:
                   CalcularDias        LeerFecha              EscribirFecha
  • Los nombres de valores (funciones y variables) son sustantivos:
                   DiasEntre             Hoy                fechaCumple
                   fechaHoy              dias
  • Los nombres de tipo empiezan por el prefijo Tipo:
                    TipoFecha

(**********************************************************
*
*    Programa: CalcularDias
*
*    Descripción:
*      Este programa calcula los días que faltan para el
*      cumpleaños de una persona.
***********************************************************)

MODULE CalcularDias;

(*=========================================================
    IMPORTACIÓN Y DECLARACIONES DEL PROGRAMA
=========================================================*)
  FROM InOut IMPORT WriteString, WriteLn;
  FROM Fechas IMPORT
    TipoFecha,                            (* Tipo de valor FECHA *)
    LeerFecha,                            (* Leer una fecha *)
    EscribirFecha,                        (* Escribir una fecha *)
    Diasentre,                            (* Dias entre dos fechas *)
    Hoy;                            (* Fecha de hoy *)

  VAR
    fechaCumple: TipoFecha;                    (* Cumpleaños *)
    fechaHoy: TipoFecha;                    (* Fecha de hoy *)
    dias: INTEGER;                        (* Días que faltan *)

BEGIN
(*=========================================================
    PARTE EJECUTABLE DEL PROGRAMA
=========================================================*)
  (*– Obtener la fecha de cumpleaños –*)
    WriteString( "¿Cuál es tu próximo cumpleaños? ");
    LeerFecha( fechaCumple );
  (*– Obtener la fecha de hoy –*)
    fechaHoy := Hoy;
  (*– Calcular los días que faltan para el cumpleaños –*)
    dias := DiasEntre( fechaHoy, fechaCumple );
  (*– Imprimir resultado –*)
    WriteLn; WriteString( "Faltan" );
    WriteInt( dias, 4);
    WriteString( " días para tu cumpleaños" );
END CalcularDias.

4.4.4 Uso de letras mayúsculas y minúsculas
Los lenguajes de programación que permiten distinguir entre letras mayúsculas y minúsculas facilitan la construcción de nombres en programas largos, en que es preciso inventar un gran número de ellos.

Por ejemplo, para marcar claramente a qué clase de elemento del programa se está refiriendo un nombre, se puede adoptar el criterio de que los identificadores de ciertas clases de elementos empiecen siempre con mayúscula, y otros siempre con minúscula, o que algunos muy especiales se escriban todo en mayúsculas.

Por otra parte, al elegir nombres compuestos se pueden usar mayúsculas intercaladas para marcar el comienzo de cada parte, como ya se ha visto para los módulos de lectura y escritura "estándar" InOut y RealInOut. Así se ha hecho también en el ejemplo del apartado anterior, donde además se han empleado nombres de tipos y de procedimientos que siempre empiezan con mayúsculas, y nombres de variables que siempre empiezan con minúscula.

En el ejemplo del apartado anterior se han seguido esas mismas reglas de estilo para escribir los identificadores inventados por el programados:

  • Los nombres de tipos, procedimientos, funciones y programas empiezan por mayúsculas:
              CalcularDias            LeerFecha             EscribirFecha
              DiasEntre                Hoy
  • Los nombres de variables empiezan por minúscula:
               fechaCumple            fechaHoy             dias
  • Los nombres que son palabras compuestas usan mayúsculas intercaladas al comienzo de cada siguiente palabra componente:
               CalcularDias             LeerFecha              EscribirFecha
               DiasEntre                 fechaCumple           fechaHoy

En cualquier caso hay que limitar mucho el empleo de nombres escritos totalmente en mayúsculas, ya que en general hacen más pesada la lectura del texto del programa. Sólo deberían escribirse así elementos que han de destacar entre los demás, como ya ocurre con las palabras clave del lenguaje Modula-2.

Compárese el siguiente programa, escrito todo en mayúsculas, con el ejemplo correspondiente del apartado 4.4.3. La lectura resulta ahora mucho más difícil.

MODULE CALCULARAREARECTANGULO;
   FROM INOUT IMPORT
      READINT, WRITEINT, WRITESTRING, WRITELN;
   VAR
      BASE, ALTURA, AREA: INTEGER;
BEGIN
   READINT( BASE );
   READINT( ALTURA );
   AREA := BASE * ALTURA;
   WRITESTRING( "AREA = " );
   WRITEINT( AREA, 10 )
END CALCULARAREARECTANGULO.

4.4.5 Constantes con nombre
La posibilidad de declarar constantes con nombres simbólicos puede aprovecharse para mejorar la claridad del programa. En lugar de usar directamente valores numéricos en las expresiones de algunos cálculos, puede resultar ventajoso definir determinados coeficientes o factores de conversión con un nombre simbólico que tenga un buen significado nemotécnico, y usar la constante con ese nombre en los cálculos. Por ejemplo, para transformar una longitud de pulgadas a centímetros, en lugar de escribir

                longitudCm := longitudPul * 2.54

se podría poner

                CONST cmPorPulgada = 2.54;
                 …
                longitudCm := longitudPul * cmPorPulgada

Esta segunda forma resultará más significativa para los que no recuerden de memoria ese factor de conversión. Además se tiene una ventaja adicional en el caso de que un mismo valor constante se use en varios puntos del programa; al definirlo como constante con nombre el valor numérico particular se escribe sólo una vez, en la definición, en lugar de hacerlo tantas veces como se use, y así se reducen las posibilidades de cometer errores de escritura.

Otra forma ventajosa de usar el mecanismo de definición de constantes con nombre se da en el caso de que el comportamiento de un programa venga dado en función de ciertos valores generales, fijos, pero que quizá fuera interesante cambiarlos en el futuro. Este tipo de valores se denominan a veces parámetros del programa, y es conveniente que su valor aparezca escrito sólo una vez en lugar destacado del programa. Por ejemplo, un programa para reformar un texto antes de enviarlo a la impresora puede tener como parámetros generales el ancho de la línea de escritura, o el tamaño de la página. Podríamos escribir, al comienzo del programa:

(*=============================================
               PARÁMETROS GENERALES
=============================================*)
   CONST
      AnchoLinea = 72;
      LineasPagina = 60;

De esta manera queda perfectamente destacada la parte del programa que hay que modificar si se quieren cambiar las dimensiones útiles de la hoja impresa.

4.5 Ejemplos de programas

A continuación se desarrollan algunos programas sencillos mediante refinamientos sucesivos.

4.5.1 Ejemplo: Imprimir la figura de un árbol de navidad
Se trata de escribir un programa que imprima la silueta de un árbol de navidad convencional, según aparece en el siguiente listado resultado de la impresión:

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

Para estructurar el programa trataremos de identificar las diferentes partes de la figura del árbol. Podemos reconocer la copa, formada por tres pisos de ramas, el tronco, y la base. Teniendo en cuenta que las distintas partes han de imprimirse de arriba a abajo, organizaremos los primeros pasos de refinamiento:

       Imprimir árbol —>
           
Imprimir copa
            Imprimir tronco
            Imprimir base

      Imprimir copa —>
           
Imprimir primeras ramas
            Imprimir segundas ramas
            Imprimir terceras ramas

La impresión de cada parte se consigue directamente con sentencias de escrituras sencillas. Podemos pasar ya a escribir el programa en Modula-2, documentándolo de acuerdo con las reglas de estilo propuestas. El programa completo aparece a continuación.

(********************************************************
*
*    Programa: ARBOL
*
*    Autor: M. Collado
*
*    Descripción:
*       Este programa imprime la silueta de un árbol
*      de navidad, hecha con asteriscos
*
********************************************************)

MODULE Arbol;

(*=======================================================
    IMPORTACIÓN Y DECLARACIONES DEL PROGRAMA
=======================================================*)
  FROM InOut IMPORT WriteString, WriteLn;

BEGIN
(*=======================================================
    PARTE EJECUTABLE DEL PROGRAMA
=======================================================*)
  (*– Imprimir copa –*)
    (*– Imprimir primeras ramas –*)
      WriteString( "    *"); WriteLn;
      WriteString( "   ***"); WriteLn;
      WriteString( "  *****"); WriteLn;
    (*– Imprimir segundas ramas –*)
      WriteString( "   ***"); WriteLn;
      WriteString( "  *****"); WriteLn;
      WriteString( " *******"); WriteLn;
    (*– Imprimir terceras ramas –*)
      WriteString( "  *****"); WriteLn;
      WriteString( " *******"); WriteLn;
      WriteString( "*********"); WriteLn;
    (*– Imprimir tronco –*)
      WriteString( "    *"); WriteLn;
      WriteString( "    *"); WriteLn;
      WriteString( "    *"); WriteLn;
    (*– Imprimir base — *)
      WriteString( "  *****"); WriteLn;
END Arbol.

4.5.2 Ejemplo: Calcular el costo de las baldosas
Se trata de calcular el costo total de las baldosas necesarias para cubrir el suelo de una habitación rectangular. Se supone que las baldosas son cuadradas. El programa lee como dato el lado de las baldosas, en centímetros, y las dimensiones de la habitación rectangular en metros. También se suministra como dato el precio unitario de cada baldosa.

El programa calcula cuántas baldosas hay que colocar a lo largo de cada dimensión de la habitación, incluyendo contar una baldosa más si no es un número entero, y hay que romper algunas baldosas para cubrir exactamente hasta el borde. A continuación se calcula el número total de baldosas y se multiplica por el precio de cada una.

En forma  abreviada, los primeros pasos de descomposición conducen a:

         Calcular el costo de baldosas —>
               
Leer los datos
                Calcular el número de baldosas
                Calcular el coste total
                Imprimir el resultado

         Calcular el número de baldosas —>
               
Calcular las baldosas a lo largo
                Calcular las baldosas a lo ancho
                Calcular el número total de baldosas

El progra completo, debidamente documentado, aparece en el siguiente listado:

(**************************************************************
*
*    Programa: BALDOSAS
*
*    Autor: S.R. Gómez
*
*    Implementación: Ernesto Rodas (THC_CAOS)
*
*    Descripción:
*      Este programa calcula el costo de las baldosas
*      necesarias para cubrir una habitación rectangular.
*
**************************************************************)
MODULE Baldosas;

(*============================================================
    IMPORTACIÓN Y DECLARACIONES DEL PROGRAMA
============================================================*)
  FROM InOut IMPORT WriteString, WriteLn, WriteInt, ReadInt;

  VAR
    largo, ancho: INTEGER;    (* Dimensiones de la habitación *)
    lado: INTEGER;        (* Lado de la baldosa, en cm. *)
    nLargo: INTEGER;        (* Núm. de baldosas a lo largo *)
    nAncho: INTEGER;        (* Núm. de baldosas a lo ancho *)
    baldosas: INTEGER;        (* Número total de baldosas *)
    precio: INTEGER;          (* Precio de cada baldosas *)
    coste: INTEGER;        (* Coste total *)

BEGIN
(*==========================================================
    PARTE EJECUTABLE DEL PROGRAMA
==========================================================*)
 (*– Leer datos –*)
    WriteString( "Dar el tamaño de la habitación, en m." );
    WriteLn;
    WriteString( "¿Largo, ancho? " );
    ReadInt( largo ); ReadInt ( ancho ); WriteLn;
    WriteString( "¿Lado de la baldosa, en cm.? " );
    ReadInt( lado ); WriteLn;
    WriteString( "¿Precio de cada baldosa, en pts.? " );
    ReadInt( precio ); WriteLn;

  (*– Calcular el número de baldosas –*)

    (*– Calcular las baldosas a lo largo, por exceso –*)
    nLargo := ( largo*100+lado-1 ) DIV lado;

    (*– Calcular las baldosas a lo ancho, por exceso –*)
    nAncho := ( ancho*100+lado-1) DIV lado;

    (*– Calcular el número total de baldosas –*)
      baldosas := nLargo * nAncho;

    (*– Calcular el coste total –*)
    coste := baldosas * precio;

    (*– Imprimir el resultado –*)
    WriteString( "Total" ); WriteInt( baldosas, 5 );
     WriteString( " baldosas"); WriteLn;
    WriteString( "Coste" ); WriteInt( coste, 6 );
    WriteString( " pts." ); WriteLn
END Baldosas.

El resultado de una posible ejecución es el siguiente:

Dar el tamaño de la habitación, en m.
¿Largo, ancho? 4 6
¿Lado de la baldosa, en cm.? 30
¿Precio de cada baldosa, en pts.? 56
Total  280 baldosas
Coste 15680 pts.

4.5.3 Ejemplo: Calcular los días entre dos fechas
Este ejemplo consiste en calcular la diferencia en días entre dos fechas. Para simplificar, el cálculo se hace en forma aproximada, contando todos los meses a razón de 30 días cada uno, y los años completos siempre con 365 días.

El cálculo se hace en dos partes. Primero se calculan para cada fecha los días transcurridos desde el comienzo de su año. Luego se calcula la diferencia entre fechas, pasando la diferencia en años a días y acumulando la diferencia en días dentro del año.

Los pasos de descomposición son relativamente sencillos:

           calcular la diferencia de fechas —>
                    leer las fechas
                    calcular la diferencia
                    imprimir el resultado

           calcular la diferencia —>
                    calcular los días desde principio del año
                    calcular la diferencia total en días

El programa completo aparece en el siguiente listado:

(***************************************************************************
*
*    Programa: DIFERENCIA EN DIAS
*
*    Autor: J.F. Estívariz
*
*    Implementación: Ernesto Rodas (THC_CAOS)
*
*    Descripción:
*      Este programa calcula los días entre dos
*      fechas, en forma aproximada, contando todos
*      los meses de 30 días, y los años de 365.
*
***************************************************************************)
MODULE DiferenciaEnDias;

(*==========================================================================
    IMPORTACIÓN Y DECLARACIONES DEL PROGRAMA
==========================================================================*)
  FROM InOut IMPORT WriteString, WriteLn, WriteInt, ReadInt;

  VAR
    dia1, mes1, anno1: INTEGER;        (* primera fecha *)
    dia2, mes2, anno2: INTEGER;        (* segunda fecha *)
    diasFecha1, diasFecha2: INTEGER;    (* días desde comienzo el año *)
    diferencia: INTEGER;        (* diferencia en días *)

BEGIN
(*==========================================================================
    PARTE EJECUTABLE DEL PROGRAMA
===========================================================================*)
  (*– Leer las fechas –*)
    WriteString( "¿Primera fecha (dd mm aa)? " );
    ReadInt( dia1 ); ReadInt( mes1 ); ReadInt( anno1 ); WriteLn;

    WriteString( "¿Segunda fecha (dd mm aa)? " );
    ReadInt( dia2 ); ReadInt( mes2 ); ReadInt( anno2 ); WriteLn;

  (*– Calcular la diferencia –*)
    (*– Calcular los días desde principio del año –*)
    diasFecha1 := (mes1 – 1)*30 + dia1;
    diasFecha2 := (mes2 – 1)*30 + dia2;

    (*– Calcular la diferencia total en días –*)
    diferencia := (anno2 – anno1)*365 + diasFecha2 – diasFecha1;

  (*– Imprimir el resultado –*)
    WriteString( "Desde " ); WriteInt( dia1, 2 );
    WriteString( "/" ); WriteInt( mes1, 2 );
    WriteString( "/" ); WriteInt( anno1, 4 ); WriteLn;

    WriteString( "hasta "); WriteInt( dia2, 2 );
    WriteString( "/" ); WriteInt( mes2, 2 );
    WriteString( "/" ); WriteInt( anno2, 4 ); WriteLn;

    WriteString( "hay" ); WriteInt( diferencia, 6 );
    WriteString( " días" ); WriteLn
END DiferenciaEnDias.

El resultado de una posible ejecución del programa es el siguiente:

¿Primera fecha (dd mm aa)? 20 3 1993
¿Segunda fecha (dd mm aa)? 14 1 1995
Desde 20/ 3/1993
hasta 14/ 1/1995
hay   664 días

Curso de Filosofía elemental (25)

XXVIII
 
La justicia
 
 
 
141. LA JUSTICIA COMO VIRTUD
 
   La justicia, entendido el término en su acepción más amplia, es la práctica habitual del bien moral; este sentido coincide, como veremos, con el que le otorgaba Platón, para quien era como el compendio o conjunto de las virtudes.
   Como virtud especial se entiende por justicia el hábito de dar a cada uno lo que es suyo, lo que le pertenece. Lo que a cada persona pertenece es su derecho, su jus (de aquí justicia). Santo Tomás definía la justicia como: constans et perpetua voluntas jus suum cuique tribuendi. Una voluntad constante, habitual, de dar a cada uno aquello que por ley natural o positiva le correspond; esto es, de respetar su derecho y no perjudicarle en el mismo. Los deberes que emanan de la justicia se resumen en fórmulas clásicas: <<cuique suum>> y <<neminem laede>>.
   La justicia es la base en que se apoyan las relaciones humanas y sobre la que se edifica el orden social. No puede pervivir pacíficamente una sociedad que no se asiente en una más o menos justa correlación entre los derechos y deberes de sus miembros, y en una justa distribución de los bienes y de las cargas comunes. Por ello mismo Platón hizo de la justicia la virtud propia o característica de la ciudad (polis) o Estado.
 
 
142. CONCEPTOS PLATÓNICOS Y ARISTOTÉLICO DE LA JUSTICIA
 
   La elaboración del concepto de justicia correspondió a PLATÓN y a ARISTÓTELES, los dos más grandes filósofos de la antigüedad clásica. El concepto de justicia en uno y otro difieren entre sí, pero tienen una raíz común. Para Platón –que consagra a esta idea su diálogo El Estado o La República–, la justicia es la armonía de las distintas partes del alma y como el resumen de las virtudes. Si la prudencia (frónesis) era la virtud del entendimiento; si la templanza (sofrosine) lo era del apetito inferior, y la fortaleza (andreida), del ánimo o apetito superior, la justicia (dikaiosyne) es la armonía de esas partes del alma y la virtud del alma por antonomasia. Hombre justo es, así, el hombre virtuoso por excelencia.
   La Ciudad o el Estado (la polis) era para Platón como una proyección del hombre en sus diversas facultades, una imagen del hombre perfecto. Así, la ciudad ideal se compondrá para Platón de tres clases sociales: el pueblo (demos), encargado de las labores del mantenimiento material de la comunidad; los guerreros (filakes), que tienen a su cargo la defensa de la ciudad, y los sabios (sofoi), a los que cumple la dirección del Estado. Los primeros corresponden al apetito en el alma, y su virtud propia es la templanza; los segundos representan al ánimo y tienen como virtud la fortaleza; los terceros, en fin, simbolizan la razón y deben regirse por la prudencia. La Ciudad en su conjunto debe ser unión armónica de estas clases y virtudes; es decir, debe ser justa. La justicia es la virtud de la Ciudad.
   Para Aristóteles, la justicia es la virtud que regula las relaciones entre las personas en la vida social, el hábito de dar a cada uno lo suyo. En realidad, se trata de la manifestación de la íntima justicia o armonía interna del alma, en el sentido de su maestro Platón. El hombre armónico en su alma es justo, da a cada uno lo suyo; esto es, practica la justicia.
 
 
143. ESPECIES DE JUSTICIA
 
   Dividimos la justicia en general y particular. La justicia –hemos dicho– otorga a cada uno lo que le corresponde, esto es, su propio derecho; pero ese cada uno puede ser: o bien la comunidad –de la que el propio sujeto forma parte–, o las otras personas particulares. La justicia, en cuanto inclina al hombre a dar a la comunidad lo que es suyo, se llama justicia general o legal, y ésta ha de hallarse eminentemente en el que ejerce autoridad, que a la comunidad se debe especialmente. La justicia, en cuanto inclina a dar a las otras personas lo que es suyo, según cierta igualdad, se llama justicia particular.
   La justicia particular se subdivide en conmutativa y distributiva.
   La justicia conmutativa inclina a la voluntad a dar al prójimo su estricto derecho, conservando la igualdad –por sí decir, aritmética– entre la cosa dada y la debida. Por ejemplo, si después de comprar una mercancía y pagar el precio correspondiente el comerciante sustrae algo del peso, atenta contra la justicia conmutativa, pues no nos da lo que nos debe. Quitar la vida a otro es la mayor transgresión contra la justicia conmutativa, en razón de que no se la podemos devolver, ni nada equivalente.
   La justicia distributiva inclina al que tiene una función de gobierno a distribuir los bienes comunes entre los miembros de la comunidad, no según partes iguales (aritméticamente), sino según la proporción de los méritos, servicios o talentos (por así decir: según la igualdad de proporciones, o igualdad geométrica).
 
 
144. LA "JUSTICIA SOCIAL"*
 
   La expresión <<justicia social>> fue creada por S. S. PIO XI en la Encíclica Divini Redemptoris, y es hoy día comúnmente utilizada para designar los deberes de patronos y obreros en la relación laboral y la reglamentación de los mismos dentro del llamado Derecho de Trabajo.
   Discuten los moralistas si la <<justicia social>> se reduce a la justicia general o legal (NOUSER, POTIERS), o si es también distributiva, o incluso si es una clase específica de justicia (DONAT).
   La justicia social está compuesta de la justicia distributiva y de la justicia legal, aplicadas eminentemente a los problemas que plantea el trabajo.
 
 
145. JUSTICIA Y CARIDAD
 
   Las relaciones de los hombres dentro de la sociedad han de estar regidas no sólo por la justiia, sino también por la caridad, virtud teologal que se sobreañade a aquella virtud natural, elevándola sin destruirla, perfeccionándola. La caridad dulcifica la justicia, haciéndola paciente, personal, fraterna. La exigencia de la caridad constituyó el mensaje de Cristo y como el resumen de la Ley Nueva o de Gracia: <<Un Mandamiento nuevo os doy –dijo Cristo–: que os améis los unos a los otros como Yo os he amado.>>
   La justicia era la virtud que regulaba la ciudad antigua, y también los socialistas, modernamente, propugnan una sociedad regida sólo por normas puramente legales. La sociedad de cristianos ha de edificarse sobre la caridad, que transfunde de amor y de benevolencia las relaciones de justicia.
   Fundamento de la caridad es el amor de Dios, a través del cual se reconoce en el prójimo al hermano en la Redención, hijo también de Dios, y por El amado. En la caridad, la relacion de pura convivencia (regida por la justicia) se sustituye por la integración en una comunidad o cuerpo místico, que es la Iglesia, herencia viva de Cristo.
   La virtud de la caridad debe inspirar también el trato normal y diario con el prójimo determinando las virtudes de la cortesía, urbanidad y amabilidad (virtudes de la convivencia), así como una suavidad cordial en las formas de trato en una supuesta sinceridad o franqueza, e interpretar la cortesía como fingimiento o hipocresía. Sin embargo, es precisamente la rudeza y violencia voluntarias lo que suele estar inspirado por secretos resentimientos o por complejos de inadaptación o de inferioridad.
 
 
 
XXIX
 
El derecho
 
 
 
146 ACEPCIONES DE LA PALABRA DERECHO
 
   La palabra <<derecho>> deriva del latín directus, lo que está o es recto. En el orden físico es derecho el camino que conduce sin rodeo a un término propuesto; en el orden moral signifia asimismo el orden lícito de nuestros actos que nos lleva rectamente a nuestro fin natural.
   Cuando usamos la palabra derecho en sentido subjetivo queremos significar un poder sobre algo o sobre alguien, a exigir algo, a hacer algo a que no se nos impida una acción. Así, al decir <<tengo derecho a obrar de este modo>> o <<no tienes derecho a esa recompensa>>. Sin embargo, no a todo poder llamamos derecho: cuando se trata del meo poder físico de hacer algo o de apoderarnos de algo no hablamos de derecho. Si, por ejemplo, me encuentro en ocasión de quedarme con un dinero, quizá de un modo impune, sin posibles testigos, digo, quizá, que <<podría habérmelo apropiado>>, pero nunca que <<tenía derecho a hacerlo>>.
   Digo que tengo derecho cuando me reconozco con poder sobre algo (cosa o acción) de acuerdo con un orden o con una rectitud de los actos y de las cosas. Este orden o legalidad nos conduce a quello que en definitiva lo determina, que es la ley, sea la ley moral natural, que procede de Dios, sea la ley positiva, procedente del legislador humano.
   En sentido objetivo, derecho significa la ley o el conjunto de leyes que determinan ese orden en virtud del cual el sujeto posee derechos en sentido subjetivo. Así puedo hablar de un derecho natural y de un derecho positivo (canónico, civil, etc.).
   En fin, se llama también derecho a la ciencia que estudia la realidad que es el derecho, tanto en su acepción objetiva como en su acepción subjetiva.
   A la noción de derecho corresponde, recíprocamente, la de deber. A todo derecho de una persona corresponde en las otras un deber de repetarlo y atenderlo. Por consiguiente, nosotros mismos, en cuanto no vivimos aislados, sino en sociedad con otras personas, no sólo tenemos derechos, sino también deberes que cumplir respecto de ellos en la medida en que tenemos que respetar sus derechos.
   Podemos definir el derecho en su sentido objetivo como la facultad o poder moral, legítimo e inviolable, de posser, hacer o exigir de otra persona alguna cosa. (Se entiende por inviolable que no se puede lícitamente impedir.)
 
 
147. NATURALEZA Y ORIGEN DEL DERECHO. EL DERECHO Y LA MORAL
 
   El derecho es una exigencia de la justicia, virtud por la que damos a cada uno lo suyo y por la que se regula la convivencia social de los hombres. La justicia, como todas las virtudes, es un hábito del bien, es decir, se determina por su orientación hacia el bien o la ley moral.
   El derecho positivo nace en unos casos del legislador, de la voluntad justa o recta del mismo; en otros casos, de la costumbre, que es hábito o virtud de la colectividad, que llega también a <<hacer ley>>; en otros, de la jurisprudencia, que es la sentencia o ejercicio de la justicia de los altos tribunales.
   En cualquier caso, el derecho positivo viene a ser una concreción o determinación del derecho natural en lo necesario para la convivencia social, y tiene, por ello mismo, una significación moral más o menos obligatoria para el sujeto, según la importancia de lo mandado y su relación más o menos cercana del orden moral natural. No todo el orden moral se traduce –ni debe traducirse– en preceptos jurídicos, sino aquello que es necesario a la vida en sociedad del hombre. Embriagarse públicamente, por ejemplo, es un delito penado por las leyes en razón de los desmanes a que puede dar lugar y del mal ejemplo que produce; embriagarse solitariamente en el propio domicilio puede ser un delito moral –un pecado en su consideración religiosa– tanto o más grave, pero no puede ser penado por las leyes, puesto que sólo afecta al sujeto que lo comete. Lo mismo puede decirse de los meros pensamientos, deseos o intenciones que no se traducen en hechos.
 
 
148. ELEMENTOS DEL DERECHO. SUJETO Y OBJETO DEL MISMO. LA PERSONA JURÍDICA
 
   En todo derecho cabe distinguir cuatro elementos: el sujeto que lo posee; el término, persona o personas obligadas por el mismo; el objeto sobre que versa, y el título en que se funda.
   Sujeto y término de derecho sólo pueden serlo las personas, por tratarse de un poder moral. No pueden serlo los animales o las cosas, porque al no ser libres, no pueden responder a la ley de la que proceden tanto el deber como el derecho, ni hacerse cargo del deber recíproco a todo derecho.
   No sólo la persona individual es sujeto de derecho. También las asociaciones de personas lo son (un municipio, una sociedad anónima). Estas personas colectivas, en cuantos sujetos de derechos, se llaman persona jurídicas.
   Objeto del derecho es el contenido (jus) reclamado por el sujeto. Así, por ejemplo, el objeto del derecho de propiedad es distinto al del derecho de asociación. Los derechos tienen, pues, objetos distintos: unos se refieren a seres inteligentes; otros, a seres inanimados, etcétera. Cuando se trata de personas, no pueden éstas ser objeto absoluto del derecho; podemos, por ejemplo, tener derecho al trabajo de una persona en virtud de un contrato, pero no sobre la persona en sí, como suponía la antinatural institución de la esclavitud.
   Título o fundamento es aquella razón en virtud de la cual una persona se erige en sujeto de un derecho, o también, en sentido estricto, el hecho concreto que le da origen.
 
 
149. CLASIFICACIÓN DE LOS DERECHOS
 
   Puede clasificarse el derecho en su sentido subjetivo (facultad de exigir o hacer algo) y en su sentido objetivo (conjunto de leyes o normas que rigen las relaciones de personas que viven en sociedad.)
   En su sentido subjetivo, los derechos se clasifican atendiendo a su origen y a su objeto. Por su origen pueden ser innatos (naturales) o adquiridos (por participar en una sociedad determinada). Por su objeto pueden ser personales (facultad o poder sobre la actividad de otra persona) o reales (sobre las cosas). Los derechos reales pueden ser de propiedad o sobre las cosas ajenas (in re aliena: servidumbre, hipoteca, prenda, etcétera).
   En su sentido objetivo, el derecho puede dividirse atendiendo a su origen o atendiendo a su contenido.
 
   a) Por razón del origen de estos derechos se distingue el derecho natural y el derecho positivo.
   Derecho natural es aquel que dimana de la recta razón fundada en la ley natural. Derecho de gentes es el derecho positivo más general y común a todas las lesgilaciones humanas, por derivarse de un modo inmediato del derecho natural. Por ese carácter general y común es el que rige en las relaciones internacionales y el que permanece aun en caso de guerra; ello explica que se llame hoy derecho de gentes al Derecho Internacional. El derecho positivo es el conjunto de normas dictadas por el legislador con carácter coactivo para que los ciudadanos las cumplan en beneficio de la comunidad.
   El derecho positivo se divide en canónico o eclesiástico y laico, según que regule la sociedad religiosa, que tiene un fin sobrenatural, o la sociedad de fines naturales. El derecho positivo se recoge en compilaciones o códigos. Se llama compilaciones a una colección de leyes ordenadas atendiendo al orden cronológico en que aparecieron. Códigos son las colecciones de leyes sistemáticas organizadas por materias (por ejemplo, el Código civil, el Código penal, el Código mercantil).
 
   b) Atendiendo al contenido de estos derechos se distinguen el derecho público y el derecho privado.
   El derecho público es el conjunto de normas que regula la estructura y el funcionamiento del Estado, tanto en sí mismo (derecho político y administrativo) cuanto en su función de protección en las relaciones de trabajo (derecho social) y al mantenimiento de la ley (derecho penal y procesal).
   Derecho privado es el conjunto de normas que regulan las relaciones entre las diversas personas naturales o jurídicas. Partes del derecho privado son el derecho civil y el derecho mercantil.

Fundamentos de programación con Módula-2 (9)

 

Tema 4
Metodología de Desarrollo de Programas (I)
 
 
Aquí se tratan explícitamente los primeros conceptos metodológicos relacionados con la programación en general y con la programación imperativa en particular. Se presenta el desarrollo por refinamientos sucesivos, aunque limitado al empleo de la estructura secuencial, por el momento.
 
Como elementos  complementarios, se hace explícita la necesidad de usar un buen estilo de programación, que se concreta en sugerencias sobre el uso de notación apropiada para la representación de los elementos del programa y la presentación de su estructura en forma clara.
 
 
4.1 La programación como resolución de problemas
 
La labor de programación puede considerarse como un caso particular de la resolución de problemas. Resolver un problema consiste esencialmente en encontrar una estrategia a seguir para conseguir la solución.
 
               Problema                                                 Solución
 
  altura         ¿área?                                            área = base x altura
                  base
 
Una estrategia se expresará como una colección de reglas o recomendaciones que, si se siguen, conducirán a la solución. Por ejemplo, para resolver el problema de obtener el área de un rectángulo del que se conocen las longitudes de sus lados (base y altura), formularemos la estrategia:
 
                  multiplicar la base por la altura
 
Un programa en el modelo de programación imperativa se expresa como una serie de instrucciones u órdenes que gobiernan el funcionamiento de una máquina. La máquina va ejecutando dichas instrucciones en el orden preciso que se indique. La estrategia del ejemplo anterior se expresaría en Modula-2 como:
 
                 area := base*altura
 
Todo programa puede considerarse, de alguna forma, como la solución de un problema determinado, consistente en obtener una cierta información de salida a partir de unos determinado datos de entrada. La tarea de desarrollar dicho programa equivale, por tanto, a la de expresar la estrategia de resolución del problema en los términos del lenguaje de programación utilizado.
 
 
4.2 Descomposición de un problema en subproblemas
 
Algunos problemas, como el ejemplo anterior referente al área del rectángulo, pueden resolverse/programarse en forma inmediata porque la estrategia se puede expresar como una acción que se da por sabida, o como sentencia en el lenguaje de programación elegido. Los problemas resolubles de esta manera serán, en general, problemas simples o triviales.
 
Cualquier problema de cierta complejidad necesitará una labor de desarrollo para expresar la solución. El método más general de resolución de problemas no triviales consiste en descomponer el problema original en subproblemas más sencillos, continuando el proceso hasta llegar a subproblemas que puedan ser resueltos en forma directa.
 
Lo que se busca aquí es una analogía con la labor de desarrollo de programas. Puesto que el proceso de ejecución de un programa imperativo consiste en la realización de las sucesivas acciones indicadas por las órdenes que constituyen el programa, analizaremos la resolución de problemas en que la estrategia de solución consiste en realizar acciones sucesivas.
 
Según esta idea, para desarrollar la estrategia de resolución, habrá que ir identificando subproblemas que se resolverán ejecutando acciones cada vez más simples. Consideremos el siguiente problema:
 
              Problema: Obtener una caja de madera barnizada
 
Para expresar la estrategia de solución en forma imperativa comenzamos por formular la solución como una acción global que consigue el objetivo propuesto. En nuestro caso será:
 
              0) Construir una caja de madera barnizada
 
En este primer nivel de formulación nos encontramos con una acción a realizar que es demasiado complicada para ejecutarla en forma inmediata. Será necesario descomponer el problema original en subproblemas más sencillos, que puedan ser resueltos mediante acciones más simples. Un primer paso de descomposición sería:
 
              1) Obtener las piezas de madera
              2) Montar la caja
              3) Barnizarla
 
El proceso de descomposición en subproblemas debe continuar hasta que los subproblemas se puedan resolver mediante acciones consideradas directamente ejecutables por el agente que ha de proporcionar la solución. La expresión final de la solución del problema debe tener en cuenta, por tanto, qué acciones particulares se consideran realizables en forma directa. Tenemos así una analogía con la tarea de programación, que exige redactar el programa con los elementos particulares del lenguaje de programación elegido.
 
En nuestro ejemplo habrá que decidir si el subproblema 1) ha de considerarse resoluble mediante una acción simple o compuesta. Si podemos adquirir las piezas directamente en una tienda de "bricolaje", podremos considerar que el subproblema es resoluble con una acción simple que no necesita descomponerse. Si en la tienda sólo podemos comprar un tablero de madera sin cortar, tendremos que descomponer el problema de obtener las piezas en subproblemas más sencillos, tales como:
 
             1.1) Obtener un tablero de madera
             1.2) Dibujar sobre él la silueta de las piezas
             1.3) Recortar el tablero siguiendo la silueta
 
De igual manera habría que proceder con los subproblemas planteados hasta este momento: 1.1), 1.2), 1.3), 2) y 3), decidiendo si son resolubles en forma inmediata o bien descomponiéndolos sucesivamente hasta llegar a acciones simples.
 
 
4.3 Desarrollo de programas por refinamientos sucesivos
 
La aplicación de las ideas anteriores a la construcción de programas conduce a la técnica de desarrollo mediante refinamientos sucesivos. Esta técnica es parte de las recomendaciones de una metodología general de desarrollo de programas denominada programación estructurada, que se estudiará con más detalle en el Tema siguiente. La técnica de refinamiento consiste en expresar inicialmente el programa a desarrollar como una acción global, que si es necesario se irá descomponiendo en acciones más sencillas hasta llegar a acciones simples, que pueden ser expresadas directamente como sentencias del lenguaje de programación.
 
Cada paso de refinamiento consiste en descomponer cada acción compleja en otras más simples. Esta descomposición exige:
 
  • identificar las acciones componentes
  • identificar la manera de combinar las acciones componentes para conseguir el efecto global
La forma en que varias acciones se combinan en una acción compuesta constituye el esquema o estructura de la acción compuesta. La programación estructurada recomienda el uso de esquemas particularmente sencillos, que se indicarán más adelante. Por el momento presentamos un primer esquema que denominaremos esquema secuencial, y que consiste en realizar una acción compuesta a base de realizar una tras otra, en secuencia, dos o más acciones componentes. Este esquema secuencial es el que se ha utilizado en el ejemplo del problema de construir la caja de madera.
 
4.3.1 Desarrollo de un esquema secuencial
La metodología de refinamientos incluye el ir desarrollando a la vez las sentencias del programa que realizan las acciones de la parte ejecutable, y la definición de las variables necesarias para almacenar la información manipulada por dichas acciones. Para desarrollar una acción compuesta según un esquema secuencial se necesitará:
 
        a) Identificar las acciones componentes de la secuencia. Identificar las variables necesarias para disponer de la información adecuada al comienzo de cada acción, y almacenar el resultado.
        b) Identificar el orden en que deben ejecutarse dichas acciones.
 
Para ilustrar esta técnica consideraremos un caso simple, tal como el de obtener la suma de dos números enteros. Los dos números se introducirán como datos y el programa suministrará como resultado su suma. Aunque resulte un ejemplo trivial, sirve perfectamente para ilustrar la metodología de desarrollo.
 
Procediendo paso a paso, describiremos de manera informal cada elemento del desarrollo, seguido de su codificación en Modula-2.
 
a) Acciones componentes:
            Cálculos: obtener la suma
                      suma := dato1 + dato2
            Operaciones de entrada: leer datos
                      WriteString("Dar dos números: ");
                       ReadInt( dato1 );
                       ReadInt( dato2 );
                       WriteLn
             Operaciones de salida: imprimir resultado
                       WriteString( "La suma es" );
                       WriteInt( suma, 10 );
                       WriteLn
     Variables necesarias: datos y resultado
                        dato1, dato2, suma: INTEGER;
 
b) Orden de ejecución:
            1) Leer los datos
            2) Calcular la suma
            3) Imprimir el resultado
 
Si nos limitamos a describir la manera en que la acción global del programa se va descomponiendo en acciones cada vez más sencillas, podemos usar la siguiente notación de refinamiento:
 
              Acción compuesta —>
                    Acción 1
                    Acción 2
                    … etc. …
 
En esta notación se utiliza una flecha (—>) para indicar que una acción complicada se descompone o refina en otras más sencillas. Aplicando esta notación al ejemplo anterior, hasta llegar a sentencias de Modula-2, tendremos:
 
                 Obtener la suma de dos números —>
                       Leer los datos
                       Calcular la suma
                       Imprimir el resultado
 
                  Leer los datos —>
                      WriteString( "Dar dos números: ");
                      ReadInt( dato1 );
                      ReadInt( dato2 );
                      WriteLn
 
                  Calcular la suma —>
                      suma := dato1 + dato2
                  
                   Imprimir el resultado —>
                      WriteInt( suma, 10 );
                      WriteLn
 
Uniendo todos los fragmentos finales de código en el orden adecuado, y añadiendo las declaraciones de las variables necesarias, tendremos el programa completo.
 
MODULE Sumar2;
  FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt;
  VAR
    dato1, dato2, suma : INTEGER;
BEGIN
  WriteString( "Dar dos números: " );
  ReadInt( dato1 );
  ReadInt( dato2 );
  WriteLn;
  suma := dato1 + dato2;
  WriteString( "La suma es" );
  WriteInt( suma, 10 );
  WriteLn
END Sumar2.
 
Un ejemplo de la ejecución de este programa sería:
 
Dar dos números: 37 143
La suma es       180
 
4.3.2 Ejemplo: Imprimir la silueta de una silla
Aplicaremos la técnica de refinamientos a un programa sencillo en Modula-2 que imprima en forma esquemática la silueta de una silla usando caracteres normales de escritura, por ejemplo "!" y "=", en la forma:
 
                               !
                               !
                               ======
                               !         !
                               !         !
 
La parte ejecutable del programa se planteará inicialmente como una acción única, que trataremos de describir con una frase sencilla; por ejemplo:

                            Imprimir la silueta de una silla

 
Puesto que no parece fácil programar esta acción con una única sentencia de Modula-2, la descompondremos en acciones más simples. De forma intuitiva podemos:
 
   a) Asociar las acciones componentes a la impresión de diferentes partes de la silla: asiento, patas y respaldo.
   b) Seguir el orden de ejecución impuesto por el hecho de que la impresora ha de ir imprimiendo las líneas de arriba a abajo.
 
El primer paso de refinamiento será:
 
         Imprimir la silueta de una silla  —>
             Imprimir la silueta del respaldo
             Imprimir la silueta del asiento
             Imprimir la silueta de las patas
 
Ahora hay que determinar si estas acciones intermedias son ya expresables directamente como sentencias en Modula-2 o necesitan nuevas descomposiciones. No hay reglas fijas sobre cuándo una acción puede considerarse simple y pasar a escribirla en el lenguaje de programación. En este ejemplo consideraremos simple la escritura de una línea de texto (aunque haya que hacerlo con dos sentencias de Modula-2, para incluir el salto de línea).
 
De acuerdo con ello podremos considerar como acción simple la impresión del asiento, y refinar:
 
            Imprimir la silueta del asiento  —>
                WriteString( "======" ); WriteLn
 
La impresión del respaldo se refinará en la forma:
 
            Imprimir la silueta del respaldo  —>
                Imprimir parte superior del respaldo
                Imprimir parte inferior del respaldo
 
y cada una de estas partes conducirá a las mismas sentencias en Modula-2:
 
            Imprimir parte superior o inferior del respaldo  —>
                WriteString( "!" ); WriteLn
 
De forma similar se refinaría la impresión de las patas de la silla. Omitimos este paso para no hacer el ejemplo demasiado prolijo. Finalmente todos estos refinamientos han de ser combinados en un programa único. Reuniendo todas las sentencias en una única secuencia tendremos:
 
                 WriteString( "!" ); WriteLn;
                 WriteString( "!" ); WriteLn;
                 WriteString( "======" ); WriteLn;
                 WriteString( "!         !" ); WriteLn;
                 WriteString( "!         !" ); WriteLn
 
 
4.4 Aspectos de estilo
 
Una buena metodología de desarrollo de programas debe atender no sólo a cómo se van refinando las sucesivas acciones, sino a cómo se expresan las acciones finales en el lenguaje de programación. El estilo de redacción del programa en su forma final es algo fundamental para conseguir que sea claro y fácilmente comprensible por parte de quienes hayan de leerlo.
 
En los apartados que siguen se darán diversas recomendaciones sobre la manera de presentar adecuadamente un programa para facilitar su comprensión.
 
4.4.1 Encolumnado
Un programa aparece como un texto. Dicho texto puede ser visto como un documento técnico, organizado de una manera muy precisa. El estilo de presentación de dicho texto o documento debe destacar claramente su organización en partes.
 
Un recurso de estilo de presentación es el sangrado o encolumnado. Ampliando el margen izquierdo para las partes internas del programa se puede conseguir que el texto de un elemento compuesto ocupe una zona aproximadamente rectangular, y que el texto que representa cada una de sus componentes ocupe también una zona rectangular dentro de ella. Gráficamente podemos ilustrar esta idea con el esquema de la figura siguiente. En la figura se ha marcado el espacio de cada parte como un rectángulo, y se indica con línea doble cuál es el margen izquierdo en cada momento.
 
click aqui
 
Si aplicamos este recurso de estilo al esquema global de un programa en Modula-2, llegaremos a escribir, ya completo, el ejemplo anterior de la siguiente manera:
 
MODULE Silla;
   FROM InOut IMPORT WriteString, WriteLn;
BEGIN
   WriteString( "!" ); WriteLn;
   WriteString( "!" ); WriteLn;
   WriteString( "======" ); WriteLn;
   WriteString( "!         !" ); WriteLn;
   WriteString( "!         !" ); WriteLn
END Silla.
 
Las palabras clave MODULE, BEGIN y END delimitan el programa completo, y marcan la separación en sus dos partes, la primera de importación y declaraciones, y la segunda de sentencias ejecutables.
 
4.4.2 Comentarios. Documentación del refinamiento
Otro recurso utilizable para mejorar la claridad de un programa es el empleo de comentarios. Ya se ha indicado cómo el lenguaje Modula-2 permite intercalar comentarios en el texto de un programa escribiéndolos entre los símbolos (* y *).
 
Aunque el lenguaje permite emplear comentarios con toda libertad, es aconsejable seguir ciertas pautas para facilitar la lectura del programa. Estas pautas corresponden a diferentes clases de comentarios, cada una con un propósito diferente. Entre ellas podemos mencionar:
 
  • Cabeceras de programa
  • Cabeceras de sección
  • Comentarios-orden
  • Comentarios al margen
La cabecera de programa tiene como finalidad documentar el programa como un todo. Puede incluir datos de identificación, finalidad, descripción general, etc. Suele presentarse como una "caja" al comienzo del texto del programa, ocupando todo el ancho del listado. A continuación se presenta una posible cabecera para el programa de ejemplo de imprimir la silueta de una silla.
 
(*********************************************************
*
* Programa: SILLA
*
* Autor: J.A. Cerrada
*
* Descripción:
*   Este programa imprime en forma esquemática la
*   silueta de una silla usando caracteres
*   normales de la impresora.
*
**********************************************************)
 
En este ejemplo la "caja" se ha delimitado con asteriscos, y se ha dejado abierta en el  lado derecho para facilitar la edición o modificación del texto de la misma.
 
Las cabeceras de sección sirven para documentar partes importantes de un programa relativamente largo. Al igual que la cabecera del programa, se presentan en forma de "caja" al comienzo de la sección correspondientes, ocupando todo el ancho del listado. Un ejemplo trivial sería:
 
(*========================================================
                      PARTE EJECUTABLE DEL PROGRAMA
==========================================================*)
En este ejemplo la "caja" se ha delimitado con signos "=" y se ha dejado abierta a ambos lados.
 
Los comentarios-orden son un elemento metodológico fundamental, y sirven para documentar los refinamientos empleados en el desarrollo del programa. Si analizamos la redacción final del programa de ejemplo de la silla nos encontraremos con que las acciones intermedias que se han ido identificando durante el proceso de desarrollo por refinamientos sucesivos no aparecen en ninguna parte del texto del programa. Al hacerlo así se ha perdido una información de gran importancia para realizar posteriormente modificaciones en el programa.
 
Para incluir la información de los pasos de refinamiento en el texto del programa se puede introducir un comentario con la descripción de cada acción intermedia. Estos comentarios tienen, en cierta medida, la categoría de una orden del programa imperativo; en efecto, si el lenguaje de programación lo permitiese, el deseo del programador sería escribir una sentencia que ejecutara dicha acción, pero como no es posible, la acción se descompone en otras más sencillas que dan lugar finalmente a sentencias del programa. El comentario-orden se debe encolumnar tal como se haría con una sentencia del lenguaje que ejecutara la acción deseada. El comentario-orden delimita una acción compuesta, y las acciones componentes se escribirán dejando un mayor margen a la izquierda, tal como se indicó en la sección anterior. Como ejemplo, se repite aquí la parte ejecutable del programa de imprimir la silueta de la silla, documentando las acciones principales con comentarios-orden.
 
            (*– Imprimir el respaldo –*)
               WriteString( "!" ); WriteLn;
               WriteString( "!" ); WriteLn;
            (*– Imprimir el asiento –*)
               WriteString( "======" ); WriteLn;
            (*– Imprimir las patas –*)
               WriteString( "!         !" ); WriteLn;
               WriteString( "!         !" ); WriteLn;
 
En este ejemplo se han utilizado caracteres fácilmente visibles "–" para marcar el principio y el final de los comentarios-orden. Como el programa es corto, no se ha usado ningún elemento para marcar el final de la acción compuesta, que termina simplemente donde empieza la siguiente. En programas más complicados el final de la acción compuesta podría marcarse también con un comentario similar al situado al comienzo, por ejemplo:
 
             (*– Imprimir las patas –*)
                WriteString( "!          !" ); WriteLn;
                WriteString( "!          !" ); WriteLn;
             (*– Fin de imprimir las patas –*)
 
Finalmente mencionaremos la posibilidad de emplear comentarios al margen. Estos comentarios sirven para aclarar el significado de ciertas sentencias del programa, que pueden ser difíciles de interpretar al leerlas tal como aparecen escritas en el lenguaje de programación empleado. Una recomendación de estilo es situar estos comentarios hacia la parte derecha del listado, en las mismas líneas que las sentencias que se comentan, y alineados todos a partir de una posición fija, hacia el comienzo del tercio final.
 
Los comentarios al margen se utilizan muchísimo para explicar el significado de cada variable usada en un programa, poniéndolos en la misma línea en que se declaran. Por ejemplo:
 
             VAR
                 base, altura: REAL;                      (* dimensiones en cm *)
                 area: REAL;                                (* área en cm^2 *)
                 volumen: INTEGER;                      (* volumen en litros *)
                 dia: CARDINAL;                           (* entre 1 y 31 *)
 
Como resumen de todas las recomendaciones sobre el empleo de comentarios, se muestra a continuación el listado completo del programa de imprimir la silueta de la silla, incluyendo comentarios de todos los tipos indicados. En un programa tan sencillo como éste muchos de los comentarios resultan superfluos y de hecho hacen el programa un tanto engorroso, pero se han incluido para ilustrar la manera de presentar cada clase de comentario.
 
(*********************************************************
*
* Programa: SILLA
*
* Autor: J.A. Cerrada
*
* Descripción:
*   Este programa imprime en forma esquemática la
*   silueta de una silla usando caracteres
*   normales de la impresora.
*
**********************************************************)
MODULE Silla;
(*========================================================
 IMPORTACION Y DECLARACIONES DEL PROGRAMA
==========================================================*)
  FROM InOut IMPORT WriteString, WriteLn;
BEGIN
(*========================================================
 PARTE EJECUTABLE DEL PROGRAMA
==========================================================*)
  (*– Imprimir el respaldo –*)
   WriteString( "!" ); WriteLn;           (* parte superior *)
 WriteString( "!" ); WriteLn;             (* parte inferior *)
  (*– Imprimir el asiento –**)
 WriteString( "======" ); WriteLn;
  (*– Imprimir las patas –*)
 WriteString( "!    !"); WriteLn;          (* parte superior *)
 WriteString( "!    !"); WriteLn           (* parte inferior *)
END Silla.

Curso de Filosofía elemental (24)

XXVII
 
La especificación de los actos y la conducta moral
 
 
136. BONDAD Y MALICIA DE LOS ACTOS HUMANOS
 
   Los actos humanos pueden ser, moralmente considerados, buenos o malos, según que se ajusten o se aparten de la norma moral.
   El orden de los actos humanos a la norma última se llama moralidad fundamental de los actos.
   La maldad de los actos humanos no es una entidad positiva de los mismos, sino que sólo defectiva. Es una privación de ese orden, ya que la voluntad no quiere el objeto por el mal mismo (la privación de bien, el no ser), sino por algo bueno que exista en él, aunque se halle en oposición con el orden y jerarquía de bienes en que la cosa está inserta.
   Por este motivo, Dios, causa primera de todo ser, no puede decirse causa del mal, pues éste no tiene causa eficiente, sino deficiente (número 111).
   Podría dudarse de si hay actos indiferentes. Pasear en un rato libre, por ejemplo, parece que es una acción que no es buena ni mala por sí misma. Sin embargo, en la medida en que no hay ningún acto aislado, sino que todos se insertan en una trama de actos que se ordenan al fin último, debe decidirse que, de hecho, en el sentido de cada vida real no hay ningún acto indiferente desde el punto de vista moral, aun cuando esencialmente –según su esencia abstracta– puedan concebirse actos indiferentes.
 
Raíces de la especificación moral de los actos
   Los actos humanos tienen siempre un objeto o contenido (aquello en que como actos consisten), pero obdecen también al fin del que los hace (finis operantis), y se realizan siempre dentro de unas circunstancias determinadas que alteran a menudo su significación y valor moral.
   Objeto, fin  y circunstancias del acto son las raíces que especifican moralmente un acto. Para que un acto pueda estimarse moralmente bueno ha de ser sano y recto en estas sus tres raíces, bastado el defecto de una de ellas para que pierda su valor moral.
   Objeto del acto es, como hemos dicho, aquello en que el acto consiste, lo que por sí mismo realiza. En el acto de dar limosna, por ejemplo, su objeto es ayudar a alguien en una necesidad.
   Fin es aquello que, inmediata o mediatamente, pero siempre en el término de su intención, persigue el agente al realizar su acto. Puede darse limosna para acreditarse moralmente ante quienes presencia el acto, o para ganar la confianza de alguien con intención de defraudarlo. Es así frecuentemente que un fun torcido invalide moralmente a un acto en sí mismo bueno, como, al revés, la maldad objetiva de un acto desvirtúe moralmente un buen fin (el fin no justifica los medios).
   Circunstancias, en fin, son todos los factores concomitantes y las condiciones de tiempo y lugar que pueden influir en la valoración moral de acto. Un acto bueno en sí y realizado con recta intención puede también verse invalidado moralmente por alguna circunstancia no ajena a la voluntad de quien lo realiza. Si, en nuestro ejemplo, el que da limosna lo hace con la intención efectiva de aliviar en su necesidad física a quien la recibe, pero la entrega con dureza o altanería, de forma que satisfaga a la vez su vanidad personal o humille al socorrido, el acto perderá por ello en su valor moral.
   Los escolásticos distinguían siete posibles circunstancias en el acto: quis?, quid?, ubi?, quibus auxiliis?, cur?, quomodo?, quando?
 
 
137 EL HÁBITO EN LA VIDA MORAL. VIRTUDES Y VICIOS
 
   La vida moral en cada sujeto reviste las mismas complejidades que la vida psicológica del mismo. Hemos visto cómo, en concreto, los actos de un sujeto no pueden valorarse moralmente si no es atendiendo a la trama de intenciones y circunstancias en que están insertos. Del mismo modo, la vida moral de cada hombre no se compone sólo de actos o decisiones plenamente voluntarios, sino que se realiza también en hábitos como la vida psicológica en general. A los hábitos morales se llaman virtudes, si son buenos o conformes con la norma de su rectitud, y vicios, si son malos o en desacuerdo con dicha norma.
   Vimos cómo el hábito en general (núm. 72) se forma de movimientos voluntarios en su origen, que con su repetición se mecanizan, haciéndose más fáciles, ágiles y eficaces, a la vez que menos conscientes. Definimos así al hábito como una cualidad operativa arraigada que se sobreañade a las potencias y que ayuda a la realización de sus operaciones. Los hábitos morales –virtudes y vicios– son disposiciones operativas de la voluntad para la fácil y menos consciente realización de sus actos. El que posee la virtud de la honradez, por ejemplo, respeta lo ajeno de un modo fácil y seguro, sin lucha interior, casi sin darse cuenta.
 
 
138. LAS VIRTUDES
 
   La virtud es un hábito operativo bueno. Aristóteles definió a la virtud por sus efectos como un término medio (mesotés) entre dos inclinaciones vicisas. De aquí la famosa fórmula: in medio virtus. Así, por ejemplo, la fortaleza es un término medio entre la temeridad y la cobardía; la liberalidad es un término medio entre la tacañería y la prodigalidad; el amor propio es un término medio entre la vanidad y el desprecio de sí mismo; la modestia, un medio entre el excesivo pudor y el impudor.
 
 
139. DIVISIÓN DE LAS VIRTUDES
 
   Las virtudes se especifican según la relación de la voluntad con las distintas potencias del alma ejecutoras. La división clásica de las virtudes procede de PLATÓN, de quien pasó, a través de SAN AGUSTÍN, al catecismo cristiano. Compara Platón al alma del hombre con un carro griego tripulado por un auriga que representa a la razón y tirado por dos corceles, uno blanco, que representa el ánimo, o apetito noble, y otro negro, que simboliza la pasión o apetito inferior. Razón, ánimo y apetito son así las tres potencias fundamentales del alma, y a ellas corresponden tres virtudes, que, con otra global del alma, forman las cuatro virtudes cardinales, llamadas así porque son como los quicios (cardo: quicio) sobre los cuales giran todas las demás virtudes. Son: Prudencia, Justicia, Fortaleza y Templaza. Prudencia es la virtud que rige a la razón o entendimiento; fortaleza, la que gobierna el ánimo (o apetito irascible); templanza, la que ordena el apetito concupiscible. La justicia es, como veremos, una armonía de las partes del alma, virtud del alma por excelencia.
   Pero, además de estas virtudes cardinales cabe distinguir otras derivadas o sometidas en su raíz a aquéllas.
   La prudencia puede definirse como <<recta ratio agibilium>>: recta ordenación de las cosas agibles. (Recuérdese núm. 4.) Es así la virtud que ordena el entendimiento, habituándole a juzgar serena y desapasionadamente, de forma tal que ilumine a la voluntad en los motivos del caso sobre que ha de decidir. Por ello, la prudencia es esencialmente circunstancial; no es una sabiduría desinteresada ni sobre principios generales, sino de casos concretos, aplicada y práctica. A veces se confunde la noción de prudencia con la de cautela en el decidir y en el actuar, y la de imprudencia con la de precipitación. Siendo la prudencia la virtud del entendimiento en cuanto ilumina a la voluntad, es normal que su ejercicio se acompañe de la debida pausa reflexiva, pero también puede pecar de imprudente el que, por excesiva cautela, deja pasar la ocasión propicia para decidir y actuar.
   Pueden distinguirse tres clases de prudencia, según que se ordene al gobierno de la propia vida personal (prudencia monástica; de monos, uno mismo), de la vida familiar (prudencia económica; de oikia, la casa) o de la vida pública (prudencia política; de polis, la ciudad o el Estado).
   La justicia es el hábito de dar a cada uno lo suyo, lo que le pertenece. (De esta virtud trataremos especialmente en el capítulo siguiente.)
   La fortaleza es la virtud propia del ánimo o apetito irascible, aquel que tiene por objeto el bien (lo deseable) en cuanto arduo y difícil de alcanzar (núm. 69). La fortaleza impulsa rectamente la voluntad que se siente amenazada de decaer por temor al esfuerzo que la acción requiere o a los peligros y dificultades que ha de vencer. La preserva igualmente de caer en la audacia temeraria. Por ello la fortaleza o valor es, como toda virtud, un término medio en el obrar entre dos extremos viciosos: la temeridad y la cobardía.
   La templanza, en fin, es la virtud que rige el apetito concupiscible; esto es, que frena o modera –sin anularlas– las pasiones concupiscibles. Carece de esta virtud, cuyo efecto es la moderación, el que no sabe sujetar sus deseos sensibles. Partes de la templanza o virtudes subordinadas son: la abstinencia (relativa a los placeres de la comida), la sobriedad (a los de la bebida) y la castidad (que regula el apetito genésico).
   Dado que el hombre es un ser orientado por su razón y por su voluntad a un orden sobrenatural en el cual únicamente podrá hallar la verdad y el bien plenos que satisfagan y aquieten esas facultades, las virtudes naturales se han de completar para alcanzar la plenitud humana con las llamadas teologales o infusas. Son éstas unas virtudes de carácter sobrenatural que se añaden a las facultades superiores del hombre para disponer nuestra alma al fin sobrenatural al que, por la gracia, podemos ser elevados. Son: la fe, que perfecciona el entendimiento, deparándole, bajo el influjo de la voluntad, una certeza de las verdades religiosas; la esperanza, que se sobreañade a la voluntad, situando para ella a Dios en el término último de todos sus deseos, y a caridad, que le proporciona un estado habitual de adhesión amorosa al Bien Supremo, que transfunde y confiere sentido sobrenatural a todos sus actos. Como infusas, estas virtudes proceden de la gracia divina y graciosamente se otorgan: no se cree por sólo quererlo o por sólo ejercitar el conocimiento intelectual, ni se espera o posee caridad por sólo proponérselo. Como virtudes, se sobreañaden a las potencias superiores y constituyen su culminación. De forma tal que la adquisición de las virtudes naturales favorece el merecimiento de las teologales, y su abandono acarrea a menudo la pérdida de éstas. Por otra parte, elevan la naturaleza de las potencias sin destruirla: el que cree comprende mejor en el ejercicio natural de su razón; el que espera y ama, desea con la voluntad más profunda y cumplidamente.
 
 
140. EL MÉRITO EN LA ACCIÓN VIRTUOSA*
 
   Cabe preguntarse si la acción hecha por virtud, esto es, con el aumento de facilidad y la disminución de conciencia y de lucha que la virtud supone, es menos meritoria que la acción moral plenamente voluntaria. Ha de contestarse a esto en sentido negativo. Sucede en la vida moral análogamente a como en la vida psicológica: la acción hecha por hábito no es menos perfecta, sino más que la plenamente consciente.
   Quien posee un hábito (nadar, escribir a máquina) lo ha adquirido por su propio esfuerzo, y la acción que de él resulta se le puede atribuir plenamente en su mayor valor. Nadie busca un mecanógrafo principiante por el hecho de costarle mayor esfuerzo su trabajo, sino al práctico en su oficio, precisamente porque lo ejerce sin esfuerzo y con facilidad. De igual modo, la virtud se adquiere por el esfuerzo continuado del sujeto en el dominio de sus pasiones y en la prosecución del bien; por ello mismo, las acciones que resultan de la virtud son plenamente atribuibles al sujeto, aunque le resulten fáciles y casi inconscientes, y su mérito se ve acrecentado por proceder de un hábito estable adquirido. Por otra parte, la vida moral recta es imposible sin virtudes, como sería imposible la vida psicológica general sin hábitos, y como lo es la vida social sin sanas costumbres. La dificultad diaria de la lucha y vencimiento de las pasiones sería impracticable sin la ayuda que la naturaleza y la gracia proporcionan al hombre con las virtudes naturales y las infusas.

Fundamentos de programación con Módula-2 (8)

 

3.5 Sentencia de asignación
 
Una forma de conseguir que una variable guarde un nuevo valor es mediante una sentencia de asignación. Esta sentencia es característica de la programación imperativa, y permite inicializar una variable o modificar el valor que tenía hasta el momento. Mediante asignaciones podremos dar valores iniciales determinados a las variables, o guardar en ellas los resultados intermedios o finales de cualquier programa.
 
La estructura de una sentencia de asignación es la siguiente:
 
Sentencia_de_asignación ::=
       Variable := Expresión
 
Variable ::= Identificador
 
Por el momento la única manera que se ha presentado de hacer referencia a una variable es usando su nombre. Más adelante se indicarán otras formas de hacer referencia a variables, especialmente en el caso de que la variable designada sea parte de una estructura de datos.
 
El símbolo := es el operador de asignación; está formado por esa pareja de caracteres y siempre se debe escribir exactamente en ese orden sin incluir espacios en blanco entre ellos.
 
Este operador indica que el resultado de la expresión de su derecha debe ser asignado a la variable cuyo identificador está a su izquierda. Por ejemplo, la secuencia de asignaciones siguiente:
 
              Area := 56.89;
              Base := 18;
 
sustituye los valores que tuvieran las variables Area y Base hasta ese momento por los nuevos valores 56.89 y 18, respectivamente.
 
Si intervienen variables en la expresión a la derecha de una sentencia de asignación, se usará el valor que tenga la variable en ese momento. Por ejemplo, la siguiente secuencia de asignaciones:
 
              Meses := 2;
              Dias := Meses;
              Meses := 7;
              Saldo := Meses;
 
dejará finalmente almacenados en las variables Meses, Dias y Saldo los valores 7, 2 y 7, respectivamente.
 
Un caso especial, que requiere cierta atención, es aquél en que a una variable se le asigna el valor de una expresión de la que forma parte la propia variable. Por ejemplo:
 
              Dias := Dias + 30;
 
Esta asignación recuerda a una ecuación, pero su significado es completamente diferente. Esta sentencia es una orden de evaluar primero la expresión a la derecha usando el valor que tenía la variable hasta ese momento, y luego modificar el valor de la variable almacenando en ella el resultado de la expresión. En este ejemplo, si la variable Dias tenía el valor 16, esta sentencia almacenará en ella el nuevo valor 46. En general, al ejecutar esta sentencia de asignación, el valor de la variable Dias se incrementará en 30 unidades.
 
3.5.1 Compatibilidad de tipos
Para que una sentencia de asignación sea válida es necesario que el tipo de la variable y el del resultado de la expresión sean compatibles. En caso contrario el compilador indicará que hay error, y será necesario modificar el programa antes de que se pueda ejecutar.
 
La compatibilidad de tipos en la asignación es un poco menos restrictiva que entre los operandos de una misma operación. Hay compatibilidad en asignación entre una variable y un valor de sus mismo tipo, pero además, con los tipos introducidos hasta este momento, es compatible realizar asignaciones de expresiones del tipo CARDINAL a variables INTEGER y viceversa.
 
Sin embargo, si en el momento de ejecutar la asignación se comprueba que el valor obtenido en la expresión no es un valor válido del tipo de la variable asignada, por ejemplo un valor negativo asignado a una variable de tipo CARDINAL, se producirá un error y se detendrá la ejecución del programa. En los temas próximos se indicarán más compatibilidades de tipos según se vayan introduciendo.
 
A continuación se indican algunos ejemplos de sentencias de asignación válidas, utilizando las constantes y variables declaradas en los apartados anteriores:
 
           Modelo := Codigo
           Saldo := Base                (*Compatib. INTEG./CARD. *)
           Dias := Meses * 30
           Volumen := Pi * Radio * Radio * FLOAT( Largo )
           Saldo := Meses * 50000 – TRUNC( Gastos )
           Codigo := "Z"
 
Para finalizar este apartado se presenta una declaración de variables y posteriormente una secuencia de sentencias de asignación. En el margen izquierdo se muestran los valores que guardan las variables antes y después de la ejecución de cada sentencia. Nótese que las variables tienen un valor indefinido hasta que son inicializadas asignándoles valor por primera vez.
 
Declaración:
                   VAR Posi : CARDINAL;
                         Dato : INTEGER;
                         EjeX, EjeY : REAL;
 
                                        Valores
      EjeX       EjeY             Dato        Posi          Secuencia de sentencias
        ?           ?                 ?             ?            EjeX := 34.89;
      34.89       ?                 ?             ?            Dato := 67;
      34.89       ?                67            ?            Posi := TRUNC(EjeX) + Dato;
      34.89       ?                67           101          Dato := TRUNC(EjeY) + Posi;
      34.89       ?                 ?            101          EjeY := EjeX + FLOAT(Posi);
      34.89     135.89           ?            101          Dato := Posi DIV 5;
      34.89     135.89           20           101         Posi := Posi MOD 5;
      34.89     135.89           20           1             Posi := Posi * Dato;
      34.89     135.89           20           20           EjeY := EjeY/EjeX;
      34.89     3.8948           20           20           EjeX := EjeX/2.0;
      17.44     3.8948           20           20           Posi := TRUNC(EjeY) – Posi;
                             Fin del Programa. Error de Ejecución *(La variable <Posi> no admite valores negativos)
 
 
3.6 Operaciones de lectura simple
 
Los programas presentados hasta el momento producen siempre el mismo resultado cada vez que se mandan ejecutar. Por ejemplo, con los elementos introducidos hasta ahora se podrían escribir programas para calcular la suma de los números del 4 al 45 o imprimir la nómina de Febrero del Sr. González. Programas que produzcan resultados fijos son poco habituales en la práctica. Bastaría ejecutarlos una sola vez, guardar los resultados impresos y reproducirlos (p.ej., fotocopiándolos) tantas veces como se necesiten.
 
Los programas habituales suelen resolver problemas genéricos. Por ejemplo, obtener la suma de N números desde uno inicial a otro final, o el calcular cada mes la nómina de cada uno de los empleados de una empresa. Un programa que produzca cada vez resultados diferentes deberá operar en cada caso a partir de unos datos distintos, y dichos datos no pueden ser, por tanto, valores constantes que formen parte del programa.
 
Para resolver cada vez el problema concreto que se plantea, el programa debe leer como datos de entrada los valores concretos a partir de los cuales hay que obtener el resultado. Por ejemplo, los valores inicial y final de la serie de números a sumar, o el nombre del empleado cuya nómina se quiere calcular y el mes al que corresponde. Por consiguiente, las operaciones de lectura son fundamentales dentro de cualquier modelo de programación.
 
En Modula-2, los datos leídos han de ser guardados inmediatamente en variables del programa. Por tanto, otra manera de asignar un valor a una variable es almacenar en ella un valor introducido desde el exterior del computador mediante el teclado u otro dispositivo de entrada de datos.
 
Las operaciones de lectura, al igual que las de escritura, pueden presentar grandes diferencias dependiendo del dispositivo utilizado. Pero, también en este caso, existe en Modula-2 un conjunto de procedimientos generales para la lectura de datos, que son invocados siempre de la misma manera, con independencia del dispositivo de entrada utilizado. Por defecto, el dispositivo de entrada suele estar asociado al teclado del terminal por el que se accede al computador. Estos procedimientos están incluidos también en los módulos InOut y RealInOut.
 
Los datos a leer se suministran externamente en forma de texto, es decir, como una serie de caracteres seguidos (o pulsaciones de teclas) que pueden incluir saltos de línea de vez en cuando. El salto de línea corresponde a la tecla marcada ‘INTRO’ o ‘<—|’ (en teclados ingleses, ‘RETURN’ o ‘ENTER’).
 
3.6.1 Procedimientos ReadInt, ReadCard y ReadReal
Los procedimientos ReadInt y ReadCard pertenecen al módulo InOut. El procedimiento ReadReal pertenece al módulo RealInOut. Para ordenar que se ejecuten estos procedimientos se debe escribir:
 
            ReadInt( Variable_entera )
            ReadCard( Variable_cardinal )
            ReadReal( Variable_real )
 
Cada uno de estos procedimientos lee la representación de un valor numérico, que sea válida según las reglas de Modula-2 (descritas en el tema anterior) para la representación de valores constantes del tipo concreto que corresponda: INTEGER, CARDINAL o REAL, respectivamente. A continuación asigna el valor leído a la variable que se indica.
 
El valor introducido puede ir precedido de todos los espacios en blanco o saltos de línea que se quiera antes del primer carácter válido de la representación del valor: más (+), menos (-) o dígito, según los casos. A continuación se irán leyendo los sucesivos caracteres del dato numérico, hasta leer un espacio en blanco o un salto de línea, que marcarán el final del valor leído.
 
Por ejemplo, la sentencia:
 
             ReadInt( Dias );
 
tomará caracteres del dispositivo de entrada hasta completar la representación de un valor entero, asignará dicho valor a la variable Dias. Si los datos de entra son:
 
        123456
 
se consumirá la parte del texto "123", se asignará el valor 123 a la variable Dias, y quedará disponible para la siguiente lectura el resto de los datos "456".
 
Normalmente una lectura se ejecuta inmediatamente después de una escritura en la que se indica qué dato es el que se solicita en cada momento. Por ejemplo:
 
               WriteString( "¿Cantidad Pendiente ? " );
               ReadInt( Saldo );
 
después de la ejecución del procedimiento de escritura el computador interroga de la siguiente forma:
 
              ¿CantidadPendiente?_
 
y se queda a la espera para ejecutar el procedimiento de lectura. El símbolo (_) se utiliza aquí para indicar la posición del cursor en la pantalla, en espera de la entrada del dato solicitado.
 
Cuando se espera información por el teclado es ventajoso que se pueda corregir el texto que se va tecleando en caso de cometer errores. Para ello la lectura de teclado se suele hacer por líneas completas; mientras se teclea el texto de una línea se pueden hacer correcciones, y al pulsar la tecla de fin de línea el texto se acepta y se procesa como dato de entrada. El texto aparece en la pantalla al mismo tiempo que se va tecleando o corrigiendo. Todo esto es automático, y se hace directamente al invocar los procedimientos de lectura de Modula-2.
 
En el ejemplo anterior, se tecleará el dato acabando con un fin de línea, que representaremos como <INTRO>:
 
             ¿CantidadPendiente?-45768<INTRO>
 
Al pulsar <INTRO> el cursor pasará a la siguiente línea, se procesará el dato de entrada, y a la variable Saldo se le queda asignado el nuevo valor -45768. Si se quiere introducir más de un valor con la misma pregunta y en la misma línea se puede utilizar como separador de datos el espacio en blanco (). Por ejemplo:
 
             WriteString( "¿Cantidad Pendiente y Gastos ? " );
             ReadInt( Saldo );
             ReadReal( Gastos );
 
y después de teclear los datos separados por uno o varios blancos y acabados con un <INTRO>:
 
            ¿Cantidad Pendiente y Gastos?-45768+10456.5<INTRO>
_
 
queda el cursor en la línea siguiente, la variable Saldo con el valor -45768 y la variable Gastos con valor 10456.5. En este caso el espacio en blanco intermedio indica que ha finalizado la introducción del primer valor y se pasa a ejecutar el siguiente procedimiento de lectura desde la última posición del cursor en el espacio en blanco intermedio. La ejecución del segundo procedimiento de lectura acaba con el <INTRO>.
 
Por tanto, los procedimientos de lectura comienzan analizando los datos introducidos desde la posición última del cursor y separan cada valor numérico del siguiente cuando encuentran o espacioes en blanco o finales de línea.
 
3.6.2 Procedimiento Read
El procedimiento Read pertenece al módulo InOut. Para ordenar que se ejecute se debe escribir:
 
               Read( Variable_Carácter )
 
El procedimiento Read lee el primer carácter introducido desde la última posición del cursor anteriormente analizada y lo guarda en la variable indicada. En este caso cualquier carácter es válido, incluyendo los signos de puntuación, los espacios en blanco, o el carácter de salto de línea.
 
Por ejemplo la ejecución de la secuencia de sentencias:
 
              ReadReal(Volumen);
              Read(Modelo);
              Read(Codigo);
              ReadCard(Base);
              ReadInt(Dias);
 
con los siguientes datos:
 
              23456.85E-3<INTRO>
              -5678<INTRO>
              27<INTRO>
              _
asigna a cada variable los valores siguientes:
 
              Variable                               Valor
              Volumen                              23.45685
              Modelo                                ""
              Codigo                                 "-"
              Base                                  5678
              Dias                                    27
 
 
3.7 Estructura de un programa con constantes y variables
 
Antes de realizar nuevos programas es necesario saber dónde se sitúan dentro del programa los nuevos elementos introducidos en este tema. Las declaraciones de valores constantes y de las variables forman parte del bloque del programa. Por tanto, ahora la estructura del bloque es la siguiente:
 
             Bloque ::= Parte_declarativa Parte_ejecutiva END
             Parte_declarativa ::= { Declaración }
             Declaración ::=
                    Declaración_de_constantes | Declaración_de_variables
             Parte_ejecutiva ::= BEGIN Secuencia_de_sentencias
             Secuencia_de_sentencias ::= Sentencia { Sentencia ; }
 
La parte declarativa es opcional y siempre está delante de la parte ejecutiva. Hasta este momento sólo forman parte de la parte declarativa la declaración de constantes y variables, que pueden ser declaradas en cualquier orden.
 
Las sentencias de asignación y los procedimientos de lectura siempre forman parte de la secuencia de sentencias.
 
 
3.8. Ejemplos de programas
 
A continuación se realizan varios programas con los nuevos conceptos introducidos.
 
3.8.1 Ejemplo: Conversión a horas, minutos y segundos
 
En este ejemplo se trata de convertir a horas, minutos y segundos una cierta cantidad de tiempo expresada en segundos. La variable Segundos se utilizará para leer la cantidad total de segundos y posteriormente para ir guardando los segundos restantes al quitar los segundos ya convertidos a horas y minutos. El listado del programa es el siguiente:
 
MODULE HoraMinutoSeg;
   FROM InOut IMPORT
      WriteString, WriteLn, WriteInt, ReadInt;
 
   VAR Hora, Minutos, Segundos : INTEGER;
 
(* Conversión a Hora, Minutos y Segundos de los segundos introducidos como dato *)
 
BEGIN
   WriteString( "¿Segundos Totales ?" );
   ReadInt( Segundos );
   WriteLn;
   Hora := Segundos DIV 3600;
   Segundos := Segundos MOD 3600;
   Minutos := Segundos DIV 60;
   Segundos := Segundos MOD 60;
   WriteString("Equivalen a ");
   WriteInt(Hora, 2);
   WriteString( horas, ");
   WriteInt(Minutos, 2);
   WriteString( min. y ");
   WriteInt(Segundos, 2);
   WriteString(" seg.");
   WriteLn;
END HoraMinutoSeg.
 
La ejecución del programa introduciendo como dato 23459 segundos es la siguiente:
 
¿Segundos Totales ?23459
Equivalen a 6 horas, 30 min. y 59 seg.
 
3.8.2 Ejemplo: Área y volumen de un cilindro
En este ejemplo se desarrolla un programa para el cálculo del área y el volumen de un cilindro genérico. Esto es posible gracias a los procedimientos de entrada de datos y al empleo de variables. Además se declara como constante el valor de (pi) lo que evita tenerlo que escribir dos veces y los posibles errores de escritura. El programa así realizado es más general y más fácil de comprender y modificar. El listado del programa es el siguiente:
 
MODULE AreaVolumenCilindro;
   FROM InOut IMPORT WriteString, WriteLn;
   FROM RealInOut IMPORT ReadReal, WriteReal;
 
   CONST PI = 3.141592;
   VAR Radio, Altura, Area, Volumen : REAL;
 
(* Calculo del área y el volumen de un cilindro *)
 
BEGIN
   WriteString("¿Radio del Cilindro ?");
   ReadReal(Radio);
   WriteLn;
   WriteString("¿Altura del Cilindro ?");
   ReadReal(Altura);
   WriteLn;
   Area := 2.0*PI*Radio*(Radio+Altura);
   Volumen := PI*Radio*Radio*Altura;
   WriteString("El Area es igual a: ");
   WriteReal(Area, 15);
   WriteLn;
   WriteString("y su Volumen es igual a: ");
   WriteReal(Volumen, 15);
   WriteLn;
END AreaVolumenCilindro.
 
La ejecución del programa introduciendo como valor del radio 12.5 y como altura 72.65 produce el siguiente resultado:
 
¿Radio del Cilindro ?12.5
¿Altura del Cilindro ?72.65
El Area es igual a: 0.668766259E+04
y su Volumen es igual a: 0.356619687E+05
 
3.8.3 Ejemplo: Realización de un recibo
En este ejemplo se trata de realizar un recibo sencillo, correspondiente a la compra de unos equipos. Como datos habrá que introducir el tipo de equipo, indicando mediante un código de un carácter; la cantidad de equipos; el precio unitario, y el tipo de IVA aplicado.
 
Los subtotales y totales siempre se darán en Pts enteras sin céntimos. Para no perder precisión, el cálculo de las Pts de IVA se realizará como un valor REAL. Este valor se truncará antes de imprimir el recibo.
 
El listado del programa completo esta recogido a continuación de la ejecución del mismo.
 
A continuación se muestra un ejemplo de la ejecución del programa, presentando los resultados escritos junto a los datos leídos.
 
¿Tipo de Equipos ?A
¿Cantidad ?12
¿Precio Unitario ?2345
¿% IVA Aplicado ?15
 
              RECIBO de COMPRA
 
Cantidad    Concepto       Pts/unidad    Total
 
    12        Equipos: A        2345          28140
                                 15 % IVA          4221
 
                                 TOTAL            32361
 
 
MODULE Recibo;
   FROM InOut IMPORT
      Write, WriteString, WriteLn, WriteInt, Read, ReadInt;
   VAR
      Cantidad, Precio, IVA, SubTotal : INTEGER;
      Total, PtsIva : REAL; Tipo : CHAR;
 
   (* Cálculo e impresión de un Recibo *)
 
BEGIN
   WriteString("¿Tipo de Equipos ?");
   Read(Tipo); Write(Tipo);
   WriteLn;
   WriteString("¿Cantidad ?");
   ReadInt(Cantidad);
   WriteLn;
   WriteString("¿Precio Unitario ?");
   ReadInt(Precio);
   WriteLn;
   WriteString("¿% IVA Aplicado ?");
   ReadInt(IVA);
   WriteLn; WriteLn;
   SubTotal := Cantidad * Precio;
   PtsIva := FLOAT(SubTotal) * FLOAT(IVA) / 100.0;
   Total := FLOAT(SubTotal) + PtsIva;
   WriteString("       RECIBO de COMPRA");
   WriteLn; WriteLn;
   WriteString("Cantida    Concepto      Pts/unidad    Total");
   WriteLn; WriteLn;
   WriteInt(Cantidad, 5);
   WriteString("       Equipos:");
   Write(Tipo);
   WriteInt(Precio, 10);
   WriteInt(SubTotal, 12);
   WriteLn;
   WriteInt(IVA, 26);
   WriteString(" % IVA ");
   WriteInt(TRUNC(PtsIva), 10);
   WriteLn; WriteLn;
   WriteString("                               TOTAL");
   WriteInt(TRUNC(Total), 14);
   WriteLn; WriteLn;
END Recibo.