Convertissez Array en une méthode primative pour exprimer le même résultat, sans utiliser LINQ uniquement int.

mon programme enregistre le nombre de bouteilles collectées par quatre pièces dans un lecteur de bouteilles. Lorsque l’utilisateur saisit quitter, le nombre de bouteilles que chaque pièce a collectées est indiqué, ainsi que le nombre de bouteilles imprimées. J’ai utilisé un tableau pour garder une trace du numéro de la pièce. Comment peut changer une méthode de au lieu d’utiliser un tableau, je voudrais lancer room1, room2, room3, room4. Pourrai-je utiliser mes appels de tableau en boucle pour écrire des lignes si je n’utilise pas de tableau? Il y a les lignes que je veux dire.

int room = int.Parse(quit); Console.Write("Bottles collected in room {0}: ", room); // This line adds the count of bottles and records it so you can continuously count the bottles collected. rooms[room - 1] += int.Parse(Console.ReadLine()); 

Et cette ligne:

  }//Writes the bottles collected by the different rooms Console.WriteLine("Bottles collected in room {0} = {1}", i + 1, rooms[i]); 

Voici mon code:

  namespace BottleDrive { class Program { static void Main(ssortingng[] args) {//Initialize array of rooms to 4 int[] rooms = new int[4]; //Start of while loop to ask what room your adding into. while (true) { Console.Write("Enter the room you're in: "); //If user enters quit at anytime, the code will jump out of while statement and enter for loop below ssortingng quit = Console.ReadLine(); if (quit == "quit") //Break statement allows quit to jump out of loop break; //Variable room holds the number of bottles collect by each room. int room = int.Parse(quit); Console.Write("Bottles collected in room {0}: ", room); // This line adds the count of bottles and records it so you can continuously count the bottles collected. rooms[room - 1] += int.Parse(Console.ReadLine()); } int maxValue = 0;//initiates the winner, contructor starts at 0 int maxRoomNumber = 0;//initiates the room number that wins for (int i = 0; i  maxValue)//Makes sure that the maxValue is picked in the array {//Looking for room number for the maxValue = rooms[i]; maxRoomNumber = i + 1; }//Writes the bottles collected by the different rooms Console.WriteLine("Bottles collected in room {0} = {1}", i + 1, rooms[i]); } //Outputs winner Console.WriteLine("And the Winner is room " + maxRoomNumber + "!!!"); } } } 

Et merci, j’apprécie à quel point cette communauté m’a aidé à apprendre c sharp.

Vous ne pouvez pas remplacer facilement un tableau par des variables individuelles. Si vous avez une déclaration comme

 int room1 = 0, room2 = 0, room3 = 0, room4 = 0; 

et veulent accéder au numéro de chambre i alors vous devez écrire

 switch (i) { case 1: Console.WriteLine(room1); break; case 2: Console.WriteLine(room2); break; case 3: Console.WriteLine(room3); break; case 4: Console.WriteLine(room4); break; } 

Avec un tableau, vous pouvez simplement écrire

 Console.WriteLine(rooms[i]); 

Si vous voulez vraiment utiliser ce mode sans tableau, je vous suggère d’utiliser des méthodes d’assistance:

 private void SetRoom(int room, int value) { switch (room) { case 1: room1 = value; break; case 2: room2 = value; break; case 3: room3 = value; break; case 4: room4 = value; break; } } public int GetRoom(int room) { switch (room) { case 1: return room1; case 2: return room2; case 3: return room3; case 4: return room4; default: return 0; } } 

Vous devez déclarer les variables room1 à room4 en tant que membres du groupe pour que cela fonctionne.

Maintenant vous pouvez écrire:

 Console.WriteLine(GetRoom(i)); 

Ou au lieu de rooms[i] += n;

 SetRoom(i, GetRoom(i) + n); 

Vous pouvez le faire, mais ce serait un pas en arrière par rapport à une bonne programmation et à l’écriture de mauvais code.

Tout d’abord, cela encombrerait votre code, car vous deviez toujours faire quelque chose comme ceci:

 // this is the code you have now (3 lines for 4 rooms): int room = int.Parse(quit); Console.Write("Bottles collected in room {0}: ", room); rooms[room - 1] += int.Parse(Console.ReadLine()); // and this is the code you'll have when you refrain from using arrays // (17 lines for 2 rooms, ignoring empty lines and ones with only brackets): int room = int.Parse(quit); Console.Write("Bottles collected in room {0}: ", room); switch(room) { case 1: Console.WriteLine(room1); break; case 2: Console.WriteLine(room2); break; // other cases... } int count = int.Parse(Console.ReadLine()); switch(room) { case 1: room1 += count; break; case 2: room2 += count; break; // other cases... } 

Et deuxièmement (et bien plus important):

Le code est totalement non extensible. Si vous souhaitez append une cinquième pièce pour collecter les bouteilles, vous devez parcourir l’ensemble du programme et ajuster chaque instruction de commutateur, ce qui non seulement prend du temps, mais est également extrêmement sujet aux erreurs.

Voici un exemple qui utilise une classe pour stocker les informations pour chaque salle. La raison d’utiliser une classe est la suivante: si votre programme doit être modifié ultérieurement pour collecter plus d’informations, vous n’avez pas à suivre un autre tableau, vous pouvez simplement append des propriétés à la classe.

Les salles individuelles sont maintenant contenues dans une liste au lieu d’un tableau, juste pour afficher une construction différente.

Voici la nouvelle classe Room:

 public class Room { public int Number { get; set; } public int BottleCount { get; set; } public Room(int wNumber) { Number = wNumber; } } 

Et voici la nouvelle version du programme. Notez qu’une vérification supplémentaire des valeurs entrées par l’utilisateur final a été ajoutée afin d’empêcher les exceptions lors de la tentative d’obtention de la pièce en cours ou de l’parsing syntaxique d’un entier avec la valeur entrée par l’utilisateur:

  static void Main(ssortingng[] args) { const int MAX_ROOMS = 4; var cRooms = new System.Collections.Generic.List(); for (int nI = 0; nI < MAX_ROOMS; nI++) { // The room number is 1 to 4 cRooms.Add(new Room(nI + 1)); } // Initializes the room that wins //Start of while loop to ask what room your adding into. while (true) { Console.Write("Enter the room you're in: "); //If user enters quit at anytime, the code will jump out of while statement and enter for loop below string roomNumber = Console.ReadLine(); if (roomNumber == "quit") { //Break statement allows quit to jump out of loop break; } int room = 0; if (int.TryParse(roomNumber, out room) && (room < MAX_ROOMS) && (room >= 0)) { Room currentRoom; currentRoom = cRooms[room]; Console.Write("Bottles collected in room {0}: ", currentRoom.Number); int wBottleCount = 0; if (int.TryParse(Console.ReadLine(), out wBottleCount) && (wBottleCount >= 0)) { // This line adds the count of bottles and records it so you can continuously count the bottles collected. currentRoom.BottleCount += wBottleCount; } else { Console.WriteLine("Invalid bottle count; value must be greater than 0"); } } else { Console.WriteLine("Invalid room number; value must be between 1 and " + MAX_ROOMS.ToSsortingng()); } } Room maxRoom = null; foreach (Room currentRoom in cRooms) //This loop goes through the array of rooms (4) { // This assumes that the bottle count can never be decreased in a room if ((maxRoom == null) || (maxRoom.BottleCount < currentRoom.BottleCount)) { maxRoom = currentRoom; } Console.WriteLine("Bottles collected in room {0} = {1}", currentRoom.Number, currentRoom.BottleCount); } //Outputs winner Console.WriteLine("And the Winner is room " + maxRoom.Number + "!!!"); } 

Je pense que votre logique est bonne (utiliser une variable pour la valeur maximale et la pièce maximale et comparer chaque fois). Y avait-il une ressortingction quant à ne pas utiliser de tableaux? Il semblerait que l’utilisation de 4 variables nécessiterait plus de lignes de code.

J’aime la réponse en utilisant une classe. Mais vous pouvez très bien faire cela avec c standard avec un tableau.

Quelle est l’exigence? encapsulation? robustesse?