المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : فزعتكم يامبرمجي سي



USG
30-03-2005, 11:55 PM
السلام عليكم..
أرجوكم ياشباب أنا في بداياتي لتعلم البرمجة بلغة سي :icon6: ..وجالس أكتب برنامج يحسب فاتورة فندق..ولكن وقفت في طريقي هذه الدالة..ولي يومين -بدون مبالغة-وأنا أحاول وجربت كل الطرق اللي أعرف ..ولكن ما نفع معها (بنت ال...:shock22: :vereymad: ) ..المهم يئست وجيت أبي فزعتكم:09: ..

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

ماهي مشكلتها:

أرجوكم سووا لها copy وشوفوها بأنفسكم..
فليس خبر كالعيان :09: ..

هذي الدالة مع جزء من البرنا مج يطبع اسم العميل وفاتورة طعامه:


#include<stdio.h>


void Food(float *Total)
{
char S,X;

while(1)
{

printf("selecting food type:\n");
printf("of the preakfast click:P\n");
printf("of the lunch click:L\n");
printf("of the dinner click:D\n");
printf("of the exit click:E\n");
scanf("%c",&S);

switch(S)
{
case'p':
case'P':
{
*Total+=20;
break;
}

case'l':
case'L':
{
*Total+=30;
break;
}
case'd':
case'D':
{
*Total+=40;
break;
}

case'e':
case'E':
{

printf("You sure of exit ? ,input Y or N:\n");
scanf("%c",&X);//here not see it,why?!!

if((X!='Y')||(X!='y'))
{

return ;

}
}

default:
{
printf("input error!\n");
}


}
}
}



void Typing(char *n,float *Total)
{

printf("the name is:%s\n",n);
printf("the Total=%f\n",*Total);
}

void main()
{
float *Tt,i=0;//must set the value intlilty of i,like:i=0
char name[30];
Tt=&i;
Food(Tt);
printf("Please enter the name of patron:\n");
scanf("%s",&name);

Typing(name,Tt);

}

ibn_alqalam
31-03-2005, 07:35 PM
ياعمر عمري, تهاينا على المحاولة اولا, من الواضح انه لديك غريزة البرمجة.

مشكلتك هي انك تستخدم ادوات قد لا تحتاجها. استخدمت المؤشرات.

هناك ايضا عيوب مظهرية بسيطة, مثل استخدامك لاسما للمتغيرات تتكون من حرف واحد فقط.ّ خطا, لا زم تستخدم اسماء معبرة تساعدك على التفكير عن المسالة. برمج كانك تخاطب انسانا.




#include<stdio.h>


float Food (char choice)
{

float total = 0.0; /* new */

switch(choice)
{
case'p':
case'P':
total+=20;
break;

case'l':
case'L':
total+=30;
break;

case'd':
case'D':
total+=40;
break;

default:
break;
}

return total;
}


void Typing(char *n ,float total)
{
printf("the name is:%s\n",n);
printf("the Total=%f\n", total);
}

int main()
{
float total = 0.0, i = 0; //must set the value intlilty of i,like:i=0
char name[30];
char choice;

int quit = 0;

printf ("\t=== Restaurant Accounting System ===\n\n");

printf("selecting food type:\n");
printf("of the preakfast click: P\n");
printf("of the lunch click: L\n");
printf("of the dinner click D\n");
printf("of the exit click: E\n");

do {
printf ("meal > ");
scanf("%c",&choice);
printf ("\n");

if ((choice == 'E') || (choice == 'e'))
quit++;
else
total += Food (choice);

} while (!quit);

printf("Please enter the name of patron:\n");
scanf("%s",&name);

Typing(name,total);

return 0;
}

USG
01-04-2005, 12:14 PM
شكرا لك يا عزيزي ibn_alqalam ....كالعادة سباق إلى مساعدة الآخرين.. :biggthump :biggthump



وطريقة رائعة تلك التي ذكرتها...ولكن...أرجو أن تسمح لي ببعض الإستفسارات:



-1 أريد أن أعرف ماهو الخطأ في طريقتي السابقة.. أو بشكل أًصح :



- لماذا عند إدخال أحدالخيارات الثلاث الأولى , يطبع بعدها رسالة الخطأ الموجودة في (defualt ) ؟!

- الفقرة التي فيها سؤال المستخدم :هل هو متأكد من الخروج ..,يعني خيار : E , يطبع فقط السؤال ويتجاهل أمر scanf()؟!


2- بالنسبة للمؤشرات.. فكما قلتأن هذه الدالة جزء من برنامج يحتوي على عدة دوال , كلها تتعامل مع متغير واحد , وهو:Total ..وبالتالي يجب أن يمرر لكل واحده منها عن طريق مؤشر.....إذا كانت هناك طريقة أخرى أرجو أن تخبرني بها ..


وحينما أنتهي من البرنامج سأحاول أن أنزله هنا , لأتشرف بتقييمكم وتوجيهاتكم -بإذن الله-...





أرجو أن لا أكون أثقلت عليك ياأخي الكريم :08: ...

وتحية تقدير واحترام لك من قبل ومن بعد :) ..

USG
02-04-2005, 06:32 PM
أنا في انتظار الإجابة :أفكر: :28: ......

ibn_alqalam
02-04-2005, 08:23 PM
خخخخخ, مشغول في العمل.

اولا كانت هناك اخطاء عدة في النسخة الاولى من برنامجك, لذلك لم تستطع انت ترجمته you couldn't compile it. للتخلص من الاخطاء, يجب ان تبسط البرنامج لكي تستوعبه. انا قمت بحذف المؤشرات لانها ليست ضرورية, يمكنك تمرير اي قيمة من دالة الى اخرى, و لاداع للاشارة اليها.

استخدم المتغيرات حين لديك بيانات مركبة او معقدة. او اذا لديك عدد هائل من القيم و المتغيرات. حاليا كل ما لديك هو عداد عشرية و حرف ابجدية, و تلك سهلة التمرير و التداول.

همس مجنون
03-04-2005, 07:01 AM
برنامجك غير منطقي مثل ما قال الاخ ibn_alqalam

حاول تقراه وبتعرف اخطاءك مثلا while (1)ما احس ليها لزمة ولا فاهمة اش قصدك منها

ثانيا case e وش سالفته سواء اليوزر دخل n or y بيرجع لل main وبيقول عطني اسم الزبون

وبيعطيك المجموع صفر لان انت ما عطتيه قيمة صح ....بالنسبه لسالفه ان ما يقرا عدلت لك الكوندش

وصار يقرا عادي بس بعد هـ case مثل ماقلت ما لها سالفة ... حاول تعدله بروحك انا شلت ال while وعدلت الكوندش عشان يقرا الحرف ..

#include<stdio.h>

void Food(float *Total)
{
char S;
printf("selecting food type:\n");
printf("of the preakfast click:P\n");
printf("of the lunch click:L\n");
printf("of the dinner click\n");
printf("of the exit click:E\n");
scanf("%c",&S);

switch(S)
{
case'p':case'P':
*Total+=20;
break;

case'l':case'L':
*Total+=30;
break;
case'd':case'D':
*Total+=40;
break;

case'e':case'E':
{
char X;
printf("You sure of exit ? ,input Y or N:\n");
getchar();//here not see it,why?!!
scanf("%c",&X);//here not see it,why?!!
if(X !=(('Y')||('y')))
{
return;
}
default:
{
printf("input error!\n");
}

}
}
}

void Typing(char *n,float *Total)
{
printf("the name is:%s\n",n);
printf("the Total=%f\n",*Total);
}
void main()
{
float *Tt,i=0;//must set the value intlilty of i,like:i=0
char name[30];
Tt=&i;
Food(Tt);
printf("Please enter the name of patron:\n");
scanf("%s",&name);
Typing(name,Tt);
}

همس مجنون
03-04-2005, 07:58 AM
برنامجك غير منطقي مثل ما قال الاخ ibn_alqalam

حاول تقراه وبتعرف اخطاءك مثلا while (1)ما احس ليها لزمة ولا فاهمة اش قصدك منها

ثانيا case e وش سالفته سواء اليوزر دخل n or y بيرجع لل main وبيقول عطني اسم الزبون

وبيعطيك المجموع صفر لان انت ما عطتيه قيمة صح ....بالنسبه لسالفه ان ما يقرا عدلت لك الكوندش

وصار يقرا عادي بس بعد هـ case مثل ماقلت ما لها سالفة ... حاول تعدله بروحك انا شلت ال while وعدلت الكوندش عشان يقرا الحرف ..




مسامحة الكوندش عندك صح بس لازم نستخدم get char()..

USG
03-04-2005, 06:08 PM
ibn_alqalam..

آسف على إزعاجك يا عزيزي ولاقصرت..

همس مجنون..

شكرا لك ياصديقي على هذا التوضيح الجميل....