PDA

View Full Version : سوال: شمارش تعداد تکرار یک کلمه در متن



batman1
شنبه 29 خرداد 1395, 13:07 عصر
سلام به همه.
من میخوام نرم افزاری بنویسم که مثلا یک متنی رو بهش بدی و یک کلمه مثل"سلام"رو هم براش مشخص کنی.
بعد این نرم افزار داخل متنو سرچ کنه و بگه که از این کلمه سلام،چند بار تکرار شده.
ممنون میشم راهنماییم کنید.

mrprestige
شنبه 29 خرداد 1395, 18:06 عصر
سلام به همه.
من میخوام نرم افزاری بنویسم که مثلا یک متنی رو بهش بدی و یک کلمه مثل"سلام"رو هم براش مشخص کنی.
بعد این نرم افزار داخل متنو سرچ کنه و بگه که از این کلمه سلام،چند بار تکرار شده.
ممنون میشم راهنماییم کنید.
سلام دوست من وقتت بخیر ، شما میتونید با استفاده از این تابع تعداد کلمه مورد نظرتون رو داخل یک متن در Textbox پیدا کنی ، ولی من پیشنهاد میکنم بجای تکس باکس از Richtext box استفاده کنی ( دستت باز تره )

public static void CountText(TextBox TB, string W)
{
if (W == "")
{
return;
}
int start = TB.SelectionStart, startIndex = 0, index,C=0;
while ((index = TB.Text.IndexOf(W, startIndex)) != -1)
{
startIndex = index + W.Length;
C++‎‎‎‎‎‎;
}
TB.SelectionStart = start;
MessageBox.Show(C.ToString());
}


پیروز و موفق باشی
از کدنویسی لذت ببری .

batman1
شنبه 29 خرداد 1395, 21:24 عصر
ممنون از لطفتون دوست عزیز.
ولی میشه لطف کنید و یه توضیح مختصری هم بدید؟
ممنون.

mrprestige
شنبه 29 خرداد 1395, 22:58 عصر
با سلام مجدد ، دوست من ، من از حلقه While به بعد رو توضیح میدم ( خط به خط ) قبل از اون همچی واضحه ، خب بدنه حلقه رو توضیح میدم ، (TB.Text.IndexOf(W, startIndex این خط کد به این معنی که شما شماره ایندکس متن موجود داخل تکس باکس رو داخل متغیر index میریزه حالا W, startIndex به ایم معنی W همون کلمه یا رشته ای که ما میخوایم تعدادش رو بدست بیاریم توی متن و Startindex که تعریف کردیم برابر صفر هست در واقع محل شروع در Indexof میباشد به طور ساده تر اگه بخوام بگم اگه کلمه مون " سلام " بود وقتی شروع ایندکس (ُStartindex) برابر صفر هست یعنی از اول کلمه . و تا زمانی تمام متغییر index مون مخالف 1- ( برای این میگم 1- چون ایندکس 0 حرف اول کلمه مون هست ) هست بدنه حلقه مون رو ادامه بده ، داخل بدنه حلقه (TB.Select(index, W.Length مقادیر داخل تکس باکسمون رو select میکنه از ما دوتا پارامتر میگیره اولی شروع ( که من index رو قرار دادم ) دومی اندازه رشته مورد نظر که من ظرفیت W رو قرار دادم دستور بعد startIndex = index + W.Length که اگه بخوام خلاصه کنم کارش اینه که اولین کلمه مورد نظر رو پیدا میکنه و وقتی پیدا کرد محل شروعش میه اول کلمه دوم همین روند ادامه تا آخر جمله در قسمت بعد یه واحد به C اضافه میشه کار این متغییر اینه که تعداد کلمه های مورد نظرمون بهمون نشون میده بعد از حلق خارج میشیم اگه باز بخوام اون سه تا دستور رو خلاصه کنم این میشه که من برای اینکه گفتم احتمالا شاید شما بخواین به جمله قبلیتون بازم جمله ای اضافه کنید و احتمالا هم بازم از اون کلمه مورد نظر توی جمله جدیدتون هست . به همین خاطر اون دو دستور اول کاری میکنن که اگه بازم کلمه مورد نظرتون رو توی جمله پیدا کرد با ادامه همون کلمه های قبلی تعدادش رو محاسبه کنه و در آخر هم متغییر C رو در مسیج باکس نمایش بده که تعداد کل کلمه های مورد نظرمون رو داخل جمله بگه .
اگه توضیحات کمی زیاد شد برای این بود دلم نیومد از کدی که برات نوشتم اطلاع کافی نداشته باشی .

پیروز و موفق باشی .
از کدنویسی لذت ببری

batman1
یک شنبه 30 خرداد 1395, 10:08 صبح
نمیتونیم از دستور contains استفاده کنیم؟
البته مشکلش اینه که بولینه و نمیشه مثلا به اینت تبدیلش کرد.

mrprestige
یک شنبه 30 خرداد 1395, 18:47 عصر
سلام دوست من ، چرا میتونیم از Contains استفاده کنیم به این روشی که براتون نوشتم

int C = 0;
string stringToCheck = "salam";
string[] S_Array =textBox1.Text.Split(new string[] { " " }, StringSplitOptions.None);
foreach (string x in S_Array)
{
if (x.Contains(stringToCheck))
{
C++‎‎‎;
}
}
MessageBox.Show(C.ToString());

اما این روش محدودیتی داره اونم اینکه بعد هر Space ی که زده میشه عمل Contains انجام میشه و در صوت وجود کلمه به شمارنده یه واحد افزوده میشه اینم بخاطر اینه که شما نمیتونید به طور مستقیم تکس باکستون رو به آرایه از نوع String تبدیل کنید و باید به این شکل که براتون نوشتم عمل کنید و اگر هم بخواید به طور مستقیم اون رو تبدیل کنید به آرایه میتونید اون رو به صورت آرایه از نوع Char تبدیل کنید که اون هم باز برای دستور Contains غیرقابل قبول و متغییر از نوع [] Char قبول نمیکنه . من به شما همون کد اول رو بهتون پیشنهاد میکنم (که باز یه خورده اصلاحش کردم ) چون ایندکس به ایندکس متن رو دنبال کلمه تون میگرده و براتون تعدادشون رو نمایش میده .

mn_acer1
یک شنبه 30 خرداد 1395, 22:37 عصر
سلام دوست من ، چرا میتونیم از Contains استفاده کنیم به این روشی که براتون نوشتم

int C = 0;
string stringToCheck = "salam";
string[] S_Array =textBox1.Text.Split(new string[] { " " }, StringSplitOptions.None);
foreach (string x in S_Array)
{
if (x.Contains(stringToCheck))
{
C++‎‎‎‎;
}
}
MessageBox.Show(C.ToString());

اما این روش محدودیتی داره اونم اینکه بعد هر Space ی که زده میشه عمل Contains انجام میشه و در صوت وجود کلمه به شمارنده یه واحد افزوده میشه اینم بخاطر اینه که شما نمیتونید به طور مستقیم تکس باکستون رو به آرایه از نوع String تبدیل کنید و باید به این شکل که براتون نوشتم عمل کنید و اگر هم بخواید به طور مستقیم اون رو تبدیل کنید به آرایه میتونید اون رو به صورت آرایه از نوع Char تبدیل کنید که اون هم باز برای دستور Contains غیرقابل قبول و متغییر از نوع [] Char قبول نمیکنه . من به شما همون کد اول رو بهتون پیشنهاد میکنم (که باز یه خورده اصلاحش کردم ) چون ایندکس به ایندکس متن رو دنبال کلمه تون میگرده و براتون تعدادشون رو نمایش میده .

داداش جسارتا این روش اشکال زیادی داره! البته خوب ممکنه این حالت پیش نیاد ولی به هر حال باید استثنا ها رو هم در نظر گرفت.
مثلا اگه کلمه ها بدون فاصله از هم نوشته بشه نتیجه درستی نمیده!

از این کد استفاده کنید:

string[] splitedarray = textBox1.Text.Split(new string[] { "salam" },StringSplitOptions.None);
MessageBox.Show((splitedarray.Length-1).ToString());
البته شاید در این حالت هم استثنایی هم رخ بده!

mrprestige
دوشنبه 31 خرداد 1395, 17:00 عصر
داداش جسارتا این روش اشکال زیادی داره! البته خوب ممکنه این حالت پیش نیاد ولی به هر حال باید استثنا ها رو هم در نظر گرفت.
مثلا اگه کلمه ها بدون فاصله از هم نوشته بشه نتیجه درستی نمیده!

از این کد استفاده کنید:

string[] splitedarray = textBox1.Text.Split(new string[] { "salam" },StringSplitOptions.None);
MessageBox.Show((splitedarray.Length-1).ToString());
البته شاید در این حالت هم استثنایی هم رخ بده!
سلام دوست من ، درسته من هم نگفتم این روش ، روش مناسبی هست در پست قبلی عرض کردم "
این روش محدودیتی داره اونم اینکه بعد هر Space ی که زده میشه عمل Contains انجام میشه " و درسته این مثالی که شما زدید من هم میدونستم ولی این برای زمانی هست که نمیخوایم از متد Contains استفاده کنیم ولی این که دوست من ، دوستمون batman1 (http://barnamenevis.org/member.php?333205-batman1)
میخواستن بنده با متد Contains براشون مثال زنم اینم متن سوالش ("
میتونیم از دستور contains استفاده کنیم؟
البته مشکلش اینه که بولینه و نمیشه مثلا به اینت تبدیلش کرد. ") .

پیروز و موفق باشید .