¿Cuáles son las características de los métodos de diseño estructurado y los lenguajes de programación? ¿Qué estructuras básicas de control tienen?
El concepto de programación estructurada se propuso por primera vez a partir del uso ilimitado de declaraciones de transferencia en el proceso de programación anterior. La declaración de transferencia puede forzar el flujo de control del programa a cualquier lugar del programa. En los diagramas de flujo tradicionales, la línea de flujo "muy aleatoria" que mencionamos en la sección anterior se utiliza para describir esta función de transferencia. Si tales transferencias ocurren en muchos lugares de un programa, el flujo del programa será desordenado y la estructura del programa será confusa. Dicho programa será difícil de entender y aceptar, y será propenso a errores. Especialmente en el desarrollo de productos de software reales, se pone más énfasis en la legibilidad y modificabilidad del software. No se permite que aparezcan programas con tal estructura y estilo. Para ello se proponen tres estructuras básicas del programa.
Al hablar de algoritmos, enumeramos tres flujos de control de secuencia, selección y bucle del programa. Estas son las tres estructuras básicas que enfatiza el método de programación estructurada. El proceso de implementación del algoritmo se compone de una serie de operaciones, y el orden de ejecución entre estas operaciones es la estructura de control del programa. En 1996, los informáticos Bohm y Jacopini demostraron el hecho de que cualquier algoritmo simple o complejo puede estar compuesto de tres estructuras básicas: estructura secuencial, estructura de selección y estructura de bucle. Por lo tanto, estas tres estructuras se denominan las tres estructuras básicas de la programación. También es la estructura que debe adoptar la programación estructurada.
1. Estructura secuencial
Estructura secuencial significa que cada operación en el programa se ejecuta en el orden en que aparecen. El proceso se muestra en la Figura 1-6. S1 y s2 en la figura representan dos pasos de procesamiento. Estos pasos de procesamiento pueden ser una operación sin transferencia o una secuencia de múltiples operaciones sin transferencia, o incluso una operación nula, o cualquiera de las tres estructuras básicas. Toda la estructura de secuencia tiene solo un punto de entrada a y un punto de salida b. Las características de esta estructura son: el programa comienza desde el punto de entrada a y realiza todas las operaciones en secuencia hasta el punto de salida b, por lo que se denomina estructura secuencial. La Figura 1-2 de la sección anterior muestra un diagrama de flujo con una estructura secuencial. De hecho, no importa qué estructura se incluya en el programa, el flujo general del programa es secuencial. Por ejemplo, en los diagramas de flujo que se muestran en las Figuras 1-3, 1-4 y 1-5, los procesos estructurales generales se ejecutan secuencialmente de arriba a abajo.
2. Estructura de selección
La estructura de selección indica que hay ramas en los pasos de procesamiento del programa y necesita seleccionar una de las ramas para su ejecución en función de una condición específica. . Hay tres tipos de estructuras de selección: selección única, selección doble y selección múltiple.
La selección doble es una forma de estructura de selección típica. Su proceso se muestra en la Figura 1-8 y s2 en la figura son las mismas que las instrucciones en la estructura secuencial. Como se puede ver en la figura, hay un cuadro de juicio en el punto de entrada a de la estructura, que indica que hay dos ramas alternativas en el flujo del programa. Si se cumplen las condiciones, se ejecutará el procesamiento s1; de lo contrario, se ejecutará el procesamiento s2. ser ejecutado. Vale la pena señalar que solo se puede seleccionar una de estas dos ramas y se debe seleccionar una para su ejecución, pero no importa qué rama se seleccione para su ejecución, el proceso final debe llegar al punto de salida b de la estructura. El diagrama de flujo de la estructura de selección doble se utilizó en la Figura 1-3 anterior.
Cuando cualquiera de los procesos en s1 y s2 está vacío, significa que solo hay una rama disponible para selección en la estructura. Si se cumplen las condiciones, se ejecuta el proceso s1; de lo contrario, la secuencia pasa al proceso. salir b. Es decir, cuando no se cumplen las condiciones no se ejecuta nada, por lo que se denomina estructura de selección única, como se muestra en la Figura 1-7.
La estructura de selección múltiple significa que se encuentran múltiples ramas como s1, s2,..., sn, etc. en el flujo del programa como se muestra en la Figura 1-9, y la dirección de ejecución del programa será determinarse en función de las condiciones. Si se cumple la condición 1, se ejecuta el procesamiento s1. Si se cumple la condición n, se ejecuta el procesamiento Sn. En resumen, se selecciona una de las múltiples ramas para su ejecución en función de la condición de juicio. No importa qué rama se elija, el proceso final debe llegar a la misma salida. Si no se cumplen las condiciones de todas las ramas, se llega directamente a la salida.
Algunos lenguajes de programación no admiten estructuras de opción múltiple, pero todos los lenguajes de programación estructurados sí lo admiten. El lenguaje C es un lenguaje de programación estructurado orientado a procesos y puede implementar esta función muy fácilmente. Este libro presentará en detalle varias formas de problemas de aplicación de la estructura de selección en el Capítulo 5.
3. Estructura de bucle
La estructura de bucle significa que el programa realiza repetidamente una o más operaciones hasta que una determinada condición sea falsa (o verdadera) antes de que se pueda terminar el bucle. Lo más importante en una estructura de bucle es: ¿bajo qué circunstancias se ejecuta el bucle? ¿Qué operaciones deben realizarse en un bucle? Hay dos formas básicas de estructuras de bucle: bucle de tipo cuándo y bucle de tipo hasta. El proceso se muestra en la Figura 1-10. La operación dentro del cuadro de puntos en la figura se llama cuerpo del bucle, que se refiere a los pasos de procesamiento desde el punto de entrada del bucle a hasta el punto de salida del bucle b. Esta es la parte que debe ejecutarse en el bucle. Las circunstancias en las que se ejecuta el bucle dependen de las condiciones.
Estructura de tipo cuando: indica que la condición se juzga primero, y el cuerpo del bucle se ejecuta cuando se cumple la condición dada, y el proceso regresa automáticamente a la entrada del bucle en el terminal del bucle si se cumple la condición; no se cumple, sale del cuerpo del bucle y llega directamente a la salida del proceso. Debido a que es "ejecutar el bucle cuando se cumple la condición", es decir, juzgar primero y luego ejecutar, se llama bucle when. El proceso se muestra en la Figura 1-10(a).
Hasta el tipo de bucle: significa que el cuerpo del bucle se ejecuta directamente desde la entrada de la estructura y la condición se juzga en el terminal del bucle. Si no se cumple la condición, regrese a la entrada para continuar. ejecutar el cuerpo del bucle hasta que la condición sea verdadera y luego salir del bucle. Al salir del proceso, la ejecución se realiza primero y luego se juzga. Debido a que es "hasta que la condición sea verdadera", se llama bucle hasta. El proceso se muestra en la Figura 1-10(b). La Figura 1-5 de este capítulo muestra el diagrama de flujo de la suma utilizando el método iterativo, que es una estructura típica de bucle de tipo hasta.
De manera similar, la estructura del bucle también tiene solo un punto de entrada a y un punto de salida b. La terminación del bucle significa que la ejecución del proceso llega al punto de salida del bucle. El procesamiento S representado en la figura puede ser una o más operaciones, o una estructura completa o un proceso.
Todo el cuadro de puntos es una estructura de bucle.
Se puede ver en las tres estructuras de control básicas que cualquier estructura básica en un programa estructurado tiene una entrada única y una salida única, y el programa no tendrá un bucle infinito. Existe una buena correspondencia entre la forma estática del programa y el proceso de ejecución dinámico.
1.3.2 Diagrama de flujo N-S
El diagrama de flujo N-S es una de las herramientas gráficas utilizadas para representar algoritmos en métodos de programación estructurada. Para la programación estructurada, es difícil adaptarse completamente a los diagramas de flujo tradicionales. Debido a que el diagrama de flujo tradicional apareció antes, refleja más las necesidades del diseño del sistema de instrucción de la máquina y los métodos de programación tradicionales, y es difícil garantizar que el programa tenga una buena estructura. Además, algunas estructuras básicas de programación estructurada no tienen símbolos de expresión correspondientes en los diagramas de flujo tradicionales. Por ejemplo, en los diagramas de flujo tradicionales, las estructuras de bucle todavía se representan mediante símbolos de estructura de juicio, lo que dificulta distinguir de qué estructura se trata. En particular, los diagramas de flujo tradicionales no pueden garantizar un enfoque de programación de arriba hacia abajo debido a problemas de dirección, lo que dificulta expresar las relaciones de llamada entre módulos. Por esta razón, dos académicos estadounidenses, Nassi y Shneiderman, propusieron una nueva forma de diagrama de flujo, que es el diagrama de flujo N-S. Lleva el nombre de las iniciales de los dos creadores, también conocido como diagrama de Nassi Shneiderman.
La unidad básica del diagrama N-S es una caja rectangular, que tiene una sola entrada y una salida. El marco rectangular está dividido por líneas de diferentes formas, que pueden representar estructuras secuenciales, estructuras de selección y estructuras de bucle. En el diagrama de flujo N-S, las líneas de flujo con direcciones se eliminan por completo. Las tres estructuras básicas del programa están representadas por tres cuadros rectangulares. Al ensamblar estos cuadros rectangulares, se puede representar todo el algoritmo. Este tipo de diagrama de flujo elimina el impacto del uso aleatorio de la transferencia de control en el flujo del programa en términos de forma de expresión y limita la generación de estructuras de programa incorrectas.
Los símbolos básicos del diagrama de flujo N-S correspondientes a las tres estructuras básicas de secuencia, selección y bucle se muestran en la Figura 1-11.
La Figura 1-11(a) y la Figura 1-11(b) son la representación del diagrama N-S de la estructura secuencial y la estructura de selección, respectivamente. La Figura 1-11(c) y la Figura 1-11(d) son la representación del diagrama N-S. de la estructura cíclica. Como se puede ver en la figura, en el diagrama N-S, el proceso siempre comienza desde la parte superior de la caja rectangular y continúa hasta la parte inferior de la caja rectangular. Esta es la entrada y salida del proceso. es imposible. El diagrama de flujo N-S se utiliza a continuación para representar el algoritmo para encontrar el valor de la función m en el ejemplo anterior 1-2. El proceso se muestra en la Figura 1-12.
Vale la pena señalar que el diagrama de flujo N-S es una herramienta gráfica adecuada para métodos de programación estructurados que no se pueden representar mediante el diagrama de flujo N-S.
Por ejemplo, en el Ejemplo 1-3, el algoritmo para encontrar el máximo común divisor de dos enteros positivos cualesquiera es muy clásico. La Figura 1-5 muestra el algoritmo utilizando un diagrama de flujo tradicional, pero este algoritmo. no se puede expresar directamente mediante un diagrama de flujo N-S. Debido a que la clave del algoritmo es ejecutar una estructura de bucle, pero la estructura de bucle que se muestra en la Figura 1-5 no es un bucle cuando ni un bucle hasta, por lo que no se puede representar mediante un diagrama de flujo N-S. Si el algoritmo del Ejemplo 1-3 se ajusta ligeramente para que el diagrama de flujo adopte una estructura de opción única y la condición se cambia a r≠0, entonces el algoritmo se puede representar mediante un diagrama de flujo N-S del bucle de tipo hasta. . La Figura 1-13 es un diagrama de flujo N-S que muestra el Ejemplo 1-3.
El diagrama de flujo N-S es una de las herramientas gráficas importantes para describir algoritmos y se ha utilizado ampliamente en la programación estructurada. Esta es sólo una breve introducción, que pretende servir como punto de partida. En el desarrollo de software real, los lectores interesados pueden consultar trabajos sobre ingeniería de software o tecnología de desarrollo de software.
1.3.3 Método de programación estructurada
El método de programación estructurada es un método y principio básico reconocido que debe seguirse en la programación orientada a procesos. El método de programación estructurada incluye principalmente: ① Solo se utilizan tres estructuras de control de programa básicas para compilar el programa, de modo que el programa tenga una buena estructura ② Programación de arriba hacia abajo ③ Utilice un diagrama de flujo de programación estructurada para representar el algoritmo;
Existe un conjunto de teorías y técnicas en continuo desarrollo y mejora relacionadas con la programación estructurada y es difícil para los principiantes dominarlas por completo. Sin embargo, comprender los métodos de programación estructurada y aprender buenas ideas de programación en la etapa inicial de aprendizaje será muy útil para la programación real en el futuro.
1. Características de la programación estructurada
Las características de la programación estructurada incluyen principalmente los siguientes puntos:
(1) Una combinación de tres estructuras básicas para describir el programa;
(2) Todo el programa adopta una estructura modular
(3) Use declaraciones de transferencia con restricciones, tenga mucho cuidado al usarlas y se limite a saltar. dentro de una estructura, y no se permite saltar de una estructura a otra. Esto puede reducir la diferencia entre la estructura estática y el proceso de ejecución dinámica del programa, para que las personas puedan comprender correctamente la función del programa;
(4) Tomando la estructura de control como una unidad, cada estructura tiene solo una entrada y una salida. La interfaz entre cada unidad es simple y la lógica es clara.
(5) Escrito en un. Programa de lenguaje de programación estructurado y utilice un determinado formato de escritura para que la estructura del programa sea clara y fácil de leer.
(6) Preste atención al estilo de diseño del programa.
2. Método de diseño de arriba hacia abajo
La idea general de la programación estructurada es adoptar una estructura modular, de arriba hacia abajo y refinarla gradualmente. Es decir, primero descomponga un problema grande y complejo en varios problemas pequeños relativamente independientes. Si los problemas pequeños aún son relativamente complejos, puede continuar descomponiéndolos en varios subproblemas. Esta descomposición continua hará que los problemas pequeños o subproblemas sean lo suficientemente simples como para ser expresados directamente por las tres estructuras básicas del programa. Luego, correspondiente a cada pequeño problema o subproblema, se escribe un bloque de programa funcionalmente relativamente independiente. Este bloque de programa similar a un bloque de construcción se denomina módulo.
Cada módulo se descompone individualmente y finalmente se ensambla. De esta manera, la solución a un problema complejo se convierte en la solución a varios problemas simples. Este es un enfoque de programación paso a paso de arriba hacia abajo.
Para ser precisos, un módulo es una colección de objetos de programa. La modularización consiste en dividir el programa en varios módulos. Cada módulo completa una determinada subfunción. Estos módulos se reúnen para formar un todo. la solución al problema. Este tipo de programa ensamblado con módulos se denomina programa de estructura modular. En la programación de estructuras modulares, se utiliza el método de diseño de refinamiento paso a paso de arriba hacia abajo para facilitar la descomposición de problemas y la división de módulos. Por lo tanto, es el principio básico de la programación estructurada.
Ejemplo 1-9: Encuentra las raíces de la ecuación cuadrática:
ax2 bx c=0
.
Análisis: considerando primero el nivel superior, el algoritmo para resolver el problema se puede dividir en tres pequeños problemas, a saber: problema de entrada, problema de raíz y problema de salida. Estos tres pequeños problemas son los tres módulos funcionales para encontrar las raíces de una ecuación cuadrática: módulo de entrada M1, módulo de procesamiento de cálculos M2 y módulo de salida M3. Entre ellos, el módulo M1 completa la entrada de los datos originales necesarios, el módulo M2 resuelve el problema según el algoritmo raíz y el módulo M3 completa la visualización o impresión de los resultados obtenidos. Esta división convierte el problema de encontrar las raíces de una ecuación cuadrática en tres subproblemas relativamente independientes. La estructura del módulo se muestra en la Figura 1-14.
Los tres módulos descompuestos tienen en su conjunto una estructura secuencial. Entre ellos, los módulos M1 y M3 completan entradas y salidas simples, y el flujo del programa se puede diseñar directamente sin mayor descomposición. El módulo M2 completa el cálculo de la raíz. Para encontrar la raíz, primero debe determinar si el coeficiente del término cuadrático a es 0. Cuando a = 0, la ecuación degenera en una ecuación lineal y el método de búsqueda de raíces es diferente de la ecuación cuadrática. Si a≠0, entonces encuentre las raíces de la ecuación cuadrática según la situación de b2-4ac. Se puede ver que el módulo M2 es relativamente complejo y se puede refinar aún más en dos submódulos, M21 y M22, que corresponden a la búsqueda de raíces de ecuaciones lineales y ecuaciones cuadráticas, respectivamente. La estructura del módulo se muestra en la Figura 1. -15.
Después de esta descomposición, la función del submódulo M21 es encontrar las raíces de una ecuación lineal. El algoritmo es simple y se puede expresar directamente. M22 es para encontrar las raíces de ecuaciones cuadráticas. El algoritmo está representado por un diagrama de flujo como se muestra en la Figura 1-16. Consiste en una estructura de secuencia simple y una estructura de selección. Esta es la representación del proceso más detallada del módulo M22. Luego, de acuerdo con el método de refinamiento del módulo M22, los algoritmos de M1, M21 y M3 se expresan en diagramas de flujo respectivamente, y luego se ensamblan de acuerdo con las estructuras del módulo de la Figura 1-15 y la Figura 1-14 respectivamente. diagrama de flujo refinado y completo.
Se puede ver que programar es lo mismo que construir un edificio. Primero debe considerar la estructura general del edificio e ignorar algunos detalles. Una vez construido el marco general, puede resolver los detalles gradualmente. de cada habitación. En programación, primero consideramos el diseño de nivel superior del problema y luego lo refinamos gradualmente para completar el diseño de nivel inferior. El uso de métodos de diseño de arriba hacia abajo y gradualmente refinados está en línea con las reglas generales para que las personas resuelvan problemas complejos. Es un método que la gente está acostumbrada a aceptar y puede mejorar significativamente la eficiencia del diseño del programa. Bajo la guía de este enfoque de arriba hacia abajo, de dividir y conquistar, se realizó un proceso de refinamiento paso a paso: primero lo global antes que lo local, primero lo general antes que los detalles y primero lo abstracto antes de lo concreto. El programa escrito de esta manera tiene las características de una estructura clara, lo que mejora la legibilidad y mantenibilidad del programa.
3. Estilo de programación
En cierto sentido, el estilo de programación es un hábito personal a la hora de escribir programas. La cuestión del estilo no implica un conjunto relativamente completo de teorías y reglas como la cuestión del método. El estilo de programación es un refinamiento de la experiencia y las lecciones de la escritura de programas. Los programadores con diferentes grados y diferentes ángulos de aplicación también tienen sus propias opiniones sobre este tema. . Ver. Debido a esto, el estilo de programación puede pasarse por alto fácilmente, especialmente por parte de los principiantes. La programación estructurada enfatiza los requisitos del estilo de programación. Porque el estilo de programación afecta principalmente la legibilidad del programa. Un programa con buen estilo debe prestar atención a los siguientes puntos:
(1) Formalización de declaraciones. El lenguaje de programación es un lenguaje formal y debe ser preciso e inequívoco.
Por lo tanto, la forma rígida y el contenido animado son el estilo de la industria del software;
(2) Consistencia del programa. Mantenga coherente el estilo de cada parte del programa y el formato del documento;
(3) Estandarice la estructura. La estructura del programa, la estructura de datos e incluso la arquitectura del software deben cumplir con los principios de programación estructurada.
(4) Utilice los comentarios de forma adecuada; Los comentarios son un medio importante para ayudar a los programadores a comprender el programa y mejorar la legibilidad del programa. Se pueden agregar comentarios apropiados a un determinado programa o una determinada línea de programa;
(5) El identificador está cerca de. realidad. El principio de denominación de datos, variables, funciones, etc. en el programa es elegir identificadores con significado práctico para que sean fáciles de identificar y comprender. Evite el uso de abreviaturas e identificadores ambiguos. Por ejemplo: intente utilizar v e i como nombres de variables que representen voltaje y corriente en lugar de a y b. Evite el uso de nombres de variables que no tengan un significado intuitivo, como aa, bb, etc.