الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خطأ مع الدالتين scanf و printf

بدأه ms.ROR في 16 نوفمبر 2010 · 7 رد · 811 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

البرنآمـج ~ يحسب محيط أو مسآحة للشكـل اللي بغآه اليوزر . .

يعني أول أقوله : أدخل الشكل المطلوب .. (مربع أو مثلث أو مستطيل أو دآئرة ) ؟؟ > يختآر اليوزر الشكل ..

وبعديـن أقولـه : أختر العملية المطلوبة اللي هي حساب المحيط أو المسآحـة ..؟

بس البرنآمج مو رآضي يطلع معآيآ .. ؟ مآ أعرف وش الخطأ .. ؟

#include <stdio.h>
#include <conio.h>

   void main()
{
   int base,height,s,tr1,tr2,tr3,sr,width,length,radius ;
   char sh ,co ;
   double PI ; 

   printf (" T=Triangle \n S=Square \n R=Rectangle \n C=Circle \n \n Enter the Shape : ");

   scanf ("%c",&sh);

   switch (sh)
   {
  	 case 't':
     case 'T':
       printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
       scanf("%c", &co);
       switch (co)
                {
                case 'a' :
                case 'A' :
                   printf("Enter The Base : ");
                   scanf("%d",&base);
                   printf("\n Enter The Height : ");
                   scanf("%d",&height);
                   s=((base*height)/2)  ;
                   printf("The Solution = %d",&s);
                   break;
                case 'c' :
                case 'C' :
                   printf("Enter The Three Ribs of Triangle : ");
                   scanf(" %d %d %d ", &tr1,&tr2,&tr3);
                   s=tr1+tr2+tr3  ;
                   printf("The Solution = %d",&s);
                   break ;
                }
    break ;
    case 's':
	 case 'S':
       printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
       scanf("%c,&co");
       switch (co)
                {
                case 'a' :
                case 'A' :
                   printf("Enter The Rib : ");
                   scanf("%d",&sr);
                   s=sr*4;
                   printf("The Solution = %d",&s);
                   break;
                case 'c' :
                case 'C' :
                   printf("Enter The Rib : ");
                   scanf("%d",&sr);
                   s=sr*sr ;
                   printf ("The Solution = %d",&s);
                   break ;
                }


    break;
    case 'r':
	 case 'R':
       printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
       scanf("%c,&co");
       switch (co)
                {
                case 'a' :
                case 'A' :
                   printf("Enter The Width : ");
                   scanf("%d",&width);
                   printf("\n Enter The Length : ");
                   scanf("%d",&length);
                   s=width*length  ;
                   printf("The Solution = %d",&s);
                   break;
                case 'c' :
                case 'C' :
                   printf("Enter The Width : ");
                   scanf("%d",&width);
                   printf("\n Enter The Length : ");
                   scanf("%d",&length);
                   s=width+length  ;
                   printf("The Solution = %d",&s);
                   break;
                }

    break;
    case 'c':
    case 'C':
       printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
       scanf("%c,&co");
        switch (co)
                {
                case 'a' :
                case 'A' :
                   printf("Enter The Radius : ");
                   scanf("%d",&radius);
                   PI=3.14 ;
				   s=radius*radius*PI  ;
                   printf("The Solution = %d",&s);
                   break;
                case 'c' :
                case 'C' :
                   printf("Enter The Radius : ");
                   scanf("%d",&radius);
                   PI=3.14 ;
				   s=2*radius*PI  ;
                   printf("The Solution = %d",&s);
                   break;
               }

   default : printf("error");
   break;
   }
  getch();
}

هو البرنآمج يطلعلي الأخطآء .. بس أنـآ مآ أعرف أقرئهـآ .. !!

بلييز أي مسآعده .. لآزم أسلم الوآجـب .. :unsure:

السطر 3 :

hoomewooek.cpp(12): warning C4996: 'scanf': This function or variable may be unsafe.

Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

السطر 5 :

hoomewooek.cpp(19): error C3071: operator '%' can only be applied to an instance of a ref class or a value-type

السطر 6 :

hoomewooek.cpp(102): warning C4244: '=' : conversion from 'double' to 'int', possible

السطر 7 :

hoomewooek.cpp(110): warning C4244: '=' : conversion from 'double' to 'int', possible loss of data

#2

عندك عدة أخطاء ، مثلاً :

scanf("%c,&co");

خطأ مطبعي ، والصحيح طبعاً إضافة بارمترين :

scanf("%c",&co);

هذا الخطأ موجود في أكثر من موضع .

الشيء الثاني :

ألاحظ تصرّف غريب مع scanf إذا استقبلت متغيّر من نوع char . لا أعرف السبب بصراحة ، ولكن أرى استخدام getch أو استقبال مصفوفة نصية s% .

الشيء الثالث :

الدالة printf لا تستقبل عنوان متغيّر ، فهي لاتخزن فيه شيء ، إنما تستقبل نسخة من المتغير لطباعة قيمته وليس طباعة عنوانه في الذاكرة ، يعني من الخطأ كتابة :

printf("The Solution = %d",&s);

ولكن نكتب :

printf("The Solution = %d", s);

هذا البرنامج بعد التعديلات الطفيفة ( يجب التأكد منه قبل تسليمه ) :

#include <stdio.h>
#include <conio.h>

void main()
{
	int base,height,s,tr1,tr2,tr3,sr,width,length,radius ;
	char sh ,co ;
	double PI ; 

	printf (" T=Triangle \n S=Square \n R=Rectangle \n C=Circle \n \n Enter the Shape : ");

	scanf ("%c",&sh);

	switch (sh)
	{
	case 't':
	case 'T':
		printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
		co = (char) getch();
		switch (co)
		{
		case 'a' :
		case 'A' :
			printf("Enter The Base : ");
			scanf("%d",&base);
			printf("\n Enter The Height : ");
			scanf("%d",&height);
			s=((base*height)/2)  ;
			printf("The Solution = %d",s);
			break;
		case 'c' :
		case 'C' :
			printf("Enter The Three Ribs of Triangle : ");
			scanf(" %d %d %d ", &tr1,&tr2,&tr3);
			s=tr1+tr2+tr3  ;
			printf("The Solution = %d",s);
			break ;
		}
		break ;
	case 's':
	case 'S':
		printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
		co = (char) getch();
		switch (co)
		{
		case 'a' :
		case 'A' :
			printf("Enter The Rib : ");
			scanf("%d",&sr);
			s=sr*4;
			printf("The Solution = %d",s);
			break;
		case 'c' :
		case 'C' :
			printf("Enter The Rib : ");
			scanf("%d",&sr);
			s=sr*sr ;
			printf ("The Solution = %d",s);
			break ;
		}


    break;
	case 'r':
	case 'R':
		printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
		co = (char) getch();
		switch (co)
		{
		case 'a' :
		case 'A' :
			printf("Enter The Width : ");
			scanf("%d",&width);
			printf("\n Enter The Length : ");
			scanf("%d",&length);
			s=width*length  ;
			printf("The Solution = %d",s);
			break;
		case 'c' :
		case 'C' :
			printf("Enter The Width : ");
			scanf("%d",&width);
			printf("\n Enter The Length : ");
			scanf("%d",&length);
			s=width+length  ;
			printf("The Solution = %d",s);
			break;
		}

		break;
	case 'c':
	case 'C':
		printf (" C=Circumference \n A=Area  \n  Enter The Computation : ");
		co = (char) getch();
		switch (co)
		{
		case 'a' :
		case 'A' :
			printf("Enter The Radius : ");
			scanf("%d",&radius);
			PI=3.14 ;
			s=radius*radius*PI  ;
			printf("The Solution = %d",s);
			break;
		case 'c' :
		case 'C' :
			printf("Enter The Radius : ");
			scanf("%d",&radius);
			PI=3.14 ;
			s=2*radius*PI  ;
			printf("The Solution = %d", s);
			break;
		}

	default : printf("error");
		break;
	}
	getch();
}

لكن أنت عكست معادلة حساب محيط المربع مع معادلة حساب المربع ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

جـزآك الله عنـي ألــف خييييرر ..

الشئ الأول و الثآلث فهمته ..!

لكن الشئ الثاني مآ فهمته .. ؟

ليـه أضفت co = (char) getch();

..

و حذفـت الـscanf .. ?

؟؟

:unsure:

#4

وآجهتني مشكلة أخرى .. محيط المثلث مآ يجي معآيآ .. دخلت 3 أضلآع و بعدين انتر و مآ يطلع .. ؟؟ ؟

و مشكلة لمـآ أختآر الدائـرة .. و سواء أختر محيط أو مساحة بيطبع error في النهآيـة في كل الحالتين .. ؟

آسفه // النآس إجآزه و عيد .. و مرآ مو مود وآجبآت .. مآعدآ أنآ ..

أعتذرلكم و شكرآ

تم تعديل هذه المشاركة بواسطة ms.ROR في 16 نوفمبر 2010 في 04:29

#5

مثل ما قلت ، باستبدال :

scanf("%c", &co);

بهذا :

co = (char) getch();

رح يعمل .

يبدو هناك مشكلة مع استقبال " حرف " من نوع char عن طريق scanf . لا أعرف سبب المشكلة ، فلم أجرّب هذا سابقاً .

أو يمكن عموماً ، استقبال مصفوفة نصية char* عن طريق scanf بدلاً من مجرّد تخزينه في متغير char .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6
ms.ROR كتب:

وآجهتني مشكلة أخرى .. محيط المثلث مآ يجي معآيآ .. دخلت 3 أضلآع و بعدين انتر و مآ يطلع .. ؟؟ ؟

عدلي هالسطر :

 printf("Enter The Three Ribs of Triangle : ");
scanf(" %d %d %d ", &tr1,&tr2,&tr3);

بـ

 printf("Enter The Three Ribs of Triangle : ");
scanf("%d %d %d", &tr1,&tr2,&tr3);

بعد إزالة المسافات , ظهر لي الناتج ..

1

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#7
اقتباس
و مشكلة لمـآ أختآر الدائـرة .. و سواء أختر محيط أو مساحة بيطبع error في النهآيـة في كل الحالتين .. ؟

الخطأ في النهاية ..

 default : printf("error");
break;

المفروض يكون :

break;
 default : printf("error");

امم , و عندج بعد خطأ , المتغيرات مخليتهم int , و احيانًا يكون الناتج double (في حالة حساب الدائرة لأنج تحتاجين تضربين في PI)

التصحيح يكون كالتالي :

printf("Enter The Radius : ");
                        scanf("%d",&radius);
printf("The Solution = %f",(double)2*radius*PI);

وبالتوفيق :happy: ,

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#8

الشمري & اشرآقـة الفجررر ..

جزآآكم الله اللــف خييير .. أستفدت كثييرر .. مشكووورين ! !

:)

مواضيع مشابهة