-1

すみません、単語を単語に変換する簡単なアプリケーションを作ろうとしています。例えば

有効にする = できる 支払い = 支払う

メモ帳のテキストは「支払いを有効にする」でした

上記の 2 つのサンプル ワードを使用していますが、必要なものが得られません。notepad.txtに「有効」と「支払い」を書きました。その後、アプリケーションが起動し、単語を取得します。

アプリケーションは単語のトリミングを開始し、「En」と「ment」をカットして、結果が「able」と「pay」になるようにします。

私のアプリケーションは、単一の単語 "enable" を "able" にトリムできます。と「支払い」を「支払う」にしましたが、「支払い可能」「支払い可能」など2文字以上書くとアプリがうまく動作しませんでした。

ここにユーザーインターフェースの画像があります

これがソースコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace KTM'
{
public partial class KTM : Form
{
    public string notepad;
    public KTM()
    {
        InitializeComponent();
        textBox1.Enabled=false;
        button2.Enabled = false;
        button3.Enabled = false;
    }

    void enable()
    {
        button2.Enabled = true;
        button3.Enabled = true;
    }
    private void button1_Click(object sender, EventArgs e)
    {

        string dir = Application.StartupPath.ToString();
        OpenFileDialog fdlg = new OpenFileDialog();
        fdlg.Title = "Open *txt files";
        fdlg.InitialDirectory = @dir;
        fdlg.Filter = "Text files (*.txt)|*.txt|Text Files (*.txt)|*.txt";
        fdlg.FilterIndex = 2;
        fdlg.RestoreDirectory = true;
        if (fdlg.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = fdlg.FileName;
        }
        else
        {

        }


      }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Equals(""))
        {

        }
        else
        {
            enable();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        notepad = textBox1.Text;

        StreamReader sr = new StreamReader(notepad);
        string paragraf = sr.ReadToEnd();
        sr.Close();
        string[] kata = paragraf.Split(' ');
        int i = 0;

        //MessageBox.Show(kata[0]+" "+kata[1]+" "+kata[2]);
        foreach (string ambil in kata)
        {
            if (kata[i].StartsWith("en"))
            {
                kata[i] = kata[i].Substring(2);
            }
            if(kata[i].EndsWith("ment"))
            {
                int len = kata[i].Length;
                int kepake = len - 4;
                kata[i] = kata[i].Substring(0, kepake);
            }


        }
        i++;
        StreamWriter sw = new StreamWriter(notepad);
        i = 0;
        foreach (string ambil in kata)
        {
            sw.Write(kata[i]+" ");
        }
        i++;
        sw.Flush();
        sw.Close();




        MessageBox.Show("Converted and Saved  ","KTM Stemming",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        notepad = textBox1.Text;
        System.Diagnostics.Process.Start(notepad);
    }
}

}

4

4 に答える 4

2

foreach ループが適切に設計されていません。ループ内で配列を更新しているため、イテレータを使用して単純な for ループを実行することをお勧めします。

    for (int i = 0; i < kata.Length; i++)
    {
        if (kata[i].StartsWith("en"))
        {
            kata[i] = kata[i].Substring(2);
        }
        if(kata[i].EndsWith("ment"))
        {
            int len = kata[i].Length;
            int kepake = len - 4;
            kata[i] = kata[i].Substring(0, kepake);
        }
    }

しかし、2 番目のループでは、foreach は理にかなっています。ただし、 ambil 変数を使用する必要があります。

    foreach (string ambil in kata)
    {
        sw.Write(ambil + " ");
    }

編集:

上記は機能しないと言われましたが、私には機能します。おそらく、問題はフォーム内の他のコードに関連している可能性があります。同じメソッドに異なる種類のロジックを混在させるのは良い習慣ではないため、ルート ワード解析ロジックを次のような独自のメソッドに分割することをお勧めします。

    private string getRootWords(string paragraf)
    {
        string[] kata = paragraf.Split(' ');
        for (int i = 0; i < kata.Length; i++)
        {
            if (kata[i].StartsWith("en"))
            {
                kata[i] = kata[i].Substring(2);
            }
            if (kata[i].EndsWith("ment"))
            {
                int len = kata[i].Length;
                int kepake = len - 4;
                kata[i] = kata[i].Substring(0, kepake);
            }
        }

        StringBuilder builder = new StringBuilder();
        foreach (string ambil in kata)
        {
            builder.Append(ambil + " ");
        }
        return builder.ToString();
    }

その方法は私にとってうまくいきます。を呼び出すとgetRootWords("Enable payment")、'able pay' が返されます。これは、私が理解しているように、あなたが望んでいた出力です。

于 2012-05-23T14:13:19.017 に答える
1

iループの外側でインデックス変数をインクリメントしています。内側でインクリメントする必要があります。

    foreach (string ambil in kata) 
    { 
        if (kata[i].StartsWith("en")) 
        { 
            kata[i] = kata[i].Substring(2); 
        } 
        if(kata[i].EndsWith("ment")) 
        { 
            int len = kata[i].Length; 
            int kepake = len - 4; 
            kata[i] = kata[i].Substring(0, kepake); 
        } 
        i++; 
    } 

forループを直接使用することをお勧めします(ambil変数を使用していません):

    for (i=0; i<kata.Lenght; i++) 
    { 
        if (kata[i].StartsWith("en")) 
        { 
            kata[i] = kata[i].Substring(2); 
        } 
        if(kata[i].EndsWith("ment")) 
        { 
            int len = kata[i].Length; 
            int kepake = len - 4; 
            kata[i] = kata[i].Substring(0, kepake); 
        } 
    } 
于 2012-05-23T14:11:36.980 に答える
1
    foreach (string ambil in kata)
    {
        if (kata[i].StartsWith("en"))
        {
            kata[i] = kata[i].Substring(2);
        }
        if(kata[i].EndsWith("ment"))
        {
            int len = kata[i].Length;
            int kepake = len - 4;
            kata[i] = kata[i].Substring(0, kepake);
        }


    }

これはforeachであるため問題の一部ですが、forループのように使用しています。おそらくfor (int i=0; i<kata.Length; i++)、for ループの外側のファイルに書き込みたいので、その for ループに書き込みを入れるか、別の for ループを作成する必要があります。

于 2012-05-23T14:19:53.150 に答える
0

助けてくれてありがとう!:)私はいくつかの答えを理解していませんが、本当に感謝しています:D少なくともあなたたちは私がロジックを構築するのを手伝ってくれて、私はこのように私の問題を解決します

 private void button2_Click(object sender, EventArgs e)
    {
        notepad = textBox1.Text;

        StreamReader sr = new StreamReader(notepad);
        string paragraf = sr.ReadToEnd();
        sr.Close();
        StreamWriter sw = new StreamWriter(notepad);
        string[] kata = paragraf.Split(' ');

        for (int i = 0; i < kata.Length; i++)
        {
            if (kata[i].StartsWith("en"))
            {
                kata[i] = kata[i].Substring(2);
                //cutting the EN*
            }

            if (kata[i].EndsWith("ment"))
            {
                int panjang = kata[i].Length;
                int sisa = panjang - 4;
                kata[i] = kata[i].Substring(0, sisa);
                //cutting the *Ment
            }

            if(kata[i].EndsWith("ous"))
            {
                int panjang = kata[i].Length;
                int sisa = panjang - 3;
                kata[i] = kata[i].Substring(0, sisa);
                //cutting the ous, tremendous, hazardous
            }

            if (kata[i].EndsWith("ied"))
            {
                int panjang = kata[i].Length;
                int sisa = panjang -1;
                kata[i] = kata[i].Substring(0, sisa);
                //cutting ied
            }

            if (kata[i].EndsWith("ly"))
            {
                int panjang = kata[i].Length;
                int sisa = panjang - 2;
                kata[i] = kata[i].Substring(0, sisa);
                //cutting fluently, diligently
            }
            sw.Write(kata[i] + " ");
        }

        sw.Flush();
        sw.Close();
        MessageBox.Show("Converted and Saved  ", "KTM Stemming", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
于 2012-05-25T13:22:16.093 に答える