50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

مشکل در عدم درک یک کد سی پلاس پلاس از مبحث آرایه ها

من توی فصل آرایه های زبان C++ مشکلات زیادی دارم و چون تازه ترم ۳ هستم و ساختمان داده و طراحی الگوریتم و... رو هم نخوندم یکم درک کد ها برام سخته

یه کد دارم که یک بازه از ۳۰ عدد دریافت میکنه و بعد نمایش میده که هر عدد چند بار در بازه تکرار شده

من توی فصل آرایه های زبان C++ مشکلات زیادی دارم و چون تازه ترم ۳ هستم و ساختمان داده و طراحی الگوریتم و... رو هم نخوندم یکم درک کد ها برام سخته

یه کد دارم که یک بازه از ۳۰ عدد دریافت میکنه و بعد نمایش میده که هر عدد چند بار در بازه تکرار شده
||http://tosinso.com/files/get/2445d58d-b3fb-46ca-b81d-e172c4af8f26||
کد:
<cpp>
#include <iostream>

using namespace std;

int main()
{
    int i, j;
    int p[] = {0,1,2,3,4,5,6,7,8,9,
               2,3,6,8,4,1,0,6,3,4,
               3,7,7,8,6,0,1,2,3,2};
    int f[10];
    for(i=0; i<10; i++){
         f[i]=0;
    }
    for(j=0; j<30; j++){
         f[p[j]]++;
    }
    cout << pool\tfreq\n;
    for(i=0; i<10; i++){
         cout << i << \t << f[i] << \n;
    }
        return 0;
}
<cpp>
بر طبق تصویر بالا:
1- آرایه ها رو از 0 تا 9 همگی رو میگیره و عدد 0 رو میریزه توی اون که باید همه اونا رو به 0 تبدیل کنه. اگه اینجوری باشه که کلا باید صفر بشه... پس این جا چه عملی اتفاق می افته؟
2- اینجا از 0 تا 30 رو میشماره
کلا نمیتونم درک کنم در این دو مکان چی میشه و آخرش و F(i) رو از کجا میاره و چاپ میکنه

لطفا یکم برام توضیح بدید که در این کد چی میشه

کد:

#include <iostream>

using namespace std;

int main()
{
    int i, j;
    int p[] = {0,1,2,3,4,5,6,7,8,9,
               2,3,6,8,4,1,0,6,3,4,
               3,7,7,8,6,0,1,2,3,2};
    int f[10];
    for(i=0; i<10; i++){
         f[i]=0;
    }
    for(j=0; j<30; j++){
         f[p[j]]++;
    }
    cout << "pool\tfreq\n";
    for(i=0; i<10; i++){
         cout << i << "\t" << f[i] << "\n";
    }
        return 0;
}

بر طبق تصویر بالا:

1- آرایه ها رو از 0 تا 9 همگی رو میگیره و عدد 0 رو میریزه توی اون که باید همه اونا رو به 0 تبدیل کنه. اگه اینجوری باشه که کلا باید صفر بشه... پس این جا چه عملی اتفاق می افته؟

2- اینجا از 0 تا 30 رو میشماره

کلا نمیتونم درک کنم در این دو مکان چی میشه و آخرش و F(i) رو از کجا میاره و چاپ میکنه

لطفا یکم برام توضیح بدید که در این کد چی میشه

پرسیده شده در 1395/03/21 توسط

11 پاسخ

0

الان جواب رو بعد از کلی فکر کردن فهمیدم

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

حلقه دوم از 0 تا 30 رو میره و به هر عدد که رسید یکی اضافه میکنه و عمل اصلی در همینجا هست

حلقه آخر هم چاپ میکنه

فقط یه سوال برام پیش اومده:

در حلقه دوم

f[p[j]]++;

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

پاسخ در 1395/03/21 توسط
0

حلقه دوم که فقط یکی بهش اضافه میکنه و از 1 تا 30 رو یکی یکی جلو میره

نمیدونم چرا برام قابل درک نیست...

چیکار کنم تا متوجه بشم؟

پاسخ در 1395/03/21 توسط
0

دوست عزیز اگر بر روی کاغذ نوشتین و به نتیجه نرسیدین بهتره از یکی دوستانتون بخواین به صورت حضوری براتون توضیح بده

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

پاسخ در 1395/03/21 توسط
2

دوست عزیز عمل شمارش توی حلقه دوم داره انجام میشه اونجا که داره مقادیر خانه های آرایه f رو ++ می کنه یعنی داره اونارو میشمره بعدش در حلقه سوم اول i رو چاپ می کنه و جلوش تعداد تکرار شدن i رو چاپ می کنه

پاسخ در 1395/03/21 توسط
3

شما دو تا آرایه داری یه آرایه که عدد ها داخلشه آرایه P

یک آرایه هم برای شمارش این عدد ها استفاده میشه آرایه F

جواب سوال یکت رو تو سوال قبلی گرفتی (زمانی که شما هد Variable در برنامه تعریف میکنی داخلش یه چیزی هست بقولی Null نیست)

برای همین در حلقه اول تمام آرایه F ( از [F[0 تا [F[9 ) رو 0 میکنه اینم حتما میدونی آرایه از 0 شروع میشه

جواب سوال دومت

اعدادی که سوال داده از 0 تا 9 هست برای همین F رو هم 10 خانه تعریف کرده از [F[0 تا [F[9

تو حلقه دوم میاد آرایه P رو یکی یکی میخونه میزاره تو F بعد یکی به F اضافه میکنه

مثلا برای j=0 که میشه [P[0 که میشه خود 0

0 رو میزاره تو F (یعنی [F[0 ) بعد به [F[0 یکی اضافه میکنه یعنی ما در آرایه P یک عدد 0 داریم

همینطور برای j=1 میاد [F[1 یکی اضافه میکنه

یا برای j=17 که دوباره میشه [P[17 که میشه 0 میاد به [F[0 یکی دیگه اضافه میکنه که میشه 2 یعنی ما 2 تا 0 داریم تو آرایه

اصل کار برنامه تو همین حلقه بود

تو حلقه سوم میاد F رو کامل چاپ میکنه که میشه تعداد تکرار هر عدد درحلقه P

امیدوارم خوب توضیح داده باشم

پاسخ در 1395/03/21 توسط
0

بخش 2 رو متوجه شدم

اما بخش 1 برام قابل درک نیست! چون این بخش همه آرایه ها رو صفر میکنه و کلا باید جواب ما صفر بشه :(

حال کدوم بخش داره عمل شمارش رو انجام میده؟

پاسخ در 1395/03/21 توسط
3

سلام به شما Itpro ای عزیز.

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

مکانیزم برنامه ای که شما گذاشته اید به این صورت است.

30 تا عدد را تک تک بگیر

با توجه به عددی که بررسی می کنی خانه متناظر آن عدد را یکی اضافه کن برای مثال اگر ما به عدد 3 رسیدیم خانه شماره 3 از آرایه f را یکی افزایش می دهیم.

در قسمت دوم هم چنین کاری کرده است. یعنی یک حلقه گذاشته است که کل 30 عدد از آرایه p را بشمارد و می گوید که [j]p چند است. همان خانه را یکی افزایش بده اگر بخواهیم کد بالا را باز کنیم به شکل زیر خواهد شد

int temp=p[j];
f[temp]++;

با توجه به کد بالا در نظر بگیرید که مقدار temp برابر 1 است پس خانه شماره 1 از آرایه f یکی اضافه خواهد شد.

پاسخ در 1395/03/21 توسط
2

دوست عزیز در تکمیل توضیحات دوستان جدول trace حلقه دوم رو برای شما ترسیم کردم البته تا چرخش مرتبه 20 که در حلقه دوم مقدار j برابر با 19 می شود :

علامت پیکان را به معنی «معادل است با» در نظر بگیرید.

دوست عزیز در تکمیل توضیحات دوستان جدول trace حلقه دوم رو برای شما ترسیم کردم البته تا چرخش مرتبه 20 که در حلقه دوم مقدار j برابر با 19 می شود :
علامت پیکان را به معنی «معادل است با» در نظر بگیرید.
||http://programming.tosinso.com/files/get/db411762-d471-4886-a79c-b285630de4f7||
پاسخ در 1395/03/21 توسط
0

حلقه اول: (از نظر من جوابش باید این بشه)

f[0]=0 f[1]=0 f[2]=0 f[3]=0 f[4]=0 f[5]=0 f[6]=0 f[7]=0 f[8]=0 f[9]=0

حلقه دوم: (از نظر من جوابش باید این بشه)

f[1] f[2] f[3] ... f[30]

حلقه سوم: (از نظر من جوابش باید این بشه)

تعداد i ها رو از 0 تا 9 پشت سر هم چاپ میکنه (به صورت صحیح)

مشکل اصلی اینجاس:

تعداد f[i] ها رو هم باید همگی 0 چاپ کنه. پس عمل شمارش وجود نداره و همه باید صفر بشن

پاسخ در 1395/03/21 توسط
0

روی کاغذ هم که نوشتم به نتیجه نرسیدم

چون در حلقه اول همه اعداد صفر میشن

در حلقه دوم از 0 تا 30 رو میشماره

در حلقه سوم عمل چاپ رو انجام میده

سایتی هست که به صورت آنلاین مرحله به مرحله برام انجام بده؟

پاسخ در 1395/03/21 توسط
2

یک راه خوب برای درک اینجور برنامه ها اینه که شما مرحله به مرحله هر حلقه رو بر روی کاغذ پیاده سازی کنی و ببینی که در هر مرحله مقادیر متغیر ها و آرایه ها چه تغییراتی می کنه به این کار trace میگن و یه روش خیلی خوبه

پاسخ در 1395/03/21 توسط

پاسخ شما