PDA

View Full Version : سوال: سوال در مورد ZIP و UNZIP كردن كاراكتر ها



ablofazlkianianboohi
جمعه 17 دی 1389, 17:24 عصر
درود و سلام بر همه دوستان
من يك برنامه مي خواهم كه يك كلمه مانند mhoammad را از كاربر بگيرد و در خروجي به دو صورت زير نمايش دهد:

mohad

3m1h1o2a1d

هم چنين مثلا در يك فايل با پسوند txt كلمه را تايپ كنم و آن را دريافت كند و نمايش دهد.


اگر امكانش هست به صورت خيلي ساده و همراه با كمي آموزش برايم قرار دهيد.

خيلي خيلي ممنون

ali najafi
شنبه 18 دی 1389, 10:34 صبح
اولی که نوشتی :

#include <stdio.h>
#include <conio.h>
void main()
{
char ch[11]
scanf("%s",ch);
for(int i=0;i<=11;i++){
if(ch[i]=='\0') break;
}
for(int b=0;b<i;b++){
if(ch[b]==ch[b+1])
b+=2;
printf("%c",ch[b]);
else
printf("%c",ch[b]);
}
getch();
}

اگه متوجه نشدی بگو بیشتر توضیح بدم.
دومی رو باید بگی رابطه ای که استفاده کردی چی بوده(مثلا به برنامه میخوای بگی روی هر کاراکتر چه عملی انجام بده)تا کدش رو بنویسم.
در مورد فایل txt هم همینه فقط باید فایل رو باز کنه و به جای scanf رشته رو از فایل بگیره.
اینم اگه متوجه نشدی بگو بیشتر توضیح بدم.

ablofazlkianianboohi
شنبه 18 دی 1389, 16:05 عصر
درود
دوست عزيز ممنون از توجه شما
ولي وقتي من اين فايل ها را در نرم افزار c-free 5 اجرا مي كنم با خطا مواجه مي شود.

بعد حالا اين دستور "c%" يعني چي؟

ممنون

ali najafi
شنبه 18 دی 1389, 16:31 عصر
فرمت ورودی یا خروجی رو تعیین میکنه.(یعنی به برنامه میگیم ورودی یا خروجی کاراکتر هستش نه عدد و...)
کجاش خطا داره؟من تست میکنم سالمه(توی ++Dev-C و توربو سی IDE)
توس scanf به جای %c نوشتم %s یعنی ورودی رشته هست.
بگو کجاش خطا داره ببینم چشه!

ablofazlkianianboohi
شنبه 18 دی 1389, 16:48 عصر
وقتي برنامه را اجرا مي كنم از :
void main()
{
فقط از آكولاد ايراد مي گيره و پيغام :
warning: no newline at end of file
مي دهد.
هم چنين وقتي شما متغير ch را تعريف كرده ايد آخر آن ; نگذاشته ايد.

اگر مي تونيد برنامه را دانلود كنيد و خطا را مشاهده كنيد.حجم برنامه تغريبا 3 مگ هست فكر كنم!

mehdi.mousavi
شنبه 18 دی 1389, 19:32 عصر
سلام.
من در مورد منظق برنامه ای که نوشته اید صحبتی نمیکنم، اما برنامه ای که نوشته اید ایراد داره. به کدتون دقت کنید:



char ch[11];
scanf("%s", ch);
for(int i = 0; i <= 11; i++) {
if(ch[i]=='\0')
break;
}


اینجا یه Array تعریف کردید به اندازه 11 بایت، اما توی حلقه دارید بایت 12 ام اون رو آدرس می کنید (بدلیل وجود مساوی در i <= 11)...

موفق باشید.

ablofazlkianianboohi
شنبه 18 دی 1389, 23:28 عصر
دوست عزيز mehdi.mousavi (http://barnamenevis.org/member.php?41233-mehdi.mousavi) ( مدير كل سايت)

شما مي تونيد ما را در اين پروژه ياري كنيد؟

ممنون مي شوم اگر برنامه را به من بدهيد يا مشكلات برنامه ي بالا را رفع كنيد؟

mehdi.mousavi
یک شنبه 19 دی 1389, 13:06 عصر
شما مي تونيد ما را در اين پروژه ياري كنيد؟ ممنون مي شوم اگر برنامه را به من بدهيد يا مشكلات برنامه ي بالا را رفع كنيد؟ من يك برنامه مي خواهم كه يك كلمه مانند mhoammad را از كاربر بگيرد و در خروجي به دو صورت زير نمايش دهد:

سلام.
متاسفانه (یا بهتره بگم خوشبختانه) اینجا توی این سایت، اعضاء اجازه مطرح کردن پروژه های دانشجویی (و گرفتن کد حاضر و آماده رو) ندارن. به اعتقاد من شما هنوز با صورت مساله مشکل دارید و هنوز سوال خودتون رو درک نکرده اید. من چطوری باید از mhoammad به mohad برسم؟ یا 3m1h1o2a1d از کجا اومده؟ این اعداد و ارقام چی هستن؟؟؟ اولین گام در گرفتن پاسخ سوالات، فهم دقیق صورت مساله توسط خودتون، و بیان دقیق تر اون برای دیگران هستش. تا وقتی شما نتونید صورت مساله رو به درستی مطرح کنید، طبیعتا کسی هم نمیتونه به اون پاسخ بده. از طرفی، عنوان تاپیک رو که دیدم، از خودم پرسیدم: "یعنی بچه ها اینقدر پیشرفت کردن که دنبال الگوریتم هایی مثل LZW و ... هستن؟" بعد که سوال رو خوندم، متوجه نشدم این مساله چه ارتباطی با Zip/Unzip کردن اطلاعات داره. Zip کردن، یعنی فشرده کردن اطلاعات بگونه ای که بشه از روی اطلاعات فشرده شده، به اطلاعات اصلی و خام رسید. شما چطوری از mohad میخواهید به mhoammad برسید؟ پس اسم این Zip/Unzip کردن اطلاعات (یا کاراکترها) و ... نیست. در هر حال، اگر توضیح بدید که چه الگوریتمی ما رو از اولین واژه به دومی میتونه برسونه، یا اون اعداد و ارقام از کجا اومده اند، من بهتون میگم چطوری برنامه رو بنویسید.

موفق باشید.

ablofazlkianianboohi
یک شنبه 19 دی 1389, 13:16 عصر
با سلام مجدد
به طور كلي Zip يعني فشرده كردن و Unzip يعني از حالت فشرده خارج ساختن.
من نمي خواهم اطلاعات را zip و يا unzip كنم، بلكه مي خواهم يك كلمه مانند mohammad را zip كنم.حالا منظورم چيست؟

يعني كاراكتر هاي تكراري در كلمه حذف شوند و فقط يك حرف از آن ها بماند.در كلمه ي mohammad ما سه كاراكتر m داريم كه بايد 1 m به نمايش در بيايد و يا 2 كاراكتر a داريم كه بايد 1 كاراكتر a به نمايش در بيايد و ... .

اما در مورد اين خروجي (3m1h1o2a1d) منظورم اين هست:
يعني در كلمه وارد شده توسط كاربر 3 كاراكتر m ، يك كاراكتر h و 1 كاراكتر o و ... وجود دارد.

اميد وارم منظورم را به خوبي درك كرده باشيد.

ممنون

mehdi.mousavi
یک شنبه 19 دی 1389, 14:22 عصر
با سلام مجدد به طور كلي Zip يعني فشرده كردن و Unzip يعني از حالت فشرده خارج ساختن. من نمي خواهم اطلاعات را zip و يا unzip كنم، بلكه مي خواهم يك كلمه مانند mohammad را zip كنم.حالا منظورم چيست؟ يعني كاراكتر هاي تكراري در كلمه حذف شوند و فقط يك حرف از آن ها بماند.در كلمه ي mohammad ما سه كاراكتر m داريم كه بايد 1 m به نمايش در بيايد و يا 2 كاراكتر a داريم كه بايد 1 كاراكتر a به نمايش در بيايد و ... . اما در مورد اين خروجي (3m1h1o2a1d) منظورم اين هست: يعني در كلمه وارد شده توسط كاربر 3 كاراكتر m ، يك كاراكتر h و 1 كاراكتر o و ... وجود دارد. اميد وارم منظورم را به خوبي درك كرده باشيد. ممنون

سلام.
آهان، این شد یه توضیح خوب. حالا که صورت مساله معلوم شده، نوشتن کدش دیگه کاری نداره:



CHAR *pszInput = "mohammad";

int freq[256] = {NULL}, isRepeated[256] = {NULL}, length = strlen(pszInput), index = 0;
for(int i = 0; i < length; i++)
freq[(int)pszInput[i]]++;

CHAR *pszDistinct = (CHAR *)_alloca(length + 1);
for(int i = 0; i < length; i++)
{
int ch = (int)pszInput[i];
if(isRepeated[ch] == 0)
{
pszDistinct[index++] = ch;
isRepeated[ch] = 1;

printf("%d%c", freq[ch], ch);
}
}

pszDistinct[index] = NULL;
printf("\r\n%s", pszDistinct);


اینجا، فرض کردم ورودی mohammd هستش. (که شما قاعدتا باید با اضافه کردن دو خط کد اونو از کاربر بگیرید). سپس دو تا Array به طول 256 (چرا 256؟) خونه گرفتم. اولی که اسمش رو گذاشتم freq، به من فرکانس هر کاراکتر رو در pszInput نشون میده. در حلقه اول، بر اساس کد ASCII ی هر کاراکتر در رشته اصلی (mohammd)، تعداد تکرار هر Character رو بدست میارم. سپس حافظه ای به اندازه همون رشته ورودی از Stack میگیرم (چرا Stack؟)، چون میدونم حافظه مورد نیازم کوچکتر مساوی تعداد حروف mohammad هستش (چون یا تکراری داره، که تعدادش کمتر میشه، یا تکراری نداره که تعدادش مساوی همون رشته اصلی میشه). بعدش در یه حلقه، بر اساس آرایه دوم، نگاه میکنم ببینم کدوم حرف در رشته رو قبلا مد نظر قرار دادم و بدین ترتیب حروف تکراری رو حذف میکنم. در واقع اگر حرف تکراری باشه، isRepeated رو برای اون کاراکتر خاص مساوی یک میذارم تا بعدا تو Traverse بعدی حلقه، بدونم که آیا حرف فعلی تکراریه یا نه. بدین ترتیب برنامه فوق اول 3m1o1h2a1d و سپس mohad رو روی صفحه می نویسه. mohad از کجا اومده؟ اونو توی pszDistinct نگه داشتم، که در آخر بتونم روی صفحه نمایشش بدم (برای اینکه دوباره مجبور نشم Loop رو بنویسم).

اگر مطلبی در کد فوق هستش که متوجه نشده اید بپرسید تا براتون توضیح بدم، در غیر اینصورت، لطفا سعی کنید تمرینهای خودتون رو خودتون حل کنید. نوشتن کد توسط دیگران کمکی به شما نمیکنه (در طولانی مدت).

موفق باشید.

ablofazlkianianboohi
یک شنبه 19 دی 1389, 15:00 عصر
دوست عزيز
ممنون از پاسخ سريع شما

اول مي خواستم بدونم سرفايل ها اين برنامه چي هستن؟
دوم اينكه آيا امكانش هست برنامه را كمي مبتدي تر بنويسيد؟
ممنون

ablofazlkianianboohi
یک شنبه 19 دی 1389, 15:07 عصر
دوست عزيز ممنون از پاسخ سريع شما
دو تا سوال داشتم:
اول سرفايل هاي اين برنامه چه هستند؟
دوم آيا امكانش هست برنامه را كمي مبتدي تر بنويسيد؟

ممنون

ablofazlkianianboohi
یک شنبه 19 دی 1389, 23:03 عصر
سلام دوستان
بالاخره خودم موفق شدم با چند تا if و for ساده برنامه ها رو بنويسم.
حالا هر كس خواست بگويد تا تو تاپيك قرار دهم.