PDA

View Full Version : گفتگو: مشکل این کد محاسباتیم چیه ؟



hackman
دوشنبه 23 اردیبهشت 1392, 11:09 صبح
سلام
این قطعه کد زمان ورود و خروج خودرو بهش میدم و محاسبات هزینه ای توقف در پارکینگو انجام میده
فقط نمیدونم چرا وقتی totalHours بیشتر از 85 میشه هزینرو 0 نشون میده

این قسمت زمان توقف در پارکینگ رو محاسبه میکنه :

TimeSpan dif = outTime - inTime;
float totalHours = float.Parse(dif.TotalHours.ToString());

primaryTime و primaryPrice متغیرهایی هستن که زمان اولیه و هزینه اولیه را نگهداری میکنن مثلا 2 ساعت اول 1000 تومن

secTime و secPrice هم زمان و مبلغ اضافی رو نگهداری میکنه . مثلا بعد از 2 ساعت اول هر 1 ساعت اضافی 500 تومن

اینم کد محاسباتم :

long finalPrice = 0;
float secHours = totalHours - primaryTime;
if (totalHours < primaryTime || totalHours == primaryTime)
finalPrice = primaryPrice;
else if (totalHours > primaryTime)
{
int temp = Convert.ToInt32(secHours / secTime);
if (float.Parse(temp.ToString()) < (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice + secPrice;
else if (float.Parse(temp.ToString()) == (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice;
}

چرا وقتی totalHours از 85 بیشتر میشه finalPrice صفر میشه ؟؟؟؟

zayens
دوشنبه 23 اردیبهشت 1392, 12:58 عصر
یه خورده کدهات گنگه
برنامتو بذار(همین یه تیکشو) تا اجرا کنیم و بفهمیم چی به چیه؟

hackman
دوشنبه 23 اردیبهشت 1392, 14:23 عصر
اینم برنامه


104137

zayens
دوشنبه 23 اردیبهشت 1392, 15:32 عصر
خب ببین دوست من وقتی از
if (float.Parse(temp.ToString()) < (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice + secPrice;
else if (float.Parse(temp.ToString()) == (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice;
استفاده میکنی باید حواستو جمع کنی که همه ی شرایط را در بر بگیری تا این اتفاق نیوفته
اگر عدد 85 را دستی وارد کنی توی این کد و تریس کنی خواهی دید که finalPrice نه در if اول و نه در دومی محاسبه نمیشه چون اصلا شرطش را دارا نیست
این مورد فقط برای 85 نیست و اگر شما 4 - 16 - 25 - 34 - 46 و ... را هم بذاری باز جواب صفر میشه چون هیچ وقت داخل هیچ کدوم ازین if ها نمیفته
راه حل
درین جور موارد سعی کن همیشه یه else ، آخره شرطت بذاری که اگر هیچکدوم اجرا نشد این else آخری اجرا بشه
مثل این

if (float.Parse(temp.ToString()) < (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice + secPrice;
else if (float.Parse(temp.ToString()) == (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice;
else
finalPrice = temp * secPrice + primaryPrice;

zayens
دوشنبه 23 اردیبهشت 1392, 15:33 عصر
یه نکته مهم دیگه اینکه تشکر یادت نره

hackman
دوشنبه 23 اردیبهشت 1392, 16:03 عصر
خب ببین دوست من وقتی از
if (float.Parse(temp.ToString()) < (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice + secPrice;
else if (float.Parse(temp.ToString()) == (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice;
استفاده میکنی باید حواستو جمع کنی که همه ی شرایط را در بر بگیری تا این اتفاق نیوفته
اگر عدد 85 را دستی وارد کنی توی این کد و تریس کنی خواهی دید که finalPrice نه در if اول و نه در دومی محاسبه نمیشه چون اصلا شرطش را دارا نیست
این مورد فقط برای 85 نیست و اگر شما 4 - 16 - 25 - 34 - 46 و ... را هم بذاری باز جواب صفر میشه چون هیچ وقت داخل هیچ کدوم ازین if ها نمیفته
راه حل
درین جور موارد سعی کن همیشه یه else ، آخره شرطت بذاری که اگر هیچکدوم اجرا نشد این else آخری اجرا بشه
مثل این

if (float.Parse(temp.ToString()) < (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice + secPrice;
else if (float.Parse(temp.ToString()) == (secHours / secTime))
finalPrice = temp * secPrice + primaryPrice;
else
finalPrice = temp * secPrice + primaryPrice;


بسیار بسیار ممنووووووووون

در واقع چون temp رو به int تبدیل میکنم مقدارش گرد میشه و به عددی بزرگتر از secHours / seTime تبدیل میشه که تو شرطام نیست

ایووول داداش

zayens
دوشنبه 23 اردیبهشت 1392, 16:37 عصر
بسیار بسیار ممنووووووووون

در واقع چون temp رو به int تبدیل میکنم مقدارش گرد میشه و به عددی بزرگتر از secHours / seTime تبدیل میشه که تو شرطام نیست

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