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

شابتر 3 (الجزء الثانى )

بدأه XMasterrrr في 6 نوفمبر 2010 · 10 رد · 1,871 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

بأذن الله سيتم وضع اسئلة الشابتر يوم الاربع و الشابتر الجديد يوم الجمعة القادمة و الاربعاء الاسئلة كما كنا سابقا بسبب انشغلاتى الكثيرة مع العلم ان ال...

مع العلم ان الشابتر القادم (4) سيكون اطول شابتر فى دورتنا كلها و سوف يكون اكثر من مئة صفحة و سوف يتقسم ل 3 اسابيع بسبب كُبر حجمه مع عدم وضع اسئلة له لحين الانتهاء من ال 3 اجزاء

برجاء مراجعة قوانين الدورة مرة اخرى!!!

اولا سوف نأخذ مثال صعب نسترجع به ما ذاكرنا

المثال

حسابة النسب:

حسابة النسب لمجموعة من الارقام : نقوم بجمع كل الارقام مع بعضها ثم نقوم بقسمة المجموع على كمية الارقام . اذا فهى عملية حسابية مستقيمة. من السهل ان نقوم بعمل اخطاء فى اثناء كتابة مثل هذه البرامج مثال: قمنا بعمل 3 متغيرات

a, b , c

من نوع

double

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

average = a + b + c / 3.0

هل رأيت الخطاء ؟ عندما تم تنفيذ البرنامج سوف تتم القسمة اولا. المتغير

c

سوف يتم قسمته على

3.0

من ثم يتم جمع بقيت المتغيرات على بعضها. هذه عملية خاطئة لكى يتم حسب النسبة . لكى نقوم بعمل تصحيح لهذا الخطاء نقوم بالتالى

average = (a + b + c) / 3.0

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

1- معرفة نتيجة الاختبار الاول

2- معرفة نتيجة الاختبار الثانى

3- معرفة نتيجة الاختبار الثال

4- معرفة النسبة عن طريقة جمع ال 3 اعداد ثم قسمتهم على 3

5- عرض الناتج

فى اول ثلاث خطوات نجن نطلب من المستخدم ادخال ال 3 نتائج الخاصة بالامتحانات و لنقول اننا نقوم بتخزين ال3 نتائج تلك فى متغير من نوع

double

و سماينهم

test1, test2, test3

و فى الخطوة الرابعة قمنا بعملية حسابية لمعرفة النسبة. سوف نقوم بالسطر التالى لمعرفة النسبة:

average = (test1+test2+test3) / 3.0

الخطوة الاخيرة هى عرض النسبة, الان المثال البرمجى:

//هذا البرنامج يقوم بحسابة النسب
// لثلاث اختبارات
#include <iostream>
#include <cmath>
using namespace std;

int main()
{

    double test1, test2, test3;
    double average;

    //معرفة الدرجات الخاصة بالاختبار
    cout << "Enter the 3 test scores, every test score by space: ";
    cin >> test1 >> test2 >> test3;

    //حسابة النسبة
    average = (test1 + test2+ test3) / 3.0;

    // عرض الناتج
    cout << "The average score is: " << average << endl;
    system("pause");
    return 0;
}

المخرجات:

اقتباس

Enter the 3 test scores, every test score by space: 90 80 100[Enter]

The average score is 90

فى المشاركة القادمة سوف نُكمل دروسنا المتبقية من الشابتر الماضى ( تقريبا نصف الشابتر

3

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#2

قراءة حرف واحد

ملاحظة : الدرس هذا مرتبط ارتباط كامل بالدرس الاخير فى الشابتر الماضى.

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

a, b ,c

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

>>

كما المثال التالى

char ch;
cout << “Type a character and press Enter: “;
cin >> ch;
cout << “You entered “ << ch << endl

;

اذا ادخل المستخدم حرف

A

سوف تقوم

cin

بتخزينه فى المتغير الذى قمنا بعمله سابقى ,تذكر فأن الكائن

cin

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

“A”

هكذا يكون حرفين و ليس حرف واحد لأنه يوجد

اقتباس

null terminator

استخدام cin.get

الخواص المحدودة جدا لل

>>

مع المتغيرات من نوع

char

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

اقتباس

space bar, tab key, [Enter] Key

سوف يكون نهاية الجملة فى

cin >>

البرامج التى يُكتب فيها

اقتباس

Press any key to continue.

غير ممكن كتابتها بأستخدام

cin >>

لكى يتم ادخال

اقتباس

Enter key

بواسطتها

فى هذه الحالة يوجد دالة اخرى لل

cin

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

شئ مثال:

char ch;
cout << “Type a character and press EnteR: “;
cin.get(ch);
cout << “You entered “ << ch << endl;

لو ادخل المستخدم الحرف

اقتباس
A

و ضغط

اقتباس

Enter

فأن ال

cin.get

سوف تقوم بتخزين الحرف

A

فى المتغير الذى قمنا بعمله. اما اذا ضغط المستخدم على الزر انتر فسوف يقوم

cin.get

بعمل سطر جديد فى المتغير الذى قمنا بعمله

اى انه قام

'\n'

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

#include <iostream>
using namespace std;

int main()
{

    char ch;

    cout << "This program has paused. Press Enter to continue.";
    cin.get(ch);
    cout << "Than you!" << endl;
    cin.get();
    return 0;
}

المخرجات :

اقتباس

This program has paused. Press Enter to continue.[Enter]

Thank you!

الفرق الوحيد بين ال

cin.get
cin >>

ان

cin.get

تقوم بقراء اول حرف من الحرف حتى لو كان مساحة فارغة او ضغطنا على زر

Enter

لاحظ فى هذا البرنامج اننا لم نقم بأستخدام

system(“pause”);

لماذا ؟ لأنها تعمل فقط على نظام تشغيل الويندوز , لأننا درسنا الافضل منها و هو

cin.get

و عملها الرئيسى هو ما نريده فى برامجنا , اذا فسوف نستخدمها من هنا الى نهاية الدورة بأذن الله

الخلط بينن

cin >>, cin.get

الخلط بين الكائنان الماضيين يُسبب مشكلة صعبة الايجاد مثال:

char ch;
int number
cout << “Enter a number: “;
cin >> number;
cout << “Enter a character: “;
cin.get(ch);
cout << “Thank You!\n”;

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

cin.get

سوف يتم اختصارها و عدم استعمالها . هذا يحدث ﻷان ال

cin.get , cin >>

يقرأون ضغطة ال

اقتباس
[Enter]

و يتم تخزينها فى ال

اقتباس

keyboard Buffer

بعد ان يقوم المستخدم بأدخال الارقام, و فى انتظار زر ال

اقتباس

[Enter]

تم ادخال الزر اذا فسوف يتم تخزين

'\n'

داخل الكيبورد بافر ,مثال ادخلنا رقم 100 و من ثم ضغطنا زر انتر سوف يتم تخزين الرقم 100 و وضع الانتر داخل الكيبورد بفر , اذا فلم يتم ادخالها داخل المتغير الخاص بالرقام, سيتم ادخال الانتر هذه على انها

cin.get

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

استخدام

cin,ignore

لكى نقوم بحل المشكلة الماضية نقوم بأستخدام

cin.ignore

كل ما تقوم بفعله هو اخبار الكائن

cin

ان يقوم باختصار رقم محدد او حرف محدد و عدم وضعه داخل المتغير التالى له , المثال التالى يخبر الكائن

cin

بأن يقوم بأختصار ال 20 حرف القادمين (اى لا يدخلهم داخل البافر ايا كان) او ان يقوم باختصار ال

'\n'

ايهما يأتى اولا

cin.ignore(20, '\n');

لو اننا نريد فقط ان نقوم بعمل اخير حرف او لا يوجد شئ مُثبت الا النهاية للارقام نقوم بالتالى

cin.ignore();

المثال الذى اخذناه فى الدرس الماضى سوف نستخدمه هنا مع التصحيح

char ch;
int number
cout << “Enter a number: “;
cin >> number;
cin.ignore();
cout << “Enter a character: “;
cin.get(ch);
cout << “Thank You!\n”;

فى المشاركة القادمة سوف نتعرف اكثر عن : التركيز على برمجة الكائنات العشوائية (الدوال الخاصة بالمستخدمين)

3

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#3

التركيز على برمجة الكائنات العشوائية

الدوال الخاصة بالمستخدمين

الملخص: الدوال الخاصة بالمستخدمين هى اساسيات, مكتوبة فى السى++, تُعتبر جزء من الكائنات. الدوال الخاص بالمستخدمين تُسبب عملية برمجية تُقام للمستخدم.

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

فى السى++, الاساسيات البرمجية تُعتبر جزء من من الكائنات و تُعرف بأسم الدوال الخاصة بالمستخدمين

اقتباس

(member function)

تُسمى بالدوالة الخاصة للمستخدمين ﻷنهم عبارة عن دوال قادمة من كائن , الاستعمال للدوال الخاصة بالمستخدمين هو كى يقوم بمعرفة الاخطاء و تصحيحها و تصحيح الاخطاء الخاصة بالبيانات . اذا كنت تستخدم الكائنات ( انت الان تستخدم

cin, cout

انت لا تحتاج لكتابة كود طويل لكى يُعرفك على ما هو ال

cout , cin

فهم بالفعل مُجهزون لهذا العمل هذا هو الدوال الخاصة بالمستخدمين .. (هذا الملخص) كل ما تطلبه السى++ هو معرفة كيف تستخدمهم فقط وليس ان تعرف كيف بُرمجوا.

فى هذا الفصل قمنا بمعرف

getline
get
ignore

الطلب بكائن ضمن الكائنات الكثيرة التى عرفنها يقوم بعمل بعض العمليات الكتابية او الادخالية مثال:

cin.getline

تقوم بجعل الكائن

cin

يقراء جملة نصية من لوحة المفاتيح

فى شابتر 13 سوف نتعرف على كيفية كتابة الكائنات الخاصة بنا :D يدينا و يديكو طولت العمر.

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

المزيد عن دوال مكتبة الرياضيات

الملخص : السى++ يُقدم لنا مكتبة كاملة للرياضيات بها كل ما نحتاج لكى نقوم بأصعب العمليات الحسابية.

مُبكرا فى هذا الشابتر قمنا بتعلم استخدام الدالة

pow

لكى نعرف ال ^ الخاص بالرقم, مكتبة السى++ لديها دوال اخرى كثيرة لكى تقوم بعمليات حسابية مختلفة و علمية

الجدول التالى يوضح الدوال و استخدامها

اقتباس

الدالة ------------------------------------ استخدامه

y = abs(x); abs

y = cos(x); cos

y = exp(x); exp

y = fmod(x, z); fmod

y = log(x) log

y = log10(x); log10

y = sin(x) sin

y = sqrt(x) sqrt

y = tan(x) tan

كل هذه الدوال بسيطون تمام مثل استخدام

pow

المثال التالى سوف يقوم بعمل ال

sqrt

الذى يقوم بارجاع

اقتباس
square root

المثال:

cout << “Enter a number: “;
cin >> num;
s = sqrt(num);
cout << “The sqaure root of “ << num << “ is “ << s << endl

;

هنا المخرجات لهذا البرناج

اقتباس

Enter a number: 25[Enter]

The square root of 25 is 5

االبرنامج التالى سوف يرينا استخدام نفس الدالة السابقة لكى نعرف ال

اقتباس

hypotenuse of a right angle triangle

المثال:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main()
{
double a, b, c;

cout << “Enter the length fo side a: “;
cin >> a;
cout << “Enter the length of side b: “;
cin >> b;
c = sqrt(pow(a, 2.0) + pow(b, 2.0));
cout << “The length of the hypotenuse is “;
cout << setprecision(2) << c << endl;
cin.get();
return 0;
}

المخرجات:

اقتباس

Enter the length of side a: 5.0[Enter]

Enter the length of side b: 12.0[Enter]

The length of the hypotenuse is 13

الجملة التالية مأخوذة من البرنامج الماضى , و هى تقوم بمعرفة ال

اقتباس

square root

:

c = sqrt(pow(a, 2.0) + pow(b, 2.0));

لاحظ الجملة التالية تم استخدامها داخل دالة اخرها غيرها

pow(a, 2.0) + pow(b, 2.0)

هذه الجملة استدعت ال

pow

مرتان مرة لحسابة المتغير الاول و مرة لحسابة المتثير الثانى و من ثم استخدام الدالة

sqrt

و جمعهم سويا.

الارقام العشوائية

بعض الاستخدامات البرمجية تتطلب استخدام ارقام عشوائية. فى مكبة السى++ يوجد دالة تدعى

y = rand();

فى هذه الحالة نستخدم مكتبة جديدة و هى

cstdlib

الرقم يكون دائما من نوع

int

مثال:

y = rand();

بعد ان تم تنفيذ هذا السطر المتغير

y

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

cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;

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

srand

هذه الدالة تستخدم ارقام من نوع

unsigned int

اى انها تقوم بأخراج ارقام عشوائية بطريقة غير خوارزمية بالمرة لأنها تقوم على ارقام سلبية و ارقام ايجابية اما ال

rand

فسوف يقوم باخراج ارقام عشوائية من نفس السلسلة

الممارشة الشائعة فى استخدام الارقام العشوائية هو فى الدالة

time

هذه الدالة تقوم بأرجاع ارقام الثوانى التى مرت منذ عام 1970 هذه الدالة تطلب مكتبة

ctime

انت تقوم بكتابة 0 داخل الدالة , سوف يتم اخراج ارقام مختلفة كل مرة يتم استخدامها

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
unsigned seed = time(0);

srand(seed);

cout << rand() << endl;
cout << rand() << endl;
cout << rand() << endl;
cin.get();
return 0;
}

المخرجات

اقتباس

23861

20884

21941

ملاحظة : لك تقوم بتحديد الارقام العشوائية بين حدود محدد سوف نستخدم التركيبة التالية:

y = 1 + rand() % maxRange;

ال

اقتباس

maxRange

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

اقتباس

1 , 100

:

y = 1 + rand() % 100;

لننظر الى المثال التالى :

rand() % 100

فلنقول ان

rand()

تقوم بأرجاع 37894 و قيمة الحد 94 لماذا ؟ لأن قسمة ال 37894 على 100 يكون 378 مع متبقى 94 , لكن اذا ارجع الدالة الماضية رقم يكون زوجى اذا فلن يكون هناك متبقى لأنه سيقم على 100 مثل 500 فسوف يكون المتبقى 9 اذا فكى نحدد الرقم بين 1 الى 1-- نضيف 1

1 + rand() % 100

هكذا هى :D

فى المشاركة التالية سوف ندرس ال

hand debuging

3

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#4

التركيز على التنفيذ

التنفيذ اليدوى

التفيذ اليدوى هو عمل

debugging

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

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

num1, num2, num3, avg

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

main

:

#include <iostream>
using namespace std;

int main()
{
double num1, num2, num3, avg;
cout << “Enter the first number: “;
cin >> num1; 
cout << “Enter the second number: “;
cin >> num2;
cout << “Enter the third number: “;
cin >> num3;
avg = num1 + num2 + num3 / 3;
cout << “The average is “ << avg << endl;
cin.get();
return 0;
}

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

المخرجات :

اقتباس

Enter the first number: 10[Enter]

Enter the second number: 20[Enter]

Enter the third number: 30[Enter]

The average is 40

النسبة الصحية هى 20 مش 40 , لكى نعرف الخطاء يجب علينا عمل التنفيذ اليدو تشاهد كل سطر تقوم بعمل تدوينة داخل الجدول الذى قمنا بعمله امام كل سطر على حسب المتغير الذى تم التنفيذ معه . فى النهاية سوف نكتشف الخطاء , الان المثال الصحيح :

#include <iostream>
using namespace std;

int main()
{
double num1, num2, num3, avg;
cout << “Enter the first number: “;
cin >> num1; 
cout << “Enter the second number: “;
cin >> num2;
cout << “Enter the third number: “;
cin >> num3;
avg = (num1 + num2 + num3) / 3;
cout << “The average is “ << avg << endl;
cin.get();
return 0;
}

هل عرفتم الخطاء ؟ الخطاء كان فى الجملة التالية :

avg = num1 + num2 + num3 / 3;

الى

avg = (num1 + num2 + num3) / 3;

التنفيذ اليدوى جعلنا نعرف اين الخطاء و نصححه

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

التركيز على حل المشاكل : طريقة تصميم البرامج

البوسته العامة تقوم بعمل صناديق خاصة للرسائل. مع مكونات الصندوق تُكلف

اقتباس

0.23$

لكل قدم لكى يتم بناء الصندوق. فى المقابل يتم محاسبة المستخدمين على

اقتباس

0.50$

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

اولا المتغيرات :

الجدول التالى به المتغيرات

اقتباس

المتغير --------------------------------------------------------- وصفه

نوع دوبل يحمل طول الصندوق, يُدخل من المستخدم length

نوع دوبل يحمل عرض الصندوق ,يُدخل بواسطة المستخدم width

نوع دوبل يحمل ارتفاع الصندوق ,يُدخل بواسطة المستخدم height

نوع دوبل يحمل كل المساحة النهائة للصندوق ,يتم حسابته بواسطة الحاسب volume

نوع دوبل يحمل المصاريف الواقعية للصندوق , يتم تخزينه داخل المتغير cost

نوع دوبل يحمل الفرق بين السعر الواقعى و الفوائد , يتم حسابته بواسطة الحاسب charge

نوع دوبل يحسب المكسب , يتم حسابته بواسطة الحاسبة profit

ثانيا تصميم البرنامج :

البرنامج يجب ان يقوم بعمل الخطوات التالية كأساسيات

1 – الطلب من المستخدم ادخال المواصفات ( الطول العرض الارتفاع)

2 – حسابة الحجم الخاص بالصندوق , تكلفة التصميم , حساب المستخدم , نسبة المكسب.

3 – عرض الخطوة الثانية على الشاشة

اولا يتم التقسيم كالأتى

حسابة ,: الحجم و التكلفة و السعر و المكسب يندرج تحتهم الاتى

1 – معرفة المساحات

2- حساب الحجم , التكلفة , السعر , المكسب

3 – عرض البيانات

يتم تقسيم كل واحدة الى اقسام

اولا

معرفة المساحات

1 – معرفة الطول

2 – معرفة العرض

3 – معرفة الارتفاع

ثانيا

معرفة الحجم النهائى , التكلفة , السعر , المكسب

1 – حسابة الحجم النهائى

2 – حسابة السعر الحقيقى

3 – حسابة سعر المستخدم

4 – حسابة المكسب

ثالثا

عرض النتائج

1 – عرض الحجم الناهئى

2 – عرض التكلفة

3 – عرض سعر المستخدم

4 – عرض المكسب

الخوارزمية للبرنامج

الطلب من المستخدم ادخال الطول

الطلب من المستخدم ادخال العرض

الطلب من المستخدم ادخال الارتفاع

حسابة الحجم النهائى

حسابة التكلفة

حسابة سعر العميل

حسابة المكسب

عرض الحجم النهائى

عرض التكلفة

عرض السعر للعميل

عرض المكسب

العملية الحسابية

التركيبة التالية سوف يتم استخدامها لمعرفة الحجم, التكلفة, السعر , المكسب.

Volume = length * width * height
cost = volume * 0.23
charge = volume * 0.5
profit = charge – cost

البرنامج

الان نرى تطبيق ما تمت دراسته

// هذا البرنامج يُستخدم من قبل الهيئة العامة للبوستة
// الحجم , التكلفة , السعر للعميل , المكسب لأى حجم
// سوف يتم الحساب عن طريق الادخال
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    double length,
            width,
            height,
            volume,
            cost,
            charge,
            proft;

            cout << setprecision(2) << fixed << showpoint;

            cout << "Entert the dimensions of the crate (in feet):\n";
            cout << "Length: ";
            cin >> length;
            cout << "Width: " ;
            cin >> width;
            cout << "Height: ";
            cin >> height;

            volume = width * length * height;
            cost = volume = 0.23;
            charge = volume * 0.5;
            proft = charge - cost;

            cout << "The volume of the crate is ";
            cout << volume << " cubic feet.\n";
            cout << "Cost to build: $" << cost << endl;
            cout << "Charge to customer: $" << charge << endl;
            cout << "Profit: $" << proft << endl;
            cin.get();
            return 0;
}

المخرجات:

اقتباس

Enter the dimensions of the crate (in feet):

Length: 10[Enter]

Width: 8[Enter]

Height: 4[Enter]

The volume of the crate is 320.00 cubic feet.

Cost to build: $73.60

Charge to customer: $160.00

Profit $86.40

مخرجات اخرى :

اقتباس

Enter the dimensions of the crate (in feet):

Length: 12.5[Enter]

Width: 10.5[Enter]

Height: 8[Enter]

The volume of the crate is 1050.00 cubic feet.

Cost to build: $241.50

Charge to customer: $525.00

Profit $283.50

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

2

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#5

مقدمة فى ادخال و اخراج الملفات

الملخص : هذا الفصل سوف يقدم لكم مثالا بسيطا عن قراءة و كتابة على الملفات.

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

اقتباس

ram

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

يوجد 3 خطوات ثابتة لمثل هذه العمليات:

1 – يجب عليك فتح الملف المراد الحفظ بداخل. لو انه ليس موجود يتم عمله

2 – حفظ البيانات , قراءة البيانات او الاثنان

3 – عندما يتم الانتهاء من استخدام الملف . يجب ان يتم استخدام الملف

عندما يعمل البرنامج مع البيانات , توجد تلك البيانات بداخ شئ يُدعى ال

اقتباس

Random Access Memory (RAM)

عندما يتم كتابة البيانات على ملف, يتم النسخ من داخل الرام , اى المتغيرات الى المكان المراد استخدامه للحظف

و عندما يتم قرائة البيانات يتم نسخها من الملف الى المتغيرات

الاعداد لادخال و القراءة من الملفات

كما كان الكائن

cin, cout

يتطلبان مكتبة

iostream

فأننا بحاجة لمكتبة اخرى

fstream

بداخلها كل ما نريد لكتابة و قراءة البيانات الى الملفات

<fstream>

الخطوة التالية هى هى معرفة اذا كان البرنامج قراءة/كتابة لكى نعرف عدد ال

اقتباس

stream objects

يدعون بهذا الاسم لأنه مجموهة من البيانات و يعملون تماما مثل

cin, cout

يتم ارسالها الى

cout

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

cin

و يتم تخزينها داهل متغيرات و من ثم استخدام ال

اقتباس

stream objects

لكى يتم حفظ البيانات فى ملف و ايضا يتم استخدامها لكى تتتم قرائتها من الملف الى البرنامج.

المكتبة

fstream

بداخلها انواع ال

اقتباس

streams

و هم

ifstream, ofstream, fstream

قبل ان يقوم برنامج السى++ بالعمل مع هذه الملفات, يجب ان نقوم بعمل كائن بنوع البيانات اى مدخلات ام مخرجات و من ثم ربطه مع القرص الصلب,

الجدول التالى يوضح كل نوع و استخداماته

اقتباس

النوع --------------------------------------------------------استخدامه

عمل الملفات المراد الحفظ عليه , النسخ من البرنامج الى الملف المردا الحفظ عليه ofstream

فتح ملف موجود بالفعل و القراءة منه الى الذاكرة , النسخ من الملف الى البرنامج ifstream

هذا النوع يقوم بعمل كل ما قام به النوعين السابقين fstream

ملاحظة : فى هذا القسم سوف نتعلم فقط

ofstream, ifstream

النوع الاخر سوف يتم تعلمه بالتفصيل فى شابتر 12

هنا مثال عن الكائنات الخاصة بهذه الانواع

ofstream outputFile;
ifstream inputFile;

فى الجمل الماضية تم عمل كائنين

outputFile, inputFile

ال

outputfFile

من نوع

ofstream

فى حين ان العكسب بالعكس

فتح ملف

قبل ان يتم كتابة او قراءة من الملف يجب ان نقوم بفتح الملف داخل السى++ نكتب اسم و مسار الملف لكن فى البرنامج يتم قراءة الملف و اخراج ما به.

يتم فتح الملفات بالطريقة التالية

ifstream inputFile;

هذا هو التعريف للكائن و ليس فتحه

من ثم فتحه بالطريقة التالية

inputFile.open(“customer.dat”);

فى هذه الجملة لكى نقوم بفتح ملف قمنا بعمل او فتح ملف بأسم

customer.dat

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

فى الغالب عند فتح الملفات سوف تحتاج الى عنوانها الكامل داخل الجهاز مثال فى نظام التشغيل (الشبابيك) فالسطر التالى سوف يقوم بفتح المكان التالى :

اقتباس

C:\data\inventory.dat

نفتحه عن طريق

outputFile,open(“C:\\data\\inventory.dat”)

فى هذه الجملة تم فتح المسار التالى

اقتباس

C:\data\inventory.dat

و ربطه مع الكائن لكى يعمل مع البرنامج

ملاحظة : قمنا بأستخدام \\ اثنان و ليس واحد فى مسار البرنامج . ذكرنا سابقا اننا كى نكتُب

\

داخل جملة نصية نستخدم اثنان اى

\\

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

ifstream inputFile;
char fileName[20]
cout << “Enter the name of the file: “;
cin >> filename;
inputFile.open(fileName);

المثال الماضى اراك كيفية استخدام هذا الكائن فى سطرين مختلفين لكى نقوم بفتح الملف الان مثال لكى نعرف كيف نقوم بها فى سطر واحد

ifstream inputFile(“customer.dat”);

هذا السطر قام بعمل كائن

ifstream

و فتح ملف يُدعى

customer.dat

اغلاق الملف

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

1 – اغلبية نُظم التشغيل تقوم بحفظ الملفات فى file buffer قبل ان يتم كتابتها داهل الملف . ال buffer و قطعة صغير فى الذاكرة تقوم باحتفاظ البيانات حتى يتم غلق البرنامج . هذه الطريقة تقوم بعمل سرعة اعلى فى برنامجك و نظام تشغيل .

2 – بعض انظمة التشغيل لديها حدود معينة فى كمية الملفات المفتوحة فى نفس الوقت. عندما يتم اغلاق الملف فهو لا يعمل الان اى انك من الممكن استخدام مساحته فى فتح ملف اخرى.

اغلاق البرنامج يكون بالطريقة التالية

outputFile.close();

كتابة البيانات الى ملف

انت بالفعل تعلم استخدام ال

stream insertion operator ( << )

مع الكائن

cout

سوف نستخدمها تمام مع كتابة البيانات الى الملف مثال ( كتابة نص الى ملف)

outputFile << “I love C++ Programming”;

هذه لجملة تقوم بكتابة النص الماضى الى الملف المراد الحفظ عليه. كما رئينا فهى تشبه تمام الكائن

cout

مع فرق واحد و هو تغيير الاسم. هنا مثال يقوم بحفظ نص و متغير

outputFile << “Price: “ << price;

البرنامج التالى سوف يقوم بفتح ملف جديد و حفظ بعض البيانات من ثم الغلق:

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

int main()
{
ofstream outputFile;
outputFile.open(“demofile.txt”);

cout << “Now writing data to the file.\n”;

outputFile << “Bach\n”;
outputFile << “Beethoven\n”;
outputFile <<”Mozart\n”;
outputFile <<”Schubert\n”;

outputFile.close();
cout << “Done\n”;
cin.get();
return 0;
}

المخرجات فى البرنامج

اقتباس

Now writing data to the file.

Done.

المخرجات داخل الملف

اقتباس

Beethoven

Mozar

Schubert

Bech

قراءة البيانات من ملف

ال

>>

لا تقوم فقط بقراءة مدخلات المستخدم بأستخدام الكائن

cin

و لكن ايضا فهى تقوم بقراءة البيانات من ملف مافلنقول اننا قمنا بعمل

ifstream inFile

فأن السطر القادم سوف يقوم بقراءة بيانات مُخزنة الى المتغير

inFile >> name;

فى البرنامج الماضى قُمنا بتخزين التالى

اقتباس

Bech

Beethoven

Mozar

Schubert

البرنامج القادم سوف يقوم بقرائتهم و تخزينهم داخل المتغير من ثم عرضهم

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

int main()
{
ifstream inFile;
const int SIZE = 81;
char name[SIZE];

inFile.open(“demofile.txt”);
cout << “Reading data from the file.\n\n”;

inFile >> name;
cout << name << endl;

inFile >> name;
cout << name << endl;

inFile >> name;
cout << name << endl;

inFile >> name;
cout << name << endl;

inFile.close();
cout << “\nDone.\n”;
cin.get();
return 0;
}

المخرجات :

اقتباس

Reading data from the file.

Bach

Beethoven

Mozart

Schubert

Done.

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

عندما يتم استخدام

>>

فسوف يتم تنفيذها . فأنها تنتظر ان تقراء اى جملة نصية بها مسافات او ضغط انتر او اى شئ فى المثال التالى

سوف يتم قراءة جملة نصية حتى نهاية السطر :

ملاحظة : انا اقول انه عند اى مسافة او انتر او مسطرة فسوف يتم تخزينه و تجاهله ما بعده حتى يأتى البيانات التى بعده

inFile >> name;

فى هذا المثال فأن ال

>>

تقوم ببدء الجملة و حتى تأتى الى ال

\n

B a c h \n

هكذا انتهى .

ال

>>

سوف تقوم بالتنفيذ حتى سطر جديد اذا فأن اول سطر سوف يتم تنفيذه ثم ثانى سطر الى اخره.

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

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

int main()
{

    ifstream inFile;
    int length, width, area;

    inFile.open("dimensions.txt");
    cout << "Reading dimensions of 5 rectangles from the file.\n\n";

    inFile >> length;
    inFile >> width;
    area = length * width;
    cout << "Area of rectanlge 1: " << area << endl;


    inFile >> length;
    inFile >> width;
    area = length * width;
    cout << "Area of rectanlge 2 " << area << endl;


    inFile >> length;
    inFile >> width;
    area = length * width;
    cout << "Area of rectanlge 3: " << area << endl;


    inFile >> length;
    inFile >> width;
    area = length * width;
    cout << "Area of rectanlge 4: " << area << endl;


    inFile >> length;
    inFile >> width;
    area = length * width;
    cout << "Area of rectanlge 5: " << area << endl;

    inFile.close();
    cout << "\nDone.\n";
    cin.get();
    return 0;

}

قبل ان يتم تنفيذ البرنامج يجب عليك ان تقوم بعمل ملف

اقتباس
txt (with notepad)

به الارقام التالية بالظبط كما يلى

اقتباس

10 2

5 7

18 9

6 20

8 3

لاحظ ان البرنامج قراء اولا الطول و من ثم العرض و من ثم ضربهم فى بعض اذا فان البرنامج يوجد به التالى:

Rectangle 1: length = 10, width = 2
Rectangle 2: length = 5, width = 6
Rectangle 3: length = 18, width = 9
Rectangle 4: length = 6, width = 20
Rectangle 5: length = 8, width = 3

المخرجات :

اقتباس

Reading dimensions of 5 rectangles from the file.

Area of rectangle 1: 20

Area of rectangle 2: 35

Area of rectangle 3: 162

Area of rectangle 4: 120

Area of rectangle 5: 24

Done.

الى هنا نكون قد انتهينا من دروسنا و شابتر 3 كاملا و بأذن الله سوف يتم وضع الاسئلة يوم الاربعاء ..

برجاء الدعاء لى و لأهلى بالمغفرة و الهداية و التوفيق

و الدعاء لزوج عمتى ان يرحمه الله و ان يغفر له

السلام عليكم...

4

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#6

الله يرحمـه ويغفر له .. ويسكنه فسيح جناته ..

.. لـي عـوده

#7
اقتباس
الله يرحمـه ويغفر له .. ويسكنه فسيح جناته ..

name : mohamedyosry

#8

جزاک الله خیرا کثیرا.

جمیل.

لقد أنت قمت بعمل کبیر و صعب. جزاک الله علی جهودک

#9

تمت اضافة اسئلة شابتر 3 اسئلة: شابتر 3 ( التفاعلات)

تم تعديل هذه المشاركة بواسطة XMasterrrr في 10 نوفمبر 2010 في 05:49

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#10

تم اضافة شابتر 4 :شابتر 4 (اتخاذ القرارات)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#11

تم اضافة شابتر 4 (الجزء الثانى)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

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