مشکل در شمارش تعداد کلمات با آرایه (با الگوریتم خودم)؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل در شمارش تعداد کلمات با آرایه (با الگوریتم خودم)؟

+2 امتیاز

با سلام , من قبلا این سوال رو پرسیده بودم و آقای veniz2008 زحمت کشیدن و با روش دیکشنری و روش آرایه های دندانه ای این مسئله رو حل کردن . حالا می خوام به روش الگوریتم خودم این مسئله رو حل کنم : ببینید فرض کنید یک فایل متنی داریم که در اون تعدادی کلمه هست من میخوام که تعداد کلمات اون فایل رو نمایش بدم به روش الگوریتم خودم: من اول کل فایل رو میخونم و در یک  استرینگ میریزم و سپس اون استرینگ رو با تابع اسپلیت مقایسه میکنم و اگه کاراکتر تهی داشت میخوام اون کلمه در یک آرایه رشته ای قرار بگیرد و البته ممکن است که توی فایل رشت ای که درون رشته ریختیم کلمه اولش با فاصله شروع نشده باشه که باید فاصله بدیم بهش و بعد درون آرایه رشته ای قرار بدیم این تا اینجا  بعدش که آرایه ای از کلماتمون تشکیل شد میایم اول ین کلمه اون رشته را با تمام آرایه مقایسه میکنید که ببینیم چنتا  تکرار دارد و تعداد را به یک متغیر اضافه میکنیم و در خروجی چاپ میکنیم و به سراغ کلمه بعدی در رشته میرویم  تا آخرین کلمه. من توی این الگوریتم گیر کردم لطفا کمک کنید.ممنون .   من تا همینجا تونستم کد رو بنویسم و گیر کردم...  اجرا میشه ولی آخرش پیام میده که از آرایه خارج شده لطفا کمک کنید.


 static void Main(string[] args)
        {

            StreamReader sr = new StreamReader(Console.ReadLine());
            string f = sr.ReadToEnd();
            f = " " + f;
            int c = 0, p = 0;
            string[] word = f.Split(' ');
            while (sr.EndOfStream == true )
            {
                
                c = 0;
                string s = word[p];
                p++;
                for (int i = 0; i < word.Length; i++)
                {
                    if (word[i] == s)
                    {
                        c++;
                        Console.WriteLine("The Word " + word[i] + " Reapeted " + c.ToString());
                    }


                }
               
            }
            Console.ReadKey();

        }

 

سوال شده اسفند 23, 1392  بوسیله ی daniyaltjm (امتیاز 840)   47 88 103
دوباره تگ گذاری شد تیر 16, 1393 بوسیله ی BlueBlade
وای عکس breaking bad رو گذاشتی تو آواتارت  ..
عجب سریالی بود . حیف تموم شد :(
واقعا سریال قشنگی بود

1 پاسخ

+4 امتیاز
 
بهترین پاسخ

الگوریتمتون کامل و درست نیست .

به این شکل عمل کنین :

1_ اول تمام کلمه ها رو جدا کنین و داخل یک آرایه از string بریزین (تا این جا رو انجام دادین ) مثلا اسم آرایه رو گذاشتین words

2_2 تا آرایه 1 بعدی تعریف کنین یکی برای ذخیره هر کلمه بدون تکرار اسم مثلا  w  و یکی هم برای ذخیره تعداد تکرار اسم r

3_ از اول words شروع کنین به خوندن  و یکی یکی برین جلو

هر کلمه رو داخل آرایه w جست و جو کنید .

     اگر کلمه داخل آرایه w نبود اونو به آرایه اضافه کنین و یک عدد 1 هم به آرایه r اضافه کنین

    در غیر این صورت اگر کلمه داخل w بود فقط خونه با اندیس معادل رو داخل r یک واحد اضافه کنین

مرحله 3 رو تا رسیدن به آخر words ادامه بدین.

وقتی که تموم شد w کلمه مورد نظره و r تعداد تکرار

مثلا w[0]-->ss   r[0]-->3  ,,,   w[1]-->kalame  r[1]-->1,....

 

کد :

static void Main(string[] args)
{
    StreamReader sr = new StreamReader("D:\\file.txt");
    string str = sr.ReadToEnd();
    string[] word = str.Split(' ');
    string[] w = new string[word.Length];
    int[] r = new int[word.Length];
    int loc = 0;
    for(int i=0;i<word.Length;i++)
    {
        int found = -1;
        for (int j = 0; j < w.Length; j++)
        {
            if (w[j] == word[i])
            {
                found = j;
                break;
            }
        }
        if (found != -1)
        {
            r[found]++;
        }
        else
        {
            w[loc] = word[i];
            r[loc]++;
            ++loc;
        }
    }
    for (int i = 0; i < loc ; i++)
    {
        Console.WriteLine("The word >>  " + w[i] + " Is Repeated : " + r[i]);
    }
    Console.ReadKey();
    
}

 

پاسخ داده شده اسفند 23, 1392 بوسیله ی PSPCoder (امتیاز 1,301)   14 40 57
انتخاب شد اسفند 23, 1392 بوسیله ی daniyaltjm
لطفا کد رو بنویسین . چرا برنامه من اجرا میشه ولی آخرش خطای خارج از محدوده آرایه میده؟
دلیلش اینه که while (sr.EndOfStream == true  تا بی نهایت اجرا میشه و هیچ وقت از while خارج نمیشین.
نه من اینجا اشتباه کردم من با != هم تست کردم ولی خطای آرایه میده که از محدوده خارج شده!!!
خیلی ممنون کد جواب داد!!!!
لطفا در مورد این کد توضیح بدین :
if (found != -1)
        {
            r[found]++;
        }
        else
        {
            w[loc] = word[i];
            r[loc]++;
            ++loc;
        }
found رو قبل از for با -1 تعریف کردم . بعد کل آرایه w رو هر مرحله جست و جو کردم اگر کلمه داخل w نباشه طبیعتا مقدار found همون -1 می مونه و کلمه داخل found نیست یعنی else اجرا میشه (همون چیزی که بالا گفتم " اگر کلمه داخل آرایه w نبود اونو به آرایه اضافه کنین و یک عدد 1 هم به آرایه r اضافه کنین " ) اگر هم کلمه داخل w باشه found=j یا محلی که کلمه بوده قرار می گیره و وقتی که از for خارج شدیم چون found دیگه -1 نیست شرط if اجرا میشه و    r[found]++;l میشه
این قسمت ها همون کاری که بالا گفتم رو می کنن یعنی :

3_ از اول words شروع کنین به خوندن  و یکی یکی برین جلو

هر کلمه رو داخل آرایه w جست و جو کنید .

     اگر کلمه داخل آرایه w نبود اونو به آرایه اضافه کنین و یک عدد 1 هم به آرایه r اضافه کنین

    در غیر این صورت اگر کلمه داخل w بود فقط خونه با اندیس معادل رو داخل r یک واحد اضافه کنین
خوب این متغیر رو نگفتید؟ int loc = 0;
دستور break فقط از if خارج میشه یا از حلقه با اندیس j ?
از اون برای محل آخرین کلمه استفاده می کنم به خاطر این که کلمات ممکنه تکراری باشن تعداد کلمات آرایه w همیشه مساوی word.Length نیست پس از loc استفاده کردم تا محل آخرین عنصر توی w رو داشته باشم .
break از  for با اندیس j خارج میشه .
...