دسترسی مهمان ها محدود است، برای استفاده از انجمن وارد شوید، اگر حساب کاربری ندارید ابتدا ثبت نام کنید و سپس وارد شوید.

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

مهمان گرامی، هرگونه ارسال پست نامرتبط به نام و محور موضوع انجمن از این لحظه ممنوع بوده و مشاهده آن نیز محرومیت در پی خواهد داشت.


امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
تمرین های آخر فصل هفتم « اشاره گر ها و ارجاع ها »
#1
خب بنا به درخواست دوستان مشکلاتی توی این فصل داشتن که بهتر دیدیم تمرین های آخر فصل یا همون تمرین های برنامه نویسی رو اینجا حل کنیم.
اگر پرسش های این فصل هم خواستید بگید.


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

       همیشه یادتون باشه قبل از حل کردن سوال یا نوشتن برنامه ای تحلیل کنید و قسمت قسمت کنید که بهتر هم هست که الگوریتم بنویسید.


شروع میکنیم به نوشتن تابع:
کد:
string f(int* a[],int x)
{
for(int i=0;i<10;i++)
  {
  if ( x == *(a+i) )
      return (a+i);
  }
return "null";
}


اصل این سوال دوتا چیز بود.یکی اینکه چطور با اشاره گر یه آرایه رو از توی یه تابع بررسی کنیم و دیگری اینکه آرایه رو چطور پیمایش کنیم.



طبق استاندارد این تابع ناقص هست اما طبق کتاب و کفایت استاد درسته.
درضمن توی اینجا ما خودمون، برای راحتی کارمون، آرایمون رو 10 خانه ای گرفتیم.
موفق باشید
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطA.A.G (3-30-1393، 08:27 عصر) ، sMostafaB (4-2-1393، 02:56 عصر)
#2
خب تمرین دوم.نمونش توی نمونه سوال های حل شده بود. سوال دوم نیم سال اول 92 91
http://forum.bkhost.ir/showthread.php?ti...d=36#pid36

هیچ فرقی ندارن فقط بجای int مینویسیم float.

به این صورت:

کد:
float f(int* a[], n)
{
float b[n];
for(int i=0;i<n;i++)
    b[i]=*(a+i); // meghdar dehi mishe ta halghe tamom beshe
return b[];
}



دقت کنید که چرا من نوع تابع رو فلوت گذاشتم یا توی اونجا اینت گذاشتم؟
برای این گذاشتم که میگه فلان را برگرداند.پس دستور ریترن میخواد و برای استفاده از دستور ریترن از void نباید استفاده کرد.
میشه کاری کرد که کمی پیچیده تر میشه اما تابع ما از نوع void قابل نوشتن میشه.
ما طبق استاندارد سوال نوشتیم.

موفق باشیدHeart
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطsMostafaB (4-2-1393، 02:59 عصر)
#3
خب سوال 3 این تمرین ها سرتابع رو داده بعد از ما کدهاشو خواسته.

این هم آرایه ای از نوع اشاره گر به فلوت هست.پیمایش آرایه از نوع اشاره گر رو که یاد گرفتیم.دیگه الباقیش کاری نداره.میگه اعدادشون رو با هم جمع کن.

با هم کد میزنیم و تکمیلش میکنیم:
کد:
float sum(float* p[], int n)
{
float jam=0.0;
for(int i=0;i<n;i++)
  {
  jam = jam + *(p+i);
  }
return jam;
}


دیگه به جان خودم خودش تعیین کرده بود که خروجی فلوت باشه.
اما من میتونستم بجای jam بنویسم sum اما ننوشتم چون خواستم شما راحت تر درک کنید.


موفقیتتان دو چندان باد...Heart
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (4-2-1393، 03:18 عصر)
#4
سوال 4 تمرین ها
خب برنامه چی میخواد؟ ---> ساده سازی کنیم: گفته اعداد منفی فلان جا رو تبدیل به مثبت کنه.همین.دیگه بقیشم مثل همین بالایی ها هستش.

چیزی که لازم هست برای تغییر اعداد منفی به مثبت چیه؟ قدر مطلق.توی سی پلاس با fabs هستش.جدول صفحه 135

خب کد رو............. نمیزنیم بیشتر دقت میکنیم.نوع تابع از نوع void هست.

نکته مهم... قسمت بعدی سوال گفته تبدیل بشه.چون نوع ورودی از نوع اشاره گر هست پس هر تغییری که توی تابع انجام بشه روی قسمت اصلی هم انجام میشه.


حالا کدو میزنیم:
کد:
void abs(float* p[], int n)
{
for(int i=0;i<n;i++)
   {
   *(a+i) = fabs( *(a+i) );
   }
}


به همین سادگی به همین خوشمزگی...کدنویسی MMTakalloo D
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (4-2-1393، 03:14 عصر)
#5
تمرین شماره 5

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

کد رو میزنیم:
کد:
void sort(float* p[], int n)
{
string T;
for(int i=0;i<n-1;i++)
   for(int j=0;j<n-1;j++)
      {
      if( *(p+j) > *(p+(j+1)) )
         {
         T = (p+i);
         (p+j) = (p+(j+1));
         (p+(j+1)) = T;
         }
      }
}


خب حالا ما هم مثل کتاب بگیم رسم شکلش (تریس میشه) به عهده دانشجو D
خو چیه حالا ما اینو بلد نیستیم.اون همه کتاب بلد نبود انداخت گردن دانشجو یه بارم ما بلد نیستیم میندازیم گردن دانشجو.والا;)



شوخی کردم شکلش یا همون تریسش خیلی جالبه.دوست داشتید انجام بدید.Heart
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (3-27-1393، 07:08 عصر)
#6
(3-27-1393، 07:52 عصر)S_H نوشته است: man balad nistam tereysesh konam age mishe zahmatesho bekesh
soal 5
 درود.حتما بنا به درخواست انجام میشه. کمی صبر کنید توی همین پست ویرایش میشه و گذاشته میشه.Heart


خب چون تعداد عکسا زیاد میشد و دردسر زیادی داشت خلاصه کردم.حالت اولیه که اصلا مرتب نیست و دست نخورده و حالت آخر که مرتبه

حالت اول اولیه بدون اینکه مرتبط سازی بشه:





حالت دوم آخرین مرحله بعد از مرتب سازی کامل:




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

چه اتفاقی افتاده؟
ما اومدیم آدرس خونه ای که کوچک ترین هست رو ریختیم توی خونه اول آرایه ای از نوع اشاره گرمون.
بعد آدرس خونه ای که محتواش بزرگتر هست رو ریختیم توی خونه ی دوم آرایه از از نوع اشاره گرمون.
همینطور الی آخرین خونه.Heart

اما برای درک بهتر...اون قسمت خونه ها رو یه آرایه در نظر بگیرید.
اگر ما بخوایم با استفاده از اشاره گر اینو خروجی بدیم بعد از مرتب سازیش مرتب شده نمایش میده اما اگر خود اون آرایه رو بخوایم خروجی بدیم مرتب شده نیست.Heart




کاربرد زیادی داره مخصوصا توی وب ها.نمونش لیست اعضای همین وب رو نگاه کنید صعودی و نزولی اینا داره اما وقتی شما صعودی رو میزنید یا حالت دیگه ای رو انتخاب میکنید این مرتب سازیش با اشاره گر ها هستش برای همین وقتی کسی دیگه از اون  هم زمان استفاده میکنه میتونه نزولی رو انتخاب کنه و ببینه.بدون اینکه تغییری واس اون فرد دیگه پیش بیاد.Heart:)HeartAngelHeart
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (4-2-1393، 03:14 عصر)
#7
تمرین شماره 6 متاسفانه انگاری که مشکل داره.
چون گفته بایت های درون اس را بشمارد تا به کاراکتر نال برسد.
اما چیزی که من میبینم از نوع کاراکتر تعریف کرده و ثابت هم هست.برای همین فقط به یک خونه از نوع کاراکتر اشاره میکنه و چندتا کاراکتر نیست که بگیم بشماره تا به نال برسه.

بازم شک هایی دارم که دوستانی که وارد تر هستند و میتونند حلش کنن یا حتی نظرات خودشون رو اعلام کنند.



با سپاس فراوان








با عرض پوزش دوستان پررسی کردم مبحث کمی فرق کرد.توضیحات مربوط به این مبحث رو توی همینجا میدم و در پست بعدی تمرین هایی که بشه رو حل میکنم.


خب دوستان به محل کانست دقت کنید:
کد:
const int* p;

توی این حالت که کانست قبل از نوع اشاره‌گر هست باعث میشه که محتوای p قابل تغییر نباشه و فقط قابل خواندن...
اگر p به a اشاره کنه و ما به p تو این حالت مقداری بدیم مثلا 10، محتوای متغیر a تغییر نمیکنه.بخاطر اون کانست هستش.
   *نکته واضح تر و خلاصه*: میشه آدرس درون p رو تغییر داد برای خواندن خانه بعدی حافظه یا هرچیز دیگه.فقط محتوای اشاره شده رو نمیشه تغییر داد.

حالت دوم:
کد:
int* const p;


خب حالا اینجا کانست بین نوع و اسم اشاره گر هستش.توی این حالت آدرس اشاره گر p (خانه حافظه p) غیر قابل دستکاری هستش.
زیاد مهم نیست به نظر فعلا.شما همین حد بدونید کافیه.Heart


Ideaاگر هم دوتا جا کانست بود دیگه هیچی دیگه.کاری نمیشه کرد اصلا.Exclamation



حالا میشه با این اوصاف کارو یکمی پیش برد و تمرینایی که مونده بودیمو حل کنیم.
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (4-2-1393، 03:14 عصر)
#8
تمرین شماره 6

خب دوستان توضیح بالا رو که خوندید؟گفتیم که وقتی کانست قبل از نوع باشه یعنی اینکه نمیشه محتوای خونه که بهش اشاره میکنه رو دستکاری کنه اما میتونه خونه ای که بهش اشاره میکنه رو عوض کنه.

سوال گفته تعداد بایت های درون s رو بشمره تا اینکه به کاراکتر نال برسه.یعنی چی دقیقا؟

یعنی اینکه چه مقدار فضا از خونه های پر، از نوع کاراکتر پر هستن.
از اونجایی که هر کاراکتری.فرقی نداره چی باشه.یه فضای مشخص از حافظه رو به خودش تخصیص میده(مثلا1 بایت) برای همین تا هرجایی که مخالف نال باشه کاراکتر حساب میشه.
نکته جالب: « نقطه ، ارقام اعداد ، حروف و... تماما کاراکتر هستند»


حالا باهم کدشو مینویسیم:

کد:
unsigned len(const char* s)

{
int size= sizeof(char);
unsigned total=0;
while(*s == '\0')
   {
   total = total + size;
   ++s;
   }
return total;
}




توضیحات: شرط بررسی میشه.اگر محتوای خانه غیر از صفر باشه حلقه ادامه پیدا میکنه و به مقدار اندازه اشغال شده توسط نوع کاراکتر به میزان کل اضافه میشه.
s++ باعث میشه که اتومات به اندازه تعداد بایت اندازه s همون قدر بهش اضافه بشه و درنهایت میشه گفت که یک خانه به جلو حرکت کرده.
باز بررسی میشه اگر درست باشه باز هم اضافه و دوباره یک خانه به جلو... تا جایی که به نال برسه که حلقه شکسته میشه و بعدش مقدار نهایی فضای اشغالی رو برمیگردونه.
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
 سپاس شده توسطS_H (4-2-1393، 03:14 عصر)
#9
تمرین شماره 7


با درودی دوباره خدمت عزیزان با حل تمرین شماره 7 از فصل اشاره گر ها و ارجاع ها همراهتون هستیم D

خب بریم سراغ سوال و تجزیه تحلیلش مثل همیشه...
سوال میخواد که کاراکتر ها از s2 به s1 کپی بشه.اما چیزی که هست دقیقا اینو نمیخواد.میگه که چندتا بایت از s2 میتونه توی s1 جایگزین بشه تا قبل از رسیدن به کاراکتر نال توی s2...




کد رو فعلا نمیزنم تا شما هم برید یکمی روش فکر کنید.اگر تونستید جواب بدید اینجا هم ارسال کنید.
منتظر هستیم;)
به دنیای من خوش اومدی...
هیــــــــــچ چیــــــز بـــــــی دلیــــل نیستــــــ
پاسخ
#10
جواب 7
کد:
void cpy(char*s1,const char *s2,int n)
{
int i=0;
while(i<n && *s2!='\0')
{
i++;
*s1++=*s2++;}
}
}
پاسخ
 سپاس شده توسطMMTakalloo (4-2-1393، 01:51 عصر)


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان