알고리즘을 논의할 때 구조화된 프로그래밍 접근 방식에서 강조하는 세 가지 기본 구조인 순서, 선택, 반복의 세 가지 제어 프로세스를 나열합니다. 알고리즘의 실행 과정은 일련의 연산으로 구성되며, 이러한 연산 간의 실행 순서가 프로그램의 제어 구조입니다.1996년 컴퓨터 과학자 Bohm과 Jacopini는 단순하거나 복잡한 알고리즘이 순차, 선택, 순환의 세 가지 기본 구조로 구성될 수 있다는 사실을 입증했습니다. 그래서 이 세 가지 구조를 프로그래밍의 세 가지 기본 구조라고 부릅니다. 또한 구조형 프로그래밍에서 반드시 사용해야 하는 구조이기도 합니다.
1. 시퀀스 구조
시퀀스 구조는 프로그램에서 연산이 나타나는 순서대로 실행되는 것을 의미하며, 그 흐름은 그림 1-6에 나와 있습니다. 그림의 S1과 s2는 두 개의 처리 단계를 나타내며, 단일 비전송 연산 또는 여러 비전송 연산 시퀀스, 빈 연산 또는 세 가지 기본 구조 중 하나라도 될 수 있습니다. 시퀀스 구조에는 진입점 A와 출구점 B가 하나씩만 존재합니다. 이 구조의 특징은 프로그램이 진입점 A에서 시작하여 출구점 B까지 모든 연산을 순차적으로 수행하므로 시퀀스 구조라는 이름이 붙었습니다. 이전 섹션의 그림 1-2는 시퀀스 구조의 순서도를 보여줍니다. 사실 프로그램에 어떤 구조가 포함되어 있든 프로그램의 전체 흐름은 시퀀스 구조입니다. 예를 들어 그림 1-3, 1-4, 1-5에 표시된 순서도에서는 전체 구조화된 흐름이 위에서 아래로 순차적으로 실행됩니다.
구조 선택
구조 선택은 프로그램의 처리 단계에 분기가 있으며, 특정 조건에 따라 그 중 하나를 선택하여 실행해야 함을 나타냅니다. 선택 구조에는 단일 선택, 이중 선택, 다중 선택의 세 가지 형태가 있습니다.
이중 선택은 대표적인 선택 구조로, 그 흐름은 그림 1-8에 나와 있으며, 여기서 s1과 s2는 시퀀스 구조와 동일합니다. 그림에서 볼 수 있듯이 구조의 진입점 A에 판단 상자가 있어 프로그램 흐름에 두 개의 대체 분기가 있음을 나타냅니다. 조건이 충족되면 s1 프로세스가 실행되고, 그렇지 않으면 s2 프로세스가 실행됩니다. 이 두 가지 분기 중 하나만 선택해서 실행할 수 있지만, 어떤 분기를 선택해서 실행하든 최종 흐름은 반드시 구조의 출구점인 B에 도달한다는 점에 주목할 필요가 있습니다. 앞의 그림 1-3에서는 이중 선택 구조의 순서도를 사용했습니다.
S1과 S2의 처리 중 하나라도 비어 있으면 구조에서 선택할 수 있는 분기가 하나만 있다는 뜻입니다. 조건이 만족되면 s1 처리가 실행되고, 그렇지 않으면 순차적으로 출구 B 처리로 이동합니다. 즉, 조건이 만족되지 않으면 아무것도 실행되지 않으므로 그림 1-7에서와 같이 단일 선택 구조라고 합니다.
다중 선택 구조는 s1, s2, ... , SN과 같이 프로그램 흐름에서 그림 1-9와 같이 여러 가지 분기가 발생하고 조건에 따라 프로그램 실행 방향이 결정됩니다. 조건 1이 만족되면 s1의 처리가 실행되고, 조건 n이 만족되면 sn의 처리가 실행됩니다. 즉, 판단 조건에 따라 여러 가지 분기 중 하나를 선택해 실행해야 합니다. 어떤 분기를 선택하든 최종 프로세스는 동일한 출구에 도달합니다. 모든 분기의 조건이 충족되지 않으면 바로 종료로 이동합니다. 일부 프로그래밍 언어는 다중 선택 구조를 지원하지 않지만 모든 구조형 프로그래밍 언어는 지원합니다. 절차 지향 구조형 프로그래밍 언어인 C는 이 기능을 매우 간단하게 구현할 수 있습니다. 5장에서는 다양한 형태의 선택 구조를 적용하는 방법을 자세히 설명합니다.
3. 루프 구조
루프 구조는 프로그램에서 조건이 거짓(또는 참)이 될 때까지 연산을 반복한 후 루프를 종료하는 구조입니다. 루프 구조에서 가장 중요한 것은 다음과 같습니다. 루프를 언제 실행할 것인가? 루프에서 어떤 연산을 실행해야 하는가? 루프 구조에는 그림 1-10에 표시된 프로세스인 언제형 루프와 언제까지형 루프의 두 가지 기본 형태가 있습니다. 그림에서 점선 상자 안의 연산을 루프 본문이라고 하며, 루프 진입점 A에서 루프 종료점 B까지의 처리 단계를 말하며, 루프에서 실행해야 하는 부분입니다. 루프가 실행되는 시기는 조건에 따라 달라집니다.
유형 구조: 첫 번째 판단 조건이 충족되면 루프 본문이 실행되고, 루프 끝의 프로세스는 자동으로 루프 진입점으로 돌아가고, 조건이 충족되지 않으면 루프 본문에서 바로 프로세스 종료로 돌아가는 것을 나타냅니다. '조건이 충족되었을 때 사이클', 즉 실행 후 첫 번째 판단이므로 이를 루프라고 부릅니다. 프로세스는 그림 1-10(a)에 나와 있습니다.
언틸 타입 루프: 입구 구조에서 바로 루프 본문을 실행하기 시작하고, 루프가 끝나면 조건을 판단합니다. 조건이 충족되지 않으면 입구로 돌아가 루프 본문을 계속 실행한 다음 조건이 참이고 프로세스의 종료에 도달할 때까지 루프를 종료합니다. 먼저 실행한 다음 판단하세요. "조건이 참이 될 때까지"이기 때문에 until형 루프라고 부릅니다. 이 흐름은 그림 1-10(b)에 나와 있습니다. 반복적인 합산 방법을 사용하는 이 장의 그림 1-5의 순서도는 전형적인 until 타입 루프 구조입니다.
마찬가지로 루프 구조에는 진입점 A와 종료점 B가 하나씩만 있으며, 루프 종료는 루프 종료점에서 프로세스가 실행됨을 의미합니다. 다이어그램에 표시된 프로세스는 하나 이상의 연산 또는 전체 구조 또는 프로세스일 수 있습니다.
점선 상자 전체가 원형 구조입니다.
세 가지 기본 제어 구조는 구조화된 프로그램의 모든 기본 구조에는 고유한 진입점과 출구점이 있으며, 프로그램에는 무한 루프가 없음을 보여줍니다. 프로그램의 정적 형태와 동적 실행 흐름 사이에는 좋은 대응 관계가 있습니다.
1.3.2 남북 순서도
N-S 순서도는 구조화된 프로그래밍 방법에서 알고리즘을 표현하는 데 사용되는 그래픽 도구 중 하나입니다. 구조화된 프로그래밍의 경우 전통적인 순서도는 완전히 적용하기 어려웠습니다. 전통적인 순서도는 기계 명령어 시스템 설계와 전통적인 프로그래밍 방법의 요구를 더 많이 반영하여 일찍 등장했기 때문에 좋은 프로그램 구조를 보장하기 어렵습니다. 또한 구조화된 프로그래밍의 일부 기본 구조에는 기존 순서도에는 해당 표현 기호가 없습니다. 예를 들어, 전통적인 순서도에서 루프 구조는 여전히 판단 구조 기호로 표현되어 어떤 구조가 어떤 구조인지 구별하기 어렵습니다. 특히 전통적인 순서도는 전환 문제로 인해 하향식 프로그래밍을 보장할 수 없어 모듈 간의 호출 관계를 표현하기 어렵습니다. 이러한 이유로 1973년 미국의 두 학자인 나시와 슈나이더만이 새로운 형태의 순서도를 제안했는데, 두 사람의 이니셜을 딴 N-S 순서도라고도 하며 나시 슈나이더만 다이어그램이라고도 합니다.
N-S 다이어그램의 기본 단위는 입구와 출구가 하나씩만 있는 직사각형 상자입니다. 직사각형 상자는 순차적, 선택적, 순환적 구조를 나타낼 수 있는 다양한 모양의 선으로 나뉩니다. N-S 순서도에서는 방향 흐름선이 완전히 제거되고 프로그램의 세 가지 기본 구조가 세 개의 직사각형 상자로 표시되며, 이 세 개의 상자를 결합하여 모든 알고리즘을 나타낼 수 있습니다. 이러한 유형의 순서도는 제어 전송을 임의로 사용하여 프로그램 흐름에 미치는 영향을 표현 형식에서 제거하여 바람직하지 않은 프로그램 구조의 생성을 제한합니다.
순서, 선택, 반복의 세 가지 기본 구조에 해당하는 N-S 순서도의 기본 표기법은 그림 1-11에 나와 있습니다. 그림 1-11 (a)와 그림 1-1 (b)는 각각 시퀀스 구조와 선택 구조에 대한 N-S 다이어그램을 나타낸 것으로, 그림에서 볼 수 있듯이 N-S 다이어그램에서 흐름은 항상 직사각형 상자의 상단에서 시작하여 흐름의 입구와 출구인 직사각형 상자의 하단까지 이어집니다. 이 형태에서는 무조건적인 전송이 불가능합니다. 위의 예제 1-2에서 함수 m의 값을 구하는 알고리즘은 다음으로 그림 1-12에 나와 있는 N-S 순서도로 설명합니다.
N-S 순서도는 구조화된 프로그래밍 방식에 적합한 그래픽 도구이지만 구조화되지 않은 프로그램의 경우 N-S 순서도로 표현할 수 없다는 점에 유의할 필요가 있습니다.
예를 들어, 두 양의 정수의 최대공약수를 구하는 알고리즘인 예제 1-3은 매우 고전적인 예입니다. 이 알고리즘은 그림 1-5의 전통적인 순서도로 표현되지만, N-S 순서도로는 직접 표현할 수 없습니다. 이 알고리즘의 핵심은 루프 구조의 실행인데, 그림 1-5에 표시된 루프 구조는 현재 루프도 아니고 틸 루프도 아니므로 N-S 순서도로 표현할 수 없기 때문입니다. 예제 1-3의 알고리즘을 약간 변형하여 순서도가 단일 선택 구조의 형태를 취하고 그 안의 조건을 r ≠ 0으로 변경하면 알고리즘을 UNTIL형 루프가 있는 N-S 순서도로 표현할 수 있습니다. 그림 1-13은 예제 1-3의 N-S 순서도를 보여줍니다.
N-S 순서도는 알고리즘을 설명하는 데 중요한 그래픽 도구 중 하나이며 구조화된 프로그래밍에서 널리 사용됩니다. 여기서는 옥의 티를 그리는 것을 목표로 간략하게 소개합니다. 실제 소프트웨어 개발에 관심이 있는 독자는 소프트웨어 공학이나 소프트웨어 개발 기법에 관한 저서를 참고하면 됩니다.
1.3.3 구조적 프로그래밍 방법
구조적 프로그래밍 방법은 프로세스 지향 프로그래밍이 따라야 하는 기본 방법과 원칙으로 인식되고 있습니다. 구조적 프로그래밍 방법에는 주로 ① 프로그램이 좋은 구조를 갖도록 세 가지 기본 프로그램 제어 구조만으로 프로그램을 컴파일하는 것, ② 하향식 프로그래밍, ③ 구조적 프로그래밍 순서도로 알고리즘을 표현하는 것 등이 있습니다.
구조화 프로그래밍에 대한 일련의 이론과 기법 및 방법은 지속적으로 발전하고 개선되고 있습니다. 초보자가 완전히 이해하기는 어렵습니다. 그러나 학습 초기 단계에서는 구조적 프로그래밍의 방법을 이해하고 좋은 프로그래밍 아이디어를 배우는 것이 도움이 됩니다.
1. 구조형 프로그래밍의 특징
구조형 프로그래밍의 특징은 크게 다음과 같습니다.
(1) 프로그램은 세 가지 기본 구조의 조합으로 기술된다.
(2) 프로그램 전체가 모듈식 구조이다.
(3) TRANSFER 문을 제한적으로 사용하며, 꼭 필요한 경우에만 점프할 수 있도록 주의를 기울인다. 프로그램의 정적 구조와 동적 실행 프로세스 간의 차이를 좁히기 위해 구조 내에서 점프하고 한 구조에서 다른 구조로 점프 할 수 없으므로 프로그램의 기능을 올바르게 이해할 수 있습니다.
(4) 제어 구조를 단위로 사용하여 각 구조에는 하나의 입구와 하나의 출구 만 있으며 단위 간의 인터페이스가 간단하고 논리가 명확합니다.
(5) 구조화 된 프로그래밍 언어를 사용하여 프로그램을 작성합니다. 프로그램 구조를 명확하고 읽기 쉽게 만들기 위해 특정 글쓰기 형식을 채택하고
(6) 프로그래밍 스타일에주의를 기울이십시오.
2. 하향식 설계 방법
구조화 프로그래밍의 일반적인 아이디어는 단계별로 모듈식 구조를 사용하는 것입니다. 즉, 우선 큰 복잡한 문제를 비교적 독립적인 여러 개의 작은 문제로 세분화합니다. 작은 문제가 여전히 상대적으로 복잡하다면 계속해서 여러 개의 하위 문제로 분해하여 작은 문제 또는 하위 문제를 프로그램의 세 가지 기본 구조로 간단히 표현할 수 있습니다. 그런 다음 각 하위 문제 또는 하위 문제에 해당하는 모듈이라는 빌딩 블록처럼 기능적으로 독립적인 프로그램 블록을 작성합니다. 각 모듈을 하나씩 분해한 다음 균일하게 조립합니다. 이런 식으로 복잡한 문제의 해결책이 여러 개의 간단한 문제의 해결책이 됩니다. 이것은 하향식 단계별 프로그래밍 접근 방식입니다.
정확히 말하면 모듈은 프로그램 객체의 모음입니다. 모듈화는 프로그램을 모듈로 나누고 각 모듈이 특정 하위 기능을 완성하고 이러한 모듈을 전체로 통합하여 문제 해결을 완성하는 과정입니다. 이렇게 모듈로 조립된 프로그램을 모듈 구조 프로그램이라고 합니다. 모듈 구조 프로그램 설계에서는 문제의 분해와 모듈의 분할을 용이하게 하기 위해 설계 방법을 하향식, 단계적으로 세분화하는 것이 구조 프로그램 설계의 기본 원리입니다.
예제 1-9: 이차 방정식의 근 구하기;
ax2+bx+c=0
.
분석: 최상위 수준에서 고려할 때, 문제 해결을 위한 알고리즘은 입력 문제, 근 문제, 출력 문제의 세 가지 하위 문제로 나눌 수 있습니다. 이 세 가지 하위 문제는 이차방정식을 루팅하기 위한 세 가지 기능 모듈인 입력 모듈 M1, 계산 처리 모듈 M2, 출력 모듈 M3입니다. 여기서 M1 모듈은 필요한 원시 데이터의 입력을 수행하고, M2 모듈은 루팅 알고리즘에 따라 문제를 풀고, M3 모듈은 얻은 결과를 표시하거나 인쇄합니다. 이렇게 나누면 이차방정식의 루팅 문제는 비교적 독립적인 세 개의 하위 문제로 나뉘며, 모듈 구조는 그림 1-14에 나와 있습니다.
세 가지 분해 모듈은 일반적으로 순차적인 구조로 되어 있습니다. 그중 M1 및 M3 모듈은 분해없이 간단한 입력 및 출력을 완료하고 프로그램 흐름을 직접 설계 할 수 있으며 M2 모듈은 근 찾기를 완료하고 근 찾기는 이차 계수 a가 0인지 여부를 결정해야합니다. a = 0이면 방정식은 선형 방정식으로 퇴화되며 근을 찾는 방법은 이차 방정식의 방법과 다릅니다. a ≠ 0이면 이차 방정식의 근은 b2-4ac에서 찾아야 합니다. M2 모듈은 복잡하며 각각 일차 방정식과 이차 방정식의 근에 해당하는 두 개의 하위 모듈 M21과 M22로 세분할 수 있음을 알 수 있습니다. 모듈 구조는 그림 1-15에 나와 있습니다.
이 같은 분해 후 M21 하위 모듈의 역할은 알고리즘이 간단하고 직접 표현할 수 있는 선형 방정식의 근을 찾는 것이며, M22는 이차 방정식의 근을 찾는 것입니다. 알고리즘의 순서도 표현은 그림 1-16에 나와 있습니다. 간단한 시퀀스 구조와 선택 구조로 구성되어 있으며, 이는 M22 모듈의 가장 정제된 프로세스 표현입니다. 그런 다음 M1, M21 및 M3의 알고리즘을 M22 모듈을 정제하는 방법에 따라 순서도로 표현한 다음 각각 그림 1-15 및 1-14의 모듈 구조에 따라 조립하면 최종적으로 정제된 전체 순서도가 완성됩니다.
프로그래밍은 건물을 짓는 것과 같습니다. 우선 건물의 전체적인 구조를 고려하고 세부적인 부분은 무시해야 합니다. 전체 프레임워크가 구축된 후 각 방의 세부 사항을 점차적으로 해결합니다. 프로그래밍에서는 먼저 문제의 최상위 설계를 고려한 다음 점차적으로 개선하여 하위 수준 설계를 완성합니다. 복잡한 문제를 해결하는 일반적인 법칙에 따라 하향식, 단계별 설계 방법을 사용하는 것은 사람들이 받아들이는 데 익숙한 방법이며 프로그램 설계의 효율성을 크게 향상시킬 수 있습니다. 이 하향식 개별 접근 방식의 지침에 따라 전체에서 부분으로, 전체에서 세부 사항으로, 추상에서 구체로 점진적으로 개선하는 프로세스가 이루어집니다. 이러한 방식으로 작성된 프로그램은 명확한 구조가 특징이며, 이는 프로그램의 가독성과 유지보수성을 향상시킵니다.
3. 프로그래밍 스타일
어떤 의미에서 프로그래밍 스타일은 프로그램을 작성할 때 개인적인 습관입니다. 그러나 스타일 문제는 방법론 문제처럼 비교적 잘 정립된 이론과 규칙을 수반하지 않습니다. 프로그래밍 스타일은 프로그래밍에서 배운 교훈의 증류이며, 응용 관점이 다른 프로그래머는 이 주제에 대해 자신만의 관점을 가지고 있습니다. 이 때문에 프로그래밍 스타일은 특히 초보자가 간과하기 쉽습니다. 구조화된 프로그래밍은 프로그래밍 스타일의 필요성을 강조합니다. 프로그래밍 스타일은 주로 프로그램의 가독성에 영향을 미치기 때문입니다. 좋은 스타일을 가진 프로그램은 다음 사항에 주의를 기울여야 합니다.
(1) 문 형식주의. 프로그래밍 언어는 형식적인 언어이므로 정확해야 합니다. 따라서 엄격한 형식과 생동감 있는 내용이 소프트웨어 업계의 스타일입니다.
(2) 프로그램 일관성. 프로그램의 모든 부분에 걸쳐 스타일과 문서 형식을 일관되게 유지하는 것.
(3) 구조적 표준화. 프로그램 구조, 데이터 구조, 심지어 소프트웨어 아키텍처까지 구조화된 프로그래밍의 원칙을 준수해야 합니다.
(4) 메모의 적절한 사용. 메모는 프로그래머가 프로그램을 이해하고 가독성을 향상시키는 데 도움이 되는 중요한 수단입니다. 메모는 프로그램 또는 프로그램 줄에 적절하게 추가할 수 있습니다.
(5) 식별자는 현실에 가깝게. 프로그램에서 데이터, 변수 및 함수의 이름을 지정하는 원칙은 식별하고 이해하기 쉬운 의미 있는 식별자를 선택하는 것입니다. 모호한 약어와 식별자는 피하세요. 예를 들어 전압과 전류를 나타내는 변수 이름에 A와 B 대신 V와 I를 사용하세요. aa, bb와 같이 직관적이지 않은 변수 이름은 피하세요.