2017-12-03 1 views
0

Ich arbeite an einem einfachen Code, der nach dem Namen, Alter und Geschlecht von höchstens 5 Patienten fragt. Nach jedem Patienten sollte er aufgefordert werden, einen anderen Patienten einzugeben oder zum Hauptmenü zurückzukehren. Sobald 5 in ein Array eingegeben wurden, sollte eine Aufforderung an den Benutzer ausgegeben werden, dass das Array voll ist.So zeigen Sie an, dass ein Array voll ist

Mein Problem ist der Code fragt nach Name, Alter und Geschlecht 5 mal im Voraus, und gibt keine Angabe, dass das Array voll ist. Wie würde ich den Code ändern, um dies zu berücksichtigen und trotzdem die Eingaben zu speichern? (Code unten).


class MainClass 
{ 
    enum Gender { female, male } 
    struct Record 
    { 
     public string _Name; 
     public int _Age; 
     public Gender _Gender; 
    } 

    public static void Main(string[] args) 
    { 
     //title 
     Console.Write("\t\t\t\t\tPatient Records\n"); 
     string selection = ""; 
     Record[] patients = new Record[5]; 
     GetRecords(patients); 
     Console.Write("a. Add\n d.Display\ns. Stats\nq. Quit"); 
     Console.Write("Your selection: "); 
     selection = Console.ReadLine(); 
     switch (selection) 
     { 
      case "a": 
       GetRecords(patients); 
       break; 
      case "d": 
       break; 
      case "s": 
       Stats(patients); 
       break; 
      case "q": 
       //CUtility.Pause(); 
       break; 
     } 
    } 

    static void GetRecords(Record[] patient_rec) 
    { 
     for (int i = 0; i < patient_rec.Length; i++) 
     { 
      Console.Write("Enter your age: "); 
      int.TryParse(Console.ReadLine(), out patient_rec[i]._Age); 
      Console.Write("Enter your name: "); 
      patient_rec[i]._Name = Console.ReadLine(); 
      Console.Write("Enter your gender (female or male): "); 
      Gender.TryParse(Console.ReadLine(), out patient_rec[i]._Gender); 
     } 
    } 

    static void Stats(Record[]patient_rec) 
    { 

    } 
} 
+1

ich diese zu schließen bin stimmen, weil du dich nicht an, Sie wissen, warum es Sie fragt 5 mal zu aber du rufst die Methode 'GetRecords (Record [] patient_rec an dann hast du eine for-Schleife die Länge des Record [] was erwartest du ..? Ich empfehle dir dringend, den Debugger zu benutzen, Breakpoints zu setzen und Schritt durch den Code .. – MethodMan

+0

Sie rufen auch die 'GetRecords() erneut in der swit ch Statement .. das benötigt einige ernsthafte Umdenken/Debugging .. – MethodMan

+0

@MethodMan Wir müssen ein Array mit 5 Standorten erstellen, so dass Teil nicht geändert werden kann. Ist es möglich, die for-Schleife an einen anderen Ort zu verschieben, damit sie jedes Mal aktualisiert werden kann? –

Antwort

0

Sie wird Schleife nur auf die Größe des Arrays gehen gesetzt, so logisch könnten Sie eine Nachricht nach der Schleife zeigen (dies wird getroffen zu werden, wenn die Schleife beendet ist).

Wenn Sie wurden Ihre Array-Zugriff in einer while Schleife steuert dann vergleichen Sie einfach Ihre Indexer i auf die Länge des Arrays (patient_rec.Length), wenn er oder überschreitet ist die Länge dann die Meldung.

0

ich tun würde, es auf einfachere Art und Weise:

enum Gender { female, male } 
    struct Record 
    { 
     public string _Name; 
     public int _Age; 
     public Gender _Gender; 
    } 

    static void Main(string[] args) 
    { 
     //title 
     Console.Write("\t\t\t\t\tPatient Records\n"); 
     IList<Record> patients = GetRecords(5); 
     SchedulePatients(patients); 
    } 

    static void SchedulePatients(IList<Record> patients) 
    { 
     Console.Write("a. Add\n d.Display\ns. Stats\nq. Quit"); 
     Console.Write("Your selection: "); 
     string selection = Console.ReadLine(); 
     switch (selection) 
     { 
      case "a": 
       patients.Add(GetRecord()); 
       SchedulePatients(patients); 
       break; 
      case "d": 
       break; 
      case "s": 
       Stats(patients); 
       break; 
      case "q": 
       //CUtility.Pause(); 
       break; 
     } 
    } 

    static IList<Record> GetRecords(int amount) 
    { 
     IList<Record> patients = new List<Record>(); 

     for (int i = 0; i < amount; i++) 
     { 
      patients.Add(GetRecord()); 
     } 

     return patients; 
    } 

    static Record GetRecord() 
    { 
     Record patient = new Record(); 
     Console.Write("Enter your age: "); 
     int.TryParse(Console.ReadLine(), out patient._Age); 
     Console.Write("Enter your name: "); 
     patient._Name = Console.ReadLine(); 
     Console.Write("Enter your gender (female or male): "); 
     Enum.TryParse(Console.ReadLine(), out patient._Gender); 

     return patient; 
    } 

    static void Stats(IList<Record> patients) 
    { 
     foreach (var patient in patients) 
     { 
      Console.WriteLine(string.Concat("Name: ", patient._Name, " Age: ", patient._Age, " Gender: ", patient._Gender)); 
     } 
     Console.ReadLine(); 
    } 
} 
0

Wenn Sie die Anforderungen mit der kleinsten Änderung möglich treffen möchten, müssen Sie nur über den Benutzer auffordert, das Bit hinzuzufügen.

static void GetRecords(Record[] patient_rec) 
{ 
    for (int i = 0; i < patient_rec.Length; i++) 
    { 
     Console.Write("Enter your age: "); 
     int.TryParse(Console.ReadLine(), out patient_rec[i]._Age); 
     Console.Write("Enter your name: "); 
     patient_rec[i]._Name = Console.ReadLine(); 
     Console.Write("Enter your gender (female or male): "); 
     Gender.TryParse(Console.ReadLine(), out patient_rec[i]._Gender); 
     Console.Write("Enter another (Y/N)? "); 
     var s = Console.ReadLine(); 
     if (s.ToUpper() != "Y") return; 
    } 
    Console.WriteLine("You've entered the maximum number of records."); 
} 
+0

Das Problem nicht zu sehen. Was ist das Problem, Downvoter? –

1

Ich würde vorschlagen zu versuchen, Ihren Code ein wenig einfacher zu lesen - und robuster.

Try this:

static void GetRecords(Record[] patient_rec) 
{ 
    for (int i = 0; i < patient_rec.Length; i++) 
    { 
     Console.WriteLine("Record {0} of {1} entry", i + 1, patient_rec.Length); 
     patient_rec[i] = new Record() 
     { 
      _Age = AskInteger("Enter your age: "), 
      _Name = AskString("Enter your name: "), 
      _Gender = AskGender("Enter your gender (female or male): "), 
     }; 
     string ask = ""; 
     while (string.IsNullOrEmpty(ask) || (ask.ToLower()[0] != 'y' && ask.ToLower()[0] != 'n')) 
     { 
      Console.WriteLine("Continue? yes or no (then hit enter)"); 
      ask = Console.ReadLine(); 
     } 
     if (ask.ToLower()[0] == 'y') 
     { 
      continue; 
     } 
     break; 
    } 
    Console.WriteLine("Thank you. Input completed."); 
} 

Um diese Arbeit zu machen, müssen Sie diese drei Eingabefunktionen:

private static int AskInteger(string message) 
{ 
    int result; 
    Console.WriteLine(message); 
    string input = Console.ReadLine(); 
    while (!int.TryParse(input, out result)) 
    { 
     Console.WriteLine("Invalid input."); 
     Console.WriteLine(message); 
     input = Console.ReadLine(); 
    } 
    return result; 
} 

private static string AskString(string message) 
{ 
    Console.WriteLine(message); 
    string input = Console.ReadLine(); 
    while (string.IsNullOrWhiteSpace(input)) 
    { 
     Console.WriteLine("Invalid input."); 
     Console.WriteLine(message); 
     input = Console.ReadLine(); 
    } 
    return input; 
} 

private static Gender AskGender(string message) 
{ 
    Gender result; 
    Console.WriteLine(message); 
    string input = Console.ReadLine(); 
    while (!Gender.TryParse(input, out result)) 
    { 
     Console.WriteLine("Invalid input."); 
     Console.WriteLine(message); 
     input = Console.ReadLine(); 
    } 
    return result; 
} 
Verwandte Themen