PDA

View Full Version : گفتگو: آیا این موارد باگ cهستند؟



smahdi1991
جمعه 08 آبان 1388, 06:45 صبح
سلام عزیزان من یه آماتور در زبان c هستم ودر حال حاضر تازه شروع به c خوندن کردم من در یکی از تمرین هایی که داشتم حل میکردم یهو متوجه شدم یه محاسبات اشتباه انجام میشه که نو این برنامه من وقتی از int استفاده میکنم محاسبات غلط واما وقتی از doubleاستفاده میکنم محاسبات درست از آبدر میاد در صورتی که تمام بخش ها درسته میخواستم بدونم این مشکل cیا نه یا مشکل بر نامه ی منه لطفا راهنماییم کنید:
متن برنامه:

//in the name of god
//this program is coded by BOSS(WWW.TD2009.TK (http://www.td2009.tk/))
#include <stdio.h>
#include <conio.h>
#define i 2.54
int main()
{
int x;
printf("ye adad vared konid:");
scanf("%d",&x);
printf("%d",i*x);
getch();
return 0 ;
}

smahdi1991
جمعه 08 آبان 1388, 07:05 صبح
اینم از برهمون برنامه حالا با doubleنوشته شده که این درست کار میکنه ولی اون که با int نوشته شده نمی دونم چرا کار نمیکنه لطفا منو راهنمایی کنید تا این مشکل رو بفهمم از کجاست و رفعش کنم


//in the name of god
//this program is coded by BOSS(WWW.TD2009.TK (http://WWW.TD2009.TK))
#include <stdio.h>
#include <conio.h>
#define i 2.54
int main()
{
double x;
printf("ye adad vared konid:");
scanf("%lf",&x);
printf("%lf",i*x);
getch();
return 0 ;
}

xxxxx_xxxxx
جمعه 08 آبان 1388, 08:19 صبح
خب شما خروجیتون همواره عددی‌ست اعشاری پس بجای %d بنویسید %f


printf("%f",i*x);

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

smahdi1991
جمعه 08 آبان 1388, 08:33 صبح
ممنون از پاسختون ولی منم اینو میدونم که اینطوری درست میشه من میخوام بدونم که چرا وقتی که از d% استفاده میکنم چرا بهم جواب بی ربط میده مگه نباید با %d عدد رو صحیح کنه و نشون بده؟من سوالم اینه لطفا راهنماییم کنید

xxxxx_xxxxx
جمعه 08 آبان 1388, 09:56 صبح
چرا وقتی که از d% استفاده میکنم چرا بهم جواب بی ربط میده
دستورات مشابه printf و scanf و از این قبیل دستورات شما باید قبل از انجام عمل موردنظر نوع فرمت خروجی/ورودی رو تعیین کنید. و مقداری که دریافت یا چاپ میشه بر اساس اون فرمت تعیین میشه.
مثلاً شما هیچ وقت نمیتونید یک عدد در محدوده اعداد حقیقی رو بایک عدد در محدوده اعداد صحیح مقایسه کنید. حالا double یک نوع حقیقی هست و int صحیح.
این دستورات رو نگاه کنید:


int x = 65;
printf("x= %d ", x);
printf("x= %c", x);

در هر دو دستور printf مقدار متغیر x رو چاپ کردیم. اما یک بار با فرمت عدد صحیح و یک بار با فرمت کاراکتر.


مگه نباید با %d عدد رو صحیح کنه و نشون بده؟
نه این کار به طور خودکار انجام نمیشه. Type Casting به عهده برنامه نویس هست.

smahdi1991
جمعه 08 آبان 1388, 13:39 عصر
سلام . خیلی ممنونم
اما این جواب من نیست .
ببینید من انتظار داشتم جوابی که دریافت میکنم تنها بخش اعشاریش از بین بره! چرا که با توجه به اینکه مثلا
وقتی من یه داده یا عدد دابل رو در یک متغیر صحیح میریزم بخش اعشار اون بالطبع از بین میره!
اما تو اون مثال نمیدونم چرا اینطور نشد!
یعنی جواب محاسبه i*x با فرض اینکه i عدد 2.5 هست . و x هم 1 مثلا! جواب حاصله یک عدد دابل خواهد بود! 2.5000000! مثلا! و خوب این عدد در یک متغییر از نوع صحیح اگه وارد بشه طبعا باید ما 2 رو دریافت کنیم!( که تو مثالهای دیگه دریافت میکنیم! ) اما انیجا! نه ! یک عدد بیربت میده!
حالا چرا نمیدونم!؟

shask00l
جمعه 08 آبان 1388, 19:03 عصر
ببین دوست عزیز

توی c وقتی شما توی یه رشته محاسباتی از چند نوع متغییر استفاده میکنی . همیشه جواب اون عبارت از نوع طولانی ترین نوع بکار رفته در عبارته . مثلا اگه توی یک عبارت 2تا int و 3تا char و 1دونه double داشته باشی ..جواب مطمئنا از نوع double هست . حالا اگه این جوابو توی یک متغییر از نوع دیگه ذخیره کنی با توجه به نوع متغییر و طولش مقداری از اطلاعات حذف میشه .

توی برنامه ای که من توی پست اولت دیدم ... مقدار رو بصورت مستقیم چاپ کردی . وقتی مقدار رو مستقیم به خروجی میفرستی اون عمل تبدیلی که در موردش صحبت کردیم انجام نمیشه . به همین دلیل جواب اشتباهه .

دوتا پیشنهاد برات دارم.
1. مقدار i*x رو توی یه متغییر از نوع int بریز بعد با همون فرمان نمایش بده .
2. بجایi*x توی فرمان printf بنویس (int)(i*x) .

موفق باشید

smahdi1991
شنبه 09 آبان 1388, 06:05 صبح
ممنون از راهنماییت شاسکول ولی نیدونم چرا وقتی این کارو میکنم همیشه 0 جواب میشه //in the name of god
//this program is coded by BOSS(WWW.TD2009.TK)
#include <stdio.h>
#include <conio.h>
#define i 2.54
int main()
{
int x,y;
y=x*i;
printf("ye adad vared konid:");
scanf("%d",&x);
printf("%f",y);
getch();
return 0 ;
}

shask00l
شنبه 09 آبان 1388, 08:43 صبح
#include <stdio.h>
#include <conio.h>
#define i 2.54
int main()
{
int x,y;
printf("ye adad vared konid:");
scanf("%d",&x);
y=x*i;
printf("%d",y);
getch();
return 0 ;
}


اینو امتحان کن

smahdi1991
شنبه 09 آبان 1388, 10:22 صبح
ممنونم از شاسکول شما همتون دارید میگید که این کارو کنم برنامه درست میشه من هم همه ی این چیزا رو بلد هستم من گیرم از همون اول اینه که چرا x*i در پرینت اف غلط جواب میده لطفا در باره ی این موضوع صحبت کنید
(در کل خودم باس راهنمایی تون کنم:به نظرم چون

#define i 2.54
رو از همون اول ثابت کردم شاید چون در ضرب میخواد اونو رند کنه ارور می ده)

حامد مصافی
شنبه 09 آبان 1388, 11:53 صبح
اگر توکنی شامل عدد و علامت "." باشد آن مقدار در c نوع float در نظر گرفته می شود. لذا توکن های زیر همگی float هستند:

2.54
5.00
3.14

هر عبارت واگذاری در زبان c یک مقدار برگشتی دارد، بدیهیست که این مقدار باید یک نوع داشته باشد،
مثال : مقدار برگشتی واگذاری در خط دوم عبارت زیر عدد 3 از نوع int خواهد بود


int a1 = 3;
int a2 = a1;

پس شما می توانید این مقدار برگشتی را به یک متغیر دیگر نسبت دهید!

int a1 = 2;
int a2;
int a3 = a2 = a1; //!!!


اگر یکی از متغیر های فوق float می بود نتیجه برگشتی هم float می شد.

در مثال شما i یک توکن از نوع float تلقی می شود.
نتیجه x * 1 هم float خواهد بود.

با این دانسته ها بدیهی و بی نیاز به توضیح اضافیست که این حاصل عبارت با نوع int سازگار نخواهد بود و باید از یکی از انواع float یا double (به دلیل ممیز دار بودن) استفاده شود.

smahdi1991
یک شنبه 10 آبان 1388, 17:26 عصر
ممنون از توضیحاتتون من یه برنامه یه دیگه هم نوشتم که نمی دونم چرا درست عمل نمی کنه

//in the name of god

#include<stdio.h>
int main()
{
int x,y;
char c;
printf("\nPlease Enter 2 operands :");
scanf("%d%d",&x,&y);
printf("please Enter desigred operator(+/*)");
scanf("%c",&c);
printf("x = %d,,y = %d Operator:%c\n",x,y,c);
if (c == '*' )
{
printf("x * y = :%d",x*y);
}

else if (c == '+' )
{
printf("x + y:%d",x+y);
}
else
printf("error happened!");

return 0;
}



لطفا علاوه بر اون بگید که من بعد از وارد کردن عدد اول باید اول اینتر رو بزنم و بعد عدد دوم رو وارد کنم و بعد اینتر و بعدش + یا * رو وارد کنم ؟ در ضمن وقتی اینتر نزنم و همه رو با هم یه جا بنویسم اون موقع درسته ولی تو حالت اول نیدونم چرا غلط میده

حامد مصافی
دوشنبه 11 آبان 1388, 09:41 صبح
به ترتیب زیر باید ورودی ها وارد شوند:


عدد اول، اینتر
عدد دوم، اینتر
کاراکتر اوپراتور

البته می توان با تغییر کد به شکل زیر نتیجه بهتری گرفت!


//in the name of god

#include<stdio.h>
int main()
{
int x,y;
char c;
printf("\nPlease Enter a statement :");
scanf("%d%c%d", &x, ,&c, &y); //look at this line ;-)
//printf("x = %d,,y = %d Operator:%c\n", x, y, c);

if (c == '*' )
{
printf("x * y = :%d",x*y);
}
else if (c == '+' )
{
printf("x + y:%d",x+y);
}
else
printf("error happened!");

return 0;
}

smahdi1991
سه شنبه 12 آبان 1388, 19:49 عصر
از همه ی دوستان به خاطره پاسخ های عالیشون ممنونم به خصوص بک دال عزیز

smahdi1991
یک شنبه 17 آبان 1388, 09:47 صبح
سلام عزیزان دوباره برنامه ای جدید نوشته شده توسط این جانب با موضوعات عجیب که بنده مثل اینکه تخصصم اینه که این جور برنامه ها رو بنویسم متاسفانه نمی دونم چرا انطوری میشه ولی خوب اینم خیلی خوبه چون این باعث می شه هم من و هم خیلی از افراد دیگه که این موضو عات رو هم بلد نبودن به این مو ضو عات آشنا بشند
خو ب برنامه ی بعدی هم اینه:


//in the name of god
#include<stdio.h>
#include <string.h>
int main()
{
int i;
char *h= "hello",*wyn="whats your name?";
char *ic ="i`m computer",*imk = "im ok",*intmy ="its nice to meet you";
char *hayaway="how are you?",*wysh ="where your say hello?";
char c[80];
for (i=1;i<=5;i++)
{

puts("start conversation");
scanf("%s",c);
if (!strcmp(c,h))
{
printf("%s",h);
printf("%s",hayaway);
scanf("%s",imk);
if(!strcmp(c,imk))
printf("%s \t %s",imk,hayaway);
}
else
printf ("%s",wysh);
}
return 0;
}



من نمی دونم چرا این برنامه اجرا نمی شه لطفا نفر مایید که این طوری بنویس تا درست کار کنه فقط بگید علتش چیه که جواب نمی ده یعنی یا کامپایل نمی شه یا اگر هم بشه وسط کار اشتباه میگیره(در visualC++‎ و code blocks اجرا نمیشه اما تو pelec c اجرا میشه ولی وسط کار ارور می ده) بعدش لطفا بگید که چه کنم تا درست بشه
پیش پیش ممنون

حامد مصافی
یک شنبه 17 آبان 1388, 09:57 صبح
لطفاً متن خطاهای دریافتی را ذکر کنید

smahdi1991
یک شنبه 17 آبان 1388, 12:35 عصر
بک دال عزیز این برنامه if آخر رو اجرا نمی کنه در ضمن این فقط بالا اومدنش توی pelec c و لی توی code block یا visual بالا نمیا د وارو می ده که میگه not found در کل یه بار اجراش کنین تا ببینیید چه اروری می ده

smahdi1991
سه شنبه 19 آبان 1388, 19:25 عصر
این برنامه نمی دونم چرا حتی نشون نمی ده عیبش یا مشکلش از کجاس اگر کسی می دونه لطفا راهنمایی کنه

smahdi1991
پنج شنبه 21 آبان 1388, 19:25 عصر
کسی قصد نداره به سوالم جواب بده و این موضوع رو برام کمی شفاف کنه ؟
لطفا راهنمایی کنید:گریه::گریه::گریه:

Nima_NF
جمعه 22 آبان 1388, 13:41 عصر
شما اگر از کامپایلرهای جدید مانند ++visual C استفاده کنید، خیلی دقیق و راحت مشکل را پیدا می کنید. حتی خودتان می توانید خط به خط trace کنید.

از نظر فنی و باگ به این کد باید نمره صفر داد. باید خیلی مواظب مواردی باشید که ایجاد باگ امنیتی می کنند.

چند اشتباه در کدهای شما هست:
1- حتما برای دریافت رشته طول را تعیین کنید، با گذر از بازه طول رشته bug فوق خطرناک در برنامه شما ایجاد می شود. (برای تمای جاهای که از s% و scanf استفاده کرده اید)



char c[80];
//scanf("%s",c); remove this
scanf("%79s",c);



2- شما imk را از ورودی می گیرید در حالی که آن را یک اشاره گر به رشته تعریف کرده اید. شما باید آن را مانند c و h تعریف کنید یا اگر اشاره گر تعریف می کنید، باید با malloc به آن حافظه تخصیص دهید:




char *imk = "im ok"; // remove this
char imk[80];
scanf("%79s", imk);


در حالت debug در کامپایلر های جدید خطا دریافت می کنید، چرا که هوشمند تر هستند.

smahdi1991
جمعه 22 آبان 1388, 17:39 عصر
ممنون از توضیحات کامل و عالی تون آقا نیما
این موضوع باعث شد آگاه تر بشم ممنون از این لطفتون