توضیح:تعداد تکرار هر کارکتر در متن

mhabat

Member
با سلام.با تشکر از دوستان عزیز .شبه عیدی زیاد مزاحم شدم.
سورس یک برنامه هست که تعداد حروف تکراریه یک متن رو نشان میده. اگه میشه قسمت اشاره گر هارو یکم بیشتر توضیح بدین.سورس:
کد:
#include <iostream.h>
#include <conio.h>

int main()
{
    char *passage=new char[500];
    int * alphabet=new int[26];
     for(int i=0;i<26;i++)
    {
            alphabet[i]=0;
     }
    cin.getline(passage,500);
     for(i=0;i<500;i++)
     {
            switch(passage[i])
            {
                                        case 'a' : alphabet[0]++;break;
                              case 'b' : alphabet[1]++;break;
                              case 'c' : alphabet[2]++;break;
                                        case 'd' : alphabet[3]++;break;
                              case 'e' : alphabet[4]++;break;
                              case 'f' : alphabet[5]++;break;
                                        case 'g' : alphabet[6]++;break;
                              case 'h' : alphabet[7]++;break;
                                        case 'i' : alphabet[8]++;break;
                                        case 'j' : alphabet[9]++;break;
                                        case 'k' : alphabet[10]++;break;
                                        case 'l' : alphabet[11]++;break;
                                        case 'm' : alphabet[12]++;break;
                                        case 'n' : alphabet[13]++;break;
                                        case 'o' : alphabet[14]++;break;
                                        case 'p' : alphabet[15]++;break;
                                        case 'q' : alphabet[16]++;break;
                                        case 'r' : alphabet[17]++;break;
                                        case 's' : alphabet[18]++;break;
                                        case 't' : alphabet[19]++;break;
                                        case 'u' : alphabet[20]++;break;
                                        case 'v' : alphabet[21]++;break;
                                        case 'w' : alphabet[22]++;break;
                                        case 'x' : alphabet[23]++;break;
                                        case 'y' : alphabet[24]++;break;
                                        case 'z' : alphabet[25]++;break;
                }
     }
     for(i=0;i<26;i++ )
     {
                cout<<char(i+97)<<": "<<alphabet[i]<<endl;
     }
     getch();
     return 0;
}
خیلی ممنون
بـــدرود
 

the_king

مدیرکل انجمن
کد بی خودی پیچیده و طولانی شده :
کد کاراکتر های ascii بین 0 الی 255 ئه، پس در بدترین شرایط یک آرایه 256 خانه ای برای شمردن همه کاراکتر ها
کفایت می کنه :
کد:
    int count[256];

مرحله 1 - در آرایه برای همه خانه ها تعداد رو 0 در نظر می گیریم.
کد:
    for (i = 0; i < 256; i++)
        count[i] = 0;

مرحله 2 - بعد دونه دونه کاراکتر های رشته رو بررسی می کنیم...
کد:
    for (i = 0; text[i]; i++)

مرحله 3 - در خانه مربوط به اون کاراکتر که داریم بررسی می کنیم شمارنده رو یک واحد زیاد می کنیم.
کد:
        count[text[i]]++;

مرحله 4 - پردازش رشته که تموم شد آرایه رو بررسی می کنیم...
کد:
    for (i = 0; i < 256; i++)

مرحله 5 - هر خونه ای از آرایه که 0 هست که هیچ، در رشته اون کاراکتر نبوده.
مرحله 6 - وگرنه اگر صفر نیست مقدارش را برای کاراکتر متناظر اش نمایش می دهیم که فرضا کاراکتر فلان
اینقدر تکرار شده.
کد:
        if (count[i] > 0)
            cout << "character '" << (char)i << "' : " << count[i] << endl;

کد:
#include <iostream.h>
#include <conio.h>

using namespace std;

int main()
{
    int count[256], i;
    char text[500];
    cin.getline(text, 500);
    for (i = 0; i < 256; i++)
        count[i] = 0;
    for (i = 0; text[i]; i++)
        count[text[i]]++;
    for (i = 0; i < 256; i++)
        if (count[i] > 0)
            cout << "character '" << (char)i << "' : " << count[i] << endl;
    getch();
    return 0;
}
 

mhabat

Member
سلام ممنون از پاسختون.
قسمتی که مربوط به کارکتر های تکراره رو نمیفهمم اگه صفر نباشه(هیچ کارکتری نباشه)یک دفعه از کجا میدونه کدام تکراریه کدام تکراری نیست.شما برای اینکه تعداد تکرار یک کارکتر رو بفهمین به این شکل عمل می کنین؟
در خانه مربوط به اون کاراکتر که داریم بررسی می کنیم شمارنده رو یک واحد زیاد می کنیم
این قسمت رو اگه میشه بیشتر توضیح بدین.
کد:
count[text[i]]++;
خیلی ممنون
بدرود
 

the_king

مدیرکل انجمن
سلام ممنون از پاسختون.
قسمتی که مربوط به کارکتر های تکراره رو نمیفهمم اگه صفر نباشه(هیچ کارکتری نباشه)یک دفعه از کجا میدونه کدام تکراریه کدام تکراری نیست.شما برای اینکه تعداد تکرار یک کارکتر رو بفهمین به این شکل عمل می کنین؟
در خانه مربوط به اون کاراکتر که داریم بررسی می کنیم شمارنده رو یک واحد زیاد می کنیم
این قسمت رو اگه میشه بیشتر توضیح بدین.
کد:
count[text[i]]++;
خیلی ممنون
بدرود

هر کاراکتری در جدول ASCII یک کدی داره، مثلا کد کاراکتر 0 برابر 48 است، یا کد کاراکتر a برابر 97 است.
ما یک آرایه داریم که برای هر کد کاراکتری (0 الی 255) یک خانه داره.
فرضا وقتی در رشته به کاراکتر a می رسیم، [text[i همون کاراکتر a یا در واقع عدد 97 است :
کد:
count[text[i]]++;
کد:
count[97]++;
پس ما داریم مقداری که در خانه 97 هست رو یک واحد افزایش می دهیم، این خانه تعداد کاراکتر های a رو می شماره.
هر بار که به کاراکتر a می رسیم مقدار این خانه افزایش پیدا می کنه. وقتی رشته بطور کامل پردازش شد
اگر 0 باشه یعنی تا به حال هیچ کاراکتر a ای در رشته وجود نداشته، و اگر 5 بود، یعنی در رشته 5 تا a وجود داشت.
 

جدیدترین ارسال ها

بالا