PDA

View Full Version : تشخیص نول از صفر



aidin110
جمعه 03 آذر 1391, 18:21 عصر
سلام دوستان ، من میخوام بدونم چطوری میشه نول رو از صفر تشخیص داد؟
من یه آرایه از نوع short دارم که توسط کاربر مقدار دهی میشه حالا ممکنه کاربر مقدار صفر رو تو یکی از خونه ها بذاره و من در این مواقع در بدست آوردن طول آرایه به مشکل میخورم ! میخواستم بدونم روشی هست که خونه ی مقدار دهی شده با صفر رو از نول بشه تشخیص داد؟
طول آرایه رو از روش زیر محاسبه میکنم اگه روش بهتری بلدین بگین لطفا دیگه دارم خود زنی میکنم ...

while(array[i])
i++

farghabil
جمعه 03 آذر 1391, 18:37 عصر
if(a==null){
condition
}

aidin110
جمعه 03 آذر 1391, 18:42 عصر
نه دیگه این همین کدیه که خودم ازش استفاده میکنم...

farghabil
جمعه 03 آذر 1391, 18:50 عصر
نه دیگه این همین کدیه که خودم ازش استفاده میکنم...


والا ماکه همیشه اینطوری null رو از صفر تشخیص میدیم
اگه بقیه چیزه بهتری بلدن به ما هم بگن

aidin110
جمعه 03 آذر 1391, 18:53 عصر
میخوام بدونم روشی هست که خونه ای که مقدار دهی شده رو از خونه ای که مقدار دهی نشده رو تشخیص داد؟ مقداردهی اولیه...

مسعود اقدسی فام
جمعه 03 آذر 1391, 19:18 عصر
زبان برنامه‌نویسی ++C مثل #C نیست که وقتی یک شی تعریف می‌کنی مقدار اولیه null یا مثلا برای اعداد صحیح صفر رو بده. وقتی می‌نویسید int a یه متغیر دو بایتی یا چهار بایتی تعریف می‌شه که چهار بایت از حافظه رو به خودش اختصاص می‌ده. همون لحظه دستور چاپ رو بزنید می‌بینید که یه عدد چاپ شد. اون عدد در واقع صفر و یک‌هایی هستن که داخل اون چهار بایت از قبل بود. یعنی دست بهشون نمی‌زنه. شاید یه بار دیگه اجرا کنید یه جای دیگه حافظه اختصاص بده و یه عدد دیگه نشون بده.

حالا من نمی‌دونم شما چه استفاده‌ای می‌کنید که عدد صفر یعنی خاتمه. چون NULL همون عدد صفر هستش. اگه انتهای رشته منظورتونه که کاراکتر صفر با عدد صفر فرق داره.

هدفتون رو بگید شاید بتونیم بهتر کمک کنیم.

aidin110
جمعه 03 آذر 1391, 19:45 عصر
همونطور که بالا هم عرض کردم یه آرایه ی 50 تای از نو شورت درست کردیم که خونه های اونو کاربر پر میکنه حالا اگه کاربر عدد صفر رو وارد کنه طول آرایه صحیح بدست نمیاد، فرض کنید کاربر اینطوری وارد کنه:
1 2 0 6 3
با روشی که بالا گفتم طول آرایه 2 حساب میشه ، حالا روش دیگه وجود داره؟

مسعود اقدسی فام
جمعه 03 آذر 1391, 20:00 عصر
همونطور که بالا هم عرض کردم یه آرایه ی 50 تای از نو شورت درست کردیم که خونه های اونو کاربر پر میکنه حالا اگه کاربر عدد صفر رو وارد کنه طول آرایه صحیح بدست نمیاد، فرض کنید کاربر اینطوری وارد کنه:
1 2 0 6 3
با روشی که بالا گفتم طول آرایه 2 حساب میشه ، حالا روش دیگه وجود داره؟

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

aidin110
جمعه 03 آذر 1391, 20:16 عصر
بذارید یه بار دیگه توضیح بدم
ببینید ما یه آرایه داریم فرض کنید 50 تا عنصر داره چون آرایه از نوع short هستش کاربر میتونه هر عددی رو تو هر عنصر قرار بده من میخوام تعداد عناصری که کاربر مقدار دهی کرده رو محاسبه کنم و این عملیات رو با روش زیر حساب میکنم:

int i =0;
while(array[i] != NULL)
i++

حالا وقتی تو یکی از عناصر صفر باشه وسطا از حلقه میاد بیرون چون صفر معادل NULL هستش ، میخوام بدونم جز این روش روش دیگه ای هست ک طول آرایه رو بدست آورد؟
(فرض کنید این آرایه رو مثل آرایه های کاراکتری cin میکنیم و هر عددی که کاربر وارد میکنه مثل 123 ، هر کدوم تو یه خونه ذخیره میشه ، 1 تو اولی 2 تو دومی و... )

صفر هم آخر آرایه نیست. امیدوارم اینبار خوب توضیح داده باشم....

مسعود اقدسی فام
جمعه 03 آذر 1391, 20:31 عصر
خب منم عرض کردم که وقتی یه آرایه یا متغیر تعریف می‌کنید اعداد اون کاملا تصادفی مقدار دهی می‌شن. NULL هم که به قول شما همون عدد صفر هست. اگه می‌خواید انتها رو تشخیص بدید چاره‌ای ندارید جز اینکه یا از اول تعداد رو بپرسید یا یک عدد رو به عنوان عدد آخر مشخص کنید. اگه صفر به هر دلیلی نمی‌شه مثلا می‌تونید 1- رو بذارید. خلاصه اینکه اینجا #C نیست که null یه چیز باشه و صفر و اعداد دیگه یه چیز. شما وقتی با آرایه‌ای از اعداد کار می‌کنید مجبورید با عدد کار کنید. انتها رو با یه عدد مشخص کنید. حالا صفر یا هر عدد دیگه‌ای.

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

aidin110
جمعه 03 آذر 1391, 20:38 عصر
برنامه ای که طراحی شده درواقع کاراکتر رو به عدد تبدیل میکنه ، یعنی اول کاربر بصورت کاراکتری وارد میکنه بعد با یه تابع کاراکترها تبدیل به عدد میشه و میرن داخل این آرایه که الان داریم درموردش بحث میکنیم!

مسعود اقدسی فام
جمعه 03 آذر 1391, 20:51 عصر
برنامه ای که طراحی شده درواقع کاراکتر رو به عدد تبدیل میکنه ، یعنی اول کاربر بصورت کاراکتری وارد میکنه بعد با یه تابع کاراکترها تبدیل به عدد میشه و میرن داخل این آرایه که الان داریم درموردش بحث میکنیم!

اگه رشته باشه که خب کاراکتر صفر و خود صفر یا NULL مشخص هستن و کاملا جدا. وقتی کاراکتر صفر وارد می‌شه کد اسکی اون یه عدد دیگست. صفر نیست. شما این شرط رو قبل تبدیل به عدد بذار تا بتونی بشمری. حین تبدیل مشکلی پیش نمی‌یاد.
اگه به صورت کاراکتر به کاراکتر دریافت می‌کنی (مثلا با cin.get یا getch) چطور آخر ورودی رو تشخیص می‌دی؟ اگه غیر عدد وارد کنه؟ خلاصه یه چیزی باید باشه دیگه.

منظورم اینه که ما همیشه انتها رو با یه چیزی مشخص می‌کنیم. اگه رشته باشه با NULL مشخص می‌شه. اگه آرایه‌ای از یه تعداد کاراکتر دریافت می‌کنیم (یعنی نه تریپ رشته) بازم یه تموم‌کننده‌ای براش قائلیم. هینطور برای آرایه‌ای از اعداد

مسعود اقدسی فام
جمعه 03 آذر 1391, 20:54 عصر
اگه کاراکتر به کاراکتر وارد می‌کنه پس نمی‌تونه منفی وارد کنه دیگه. هر وقت ورودی با هر روشی که دریافت کردی تموم شد و عددها رو تبدیل کردی و آرایه ریختی. تهش یه 1- بذار.

aidin110
جمعه 03 آذر 1391, 21:00 عصر
ممنون آقا مسعود همینم توذهنم بود که اگه صفر نشد یه چیز دیگه بذارم.


اگه رشته باشه که خب کاراکتر صفر و خود صفر یا NULL مشخص هستن و کاملا جدا. وقتی کاراکتر صفر وارد می‌شه کد اسکی اون یه عدد دیگست. صفر نیست. شما این شرط رو قبل تبدیل به عدد بذار تا بتونی بشمری. حین تبدیل مشکلی پیش نمی‌یاد.
چون برنامه که نوشتم دو عدد 500 رقمی رو با هم جمع میکنه به خاطر همین نمیشه قبل از اینکه تبدیل کرد شرط رو بذارم.

H_G_G_I
جمعه 03 آذر 1391, 23:24 عصر
معمولا فقط تو رشته ها ازین روش استفاده میشه من جای دیگه ندیدم !
عوض اینکار شما می تونی اندازه ارایه رو تو یه متغیر دیگه ذخیره کنی و راحت شی !
یا اینکه تو خونه اول ارایه اندازه ارایه رو نگه داری!:لبخندساده:
یابهترش اینکه یه کلاس ارایه بنویسی ! با تمپلیت ها !

hadi0x7c7
جمعه 03 آذر 1391, 23:40 عصر
این شاید جواب بده:



int a[whatever];
int len = sizeof(a) / sizeof(int)


الته ارایه باید static باشه نه dynamic . واسه short هم به همین ترتیب.
الته بهترین حالت اینه:

#define SIZE ((int) (sizeof(a) / sizeof(a[0])))

_test_
سه شنبه 07 آذر 1391, 14:21 عصر
کد اسکی 0 , 48 هست , ولی کد اسکی نال , 48 نیست :D