PDA

View Full Version : سوال: مشکل در برنامه....



...StacK...
دوشنبه 12 اسفند 1387, 19:48 عصر
سلام ...یه برنامه نوشتم که مالیات کارمندانی که از یک رنج مشخص حقوق دریافت

مکنند رو بر اساس تعرفه ای مشخص میکنه و بعد هم کارمندی که از همه بیشتر دریافت

کرده رو به خروجی میبره.....

من در این برنامه با 2 مشکل مواجه هستم و اول اونی که مهمتر هست رو میگم:

به کد نگاه کنید:



#include "stdafx.h"//program compiled with vc++25 to +
#include <iostream>
#include <conio.h>
using namespace std;
void clrscr();
int main()
{
system("color a");
short int flag=1;
int sho,ho,maxsh,max=0;
float mal=0;
cout<<"please first enter sho than enter ho by a space betwen them\n::";//har bar recorde 6 karmand daryaft khaha shod
while(flag){
if (flag%7==0){
cout<<"\nfor continue press c and for exit press any key:";
if (getch()!='c')break;
}
cin>>sho>>ho;
if(ho>=400001 && ho <=500000)
{
mal=(float)(ho - 400000) * (float)(10/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho>=500001 && ho<=700000)
{
mal=(float)(ho-500000) * (float)(15/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho>1000000){
mal=(float)(ho-1000000) * (float)(17/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho<=400000)
cout<<"\nkarmandi ba shomare karmandi:"<<sho<<" moaaf az maliyat mibashad\n";
else cout<<"\nin meghdar az hoghoogh :"<<ho<<" kharej az renje barname mibashad\n";
if(ho>max){
max=ho;
maxsh=sho;
}
flag++;
}//end of while loop
cout<<"\nbishtarin daryafti marboot be karmandi ba shomare:"<<maxsh<<" va hoghooghe:"<<max<<" mibashad";
getch();
return 0;
}
//start clrscr function
void clrscr()
{
system("cls");
}
/*this program coded by mr.a*
i hope that you enjoy from it*/


حالا به یک نمونه از خروجی برنامه نگاه کنید:


[/COD

please first enter sho than enter ho by a space betwen them
::1 350000 2 450000 3 550000 4 650000 5 750000 6 1000001
karmandi ba shomare karmandi:1 moaaf az maliyat mibashad
maliyate hoghooghe karmandi ba shomare karmandi:2=0
maliyate hoghooghe karmandi ba shomare karmandi:3=0
maliyate hoghooghe karmandi ba shomare karmandi:4=0
in meghdar az hoghoogh :750000 kharej az renje barname mibashad
maliyate hoghooghe karmandi ba shomare karmandi:6=0
for continue press c and for exit press any key:
bishtarin daryafti marboot be karmandi ba shomare:6 va hoghooghe:1000001 mibashad

چرا مقدار مالیات رو حساب نمیکنه؟؟؟؟ و فقط صفر میده

حالا خودم هم دارم کد دوباره با دقت مطالعه میکنم ...

SamaPic
دوشنبه 12 اسفند 1387, 22:48 عصر
با سلام خدمت دوست عزيز.
شما داريد اين برنامه را با ويژال مي نويسيد .
شما يك بار حداقل اين برنامه را بصورت دستي تريس كنيد متوجه مي شويد.
كنار خط اول مين چپ كليك كن سپس F5 را بزن تا اجرا بشه .براي ادامه دادن و رفتن به خط بعدي برنامه هر بار دكمه ي F10 را بزن.
سپس به متغير ها نگاه كن و ببين كجا صفر مي شود.
خودت مشكلش را متوجه مي شوي.
شما كه از ويژال استفاده مي كنيد نبايد همچين اشكالي را بپرسيد.
مطالبي را كه با رنگ آبي مشخص كردم فقط محض ياد آوري بيان كردم هرچند كه مي دانم شما خودتان اين مطالب را بهتر از من مي دانيد.
اميد وارم موفق شوي .
خدانگهدار.

elyascomputer
سه شنبه 13 اسفند 1387, 22:09 عصر
اگه اشتباه نكنم بايد اشتباه تو اين خط باشه


mal=(float)(ho - 400000) * (float)(10/100);
و بجاي اون از كد زير استفاده كن ( ساير فرمول ها هم همين طور)


mal=(float)(ho - 400000) * (float)(0.01);

elyascomputer
سه شنبه 13 اسفند 1387, 22:24 عصر
راستي توي كد زير يك نكته اي هست كه بعضي وقتا كار دست ادم مي ده


int sho,ho,maxsh,max=0;

اين دستور فقط مقدار متغير max را برابر صفر قرار مي دهد و مقدار سه متغير ديگر مشخص نيست.

...StacK...
سه شنبه 13 اسفند 1387, 22:38 عصر
راستي توي كد زير يك نكته اي هست كه بعضي وقتا كار دست ادم مي ده


int sho,ho,maxsh,max=0;

اين دستور فقط مقدار متغير max را برابر صفر قرار مي دهد و مقدار سه متغير ديگر مشخص نيست.


دو تاشون از ورودی مقداردهی میشن و اون یکیشم به صورت انتساب ,و در محاسبه

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

(ولی در کل باید بر روی این مسائل دقت کرد)

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


mal=(float)(ho - 400000) * (float)(0.10);

ولی چرا vc++ با اینکه type casting کردم محاسبه رو باز هم محاسبه


10/100 رو صفر در نظر میگیره؟؟؟؟؟

...StacK...
سه شنبه 13 اسفند 1387, 22:53 عصر
برنامه رو در کامپایلر g++ لینوکس هم کامپایل کردم هیچ تتفاوتی نداشت:


#include <iostream>//compiled with g++ in linux or cygwin compilers
using namespace std;
int main()
{
system("clear");
short int flag=1;
int sho,ho,maxsh,max=0;
float mal=0;
cout<<"please first enter sho than enter ho by a space betwen them\n::";//har bar recorde 6 karmand daryaft khaha shod
while(flag){
if (flag%7==0){
cout<<"\nfor continue press c and for exit press any key:";
if (cin.get()!='c')break;
}
cin>>sho>>ho;
if(ho>=400001 && ho <=500000)
{
mal=(float)(ho - 400000) * (float)(10/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho>=500001 && ho<=700000)
{
mal=(float)(ho-500000) * (float)(15/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho>1000000){
mal=(float)(ho-1000000) * (float)(17/100);
cout<<"\n maliyate hoghooghe karmandi ba shomare karmandi:"<<sho<<"="<<mal<<endl;
}
else if(ho<=400000)
cout<<"\nkarmandi ba shomare karmandi:"<<sho<<" moaaf az maliyat mibashad\n";
else cout<<"\nin meghdar az hoghoogh :"<<ho<<" kharej az renje barname mibashad\n";
if(ho>max){
max=ho;
maxsh=sho;
}
flag++;
}//end of while loop
cout<<"\nbishtarin daryafti marboot be karmandi ba shomare:"<<maxsh<<" va hoghooghe:"<<max<<" mibashad";
cin.get();
return 0;
}


مثل اینکه جز ansi c++ هست...

emad_67
سه شنبه 13 اسفند 1387, 23:25 عصر
ولی چرا vc++ با اینکه type casting کردم محاسبه رو باز هم محاسبه
وقتی طرفین عملگر تقسیم یک عدد صحیح باشه، تقسیم صحیح انجام میشه نه اعشاری. برای همینه که جواب صفر هست. به vc++ ربطی نداره همه به این شکل عمل میکنن.

SamaPic
سه شنبه 13 اسفند 1387, 23:30 عصر
با سلام خدمت دوست عزيز.
اين طور كه از برنامه ي شما بر مي آيد ، شما در محيط ويژال برنامه ي خود را نوشته ايد.
آن را در توربو اجرا كنيد ببينيد كه آيا باز هم مشكلي دارد يا نه.
من خودم بار ها شده برنامه اي را در ويژال نوشته ام و با ارور يا موارد ديگر روبرو شده ام ، ولي وقتي در توربو اجرا كردم ديدم هيچ مشكلي ندارد.
براي مثال من مدتي پيش براي برنامه ي 8 وزير كد زير را در اول برنامه استفاده كردم و برنامه در ريپ مي افتاد و ... .



for (i=0;i<=8;i++)
for (j=0;j<=8;j++)
a[i][j]=1;


اين تقريبا همان كد است با كمي تغيير.
من همان برنامه را در توربو اجرا كردم و جواب داد.
جالب تر از همه اين كه من اين كد را در ويژال 2005 اجرا كردم در ريپ افتاد و وقتي در 2008 اجرا كردم فقط اين كد را تا i=1 اجرا مي كرد و سپس از برنامه خارج مي شد.
خدانگهدار.

Nima_NF
چهارشنبه 14 اسفند 1387, 01:28 صبح
وقتی می خواهید دو عدد را به صورت اعشاری تقیسم کنید باید حد اقل یکی از متغیر ها (یا عدد) را به float یا double تبدیل کنید. در حالی که شما ابتدا تقیسم را انجام می دهید و سپس جواب آن را که صفر هست به float تبدیل می کنید.

پس باید به این شکل بنویسید (به پرانتز دقت کنید):



float y = (float)10/100 ;

به شکل فوق ابتدا 10 به 10.0 تبدیل می شود و سپس تقسیم بر 100 می شود.

به شکل دیگر، کد فوق چیزی مانند کد زیر است:



float y = ( (float) 10) / 100 ;

...StacK...
چهارشنبه 14 اسفند 1387, 10:17 صبح
وقتی می خواهید دو عدد را به صورت اعشاری تقیسم کنید باید حد اقل یکی از متغیر ها (یا عدد) را به float یا double تبدیل کنید. در حالی که شما ابتدا تقیسم را انجام می دهید و سپس جواب آن را که صفر هست به float تبدیل می کنید.

پس باید به این شکل بنویسید (به پرانتز دقت کنید):



float y = (float)10/100 ;




به شکل فوق ابتدا 10 به 10.0 تبدیل می شود و سپس تقسیم بر 100 می شود.







به شکل دیگر، کد فوق چیزی مانند کد زیر است:






float y = ( (float) 10) / 100 ;












دقیقا .!!!

من کمی ذهنیتم در مورد عملگر / به پاسکال بود که حاصل تقسیم عددی

به صورت
10/ 100 رو به صورت اعشاری میداد و برای تقسیم صحیح

از عملگر div استفاده میکردیم.