البرمجة بلغة C/ف1:مدخل إلى لغة C
ما هي لغة C؟
عدللغة C هي لغة برمجة من الجيل الثالث متعددة الأغراض أمرية إجرائية تدعم البرمجة المهيكلة. وضع دُنِيس ريتشي قواعدها في السبعينيات من القرن العشرين. تُستعمل اللغة على نطاق واسع في برمجة أنظمة التشغيل وبروتوكولات الاتصال والتطبيقات البرمجية، ويمكن أن تُستعمل مع فئات متنوعة من عتاد الحاسب تتراوح من الحواسيب العملاقة حتى الحواسيب المُصغرة والأنظمة المُضمَّنة.
طور دُنِيس لغة C في مختبرات بِل بين عامي 1972 و1973 في مختبرات بل في الولايات المتحدة، وكان الهدف هو إنشاء تطبيقات تعمل على نظام يونيكس. سُميَّت اللغة C لأنها طُورِّت بعد لغة B. اكتسبت هذه اللغة شعبية جارفة بدءًا من ثمانينيات القرن العشرين، وأصبحت اليوم واحدة من أكثر لغات البرمجة انتشاراً حول العالم. قعَّد المعهد الأمريكي القومي للمعايير والمنظمة الدولية للمعايير اللغة سنة 1989.
تسمح لغة C بالتعامل مع عتاد الحاسوب على مستوى منخفض جداً، وهذا يعني إمكانية التعامل مع العناوين الحقيقية لمواقع الذاكرة، ولكنها في الوقت نفسه تسمح بكتابة برامج يمكن تشغيلها على منصات متعددة، ولهذا فهي ضمن أول 3 لغات برمجة وفقاً لمؤشر TIOBE منذ العام 2000.[1]
النحو في لغة C
عدلالعناصر الرئيسة
عدلمجموعة المحارف
عدللغة C هي لغة نصية، تكتب باستعمال المحارف التالية:
- 1. الحروف الألفبائية الإنجليزية الكبيرة والصغيرة، وهي مشتقة من الألفبائية اللاتينية، وعددها 52 وهي:
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z
|
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z
|
- 2. الأرقام العشرية، وعددها 9 وهي:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9
|
- 3. محرف الفراغ
- 4. محارف خاصة، عددها 29، ويبين الجدول 1 تفصيلها وأسمائها:
المحرف | الاسم | المحرف | الاسم | المحرف | الاسم | المحرف | الاسم |
! |
علامة التعجيب | # |
علامة المُربَّع | % |
علامة النسبة المئوية | ^ |
؟؟ |
& |
علامة العطف اللاتينية | * |
النجمة | ) |
قوس أيسر | ( |
قوس أيمن |
- |
الشريطة الأفقية علامة الطرح |
_ |
الشريطة السفلى | + |
علامة الجمع | = |
علامة المساواة |
~ |
مدَّة | [ |
قوس مربع أيسر | [ |
قوس مربع أيمن | \ |
شريطة مائلة شريطة مائلة يسرى |
شريطة عمودية | ; |
فاصلة منقوطة | : |
نقطتان رأسيتان | ' |
فاصلة عليا |
الكلمات المحجوزة
عدليوجد في لغة C 32 كلمة محجوزة لأغراض النحو يبينها الجدول 1، لهذه الكلمات وظيفة محددة يفهمها المُصرِّف، ولذلك لا يمكن أن تُستعمل لأي غرض آخر.
do |
default |
continue |
const |
char |
case |
break |
auto
|
if |
goto |
for |
float |
extern |
enum |
else |
double
|
static |
sizeof |
signed |
short |
return |
register |
long |
int
|
while |
volatile |
void |
unsigned |
union |
typedef |
switch |
struct
|
ستُناقش وظيفة كل كلمة من هذه الكلمات في ما سيأتي من هذا الفصل أو في الفصول الأخرى.
المعاملات
عدلهي مجموعة من المحارف لها دلالات خاصة يُميزها المُصرِّف عند التعامل مع النص البرمجي. تتنوع دلالات المُعاملات، فبعضها يشير دالة أو إلى مصفوفة، وبعضها إلى مؤشر أو موقع ذاكرة وبعضها إلى عمليات رياضية أو منطقية. ولها نوعان:
- المُعاملات وحيدة المحرف
- المعاملات مُتعددة المحارف
معاملات وحيدة المحرف
عدلهي معاملات تتكون من محرف واحد فقط من المحارف المدعومة في لغة C، وهذه المعاملات هي:
) |
( |
[ |
] |
. |
! |
- |
< |
> |
? |
:
|
= |
, |
+ |
- |
* |
/ |
% |
& |
^
|
أهم هذه المعاملات العمليات الرياضية:
- الجمع
+
، تجمع معاملين مثلاًx + y
أو3 + 2
، وتكون النتيجة في الحالة الثانية هي 5. - الطرح
-
، تطرح ما إلى يسار العملية من ما إلى يمينه، مثلاًx - y
أو3 - 2
، وتكون النتيجة في الحالة الثانية هي 1. - الضرب
*
/ أي جداء ما إلى يمين العملية مع إلى إلى يساره، مثلاًx * y
أو3 * 2
، وتكون النتيجة في الحالة الثانية هي 6. - القسمة
/
أي تُقسِّم ما إلى يسار العملية إلى على يمينها، مثلاًx / y
أو6 / 3
، وتكون النتيجة في الحالة الثانية هي 2. - باقي القسمة
%
، تُقسِّم ما إلى يسار العملية إلى على يمينها ولكنها تحسب باقي القسمة لا نتيجة التقسيم، مثلاًx % y
أو6 % 3
، وتكون النتيجة في الحالة الثانية هي 0.
تستعمل الأقواس أيضاً (
و )
لتجميع العمليات الحسابية وتحديد أولوية التنفيذ.مثلاً (1 + 2) * 3 هي 9 أما 1 + 2 * 3 فهي 7.
ومن المعاملات وحيدة المحارف أيضاً معامل الإسناد =
ويستعمل لتخزين ناتج ما يوجد على يمينه في ما يوجد على يساره مثلاً: x = 3 + 2
تعني: خزِّن 5
في المُتغيِّر x
.
للمعاملات وحيدة المحارف الأخرى معانٍ محددة وستذكر في مواقع وروودها.
المعاملات عديدة المحارف
عدلهي معاملات تتكون من محرفين، على الأقل، من المحارف المدعومة في لغة C، وهذه المعاملات هي:
-> |
++ |
-- |
=> |
=< |
== |
!= |
&& |
!! |
<< |
>>
|
=+ |
-= |
*= |
/= |
%= |
=<< |
=>> |
=! |
=& |
=^
|
وأهم المعاملات الثنائية معاملات الشرط، وهي شروط لها مدخلين، على يسار المعامل وعلى يمينه، وتعيد قيمة 0 لو لم يتحقق الشرط و1 لو تحقق، وهي:
- شرط المساواة
==
، وتفحص فيا لو كان ما يوجد على يمينها مساوٍ لما يوجد على يسارها، مثلاًx == y
ستعطي قيمة 0 لو كانت قيمةx
لا تساويy
، وقيمة 1 لو كانت قيمةx
تساويy
. - شرط عدم المساواة
!=
، وتفحص فيا لو كان ما يوجد على يمينها مساوٍ لما يوجد على يسارها، مثلاًx != y
ستعطي قيمة 0 لو كانت قيمةx
تساويy
، وقيمة 1 لو كانت قيمةx
لا تساويy
. - شرطا أكبر أو مساوٍ
>=
وأصغر أو مساوٍ<=
،
ومن المعاملات الثنائية المعاملات المنطقية، ولهذه المعاملات مدخلين يلزم ضبطهما وهي:
- الضرب المنطقي
&&
، وتجري عملية الضرب المنطقي بين مدخليها، أي ما يوجد على يمينها وما يوجد على يسارها. وتكون النتيجة هي 1، إذا فقط إذا، كانت قيمتا طرفي العملية مساوية للواحد معاً، و0 بخلاف ذلك. - الجمع المنطقي
||
، وتجري عملية الضرب المنطقي بين مدخليها، أي يوجد على يمينها وما يوجد على يسارها. تكون النتيجة هي 1، إذا فقط إذا، كانت قيمة أحد طرفي العملية مساوية للواحد، و0 بخلاف ذلك.
ومن المعاملات الثنائية أيضاً معاملا الزيادة الواحدية ++
والإنقاص الواحدي--
، ولهما مدخل واحد فقط، إما على يمين المعامل أو على يساره، ويُسببان على الترتيب، زيادة قيمة 1 إلى قيمة مخزنة مسبقاً وإنقاصها. مثلاً لو كانت قيمة x مساوية 5، فإن x++
ستجعلها 6 وx--
ستجعلها 4.[هوامش 1]
للمعاملات ثنائية المحارف الأخرى معانٍ محددة وستذكر في مواقع وروودها.
الثوابت
عدلهي تراكيب نصية تُبنى باستعمال المحارف المدعومة في اللغة، يكون للتركيب معنى محدد جديد يختلف عن المعنى الذي يحمله كل مكون من مكوناته.
الأعداد الطبيعية والصحيحة
عدلوهي الأعداد التي تنتمي لمجموعة الأعداد الطبيعية، أي هي الأعداد الموجبة التي لا فواصل فيها، نحو 1
و5
و100
. أما الأعداد الصحيحة، نحو 5-
فيفهمها المُصرِّف على أنها تطبيق العملية وحيدة المعامل -
على الثابت 5
.
يعتمد التمثيل السابق نظام العد العشري لتمثيل الأعداد، أي يكون أساس نظام العد 10 ويُكتب العدد باستعمال الأرقام: 0 1 2 3 4 5 6 7 8 9
، ولكن يُمكن تمثيل الأعداد القيم أيضاً بنظام العد الثماني وست العشري. يكون الأساس 8 في نظام العد الثماني والأرقام: 0 1 2 3 4 5 6 7
، وفي نظام العد ستة العشري 16 والأرقام: 0 1 2 3 4 5 6 7 8 9
مع المحارف A B C D E F
.
يُكتب العدد بنظام العد الثماني مسبوقاً بصفر، نحو 045، وبنظام العد ست العشري مسبوقاً بالبادئة 0x
نحو 0x3A
.
الأعداد ذات الفواصل
عدلهي الأعداد الحقيقية، أي التي تحوي فاصلة في بنيتها تفصل بين الجزء الصحيح والجزء الكسري. يتكون العدد ذو الفاصلة بلغة C من 6 أجزاء:
- الجزء الصحيح، ويكون أي عدد صحيح نحو 123.
- الفاصلة، ورمزها
.
. - الجزء الكسري.
- حرف
e
أوE
، ويُشير إلى الرفع إلى أس عشري، أي ما يسبق الحرف E يكون مضروباً بالقيمة 10 مرفوعة لأس ما يلي الحرفE
. - إشارة - أو + للأس.
- قيمة الأس.
مثلاً: 123.456E-7
هو مثال عن عدد ذو فاصلة تظهر في الأقسام الستة، وهو يعني 123.456x10-7
.
لا داع لذكر الأجزاء كلها، ويمكن اختصارهاً حسب القواعد التالية:
- يمكن إهمال الجزء الصحيح فقط أو الجزء الكسري فقط ، ولكن لا يمكن إهمال الجزأين معاً، أي مثلاً:
123.E-7
أو.456+E-7
أو123.
- يمكن إهمال الفاصلة أو حرف
e
، ولكن لا يمكن إهمال الجزأين معاً، مثلاً:123E-7
أو123.456
.
الثوابت المحرفية وسلاسل المحارف
عدلالثابت المحرفي هو محرف مكتوب بين فاصلتين عليتين، مثلاً: '1'
و'A'
و'!'
أما السلسلة المحرفية تتابع من الثوابت المحرفية يضم محرفاً واحداً على الأقل، وتكتب بين علامتي تنصيص، مثلاً: "A"
و"Hello World!"
.
تستعمل مجموعة من المحارف المركبة ضمن السلاسل المحرفية لأداء وظيفة محددة، وهي
"n\"
لإنزال المؤشر إلى بداية سطر جديد."t\"
لإضافة مسافة جدولة أفقية."b\"
لتحريك المؤشر محرف واحد إلى الخلف"r\"
لإعادة المؤشر إلى بداية السطر الحالي."f\"
نقل المؤشر إلى بداية صفحة جديدة."a\"
إصدار إشارة صوت."\\"
إضافة المحرف\
إلى سلسلة المحارف.""\"
إضافة المحرف"
إلى سلسلة المحارف."'\"
إضافة المحرف'
إلى سلسلة المحارف.
يلزم الانتباه إلى أن محرف معدوم القيمة "\0"
يُضاف إلى نهاية سلسلة المحرف عن تخزينها في الذاكرة، هذا يعني أن السلسلة "Hello World!"
تُخزَّن "Hello World!\0"
، ويعني هذا ضرورة حجز محرف إضافي في الذاكرة عند تخزين سلسلة المحارف.
الأنواع
عدلتتعامل لغة c مع نوعين رئيسين من البيانات: الأعداد الصحيحة والأعداد ذات الفاصلة، ويُسمَّى هذان النوعان بنوعي الأساس، ولهما تصنيفات فرعية عديدة، مثلاً تُخزَّن المحارف على هيئة صنف من الأعداد الصحيحة. كما يُمكن أن يُشتق من هذين الصنفين عددٌ غير محدود من الأنواع المشتقة، نحو المصفوفات والبنى والواحدات
الأنواع الرئيسة
عدليُبين الجدول 2، الأنواع الرئيسة وتصنيفاتها في لغة C، وهي تُقسم كما ذُكًر مسبقاً إلى نوعين رئيسين: الأعداد الصحيحة والأعداد الحقيقية، وتُسمى في هذا السياق الأعداد ذات الفواصل.
التصنيف | التصريح | الطول بالبت | المجال | |||
---|---|---|---|---|---|---|
الأعداد الطبيعية والصحيحة | غير المسماة | الصغيرة | ذات إشارة | char وsigned char |
8 | [−127, +127] |
من غير إشارة | unsigned char |
[0, 255] | ||||
المتوسطة | ذات إشارة | short وshort int وsigned short وsigned short int وint وsigned وsigned int |
16 | [−32,767, +32,767] | ||
من غير إشارة | unsigned short وunsigned short int |
[0, 65,535] | ||||
الكبيرة | ذات إشارة | long وlong int وsigned long وsigned long int |
32 | [−2,147,483,647, +2,147,483,647] | ||
من غير إشارة | unsigned long وunsigned long int |
[0, 4,294,967,295] | ||||
فائقة الكبر | ذات إشارة | long long وlong long int وsigned long long وsigned long long int |
64 | [−9,223,372,036,854,775,807, +9,223,372,036,854,775,807] | ||
من غير إشارة | unsigned long long وunsigned long long int |
[0, 18,446,744,073,709,551,615] | ||||
المسماة | enum |
مجموعة من لأعداد الطبيعية | ||||
الأعداد ذات الفواصل | البسيطة | float |
32 | |||
عالية الدقة | double |
64 | -0.90E308 حتى 0.90E-308- ومن 0.56E-308 حتى 0.90E308 | |||
فائقة الدقة | long double |
64 أو 128 | يختلف حسب نظام التشغيل |
تُصنف الأنواع الفرعية من مناظير مختلفة، أولها هو التصنيف حسب نوع القيم التي يمكن أن تمثيلها، فلو أريد أن تمثيل قيم موجبة فقط، مثلاً للعمر أو الزمن، استعملت الكلمة المحجوزة unsigned
، أما لو وجدت حاجة لتمثيل قيم سالبة أيضاً، مثلاً حسابات مصرفية ونحوها، فتستعمل الكلمة المحجوزة signed
. يمكن أن تُصنف الأنواع الفرعية حسب الحجم الذي تشغله في الذاكرة، ويرتبط هذا الحجم بمجال القيم التي يمكن تمثيلها فمثلاً لو حجز N بت في الذاكرة، يمكن تمثيل 2N قيمة، قد تكون القيم متناظر حول 0 أي: من 2/(2N)- إلى 2/(2N)+، أو من الصفر إلى 2N-1، يمكن أن عدد البتات 8 أو 16 أو 32 أو 64 أو 128 بت. وتُستعمل كلمات short
وlong
لتوليد الأنواع الفرعية على هذا الأساس.
تُستعمل الأعداد الصحيحة لتخزين المحارف في لغة C، ويعني هذا إمكانية استعمال العمليات الحسابية عليها وغالياً ما يكون النوع المُستعمل هو المحرف عديم الإشارة unsigned char
وهو يحجز 8 بتات في الذاكرة، ولكن يمكن أيضاً استعمال نوع المحرف ذو الإشارة signed char
لأداء الغرض نفسه.
تدعم لغة C نوعاً يُسمَّى القوائم العددية، وهو نوع يتكون من مجموع منتهية من الأعداد الصحيحة، يكون لكل منها مرتبطاً بمُعرِّف نصي، مثلاً يُمكن أن يُصرَّح عن قائمة لأيام الأسبوع، اسمها days_of_the_week
، كما يأتي:
enum days_of_the_week = {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
في هذه القائمة 7 عناصر، لها مُعرفات من 0 حتى 6، تُرتبط بالأيام حسب ترتيب ورودها، أي 0 مع Monday
و6 مع Sunday
. تقبل هذه العناصر العمليات الحسابية أيضاً، مثلاً Wednesday + 1
هو Tuesday
.
تُمثَّل الأعداد ذات الفاصلة باستعمال ثلاثة أنواع مختلفة هي البسيطة float
وعالية الدقة double
وفائقة الدقة long double
. يمكن للأعداد البسيطة ذات الفواصل أن تُظهر حتى 7 مراتب عشرية بعد الفاصلة، أما الأعداد عالية الدقة فتظهر حتى 15 مرتبة بعد الفاصلة. أما الأعداد فائقة الدقة، فيختلف طولها، وبالتالي قدرتها على إظهار الأعداد بعد الفاصلة حسب نظام التشغيل.
لا تدعم لغة C نوعاً مخصصاً للقيم المنطقية، أي التي تأخذ قيمة 0 أو 1 فقط، وعادة ما يُستعمل نوع المحارف عديمة الإشارة لأداء الغرض نفسه. وهذا يعني أن العمليات المنطقية في لغة C تُعيد أعداداً طبيعية في خرجها، هي القيمة 0 مقابلة للخطأ والقيمة 1 مقابلة للصواب.
الأنواع المشتقة
عدل- المصفوفات
- الدوال
- المؤشرات
- البنى
- الواحدات
النص البرمجي
عدلالتعليقات
عدلهي أجزاء من البرنامج تهدف لشرح عمله أو توضيح مسألة ما به، وتكون موجهة للمبرمج الذي كتب البرنامج، لتذكيره بمسألة معينة، أو لمبرمجين آخرين قد يتعاملون مع البرنامج نفسه لغرض تحسينه. يتجاهل المُصرِّف التعليقات ولا يُعالجها.
يوجد في لغة C طريقتان لإضافة التعليقات:
- 1. تضمين نص تعليق بين محرفي مركبين هنا مِحرف بداية التعليق
*/
ومِحرف نهاية التعليق/*
، مثلاً:
/* This is a comment
It has two lines
*/
- 2. إضافة نص التعليق بعد المحرفين
//
، وعندها يمتد التعليق آلياً حتى أول محرف تالٍ للنزول لسطر الجديد. مثلاً:
// This is a comment, it ends after the point, there is a new line character.
العبارة
عدلالعبارة: أمر برمجي لأداء مهمة معينة، والتصريح عن المتغيرات هو عبارة. التصريحات المعقدة = كتلة من النصوص البرمجية في {...}، يكون التعبير الصريح مبني على:
- معامل، واحد على الأقل.
- عملية.
- متغير لتخزين النتيجة.
أنواع العبارات:
- عبارة رياضية: العمليات: +، -، *، /، %
- عبارة علائقية: العمليات: >، <، =، >=، <=، ==، !==.
- عبارة برمجية: العمليات: &&، ||، !.
- عبارة للمؤشرات: العمليات: *، &.
المتغيرات
عدلالمُتغيِّر[هوامش 2] هو مكان في الذاكرة تخزن به قيمة، ولكل متغير: اسم ونوع وقيمة وعنوان في الذاكرة. تُسمَّى عملية حجز المتغير في الذاكرة ومنحه اسماً بالتصريح[هوامش 3] عن المتغيرات، وهي تتضمن ذكر اسمه ونوعه على الأقل، ويمكن أيضاً ذكر قيمته، أما عنوانه فيُحجز آلياً في الذاكرة. يكون اسم المُتغيِّر فريداً ويُستعمل للدلالة عليه، وله قواعد هي:
- يمكن أن تحتوي أحرف لاتينية كبيرة وصغيرة، أو شرطات سفلية وأرقام.
- يجب أن يكون الحرف الأول حصراً حرفاً أو شرطةً سفلية، ولا يمكن أن تكون رقماً.
- لا يوجد قاعدة لطول اسم المتغير (لكن يوصى أن تكون أقل من 32 محرفاً).
- لا يجب أن يكون الاسم كلمة محجوزة.
- لا يمكن كتابة الاسم بمحارف عربية.
اسم المتغير ونوعه وعنوانه ثوابت لا تتغير بعد التصريح عن المتغيرات، أما القيمة فيمكن تغيرها باستعمال معامل الإسناد =
. يمكن، في حالات محددة، تثبيت القيمة أيضاً، ولا يمكن تغييرها بعذ التصريح عن المتغير وضبطه، وعندها تُستعمل الكلمة المحجوزة const
في أثناء التصريح للإشارة إلى تثبيت قيمة المُتغير.
في ما يأتي الصيغة العامة لتحديد نوع المتغير عند التعريف عنه:
وسنختصرها بكلمة type
، ويأتي بعدها اسم المتغير، ويلزم ألا يخالف قواعد التسمية، وليكن مثلاً name
، ثُمَّ تختم عبارة التصريح بالفاصلة المنقوطة ;
ويكون ما سبق بالشكل التالي:
type name;
مثلاً التصريح عن متغير من النوع int
اسمه x
يكون بالشكل التالي:
int x;
أما لو أريد ضبط قيمة المتغير في أثناء التصريح عنه فتضاف القيمة مباشرة، ولتكن 5، بعد عملية الإسناد =
، مثلاً:
int x = 5;
يمكن أيضاً التصريح عن أكثر من متغير في الوقت نفسه، بالفصل بين الأسماء والقيم بالفواصل، مثلاً، في ما يأتي التصريح عن 3 متغيرات هي x
وy
وz
وضبط قيمة x
إلى 5 وz
إلى 10:
int x = 5, y , z=10;
أما التصريح عن مُتغير من النوع المحرفي اسمه c
وقيمته A
فيكون كما يأتي:
char c = 'A';
نظرة عامة للبرمجة بلغة C
عدليتألف البرنامج المكتوب بلغة C من ملف مصدر واحد أو أكثر، يتضمن كل منها جزءاً من البرنامج الكامل. يلزم أن يحتوي أحد الملفات على الدالة الرئيسة[هوامش 4] هي نقطة الانطلاق في تنفيذ البرنامج. يُعالج كل ملفٍ على حدته بواسطة مُصرِّف[هوامش 5]، يُحلل البرنامج ويتأكد من عدم وجود أخطاء نحوية فيه، نحو التهجئة والإملاء، وعدم وجود أخطاء بنيوية، ويُولِّد المُصرِّف عادة رسائلَ لإعلام المبرمج بالأخطاء التي وجدها ومواقعها في البرنامج، وعلى المُبرمِج بعدها أن يصحح الأخطاء ويُعيد تصريف البرنامج كما تقدَّم.
يُسمَّى خرج هذه المرحلة، لو صُرِّف البرنامج من غير أخطاء، وحدة الغرض المعيارية[هوامش 6]، ويُسلَّم إلى برنامجٍ يُسمَّى الرابط[هوامش 7]، يعمل على ربط الوحدة مع الوحدات الأخرى ويُضيف دوالاً مُعرَّفة في مكتبات خارجية، نحو الدوال المسؤولة عن عمليات الدخل والخرج. يكتشف الرابط أيضاً بعضاً من الأخطاء، إن وجدت، خاصة تلك المرتبطة باستدعاء الدوال، ويُشير إليها برسائل محددة
يكون خرج هذه المرحلة، لو تمت من غير أخطاء، ملفاً تنفيذياً يمكن تشغيله على الحاسوب.
لا يوجد بنية موحدة لملف المصدر، ولكن يُستحسن أن يُرتب الملف بأسلوب محدد ليكون مقروءاً للمبرمجين الآخرين. يتكون ملف المصدر من الأقسام التالية مرتبةً حسب ورودها:[هوامش 8]
- أوامر مرحلة ما قبل المعالجة، وهي الأسطر التي تكون مسبوقة بمحرف #
- الأنواع التي يُعرفها المُبرمج.
- التصريح عن المتغيرات والدوال الخارجية.
- تعريف الدوال بما فيها الدالة الرئيسة.
ًمثلاً، يطبع البرنامج التالي عبارة "Hello World" خرجاً، وفيه القسمان 1 و4 فقط. في السطر 1 تُضمَّن مكتبة الإدخال والإخراج القياسية[هوامش 9]، التي تُعرِّف كيف تعمل دالة الطباعة printf الواردة في السطر 4، وهي الدالة التي تطبع العبارة، أما الدالة الرئيسة، فهي مُعرَّفة في الأسطر 3-6.
# include <stdio.h>
int main() {
printf ("Hello World\n");
return 0;
}
مرحلة قبل المعالجة
عدل- يجب أن تبدأ بالمحرف المخصص (#).
- مُعالَجَة قبل إضافتها للمترجم
- يمكن استخدامها لـ:
- إضافة نص من ملف آخر:
#include <math.h>
- ابحث عن الملف في مجلد البيئة البرمجية في الحاسب.
#include "math.h "
- ابحث عن الملف في نفس المجلد الذي يحتوي على النص البرمجي الأساس.
- تحديد الثوابت
أوامر مرحلة ما قبل المعالجة:
الأمر | الوصف |
---|---|
#define | تعريف ماكرو لمرحلة ما قبل المعالجة |
#undef | إزالة تعريف ماكرة |
#include | إدخال نصوص من ملف آخر |
#if | إدخال نصوص مشروط بتعبير |
#ifdef | إدخال نصوص مشروط بوجود ماكرو |
#ifndef | إدخال نصوص مشروط بنفي تعبير |
#else | إدخال نصوص في حالة لم يتحقق شرط |
#endif | نهاية النص المشروط |
#line | إضافة رقم سطر لرسائل المُصرِّف |
دوال مفيدة
عدلدالة الطباعة النصية printf
عدلالنوع | الرمز |
---|---|
محرف | c |
عدد طبيعي أو صحيح | d |
عدد ذو فاصلة عائمة | f |
سلسلة محارف | s |
هي دالة مُعرَّفة في مكتبة الإدخال والإخراج المعيارية تطبع نصاً على أداة الخرج. اسم الدالة هو printf
، ولها متُغيِّر واحد على الأقل هو سلسلة محرفية،[هوامش 10] مثلاً لو كان البرنامج:
printf ("Hello world");
فهو يطبع عبارة Hello world
.
يمكن إضافة متغيرات إلى السلسلة المحرفية، ويُشار إليها عندها باستعمال محرف خاص يبينه الجدول X بعد محرف % ضمن السلسلة المحرفية، كما يلزم عنده إضافة مُتغير جديد للدالة الطباعة هو المتغير الذي أشير إليه في السلسلة، مثلاً لو كانت اسم الطالب مخزناً في المتغير name ودرجته في المتغير note،وأردنا طباعة عبارة نصية تشمل الاسم والدرجة فإنها ستكون كما يأتي:
printf ("Studen %s note is %d, name, note");
يستبدل المُصرِّف في هذه الحالة بالمحرفين %s
المُتغير name
وبالمحرفين %d
المُتغير note
، فلو كان اسم الطالب أحمد، أي Ahmed، ودرجته 60، فإن العبارة المطبوعة ستكون "Studen %Ahmed note is 60
. لذلك فإن ترتيب الوسائط ضمن دالة الطباعة وتوافق أنواعها من المحارف المستعملة للدلالة عليها مسأللتان تبلغان من الأهمية الغاية، ويسبب عدم احترامهما ظهور نتائج غريبة في الخرج تختلف عن النتائج المتوقعة.
ليس بالضرورة أن يكون وسيط الدالة مُتغيراً بل يمكن أن يكون تعبيراً، مثلاً 2*x
، وفي ما يأتي مثال عن طباعة عدد ومضاعفه باستعمال دالة الطباعة:
printf ("2*%d = %d, x, 2*x");
ولو كانت قيمة x
هي 5 مثلاً، فسيكون الخرج المطبوع: 2*5 = 10
scanf
عدلتعليمة لقراءة التعليمات المدخلة. بنية التعليمة scanf:
- نوع القيمة المدخلة المراد ترميزها
- تشير علامة " & " إلى: عنوان
- اسم المتغير الذي سيخزن القيمة
هوامش
عدل- ↑ مع أن
++x
وx++
متكافئان نظرياً ويؤديان لزيادة 1 إلى قيمة x فإن أولوية التنفيذ مختلفة، ولو وجد المعاملان ضمن تركيب رياضي ما فإن استبدال أحدهما بالآخر سيؤدي لنتائج مختلفة. - ↑ Variable
- ↑ Declaration
- ↑ بالإنجليزية: main
- ↑ بالإنجليزية: Compiler
- ↑ بالإنجليزية: Object module وتُسمَّى أيضاً نص الغرض البرمجي، بالإنجليزية: Object code
- ↑ بالإنجليزية: linker
- ↑ هذا هو الترتيب الأمثل، ولكنه ليس إلزامياً، كما أن غياب بعض الأقسام وارد حسب الغرض الذي يُستعمل الملف لأجله
- ↑ اسمها stdio وهي اختصار للعبارة Standard inpuroutput
- ↑ تكتب وسائط الدالة بين قوسين
)
(
، وهذه الأقواس تدل عموماً على الدوال التي وسنتحدث عنها بالتفصيل في الفصل الخامس من هذا المساق