(C++) 서브루틴: 프로시저 및 함수 - 1


서브루틴
서브루틴 은 이름이 있고 별도의 작업을 해결하는 프로그램의 별도 부분입니다. 서브루틴은 메인 프로그램의 시작 부분에 있으며 이름을 지정하여 메인 프로그램에서 시작(호출)할 수 있습니다.

프로그램의 다른 위치에 동일한 코드를 작성해야 하는 경우 서브루틴을 사용하면 코드 중복을 피할 수 있습니다. 
프로그램으로 가져온 라이브러리(예: 수학 라이브러리 сmath.h)는 누군가가 이미 컴파일한 서브루틴으로 구성됩니다. 프로그래머는 자신이 구현하는 알고리즘에 대해 생각할 필요가 없으며 정확히 수행하는 작업에 대해서만 생각하면서 적용하기만 하면 됩니다. 이것은 시간을 크게 절약해 줍니다. 다른 사람이 이미 작성한 알고리즘을 작성할 필요가 없습니다.

각 루틴은 하나의 작업만 수행해야 합니다.  무언가를 계산하거나 일부 데이터를 출력하거나 다른 작업을 수행하십시오. 

서브루틴에는 절차 기능의 두 가지 유형이 있습니다.

서브루틴은 일부 작업을 수행합니다. 예를 들어 결과를 특정 형식으로 화면에 표시합니다(간단한 예, 연산자 printf() 는 정보를 화면에 인쇄하는 표준 서브루틴입니다)

함수 서브루틴은 메인 프로그램에서 사용할 수 있는 결과를 반환(숫자, 문자열 등)합니다.

간단한 절차를 작성해 보겠습니다.
"오류" 문자열을 표시하고 싶다고 가정합니다. 사용자의 잘못으로 인해 코드에 오류가 발생할 때마다(예: 잘못된 데이터를 입력한 경우)
이것은 진술문을 작성하여 수행할 수 있습니다. cout << "오류"; 이제 그러한 줄을 프로그램의 여러 위치에 삽입해야 한다고 상상해 보십시오. 물론 아무데나 쓰셔도 됩니다. 하지만 이 솔루션에는 두 가지 단점이 있습니다.
1) 이 문자열은 메모리에 여러 번 저장됩니다.
2) 오류 시 출력을 변경하려면 프로그램 전체에서 이 줄을 변경해야 하므로 다소 불편합니다.

이러한 경우 절차가 필요합니다.
프로시저가 있는 프로그램은 다음과 같습니다. #include<iostream> 네임스페이스 표준 사용; void printError() // 절차 설명 { cout << "오류"; // 프로시저 본문 - 프로시저가 실행할 명령 } 기본() { ... printError() // 실행 절차를 시작합니다. 실행하려는 절차의 이름을 지정하기만 하면 됩니다. ... 인쇄 오류() ... } 프로시저는 void라는 단어로 시작합니다. 프로시저 이름 뒤에 빈 대괄호가 있습니다.
프로시저에서 실행되는 모든 명령문은 들여쓰기됩니다. 

프로시저는 메인 함수 main()
전에 작성됩니다.
프로시저를 실행하려면 기본 프로그램에서 이름으로 호출하고 괄호를 작성하는 것을 기억해야 합니다!
프로그램에서 프로시저를 여러 번 호출할 수 있습니다.

이제 사용자가 어떤 실수를 했는지에 따라 사용자의 오류에 대한 응답으로 다른 메시지를 표시해야 한다고 상상해 봅시다.
이 경우 각 오류에 대해 고유한 프로시저를 작성할 수 있습니다.   무효 인쇄 오류 제로() { cout << "오류. 0으로 나누기!"; } 무효 인쇄 오류 입력() { cout << "입력 오류!"; } 가능한 오류가 더 많으면 어떻게 됩니까? 이 솔루션은 우리에게 적합하지 않습니다!
표시할 오류 메시지를 알려줌으로써 절차를 제어하는 ​​방법을 배워야 합니다.
이를 위해서는 프로시저 이름 뒤에 괄호 안에 쓸 매개변수가 필요합니다. 무효 인쇄 오류(문자열) { cout << 에스; } 이 절차에서 s는 매개변수, 즉 절차를 제어할 수 있는 특수 변수입니다.
매개변수는 서브루틴의 작동 방식을 결정하는 변수입니다. 매개변수 이름은 하위 프로그램 헤더에 쉼표로 구분되어 나열됩니다. 매개변수 유형은 매개변수 앞에 작성됩니다.

이제 프로시저를 호출할 때 프로시저 내부의 매개변수(변수 s)에 할당될 실제 값을 괄호 안에 표시해야 합니다. printError("오류! 0으로 나누기!"); 이 값을 인수라고 합니다.
인수는 서브루틴이 호출될 때 전달되는 매개변수 값입니다.
인수는 상수 값일 뿐만 아니라 변수 또는 산술 표현식이 될 수도 있습니다.

로컬 및 글로벌 변수
서브루틴에서만 사용되는 추가 변수를 사용해야 하는 경우가 종종 있습니다. 이러한 변수를 로컬 (또는 로컬)이라고 하며 변수가 생성된 서브루틴 내에서만 조작할 수 있습니다.
 
로컬 변수 범위는 선언된 중괄호로 묶인 블록입니다.

C++의 메인 프로그램도 서브루틴이므로 main() 내부에 선언된 모든 변수는 지역 변수입니다.
다른 서브루틴은 다른 서브루틴의 로컬 변수에 대해 아무것도 "알지" 않습니다.

따라서 실제로 필요한 서브루틴으로만 변수의 범위(범위)를 제한할 수 있습니다. 프로그래밍에서 이 기술을 캡슐화  - 외부에서 변경되는 변수를 숨깁니다.

프로그램의 모든 서브루틴에서 볼 수 있는 변수를 선언해야 하는 경우 이러한 변수는 모든 서브루틴 외부에서 선언됩니다(아래 표의 프로그램 3 참조).
이러한 변수를 전역이라고 합니다.

C++에서 프로그램이 시작되면 모든 전역 변수는 자동으로 0으로 설정됩니다(부울 변수는 false 값을 가짐).


세 가지 프로그램 분석: <몸> 가 표시됩니다. 가 화면에 표시됩니다.

1) 이 프로그램에서 변수 i는 로컬입니다. 지역 변수는 서브루틴 내에서 선언됩니다. 2) 여기서 메인 프로그램에 변수 i(값 7)가 있어도 값 5인 새로운 로컬 변수 i가 생성됩니다. 
이 프로그램을 실행하면 화면에 값 75
3) 이 프로그램에는 전역 변수 i가 있습니다. 그 값은 서브루틴 내부와 메인 프로그램 내부에서 변경할 수 있습니다
프로시저는 전역 변수 i로 작동하며 2와 같은 새 값이 할당됩니다. 값 2
무효 테스트() {   정수 i = 5; cout << 나; } 무효 테스트() {   정수 i = 5;   cout << 나; } 기본() { 정수 i = 7;   cout << 나;   시험(); } #include <iostream> 네임스페이스 표준 사용; 정수 i; 무효 테스트() {   나는 = 2; } 기본() { 시험(); cout << 나; }
과제
두 변수의 값을 교환하는 프로시저를 작성하세요.

이 작업의 특징은 호출 프로그램에 알려지려면 프로시저에서 변경한 사항이 필요하다는 것입니다.

다음과 같이 프로시저를 작성해 봅시다. void Swap ( int a, int b ) // 절차 매개변수에 대한 설명과 함께, { // 인수(x 및 y)의 값이 복사됩니다. 정수 c; // 변수 a와 b는 x와 y에 관련되지 않은 독립 변수입니다. 씨 = 에이; a = b; b=c; } 기본() { 정수 x=1, y=2; 스왑(x,y); // 변수 x 및 y(인수)의 값이 매개변수 a 및 b에 복사됩니다. cout << "x=" << x<< ", y=" << 와이; // x=1, y=2 } 이 프로그램을 실행해보면 변수 xy 의 값이 변하지 않은 것을 확인할 수 있다. 매개변수가 인수의 값을 변경하려면 참조로 데이터 전달을 사용해야 합니다. 이렇게 하려면 데이터 유형의 이름 뒤에 서브루틴의 헤더에  & ("앰퍼샌드") 기호를 넣어야 합니다. 무효 스왑( int & a, int & b ) // 이제 변수 a와 b는 메모리에서 변수 x와 y의 주소를 얻습니다. { 정수 c; 씨 = 에이; a = b; b=c; } 사용법: 인수를 참조로 전달하면 프로시저를 호출할 때 변수 이름(숫자 및 산술 표현식이 아님)만 이 위치에 있을 수 있습니다!< br />
다음과 같은 프로시저를 호출하지 마십시오. 스왑(x, 4 ); 교환(5+x, y);