This commit is contained in:
ipvg 2024-07-23 00:58:55 -04:00
parent 3d7791fbec
commit 2344912a1a
8 changed files with 656 additions and 5 deletions

View File

@ -15,13 +15,28 @@ csharp_new_line_before_finally = false
# csharp_new_line_before_members_in_anonymous_types = false # csharp_new_line_before_members_in_anonymous_types = false
# csharp_new_line_between_query_expression_clauses = false # csharp_new_line_between_query_expression_clauses = false
#IDE1006 # IDE1006
dotnet_naming_style.camel_case.capitalization = camel_case # dotnet_naming_style.camel_case.capitalization = camel_case
# symbols # symbols
dotnet_naming_symbols.private_symbols.applicable_accessibilities = private # dotnet_naming_symbols.private_symbols.applicable_accessibilities = private
dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, protected # dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, protected
dotnet_naming_symbols.interface_types.applicable_kinds = interface # dotnet_naming_symbols.interface_types.applicable_kinds = interface
# rules # rules
dotnet_naming_rule.camel_case_for_private.severity = warning dotnet_naming_rule.camel_case_for_private.severity = warning
dotnet_naming_rule.camel_case_for_private.symbols = private_symbols dotnet_naming_rule.camel_case_for_private.symbols = private_symbols
dotnet_naming_rule.camel_case_for_private.style = camel_case dotnet_naming_rule.camel_case_for_private.style = camel_case
dotnet_naming_style.variable_style.capitalization = camel_case
dotnet_naming_style.variable_style.required_prefix = _
dotnet_naming_style.variable_style.required_suffix =
# Enforce custom snake_case-like naming for variable names
# dotnet_naming_rule.snake_case_like.variables.severity = error
# dotnet_naming_rule.snake_case_like.variables.symbols = variable
# dotnet_naming_rule.snake_case_like.variables.style = custom_snake_case_like
#
# dotnet_naming_symbols.variable.applicable_kinds = field, local, parameter
#dotnet_naming_style.custom_snake_case_like.capitalization = camel_case
#dotnet_naming_style.custom_snake_case_like.required_prefix = _
#dotnet_naming_style.custom_snake_case_like.required_suffix =

View File

@ -0,0 +1,185 @@
# Guided project - Develop conditional branching and looping structures in C#
Gain experience developing a console app that implements selection and
iteration statements to achieve app specifications.
### Learning objectives
In this module, you'll practice how to:
- Use Visual Studio Code to develop a C# console application that uses a
combination of selection and iteration statements to implement logical
workflows in accordance with supplied application data and user interactions.
- Evaluate the underlying conditions and make an informed decision when choosing
between `if-elseif-else` and `switch` statements, and between `foreach`,
`for`, `while`, and `do` iteration statements.
- Scope variables at an appropriate level within an application.
## Introduction
It's common for developers to begin a project by developing the features that
import or generate application data. Once your application has access to the
data it depends on, you can begin developing the features that process data and
generate reports.
Suppose you're a developer who likes to support the local community. You and
some of your friends started a business that helps find new homes for stray or
abandoned cats and dogs. Your business started off small, with just a couple of
strays, but it's starting to grow. You want to create an application that will
help you match the animals in your care with people looking for a pet. You've
found that it's important to have a detailed description of the animals to
share with potential owners. In addition, being able to describe the
personality of the dog or cat makes them more appealing to potential owners.
You decide to create an application that helps you manage information about the
dogs and cats you're caring for.
This module guides you through the process of developing the data-centric
features of the Contoso Pets application. You'll use selection and iteration
statements to create sample data, list the animals in your care, and add new
animals to your business. Throughout the application, you'll use variables and
expressions to control the execution of code branches. You will also ensure
that variables are scoped appropriately.
The application you develop will:
- Add predefined sample data to the pets array.
- Iterate a "menu options and user selection" code block to establish the outer
loop of your application.
- Implement code branches corresponding to the user's menu selections.
- Display all the information contained in the array used to store pet data
(based on user's menu selection).
- Iterate an "add new animal information" code block that enables the user to
add one or more new animals to the pets array (based on user's menu selection).
By the end of this module, you will be able to develop code that combines
selection and iteration statements to achieve your application design goals.
> Note
> This is a guided project module where youll complete an end-to-end project
by following step-by-step instructions.
### Learning Objectives
In this module, you'll practice how to:
- Develop a C# console application that uses a combination of selection and
iteration statements to implement logical workflows.
- Evaluate the underlying conditions in your application and make an informed
decision between selection statement options.
- Scope variables at an appropriate level within an application.
---
## Prepare
In this guided project, you'll develop the initial version of a C# application.
Your application will use boolean expressions, selection statements, and
iteration statements to implement the features of a design specification. As you develop the application, you'll need to scope variables at the appropriate level.
### Project overview
You're working on the Contoso Pets application, an application that helps place
pets in new homes. The specifications for your application are:
- Create a C# console application.
- Store application data in a multidimensional string array named
`ourAnimals`.
- The `ourAnimals` array includes the following "pet characteristics" for each
animal:
- Pet ID #.
- Pet species (cat or dog).
- Pet age (years).
- A description of the pet's physical condition/characteristics.
- A description of the pet's personality.
- The pet's nickname.
- Implement a sample dataset that represents dogs and cats currently in your
care.
- Display menu options to access the main features of the application.
- The main features enable the following tasks:
- List the pet information for all animals in the ourAnimals array.
- Add new animals to the ourAnimals array. The following conditions apply:
- The pet species (dog or cat) must be entered when a new animal is added to the ourAnimals array.
- A pet ID must be programmatically generated when a new animal is added to the ourAnimals array.
- Some physical characteristics for a pet may be unknown until a veterinarian's examination. For example: age, breed, and neutered/spayed status.
- An animal's nickname and personality may be unknown when a pet first arrives.
- Ensure animal ages and physical descriptions are complete. This may be required after a veterinarian's examination.
- Ensure animal nicknames and personality descriptions are complete (this action can occur after the team gets to know a pet).
- Edit an animals age (if a pet's birth date is known and the pet has a birthday while in our care).
- Edit an animals personality description (a pet may behave differently after spending more time in our care).
- Display all cats that meet user specified physical characteristics.
- Display all dogs that meet user specified physical characteristics.
An initial version of the application has already been completed. The Starter
code project for this Guided project module includes a Program.cs file that
provides the following code features:
- The code declares variables used to collect and process pet data and menu
item selections.
- The code declares the `ourAnimals` array.
- The code uses a for loop around an `if-elseif-else` construct to populate the
`ourAnimals` array with a sample dataset.
- The code displays the following main menu options for user selection:
```txt
1. List all of our current pet information.
2. Assign values to the ourAnimals array fields.
3. Ensure animal ages and physical descriptions are complete.
4. Ensure animal nicknames and personality descriptions are complete.
5. Edit an animals age.
6. Edit an animals personality description.
7. Display all cats with a specified characteristic.
8. Display all dogs with a specified characteristic.
Enter menu item selection or type "Exit" to exit the program
```
- The code reads the user's menu item selection and displays a message echoing
their selection.
Your goal is to develop the features that implement the first two menu options.
To achieve this goal, you'll complete the following tasks:
- Update the code that's used to create the sample data for the app.
- Construct a loop around the main menu and create a selection statement that
establishes a code branch for each menu option.
- Write the code to display all ourAnimals array data (menu option 1).
- Build a loop for entering new ourAnimals array data (menu option 2 - part 1).
- Write code to read and save new ourAnimals array data (menu option 2 - part 2).
You'll test your application at each stage of the development process.
## Setup
Use the following steps to prepare for the Guided project exercises.
To download a zip file containing the Starter project code, select the
following link:
[Lab Files](https://github.com/MicrosoftLearning/Guided-project-branching-looping-CSharp/archive/refs/heads/main.zip).
Unzip the download files.
Unzip the files in your development environment. Consider using your PC as your
development environment so that you have access to your code after completing
this module. If you aren't using your PC as your development environment, you
can unzip the files in a sandbox or hosted environment.
You're now ready to begin the Guided project exercises. Good luck!
---

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,255 @@
// the ourAnimals array will store the following:
string animalSpecies = "";
string animalID = "";
string animalAge = "";
string animalPhysicalDescription = "";
string animalPersonalityDescription = "";
string animalNickname = "";
// variables that support data entry
int maxPets = 8;
string? readResult;
string menuSelection = "";
// array used to store runtime data, there is no persisted data
string[,] ourAnimals = new string[maxPets, 6];
// create some initial ourAnimals array entries
for (int i = 0; i < maxPets; i++) {
switch (i) {
case 0:
animalSpecies = "dog";
animalID = "d1";
animalAge = "2";
animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.";
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
animalNickname = "lola";
break;
case 1:
animalSpecies = "dog";
animalID = "d2";
animalAge = "9";
animalPhysicalDescription = "large reddish-brown male golden retriever weighing about 85 pounds. housebroken.";
animalPersonalityDescription = "loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.";
animalNickname = "loki";
break;
case 2:
animalSpecies = "cat";
animalID = "c3";
animalAge = "1";
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
animalPersonalityDescription = "friendly";
animalNickname = "Puss";
break;
case 3:
animalSpecies = "cat";
animalID = "c4";
animalAge = "?";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
break;
default:
animalSpecies = "";
animalID = "";
animalAge = "";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
break;
}
ourAnimals[i, 0] = "ID #: " + animalID;
ourAnimals[i, 1] = "Species: " + animalSpecies;
ourAnimals[i, 2] = "Age: " + animalAge;
ourAnimals[i, 3] = "Nickname: " + animalNickname;
ourAnimals[i, 4] = "Physical description: " + animalPhysicalDescription;
ourAnimals[i, 5] = "Personality: " + animalPersonalityDescription;
}
do {
// display the top-level menu options
Console.Clear();
Console.WriteLine("Welcome to the Contoso PetFriends app. Your main menu options are:");
Console.WriteLine(" 1. List all of our current pet information");
Console.WriteLine(" 2. Add a new animal friend to the ourAnimals array");
Console.WriteLine(" 3. Ensure animal ages and physical descriptions are complete");
Console.WriteLine(" 4. Ensure animal nicknames and personality descriptions are complete");
Console.WriteLine(" 5. Edit an animals age");
Console.WriteLine(" 6. Edit an animals personality description");
Console.WriteLine(" 7. Display all cats with a specified characteristic");
Console.WriteLine(" 8. Display all dogs with a specified characteristic");
Console.WriteLine();
Console.WriteLine("Enter your selection number (or type Exit to exit the program)");
readResult = Console.ReadLine();
if (readResult != null) {
menuSelection = readResult.ToLower();
// NOTE: We could put a do statement around the menuSelection entry to
// ensure a valid entry, but we use a conditional statement below that
// only processes the valid entry values, so the do statement is not
// required here.
}
// use switch-case to process the selected menu option
switch (menuSelection) {
case "1":
// List all of our current pet information
for (int i = 0; i < maxPets; i++) {
if (ourAnimals[i, 0] != "ID #: ") {
Console.WriteLine();
for (int j = 0; j < 6; j++) {
Console.WriteLine(ourAnimals[i, j]);
}
}
}
Console.WriteLine("\n\rPress the Enter key to continue");
readResult = Console.ReadLine();
break;
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.");
}
while (anotherPet == "y" && petCount < maxPets) {
bool validEntry = false;
// get species (cat or dog) - string animalSpecies is a required field
do {
Console.WriteLine("\n\rEnter 'dog' or 'cat' to begin a new entry");
readResult = Console.ReadLine();
if (readResult != null) {
animalSpecies = readResult.ToLower();
if (animalSpecies != "dog" && animalSpecies != "cat") {
//Console.WriteLine($"You entered: {animalSpecies}.");
validEntry = false;
} else {
validEntry = true;
}
}
} while (validEntry == false);
// build the animal the ID number - for example C1, C2, D3 (for Cat 1, Cat 2, Dog 3)
animalID = animalSpecies.Substring(0, 1) + (petCount + 1).ToString();
// get the pet's age. can be ? at initial entry.
do {
int petAge;
Console.WriteLine("Enter the pet's age or enter ? if unknown");
readResult = Console.ReadLine();
if (readResult != null) {
animalAge = readResult;
if (animalAge != "?") {
validEntry = int.TryParse(animalAge, out petAge);
} else {
validEntry = true;
}
}
} while (validEntry == false);
// get a description of the pet's physical appearance/condition - animalPhysicalDescription can be blank.
do {
Console.WriteLine("Enter a physical description of the pet (size, color, gender, weight, housebroken)");
readResult = Console.ReadLine();
if (readResult != null) {
animalPhysicalDescription = readResult.ToLower();
if (animalPhysicalDescription == "") {
animalPhysicalDescription = "tbd";
}
}
} while (animalPhysicalDescription == "");
// get a description of the pet's personality - animalPersonalityDescription can be blank.
do {
Console.WriteLine("Enter a description of the pet's personality (likes or dislikes, tricks, energy level)");
readResult = Console.ReadLine();
if (readResult != null) {
animalPersonalityDescription = readResult.ToLower();
if (animalPersonalityDescription == "") {
animalPersonalityDescription = "tbd";
}
}
} while (animalPersonalityDescription == "");
// get the pet's nickname. animalNickname can be blank.
do {
Console.WriteLine("Enter a nickname for the pet");
readResult = Console.ReadLine();
if (readResult != null) {
animalNickname = readResult.ToLower();
if (animalNickname == "") {
animalNickname = "tbd";
}
}
} while (animalNickname == "");
// store the pet information in the ourAnimals array (zero based)
ourAnimals[petCount, 0] = "ID #: " + animalID;
ourAnimals[petCount, 1] = "Species: " + animalSpecies;
ourAnimals[petCount, 2] = "Age: " + animalAge;
ourAnimals[petCount, 3] = "Nickname: " + animalNickname;
ourAnimals[petCount, 4] = "Physical description: " + animalPhysicalDescription;
ourAnimals[petCount, 5] = "Personality: " + animalPersonalityDescription;
// 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();
}
break;
case "3":
// Ensure animal ages and physical descriptions are complete
Console.WriteLine("Challenge Project - please check back soon to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
case "4":
// Ensure animal nicknames and personality descriptions are complete
Console.WriteLine("Challenge Project - please check back soon to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
case "5":
// Edit an animals age");
Console.WriteLine("UNDER CONSTRUCTION - please check back next month to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
case "6":
// Edit an animals personality description");
Console.WriteLine("UNDER CONSTRUCTION - please check back next month to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
case "7":
// Display all cats with a specified characteristic
Console.WriteLine("UNDER CONSTRUCTION - please check back next month to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
case "8":
// Display all dogs with a specified characteristic
Console.WriteLine("UNDER CONSTRUCTION - please check back next month to see progress.");
Console.WriteLine("Press the Enter key to continue.");
readResult = Console.ReadLine();
break;
default:
break;
}
} while (menuSelection != "exit");

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,76 @@
int max_pets = 8;
//string? read_input;
//string menu_selection = "";
string[] description = {
"medium sized cream colored female golden retriever weighing about 65" +
"pounds. housebroken.",
"large reddish-brown male golden retriever weighing about 85 pounds. " +
"housebroken.",
"small white female weighing about 8 pounds. litter box trained.",
"translucid at sun.",
};
string[] personality = {
"friendly",
"loves to have his ears rubbed at any time! loves to lean-in.",
"loves to have her belly rubbed. gives lots of kisses.",
"sauvage and lovelly.",
};
string[] nickname = { "lola", "loki", "fuzz", "boby", "gogo", "besti" };
string[] species = { "cat", "dog", "bee", "pig" };
string[] abcd = { "a", "b", "c", "d" };
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8 };
Random rand = new Random();
// array used to store runtime data, there is no persisted data
string[,] our_animals = new string[max_pets, 6];
string rand_str(string[] choices) {
int indx = rand.Next(choices.Length);
return choices[indx];
}
int rand_int(int[] choices) {
int indx = rand.Next(choices.Length);
return choices[indx];
}
for (int i = 0; i < max_pets - 4; i++) {
bool uniq_id = false;
our_animals[i, 0] = rand_str(species);
while (!uniq_id) {
bool check = true;
string id = $"{rand_str(abcd)}{rand_int(nums)}";
for (int j = 0; j < max_pets - 4; j++) {
if (!string.IsNullOrEmpty(our_animals[j, 1]) && our_animals[j, 1] == id) {
uniq_id = false;
check = false;
break;
}
}
if (check) {
our_animals[i, 1] = id;
uniq_id = true;
}
}
our_animals[i, 2] = rand_str(description);
our_animals[i, 3] = $"{rand_int(nums)}";
our_animals[i, 4] = rand_str(personality);
our_animals[i, 5] = rand_str(nickname);
}
void print_pets() {
for (int j = 0; j < max_pets; j++) {
if (!string.IsNullOrEmpty(our_animals[j, 1])) {
Console.Write(our_animals[j, 1] + ": ");
Console.Write(our_animals[j, 0] + " - ");
Console.Write(our_animals[j, 5] + " - ");
int age = Int32.Parse(our_animals[j,3].ToString());
string year_word = age > 1 ? "years" : "year";
Console.WriteLine(our_animals[j, 3] + $" {year_word}");
Console.WriteLine(our_animals[j, 2]);
Console.WriteLine(our_animals[j, 4]+"\n");
}
}
}
print_pets();

View File

@ -0,0 +1,90 @@
// the ourAnimals array will store the following:
string animalSpecies = "";
string animalID = "";
string animalAge = "";
string animalPhysicalDescription = "";
string animalPersonalityDescription = "";
string animalNickname = "";
// variables that support data entry
int maxPets = 8;
string? readResult;
string menuSelection = "";
// array used to store runtime data, there is no persisted data
string[,] ourAnimals = new string[maxPets, 6];
// TODO: Convert the if-elseif-else construct to a switch statement
// create some initial ourAnimals array entries
for (int i = 0; i < maxPets; i++) {
if (i == 0) {
animalSpecies = "dog";
animalID = "d1";
animalAge = "2";
animalPhysicalDescription = "medium sized cream colored female golden retriever weighing about 65 pounds. housebroken.";
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
animalNickname = "lola";
} else if (i == 1) {
animalSpecies = "dog";
animalID = "d2";
animalAge = "9";
animalPhysicalDescription = "large reddish-brown male golden retriever weighing about 85 pounds. housebroken.";
animalPersonalityDescription = "loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs.";
animalNickname = "loki";
} else if (i == 2) {
animalSpecies = "cat";
animalID = "c3";
animalAge = "1";
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
animalPersonalityDescription = "friendly";
animalNickname = "Puss";
} else if (i == 3) {
animalSpecies = "cat";
animalID = "c4";
animalAge = "?";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
} else {
animalSpecies = "";
animalID = "";
animalAge = "";
animalPhysicalDescription = "";
animalPersonalityDescription = "";
animalNickname = "";
}
ourAnimals[i, 0] = "ID #: " + animalID;
ourAnimals[i, 1] = "Species: " + animalSpecies;
ourAnimals[i, 2] = "Age: " + animalAge;
ourAnimals[i, 3] = "Nickname: " + animalNickname;
ourAnimals[i, 4] = "Physical description: " + animalPhysicalDescription;
ourAnimals[i, 5] = "Personality: " + animalPersonalityDescription;
}
// display the top-level menu options
Console.Clear();
Console.WriteLine("Welcome to the Contoso PetFriends app. Your main menu options are:");
Console.WriteLine(" 1. List all of our current pet information");
Console.WriteLine(" 2. Add a new animal friend to the ourAnimals array");
Console.WriteLine(" 3. Ensure animal ages and physical descriptions are complete");
Console.WriteLine(" 4. Ensure animal nicknames and personality descriptions are complete");
Console.WriteLine(" 5. Edit an animals age");
Console.WriteLine(" 6. Edit an animals personality description");
Console.WriteLine(" 7. Display all cats with a specified characteristic");
Console.WriteLine(" 8. Display all dogs with a specified characteristic");
Console.WriteLine();
Console.WriteLine("Enter your selection number (or type Exit to exit the program)");
readResult = Console.ReadLine();
if (readResult != null) {
menuSelection = readResult.ToLower();
}
Console.WriteLine($"You selected menu option {menuSelection}.");
Console.WriteLine("Press the Enter key to continue");
// pause code execution
readResult = Console.ReadLine();

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>