PDA

View Full Version : سوال: شکل تعریف آرایه در کتاب آقای مقسمی (فوری)



JaVa
شنبه 04 خرداد 1392, 17:35 عصر
سلام و خسته نباشید به دوستان خوبم.

در کتاب ساختمان داده آقای مقسمی در صفحه 73 تعریف آرایه رو به این صورت انجام دادن :

A:Array[L1..U1] of type;
همونطور که بینید با تعریف آرایه در سی پلاس پلاس خیلی تفاوت داره!!

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


Address (x[i])=Base(x)+i*Size of type

من چطور باید این تعریف Array[L1..U1] رو به این صورت در بیارم Array[r1]

با تشکر

FastCode
شنبه 04 خرداد 1392, 18:26 عصر
T a[U1-L1];
a-=L1;
چرا فوری؟

http://www.cplusplus.com/doc/tutorial/arrays/

JaVa
یک شنبه 05 خرداد 1392, 08:33 صبح
در همین کتاب آقای مقسمی در صفحه 73 نوشته که برای بدست آوردن تعداد عناصر آرایه(آرایه یک بعدی) باید از این رابطه استفاده کرد U1-L1+1 که برای همون مثال جوابش شده 16 حالا این رابطه که من نوشتم از این قراره :
Base(x) = آدرس شروع حافظه
i خانه i ام
Size of type اندازه نوع آرایه

ولی وقتی جایگزاری می کنیم Address (x[i])=100+16*6=196 جواب حاصله با جواب کتاب یکی در نمی آد؟؟!!!!!!

در ضمن اون نوع تعریف برای زبان پاسکال هست. که برای تبدیلش به سی پلاس نمی دونم چکار باید کرد!!!!!

با تشکر

FastCode
یک شنبه 05 خرداد 1392, 09:10 صبح
برای اینکه ۱۰۰+۱۶ باید داخل پرانتز باشه

JaVa
یک شنبه 05 خرداد 1392, 14:09 عصر
جوابی که توی کتاب در آورده 166 هست.!:متفکر:

اینم صورت مسئله :: آرایه A:Array[5..20] of real تعریف شده است. اگر این آرایه از آدرس 100 حافظه به بعد قرار گرفته شده باشدآدرس خانه A[16] کدام است :


با تشکر فراوان.

FastCode
یک شنبه 05 خرداد 1392, 16:00 عصر
برای همین هیچ موقع کتاب فارسی استفاده نمیکنم.واقعا همشون آشغالن.
یکی باید بیاد بفهمه آقای مترجم کدوم دیکشنری جلوش باز بوده و با کدوم معنی حال کرده و چی نوشته.
166=83*2=100+(2*3*11)=100+(6*11)
شما خودت ببین چه ربطی داره

JaVa
دوشنبه 06 خرداد 1392, 21:15 عصر
سلامی دوباره.

دوست گرامی میشه یه خورده توضیحی بدی تا منم متوجه منظورتون بشم.:لبخندساده:

با تشکر فراوان/

FastCode
دوشنبه 06 خرداد 1392, 21:21 عصر
سلامی دوباره.

دوست گرامی میشه یه خورده توضیحی بدی تا منم متوجه منظورتون بشم.:لبخندساده:

با تشکر فراوان/
مشکل همینه.هیچ کس متوجه نمیشه.من هم نمیفهمم منظورکتاب چی بوده.
اگر کسی دیگه ای متوجه میشه لطفا من رو هم روشن کنه.

بهزاد علی محمدزاده
دوشنبه 06 خرداد 1392, 23:08 عصر
سلام . این شبه کد هست ، و مربوط به کتاب ساختمان داده سیمور لیپ شوتز ( اگر اشتباه نکنم ) . آقای مقسمی اینها رو جمع آوری و کتاب می کنه .

در این مثال ، حد بالای آرایه که میشه U یا همون Upper ، شده 20 که اگر از حد پایین کم کنیم ، یعنی U و مخفف ،Upper اونوقت با یک جمع کنیم میشه 16 . تعداد آرایه ما 16 تاست . در نوع Type آرایه اگر ضرب کنیم ، فضایی که این آرایه گرفته مشخص میشه . نوع آرایه real هست . اگر 6 بایت باشه . 16 × 6 = 166

JaVa
دوشنبه 06 خرداد 1392, 23:21 عصر
اینم صورت مسئله :: آرایه A:Array[5..20] of real تعریف شده است. اگر این آرایه از آدرس 100 حافظه به بعد قرار گرفته شده باشدآدرس خانه A[16] کدام است :


در این مثال ، حد بالای آرایه که میشه U یا همون Upper ، شده 20 که اگر از حد پایین کم کنیم ، یعنی U و مخفف ،Upper اونوقت با یک جمع کنیم میشه 16 . تعداد آرایه ما 16 تاست . در نوع Type آرایه اگر ضرب کنیم ، فضایی که این آرایه گرفته مشخص میشه . نوع آرایه real هست . اگر 6 بایت باشه . 16 × 6 = 166

6*16=96

این مقدار حافظه ای است که توسط آرایه در حافظه اشغال میشود. حالا می خوایم که آدرس خانه 16 رو بدست بیاریم که با توجه به اون رابطه کخ من اون بالا نوشتم میشه : 196=6*16+100 که در کتاب آقای مقسمی نوشته 166!!!!!

بهزاد علی محمدزاده
دوشنبه 06 خرداد 1392, 23:27 عصر
عجب محاسبه مسخره ایی انجام دادم . با ماشین حساب ویندوز 7 انجام دادم ، روی مد statistics بود ( دارم درس آماری می خونم ) یه لحظه با صفحه کلید زدم 16 × 6 حساب کرد 166 !!! الان یه نگاه به کتاب میندازم .

بهزاد علی محمدزاده
دوشنبه 06 خرداد 1392, 23:32 عصر
تعداد عناصر ارایه شده 16 . اما برای آدرس خانه فرمول فرق می کنه .
i که اندیس هست و یعنی 16 رو از کران پایین یعنی L1 = 5 کم کرده ، شده 11 . در 6 ضرب کرده و بعلاوه 100 که میشه 166

JaVa
سه شنبه 07 خرداد 1392, 08:28 صبح
تعداد عناصر ارایه شده 16 . اما برای آدرس خانه فرمول فرق می کنه .
i که اندیس هست و یعنی 16 رو از کران پایین یعنی L1 = 5 کم کرده ، شده 11 . در 6 ضرب کرده و بعلاوه 100 که میشه 166

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

FastCode
سه شنبه 07 خرداد 1392, 15:22 عصر
Windows:)

چطوری ۵ تا ۲۰ رو گرفته ۱۶ تا؟
الکی + ۱ کرده.
کلا اصول آدرس دهی رو برده زیر سوال.

میشه کلا ویندوز seven و کتاب فارسی و اینارو بی خیال بشید و از روی CLRS بخونید؟

بهزاد علی محمدزاده
سه شنبه 07 خرداد 1392, 16:06 عصر
104759

آرایه بالا رو در نظر داشته باش . اگر با 1 جمع نشه ، یه اندیس کم میاریم ، یعنی خود اندیس اول رو در نظر نمی گیره . پس همیشه با یک جمع می کنیم .

شوتز مثال آورده : یک شرکت فروشنده اتومبیل از یک آرایه AUTO برای ثبت تعداد اتومبیل های فروخته شده هر سال از 1932 تا 1984 استفاده می کند . به جای اینکه مجموعه اندیس ها از 1 شروع شود، بهتر است از 1932 شروع شود . طوری که :

104760

آنگاه : UB - LB + 1 = 1984 - 1930 + 1 = 55

.................................................. .................................................. ....................

فرمولهای برای آرایه دو بعدی فرق می کنه .

FastCode
سه شنبه 07 خرداد 1392, 16:15 عصر
من ISO/IEC n3290 رو بیشتر از شوتز قبول دارم.
اینها کد C++‎‎‎ نیست ولی اگر C++‎‎‎ روزی LBound اضافه کنه این شکلی میشه



int a[0]; //0
int a[1]; //1
int a[2]; //2

int a[0..0]; //0

int a[0..1]; //1
int a[1..1]; //0

int a[0..2]; //2
int a[1..2]; //1
int a[2..2]; //0

به نظر من وقتی 0.. به اول تعریف یک آرایه اضافه میشه نباید تغیر کنه.
اگر اشتباه نکنم VB6 این مشکل رو داشت(مثل روش شوتز بود).(1998)
C++‎‎‎‎ فعلی از +1 استفاده نمیکنه(2011)
همینطور C#‎‎‎,java,C,VB.Net,MASM,....

کلا سعی کن کتابهایی رو که 1-based هستن رو نخونی.ذهن آدم رو داغون میکنن.

بهزاد علی محمدزاده
سه شنبه 07 خرداد 1392, 17:01 عصر
این مشکل نیست . یه روشه . ما نمی خوایم این و بدیم به توابع ( متد ها ) برامون محسابه کنند . قراره برنامه نویس این کار رو انجام بده . و اگر بخواد انجام بده ، یعنی فقط کران بالا - کران پایین بشه کافیه ؟ کتاب رو هم بذاریم کنار شما یه اندیس کمی میاری . لینک (http://blogs.msdn.com/b/ericgu/archive/2004/03/18/92353.aspx)

شما زبان هایی رو که گفتین ، منظورتون این هست که + 1 رو گذاشتن کنار . یه رفرنس می تونید بدین که کران بالا رو - کران پایین می کنند بدون + 1 ؟

یا مراجعه کنیم به کتاب CLRS‌ تا ببینیم بدون + 1 انجام داده ؟

( یادت باشه که نمیذاری من درس بخونم، اگر نمره ام کم شد مقصری ها ... )

FastCode
سه شنبه 07 خرداد 1392, 17:28 عصر
همه ی زبونهای جدید 0-based هستن که cpu کامپیوتر و برنامه نویس رو مشغول +1 و -1 نکنند.
آخرین زبون 1-based ای که من سراغ دارم vb6 ه.
چرا وقتی 10 تا عدد نیاز دارم بنویسم 0..9 چرا ننویسم 10 یا 0..10 ؟
شما چند وقت یک بار یک آرایه مثل 1953 تا 2010 نیاز داری؟من تا امروز نیاز نداشتم و ترجیح میدم اگر نیاز داشتم ۱۰ ۲۰ تا مارژین هر طرف اضافه بزارم که برنامم دچار خطا نشه.
اون refernce ای که دادید شاید قشنگ باشه ولی به طرز افتضاحی افتضاحه چون برای هر دسترسی دو عمل تفریق انجام میده(یکی در کد و دیگری در دات نت) و برای ساختن آرایه هم به جز تفریق یک جمع هم انجام میده.در صورتی که خود دات نت Lower Bound رو پشتیبانی میکنه.
http://stackoverflow.com/questions/56446/net-arrays-with-lower-bound-0
پاسخ دوم


You'd probably want to sanity check start and end in the constructor. Requesting an index that's out of range *should* throw an IndexOutOfRangeException, IMHO.

ArgumentException