PDA

View Full Version : سوال: چگونگی تشخیص بزرگ بودن دو عدد از لحاظ مقدار



farzad.sharifi
پنج شنبه 30 خرداد 1387, 15:33 عصر
سلام دوستان
من دو تا عدد و بصورت رشته گرفتم یعنی با دستور ()gets اما حالا می خواهم یه دستور بنویسم که اگه مقدار عدد اول بزرگتر از عدد دوم وارد شده بود یه کاری انجام بده ، اما نمیدونم چطوری؟ آخه دو عدد بصورت رشته اند. ممنون میشم کسی راهنمائی کنه .برنامه رو با c نوشتم

Nima_NF
پنج شنبه 30 خرداد 1387, 16:24 عصر
ابتدا آن رشته های عددی را با استفاده از تابع atoi به متغیر عدد تبدیل کنید و سپس مثل اعداد آن ها را مقایسه کنید.



#include <stdlib.h>

char *str = "12345"
int value = atoi( str );

farzad.sharifi
پنج شنبه 30 خرداد 1387, 17:33 عصر
من دو تاعددو اول تعریف کردم بعد با حلقه همه آرایه هاشو صفر کردم بعد با دستور gerts دو تا عددو گرفتم آگه ممکنه طبق این کدی که نوشتم رشته هارو به عدد تبدیل کنید ممنون میشم


char num1[12];
char num2[12];
for (i=0;i<12;++i)
{
num1[i]='0';
num2[i]='0';
}
gets(num1);
gets(num2);

s++ 68-87
پنج شنبه 30 خرداد 1387, 18:42 عصر
اگه مانعی برای استفاده از تابع ها نباشه می تونین از تابع atoi برای تبدیل رشته به int استفاده کنین. که تو هدر stdlib.h قرار داره.
کارش هم این جوریه که یه رشته بهش می دین (اینجا اسم رشتتون num1 و num2 هستش) و این تابع عدد معادل رو به صورت int برمی گردونه عدد برگشتی رو تو یه متغییر ذخیرش می کنین (مثلا adad1 و adad2 ) و در این صورت به راحتی می تونین روشون کار کنین مقایسه کنین یا جمع و تفریق و ...


#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main()
{
char num1[12];
char num2[12];
int adad1,adad2;
for (int i=0;i<12;i++)
{
num1[i]='0';
num2[i]='0';
}
gets(num1);
gets(num2);
adad1=atoi(num1);
adad2=atoi (num2);
cout<<(adad1+adad2);
return 0;
}

farzad.sharifi
پنج شنبه 30 خرداد 1387, 21:18 عصر
تابع atoi رو امتحان کردم برای عدد های کمتر از 6 رقم جواب می داد آما اگه دو عدد از شش رقم بیشتر باشن دیگه کار ساز نیست . اصل موضوع اینه که من می خواهم دو عدد n رقمی رو از هم کم کنم بخاطر همین دو عددو بصورت رشته گرفتم این دو شرط هم اولش تعریف شده که دو عدد مثبت باشند و طول عدد اول بزرگتر مساوی عدد دوم باشه، این تابعی رو هم که می خواستم تشخیص بده کدوم عدد بزرگتر برای حلقه ی زیر بود. ممنون میشم آگه بتونید اینو اصلاح کنید .



adad1=atoi(num1);
adad2=atoi(num2);
def=strlen(num1)-strlen(num2);
len=(strlen(num1)>=strlen(num2) ? strlen(num1): strlen (num2));

for(i=len-1;i>=0;--i)
{
if((num1[i]-48)>=(num2[i-def]-48))
result[i+1]=(num1[i]-48)-(num2[i-def]-48);
else
{
if((num1[i]-48)<(num2[i]-48)&&adad2>adad1)
result[i+1]=(num2[i]-48)-(num1[i-def]-48);
else
{
if((num1[i]-48)<(num2[i-def]-48)&&adad1>adad2)
result[i+1]=((num1[i]-48)+10)-(num2[i-def]-48);
if((num1[i-1]-48)==0)
{
num1[i-1]=num1[i-1]+9;
num1[i-2]=num1[i-2]-1;
}
else
num1[i-1]=num1[i-1]-1;
}
}
}
for(i=1;i<=len;++i)
printf("%d",result[i]);

عدد 48 رو از هر آرایه کم کردم تا کاراکترو به عدد تبدیل کنه

s++ 68-87
پنج شنبه 30 خرداد 1387, 23:02 عصر
تو کد زیر بالاخره یه جایی می رسه که i=0 می شه و از def کوچیکتر می شه و num2[-1] بی معنیه.

result[i+1]=(num1[i]-48)-(num2[i-def]-48);

farzad.sharifi
جمعه 31 خرداد 1387, 07:24 صبح
اگه i کوچکتر از def بشه اون آرایه رو صفر در نظر میگیره و درست جواب میده مشکل اصلی تو این دو قطعه کد هستش:


else
{
if((num1[i]-48)<(num2[i]-48)&&adad2>adad1)
result[i+1]=(num2[i]-48)-(num1[i-def]-48);

در کد بالا اگه عدد دوم از عدد اول کوچکتر باشه می یاد عدد دوم رو منهای عدد اول میکنه اما همانطور که گفتم مشکلش اینه که آگه دو عدد از 6 رقم بیشتر باشه دیگه adad2>adad1 کارساز نیست.



else
{
if((num1[i]-48)<(num2[i-def]-48)&&adad1>adad2)
result[i+1]=((num1[i]-48)+10)-(num2[i-def]-48);
if((num1[i-1]-48)==0)
{
num1[i-1]=num1[i-1]+9;
num1[i-2]=num1[i-2]-1;
}
else
num1[i-1]=num1[i-1]-1;


تو این کد هم میاد میبینه اگه عدد اول از عدد دوم بیشر باشه ولی آرایه اندیس آخر عدد اول کوچکتر از آرایه اندیس آخر عدد دومی باشه آرایه آخر عدد اول بعلاوه عدد 10 میکنه و از آرایه آخرعدد دوم کم میکنه و ...
اما مشکلش اینجاست که اگه دو عدد از شش رقم بیشتر باشن دیگه adad1>adad2 کار ساز نیست

s++ 68-87
جمعه 31 خرداد 1387, 10:43 صبح
اگه i کوچکتر از def بشه اون آرایه رو صفر در نظر میگیره و درست جواب میده
متوجه نشدم در صورتی که i کوچکتر از def بشه چطور ارایه رو صفر می زاره

تو شرطاتون همین i-def رو اوردین و یه جاهایی هم اوردین که num2 [i] رو بررسی می کنه
درصورتی که احمتمال داره num2[i] اصلا وجود نداشته باشه مثلا num2 دو رقمی باشه و num1 5 رقمی در ان صورت num2[i] بی معنیه



مشکلش اینه که آگه دو عدد از 6 رقم بیشتر باشه دیگه adad2>adad1 کارساز نیست.

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

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

farzad.sharifi
جمعه 31 خرداد 1387, 11:58 صبح
تو کد زیر بالاخره یه جایی می رسه که i=0 می شه و از def کوچیکتر می شه و num2[-1] بی معنیه.


شما درست می گفتید وقتی i=0 می شه و از def کوچکتر میشه دیگه بی معنی میشه
یه دستور اضافه کردم این مشکل حل شد ، تقریبا بقیه مشکل ها نیز حل شد. در ضمن در ورودی شرط این بود که طول عدد اول از طول عدد دوم بیشتر هستش نه مقدارش ،
به خاطر راهنمایتون ممنون
دستوری وجود داره که اگه یه شرط برقرار بود بره مثلا از خط بیستم برنامه رو اجرا کنه یعنی همه ی کدهارو رو اجرا نکنه فقط قسمتی از کد هایی که می خواهیم اجرا بشن رو اجرا کنه؟
ممنون میشم راهنمائی کنید

s++ 68-87
جمعه 31 خرداد 1387, 12:10 عصر
خواهش می کنم
خوب طولش بیشتر باشه مقدارشم صد در صد بیشتره دیگه مگه این که بزرگتر مساوی باشه
چی کارش کردین که رشته با طول بیشتر از 6 رو به عدد تبدیل کنین؟

این دستور همون goto هستش که تا حالا خودم استفاده نکردم و بهتره استفاده نکنین چون مشکل ایجاد می کنه تو برنامه!
باید با حلقه هاو break و while و اینا یه طوری الگوریتمشو بنویسین

farzad.sharifi
جمعه 31 خرداد 1387, 13:15 عصر
خوب طولش بیشتر باشه مقدارشم صد در صد بیشتره دیگه مگه این که بزرگتر مساوی باشه
چی کارش کردین که رشته با طول بیشتر از 6 رو به عدد تبدیل کنین؟

مشکل همون بزرگتر مساوی بود از تابع atoi نمی شد استفاده کرد به جاش برای اینکه تشخیص بده عدد دوم بزرگتر از عدد اوله یا برعکس از:


if(num1[0]>num2[0]&&strlen(num1)==strlen(num2))
{
for(i=len-1;i>=0;--i)
{
if((num1[i]-48)>=(num2[i-def]-48))
{ result[i+1]=(num1[i]-48)-(num2[i-def]-48);
continue;
}
else
{
if((num1[i]-48)<(num2[i-def]-48))
result[i+1]=((num1[i]-48)+10)-(num2[i-def]-48);
if((num1[i-1]-48)==0)
{
num1[i-1]=num1[i-1]+9;
num1[i-2]=num1[i-2]-1;
}
else
num1[i-1]=num1[i-1]-1;
}
}
}

یه بارم باید برای حالتی بنویسیم که اگه num1[0]<num2[0 باشه و فقط جای num1 رو با num2 رو تو کد بالا عوض می کنیم.
و در حالتی که طول عدد دوم از طول عدد اول بیشتره میاد جای دو تا عدد رو عوض میکنه در نهایت عدد اول(طول بزرگتر) رو منهای عدد دوم(طول کمتر) میکنه


if(strlen(num1)!=strlen(num2))
همون حلقه ی بالا


مرسی

s++ 68-87
جمعه 31 خرداد 1387, 13:34 عصر
یعنی اصلا نمی شه رشته ای که طولش زیاده رو به عدد تبدیل کرد!!!مثلا 20 رقم!!
تابعی یا...!!

farzad.sharifi
جمعه 31 خرداد 1387, 14:43 عصر
یعنی اصلا نمی شه رشته ای که طولش زیاده رو به عدد تبدیل کرد!!!مثلا 20 رقم!!
تابعی یا...!!

نمیدونم شاید بشه

با توجه به گفته شما من برای اینکه بخواهم با توجه به شرط فقط قسمتی از کد ها اجرا بشه از while استفاده کردم مثل نمونه زیر


while(شرط اول)
{ دستورات
printf("A")
)
while (شرط دوم)
{ دستورات

printf("B")
}
while (شرط سوم)
{ دستورات

printf("C")
)


اما یه مشکلی است می خواهم وقتی یکی از شرط ها برقرار بود مقدار مورد نظر رو چاپ کنه و برنامه تموم شه و بقیه شرط هارو چک نکنه میشه راهنمائی کنید

s++ 68-87
جمعه 31 خرداد 1387, 17:23 عصر
یه for می تونین بزارین (اگه جا داره) بعد while ها رو توش بنویسین و اگه یه break بزارین کلا از for می یاد بیرون یعنی از while هام جارج می شه

یا یه while (1) این یعنی این که تا زمانی که 1 درسته و این همیشه درسته با یه break می تونین از حلقه برین بیرون

MSJazayeri
جمعه 21 تیر 1387, 03:25 صبح
کدشو نوشتم فقط include و main و اینجور چیزاشو درست کن یه for و switch هم هست که نوشتم چطوری کامل کنی.