서브루틴은 이름이 있고 별도의 작업을 해결하는 프로그램의 별도 부분입니다. 서브루틴은 메인 프로그램의 시작 부분에 있으며 이름을 지정하여 메인 프로그램에서 실행(호출)할 수 있습니다.
다른 위치 프로그램에서 동일한 코드를 작성해야 하는 경우 서브루틴을 사용하면 코드 중복을 방지할 수 있습니다. .
프로그램(예: 시스템)으로 가져온 라이브러리는 누군가가 이미 컴파일한 루틴으로 구성됩니다. 프로그래머는 어떤 알고리즘이 구현되어 있는지 생각할 필요가 없습니다. 정확히 무엇을 하고 있는지 생각하면서 적용하기만 하면 됩니다. 이것은 시간을 크게 절약해 줍니다. 다른 사람이 이미 작성한 알고리즘을 작성할 필요가 없습니다.
각 서브루틴은 하나의 작업만 수행해야 합니다. 무언가를 계산하거나 일부 데이터를 출력하거나 다른 작업을 수행해야 합니다.
서브루틴 또는 메소드는 기능(작업 결과를 반환하는 것)과프로시저(그렇지 않은 것)의 두 가지 유형입니다.
두 번째 유형부터 시작하겠습니다. 간단한 예제를 작성해 보겠습니다.
화면에 "Error"라는 문자열을 표시해야 한다고 가정합니다. 사용자의 잘못(예: 잘못된 데이터 입력)으로 인해 코드에 오류가 발생할 때마다.
이는 문을 작성하여 수행할 수 있습니다.
<예비>
Console.WriteLine("오류");
이제 이 줄이 프로그램의 여러 위치에 삽입되어야 한다고 상상해 봅시다. 물론 아무데나 쓰셔도 됩니다. 하지만 이 솔루션에는 두 가지 단점이 있습니다.
1) 이 문자열은 메모리에 여러 번 저장됩니다.
2) 오류 시 출력을 변경하려면 프로그램 전체에서 이 줄을 변경해야 하므로 다소 불편합니다.
이러한 경우에는 방법과 절차가 필요합니다.
프로시저가 있는 프로그램은 다음과 같습니다.
using System;
클래스 프로그램 {
정적 무효 PrintError() {
Console.WriteLine("오류");
}
정적 무효 Main() {
인쇄오류();
}
}코드>스팬>스팬>
프로시저는 void 라는 단어로 시작합니다. 다음 절차 이름 빈 괄호가 작성됩니다.
프로시저에서 실행되는 모든 명령문은 들여쓰기됩니다.
정적 수식어는 주어진 필드, 메소드 또는 속성이 클래스의 각 개체에 속하지 않고 모두 함께 속한다는 것을 의미합니다.
메서드와 프로시저는 메인 메서드 Main() 앞에 작성됩니다.
절차를 참조하려면 기본 프로그램에서 이름으로 호출해야 하며 괄호를 쓰는 것을 잊지 마십시오.
프로그램에서 프로시저를 여러 번 호출할 수 있습니다.
|
이제 사용자 오류에 대한 응답으로 다른 메시지를 표시해야 한다고 가정해 보겠습니다. 정확히 어떤 실수를 저질렀는지.
이 경우 각 오류에 대해 고유한 절차를 작성할 수 있습니다.
무효 인쇄 오류 제로()
{
Console.WriteLine("오류. 0으로 나누기!");
}
<예비>
void printErrorInput()
{
Console.WriteLine("입력 오류!");
}
스팬>코드>스팬>프리>
가능한 오류가 더 많으면 어떻게 합니까? 그렇다면 이 솔루션은 우리에게 적합하지 않을 것입니다.
표시할 오류 메시지를 알려줌으로써 절차를 제어하는 방법을 배워야 합니다.
이를 위해서는 프로시저 이름 뒤에 괄호 안에 작성할 매개변수가 필요합니다
<예비>
void printError(string s)
{
Console.WriteLine(s);
}
스팬>코드>스팬>프리>
이 절차에서 s는 매개변수입니다. 절차를 제어할 수 있습니다.
매개변수는 서브루틴의 작동이 의존하는 값을 가진 변수입니다. 매개변수 이름은 하위 프로그램 헤더에 쉼표로 구분되어 나열됩니다. 매개변수 유형은 매개변수 앞에 작성됩니다.
이제 프로시저를 호출할 때 할당될 실제 값을 괄호 안에 지정해야 합니다. 프로시저 내부의 매개변수( 변수 s)
<예비>
printError("오류! 0으로 나누기!");
스팬>코드>스팬>프리>
이 값을 인수라고 합니다.
인수는 서브루틴이 호출될 때 전달되는 매개변수 값입니다.
인수는 상수 값일 뿐만 아니라 변수 또는 산술 표현식이 될 수도 있습니다.< /스팬>< /스팬>
|
로컬 및 글로벌 변수
서브루틴에서만 사용되는 추가 변수를 사용해야 하는 경우가 종종 있습니다. 이러한 변수를 로컬(또는 로컬)이라고 하며 변수가 생성된 서브루틴 내에서만 조작할 수 있습니다.
로컬 변수 범위는 선언된 중괄호로 묶인 블록입니다. div>
C#의 기본 프로그램도 서브루틴이므로 void Main() 내부에 선언된 모든 변수는 지역 변수입니다. 다른 서브루틴은 다른 서브루틴의 로컬 변수에 대해 아무것도 "알지" 않습니다.
따라서 실제로 필요한 서브루틴으로만 변수의 범위(범위)를 제한할 수 있습니다. 프로그래밍에서 이 기술을 캡슐화 - 변수를 외부에서 변경하지 못하도록 숨깁니다.
프로그램의 모든 서브루틴에서 볼 수 있는 변수를 선언해야 하는 경우 이러한 변수는 모든 서브루틴 외부에서 선언됩니다(아래 표의 프로그램 3 참조).
이러한 변수를 글로벌이라고 합니다.
C#에서는 프로그램이 시작되면 모든 전역 변수가 자동으로 0으로 설정됩니다(부울 변수는 false 값을 가짐).
세 가지 프로그램 분석:
<몸>
1) 이 프로그램에서 변수 i는 로컬입니다. 지역 변수는 서브루틴 내에서 선언됩니다. |
2) 여기서 메인 프로그램에 변수 i(값 7)가 있어도 값 5인 새로운 로컬 변수 i가 생성됩니다.
이 프로그램이 실행되면 값 75가 화면에 나타납니다. |
3) 이 프로그램에는 전역 변수 i가 있습니다. 그 값은 서브루틴 내부와 메인 프로그램 내부에서 변경할 수 있습니다.
프로시저는 전역 변수 i와 함께 작동하며 2와 같은 새 값이 할당됩니다. 값 2가 표시됩니다. |
정적 무효 테스트()
{
정수 i = 5;
Console.Write("i");
}
|
정적 무효 테스트()
{
정수 i = 5;
Console.Write("i");
}
정적 무효 메인()
{
정수 i = 7;
Console.Write("i");
시험();
}
|
시스템 사용;
수업 프로그램
{
정수 i;
정적 무효 테스트()
{
나는 = 2;
}
정적 무효 메인()
{
시험();
Console.Write("i");
}
}
|
테이블>
과제
두 변수의 값을 교환하는 프로시저를 작성하세요.
이 작업의 특이점은 호출 프로그램에 알려지려면 프로시저의 변경 사항이 필요하다는 것입니다.
다음과 같이 프로시저를 작성해 봅시다.
static 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에 복사됨, x = 1, y = 2
}
이 프로그램을 실행하면 x, y 변수의 값이 변하지 않은 것을 확인할 수 있습니다. 매개 변수가 인수의 값을 변경하려면 참조에 의한 데이터 전달을 사용해야 합니다. 이렇게 하려면 서브루틴 헤더의 데이터 유형 이름 앞에 ref를 작성해야 합니다. 코드>.
void Swap ( ref int a, ref int b ) // 이제 변수 a와 b는 메모리에서 변수 x와 y의 주소를 얻습니다.
{
정수 c;
씨 = 에이; a = b; b=c;
}
정적 무효 메인()
{
정수 x=1, y=2;
스왑(ref x, ref y);
적용: 인수를 참조로 전달하면 프로시저를 호출할 때 변수의 이름(숫자 및 산술 표현식이 아님)만 이 위치에 올 수 있습니다.
다음과 같은 프로시저를 호출할 수 없습니다.
<예비>
스왑(x, 4);
스왑(5+x, y);
|
|