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

مشكلة في برنامج شرائي

بدأه غربة في 2 أبريل 2009 · 17 رد · 1,207 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

أتمنى من العزيز الجبار أن تكونوا بألف خير

أما بعد..

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

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

المهم حينما يفتح البرنامج تظهر قائمة لها عدة أقسام.

A, B, C, D,E,

A تعبئة طلب شراء مادة بترولية . يسأل المستخدم عن رقم الزبون , يفحص اذا ما كان موجود في سجلات الزبائن ثم يكمل بالسؤال عن رقم المادة ويتأكد أيضا من وجودة في سجل المواد ثم يسأل عن الكمية المطلوبة ويأتي بسعر الليتر من سجلات المواد أيضا ويحسب لنا ناتج الكمية المطلوبة من المادة مع اضافة الضريبة والحسم حسب الشروط الموضوعة للتخفيض.

في B تظهر لائحة الزبائن .لائحة الزبائن معمولة أيضا من ملف cpp الى ملف txt.

C لائحة المواد بنفس طريقة B

المشكلة هنا في D و E

اذا عرفت الحل لـ D يسهل علي حل الآخر.

خيار D هو عبارة عن اضافة زبون جديد من البرنامج. سأضع الكود وأشرح المشكلة بالضبط ..

void skapakund ()

{

char namn[30]=" ", adress[40]=" ";//deklaration av strängvariablar kundnamn och adress

int kundnr;//deklaration av integer kund nummer

cout<<"Ange Kundnamn: ";

cin.getline(namn,29);

cin.get();

cout<<endl<<"Ange adress: ";

cin.getline(adress,39);

cin.get();

cout<<endl<<" Kundnummer: ";

cin>>kundnr;

cin.get();

ofstream utfil ("kundregister.txt",ios::app);

utfil<<namn<<endl<<adress<<endl<<kundnr<<endl;

utfil.close();

cin.clear();

cin.get();

}

كما هو ظاهر في الكود .. يطلب الاسم ثم العنوان ورقم العضوية .. كما أعرف انه يكفي وضع cin.getline(namn,29);

بعدما يظهر السؤال عن الاسم الا انه لا يظهر لي مكان لكتابة الاسم الا حينما أكتب cin.get();

المهم قمت بهذا كي يتوقف البرنامج وينتظرني حتى املأ الاسم ثم نفس الحالة مع العنوان.. حينما أصل الى رقم العضوية بالرغم من اني وضعت cin.get();

لا ينتظر البرنامج لكي أملا الرقم انما تطهر مباشرة الى جانبه القائمة الرئيسية للبرنامج وتكرر أكثر من مرة والى جانب اختيار حرف من القائمة رسالة خيار خاطئ .. على عدد المرات التي تكررت فيه القائمة ما عدا المرة الأخيرة يفسح لي المجال لاختيار خيار جديد ..

كثرت الكلام ولا أعرف ان كنت قد أوصلت الفكرة لكم .. جربت حسب نصيحة الدكتور استخدام cin.clear أو ignore

الا أن النتيجة كانت هي ذاتها..

أتمنى مساعدتكم واذا احتجتم لأ تفسير وتفاصيل أخرى موجودة ان شاء الله

تحياتي لكم

أختكم في الله

غربة

#2

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اهلا اختي الكريمة

ما يحدث انه عند الادخال يتم يتم وضع المدخلات في بفر Buffer لحين الضغط على الزر Enter لذلك

عليك بافراغ بفر الادخال" flush the Input Buffer "Stream

راجعي هذه المقالة

اضغط هنا

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 3 أبريل 2009 في 11:08

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#3

بسمه تعالى

السلام عليكــم ورحمـة الله وبركاتــه ،،

أشكرك أخي الفاضل على الرد والمساعدة..

قرأت المقال لكن اللي موجودين في الكود هناك غريبين علي شوي يعني مو موجودين في المنهاج خصوصا اني انهيت الكتاب ولا يمكنني استخدام كودات لم ادرسها بعد في المنهاج..

المهم اني فهمت المقصد.. يعني اذا استخدمت system cls() في بداية الكود ينفع او .. ألا تكفي cin.clear() لعمل المطلوب.. يعني هو هذا اللي فهمته أيضا من دكتورنا .. لكن المشكلة اين اضعهم في الكود في البداية او في النهاية..

تحياتي لك من جديدك

غربة

#4

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

لتفهمي جربي هذا الكود وقومي بادخال الاسم مع فراغ space اي مثلا ali ali وانظري ما يحدث

ثم جربي نفس الكود بادخال اسماء مفردة بدون فراغ space مثلا ali

حسنا الان قومي بازالة علامة // من امام الدالة (stdin)fflush وادخلي الاسم كلمتين اي بينهما فراغ مثل ali ali

الخلاصة عند افراغ البفر يعمل البرنامج تمام اما عدا ذلك سيحدث خطأ عند ادخال اسماء بينها فراغات

ويجب ان تضعي في الاعتبار ان الدالة (stdin)fflush قد تسبب خطأ اذا كان لايوجد بيانات في بفر الادخال لذلك يجب استخدامها في المكان المناسب اي بعد امر ادخال

توجد طرق اخرى مثلما موجود في المقالة السابقة

 


#include <iostream>
//#include <cstdio>
using namespace std;

int main()
{
 int i = 1;
 char Name[20];

 while ( i < 10 ){
  cout << i << " Enter Name : ";
  cin >> Name; 
  i++;
  //fflush(stdin);
 }

 return 0;
}

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#5

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اختي الكريمة , الدالة getline يوجد بها Bug ولتصحيحه تستطيعين مراجعة هذه الصفحة

اضغط هنا

عموما انت تستخدمين الدالة getline حتى يتم اخذ عدد معين وبالطبع يمكن استخدام الدالة get , حسنا ما يهمنا ان الدالة getline ستأخذ هذا العدد المحدد من الحروف , ولكن ماذا سيحدث اذا تجاوز عدد الاحرف المدخلة حجم المتغير ؟ بالطبع سيظل البفر ممتلي وعليه يلزمنا افراغه وبالطبع سنفكر مباشرة في استخدام الدالة clear

ولكن ليتم افراغ البفر Buffer كليا يجب ان نستمر في استخدام الدالة clear لحين الوصول لعلامة السطر الجديد وهي 'n\' وسنستخدم هذا السطر للقيام بذلك

 while(cin.get()!='\n')
cin.clear();

ايظا الدالة getline تاخذ عدد الحروف المحددة -1 وبالتالي ليس عليك انقاص 1 من حجم المصفوفة الحرفية namm و adress

وهنا مثالك معدل ويعمل بشكل سليم

 

#include <iostream>
#include <fstream>
using namespace std;

void skapakund ()

{
char namn[30]=" ", adress[40]=" ";
int kundnr;

cout<<"Ange Kundnamn: ";
cin.getline( namn,30); //  cin.getline( namn,sizeof(namn) );

while(cin.get()!='\n')
cin.clear();


cout << endl << "Ange adress: ";
cin.getline( adress,40); // cin.getline( adress,sizeof(adress) );

while(cin.get()!='\n')
cin.clear();

cout << endl << "Kundnummer: ";
cin >> kundnr;

ofstream utfil ("kundregister.txt",ios::app);
utfil<<namn<<endl<<adress<<endl<<kundnr<<endl;
utfil.close();
cin.clear();
cin.get();

}

int main()
{
skapakund();
return 0;
}

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 3 أبريل 2009 في 15:07

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#6

السلام عليكم ورحمة الله وبركاته

لا أعرف كيف أشكرك أخي الفاضل ولا كيف أجازيك جعلها الله في ميزان حسناتك وان شاء الله يحشرك مع نبي الرحمة محمد وآل بيته عليهم صلاة الله أجمعين في الجنان العلى ان شاء الله

قمت باضافة

while(cin.get()!='\n')

cin.clear();

حسب ما قمت بالتوضيح أخي الكريم في التصحيح ولكن لي سؤال

هل هناك كود آخر بدل هذا لأنه كما أوضحت لك مسبقا فأنا لا زلت في بداية المشوار وهذا الكود غير موجود في المنهاج وقد يتسبب لي استخدام هذا الكود بمشاكل واتهامات بالغش. يعني هل يمكن استخدام '\0' مثلا مع الابقاء على انقاص حجم المصفوفة الحرفية ؟؟

ثانيا حينما ادخل العنوان حسب التصحيح علي ان أكبس enter مرتين حتى يظهر لي

cout << endl << "Kundnummer: ";

cin >> kundnr;

وحين أفتح ملف kundregister.txt أجد الاضافة فقط adress و kundnr .. أما الأول namn فهو غير موجود يعني لم تتم اضافته ..

سؤال آخر هناك طريقة للبحث عن الخطأ في ملفات الCpp يعني أواجه مشكلة حينما تظهر لي في لائحة الأخطاء احيانا حينما يجب علي عدد الأسطر في الكود حتى أصل الى مكان الخطأ خصوصا حينما يتعدى الكود 100 سطر .. ذكر لي الدكتور F10 ولكني لم أعرف كيف أطبقها هل أجد لديك الحل الشافي ؟

تحياتي

تم تعديل هذه المشاركة بواسطة غربة في 3 أبريل 2009 في 17:01

#7

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اللهم صلى على محمد النبي الامين وآله وصحبه اجمعين وارضى اللهم عن ازواجه وخلفائه الراشدين واحشرنا معهم و اجعلنا من المتقين

اولا - بارك الله فيك اختي الكريمة على الدعاء الطيب

اما فيما يخص التنقل بين الاخطاء فيمكنك استخدام الزر F4

اما الحجم المستخدم في الدالة get او الدالة getline فالمهم ان لايتجاوز حجم المصفوفة المستخدمة مع الدالة, وغير ذلك يمكنك تحديد اي حجم تشائين

فمثلا لو كانت عندي مصفوفة باسم char name[20] ;واريد استخدامها مع الدالة cin.get / cin.getline فالدالة ستنقص 1 من الحجم المستخدم معها وعليه لاتوجد حاجة ان نضع الحجم 19 لانه في هذه الحالة سوف تأخذ الدالة 18 حرف فقط . فيمكن استخدم الحجم 20 والدالة تلقائيا ستأخذ 19 حرف .

وبصراحة لا اعلم :wacko: ما هي طبيعة التعليم عندكم التي تمنع الطالب من استخدام مواضيع متقدمة فالمفروض هو العكس تماما حيث يجب تشجيع الطالب على البحث و الاطلاع و تطوير معارفه

عموما لا يوجد في الكود المرفق اي اشياء متقدمة فلا يحتوي الكود الا على جملة while ورمز 'n\' وهما من اساسيات اللغة يعني لو كتبتي الكود التالي

cout << "There is no God but Allah \n";

ستعتبرين من الغشاشين لاستخدامك الرمز 'n\'

عندما يقوم استاذك او دكتور المادة بحل السؤال ارجوا ان تعودي لهذه الصفحة و ترينا كيف سيكون حله بدون استخدام while او الدالة fflush(stdin);

عموما الكود السابق يعمل معي بشكل صحيح و ينشيء الملف kundregister.txt ويقوم باضافة السجلات الجديدة للملف بدون اي اخطاء

و اليك هذا الكود للتخلص من الضغط على الزر انتر مرتين

 

#include <iostream>
#include <fstream>
using namespace std;

void skapakund ()

{
char namn[30] = " "; 
char adress[40]= " ";

int kundnr;

cout<<"Ange Kundnamn: ";
cin.get(namn, 30,'\n'); // cin.get( namn,sizeof(namn) );

while(cin.get()!= '\n')
  cin.clear();

cout << endl << "Ange adress: ";
cin.get( adress,40,'\n'); // cin.get( adress,sizeof(adress) );

while(cin.get()!= '\n')
  cin.clear();

cout << endl << "Kundnummer: ";
cin >> kundnr;


ofstream utfil ("kundregister.txt",ios::app);
utfil<<namn<<endl<<adress<<endl<<kundnr<<endl;
utfil.close();
cin.clear();
cin.get();

}

int main()
{
skapakund();
return 0;
}

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 3 أبريل 2009 في 19:38

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#8

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

أتمنى من الله عز وجل أن يديمك بنعمه وفضله وأن يثبتنا واياكم على الصراط المستقيم أخي الكريم

أشكرك على الكود الجديد . قمت باضافة cin.clear();

cin.get();

مباشرة قبل cout<<"Ange Kundnamn: ";

وهكذا والحمد لله صار يظهر الاسم في ملف txt

مشكور وان شاء الله يجازيك بكل خير في الدنيا والآخرة

أرجو منك أخي الكريم أن تفسر لي ´\n´

والفرق بينها وبين

´\0´

.....................................................................

قمت باضافة تعديل على الكود.. يعني اضفت خيارين للقائمة الرئيسية تمكن المستخدم من تغيير معلومات الزبون المحفظ من قبل في ملف txt

وكذلك لتغيير سعر المادة.. وهذا الكود لتغيير الزبون .. الذي لم يعمل بل اكتفى بأخذ رقم الزبون ثم ظهرت لي القائمة من جديد وبذلك أصبح ملف

txt

فارغا تمام.. ما الخطأ في الكود .. وكيف يمكنني ان اغير معلومات زبون واحد مع الحفاظ على بقية الزبائن الآخرين بدون تعديل او انه يحذفهم كلهم ويكتفي بتحفيظ الزبون الجديد..

اليك الكود

void andrakund()

{

int soktkund, kundnr;

char namn[30]="", adress[40]="";

ifstream infil ("kundregister.txt");

ofstream utfil ("temp.txt");

cout<<"Ange kundnummer: ";

cin>>soktkund;

while (infil>>namn>>adress>>kundnr)

{

if(kundnr==soktkund)

{

cout<<"Ange nytt Kundnamn: ";

cin.getline(namn,29);

cout<<"Ange ny adress: ";

cin.getline(adress,39);

}

utfil<<namn<<endl<<adress<<endl<<kundnr<<endl;

}

infil.close();

utfil.close();

remove("kundregister.txt");

rename("temp.txt", "kundregister.txt");

}

تحياتي لك وشكرا جزيلا مسبقا .. وسامحني اذا أتعبتك معي

أختك في الغربة غربة

#9

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اختي الكريمة الرمز 'n\' يعني سطر جديد New Line اي انها مساوية لـ endl فمثلا :

cout << "Hello C++\n";

هي نفس

cout <<Hello C++" << endl;

كما توجد رموز اخرى هذه اهمها

post-129961-1238856853_thumb.jpg

مثال على استخدامها

cout << "\tThis is a Tab" << "\n"; \\ print tab , then print "this is a tab" , then print newline .

اما فيما يخص التعديل فبرنامجك يقوم باضافة ثلاثة اسطر لكل سجل جديد , وهي الاسم و العنوان و رقم العميل

فعليك بايجاد طريقة " دالة " لتحديد بيانات العميل المراد تعديل بياناته , حسنا هذا يتم اما بالبحث عن رقم العميل او اسمه او عنونه

ثم الانتقال بمؤشر الكتابة لاول سطر في بيانات العميل والكتابة فوقها طبعا في الوضع append ولا يلزمك فتح ملف مؤقت

اقتباس
أختك في الغربة غربة

ليس الغريب غريب الشام و اليمن ... ان الغريـــب غريـــب اللحد و الكفـن

ان الغـريـــــب لــه حــق لغربتـــه ... على المقيمين في الاوطان و السكن

آنس الله غربتك وردك الى اهلك وبلدك سالمة غانمة

اخوك في الله والاسلام

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 4 أبريل 2009 في 18:09

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#10

السلام عليكــم ورحمـة الله وبركاتــه،

ما شاء الله اخHATY اصبحت من اباطرة السي :lol:

تحياتي  :happy:

 

تم تعديل هذه المشاركة بواسطة المحارب الصغير في 4 أبريل 2009 في 18:22

الفريق العربي للبرمجة

16359.png

userbarxp.png

624.gif
#11
المحارب الصغير كتب:

السلام عليكــم ورحمـة الله وبركاتــه،

ما شاء الله اخHATY اصبحت من اباطرة السي :lol:

تحياتي :happy:

وعليكــم السـلام ورحمة الله وبركاتـه..

اهلا اخي الكريم الغالي " المحارب " والله منذ ايام رجعت للموضوع القديم " البرنامج الاول بعد ثلاثة ايام من تعلم السي " و والله مررت بخاطري

وتسألت في نفسي عن سر غيابك عن المنتدى فسبحان الله ها انت بعد ايام تعلق على ردودي , فعودا حميدا ولا تعاودها وتنقطع عن المنتدى وتحرمنا بذلك من مداخلاتك الكريمة

بارك الله فيك اخي الكريم ولازال تشجيعك لي وكلماتك الطيبة في اول مواضيعي حافزا يدفعني للتعلم , فلازلت طويلبا للعلم , ووين ووين لنصلوا الى مستوى اساطين السي في المنتدى

اخوك علي

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 4 أبريل 2009 في 18:50

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#12

من الان سوف تراني كل يوم لدرجة الملل   :lol:

والله انا مشتاق للمواضيع السمينة وليس مواضيع والاسئلة المكررة  -_-

لغة السي سهلة اذا تسلحة جيدا لها 

صندوق اسبرين  صندوق قهوة كثيرة الكافيين  قطارة 1لتر للاعين  :lol:

الفريق العربي للبرمجة

16359.png

userbarxp.png

624.gif
#13

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

طابت أوقاتك أخي علي

ومرحبا بالأخ الكريم المحارب الصغير على صفحة استفساراتي..

أتعبتك معي أخي علي ومشكور ومأجور عند الله عز وجل على الشرح بالنسبة للرموز ..

للأسف اختياري للغة سي لم يكن في محله فأنا أدرسها كمادة مؤقتة.. ميولي طبية وهذا ما أصبو الى دراسته لكن حكمت الظروف ان أختار السي ,والمشكلة ادرسها عبر النت مع استخدام الكتاب فقط والحمد لله احاول على قدر الامكان تكوين معلومات كافية حولها علّني أفيد بها غيري على الأقل في يوم من الأيام..

بالنسبة للبرنامج..

كما تلاحظ .. بالبداية يطلب البرنامج من المستخدم رقم العميل .. ثم يقرأ في ملف العملاء أولا الاسم ثم العنوان ثم رقم العميل بالتسلسل.. حينما يتأكد من وجود العميل يطلب ادخال المعلومات الجديدة ,, الاسم الجديد والعنوان الجديد لرقم المستخدم المطلوب..

لكن كما ذكرت لك المشكلة سابقا يحفظ المعلومات الجديدة ويلغي معلومات العملاء البقية .. بما انه يحفظ في ملف مؤقت ويعيد تسميته حسب القديم..

المقصود من append لم أعرفه..

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

المهم .. اذا قمت باضافة رمز

ios::app

يعني أحفظ المعلومات الجديدة في

("kundregister.txt",ios::app);

بدون ان اقوم بعمل ملف تحفيظ مؤقت يمشي الحال.. وبهذه الحالة كيف بامكاني أن أجعل البرنامج يقوم بحذف معلومات العميل المطلوب وتحفيظ الجديد بدلا منه؟

الله يقدرني على رد معروفك ان شاء الله وجازاك الله عني كل خير..

تحياتي للجميع

أختكم في الله غربة

تم تعديل هذه المشاركة بواسطة غربة في 5 أبريل 2009 في 00:38

#14

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اهلا اختي الكريمة " غربة " ... اسمك لمس شيئا في داخلي ... لعله غربة في نفسي

عموما لم تتعبيني على الاطلاق وسأساعدك بقدر ما اعلم و بقدر جهدي ولا تترددي ابدا في طرح اي سؤال

اعلمي اختي الكريمة ان دراستك للبرمجة لن تتعارض مع ميولك الطبية فعلى العكس تماما , فدراسة البرمجة تجعلك تفكرين بشكل منطقي , ربما جنوني في بعض الاحيان

:lol:

المهم - الوضع append المقصود به الاضافة توجد اوضاع اخرى مثل الكتابة out و القرأة In

fstream testfile("file.txt" ,ios::app | ios::in | ios::out ...etc )

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

حسنا اليك المثال لتغيير بيانات السجل مع العلم اني وضعت معلومات العميل Client في تركيب struct للاختصار , بالطبع يمكنك الاستغناء عن ذلك

ربما يجب عليك الاطلاع على مفهوم المتجه Vector لفهم المثال

 

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

struct Client
{
int ID;
string Name;
string Address;
};


void ChangeRecordInFile(string filename ,
	  int RecordNo_to_find ,
	  string newName,
	  string newAddress
	  )
{
string record;
char rcd[8];
itoa(RecordNo_to_find,rcd,10); //int to string
record = rcd;
int nlines = 0; // Number of lines;

ifstream inputfile( filename.c_str() ); // Input file
ofstream outputfile; // Output file				 
string tmp; // string to store the line
int  pos = 0; // Position of found ID Line

vector <string> lines; // string vector to store all lines

while( !inputfile.eof() && getline( inputfile ,tmp ,'\n') ){
  nlines++;
  lines.push_back(tmp); // store new line at vector's end
  if( tmp  == record ){
   pos = nlines; // Pingo !!! ,ID found ... so store line's no.
   cout  << "Client's ID found in line no: "  << pos << endl;
  }
}

if (pos == 0 ){
  cout << "Clients ID not found ...\n";
  return; 
}

lines[pos]   = (newName); // replace old Name with new Name
lines[pos+1] = (newAddress); // replace  old Name new Address

inputfile.close();

outputfile.open(filename.c_str() ,ios::out);

for (int m =0;m < lines.size(); m++ ){
  cout  << lines[m] << endl;
  outputfile  << lines[m] << endl;
}

outputfile.close();

}

int main()
{
ofstream testfile;
testfile.open("haty.txt");

Client me ,you ,he;

me.ID = 1; 
me.Name = "Ali Ali";
me.Address = "Libya";


you.ID = 2; 
you.Name = "Ghoorba";
you.Address = "Sweden";

he.ID = 3; 
he.Name = "someOne";
he.Address = "someWhere";


testfile << me.ID  << endl << me.Name  << endl << me.Address  << endl;
testfile << you.ID << endl << you.Name << endl << you.Address << endl;
testfile << he.ID  << endl << he.Name  << endl << he.Address  << endl;

ChangeRecordInFile("haty.txt",3 ,"ALI","LIBYA");

testfile.close();
return 0;

}

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 5 أبريل 2009 في 22:52

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#15

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

أرجو من الله أن تكون أخي الكريم علي بألف خير وعافية وأعلا الله شأنك بين عباده في الدنيا والآخرة باذنه لاسيما بين مبرمجي C++

هذه اللغة الها ناسها والله يجعلك من ناسها والمتميزين فيها..

مشكور على الكود أخي الكريم ولكني لم أستخدمه للأسف..فstruct موجود في المنهج الا انه بهذا البرنامج علي ان لا أستخدمه.. عندنا 3 برامج .. البرنامج الأول لازم نطبقه بالثلاث الدروس الأولى بالكتاب .. والثاني اللي اشتغل عليه بالست دروس الأولى .. والبرنامج الأخير تابع له struct ودرس المؤشر..

المهم اني عدت للكود اللي كتبته انا من البداية .. وحاولت ان أفتش من هنا وهناك على الخلل ..لحد ما شوي وأصير عمياء

وبالنهاية لجأت الى ما علمتني اياه في السؤال السابق

 cin.get(namn, 29,'\n');
while(cin.get()!='\n'
cin.clear();

المهم نفع لكن ما زال الخلل الموجود..

ورح أكتب لك الكود بشكل كامل من جديد ..

void andrakund()
{
int soktkund, kundnr;
char namn[30]="", adress[40]="";
ifstream infil ("kundregister.txt");
ofstream utfil ("temp.txt");
cout<<"Ange kundnummer: ";
cin>>soktkund;
while (infil.getline(namn,29))
{
infil.getline(adress,39);
infil>>kundnr;
infil.get();
if(kundnr==soktkund)
{
cout<<"Ange nytt Kundnamn: ";
cin.get(namn, 29,'\n');
while(cin.get()!='\n')
cin.clear();
cout<<"Ange ny adress: ";
cin.get(adress, 39,'\n');
while(cin.get()!='\n')
cin.clear();
}
utfil<<namn<<endl<<adress<<endl<<kundnr<<endl;
}
infil.close();
utfil.close();
remove("kundregister.txt");
rename("temp.txt", "kundregister.txt");
}

الآن يسألني عن الرقم اعطيه اياه.. ثم يسأل عن الاسم الجديد والعنوان الجديد سوا يعني مثل المشكلة السابقة .. يعني ما يعطيني مجال الا اني املي العنوان وليس الاسم الجديد ..

جربت اشيل cin.clear بعد ما يطلب الاسم الجديد فصرت أقدر املي الاسم الجديد لكن ما يسألني عن العنوان ويرجع يعطيني القائمة الرئيسية..

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

تحياتي لك وللجميع

أختكم في الله غربة

تم تعديل هذه المشاركة بواسطة غربة في 7 أبريل 2009 في 18:40

#16

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

اهلا اختي الكريمة " غربة " ... ارجوا من الله القدير ان تكوني باحسن حال

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

حسنا - اليك البرنامج بدون استخدام التراكيب struct و بدون استخدام السلاسل الحرفية string بالطبع تستطيعين التعديل على المثال

#include <iostream>
#include <fstream>
//#include <cstdlib>
using namespace std;

void ChangeClientInfo(void)
{
ifstream inputFile("haty.txt" , ios::in ); 
ofstream outputFile("temp.txt" ,  ios::out);

int  Id;
char nName[30];
char nAddress[40];

char temp[40]; // temperory char array to store lines from files

cout << "Enter Client's ID to find : ";
cin >> Id;

while(cin.get() != '\n')
  cin.clear();			 // flush input buffer 

cout << "Enter Client's New Name : ";
cin.get(nName,30,'\n');

while(cin.get() != '\n')
  cin.clear();			 // flush input buffer

cout << "Enter Client's New Address : ";
cin.get(nAddress,40,'\n');
while(cin.get() != '\n')
  cin.clear();			 // flush input buffer

while ( inputFile.getline(temp,40,'\n') ){
  outputFile << temp << endl;
  if ( Id  == atoi(temp) ){
   outputFile << nName	<< endl;
   outputFile << nAddress << endl;

   inputFile.getline(temp,40,'\n'); // Skip Next line ( Name )
   inputFile.getline(temp,40,'\n'); // Skip Next line ( Address)

  }
}

inputFile.close();  
outputFile.close();

inputFile.clear();// flush file buffer 
outputFile.clear(); // flush file buffer

outputFile.open("haty.txt" ,ios::out);		   // out = output mode
inputFile.open("temp.txt" , ios::in | ios::beg); // in  = input mode | beg = begining

while ( inputFile.getline(temp,40,'\n') ){
  outputFile << temp << endl;
}

inputFile.close();
outputFile.close();

inputFile.clear();  // flush file buffer 
outputFile.clear(); // flush file buffer 

remove("temp.txt");

}

int main()
{

ofstream testfile;
testfile.open("haty.txt" ,ios::app);

int  ID;
char Name[30];
char Address[40];

cout << "Enter Client's ID : ";
cin >> ID;

while(cin.get() != '\n')
  cin.clear();

cout << "Enter Client's Name : ";
cin.get(Name,30,'\n');

while(cin.get() != '\n')
  cin.clear();

cout << "Enter Client's Address : ";
cin.get(Address,40,'\n');

while(cin.get() != '\n')
  cin.clear();

testfile << ID << endl << Name << endl << Address << endl;

ChangeClientInfo();

testfile.close();

return 0;

}

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 8 أبريل 2009 في 07:48

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#17

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه ،،

أسعد الله أيامك أخي علي وأزاح عنك كرب الدنيا والآخرة ان شاء الله

كما أزحت عني هم هالبرنامج..

مشكور على المجهود والله يوفقك ان شاء الله دنيا وآخرة

وانا لاحظت ان الطرق في كتابة الكودات غريبة عن كل ما وجدته على النت لكني أتبع الأمثلة اللي موجودة في كتابنا واللي هو دكتورنا مؤلفه يعني محتكر المادة له هو .. الله يعين

باقي لي هذه المشكلة واخلص من هالبرنامج وأسلمه.. انا مثل ما قلت لك سويت function

تتيح للمستخدم طلب شراء مادة تطلب منه رقم المستخدم ورقم المادة المطلوبة وتعطيه السعر من الملف وتسأل عن الكمية وتحسبه اضافة الى الحسم والضريبة ..

وكله تمام وماشي عادي ..لكن اللي اريد أعدله هو كيف يستطيع المستخدم طلب أكثر من مادة بوقت واحد.. أعتقد انها محتاجة الى loop

جربت do لكن ما صار ..

رح أحط لك الكود وشوفه

double rabatt(int ant, double pr)
{
if(pr>2000)
return 0.15;
else if (pr>1000 || ant>20)
return 0.10;
else 
return 0;
}
double priset (int antal, double stpris)
{ 
const double moms=0.25;
double radpris, rabproc;
radpris= antal*stpris;
rabproc= rabatt(antal, radpris);
return radpris*(1-rabproc)*(1+moms);
}
int antart, artnr, soktart, kundnr, soktkund, datum, hittart=0, hittkund=0;
double pris;
char adress [40]="", namn[30]="", artnamn[30]="";
void skapaorder ()
{
ofstream utfil("orderregister.txt",ios::app);
cout<<endl<<"Ange datum: ";
cin>>datum;
ifstream infil("kundregister.txt");
cout<<"...och kundnummer: ";
cin>>soktkund;
while (infil.getline(namn,29))
{
infil.getline(adress,39);
infil >> kundnr;
infil.get();
if (soktkund==kundnr)
{
hittkund=1;
break;
}
}
if(!hittkund)
cout<<"kundnummer saknas";
ifstream infil1("artikelregister.txt");
cout<<"...och produktnummer: ";
cin>>soktart;
while (infil1.get(artnamn,29))
{
infil1>>artnr>>pris;
infil1.get();
if (soktart==artnr)
{
hittart=1;
break;
}
}
if (!hittart)
cout<<"Produkten saknas";
cout<<"pris/liter är: "<<pris<<endl;
cout<<"Ange antal: ";
cin>>antart;   
cout<<"Din order: "<<endl<<"================================"<<endl<<"Datum"<<setw(15)<<datum<<endl<<"Kundnummer: " <<setw(8)<<soktkund<<
endl<<"Produktnummer: "<<setw(5)<<artnr<<endl<<"Antal liter: "<<setw(7)<<antart<<endl<<
"Att Betala: "<<setw(8)<<priset(antart,pris)<<"kr"<<endl;
utfil<<"Din order: "<<endl<<"================================"<<endl<<"Datum"<<setw(15)<<datum<<endl<<"Kundnummer: " <<setw(8)<<soktkund<<
endl<<"Produktnummer: "<<setw(5)<<artnr<<endl<<"Antal liter: "<<setw(7)<<antart<<endl<<
"Att Betala: "<<setw(8)<<priset(antart,pris)<<"kr"<<endl;
infil.get();
infil.close();
infil1.close();
utfil.close();
}

تحياتي

أختك غربة

#18

السلام عليكم ورحمة الله

الاخ علي غائب عسى المانع خير واتمنى ما كون ثفلت عليك

تحياتي

أختكم في الله غربة

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…