end 026
This commit is contained in:
parent
66f2b231e7
commit
74ae016548
481
026_Challenge_variabe_data/026_csharp.md
Normal file
481
026_Challenge_variabe_data/026_csharp.md
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
# Challenge project
|
||||||
|
|
||||||
|
## Work with variable data in C#
|
||||||
|
|
||||||
|
Demonstrate your ability to develop a console app that implements data
|
||||||
|
formatting and using arrays to deliver a multiple term search feature.
|
||||||
|
|
||||||
|
### Learning objectives
|
||||||
|
|
||||||
|
Apply iteration statements using data input.
|
||||||
|
|
||||||
|
- Process data.
|
||||||
|
|
||||||
|
- Format data output.
|
||||||
|
|
||||||
|
- Choose the correct data types and safely converting data types.
|
||||||
|
|
||||||
|
- Create and manipulate string arrays, and sort array data.
|
||||||
|
|
||||||
|
- Modify and build complex strings from multiple data sources, and format data
|
||||||
|
for display.
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
Suppose you're one of the developers working on the Contoso Pets adoption
|
||||||
|
application to help find new homes for pets. Your starting version of the
|
||||||
|
application gathers a single search term used to search the descriptions of
|
||||||
|
dogs. A single term search is helpful, but the feedback given from the team is
|
||||||
|
the application needs more search functionality. The team wants you to extend
|
||||||
|
the search functionality to allow for multiple term searches. Additionally, the
|
||||||
|
team wants to pilot an update to the "search status" animation that shows
|
||||||
|
search progress.
|
||||||
|
|
||||||
|
In this challenge coding project, your C# data knowledge and skills are applied
|
||||||
|
for:
|
||||||
|
|
||||||
|
- Creating string arrays by splitting strings
|
||||||
|
- Manipulating array data, iterating through elements in an array, and sorting array data
|
||||||
|
- Modifying and building strings from multiple data sources
|
||||||
|
|
||||||
|
In short, you'll:
|
||||||
|
|
||||||
|
- Develop multi-term search functionality for the "dogs" search
|
||||||
|
- Update the "search status" animation, information and countdown
|
||||||
|
|
||||||
|
By the end of this module, you complete an updated version of the Contoso Pets
|
||||||
|
application that searches all dogs available for adoption using multiple search
|
||||||
|
terms and an improved search status simulation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Project specification overview
|
||||||
|
|
||||||
|
Update the existing Contoso Pets starter application to include multiple term
|
||||||
|
search and improved "search status" animation features:
|
||||||
|
|
||||||
|
#### Add dog attribute multi-term search
|
||||||
|
|
||||||
|
Gather user input for the pet characteristic multiple term search
|
||||||
|
|
||||||
|
- Users need to provide search terms separated by commas
|
||||||
|
- Store the search terms in an array and sort the terms alphabetically
|
||||||
|
|
||||||
|
Within the animals array loop that identifies "dogs":
|
||||||
|
|
||||||
|
- Iterate through the search terms to search each dog's description
|
||||||
|
- Search the combined description for a term match
|
||||||
|
- Output each dog's description where there's one or more terms matched
|
||||||
|
|
||||||
|
After exiting the "search Animals" array loop that identifies dogs:
|
||||||
|
|
||||||
|
If no dogs were a match for any of the users provided search terms, output a no
|
||||||
|
dogs matched message.
|
||||||
|
|
||||||
|
#### Add "search status" improvements
|
||||||
|
|
||||||
|
Update the animation
|
||||||
|
|
||||||
|
- Adjust the searchingIcons array to resemble a spinning dial
|
||||||
|
- Adjust the animation loop so the animation shows a numeric countdown from two to zero (2.., 1.., 0..)
|
||||||
|
|
||||||
|
#### Starter code
|
||||||
|
|
||||||
|
The starter code project for this challenge 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. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter menu item selection or type "Exit" to exit the program
|
||||||
|
```
|
||||||
|
|
||||||
|
The application menu code reads the user's menu item selection and displays a
|
||||||
|
message echoing their selection
|
||||||
|
|
||||||
|
Case 1: "List all of our current pet information" displays the sample data for
|
||||||
|
all animals (two dogs and two cats)
|
||||||
|
|
||||||
|
Case 2: "2. Display all dogs with a specified characteristic" is the primary
|
||||||
|
area where new functionality code is added
|
||||||
|
|
||||||
|
- Under Case 2, the starter code identifies dogs and searches for a single
|
||||||
|
user input term
|
||||||
|
- Before you search each dog, the console shows a simple "animation" that
|
||||||
|
simulates a status for searching occurring
|
||||||
|
|
||||||
|
Your goal is to update the existing code to develop key features requested by
|
||||||
|
your team:
|
||||||
|
|
||||||
|
- Add dog multiple attribute search
|
||||||
|
- Update search animation
|
||||||
|
|
||||||
|
Use your development environment, and test your application at each stage of
|
||||||
|
your development process.
|
||||||
|
|
||||||
|
#### Setup
|
||||||
|
|
||||||
|
Download a
|
||||||
|
[zip](https://github.com/MicrosoftLearning/Challenge-project-Work-with-variable-data-in-CSharp/archive/refs/heads/main.zip)
|
||||||
|
file containing the code folders for the challenge project.
|
||||||
|
|
||||||
|
Build and run the file entering `dotnet run` in the terminal window.
|
||||||
|
|
||||||
|
The menu should display with two options. Enter `1` as shown in the following
|
||||||
|
terminal example:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
1. List all of our current pet information
|
||||||
|
2. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter your selection number (or type Exit to exit the program)
|
||||||
|
1
|
||||||
|
```
|
||||||
|
|
||||||
|
The sample data on the current pets should display followed by the message
|
||||||
|
`Press the Enter key to continue`
|
||||||
|
|
||||||
|
After pressing Enter, the menu should display again. Choose Option `2`, shown
|
||||||
|
in the following example:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
1. List all of our current pet information
|
||||||
|
2. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter your selection number (or type Exit to exit the program)
|
||||||
|
2
|
||||||
|
|
||||||
|
Enter one desired dog characteristic to search for
|
||||||
|
```
|
||||||
|
|
||||||
|
Enter "large" for the search term and press "Enter."
|
||||||
|
|
||||||
|
Notice the "searching" message as shown:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
searching our dog Nickname: gus for large ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Notice, the message runs before each search of a pet, and the periods
|
||||||
|
(`., .., ...`) at the end change in an animation. Run the search again if you
|
||||||
|
missed it.
|
||||||
|
|
||||||
|
Once the search ends, press enter to return to the menu. Then type "exit" and
|
||||||
|
press "Enter" to close the application.
|
||||||
|
|
||||||
|
Take a few minutes to become familiar with the Project.cs started code.
|
||||||
|
|
||||||
|
Focus on the areas that require updates, search and the animation.
|
||||||
|
|
||||||
|
Notice that there are some comments left in the code that indicate where to
|
||||||
|
place an update.
|
||||||
|
|
||||||
|
You're now ready to begin the Guided project exercises. Good luck!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Add multiple term search support
|
||||||
|
|
||||||
|
The Contoso Pets app helps find new homes for abandoned pets. The team wants
|
||||||
|
the search feature improved to let users enter multiple terms when searching
|
||||||
|
for dogs to adopt.
|
||||||
|
|
||||||
|
### Search specification
|
||||||
|
|
||||||
|
In this first challenge exercise, you need to update the single term search
|
||||||
|
feature to allow users to enter multiple search terms separated by commas.
|
||||||
|
|
||||||
|
#### Gather multiple search terms from the user
|
||||||
|
|
||||||
|
- Allow the user to enter multiple search terms when searching for dogs
|
||||||
|
- The user needs instructions to "enter the search terms separated by commas"
|
||||||
|
- Separate out individual search terms from the user entry string and store as
|
||||||
|
values in an array
|
||||||
|
- Sort the terms in the array in alphanumeric sort order
|
||||||
|
|
||||||
|
#### Identify dogs with descriptions with matches for one, or more, user search term
|
||||||
|
|
||||||
|
- As you identify a dog in the `animalsArray`, search for matches for each term
|
||||||
|
the user has entered
|
||||||
|
- For a term match, output a message with the dogs name and the term that is
|
||||||
|
matched
|
||||||
|
- example: `Our dog Jake is a match for your search for sheppard!`
|
||||||
|
- When all term searches complete for the current dog description:
|
||||||
|
- For one or more matches, output the nickname and description for the
|
||||||
|
current dog
|
||||||
|
- For one or more matches, track that there has been a match so you know not
|
||||||
|
to display an "no matches found for any available dogs" message (refer to the
|
||||||
|
next item)
|
||||||
|
- After **all** dog searches complete with no matches, display a message "No
|
||||||
|
matches found for any available dogs"
|
||||||
|
|
||||||
|
#### Enforce the following validation rules
|
||||||
|
|
||||||
|
- values can't be null
|
||||||
|
- values can't have zero characters
|
||||||
|
- any further restriction is up to the developer
|
||||||
|
|
||||||
|
#### Code comments
|
||||||
|
|
||||||
|
- Numbered code comments in the starter code offer suggestions
|
||||||
|
- The comments are in a sequential order and only the comments starting with #1, #2, and #3 apply to this exercise of the challenge
|
||||||
|
|
||||||
|
#### Sample output
|
||||||
|
|
||||||
|
Review the following animated image
|
||||||
|
|
||||||
|
Notice the temporary display of "`searching...`" followed by the current term
|
||||||
|
(example: "`searching...retriever`")
|
||||||
|
|
||||||
|
Notice the order the terms appear in search is now in alphanumeric
|
||||||
|
|
||||||
|
Notice the messages for matches persist (example:
|
||||||
|
"`Our dog lola is a chase match!`")
|
||||||
|
|
||||||
|
Review the sample output in the following section, "How to check your work", to further clarify how to implement features
|
||||||
|
|
||||||
|
### How to check your work
|
||||||
|
|
||||||
|
To validate that your code satisfies the specified requirements.
|
||||||
|
|
||||||
|
Build and run your app.
|
||||||
|
|
||||||
|
> Note
|
||||||
|
> You can exit the verification test before completing all of the verification
|
||||||
|
steps if see a result that does not satisfy the specification requirements. To
|
||||||
|
force an exit from the running program, in the Terminal panel, press Ctrl-C.
|
||||||
|
After exiting the running app, complete the edits that you believe will address
|
||||||
|
the issue you are working on, save your updates to the Program.cs file, and
|
||||||
|
then re-build and run your code.
|
||||||
|
|
||||||
|
The terminal command prompt should display as the starting point for the
|
||||||
|
program
|
||||||
|
|
||||||
|
At the command prompt, enter 2 menu:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
1. List all of our current pet information
|
||||||
|
2. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter your selection number (or type Exit to exit the program)
|
||||||
|
2
|
||||||
|
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
```
|
||||||
|
|
||||||
|
At the command prompt, enter large, cream, golden to test when more than one
|
||||||
|
search term matches the dog descriptions. Verify that the Terminal panel
|
||||||
|
updates with a message similar to the code output sample:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
large, cream, golden
|
||||||
|
|
||||||
|
Our dog Nickname: lola matches your search for cream
|
||||||
|
Our dog Nickname: lola matches your search for golden
|
||||||
|
Nickname: lola (ID #: d1)
|
||||||
|
Physical description: medium sized cream colored female golden retriever weighing about 45 pounds. housebroken.
|
||||||
|
Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.
|
||||||
|
|
||||||
|
Our dog Nickname: gus matches your search for golden
|
||||||
|
Our dog Nickname: gus matches your search for large
|
||||||
|
Nickname: gus (ID #: d2)
|
||||||
|
Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken.
|
||||||
|
Personality: 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.
|
||||||
|
|
||||||
|
Press the Enter key to continue
|
||||||
|
```
|
||||||
|
|
||||||
|
At the command prompt, press the enter key to continue to the main menu
|
||||||
|
|
||||||
|
At the command prompt, enter 2 menu:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
1. List all of our current pet information
|
||||||
|
2. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter your selection number (or type Exit to exit the program)
|
||||||
|
2
|
||||||
|
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
```
|
||||||
|
|
||||||
|
At the command prompt, enter big, grey, stripes to test when none of the search
|
||||||
|
terms match dog descriptions. Verify that the Terminal panel updates with a
|
||||||
|
message similar to the code output samples:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
big, grey, stripes
|
||||||
|
|
||||||
|
None of our dogs are a match for: big, grey, stripes
|
||||||
|
|
||||||
|
|
||||||
|
Press the Enter key to continue
|
||||||
|
```
|
||||||
|
|
||||||
|
If you specified further restrictions for valid entries, run the appropriate
|
||||||
|
test cases to verify your work.
|
||||||
|
|
||||||
|
> Note
|
||||||
|
> If your code meets the requirements you should be able to complete each step
|
||||||
|
in order and see the expected results in a single test pass. If you added
|
||||||
|
additional restrictions, you may need to exit the application and then run a
|
||||||
|
separate test pass to complete your verification.
|
||||||
|
|
||||||
|
Congratulations if you succeeded in this challenge exercise!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exercise
|
||||||
|
|
||||||
|
### Add improved search animation
|
||||||
|
|
||||||
|
The Contoso Pets app helps find new homes for abandoned pets. Part of the
|
||||||
|
request for search feature improvement is to update the animated simulation
|
||||||
|
indicating search progress.
|
||||||
|
|
||||||
|
#### Search animation specification
|
||||||
|
|
||||||
|
In this second challenge exercise, you need to update the search animation to
|
||||||
|
resemble spinning and add a count down (2, 1, 0).
|
||||||
|
|
||||||
|
#### Change the current "searching" animation icons
|
||||||
|
|
||||||
|
Update the current animation "icons"
|
||||||
|
`string[] searchingIcons = {". ", ".. ", "..."};`
|
||||||
|
|
||||||
|
Use new icons that simulate spinning
|
||||||
|
|
||||||
|
You can design the "searching" animation to display "spinning" to work
|
||||||
|
differently than displayed in the animated image
|
||||||
|
|
||||||
|
The "searching..." animation, should continue to be overwritten, after each
|
||||||
|
animation completes so it stays on the same line, and so that it doesn't
|
||||||
|
display after the animation stops.
|
||||||
|
|
||||||
|
#### Add a countdown to the "searching" animation
|
||||||
|
|
||||||
|
Review the previous animated image - note the countdown in the output
|
||||||
|
"`searching...retriever / 2`"
|
||||||
|
The previous number "`2`" displays as "`1`", and finally as "`0`", counting down
|
||||||
|
Update the loop that contains the "searching" animation so that the loop can
|
||||||
|
display a countdown
|
||||||
|
|
||||||
|
##### Code comments
|
||||||
|
|
||||||
|
- Numbered code comments in the starter code offer suggestions
|
||||||
|
- The comments are in a sequential order and only the comments starting with #4, and #5 apply to this exercise of the challenge
|
||||||
|
|
||||||
|
#### How to check your work
|
||||||
|
|
||||||
|
To validate that your code satisfies the specified requirements, complete the
|
||||||
|
instruction steps:
|
||||||
|
|
||||||
|
Build and run your app.
|
||||||
|
|
||||||
|
> Note
|
||||||
|
> You can exit the verification test before completing all of the verification
|
||||||
|
steps if see a result that does not satisfy the specification requirements. To
|
||||||
|
force an exit from the running program, in the Terminal panel, press Ctrl-C.
|
||||||
|
After exiting the running app, complete the edits that you believe will address
|
||||||
|
the issue you are working on, save your updates to the Program.cs file, and
|
||||||
|
then re-build and run your code.
|
||||||
|
|
||||||
|
The terminal command prompt should display as the starting point for the
|
||||||
|
program
|
||||||
|
|
||||||
|
At the command prompt, enter 2 menu:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
1. List all of our current pet information
|
||||||
|
2. Display all dogs with a specified characteristic
|
||||||
|
|
||||||
|
Enter your selection number (or type Exit to exit the program)
|
||||||
|
2
|
||||||
|
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
```
|
||||||
|
|
||||||
|
At the command prompt, enter **golden, big** and press enter to test the search
|
||||||
|
status messages with animation and countdown
|
||||||
|
|
||||||
|
Verify that the console panel updates with temporary "searching" status
|
||||||
|
messages similar to the code output samples:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Enter dog characteristics to search for separated by commas
|
||||||
|
golden, big
|
||||||
|
|
||||||
|
searching our dog Nickname: lola for big / 2
|
||||||
|
```
|
||||||
|
|
||||||
|
```txt
|
||||||
|
searching our dog Nickname: lola for big -- 1
|
||||||
|
```
|
||||||
|
|
||||||
|
```txt
|
||||||
|
searching our dog Nickname: lola for golden \ 1
|
||||||
|
```
|
||||||
|
|
||||||
|
```txt
|
||||||
|
searching our dog Nickname: lola for golden * 0
|
||||||
|
```
|
||||||
|
|
||||||
|
All the user entered search terms should display with the "`searching`" spin
|
||||||
|
animation and countdown for each dog where the "searching our dog..." line in
|
||||||
|
the output overwrites the previous line to create an animation
|
||||||
|
|
||||||
|
Refer to the previous animated image of the running program for more examples
|
||||||
|
of the "searching" status animation with countdown
|
||||||
|
|
||||||
|
Validate after the searching has stopped, the "`searching`" animation and
|
||||||
|
countdown no longer displays
|
||||||
|
|
||||||
|
> Note
|
||||||
|
> If your code meets the requirements you should be able to complete each step
|
||||||
|
in order and see the expected results in a single test pass.
|
||||||
|
|
||||||
|
Congratulations if you succeeded in this exercise challenge!
|
||||||
|
|
||||||
|
- [Challenge](./Challenge-Variable_data/Own/Program.cs)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
Your challenge was to update an application to support multiple term search and
|
||||||
|
to improve the "search status" information animation.
|
||||||
|
|
||||||
|
In this module, you developed code that combines:
|
||||||
|
|
||||||
|
- Iterate using data input.
|
||||||
|
- Process data.
|
||||||
|
- Format data output.
|
||||||
|
- Choose the correct data types and safely convert data types.
|
||||||
|
- Create and manipulate string arrays, and sort array data.
|
||||||
|
- Modify and build complex strings from multiple data sources, and format data
|
||||||
|
for display.
|
||||||
|
|
||||||
|
You delivered functionality to your Contoso pet app team, including:
|
||||||
|
|
||||||
|
- Gather the pet characteristics for multiple search term inputs.
|
||||||
|
- Store search input terms in a sorted array.
|
||||||
|
- Display the dogs that have a term match.
|
||||||
|
- Provide an improved search status animation with a countdown.
|
@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
@ -0,0 +1,207 @@
|
|||||||
|
// Final
|
||||||
|
|
||||||
|
// ourAnimals array will store the following:
|
||||||
|
string animalSpecies = "";
|
||||||
|
string animalID = "";
|
||||||
|
string animalAge = "";
|
||||||
|
string animalPhysicalDescription = "";
|
||||||
|
string animalPersonalityDescription = "";
|
||||||
|
string animalNickname = "";
|
||||||
|
string suggestedDonation = "";
|
||||||
|
|
||||||
|
// variables that support data entry
|
||||||
|
int maxPets = 8;
|
||||||
|
string? readResult;
|
||||||
|
string menuSelection = "";
|
||||||
|
decimal decimalDonation = 0.00m;
|
||||||
|
|
||||||
|
// array used to store runtime data
|
||||||
|
string[,] ourAnimals = new string[maxPets, 7];
|
||||||
|
|
||||||
|
// sample data 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 45 pounds. housebroken.";
|
||||||
|
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
|
||||||
|
animalNickname = "lola";
|
||||||
|
suggestedDonation = "85.00";
|
||||||
|
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 = "gus";
|
||||||
|
suggestedDonation = "49.99";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
animalSpecies = "cat";
|
||||||
|
animalID = "c3";
|
||||||
|
animalAge = "1";
|
||||||
|
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
|
||||||
|
animalPersonalityDescription = "friendly";
|
||||||
|
animalNickname = "snow";
|
||||||
|
suggestedDonation = "40.00";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
animalSpecies = "cat";
|
||||||
|
animalID = "c4";
|
||||||
|
animalAge = "";
|
||||||
|
animalPhysicalDescription = "";
|
||||||
|
animalPersonalityDescription = "";
|
||||||
|
animalNickname = "lion";
|
||||||
|
suggestedDonation = "";
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
animalSpecies = "";
|
||||||
|
animalID = "";
|
||||||
|
animalAge = "";
|
||||||
|
animalPhysicalDescription = "";
|
||||||
|
animalPersonalityDescription = "";
|
||||||
|
animalNickname = "";
|
||||||
|
suggestedDonation = "";
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (!decimal.TryParse(suggestedDonation, out decimalDonation)) {
|
||||||
|
decimalDonation = 45.00m; // if suggestedDonation NOT a number, default to 45.00
|
||||||
|
}
|
||||||
|
ourAnimals[i, 6] = $"Suggested Donation: {decimalDonation:C2}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// top-level menu options
|
||||||
|
do {
|
||||||
|
// NOTE: the Console.Clear method is throwing an exception in debug sessions
|
||||||
|
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. 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch-case to process the selected menu option
|
||||||
|
switch (menuSelection) {
|
||||||
|
case "1":
|
||||||
|
// list all pet info
|
||||||
|
for (int i = 0; i < maxPets; i++) {
|
||||||
|
if (ourAnimals[i, 0] != "ID #: ") {
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
for (int j = 0; j < 7; j++) {
|
||||||
|
Console.WriteLine(ourAnimals[i, j].ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\r\nPress the Enter key to continue");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2":
|
||||||
|
// #1 Display all dogs with a multiple search characteristics
|
||||||
|
|
||||||
|
string dogCharacteristics = "";
|
||||||
|
|
||||||
|
while (dogCharacteristics == "") {
|
||||||
|
// #2 have user enter multiple comma separated characteristics to search for
|
||||||
|
Console.WriteLine($"\nEnter dog characteristics to search for separated by commas");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
|
||||||
|
if (readResult != null) {
|
||||||
|
dogCharacteristics = readResult.ToLower();
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] dogSearches = dogCharacteristics.Split(",");
|
||||||
|
// trim leading and trailing spaces from each search term
|
||||||
|
for (int i = 0; i < dogSearches.Length; i++) {
|
||||||
|
dogSearches[i] = dogSearches[i].Trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.Sort(dogSearches);
|
||||||
|
// #4 update to "rotating" animation with countdown
|
||||||
|
string[] searchingIcons = { " |", " /", "--", " \\", " *" };
|
||||||
|
|
||||||
|
bool matchesAnyDog = false;
|
||||||
|
string dogDescription = "";
|
||||||
|
|
||||||
|
// loops through the ourAnimals array to search for matching animals
|
||||||
|
for (int i = 0; i < maxPets; i++) {
|
||||||
|
if (ourAnimals[i, 1].Contains("dog")) {
|
||||||
|
|
||||||
|
// Search combined descriptions and report results
|
||||||
|
dogDescription = ourAnimals[i, 4] + "\n" + ourAnimals[i, 5];
|
||||||
|
bool matchesCurrentDog = false;
|
||||||
|
|
||||||
|
foreach (string term in dogSearches) {
|
||||||
|
// only search if there is a term to search for
|
||||||
|
if (term != null && term.Trim() != "") {
|
||||||
|
for (int j = 2; j > -1; j--) {
|
||||||
|
// #5 update "searching" message to show countdown
|
||||||
|
foreach (string icon in searchingIcons) {
|
||||||
|
Console.Write($"\rsearching our dog {ourAnimals[i, 3]} for {term.Trim()} {icon} {j.ToString()}");
|
||||||
|
Thread.Sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.Write($"\r{new String(' ', Console.BufferWidth)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// #3a iterate submitted characteristic terms and search description for each term
|
||||||
|
if (dogDescription.Contains(" " + term.Trim() + " ")) {
|
||||||
|
// #3b update message to reflect current search term match
|
||||||
|
|
||||||
|
Console.WriteLine($"\rOur dog {ourAnimals[i, 3]} matches your search for {term.Trim()}");
|
||||||
|
|
||||||
|
matchesCurrentDog = true;
|
||||||
|
matchesAnyDog = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// #3d if the current dog is match, display the dog's info
|
||||||
|
if (matchesCurrentDog) {
|
||||||
|
Console.WriteLine($"\r{ourAnimals[i, 3]} ({ourAnimals[i, 0]})\n{dogDescription}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matchesAnyDog) {
|
||||||
|
Console.WriteLine("None of our dogs are a match found for: " + dogCharacteristics);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\n\rPress the Enter key to continue");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (menuSelection != "exit");
|
21
026_Challenge_variabe_data/Challenge-Variable_data/LICENSE
Normal file
21
026_Challenge_variabe_data/Challenge-Variable_data/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Microsoft Learning
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
@ -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>
|
@ -0,0 +1,434 @@
|
|||||||
|
const int max_pets = 8;
|
||||||
|
bool exit = false;
|
||||||
|
string? selection;
|
||||||
|
const string WIP = "Under Construction - please check " +
|
||||||
|
"back next month to see progress.";
|
||||||
|
const string separator = "+-------------------------------------" +
|
||||||
|
"----------------------------------------+";
|
||||||
|
const string main_menu = $@"{separator}
|
||||||
|
Welcome to the Contoso PetFriends app. Your main menu options are:
|
||||||
|
{separator}
|
||||||
|
|
||||||
|
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 animal's age.
|
||||||
|
6. Edit an animal's personality description.
|
||||||
|
7. Display all cats with a specified characteristics.
|
||||||
|
8. Display all dogs with a specified characteristics.
|
||||||
|
|
||||||
|
Enter menu item selection or type 'Exit' to exit the program
|
||||||
|
{separator}";
|
||||||
|
string[] description = {
|
||||||
|
"big sized female golden colored weighing 20 pounds. housebroken.",
|
||||||
|
"large dark-brown male siver back weighing 15 pounds. housebroken.",
|
||||||
|
"small white female weighing about 8 pounds. translucid.",
|
||||||
|
"medium size male. fluorescent at night.",
|
||||||
|
"medium size weighing 4 punds, orange with black lines.",
|
||||||
|
};
|
||||||
|
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.",
|
||||||
|
"mad but cute",
|
||||||
|
"loves to play with a rope",
|
||||||
|
};
|
||||||
|
string[] options = { "1", "2", "3", "4", "5", "6", "7", "8", "exit" };
|
||||||
|
string[] nickname = { "lola", "loki", "fuzz", "boby", "gogo", "besti" };
|
||||||
|
string[] species = { "cat", "dog", "bee", "pig", "fly", "cat", "cat" };
|
||||||
|
string[] abcd = { "a", "b", "c", "d" };
|
||||||
|
string[] icons = { "", "", "" };
|
||||||
|
decimal[] donations = { 85.00M, 49.99M, 40.00M, 45.00M };
|
||||||
|
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8 };
|
||||||
|
string[,] our_animals = new string[max_pets, 7];
|
||||||
|
Random rand = new Random();
|
||||||
|
|
||||||
|
var clear = Console.Clear;
|
||||||
|
|
||||||
|
void print(string text, bool new_line = true) {
|
||||||
|
if (new_line) {
|
||||||
|
Console.WriteLine(text);
|
||||||
|
} else {
|
||||||
|
Console.Write(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
decimal rand_dec(decimal[] choices) {
|
||||||
|
int indx = rand.Next(choices.Length);
|
||||||
|
return choices[indx];
|
||||||
|
}
|
||||||
|
|
||||||
|
string get_uniq_id(string[,] animals) {
|
||||||
|
for (int i = 0; i < max_pets - 4; i++) {
|
||||||
|
bool uniq_id = false;
|
||||||
|
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(animals[j, 1]) && animals[j, 1] == id) {
|
||||||
|
uniq_id = false;
|
||||||
|
check = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (check) {
|
||||||
|
uniq_id = true;
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "?";
|
||||||
|
}
|
||||||
|
|
||||||
|
void populate_animals_array() {
|
||||||
|
for (int i = 0; i < max_pets - 4; i++) {
|
||||||
|
our_animals[i, 0] = rand_str(species);
|
||||||
|
our_animals[i, 1] = get_uniq_id(our_animals);
|
||||||
|
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);
|
||||||
|
our_animals[i, 6] = $"{rand_dec(donations):C2}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void press_enter(string msg = "\n\tPress 'Enter' to continue") {
|
||||||
|
print(msg, false);
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_pets(string[,] animals) {
|
||||||
|
clear();
|
||||||
|
int outher_length = animals.GetLength(0);
|
||||||
|
int inner_length = animals.GetLength(1);
|
||||||
|
print(separator);
|
||||||
|
for (int j = 0; j < outher_length; j++) {
|
||||||
|
string[] animal = new string[inner_length];
|
||||||
|
for (int k = 0; k < animals.GetLength(1); k++) {
|
||||||
|
animal[k] = animals[j, k];
|
||||||
|
}
|
||||||
|
print_pet(animal);
|
||||||
|
}
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_pet(string[] pet) {
|
||||||
|
if (!string.IsNullOrEmpty(pet[1])) {
|
||||||
|
string id = pet[1];
|
||||||
|
string name = pet[5];
|
||||||
|
string specie = pet[0];
|
||||||
|
int age = Int32.Parse(pet[3].ToString());
|
||||||
|
string year_word = age > 1 ? "years" : "year";
|
||||||
|
string desc = pet[2];
|
||||||
|
string perso = pet[4];
|
||||||
|
string donation = pet[6];
|
||||||
|
print($@" ID: {id} SPECIE: {specie}
|
||||||
|
NAME: {name} AGE: {age} {year_word}
|
||||||
|
DESCRIPTION: {desc}
|
||||||
|
PERSONALITY: {perso}
|
||||||
|
SUGGESTED DONATION: {donation}
|
||||||
|
{separator}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int availability(string[,] animals) {
|
||||||
|
int pet_count = 0;
|
||||||
|
for (int j = 0; j < animals.GetLength(0); j++) {
|
||||||
|
if (!string.IsNullOrEmpty(animals[j, 1])) {
|
||||||
|
pet_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int slots = max_pets - pet_count;
|
||||||
|
return slots;
|
||||||
|
}
|
||||||
|
|
||||||
|
string get_input(string text = "Please enter your text: ",
|
||||||
|
bool is_integer = false,
|
||||||
|
bool is_money = false,
|
||||||
|
string[]? opts = null) {
|
||||||
|
bool invalid = true;
|
||||||
|
while (invalid) {
|
||||||
|
print(text, false);
|
||||||
|
string? usr_in = Console.ReadLine();
|
||||||
|
if (!string.IsNullOrEmpty(usr_in) && usr_in.Trim() != "") {
|
||||||
|
string resp = usr_in.Trim();
|
||||||
|
if (is_integer) {
|
||||||
|
int temp_int;
|
||||||
|
if (int.TryParse(resp, out temp_int)) {
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
} else if (is_money) {
|
||||||
|
decimal temp_dec;
|
||||||
|
if (decimal.TryParse(resp, out temp_dec)) {
|
||||||
|
resp = $"{temp_dec:C2}";
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
} else if (opts != null) {
|
||||||
|
resp = resp.ToLower();
|
||||||
|
if (opts.Contains(resp)) {
|
||||||
|
return resp;
|
||||||
|
} else {
|
||||||
|
print($"Please enter a valid option (", false);
|
||||||
|
foreach (string opt in opts) {
|
||||||
|
print($" {opt} ", false);
|
||||||
|
}
|
||||||
|
print(")");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "?";
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_new_pet(string[,] animals, int slots) {
|
||||||
|
int at_indx = max_pets - slots;
|
||||||
|
string id = $"{rand_str(abcd)}{rand_int(nums)}";
|
||||||
|
string specie = get_input("Enter pet specie: ", false, false, species);
|
||||||
|
string name = get_input("Enter the pet name (? if unknown): ");
|
||||||
|
int age = Int32.Parse(get_input("Enter pet age (-1 if unknown): ", true));
|
||||||
|
string donation = get_input("Enter suggested donation: ", false, true);
|
||||||
|
string desc = get_input("Enter the physical description (? if unknown): ");
|
||||||
|
string perso = get_input("Enter pet personality (? if unknown): ");
|
||||||
|
animals[at_indx, 0] = specie;
|
||||||
|
animals[at_indx, 1] = id;
|
||||||
|
animals[at_indx, 2] = desc;
|
||||||
|
animals[at_indx, 3] = age.ToString();
|
||||||
|
animals[at_indx, 4] = perso;
|
||||||
|
animals[at_indx, 5] = name;
|
||||||
|
animals[at_indx, 6] = donation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ask_new_pet() {
|
||||||
|
clear();
|
||||||
|
print("Assign values to the ourAnimals array fields");
|
||||||
|
print(separator);
|
||||||
|
int slots = availability(our_animals);
|
||||||
|
print($"\nWe currently have {max_pets - slots} pets that need homes.");
|
||||||
|
print($"We can manage {slots} more.");
|
||||||
|
if (slots > 0) {
|
||||||
|
bool another = false;
|
||||||
|
do {
|
||||||
|
string resp = get_input(
|
||||||
|
"Do you want to enter info for another pet?: "
|
||||||
|
);
|
||||||
|
bool invalid = true;
|
||||||
|
if (resp != "") {
|
||||||
|
while (invalid) {
|
||||||
|
switch (resp) {
|
||||||
|
case "y" or "yes":
|
||||||
|
add_new_pet(our_animals, slots);
|
||||||
|
resp = "";
|
||||||
|
invalid = false;
|
||||||
|
another = true;
|
||||||
|
break;
|
||||||
|
case "n" or "no":
|
||||||
|
invalid = false;
|
||||||
|
another = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
resp = get_input("Please enter [Y]es or [N]o: ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slots = availability(our_animals);
|
||||||
|
} while (another && slots > 0);
|
||||||
|
if (slots == 0) {
|
||||||
|
print("We have reached our limit on the number of pets that we can manage.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_age_and_desc(string[,] animals) {
|
||||||
|
clear();
|
||||||
|
print("\nEnsure animal ages and physical descriptions are complete");
|
||||||
|
int pet_count = max_pets - (availability(animals));
|
||||||
|
for (int j = 0; j < pet_count; j++) {
|
||||||
|
if (animals[j, 3] == "-1") {
|
||||||
|
print("\n" + separator);
|
||||||
|
string[] animal = {
|
||||||
|
animals[j,0], animals[j,1], animals[j,2],
|
||||||
|
animals[j,3], animals[j,4], animals[j,5]
|
||||||
|
};
|
||||||
|
print_pet(animal);
|
||||||
|
int age = Int32.Parse(
|
||||||
|
get_input(
|
||||||
|
$"Enter an age for ID: {animals[j, 1]}" +
|
||||||
|
" (-1 if unknown): ", true
|
||||||
|
)
|
||||||
|
);
|
||||||
|
animals[j, 3] = age.ToString();
|
||||||
|
}
|
||||||
|
if (animals[j, 2] == "?") {
|
||||||
|
print("\n" + separator);
|
||||||
|
string[] animal = {
|
||||||
|
animals[j,0], animals[j,1], animals[j,2],
|
||||||
|
animals[j,3], animals[j,4], animals[j,5]
|
||||||
|
};
|
||||||
|
print_pet(animal);
|
||||||
|
string desc = get_input(
|
||||||
|
$"Enter a physical description for ID: {animals[j, 1]}" +
|
||||||
|
" (? if unknown): "
|
||||||
|
);
|
||||||
|
animals[j, 2] = desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void check_nick_and_perso(string[,] animals) {
|
||||||
|
clear();
|
||||||
|
print("Ensure animal nicknames and personality descriptions are complete");
|
||||||
|
print(separator);
|
||||||
|
int pet_count = max_pets - (availability(animals));
|
||||||
|
for (int j = 0; j < pet_count; j++) {
|
||||||
|
if (animals[j, 5] == "?") {
|
||||||
|
print("\n" + separator);
|
||||||
|
string[] animal = {
|
||||||
|
animals[j,0], animals[j,1], animals[j,2],
|
||||||
|
animals[j,3], animals[j,4], animals[j,5]
|
||||||
|
};
|
||||||
|
print_pet(animal);
|
||||||
|
string nick = get_input(
|
||||||
|
$"Enter a nickname for ID: {animals[j, 1]}" +
|
||||||
|
"(? if unknown): "
|
||||||
|
);
|
||||||
|
animals[j, 5] = nick;
|
||||||
|
}
|
||||||
|
if (animals[j, 4] == "?") {
|
||||||
|
print("\n" + separator);
|
||||||
|
string[] animal = {
|
||||||
|
animals[j,0], animals[j,1], animals[j,2],
|
||||||
|
animals[j,3], animals[j,4], animals[j,5]
|
||||||
|
};
|
||||||
|
print_pet(animal);
|
||||||
|
string perso = get_input(
|
||||||
|
$"Enter a personality description for ID: {animals[j, 1]}" +
|
||||||
|
"(? if unknown): "
|
||||||
|
);
|
||||||
|
animals[j, 4] = perso;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool search(string specie, string detail, string[,] animals) {
|
||||||
|
bool found = false;
|
||||||
|
for (int j = 0; j < animals.GetLength(0); j++) {
|
||||||
|
if (!string.IsNullOrEmpty(animals[j, 1])) {
|
||||||
|
if (animals[j, 0] == specie) {
|
||||||
|
for (int i=2; i>-1; i--) {
|
||||||
|
foreach (string icon in icons){
|
||||||
|
print(
|
||||||
|
$"\rsearching our {specie} {animals[j, 5]}" +
|
||||||
|
$" for {detail.Trim()} {icon} {i.ToString()}",
|
||||||
|
false
|
||||||
|
);
|
||||||
|
Thread.Sleep(200);
|
||||||
|
}
|
||||||
|
print($"\r{new String(' ', Console.BufferWidth)}", false);
|
||||||
|
}
|
||||||
|
string description = " " + animals[j, 2] +
|
||||||
|
"\n " + animals[j, 4];
|
||||||
|
if (description.Contains(detail)) {
|
||||||
|
found = true;
|
||||||
|
print($"\r{separator}");
|
||||||
|
print($"Our {specie} {animals[j, 5]} is a match!");
|
||||||
|
print($"{description}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
void search_specie_by_desc(string specie, string[,] animals) {
|
||||||
|
clear();
|
||||||
|
bool found = false;
|
||||||
|
string detail = get_input(
|
||||||
|
$"Enter {specie} characteristics to search for separated by commas: "
|
||||||
|
);
|
||||||
|
if (detail.IndexOf(',') >= 0) {
|
||||||
|
string[] details = detail.Split(',');
|
||||||
|
foreach (string characteristic in details) {
|
||||||
|
found = search(specie, characteristic.Trim(), animals);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
found = search(specie, detail, animals);
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
print($"None of our {specie}s are a match found for: {detail}");
|
||||||
|
}
|
||||||
|
print(separator);
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
populate_animals_array();
|
||||||
|
|
||||||
|
while (!exit) {
|
||||||
|
clear();
|
||||||
|
print(main_menu);
|
||||||
|
print(" >_", false);
|
||||||
|
selection = Console.ReadLine();
|
||||||
|
if (selection != null && options.Contains(selection.ToLower())) {
|
||||||
|
selection = selection.ToLower();
|
||||||
|
switch (selection) {
|
||||||
|
case "1":
|
||||||
|
print_pets(our_animals);
|
||||||
|
break;
|
||||||
|
case "2":
|
||||||
|
ask_new_pet();
|
||||||
|
break;
|
||||||
|
case "3":
|
||||||
|
check_age_and_desc(our_animals);
|
||||||
|
break;
|
||||||
|
case "4":
|
||||||
|
check_nick_and_perso(our_animals);
|
||||||
|
break;
|
||||||
|
case "5":
|
||||||
|
clear();
|
||||||
|
print(WIP);
|
||||||
|
press_enter();
|
||||||
|
break;
|
||||||
|
case "6":
|
||||||
|
clear();
|
||||||
|
print(WIP);
|
||||||
|
press_enter();
|
||||||
|
break;
|
||||||
|
case "7":
|
||||||
|
search_specie_by_desc("cat", our_animals);
|
||||||
|
break;
|
||||||
|
case "8":
|
||||||
|
search_specie_by_desc("dog", our_animals);
|
||||||
|
break;
|
||||||
|
case "exit":
|
||||||
|
print("\n\tClosing application\n");
|
||||||
|
exit = !exit;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
print("\n\tPlease read the instructions");
|
||||||
|
press_enter();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
print("\n\tPlease read the instructions");
|
||||||
|
press_enter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment.Exit(0);
|
@ -0,0 +1,188 @@
|
|||||||
|
// ourAnimals array will store the following:
|
||||||
|
string animalSpecies = "";
|
||||||
|
string animalID = "";
|
||||||
|
string animalAge = "";
|
||||||
|
string animalPhysicalDescription = "";
|
||||||
|
string animalPersonalityDescription = "";
|
||||||
|
string animalNickname = "";
|
||||||
|
string suggestedDonation = "";
|
||||||
|
|
||||||
|
// variables that support data entry
|
||||||
|
int maxPets = 8;
|
||||||
|
string? readResult;
|
||||||
|
string menuSelection = "";
|
||||||
|
decimal decimalDonation = 0.00m;
|
||||||
|
|
||||||
|
// array used to store runtime data
|
||||||
|
string[,] ourAnimals = new string[maxPets, 7];
|
||||||
|
|
||||||
|
// sample data 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 45 pounds. housebroken.";
|
||||||
|
animalPersonalityDescription = "loves to have her belly rubbed and likes to chase her tail. gives lots of kisses.";
|
||||||
|
animalNickname = "lola";
|
||||||
|
suggestedDonation = "85.00";
|
||||||
|
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 = "gus";
|
||||||
|
suggestedDonation = "49.99";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
animalSpecies = "cat";
|
||||||
|
animalID = "c3";
|
||||||
|
animalAge = "1";
|
||||||
|
animalPhysicalDescription = "small white female weighing about 8 pounds. litter box trained.";
|
||||||
|
animalPersonalityDescription = "friendly";
|
||||||
|
animalNickname = "snow";
|
||||||
|
suggestedDonation = "40.00";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
animalSpecies = "cat";
|
||||||
|
animalID = "c4";
|
||||||
|
animalAge = "";
|
||||||
|
animalPhysicalDescription = "";
|
||||||
|
animalPersonalityDescription = "";
|
||||||
|
animalNickname = "lion";
|
||||||
|
suggestedDonation = "";
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
animalSpecies = "";
|
||||||
|
animalID = "";
|
||||||
|
animalAge = "";
|
||||||
|
animalPhysicalDescription = "";
|
||||||
|
animalPersonalityDescription = "";
|
||||||
|
animalNickname = "";
|
||||||
|
suggestedDonation = "";
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (!decimal.TryParse(suggestedDonation, out decimalDonation)) {
|
||||||
|
decimalDonation = 45.00m; // if suggestedDonation NOT a number, default to 45.00
|
||||||
|
}
|
||||||
|
ourAnimals[i, 6] = $"Suggested Donation: {decimalDonation:C2}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// top-level menu options
|
||||||
|
do {
|
||||||
|
// NOTE: the Console.Clear method is throwing an exception in debug sessions
|
||||||
|
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. 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
// switch-case to process the selected menu option
|
||||||
|
switch (menuSelection) {
|
||||||
|
case "1":
|
||||||
|
// list all pet info
|
||||||
|
for (int i = 0; i < maxPets; i++) {
|
||||||
|
if (ourAnimals[i, 0] != "ID #: ") {
|
||||||
|
Console.WriteLine();
|
||||||
|
for (int j = 0; j < 7; j++) {
|
||||||
|
Console.WriteLine(ourAnimals[i, j].ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\r\nPress the Enter key to continue");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2":
|
||||||
|
// #1 Display all dogs with a multiple search characteristics
|
||||||
|
|
||||||
|
string dogCharacteristic = "";
|
||||||
|
|
||||||
|
while (dogCharacteristic == "") {
|
||||||
|
// #2 have user enter multiple comma separated characteristics to search for
|
||||||
|
Console.WriteLine($"\r\nEnter one desired dog characteristic to search for");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
if (readResult != null) {
|
||||||
|
dogCharacteristic = readResult.ToLower().Trim();
|
||||||
|
Console.WriteLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool noMatchesDog = true;
|
||||||
|
string dogDescription = "";
|
||||||
|
|
||||||
|
// #4 update to "rotating" animation with countdown
|
||||||
|
string[] searchingIcons = { ". ", ".. ", "..." };
|
||||||
|
|
||||||
|
// loop ourAnimals array to search for matching animals
|
||||||
|
for (int i = 0; i < maxPets; i++) {
|
||||||
|
|
||||||
|
if (ourAnimals[i, 1].Contains("dog")) {
|
||||||
|
|
||||||
|
// Search combined descriptions and report results
|
||||||
|
dogDescription = ourAnimals[i, 4] + "\r\n" + ourAnimals[i, 5];
|
||||||
|
|
||||||
|
for (int j = 5; j > -1; j--) {
|
||||||
|
// #5 update "searching" message to show countdown
|
||||||
|
foreach (string icon in searchingIcons) {
|
||||||
|
Console.Write($"\rsearching our dog {ourAnimals[i, 3]} for {dogCharacteristic} {icon}");
|
||||||
|
Thread.Sleep(250);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.Write($"\r{new String(' ', Console.BufferWidth)}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// #3a iterate submitted characteristic terms and search description for each term
|
||||||
|
|
||||||
|
if (dogDescription.Contains(dogCharacteristic)) {
|
||||||
|
// #3b update message to reflect term
|
||||||
|
// #3c set a flag "this dog" is a match
|
||||||
|
Console.WriteLine($"\nOur dog {ourAnimals[i, 3]} is a match!");
|
||||||
|
|
||||||
|
noMatchesDog = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// #3d if "this dog" is match write match message + dog description
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (noMatchesDog) {
|
||||||
|
Console.WriteLine("None of our dogs are a match found for: " + dogCharacteristic);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("\n\rPress the Enter key to continue");
|
||||||
|
readResult = Console.ReadLine();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (menuSelection != "exit");
|
@ -0,0 +1,10 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
@ -30,3 +30,4 @@ Following
|
|||||||
23. [Format alphanumeric data](./023_alphanumeric_data_format/023_csharp.md)
|
23. [Format alphanumeric data](./023_alphanumeric_data_format/023_csharp.md)
|
||||||
24. [String data type methods](./024_String_data_type_methods/024_csharp.md)
|
24. [String data type methods](./024_String_data_type_methods/024_csharp.md)
|
||||||
25. [Work with variable data](./025_Work_with_variable_data/025_csharp.md)
|
25. [Work with variable data](./025_Work_with_variable_data/025_csharp.md)
|
||||||
|
26. [Challenge - variable data](./026_Challenge_variabe_data/026_csharp.md)
|
||||||
|
Loading…
Reference in New Issue
Block a user