연습 - 새 애완 동물 데이터를 입력하기 위한 루프 빌드 및 테스트
이 연습에서는 새 ourAnimals 배열 데이터의 입력을 제어하는 코드를 개발합니다. 루프 제어 변수의 초기 값을 계산하고 동물에 대해 사용자가 지정한 데이터를 수집하는 루프를 생성합니다. 이 연습 중에 완료하는 자세한 작업은 다음과 같습니다.
- petCount 계산: 데이터를 할당한 배열의 애완 동물
ourAnimals수를 계산하는 코드를 작성합니다. - 조건부 메시지:
petCount가maxPets보다 작을 때 메시지 출력을 표시하는 코드를 작성합니다. - 외부 루프: 새
ourAnimals배열 데이터를 입력하는 데 사용할 루프 구조를 빌드합니다. - 종료 조건: "새 ourAnimals 배열 데이터 입력" 루프의 종료 조건을 평가하는 코드를 작성합니다.
- 확인 테스트: 이 연습에서 개발한 코드에 대한 확인 테스트를 수행합니다.
중요합니다
이 연습을 시작하기 전에 이 모듈의 이전 연습을 완료해야 합니다.
OurAnimals 배열의 애완 동물 수 계산
이 작업에서는 데이터 입력 루프에 대한 종료 조건을 설정하고, 데이터가 할당된 애완 동물의 수를 계산하는 데 사용할 수 있는 for 루프를 만듭니다 ourAnimals.
Visual Studio Code가 열려 있고 Program.cs 파일이 편집기에서 표시되는지 확인합니다.
먼저
switch(menuSelection)문을 찾고,case "2":코드 줄을 찾습니다.Console.WriteLine()"곧 제공될 예정" 메시지를 표시하는 문을 찾은 다음 빈 코드 줄로 바꿉니다.빈 코드 줄에,
anotherPet및petCount변수를 선언하려면 다음 코드를 입력하십시오.string anotherPet = "y"; int petCount = 0;이러한 두 변수는 새 애완 동물 데이터를 입력하는 데 사용되는 루프의 반복
while을 제어합니다. 선언의 일부로 두 변수를 초기화합니다.anotherPet는y루프가 시작되기 전에while값으로 초기화됩니다. 루프y내에서n또는while사용자 할당 값을 받습니다.petCount는 애완 동물 특성이 할당된 동물 수를 나타냅니다.while루프 외부에 계산된 값이 할당되고 새 동물이1열에 추가될 때마다while루프 내부에서ourAnimals씩 증가합니다.
중요합니다
변수의 범위는 항상 가능한 한 좁아야 합니다. Contoso Pets 애플리케이션에서는
petCount코드 블록의 범위를 지정하지 않고 애플리케이션 수준에서case "2":범위를 지정할 수 있습니다. 큰 범위는 애플리케이션 어디서든petCount에 액세스할 수 있게 합니다. 애플리케이션 수준에서 범위가 지정된 경우petCount샘플 데이터를 만들고 애플리케이션의 나머지 부분에서 프로그래밍 방식으로 해당 값을 관리할 때 값을 할당할 수 있습니다. 예를 들어, 애완 동물을 위한 집을 찾아 배열에서ourAnimals애완 동물을 제거하면petCount만큼1을 줄일 수 있습니다. 문제는 애플리케이션의 다른 부분에서 사용할지 확실하지 않은 경우 변수의 범위를 어느 수준에서 지정해야 하나요? 이 경우 다른 곳에서는 사용하지 않더라도 애플리케이션 수준에서petCount을 정의하고 싶은 유혹을 느낍니다. 결국 애플리케이션 수준에서petCount의 범위를 지정하면, 다른 곳에서 사용하기로 결정할 때 이를 사용할 수 있게 됩니다. 애플리케이션 수준에서도 다른 변수의 범위를 지정할 수 있습니다. 이렇게 하면 변수가 항상 범위에 있고 액세스할 수 있습니다. 그렇다면 나중에 애플리케이션에서 사용될 수 있다고 생각되면 애플리케이션 수준에서 변수의 범위를 지정하지 않겠습니까? 필요한 것보다 높은 수준에서 변수의 범위를 지정하면 문제가 발생할 수 있습니다. 상승된 범위는 애플리케이션의 리소스 요구 사항을 확장하며 불필요한 보안 위험에 애플리케이션을 노출할 수 있습니다. 애플리케이션이 점점 더 커지고 복잡해짐에 따라 더 많은 리소스가 필요합니다. 휴대폰과 컴퓨터는 리소스가 유효 범위 내에 있을 때 해당 리소스에 대한 메모리를 할당합니다. 애플리케이션이 더 "실제"가 되면 더 쉽게 액세스할 수 있게 됩니다. 애플리케이션은 클라우드 또는 다른 애플리케이션에서 액세스할 수 있는 경우가 많습니다. 이러한 문제를 복합화하면 애플리케이션은 사용되지 않을 때 실행 상태로 남아 있는 경우가 많습니다. 애플리케이션의 리소스 요구 사항을 제어하고 보안 공간을 가능한 한 작게 유지하는 것이 중요합니다. 오늘날의 운영 체제는 리소스를 관리하고 애플리케이션을 보호하는 데 큰 역할을 하지만 변수 범위를 실제로 필요한 수준으로 유지하는 것이 가장 좋습니다. Contoso Pets 앱에서petCount를 애플리케이션 내에서 더 광범위하게 사용하기로 결정한 경우 더 높은 수준에서petCount의 범위를 지정하도록 코드를 업데이트할 수 있습니다. 변수의 범위를 가능한 한 좁게 유지하고 필요할 때만 범위를 늘려야 합니다.변수 선언 아래의 코드 줄에서
ourAnimals배열의 동물을 순회하는 루프를 만들려면, 다음 코드를 입력합니다.for (int i = 0; i < maxPets; i++) { }이 코드는 친숙해 보일 것입니다. 이
for루프를ourAnimals배열을 반복할 때마다 사용합니다.루프의
for코드 블록 내에 애완 동물 특성 데이터가 동물에 할당되었는지 확인하려면 다음 코드를 입력합니다.if (ourAnimals[i, 0] != "ID #: ") { }다시 말하지만, 이 코드는 친숙해 보일 것입니다. 애완 동물 특성이 할당되었는지 확인할 때마다 이
if문을 사용합니다.if코드 블록 내부에서petCount을(를) 1씩 증가시키려면 다음 코드를 입력하십시오.petCount += 1;완료된
for루프를 검사하는 데 1분 정도 걸립니다.완료된
for루프는 다음 코드와 같습니다.for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { petCount += 1; } }이 코드는
ourAnimals배열을 순회하면서 할당된 데이터를 확인합니다. 데이터가 할당된 동물을 찾으면petCounter의 값을 증가시킵니다.Visual Studio Code 파일 메뉴에서 저장을 선택합니다.
Visual Studio Code에서 통합 터미널 패널을 열고 프로그램을 빌드하는 명령을 입력합니다.
탐색기 보기에서 터미널 통합을 열려면 시작 키를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다. 보기 또는 터미널 메뉴를 사용하여 통합 터미널 패널을 열 수도 있습니다.
프로그램을 빌드하려면 터미널 명령 프롬프트에서 명령을 입력
dotnet build합니다.계속하기 전에 보고된 빌드 오류를 수정합니다.
비고
지금은 할당되지만 사용되지 않는 것에 대한
anotherPet경고 메시지를 무시할 수 있습니다. 나중에 이 연습에서anotherPet를 사용하는 코드를 추가할 것입니다.빌드 오류가 있는 경우 빌드 오류 및 경고 메시지에 문제가 무엇이고 어디에서 찾을 수 있는지 알려 줍니다. 코드를 업데이트하는 경우 다시 빌드하기 전에 변경 내용을 저장해야 합니다.
터미널 패널을 닫습니다.
petCount가 maxPets보다 작은 경우 메시지 출력 표시
이 작업에서는 petCount가 maxPets보다 작은지 확인하고, 작을 경우 사용자에게 메시지를 표시합니다.
만든 루프 아래의 빈 코드 줄에서
for보다petCount작은지maxPets확인하려면 다음 코드를 입력합니다.if (petCount < maxPets) { }문의 코드 블록
if내에서 사용자에게 메시지를 표시하려면 다음 코드를 입력합니다.Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more.");응용 프로그램 사용자는 애완 동물 특성을 입력하려고합니다. 이 메시지는 중요한 컨텍스트를 제공합니다.
잠시 시간을 내어
case "2":문의switch코드 분기를 검토합니다.이 시점에서
case "2":코드 분기는 다음 코드와 같이 표시됩니다.case "2": // Add a new animal friend to the ourAnimals array string anotherPet = "y"; int petCount = 0; for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { petCount += 1; } } if (petCount < maxPets) { Console.WriteLine($"We currently have {petCount} pets that need homes. We can manage {(maxPets - petCount)} more."); } Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); break;Visual Studio Code 파일 메뉴에서 저장을 선택합니다.
Visual Studio Code에서 통합 터미널 패널을 열고 프로그램을 빌드하는 명령을 입력합니다.
계속하기 전에 보고된 빌드 오류를 수정합니다.
다시 말하지만, 할당이 되었으나 사용되지 않은
anotherPet에 대한 경고 메시지는 무시해도 됩니다. 다음 작업에서는 하나 이상의 애완 동물에 대한 데이터를 입력하는 데 사용되는 루프 빌드를 시작while합니다.while루프에 대해 만든 식은anotherPet을 사용하며 이 경고 메시지는 사라지게 됩니다.경고 메시지는 주의해야 하지만 프로그램을 실행할 수 없습니다.
터미널 명령 프롬프트에서 프로그램을 실행하는 명령을 입력합니다.
dotnet run터미널 명령 프롬프트에서 명령을 입력하여 프로그램 코드를 실행합니다.코드가 런타임 오류를 생성하지 않는 한 이제 앱의 주 메뉴가 터미널 패널에 표시됩니다.
터미널 명령 프롬프트에서 2를 입력합니다.
당신의
case "2":코드 브랜치와 해당하는 값입니다.터미널에 다음 메시지가 표시되는지 확인합니다.
We currently have 4 pets that need homes. We can manage 4 more. Press the Enter key to continue.예상되는 메시지가 표시되지 않으면 코드를 검토하여 문제를 식별하고 해결합니다. 변경 내용을 저장하고, 다시 빌드하고, 앱을 다시 실행합니다. 계속하기 전에 코드가 예상대로 작동해야 합니다.
터미널 명령 프롬프트에서 Enter 키를 눌러 애플리케이션을 계속 실행합니다.
애플리케이션을 종료한 다음 터미널 패널을 닫습니다.
새 OurAnimals 배열 데이터를 입력하는 데 사용할 루프 구조 빌드
이 작업에서는 while이 anotherPet와 같고 y이 petCount보다 작은 동안 계속 반복되는 maxPets 루프를 만듭니다.
코드 편집기에서 코드 블록 아래에
if (petCount < maxPets)빈 코드 줄을 만듭니다.새
while루프를 만드는 프로세스를 시작하려면 다음 코드를 입력합니다.while (anotherPet == "y" && petCount < maxPets) { }Visual Studio Code 파일 메뉴에서 저장을 선택합니다.
Visual Studio Code에서 통합 터미널 패널을 열고 프로그램을 빌드하는 명령을 입력합니다.
사용되지 않는 것에 대한
anotherPet경고 메시지가 더 이상 수신되지 않습니다.빌드 오류 또는 경고가 보고된 경우 계속하기 전에 문제를 해결합니다.
새 애완 동물 루프에 대한 종료 조건 확인
이 작업에서는 코드 블록을 업데이트합니다 while (anotherPet == "y" && petCount < maxPets) . 새 코드는 petCount를 증가시키고, 그런 다음 petCount이 maxPets보다 작은지 확인합니다. "petCount가 maxPets보다 작으면 사용자에게 다른 애완 동물에 대한 정보를 입력할지를 물어보고, 응답이 y 또는 n인지 확인합니다."
while (anotherPet == "y" && petCount < maxPets) 코드 블록 후에 petCount의 값을 확인합니다. 만약 petCount이 maxPets과 같으면, 더 이상 애완동물을 추가할 수 없다는 것을 사용자에게 알려야 합니다.
비고
애완 동물 데이터를 입력하는 데 사용되는 코드는 다음 연습에서 개발됩니다. 지금은 petCount가 데이터가 입력되고 ourAnimals 배열에 저장되는 것처럼 증가합니다. 이렇게 하면 루프와 while 연결된 코드 논리 개발을 완료할 수 있습니다.
이전 작업에서 만든 루프의
while (anotherPet == "y" && petCount < maxPets)코드 블록 내에 빈 코드 줄을 만듭니다.petCount를 증가시키려면, 다음의 코드를 입력하세요.// increment petCount (the array is zero-based, so we increment the counter after adding to the array) petCount = petCount + 1;petCount이(가)maxPets보다 작은지 확인하려면 다음 코드를 입력합니다.// check maxPet limit if (petCount < maxPets) { }사용자가 만든 문의 코드 블록
if내에 다른 애완 동물을 추가할지 여부를 사용자에게 물어보려면 다음 코드를 입력합니다.// another pet? Console.WriteLine("Do you want to enter info for another pet (y/n)");WriteLine()입력한 메시지 아래에 사용자 응답을 읽고 사용자가 "y" 또는 "n"을 입력했는지 확인하려면 다음 코드를 입력합니다.do { readResult = Console.ReadLine(); if (readResult != null) { anotherPet = readResult.ToLower(); } } while (anotherPet != "y" && anotherPet != "n");break문에서case "2";으로부터case "3";를 구분하는switch문을 찾습니다.Console.WriteLine()코드의 끝에 있는Console.ReadLine()및case "2";명령문을 확인하십시오.이 코드는 사용자에게 메시지를 표시한 다음 애플리케이션을 일시 중지합니다.
문 내에
Console.WriteLine()Console.ReadLine()및if문을 묶려면 다음과 같이 코드를 업데이트합니다.if (petCount >= maxPets) { Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); } break; case "3":petCount의 값은while루프 내에서 증가합니다.petCount이maxPets와 같으면, 더 이상 애완 동물을ourAnimals배열에 추가할 수 없습니다. 이 경우 사용자에게 알려야 합니다.Contoso Pets가 용량에 도달했음을 사용자에게 알리려면 다음과 같이 코드를 업데이트합니다.
if (petCount >= maxPets) { Console.WriteLine("We have reached our limit on the number of pets that we can manage."); Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); } break; case "3":작성한 루프의 코드
while와 사용자 메시지를 검토해 보세요.while (anotherPet == "y" && petCount < maxPets)사용자 메시지를 표시하는 루프 및 코드는 다음 코드와 같아야 합니다.while (anotherPet == "y" && petCount < maxPets) { // increment petCount (the array is zero-based, so we increment the counter after adding to the array) petCount = petCount + 1; // check maxPet limit if (petCount < maxPets) { // another pet? Console.WriteLine("Do you want to enter info for another pet (y/n)"); do { readResult = Console.ReadLine(); if (readResult != null) { anotherPet = readResult.ToLower(); } } while (anotherPet != "y" && anotherPet != "n"); } } if (petCount >= maxPets) { Console.WriteLine("We have reached our limit on the number of pets that we can manage."); Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); }Visual Studio Code 파일 메뉴에서 저장을 선택합니다.
Visual Studio Code에서 통합 터미널 패널을 열고 프로그램을 빌드하는 명령을 입력합니다.
계속하기 전에 보고된 빌드 오류 또는 경고를 수정합니다.
작업 확인
이 작업에서는 통합 터미널에서 애플리케이션을 실행하고 만든 루핑 및 분기 논리가 예상대로 작동하는지 확인합니다.
필요한 경우 Visual Studio Code의 통합 터미널 패널을 엽니다.
터미널 명령 프롬프트에서 dotnet run을 입력합니다.
터미널 명령 프롬프트에서 2를 입력합니다.
다음 메시지가 표시되는지 확인합니다.
We currently have 4 pets that need homes. We can manage 4 more. Do you want to enter info for another pet (y/n)터미널 명령 프롬프트에서 n을 입력합니다 .
"n"을 입력할 때 코드가 새 애완 동물을 입력하기 위한 루프를 종료했는지 확인합니다.
코드 논리가 예상대로 작동하는 경우 터미널에 주 메뉴가 표시됩니다.
코드가 예상대로 루프를 종료하지 않으면 터미널에서 Ctrl + C 를 눌러 강제로 실행을 중지합니다. 코드를 수동으로 단계별로 실행하고 종료 조건 변수의 값을 추적해야 합니다. 필요한 경우 사용자가 “n”을 입력할 때
while루프를 종료하도록 코드를 업데이트합니다. 변경 내용을 저장하고, 프로그램을 다시 빌드하고, 확인 테스트를 실행하여 이 시점에 다시 도착합니다.터미널 명령 프롬프트에서 2를 입력합니다.
다시 한 번 다음 메시지가 표시됩니다.
We currently have 4 pets that need homes. We can manage 4 more. Do you want to enter info for another pet (y/n)터미널 명령 프롬프트에서 y를 입력 합니다.
코드에서
petCount가 사용되는 방식을 잠시 생각해 보세요.코드의 유효성을 검사하려면 코드 논리를 이해해야 합니다.
이 경우 코드 논리는
petCount와maxPets사이의 관계에 의존합니다.maxPets가8의 값을 할당받았다는 것을 알고 있지만,petCount는 어떻게 되나요? 다음 항목은 구현한 논리를 평가하는 데 도움이 됩니다.petCount는4루프의 첫 번째 반복을 입력할 때while임을 알고 있습니다.petCount루프가 반복될 때마다while가 증분된다는 것을 알고 있습니다.할당된
petCount값과petCount가 증가되는 방식은 데이터가ourAnimals배열에 저장되는 방식에 영향을 미친다는 것을 알고 있습니다. 다음 항목은petCount와ourAnimals에 저장된 데이터 간의 관계를 설명합니다.- 애플리케이션은 샘플 데이터를 만들 때 배열에
ourAnimals4개의 애완 동물을 추가합니다. - 애플리케이션은
ourAnimals의 값이petCount일 때4배열에 새 데이터를 저장합니다. 버그가 아닙니다. 이 코드는 배열 요소가 0부터 시작하는 것을 기억할 때 의미가 있습니다. 예를 들어,ourAnimals[0,0]은 동물1의 애완동물 ID를 포함하고,ourAnimals[3,0]은 동물4의 애완동물 ID를 포함합니다. 따라서petCount이4일 때, 다섯 번째 애완 동물의 데이터를 저장하고 있는 것입니다. - 애플리케이션은 증가하기 전에 배열에 애완 동물 데이터를 저장합니다
petCount. - 애플리케이션은
petCount을(를) 증가시킨 후 사용자가 다른 애완 동물을 추가하고 싶은지에 대한 메시지를 표시합니다. - 애플리케이션이 "다른 애완 동물에 대한 정보를 입력하시겠습니까 (y/n)" 프롬프트를 처음 표시할 때,
petCount는 이미5로 설정되어 있습니다.
- 애플리케이션은 샘플 데이터를 만들 때 배열에
사용자가 첫 번째 다른 애완동물에 대한 정보를 입력하기 원하십니까(y/n)라는 프롬프트에서 y를 입력하면, 다음과 같이 알 수 있습니다:
- 루프가
while (anotherPet == "y" && petCount < maxPets)반복됩니다. 루프가anotherPet == "y"과petCount < maxPets때문에 반복될 것임을 알고 있습니다. -
petCount에 할당된 값은while루프가 반복될 때마다 증가합니다. -
petCount에 할당된 값은 사용자가 처음으로6를 입력한 후에 가 됩니다.
- 루프가
애플리케이션을 계속 테스트할 때 코드 논리에 대한 이 분석을 염두에 두어야 합니다.
터미널 패널이 동일한 "다른 애완 동물?" 메시지로 업데이트되지만 코드에 업데이트
petCount된 내용이 표시되지 않습니다.이제 터미널 패널에 다음 출력이 표시됩니다.
We currently have 4 pets that need homes. We can manage 4 more. Do you want to enter info for another pet (y/n) y Do you want to enter info for another pet (y/n)터미널 명령 프롬프트에서 y를 입력 합니다.
y을(를) 두 번째로 입력하면petCount이(가)7로 증가됩니다. 그래서petCount여전히 보다 작다maxPets터미널 명령 프롬프트에서 y를 입력 합니다.
세 번째로
y을(를) 입력하면petCount이(가)8로 증가합니다. 이제petCount다음과 같습니다.maxPetswhile를 세 번째로 입력할 때 코드가 루프를 종료했는지 확인합니다.이제 터미널 패널에 다음 출력이 표시됩니다.
We currently have 4 pets that need homes. We can manage 4 more. Do you want to enter info for another pet (y/n) y Do you want to enter info for another pet (y/n) y Do you want to enter info for another pet (y/n) y We have reached our limit on the number of pets that we can manage. Press the Enter key to continue.코드가 예상대로 루프를 종료하지 않는 경우 코드를 수동으로 단계별로 실행하고 종료 조건 변수의 값을 추적합니다.
petCount가maxPets와 동일한 값에 도달하면 루프를 종료하도록 코드를 업데이트합니다. 먼저petCount가maxPets과 동일하다는 것과 기본값이8임을 알 때까지 "y"라고 계속 대답하십시오.터미널 명령 프롬프트에서 Enter 키를 눌러 애플리케이션을 계속 실행합니다.
애플리케이션을 종료한 다음 터미널 패널을 닫습니다.