PDA

View Full Version : سوال: در الگوریتم زیر خروجی s چه تغییری خواهد کرد؟



complexcoding
دوشنبه 14 فروردین 1391, 13:43 عصر
سلام دوستان
چگونگی عملکرد الگوریتم زیر رو متوجه نمی شم لطفا دوستان خط به خط توضیح بدن. از عملکرد الگوریتم باخبرم و میدونم که خروجیش چیه اما نمی دونم که چطور این کار رو با ورودی انجام میده و بخاطر اینکه در استدلال توضیحات دوستان تاثیری نداشته باشه نمی گم چه کاری رو انجام می ده تا دوستانی که بلدن جواب من رو بدن:ناراحت: البته با عذرخواهی فراوان ....
دوستان لطفا خط به خط توضیح بدن خیلی ممنون


Void show(char *s);{



Char *p=s+strlen(s)-1;



Char *t=s;



While (t<p){



Ch = *t;



*t=*p;



*p=ch;



p--;



t++;}



puts(s);



}



متاسفانه این الگوریتم رو سر در نمی یارم و یکی از سوالامم اینه که چرا به جای --p از --p* استفاده نکرده؟
خیلی ممنون از دوستانی که کمک کنند.

Ananas
دوشنبه 14 فروردین 1391, 15:41 عصر
سلام.
فکر میکنمم این تابع متن رو برعکس میکنه یعنی کاراکتر هاشو از آخر به اول میچینه.
Char *p=s+strlen(s)-1;
یک اشاره گر به آخرین کاراکتر.
Char *t=s;
یک اشارهه گر به اولین کاراکتر.
While (t<p)
مادامی که بین دو تا اشاره گر فاصله ای وجود داره انجام بده.
Ch = *t;
اکاراکتری که در آدرس t هست رو به خاطر بسپار.
*t=*p;
کاراکتری که در t هست رو برابر کاراکتری که در p هست قرار بده.
*p=ch;
کاراکتری که در p هست رو برابر کاراکتری که به خاطر سپرده بودی (مقدار اولیه ی t) قرار بده.
p--;
یک کاراکتر به سمت اول رشته حرکت کن.
t++;
یک کاراکتر به آخر رشته نزدیک تر شو.
puts(s);
اینو دیگه نمی دونم!
______________________________
Ch = *t;
*t=*p;
*p=ch;
تو این قسمت داره جای دو تا کاراکتر رو عوض میکنه.

متاسفانه این الگوریتم رو سر در نمی یارم و یکی از سوالامم اینه که چرا به جای --p از --p* استفاده نکرده؟
چون داره بزرگی و کوچیکی آدرس ها رو به شکل عددی نسبت به هم مقایسه میکنه نه محتوای اونا رو که کاراکتر هستن.

complexcoding
دوشنبه 14 فروردین 1391, 18:32 عصر
ممنون از کمکتون ولی خط اول رو می شه بیشتر توضیح بدین مگه strlen طول رشته رو بر نمی گردونه پس چرا منهای یک شده و چرا s+strlen شده؟؟

Ananas
دوشنبه 14 فروردین 1391, 21:04 عصر
ببینید رشته مذکور در حافظه داره از یک نقطه شروع میشه (s) و تا یک نقطه دیگه ادامه پیدا میکنه (s + length) یعنی پایان رشته و برای دسترسی به آخرین کاراکتر باید به ابتدای آخرین کاراکتر اشاره کنیم نه به انتهای رشته پس لازمه یک واحد برگردیم به قبل(-1).
اینجور کد ها رو که یکی لازمه کم یا زیاد بشن و یا حلقه های تکرار که لازمه یکی کمتر یا بیشتر باشن رو به چند روش میشه تعیین کرد :
اول به شکل مثلا سه تا یا 5 تا کاراکتر در حدی که بشه با انگشت هم شمرد پیش خودت دو دو تا 4 تا کن که راحت تر بشه تشخیص داد اگه درست باشه برای 1000 تا هم جواب میده.
دوم اینکه به شکل خونه هایی تصور کن که روی نقاط شروع یا پایان اونها حرکت میکنی بعد رو کاغذ هم میتونی رسم کنی.
سوم اگه نخواستی به مغزت فشار بیاری کافیه چند بار آزمایش کنی و راحت پیداش میکنی چون مثلا یا x هست یا x + 1 و یا x - 1 دیگه چند تا حالت بیشتر نداره. من خودم شخصا اول فسفور نمیسوزونم آزمایش میکنم اگه جواب خیلی تو در تو باشه و حلقه های مختلف تو هم باشن اونوقت مخمو به کار میگیرم و حسابشو میرسم.