زبان برنامه نویسی سی/آغاز

ویکی‎کتاب، کتابخانهٔ آزاد
پرش به ناوبری پرش به جستجو
Gnome-go-last.svg
Gnome-go-first.svg

استانداردی که در سال 2011 توسط ISO بازتعریف شد شامل چند افزایش و تغییر در تابع‌های کتابخانه‌ای و ماکروها بود و از طرفی ، مقرر کرد تا از کاراکتر سِت Unicode یونیکد ، استفاده شود که باید بدانید ، در حال حاضر ، فقط چند کامپایلر هستند که استاندارد C11 و در ادامه C18 را پشتیبانی می نمایند

اولین چیزی که باید بدانید این است که Encoding در برنامه‌نویسی و برنامه‌های کامپیوتری به الگوریتم ذخیره سازی اطلاعات گرافیکی ، صوتی ، متنی و ... در فایل به صورت باینری می‌باشد و Decoding به معنای ترجمه یک یا چند بایت Byte به اطلاعات خروجی ( که می‌تواند متنی ، گرافیکی ، صوتی و ... باشد ) گفته می‌شود . اما در زبان های متنی این انکدینگ‌ها یا کاراکترست‌ها ، بایت هایی هستند ( یک یا چند بایت ) که توسط استاندارد خود ، تعریف می‌شوند تا معین کنند چه کاراکتری را با کمک فونت‌های متناظر خود نمایش دهند . سپس پردازنده‌های متنی ( ویرایشگرهای متن ) این امکان را به کاربر می‌دهند تا با استفاده از کیبورد خود و یا به واسطه مجموعه‌های کاراکتری ( کاراکترست ) که در برنامه‌ها موجود هستند ، کاراکتری را وارد نماید . کاراکتر به هر نشانه‌ای گفته می شود که مورد پردازش متنی قرار می‌گیرد . مثلاً « آ » ، « ۲ » ، « 5 » ، « i » و « @ » ، همگی کاراکتر هستند . برخی کاراکترها حروفی ( مثل حروف فارسی یا انگلیسی ) برخی کاراکترها عددی ( مثل اعدادی که به زبان فارسی یا انگلیسی نوشته می‌شوند ) و برخی کاراکترها گرافیکی هستند ، مثل @ ، # ، * و بسیاری از کاراکترهای دیگر مثل اموتیکون‌ها و ایموجی‌ها که در تعریف Unicode ( یونیکد ) تعریف شده‌اند و در کارست یا کاراکترست‌های یونیکد ، ما مجاز به استفاده از کاراکترهای بی‌شماری هستیم ، حال آنکه در تعریف ANSI تنها حروف و اعداد انگلیسی و علائم و کاراکتر های گرافیکی محدود به همراه کاراکتر های سفید ( مثل فضای خالی یا همان اسپیس Space ) می‌توانند ذخیره شوند و به نمایش در بیایند

پس اول بررسی کنید که کامپایلر شما مبتنی بر کدام استاندارد است ، چرا که هر برنامه‌ای که می‌نویسید را باید در همان کاراکترست متناظر با کامپایلر خود در یک فایل متنی با پسوند c ذخیره نمائید . پس فراموش نکنید : متون معمولی در فایل های txt ذخیره می‌شوند و شما مجاز به استفاده از آن برای نوشتن برنامه‌های C نیستید و باید حتماً پسوند فایل خود را برای ذخیره c بگذارید

مثل :


test.c
Hello.c

و نه :

test.txt
Hello.txt

دستور زبان سی[ویرایش]

شما در زبان سی ، همانند هر زبان دیگری در یک محدوده مجاز ، قادر به برنامه‌نویسی خواهید بود . در زبان سی شما یا از پیش پردازنده ها Preprocessors استفاده می‌نمائید یا حکم ـی Statements را می‌نویسید یا اینکه طی نوشتن یک عبارت Expressions ، داده Data ایجاد شده‌ای را مورد مقایسه یا پردازشی قرار می دهید . قسمت دیگری که اختیاری است و توسط کامپایلر نادیده گرفته می‌شود یادداشت های شما Comments هستند

همچنین قبل از آغاز توضیحات بیشتر ، بهتر است یک مطلب را روشن نمائیم . در کتاب های آموزش زبان سی ( چه فارسی و چه انگلیسی ) مدام از دو گروه از عناصر زبان به نام ثابت استفاده می‌کنند که ما این دو گروه را از هم جدا می نمائیم . یک گروه ، ثابت های پایه‌ای هستند که بدین معنی خواهند بود که جزء پایه‌ها و ارکان زبان حساب می شوند و به صورت ثابت در زبان تعریف شده‌اند . ثابت های عددی مثل « 2 » یا « 564 » یا ثابت های حرفی مثل « 'c' » و ثابت های رشته‌ای مثل « " This is A String " » همگی ثابت‌های پایه‌ای می‌باشند . اما دسته دیگری از ثابت‌ها وجود دارند که به آنها ثابت مقداری خواهیم گفت که داده‌هایی هستند که به دستور شما ایجاد می‌شوند تا طی کامپایل و اجرای خروجی شما ، مقدار و موجودی داخل آن داده‌ها هرگز تغییر نیابند ( که در مبحث مربوط به خود ، مفصلاً به آن خواهیم پرداخت )

ما همواره در برنامه‌نویسی ، داده‌هایی را ایجاد می‌نمائیم و یا داده‌ها و سیگنال‌هایی را از ورودی‌های سیستم دریافت می‌کنیم و داده‌ها را به کمک دستورهای شرطی و عملگرهای منطقی و محاسباتی پردازش نموده و سپس با توجه به نیاز خود به کمک تابع‌های از پیش تعریف شده در زبان ، آن را به یک خروجی ارسال خواهیم نمود . بنابراین همواره در ابتدای کار باید داده یا داده‌هایی را ایجاد نمائیم که به آنها اصطلاحاً متغیر می‌گوئیم ، چرا که هر زمان در برنامه می‌توانیم مقدار آن را تغییر دهیم یا به سیستم عامل یا سخت‌افزار اجازه تغییر آن را بدهیم ( یا اینکه آن را ثابت کنیم و از قابلیت تغییر یک متغیر جلوگیری نمائیم ) پس هر داده‌ای در زبان سی ، متغیر حساب می شود . متغیر دارای یک نام یا شناسه Identifier خواهد بود به علاوه مقدار Value و موجودی‌ای که به آن اختصاص می‌دهیم . در متغیرهای عددی عدد متناظر با نوع داده را می‌نویسیم ( که باید در طیف قابل ذخیره در نوع داده باشد ) اما هر گاه بخواهیم یک کاراکتر یا مجموعه‌ای از کاراکترها ( رشته String ) را وارد نمائیم باید به ترتیت : از دو ' و " استفاده نمائیم . مثلاً « 'L' » یک کاراکتر را ایجاد می‌نماید و « " This is Another String " » یک رشته را

آغاز[ویرایش]

پیش از آغاز مبحث برنامه‌نویسی باید بگوئیم زمانی که برنامه خود را می‌نویسید و می‌خواهید آن را با انکدینگ ANSI در یک فایل c ذخیره نمائید ( اگرچه بعدها که مسلط شدید می توانید فایل های سرآیند را که با پسوند h. ذخیره می‌شوند را هم بنویسید ) باید بدانید که تنها مجاز به استفاده از حروف a تا z و از A تا Z و ارقام و اعدادی که از 0 تا 9 ایجاد شده‌اند به همراه :

'! , '' , " , # , % , & , ( , ) , * , + , - , = , . , , , ; , < , > , [ , ] , / , \ , ^ , _ , { , } , |

و البته فضاهای سفید شامل فاصله «  » Space ، شکست خط :

«

»

و tab های افقی و عمودی خواهید بود . ضمن اینکه تنها می‌توانید روی داده‌هایی که ایجاد و تعریف کرده‌اید پردازشی انجام دهید و هر داده باید دارای یک نام و یک مقدار باشد ، دستورها و حکم‌ها فقط می توانند با آرایش خاصی نوشته شوند و نمی توانید آنها را پس و پیش کنید یا چیزی را از آنها کم کنید . در واقع شما فقط مجاز هستید تا در ایجاد نام داده‌ها که متغیرها هستند و ممکن است این متغیر نام تابعی که میخواهید تعریف کنید باشد و مقدار و موجودی متغیرها و ترکیب منظم بخش‌های مختلف برنامه ، آن طور که میخواهید ، بنویسید . در غیر این صورت کامپایلر برنامه شما را کامپایل نخواهد کرد و خطا خواهد گرفت . در صورت داشتن Debugger به شما خواهد گفت که خطای برنامه نوشته شده شما از کجاست

حال می پردازیم به خود برنامه‌نویسی . شما در داده کاراکتری فقط می‌توانید یک کاراکتر را ذخیره کرده و مورد پردازش قرار دهید . اما در ایجاد یک رشته شما هر آنچه را در داخل دو " قرار داده باشید ذخیره خواهد گردید . ضمن اینکه شما با دستورات خاصی که داخل رشته‌ها نوشته می‌شوند می‌توانید متغیرهایی تعریف کنید تا برنامه با دستورات و خودکار سازی شما تغییرات را در هنگام اجرای برنامه اعمال کند . خارج از دو علامت کوت یعنی ' که برای ذخیره کاراکتر می باشد و یا دو علامت دابل کوت ، یعنی " که برای ذخیره رشته می‌باشد هر گاه از علامت شارپ # استفاده نمائید ، مجاز و مجبور به نوشتن یک پیش پردازنده هستید . پیش پردازنده‌ها از منظر کامپایلر بر هر اقدام دیگری ارجح هستند . از پیش پردازنده‌ها برای شرط کردن اجرای بخشی از برنامه و تکرار آن یا جا به جایی برنامه ، ایجاد داده‌هایی برای تعیین زمان ، نسخه سیستم عامل و ... و یا پیوست فایل های سرآیند که در آنها تابع‌های کتابخانه‌ای و ماکروها وجود دارند ، استفاده می‌نمائیم . هر گاه یک فایل سرآیند را ضمیمه نمودید ، با نوشتن تابع‌های کتابخانه‌ای و یا ماکروهای آن فایل سرآیند ، مجاز و مجبورید که از آن استفاده نمائید و نمی‌توانید داده دیگری را با هم همان نام ایجاد کنید . همین مسئله در مورد کلید واژه‌های زبان سی نیز صادق می‌باشد . واژه های زیر همگی کلیدواژه های زبان سی محسوب می شوند :

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

و شما نمی‌توانید برای نام متغیرها و داده‌های خود ( شناسه‌ها ) از آنها استفاده کنید .ضمناً برخی کامپایلرها تعدادی کلید واژه دیگر همچون _asm_ را به زبان سی اضافه نموده اند که جهت یادگیری آنها باید به راهنمای آن کامپایلر و مراجع دیگر ، رجوع کنید . ما در این کتاب تنها اشاره کوچکی به آنها می‌نمائیم ، چرا که مثلاً همین کلید واژه asm برای نوشتن کدهای اسمبلی در داخل متن سی می باشد ( که به صورت asm__ یا _asm_ و یک آکولاد باز و بسته نوشته می‌شود که کدهای اسمبلی را داخل جفت آکولاد باز و بسته می‌نویسیم ) و اگر بخواهیم مبحث این کلید واژه‌ها را باز نمائیم ، باید داخل همین کتاب علاوه بر زبان سی ، زبان های اسمبلی ، فورترن ، پاسکال و ... را نیز بنویسیم ( که اینها هر کدام زبان مجزایی هستند ولی کامپایلرهای سی جهت عرضه سهولت و قدرت بیشتر ، امکان تلفیق کدهای سی را با زبان‌های دیگر مخصوصاً اسمبلی می‌دهند )

پس دانستیم که اگر به طور مثال بنویسیم long ، باید پس از آن حتماً یک نام را بنویسیم که خارج از کلیدواژه‌ها و در صورت ضمیمه کردن فایل‌های سرآیند ، خارج از توابع و ماکروهای فایل یا فایل‌های سرآیند باشد . ترتیب نوشتن نیز جزء دستورات زبان سی می باشد . مثلاً if که از معنای انگلیسی آن هم پیداست ( به معنی « اگر » ) برای شرط کردن اجرای یک قطعه کد به کار می‌رود اما گاهی گزینه های ما در شرط کردن زیاد هستند ، آنگاه می‌نویسیم else if ، یعنی « وگرنه » یا « در غیر این صورت اگر » . پس نمی توانیم بنویسیم : if else ! همچنین دقت کنید که زبان سی مانند بسیاری از زبان های دیگر به کوچک یا بزرگ بودن حروف حساس است که به این گونه زبان‌ها Case Sensitive می‌گویند یعنی IF همان if نمی باشد . از طرفی وجود فضاهای سفید ، ضروری هستند . شما باید فاصله بین کلمات و حروف و علائم را رعایت نمائید . اضاضه نوشتن فضاهای سفید ، توصیه نمی شود اما اگر زیاده روی کنید ، بهتر از این است که فاصله یا تب یا خطوط شکسته را نادیده بگیرید و کدها را پشت سر هم بنویسید ! مثلاً elseif برای اکثر کامپایلر ها ناخوانا می باشد

همچنین ، هر گاه خارج از رشته از علامت // استفاده نمائید ، هر متنی که در داخل همان خط ، پس از آن قرار بگیرد به عنوان یادداشت برنامه‌نویس محسوب شده و نادیده گرفته می‌شود ؛ به همین شکل هر متنی که خارج از دو دابل کوت ( " ) بین */ و /* قرار بگیرد به عنوان یادداشت چند خطی محسوب شده و هر آنچه نوشته شده باشد نایده گرفته خواهد شد . یادداشت گذاری شیوه مناسبی برای خودتان و یا کاربر دیگری که میخواهد کد شما را بخواند ( و به طور مثال شریک برنامه‌نویس شماست ) می باشد که طی آن شما پس از // می‌توانید هر آنچه که میخواهید در یک خط بنویسید که به ان یادداشت تک خطی می‌گویند . یعنی شما مجاز نیستید خط را بشکنید و در خط بعدی یادداشت بگذارید یا بقیه یادداشتتان را بنویسید ، چون یادداشت شما که معمولاً و به صورت معقول ، خارج از زبان سی می باشد ، وارد متن برنامه سی می شود و شما چیزهایی نوشته‌اید که برای کامپایلر نامفهوم هستند . اگر مایل بودید در چند خط کامنت بگذارید علامت */ را بگذارید و تا جایی که شما علامت /* را وارد نکرده باشید ، کامپایلر کل نوشته های شما را نادیده می گیرد

مثال :

Comment یادداشت
Code 1 // This is an one line comment
Code 2 /* This


is another
comment , which is multi line */ Code 3

در مثال اول نوشته This is an one line comment یک یادداشت است که بعد از کد یا کدهای سی نوشته شده و از نوع تک‌خطی می‌باشد و ما مجاز نیستیم تا یادداشت خود را در خط یا خطوط بعدی بنویسیم . اما نوشته بعدی در چند خط نوشته شده است که با توجه به علامت های متناسب خود ، مجاز به نوشتن یادداشت خود در چند خط بودیم که بلافاصله بعد از اتمام یادداشت نیز ، کد دیگری را نوشته‌ایم که اگر این کد را داخل کامنت یا یادداشت می‌نوشتیم ، کامپایلر ، آن را نادیده می گرفت ؛ چرا که مطابق با مطلبی که بیان نمودیم ، یادداشت‌ها ، هر چه که باشند توسط کامپایلر نادیده گرفته می‌شوند

مطلب بعدی نیز اینکه ، هر گاه حکمی را نوشتید باید حتماً در انتهای آن از علامت و عملگر سمی کالن « ; » استفاده نمائید که به آن Terminator یا پایان دهنده می‌گویند و در زبان‌های خانواده سی و مشابه با سی به عنوان پایان یک حکم به کار می‌رود . این عملگر به کامپایلر می‌فهماند که باید به سراغ دستور بعدی برود و این قسمت از کد که تا قبل از ; نوشته شده ، مجزا از خط بعدی بوده و کامپایلر با خواندن کاراکتر سمی کالن « ; » در برنامه کدهای نوشته شده شما را به اجرا در می‌آورد . ایجاد داده‌ها ، اجرای عملیات های مختلف مثل ریاضی و همین طور توابع کتابخانه‌ای و احضار تابع‌هایی که خودتان تعریف کرده‌اید همگی مستلزم استفاده از علامت پایان دهنده می‌باشند که گاهی مورد فراموشی قرار می‌گیرد و باعث گرفتن خطا توسط کامپایلر می‌گردد . در ابتدا شاید آن را مرتباً فراموش کنید ولی با تمرین‌های مکرر به خوبی عادت می‌کنید تا هرگاه حکمی را نوشتید ، در پایان آن یک سمی کالن را قرار دهید