PDA

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



mhabat
یک شنبه 13 فروردین 1391, 02:37 صبح
با سلام یک برنامه می خوام بنویسم که وقتی یک متن رو مینویسی تعدادتکرار هر حروف رو بگه
(تا اینجاشو مینویسم)اما به این صورت تعداد هر حرف رو نمایش بده که اگر برای مثال تعداد
b=4وc=3وa=1اول اون حروفی که بیشتر تکرار شده رو اول بنویسه.که در ایم مثال باید اولbبعدcبعدaرو نمایش بده.
سورس:


#include <iostream.h>
#include <conio.h>
int main()
{ char t;
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++ )

for(int k=i+1;k<=26;k++)
if(alphabet[i]>alphabet[k])
{
t=alphabet[k];
alphabet[k]=alphabet[k+1];
alphabet[k+1]=t;
}
cout<<char(k+97)<<": "<<alphabet[k]<<endl;
}
getch();
return 0;
}

از تابع نزولی باید استفاده بشه؟

jannatmakan
یک شنبه 13 فروردین 1391, 05:13 صبح
یک دقیقه وایستا یه نگاهی بهش بندازم شاید تونستم کمکتون کنم. چون هنوز قلق کار کردن توی این سایت رو خوب یاد ندارم.

jannatmakan
یک شنبه 13 فروردین 1391, 05:47 صبح
خوب ... من سورس شما رو نگاه کردم. دقیقاً مثل همین سوال رو ترم پیش استادم بهم داد . و من برنامش رو نوشتم. ولی دوتا نکته وجود داره.
اوّل اینکه : صورت سوال اصلاً نخواسته که کاراکترها به ترتیب تعدادِ تکرار آورده بشن. و همین که شما مثلاً برای mohammad بگید. m=3 , o=1, a=2,d=1 ,h=1هم کفایت می کنه.
دوّم : یه چیزی که توی این برنامه یک کمی توی ذوق می زنه اینه که شما خودتونو تو زحمت انداختید و تک تک کاراکترهای الفبای انگلیسی رو درنظر گرفتید. در حالی که می شه برنامه رو طوری نوشت که هر کاراکتری رو محاسبه کنه حتی اون هایی که روی کیبور نیستند. اومدیمو کاربر مثلا کاراکتر # یا @ یا ! رو زد. اونوقت چی ؟

به هر حال من برنامشو دارم . اگه می خواید براتوم ارسال کنم. فقط اگر خواستید که کاراکترها هم به ترتیب تعداد آورده بشه . بگید که اصلاحش کنم؛ بعد ارسالش کنم.

mhabat
یک شنبه 13 فروردین 1391, 05:58 صبح
ممنون از پاسختون.
بله همون طور که گفتین بدونswitchهم میشه این کارو کرد و سرورسشم قرار میدم.اما اگه میشه سورسی که می خواین ارسال کنید رو طوری تغییر بدین که اگه تعداد حرف mیا دیگری بیشتر بود اول اونو نمایش بده.
سورس:


#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;
}

jannatmakan
یک شنبه 13 فروردین 1391, 07:00 صبح
تمومه... ایمیتو بده برات ارسال کنم.:لبخندساده:

jannatmakan
یک شنبه 13 فروردین 1391, 07:14 صبح
تمومه... ایمیتو بده برات ارسال کنم:لبخندساده:

mhabat
یک شنبه 13 فروردین 1391, 23:23 عصر
سلام.ممنون از سورسی که قرار دادین.من چند قسمتش رو مشکل داشتم که اگر میشه بیشتر توضیحشون بدین.
1-قسمت مربوط به تابع صورت که ماله مرتب سازیه رو خوب متوجه نمیشم.
2-این قسمت رو چرا هم مقدار قرار دادین؟
strget[0]=strsrc[0];
3-ما در تابع اصلی یک بار کارکتر هارو با cin.getگرفتیم چرا دوباره بعد از اون دوباره دستور
cin.get();رو زدین.
سورس کل برنامه:

#include<iostream.h>
#include<conio.h>
#define SL 100
/*/ tozihe farsi // be vasileye tabe getchs tedade tekrare har karacter ro
be dast mayarim ba estefadeh az halgheha vahamintor tak tak rooye tamam
karacter ha ....
*/
//this function gets one sample of repeated characters from strsrc
// and count them in cnt indexs
void getchs(char strsrc[],char strget[],int cnt[])
{
int i=1,j=0,exist=0;
for(j=0;j<SL;j++)//set the all of strget cells to '\x0',cnt to 1
{
strget[j]='\x0';
cnt[j]=1;
}
strget[0]=strsrc[0];
while(strsrc[i]!='\x0')
{
for(j=0;strget[j]!='\x0';j++)
{
if(strsrc[i]==strget[j])
{
exist=1;
cnt[j]++;
break;
}
}
if(exist==0)
strget[j]=strsrc[i];
exist=0;
i++;
}
}

void sort(int x[],char st[])
{
int i,j,t1;
char t2;
for(i=SL;i>0;i--)
{
for(j=0;j<i-1;j++)
{
if(x[j]<x[j+1])
{
t1=x[j];
t2=st[j];
x[j]=x[j+1];
st[j]=st[j+1];
x[j+1]=t1;
st[j+1]=t2;
}
}
}
}

void main()
{
clrscr();
char str1[SL],str2[SL];
int i=0;
int cnt[SL];//counter in same index of str2
cout<<"This program is count characters in a text\n\n\n";
cout<<"Input original text :";
cin.get(str1,SL-1);
cin.get();
getchs(str1,str2,cnt);
cout<<"\nYour text made of follow characters:";

sort(cnt,str2);
while(i<SL)
{
if(str2[i]!='\x0')
cout<<"\n( "<<str2[i]<<" ) Repeated "<<cnt[i]<<" Times";
i++;
}
getch();
}


خیلی ممنون
بــــــدرود

jannatmakan
سه شنبه 15 فروردین 1391, 05:49 صبح
1-تابع sort دو آرگومان می گیرد. یکی آرایه ی x که همان مقدار cnt (نگه دارنده ی تعداد هر حرف) را درون آن می ریزیم. و دیگری آرایه ی کاراکتری یا همان رشته ی st است که رشته ی نمونه گیری شده که از هر کاراکتر فقط یک نمونه گرفته (مثلاً از mohammad رشته ی mohad را دارد) را درون آن می ریزیم.
خوب . اندیس هر کاراکتر موجود در آرایه ی x مساوی است با اندیس تکرار همان کاراکتر در آرایه ی st . پس هنگام مرتّب سازی اعداد و جابه جایی مقادیر آن؛ مقادیر st را هم دقیقاً مثل x جا به جا می کنیم.

2- خوب. سوال دومتون واقعاً سوال خوبیه . و جوابش هم یکم طولانیه
علّتش اینه : می دانیم که strsrc رشته ایست که کاربر وارد می کند. و strget رشته ایست که از هر کاراکتر موجود در این رشته، فقط یک نمونه را در خود جای می دهد. مثلاً اگر strsrc=mohammad باشد ؛ strget=mohad می شود.این کار دو خاصیت دارد. یکی این که در هنگام چاپ کاراکترهای شمارش شده از تکرار جلوگیری مشود (خط 75). یکی این که تک تک کاراکترهای strget را با strsrc مقایسه می کنیم تا تعداد تکرارهر کاراکتر مشخص شود(خط 23 تا 27 ) تابعی که می بینید این گونه این کار را انجام می دهد. ابتدا همان اول مطمئنیم که کاراکتر اول رشته ای که کاربر وارد کرده یعنی strsrc در strget موجود نیست . پس همان اول ، اولین کاراکتر strsrc را داخل strget می ریزیم. و حالا باید عمل نمونه گیری از کاراکترهای strsrc را از اندیس دومش یعنی اندیس [1] شروع می کنیم . دقت داشته باشید که بر خلاف تمام شمارنده ها که مقدار اوّلیه شان صفر است، مقدار i=1 است. و در یک جمله ی کوتاه و مفید:

علت این کار این است که چون تک تک کاراکترهای strget باید هر دفعه با تمام کاراکترهای strsrc مقایسه شوند، پس همان مرتبه ی اوّل کاراکتر اولِ strsrc را به اوّل strget ریختیم که کاراکتر اول هم در نظر گرفته شود. (این خط را امتحانی حذف کنید و ببینید جه رخ می دهد)

3- به صورت تجربی متوجه شدم که تابع cin.get این طوری کار می کنه که اگر چیزی رو می گیریم ؛ یکبار هم باید همینطوری فراخونیش کنیم. وگرنه شاید دفعخ ی اول ورودی گرفتن مشکی ایجاد نکنه. ولی دفعه دوم به بعد مشکل ساز می شه.