2017-09-14 2 views
2

J'ai besoin de coder un programme, qui change les deux dernières (ou seulement la dernière) lettre (s) du mot entré en raison de quelques règles grammaticales étranges de la langue lituanienne. Par exemple, je m'appelle Kazys. Je veux un code qui pourrait changer les deux dernières lettres (ys) à une autre lettre (y). Alors, quand une personne entréesModifier les dernières lettres des mots?

Kazys

La sortie serait

Bonjour, Kazy.

Si une personne entre Balys, le code devrait changer le nom en Baly et l'imprimer. Je suis juste un débutant en C#. Donc, je ne connais même pas certaines des fonctions de base. Toute aide est très appréciée !!

P.S. Pour ceux qui se demandent pourquoi j'ai besoin de cela, je peux vous dire que c'est une chose en grammaire lituanienne qui nécessite de changer la fin du mot si vous vous adressez à quelqu'un.

+0

Je pense qu'il est très simple, il vous suffit de savoir que les chaînes sont très semblables à des tableaux. Comment vous pouvez utiliser ce fait dans C# est ce que je ne sais pas et je ne suis pas intéressé par C# du tout. Mais à coup sûr, ce sera quelque chose d'aussi simple que d'écraser le dernier caractère ou de changer la longueur de la chaîne. Donc, mon conseil est, lisez tout ce que vous pouvez sur [Strings in C#] (https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/string /) –

+0

Je pense que vous devrez coder en dur tous les changements que vous voulez. Parcourez les mots d'entrée et trouvez les deux dernières lettres. Puis vérifiez s'ils doivent être changés ou non, procédez en conséquence. Ensuite, vérifiez à nouveau si des changements sont nécessaires dans la dernière lettre. Je ne parle pas la langue lituanienne, donc je ne suis pas sûr combien de telles règles sont là ou comment exactement ils fonctionnent – Ank

+0

@Ank s'il y a une règle, alors ce n'est pas seulement inutile mais aussi, une très mauvaise chose à faire. Spécialement si vous ne connaissez pas ou ne comprenez pas le coût de la recherche d'un tableau de chaînes (* niveau bas *) et ne pouvez pas penser à un algorithme plus rapide pour faire une telle chose. –

Répondre

0

Vous pouvez écrire une classe d'extension qui applique les règles stockées dans un dictionnaire assez facilement. Des règles complexes pourraient faire de Regex une meilleure option, mais si un simple remplacement de chaîne, un dictionnaire insensible à la casse pourrait être préférable d'éviter de vérifier chaque règle possible à chaque fois.

public static class LanguageExtensions 
{ 

    // Define case insentive dictionary 
    public static Dictionary<string, string> Rules = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) 
    { 
     // List rules here 
     { "ys", "y"}, 
    }; 

    public static string ApplyRules(this string input) 
    { 
     string suffix; 
     if (input != null && input.Length > 2 && Rules.TryGetValue(input.Substring(input.Length - 2, 2), out suffix)) 
      return input.Remove(input.Length - 2) + suffix; 
     else 
      return input; 
    } 
} 

Ensuite, il vous suffit d'appeler la méthode d'extension:

Console.WriteLine("Kazys".ApplyRules()); // "Kazy" 
0

Échantillon de travail minimal de ce que vous pourriez être après. Vous semblez avoir des exigences complexes à coder, mais ce sont les concepts de base pour remplacer les chaînes dans une chaîne.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace ChangeLastChar_46223845 
{ 
    public partial class Form1 : Form 
    { 
     TextBox txtbx_input = new TextBox(); 
     TextBox txtbx_result = new TextBox(); 
     Button btn = new Button(); 

     public Form1() 
     { 
      InitializeComponent(); 
      AddOurStuffToTheForm(); 

      PutDefaultWordInInputBox(); 
     } 

     private void PutDefaultWordInInputBox() 
     { 
      txtbx_input.Text = "Krazys"; 
     } 

     private void AddOurStuffToTheForm() 
     { 
      txtbx_input.Location = new Point(5, 5); 
      btn.Location = new Point(5, txtbx_input.Location.Y + txtbx_input.Height + 5); 
      txtbx_result.Location = new Point(5, btn.Location.Y + btn.Height + 5); 

      btn.Text = "Substring"; 
      btn.Click += Btn_Click; 

      this.Controls.Add(txtbx_input); 
      this.Controls.Add(btn); 
      this.Controls.Add(txtbx_result); 

     } 

     private void Btn_Click(object sender, EventArgs e) 
     { 
      if (string.IsNullOrEmpty(txtbx_input.Text) || string.IsNullOrWhiteSpace(txtbx_input.Text)) 
      { 
       return; 
      } 
      if (txtbx_input.Text.EndsWith("ys")) 
      { 
       txtbx_result.Text = "Hello " + txtbx_input.Text.Substring(0, txtbx_input.Text.Length - 1); 
      } 
     } 
    } 
} 
-1
public static class NameEditor 
{ 
    public static string EditName(string name) 
    { 
      return name.Remove(name.Length-1); 
    } 
} 

Cela supprime le dernier caractère du nom. J'espère que vous pourrez généraliser d'ici à vos règles spécifiques.

Pour utiliser:

string name="Kazys"; 
Console.WriteLine(NameEditor.EditName(name)); 
1

Personnellement, je pense que les règles linguistiques comme celle-ci sont pourquoi des expressions régulières existent. Il vous permet de créer facilement des règles avec des aperçus, des arrière-plans, etc., pour vous assurer que le mot n'est modifié que s'il correspond à une certaine structure. Pour exemple le cas, il devrait être aussi facile que:

var firstName = "Kazys"; 
var formattedFirstName = Regex.Replace(firstName, @"ys$", "y"); 

Le $ à la fin de la chaîne signifie qu'il ne changera « YS » à « y » quand « YS » sont les deux dernières lettres un string.

Les expressions régulières peuvent être beaucoup plus compliquées et beaucoup de gens ne les aiment pas. Cependant, je trouve qu'ils sont concis et clairs la plupart du temps.

+0

Tant que les règles sont assez compliquées pour que cela vaille la peine, définitivement le chemin à parcourir. –