2016-11-30 17 views
-2

私はこのプログラムで3時間働いていますが、どこが間違っているのかわかりません。本当にありがとうございます。問題は私がパスワードを入力しているときです。それは間違ったパスワードだと言います。正しいパスワードを入力しても、もう一度やり直すことはできません。ユーザーが間違ったパスワードを入力した場合、ユーザーは3回試すことができます3回目以降はプログラムを終了しなければなりません。どのようにユーザーがパスワードを3回C#で入力できるようにするには?

public partial class UserAndPin : Window 
{ 
    public UserAndPin() 
    { 
     InitializeComponent(); 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader("Customer.txt"); 

      short attempts = 0; 
      string line; 

      while ((line = sr.ReadLine()) != null) 
      { 
       string[] lineArray = line.Split(';'); 
       if (lineArray[0] == txtName.Text & lineArray[1] == pbPassword.Password) 
       { 
        MainWindow mainWindow = new MainWindow(); 
        this.Hide(); 
        mainWindow.ShowDialog(); 
        //return; 
       } 
       else 
       { 
        attempts++; 
        if (attempts < 3) 
        { 
         MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more");              
        } 
        if (attempts == 3) 
        { 
         MessageBox.Show("Please try again later"); 
         this.Close(); 
        }       
       }      
      } 
      sr.Close(); 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 

}

+2

デバッガの使い方を学んでください。 [小さなプログラムをデバッグする方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

+0

@Gurwinderもう少し私に何を教えてもらえますか? – Shahzada

+1

@Gurwinder '=='を使って文字列を比較すると何が問題になりますか? –

答えて

0
Dictionary<string, string> loginInfo; 
short attempts = 0; 

public UserAndPin() 
{ 
    InitializeComponent(); 

    // Load the file to the dictionary 
    loginInfo = File.ReadAllLines("Customer.txt") 
     .Select(i => i.Split(';')) // Lines format: Username;Password 
     .ToDictionary(i => i[0].ToLower(), i => i[1]); // Username is the key of the dictionary 

} 

private void btnOK_Click(object sender, RoutedEventArgs e) 
{  
    var userId = txtName.Text.ToLower(); // Username ignore case 
    var password = pbPassword.Password; 

    if (loginInfo.ContainsKey(userId) && loginInfo[userId] == password) 
    { 
     // login success, show main window 
     MainWindow mainWindow = new MainWindow(); 
     this.Hide(); 
     mainWindow.ShowDialog(); 
     return; 
    } 

    // login fail, increment the count only 
    attempt++; 

    if (attempts < 3) 
    { 
     MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more");              
    } 
    if (attempts == 3) 
    { 
     MessageBox.Show("Please try again later"); 
     this.Close(); 
    } 

} 
+1

「while」は意味をなさない。 – Kinetic

+0

@キネティックはいいいえ – Eric

1

あなたは、それはユーザーがあなたはこのようにボタンをクリックした1毎回により増加させることにしたいのに対し、あなたはボタンをクリックしbtnOK_Click毎回内部short attempts = 0;0するattemptsを開始します宣言しているので、あなたはファイル内の10のユーザー情報を持っている場合、それは追加したりしますので、whileループを下回るべきで

public partial class UserAndPin : Window 
{ 
    short attempts; 
    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

attempts++;のようにグローバルに宣言する必要があります条件が一致しないたびにattemptを増分します。

あなたが読んでいるファイルからのユーザ名とパスワードが一致しない場合。ユーザー情報が10番目の位置または行にある場合は明らかに一致しません。これは9回メッセージボックスを表示します。もう一つの問題は、それが&&ない&であり、それは正しい方法は

public partial class UserAndPin : Window 
{ 
    short attempts; 
    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader("Customer.txt"); 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       string[] lineArray = line.Split(';'); 
       if (lineArray[0] == txtName.Text && lineArray[1] == pbPassword.Password) 
       { 
        MainWindow mainWindow = new MainWindow(); 
        this.Hide(); 
        mainWindow.ShowDialog(); 
        //return; 
       } 
      } 
      sr.Close(); 

      if (attempts < 3) 
      { 
       MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more"); 
      } 
      else 
      { 
       MessageBox.Show("Please try again later"); 
       this.Close(); 
      } 
      attempts++; //Since user has attempted it. 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 
+1

whileの間に 'attempts'が増分されなければならないという問題はまだあります。 – Kinetic

+0

うん!! @キネティック。 catch –

+0

...ありがとうございました。また、 '試み'をチェックしている 'if'の両方の値は、' while'にあるべきではありません。しかしこれはかなり近いです。 – Kinetic

1

あなたは「試み」が正常にすべての認証をinitilize必要がありますする必要がありますので、一致するよりもLogical AND operatorです。または3時間で3回以上。

プロジェクトは、あなたがより3時間かけてログイン拒否した場合は、2回で成功してログインした場合、「試み」は0

する必要があり、「試み」も0

に設定する必要があります
+0

ここから3時間はどこですか? – Kinetic

1

まず、すべてのユーザー名とパスワードを取得するためにファイルを読む必要があります。理想的には、これはコンストラクタで1回だけ行います。

次に、カウンターを1つ増やす必要があります。このカウンターは、他の回答に記載されているようなクリックイベントハンドラーの外で宣言する必要があります。

最後に、入力したユーザー/パスワードがファイルと一致するかどうかを確認できます。そうであれば、フォームを開くことができます。そうでない場合は、ユーザーが3回目の試行に達したかどうかに応じてメッセージボックスの1つを表示します。

public partial class UserAndPin : Window 
{ 
    short attempts; 

    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      var users = File.ReadAllLines("Customer.txt") 
       .Select(line => new { login = line[0], password = line[1] }) 
       .ToList(); 

      attempts++; 

      if (users.Any(user => user.login == txtName.Text && user.password == pbPassword.Password)) 
      { 
       MainWindow mainWindow = new MainWindow(); 
       this.Hide(); 
       mainWindow.ShowDialog(); 
       return; 
      } 
      else 
      { 
       if (attempts < 3) 
       { 
        MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more"); 
       } 
       if (attempts >= 3) 
       { 
        MessageBox.Show("Please try again later"); 
        this.Close(); 
       } 
      } 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 
関連する問題