Download presentation
Presentation is loading. Please wait.
1
مبانی کامپیوتر و برنامه سازی
فصل ششم : مقدمهای بر زبان C
2
6 مقدمهای بر زبان C زبانهای برنامه سازی به سه دسته کلی تقسیم میگردند : زبان ماشین (سطح پایین) : این زبان مستقیما با صفر و یک نوشته میشود و بدون هیچ واسطهای برروی کامپیوتر قابل اجرا است. هر برنامهای که به زبان ماشین نوشته شود، فقط برروی همان ماشین خاص کار میکند، بهمین دلیل برنامههای نوشته شده به زبان ماشین را غیر قابل حمل مینامند. از طرف دیگر یادگیری این زبان بسیار مشکل بوده و برنامهنویسی با آن نیز بسیار سخت است و همچنین احتمال بروز خطا نیز در آن زیاد است. زبان اسمبلی : این زبان شکل ساده تر زبان ماشین است، بدین صورت که برای هر دستورالعمل زبان ماشین، یک اسم نمادین انتخاب شده است (مانند دستور ADD بجای کد دودویی دستورالعمل جمع) که بخاطر سپردن و برنامهنویسی با آنها برای انسانها ساده تر است. اما این برنامهها برای ماشین قابل فهم نیست و باید قبل از اجرا شدن توسط برنامه مترجمی بنام اسمبلر به زبان ماشین تبدیل شود. زبانهای سطح بالا : دستورالعملهای این زبانها بسیار نزدیک به زبان انسانها (بطور مشخص زبان انگلیسی) میباشد و بهمین دلیل برنامهنویسی به آنها بسیار ساده تر بوده و میتوان الگوریتمها را به راحتی به این زبانها تبدیل کرد. بیسیک (Basic): برای کاربردهای آموزشی فرترن (Fortran) : برای کاربردهای علمی و مهندسی پاسکال (Pascal) : برای کاربردهای آموزشی و علمی زبان C
3
1-6 تاریخچه زبان C در سال 1967 مارتین ریچاردز زبان BCPL را برای نوشتن نرم افزارهای سیستم عامل و کامپایلر در دانشگاه کمبریج ابداع کرد. در سال 1970 کن تامپسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخههای سیستم عامل Unix در آزمایشگاههای بل استفاده کرد. زبان C در سال 1972 توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته شد و ویژگیهای جدیدی همچون نظارت بر نوع دادهها نیز به آن اضافه شد. ریچی از این زبان برای ایجاد سیستم عامل Unix استفاده کرد اما بعدها اکثر سیستم عاملهای دیگر نیز با همین زبان نوشته شدند. این زبان با سرعت بسیاری گسترش یافت و چاپ کتاب “The C Programming Language” در سال 1978 توسط کرنیگان و ریچی باعث رشد روزافزون این زبان در جهان شد. در سال 1983 انستیتوی ملی استاندارد آمریکا (ANSI) کمیتهای موسوم به X3J11 را را مامور کرد تا یک تعریف فاقد ابهام و مستقل از ماشین را از این زبان تدوین نماید.در سال 1989 این استاندارد تحت عنوان ANSI C به تصویب رسید و سپس در سال 1990، سازمان استانداردهای بین المللی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گردید. در سالهای بعد و با ظهور روشهای برنامهنویسی شی گرا نسخه جدیدی از زبان C بنام C++ توسط بیارنه استراوستروپ در اوایل 1980 در آزمایشگاه بل توسعه یافت. در C++ علاوه بر امکانات جدیدی که به زبان C اضافه شده است، خاصیت شی گرایی را نیز به آن اضافه کرده است. شرکت سان مایکروسیستمز در سال 1995 میلادی زبان Java را برمبنای C و C++ ایجاد کرد که هم اکنون از آن در سطح وسیعی استفاده میشود و برنامههای نوشته شده به آن برروی هر کامپیوتری که از Java پشتیبانی کند(تقریبا تمام سیستمهای شناخته شده) قابل اجرا میباشد. شرکت مایکروسافت در رقابت با شرکت سان، در سال 2002 زبان جدیدی بنام C# (سی شارپ) را ارائه داد که رقیبی برای Java بشمار میرود.
4
2-6 برنامهنویسی ساختیافته
2-6 برنامهنویسی ساختیافته در دهه 1960 میلادی توسعه نرم افزار دچار مشکلات عدیدهای شد. در آن زمان سبک خاصی برای برنامهنویسی وجود نداشت و برنامهها بدون هیچگونه ساختار خاصی نوشته میشدند. فعالیتهای پژوهشی در این دهه باعث بوجود آمدن سبک جدیدی از برنامهنویسی بنام روش ساختیافته گردید؛ روش منظمی که باعث ایجاد برنامههایی کاملا واضح و خوانا گردید که اشکال زدایی و خطایابی آنها نیز بسیار ساده تر بود. اصلی ترین نکته در این روش عدم استفاده از دستور پرش (goto) است. تحقیقات بوهم و ژاکوپینی نشان داد که میتوان هر برنامهای را بدون دستور پرش و فقط با استفاده از 3 ساختار کنترلی ترتیب، انتخاب و تکرار نوشت. ساختار ترتیب، همان اجرای دستورات بصورت متوالی (یکی پس از دیگری) است. ساختار انتخاب به برنامهنویس اجازه میدهد که براساس درستی یا نادرستی یک شرط، تصمیم بگیرد کدام مجموعه از دستورات اجرا شود. ساختار تکرار نیز به برنامهنویسان اجازه میدهد مجموعه خاصی از دستورات را تا زمانیکه شرط خاصی برقرار باشد، تکرار نماید. هر برنامه ساختیافته از تعدادی بلوک تشکیل میشود که این بلوکها به ترتیب اجرا میشوند تا برنامه خاتمه یابد(ساختار ترتیب). هر بلوک میتواند یک دستورساده مانند خواندن، نوشتن یا تخصیص مقدار به یک متغیر باشد و یا اینکه شامل دستوراتی باشد که یکی از 3 ساختار فوق را پیاده سازی کنند. نکته مهم اینجاست که درمورد دستورات داخل هر بلوک نیز همین قوانین برقرار است و این دستورات میتوانند از تعدادی بلوک به شرح فوق ایجاد شوند و تشکیل ساختارهایی مانند حلقههای تودرتو را دهند. نکته مهم اینجاست که طبق قوانین فوق یک حلقه تکرار یا بطور کامل داخل حلقه تکرار دیگر است و یا بطور کامل خارج آن قرار میگیرد و هیچگاه حلقههای روی هم افتاده نخواهیم داشت. از جمله اولین تلاشها در زمینه ساخت زبانهای برنامهنویسی ساختیافته، زبان پاسکال بود که توسط پروفسور نیکلاس ویرث در سال 1971 برای آموزش برنامهنویسی ساختیافته در محیطهای آموزشی ساخته شد و بسرعت در دانشگاهها رواج یافت. کمی بعد زبان C ارائه گردید که علاوه بر دارا بودن ویژگیهای برنامهنویسی ساختیافته بدلیل سرعت و کارایی بالا مقبولیتی همه گیر یافت و هم اکنون سالهاست که بعنوان بزرگترین زبان برنامهنویسی دنیا شناخته شده است.
5
3-6 مراحل اجرای یک برنامه C
ورودیها ویرایشگر کامپایلر پیوند دهنده اجرای برنامه برنامه مبدا A.C برنامه مقصد A.obj فایل قابل اجرا A.exe توابع آماده خروجیها
6
3-6 مراحل اجرای یک برنامه C
مسلما طی این مراحل برای برنامهنویسان بسیار زمانبر است. راه حل این مشکل استفاده از محیط مجتمع توسعه نرم افزار یا IDE است. IDE (Integrated Development Environment) یک IDE شامل مواردی همچون ویرایشگر متن با امکانات ویژه برای زبان امکان کامپایل و پیوند برنامه امکان اشکال زدایی (Debug) برنامه چند محیط معروف برنامهنویسی عبارتند از : Borland C برای محیط DOS Borland C++ از نسخه 4 به بالا برای Windows Microsoft Visual C++ برای محیط Windows Borland C++ Builder برای محیط Windows
7
3-6 مراحل اجرای یک برنامه C
Borland C++ 3.1
8
4-6 خطاهای برنامهنویسی بنظر میرسد خطاها جزء جداناپذیر برنامهها هستند. بندرت میتوان برنامهای نوشت که در همان بار اول بدرستی و بدون هیچگونه خطایی اجرا شود. بطور کلی خطاها به دو دسته تقسیم میشوند: خطاهای نحوی (خطاهای زمان کامپایل): این خطاها در اثر رعایت نکردن قواعد دستورات زبان C و یا تایپ اشتباه یک دستور بوجود میآیند و در همان ابتدا توسط کامپایلر به برنامهنویس اعلام میگردد. معمولا این قبیل خطاها خطر کمتری را در بردارند. خطاهای منطقی (خطاهای زمان اجرا): این دسته خطاها در اثر اشتباه برنامهنویس در طراحی الگوریتم درست برای برنامه و یا گاهی در اثر درنظر نگرفتن بعضی شرایط خاص در برنامه ایجاد میشوند. متاسفانه این دسته خطاها در زمان کامپایل اعلام نمیشوند و در زمان اجرای برنامه خود را نشان میدهند. ممکن است یک برنامهنویس خطای منطقی برنامه خود را تشخیص ندهد و این خطا پس از مدتها و تحت یک شرایط خاص توسط کاربر برنامه کشف شود. بهمین دلیل این دسته از خطاها خطرناکتر هستند. خود این خطاها به دو دسته تقسیم میگردند: خطاهای مهلک: در این دسته خطاها کامپیوتر بلافاصله اجرای برنامه را متوقف کرده و خطا را به کاربر گزارش میکند. مثال معروف این خطاها، خطای تقسیم بر صفر میباشد. خطاهای غیرمهلک: در این دسته خطا، اجرای برنامه ادامه مییابد ولی برنامه نتایج اشتباه تولید مینماید. بعنوان مثال ممکن است دراثر وجود یک خطای منطقی در یک برنامه حقوق و دستمزد، حقوق کارمندان اشتباه محاسبه شود و تا مدتها نیز کسی متوجه این خطا نشود! بسیار مهم است که در ابتدا سعی کنید برنامهای بنویسید که حداقل خطاها را داشته باشد، در گام دوم با آزمایش دقیق برنامه خود هرگونه خطای احتمالی را پیدا کنید و در گام سوم بتوانید دلیل بروز خطا را پیدا کرده و آنرا رفع نمایید. هر سه عمل فوق کار سختی بوده و نیاز به تجربه و مهارت دارد. در اصطلاح برنامهنویسی به هر گونه خطا، bug و به رفع خطا debug گفته میشود.
9
5-6 یک برنامه نمونه C // This Program Computes the Area of a Circle
#include <stdio.h> void main() { int radius ; float area ; printf("please enter radius : ") ; scanf("%d",&radius) ; area = 2 * 3.14 * radius ; printf("Area is %f",area) ; } توضیحات تابع اصلی اجرای برنامه از این تابع آغاز میگردد دستور پیش پردازنده برای افزودن توابع کتابخانهای به برنامه اعلان متغیرهای برنامه علامت شروع بلوک معادل دستور begin در پاسکال تابع چاپ اطلاعات دندانه گذاری علامت انتهای بلوک معادل دستور end در پاسکال تابع دریافت اطلاعات علامت پایان دهنده دستورات نتیجه اجرای برنامه please enter radius : 10 Area is 62.8
10
مبانی کامپیوتر و برنامه سازی
فصل هفتم : مفاهیم اولیه زبان C
11
1-7 شناسهها در C شناسه (identifier) نامی است که به یک قسمت از برنامه مانند متغیر، تابع، ثابت و یا ... داده میشود. در زبان C برای انتخاب شناسهها فقط میتوان از علائم زیر استفاده کرد: حروف انگلیسی کوچک و بزرگ (A…Z a…z) ارقام (0…9) علامت خط پایین یا _ البته یک شناسه نمیتواند با یک رقم شروع شود. چند شناسه مجاز: sum ، average ، name2 وstudent_average چند شناسه غیرمجاز 2name و یا student average در برنامهنویسی امروزی پیشنهاد میشود بجای شناسههایی همانند student_average از studentAverage استفاده گردد. نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان C برخلاف بسیاری از زبانهای دیگر به کوچک و بزرگی حروف حساس است (case sensitive). در نتیجه شناسههای زیر با یکدیگر متفاوتند : Sum ≠ sum ≠ SUM آخرین نکته اینستکه در هنگام انتخاب شناسه نمیتوانید از کلمات کلیدی که برای منظورهای خاص در زبان C رزرو شدهاند استفاده کنید.
12
1-7 شناسهها در C کلمات کلیدی در زبان C : 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
13
2-7 انواع دادهها در C نوع داده توضیح اندازه (بیت) محدوده char کاراکتر
8 -128 to +127 int عدد صحیح 16 to float عدد اعشاری 32 3.4e-38 to 3.4e+38 double عدد اعشاری با دقت مضاعف 64 1.7e-308 to 1.7e+308
14
2-7 انواع دادهها در C البته چند نکته مهم درمورد این جدول قابل ذکر است : اندازه int در محیطهای 16 بیتی مانند DOS برابر 16 بیت است. اما در محیطهای 32 بیتی همانند Windows اندازه آن 32 بیت میباشد که در اینصورت محدودهای برابر -2,147,483,648 تا +2,147,483,647 را پوشش میدهد. در بعضی از کامپایلرهای C، نوع داده bool نیز وجود دارد که میتواند یکی از مقادیر true(درست) یا false (غلط) را نشان دهد . اما در نسخههای اولیه C از همان نوع داده صحیح یا int برای اینکار استفاده میشد. بدین صورت که 0 نشاندهنده false و هر عدد غیر صفر (معمولا 1) نشاندهنده true است. از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره میگردد، از یک متغیر کاراکتری یا char میتوان بعنوان یک عدد صحیح کوچک نیز استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است.
15
2-7 انواع دادهها در C علاوه براین چندین اصلاح کننده نیز وجود دارد که به ما اجازه میدهد نوع داده مورد نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم. این اصلاح کنندهها عبارتند از : short, long, signed, unsigned تمام این اصلاح کنندهها میتوانند به نوع داده int اعمال شوند و اثر آنها بستگی به محیط دارد. در یک محیط 16بیتی،short int بازهم برابر 16بیت است ولی long int برابر32بیت میباشد. unsigned int باعث میشود که یک عدد 16 بیتی بدون علامت داشته باشیم که بازه بین 0 تا را پوشش میدهد. signed int نیز همانند int معمولی بوده و تفاوتی ندارد. ترکیب این اصلاح کنندهها نیز ممکن است. مثلا unsigned long int یک عدد 32 بیتی بدون علامت است که بازه 0 تا 4,294,967,295 را پوشش میدهد. برروی نوع داده char فقط اصلاح کنندههای signed و unsigned را میتوان اعمال کرد. معمولا از اصلاح کننده unsigned وقتی استفاده میشود که قصد داشته باشیم از char بعنوان یک عدد صحیح مثبت بین 0 تا 255 استفاده کنیم. برروی نوع داده double تنها اصلاح کننده long قابل اعمال است و دراینصورت عدد اعشاری با 80 بیت را خواهیم داشت که قادر است هر عددی در بازه 3.4e-4932 تا 1.1e+4932 را در خود نگاه دارد.
16
3-7 تعریف متغیرها برای تعریف متغیرها به شکل زیر عمل میکنیم:
3-7 تعریف متغیرها برای تعریف متغیرها به شکل زیر عمل میکنیم: <type> <variable-list>; که type یکی از نوع دادههای گفته شده و variable-list لیستی از متغیرها است که با کاما از یکدیگر جدا شده اند. بعنوان مثال : int sum; float average; long int a, b, c ; unsigned long int i, j, k ; علاوه براین میتوان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد. مثال : int d = 0 ; نکته مهم آنکه زبان C به متغیرها مقدار اولیه نمی دهد (حتی 0) و برنامهنویس خود باید اینکار را صریحا انجام دهد، درغیر اینصورت مقدار اولیه متغیر، نامعین خواهد بود. تعریف متغیرها طبق اصول زبان C میتواند درهرجایی از برنامه صورت پذیرد، و متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود. اما معمولا توصیه میگردد که تعریف متغیرها در همان خط ابتدایی تابع و بلافاصله پس از { صورت پذیرد.
17
4-7 ثوابت ثابتها مقادیر ثابتی هستند که مقدار آنها در حین اجرای برنامه تغییر نمییابد. ثابتها میتوانند از هریک از نوع دادههای اصلی باشند. ثوابت عددی صحیح : برای نمایش این دسته از ثوابت، از دنبالهای از ارقام بعلاوه علامت + یا - استفاده میکنیم. بعنوان مثال 45- و یا 3489 ثوابت صحیح هستند. در حالت عادی C هر عدد را در کوچکترین نوع دادهای که میتواند قرار میدهد. مثلا عدد 85 در یک int قرار میگیرد، اما عدد در یک long int قرار خواهد گرفت. اگر قصد دارید یک عدد کوچک بعنوان long محسوب گردد، میتوانید از پسوند L در انتهای آن استفاده میکنیم. مثلا 245L یک عدد long محسوب میشود. long int a = 20L; پسوند U در انتهای عدد نیز نشانه بدون علامت بودن آن است. نکته دیگر آنکه C به شما اجازه میدهد درصورت لزوم ثوابت صحیح خود را در مبنای 8 یا 16 نیز که از مبناهای متداول در برنامهنویسی هستند، بنویسید. برای نوشتن عدد در مبنای 8 باید آن را با 0 آغاز کنید، مثلا یک عدد در منای 8 محسوب میگردد. برای نوشتن یک عدد در مبنای 16 باید آن را با 0x آغاز نمایید، مانند 0x27A4.
18
4-7 ثوابت ثوابت عددی اعشاری
4-7 ثوابت ثوابت عددی اعشاری برای نمایش اعداد اعشاری، باید از نقطه اعشار استفاده کنیم، مانند اما نکته جالب آنستکه میتوانید از نماد علمی نیز برای نمایش اعداد اعشاری استفاده کنید. برای اینکار کافی است از حرف e برای نمایش قسمت توان استفاده نمایید. بعنوان مثال : × = e5 × = e-3 دقت کنید که قسمت توان، حتما یک عدد صحیح است. نکته جالب اینجاست که برخلاف مورد قبل، کامپایلر بطور پیش فرض دادههای اعشاری را از نوع double فرض میکند.چنانچه دوست دارید ثابت شما ازنوع float درنظر گرفته شود، در انتهای آن F قرار دهید. ضمنا پسوند L نیز داده اعشاری را از نوع long double درنظر میگیرد.
19
4-7 ثوابت ثوابت کاراکتری :
4-7 ثوابت ثوابت کاراکتری : برای نشان دادن ثوابت کاراکتری، آنها را در داخل ' قرار میدهیم. بعنوان مثال 'A' یک ثابت کاراکتری است. char ch = 'S' ; دقت کنید که همانطور که قبلا گفته شد، کد اسکی کاراکترها در متغیر ذخیره میگردد، بنابراین میتوان از آن بعنوان یک عدد صحیح نیز استفاده کرد. نکته مهم دیگر آنستکه به تفاوت عدد 5 و کاراکتر '5' دقت داشته باشید. در حقیقت '5' برابر است با عدد 53 که همان کد اسکی آن است. روش فوق، برای نمایش کاراکترهای قابل چاپ مناسب است، اما بعضی کاراکترها مانند enter قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد. در چنین مواردی، زبان C از ترکیب علامت \ به همراه یک کاراکتر دیگر، برای نمایش این قبیل کاراکترها استفاده مینماید. بعنوان مثال، کاراکتر '\n' نشان دهنده خط جدید یا همان enter میباشد. جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان میدهد.
20
4-7 ثوابت کد اسکی نحوه نمایش در C نام کاراکتر 7 \a صدای بوق کامپیوتر 8
4-7 ثوابت کد اسکی نحوه نمایش در C نام کاراکتر 7 \a صدای بوق کامپیوتر 8 \b حرکت به عقب backspace 12 \f شروع صفحه form feed 10 \n سطر جدید line feed 13 \r برگشت به ابتدای سطر carriage return 9 \t فاصله افقی horizontal tab 11 \v فاصله عمودی vertical tab 63 \? علامت سوال 39 \' علامت ' 34 \" علامت " 92 \\ علامت \ \0 علامت تهی
21
4-7 ثوابت ثوابت رشتهای : C علاوه بر ثوابت فوق، از یک ثابت دیگر بنام رشته نیز حمایت میکند. رشته، دنبالهای از کاراکترها است که در داخل " قرار میگیرند. بعنوان مثال "this is a test" یک رشته است. دقت کنید که 'a' یک کاراکتر است، اما "a" یک رشته است که فقط شامل یک کاراکتر میباشد.
22
5-7 عملگرها عملگر، نمادی است که به کامپایلر میگوید تا عملیات محاسباتی یا منطقی خاصی را برروی یک یا چند عملوند، انجام دهد. به عملگرهایی که فقط یک عملوند دارند، عملگر یکانی میگوییم و همواره عملگر در سمت چپ عملوند قرار میگیرد(مانند عدد -125). اما عملگرهایی که برروی دو عملوند اثر میکنند را عملگر دودویی نامیده و عملگر را بین دو عملوند قرار میدهیم (مانند 23+86). هر ترکیب درستی از عملگرها و عملوندها را یک عبارت مینامیم. C از نقطه نظر عملگرها یک زبان بسیار قوی است. این عملگرها به چند دسته اصلی تقسیم میگردند که آنها را به ترتیب بررسی میکنیم.
23
عملگرهای محاسباتی این عملگرها، همان اعمال متداول ریاضی هستند که در زبان C مورد استفاده قرار میگیرند. این اعمال عبارتند از : عمل نوع عملگر منفی کردن عملوند سمت راست یکانی - جمع دو عملوند دودویی + تفریق دو عملوند ضرب دو عملوند * تقسیم دو عملوند / محاسبه باقیمانده تقسیم دو عملوند %
24
عملگرهای محاسباتی این عملگرهای برروی همه انواع دادههای C عمل میکنند، بجز عملگر % که فقط برروی نوع دادههای صحیح عمل میکند. اما نکته مهمی که باید به آن اشاره کرد، نحوه کار عملگر تقسیم برروی نوع دادههای مختلف است. درصورتیکه هردو عملوند صحیح باشند، تقسیم بصورت صحیح بر صحیح انجام خواهد شد. اگر یکی یا هر دو عملوند اعشاری باشند، تقسیم بصورت اعشاری انجام خواهد پذیرفت. فرض کنید تعاریف زیر را داریم : int a,b ; float c,d ; a = 10 ; b = 4 ; c = 8.2; d = 4.0; اکنون به نتایج عملیات زیر دقت کنید : a / b => 2 c / d => a / d => 2.5 a / 4 => 2 چنانچه به آخرین مورد توجه کنید، متوجه میشوید که از آنجا که a یک متغیر صحیح است و 4 نیز یک ثابت صحیح در نظر گرفته شده، درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته است. چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد، به دو شکل میتوانیم عمل کنیم.
25
عملگرهای محاسباتی برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود، به دو روش میتوان عمل کرد: این عبارت را بصورت a / 4.0 بنویسیم. از عملگر قالب ریزی استفاده کنیم. عملگر قالب ریزی میتواند یک نوع را به نوع دیگری تبدیل نماید. شکل کلی آن به شکل زیر است : (<type>) <expression> که type نوع مورد نظر است که قصد تبدیل عبارت expression به آن نوع را داریم. بعنوان مثال در مورد قبلی میتوان به شکل زیر عمل کرد : (float) a / 4 در این حالت از کامپایلر خواسته ایم که ابتدا عدد a را به اعشاری تبدیل کند (البته بصورت موقت) و سپس آن را بر 4 تقسیم نماید، که مسلما حاصل اعشاری خواهد بود. بطورکلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یک عبارت محاسباتی داشته باشیم، کامپایلر C همه آنها را به یک نوع یکسان که همان بزرگترین عملوند موجود است تبدیل خواهد کرد. بعنوان مثال به مورد صفحه بعد دقت کنید :
26
1-5-7 عملگرهای محاسباتی char ch; int i; float f; double d;
عملگرهای محاسباتی char ch; int i; float f; double d; result = (ch / i) ( f * d ) ( f + i ) int double float double double
27
عملگرهای محاسباتی اولویت عملگرها : در عبارتی که شامل چندین عملگر است، کدامیک در ابتدا اعمال خواهد گردید. اولویت عملگرهای محاسباتی از بالا به پایین بشرح زیر است: عملگر یکانی – عملگرهای * و / و % عملگرهای + و – چنانچه اولویت دو عملگر یکسان باشد، این عملگرها از چپ به راست محاسبه خواهند شد. چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود، باید از پرانتز استفاده کنیم. بنابراین اولویت عملگر پرانتز از همه موارد فوق بیشتراست. در مورد پرانتزهای متداخل، ابتدا پرانتز داخلی محاسبه میشود؛ اما در مورد پرانتزهای هم سطح، ابتدا پرانتز سمت چپتر محاسبه میگردد.
28
1-5-7 عملگرهای محاسباتی چند مثال در مورد اولویت عملگرها عبارت زبان C
عملگرهای محاسباتی چند مثال در مورد اولویت عملگرها عبارت زبان C ترتیب اجرای عملگرها b + c * d ابتدا عمل * و سپس عمل + (b + c) * d ابتدا عمل + و سپس عمل * b + c / d * e ابتدا عمل / سپس عمل * و در انتها عمل + b + c / (d * e) ابتدا عمل * سپس عمل / و در انتها عمل +
29
1-5-7 عملگرهای محاسباتی یک مثال کامل در مورد اولویت عملگرها
عملگرهای محاسباتی یک مثال کامل در مورد اولویت عملگرها result = a + b * (f – (g + b) / d) – c * (a – d) / e 5 4 3 1 2 7 8 6 9
30
عملگرهای انتساب در زبان C برای انتساب چندین عملگر وجود دارد. ساده ترین عملگر انتساب، همان عملگر = است که در بسیاری از زبانها استفاده میشود. بعنوان مثال : a = 5; b = c + 2 * d; این عملگر باعث میشود که عبارت سمت راست در عبارت سمت چپ قرار گیرد. توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد (مانند یک متغیر) که به آن Lvalue گفته میشود، بنابراین یک ثابت نمیتواند در سمت چپ قرار گیرد. نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات انجام شده و در پایان حاصل در عبارت سمت چپ ریخته میشود. لازم به ذکر است که در هنگام انتساب، درصورت لزوم نوع عبارت سمت راست به نوع عبارت سمت چپ تبدیل میشود. مثال: int a; a = 2.5 * 5.0; که دراینصورت عدد 12 در a ذخیره خواهد شد. شرکت پذیری این عملگر از راست به چپ میباشد، بدین معنا که چنانچه چندین عملگر نسبت دهی داشته باشیم، این عملگرها از راست به چپ محاسبه میشوند. مثلا پس از اجرای دستور زیر، مقدار هر 3 متغیر برابر 10 خواهد شد. a = b = c = 10;
31
عملگرهای انتساب نکته جالب درمورد زبان C آنستکه دارای یک سری عملگرهای انتساب خلاصه شده است که باعث میشوند در بعضی موارد بتوانیم عبارات کوتاهتری را بنویسیم. این عملگرها عبارتند از : عملگرد مثال عبارت انتساب معادل ++ a ++; a = a + 1; -- a --; a = a – 1; += a += 5; a = a + 5; -= a -= 8; a= a – 8; *= a *= 10; a= a * 10; /= a /= 2; a = a / 2; %= a %= 10; a = a % 10;
32
عملگرهای انتساب عملگر اول و دوم، عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش نامیده میشوند. نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار میگیرند. در حالتی که از دستور a ++; استفاده شود به آن پس افزایش میگویند و بدین معناست که ابتدا از مقدار فعلی a در عبارت موردنظر استفاده کن و سپس آن را افزایش بده. اما دستور ++ a; که به آن پیش افزایش گفته میشود، ابتدا a را افزایش داده و سپس از آن در عبارت استفاده میکند. به برنامه زیر دقت کنید: #include <stdio.h> void main() { int a ,b ; a = 5 ; b = a ++; printf(“a=%d and b=%d \n”,a,b); b = ++ a; } a=6 b=5 a=6 b=6
33
عملگرهای مقایسه ای این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز میگردانند. نتیجه میتواند درست (true) یا غلط (false) باشد. نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن 1 و درصورت غلط بودن 0 باز میگردانند. این عملگرها عبارتند از: عملگر مفهوم عملگر مثال < بزرگتر (<) a > b > کوچکتر (>) a < b =< بزرگتر یا مساوی (≤) a >= b => کوچکتر یا مساوی (≥) a <= b == مساوی (=) a == b =! نامساوی (≠) a != b
34
عملگرهای مقایسه ای نکته مهمی که باید به آن دقت کرد عملگر مساوی (==) است، چرا که یک اشتباه بسیار متداول برنامهنویسان C استفاده اشتباه از عملگر انتساب (=) بجای عملگر تساوی (==) است که باعث ایجاد خطا در برنامه میشود. اولویت این عملگرها از بالا به پایین بشرح زیر است: عملگرهای <، > ، =< و => عملگرهای == و =! لازم بذکر است که در هنگام مساوی بودن اولویت چند عملگر، این عملگرها از چپ به راست محاسبه میگردند.
35
عملگرهای منطقی این عملگرها به شما اجازه میدهند که شرطهای سادهای را که با استفاده از عملگرهای مقایسهای ایجاد شدهاند را با یکدیگر ترکیب نموده و شرطهای پیچیده تری را بسازید. این عملگرها عبارتند از : عملگر مفهوم عملگر نحوه کار مثال && AND منطقی اگر هر دو عملوند درست باشند, درست و در غیر اینصورت نادرست باز میگرداند. a>0 && sw==1 || OR منطقی اگر هر دو عملوند نادرست باشند, نادرست و در غیر اینصورت درست باز میگرداند. a<=100 || b!=0 ! NOT منطقی اگر عملوند درست باشد، نادرست و اگر نادرست باشد، درست برمی گرداند. ! (a==1 || b<10)
36
عملگر شرطی گاهی لازم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه (درست یا نادرست بودن آن) یکی از دو عبارت ممکن بازگردانده شود. برای اینکار میتوان از یک عملگر 3تایی (با 3 عملوند) بنام عملگر شرطی استفاده نمود. شکل کلی این عملگر بصورت زیر است: <شرط> ?<عبارت1> :<عبارت2> نحوه کار بدینصورت است که درصورت درست بودن شرط، عبارت1 و در غیراینصورت عبارت 2 بازگردانده میشود. به عنوان مثال به دستور زیر توجه کنید: a = (k<10) ? : 50; که این عبارت معادل دستور زیر است: if (k<10) a=100; else a=50; البته این عبارت به شکلهای پیچیده نیز میتواند مورد استفاده قرار گیرد. مثلا : c += (a>0 && a<10) ? ++a : a/b; که معادل است با : if (a>0 && a<10) { a= a + 1; c = c + a; } else c = c + a/b;
37
6-5-7 اولویت عملگرها اولویت عملگر شرکت پذیری 1 () از چپ به راست 2
اولویت عملگرها اولویت عملگر شرکت پذیری 1 () از چپ به راست 2 ! از راست به چپ 3 % / * 4 - + 5 >> << 6 >= > <= < 7 =! == 8 && 9 || 10 ?: 11 =% =/ =* =- =+ = 12 ,
38
6-7 خواندن و نمایش اطلاعات
همانطور که قبلا نیز گفته شد، یکی از اهداف زبان C قابل حمل بودن آن است. بهمین منظور سعی شده است که از دستوراتی که ممکن است وابسته به ماشین خاصی باشد، اجتناب گردد. بهمین دلیل زبان C برخلاف سایر زبانها دارای هیچ دستوری برای خواندن از ورودی و یا نوشتن در خروجی نیست. اما در عوض دارای تعدادی تابع (زیربرنامه) استاندارد میباشد که تقریبا تمامی کامپایلرها از آنها حمایت میکنند. این کار به کامپایلر این امکان را میدهد که بر حسب نوع سخت افزار موردنظر، توابع ورودی و خروجی را طراحی نماید. این توابع در یک فایل سرآمد بنام stdio.h تعریف شدهاند و بنابراین قبل ازاینکه بتوانید از این توابع استفاده نمایید، باید این فایل را نیز با استفاده از #include در برنامه خود بگنجانید.
39
تابع نمایش در خروجی برای نمایش اطلاعات در خروجی از تابع printf استفاده میشود. این تابع رشته موردنظر شما را به خروجی استاندارد (که در حالت عادی همان صفحه نمایش یا مانیتور است) میفرستد. شکل کلی این تابع بصورت زیر است: printf(<رشته کنترلی> , <لیست متغیرها>) ; رشته کنترلی همان متنی است که قصد چاپ آن را داریم، با ذکر این نکته که در قسمتهایی که باید مقدار یک متغیر چاپ شود، از یک مشخصه تبدیل استفاده میشود. هر مشخصه تبدیل از یک علامت % بعلاوه یک کاراکتر که نوع متغیر مورد نظر را نشان میدهد تشکیل میگردد. لیست متغیرها نیز همان متغیرهایی هستند که قصد چاپ آنها را داریم. این متغیرها باید بترتیب قرار گرفته و با کاما (,) از یکدیگر جدا شوند.
40
عدد اعشاری بدون نماد علمی عدد اعشاری با حالت کوتاهتر بین e و f
تابع نمایش در خروجی مفهوم مشخصه تبدیل کاراکتر %c عدد صحیح در مبنای 10 %d عدد اعشاری بدون نماد علمی %f عدد اعشاری با نماد علمی %e عدد اعشاری با حالت کوتاهتر بین e و f %g رشته %s عدد صحیح بزرگ %ld عدد اعشاری بزرگ %lf %le %lg عدد صحیح در مبنای 8 %o عدد صحیحی در مبنای 16 %x عدد صحیح بدون علامت %u
41
1-6-7 تابع نمایش در خروجی #include <stdio.h> void main() {
تابع نمایش در خروجی #include <stdio.h> void main() { int age = 20; float average = 18.23; printf("You are %d years old and your average is %f \n",age,average); } You are 20 years old and your average is
42
تابع نمایش در خروجی برای کنترل نحوه چاپ اعداد میتوانید از مشخصه طول میدان استفاده کنید. مشخصه طول میدان برای اعداد به شکل زیر استفاده میشود: برای اعداد صحیح از %nd استفاده میکنیم که n تعداد ارقام را نشان میدهد (مثلا %3d). در اینصورت برای هر متغیر n رقم درنظر گرفته میشود. اگر اندازه عدد از n کوچکتر باشد، به سمت چپ آن فضای خالی اضافه میشود و اگر اندازه عدد بیش از n رقم باشد، طول میدان نادیده گرفته شده و عدد بطور کامل چاپ میشود. برای اعداد اعشاری از %n.mf استفاده میکنیم که n اندازه کل عدد (شامل علامت ممیز) و m تعداد ارقام اعشار است (مثلا %5.2f). در صورتیکه تعداد ارقام اعشاری عدد موردنظر از m بیشتر باشد، عدد به m عدد اعشار گرد میشود و در صورتیکه از m کمتر باشد، در سمت راست آن 0 قرار داده میشود.
43
تابع خواندن از ورودی برای خواندن اطلاعات از ورودی از تابع scanf استفاده میشود. این تابع اطلاعات را ازورودی استاندارد (معمولا صفحه کلید) خوانده و در متغیرهای تعیین شده قرار میدهد. شکل کلی این تابع بصورت زیر است: scanf(<رشته کنترلی> , <لیست آدرسهای متغیرها>) ; همانطور که میبینید نحوه احضار تابع scanf نیز مشابه printf است. تنها تفاوت در آن است که در scanf باید لیست آدرسهای متغیرها ارسال شود. مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر بخاطر بسپارید که برای بدست آوردن آدرس یک متغیر از علامت & استفاده میکنیم. بعنوان مثال &age بمعنای آدرس متغیر age است. بطور کلی در C قدیمی هرگاه که یک تابع دارای پارامترهای خروجی بود (یعنی پارامترهایی که یک مقدار را باز میگرداندند) از آدرس متغیرها استفاده میشد که امروزه این مسئله وجود ندارد.
44
تابع خواندن از ورودی #include <stdio.h> void main() { int age; float average ; printf("Please enter your age and average : "); scanf("%d %f",&age,&average); printf("You are %d years old and your average is %5.2f \n",age,average); } Please enter your age and average : You are 19 years old and your average is 16.72
45
3-6-7 ورودی و خروجی اطلاعات در C++
از آنجا که امروزه معمولا برنامهنویسان C از کامپایلرهای C++ استفاده میکنند، میتوانند از اشیای ورودی و خروجی آن نیز استفاده کنند. اینکار در بین بسیاری از برنامهنویسان C متداول است، بهمین دلیل ما در اینجا نحوه کار با اشیای خواندن و نوشتن در C++ را بطور مقدماتی توضیح میدهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی گرایی و زبان C++ دارد. قبل از هرچیز لازم به ذکر است که کلیه اشیای مربوط به ورودی و خروجی در فایل سرآمدی بنام iostream.h تعیریف شده اند، بنابراین ابتدا باید این فایل به برنامه توسط دستور #include الحاق گردد.
46
3-6-7 ورودی و خروجی اطلاعات در C++
زبان C++ برای نمایش اطلاعات از یک شیئ بنام cout استفاده مینماید. برای ارسال اطلاعات مورد نظر برای چاپ به cout باید از عملگر درج در جریان یا >> استفاده نماییم. بعنوان مثال : cout << “Please enter your name: ” ; و یا مثال دیگر : int a = 10; float b = 2.86; cout << a; cout << b; نکته جالبی که در این مثالها دیده میشود، آنستکه برخلاف تابع printf هیچ نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود شئ cout نوع آن را تشخیص میدهد. علاوه براین میتوان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و چندین متغیر را با یک دستور چاپ کرد.
47
3-6-7 ورودی و خروجی اطلاعات در C++
#include <iostream.h> void main() { int age = 20; floate average = 18.23; cout << “You are ” << age << “ years old and your average is ” << average ; } You are 20 years old and your average is
48
3-6-7 ورودی و خروجی اطلاعات در C++
برای دریافت اطلاعات از کاربر، از شئ دیگری بنام cin استفاده میشود. برای ارسال متغیر مورد نظر به cin باید از عملگر استخراج از جریان یا << استفاده نماییم. بعنوان مثال: int a; cin >> a; بازهم همانطور که میبینید نیازی به تعیین نوع متغیر موردنظر نیست و خود شئ cin نوع متغیر را بطور اتوماتیک تشخیص داده و دادهای از همان نوع را از کاربر دریافت و در متغیر مورد نظر قرار میدهد. عملگرهای استخراج از جریان را نیز میتوان با یکدیگر الحاق کرد. برای رفتن به خط بعد در شئ cout میتوان از دستکاری کننده endl استفاده کرد. مثلا در دستور زیر پس از چاپ پیغام، مکان نما به خط بعد منتقل میشود: cout << “List of students : “ << endl; البته دستکاری کنندههای متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل دارد.
49
3-6-7 ورودی و خروجی اطلاعات در C++
#include <iostream.h> void main() { int age; float average ; cout << "Please enter your age and average : " ; cin >> age >> average ; cout << "You are " << age << "years old and your average is " << average; } Please enter your age and average : You are 19 years old and your average is 16.72
50
7-7 توابع کتابخانهای همانطور که قبلا نیز گفته شد، زبان C از زیر برنامهها نیز حمایت میکند. هر زیر برنامه در C یک تابع نامیده میشود. تا کنون با توابعی همچون main و یا printf و scanf آشنا شده ایم. معمولا عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار، برخی از توابع عمومی را که ممکن است مورد نیاز جمع کثیری از برنامهنویسان مختلف باشد را در قالب کتابخانهای از توابع در اختیار برنامهنویسان میگذارند. بعضی از این توابع کتابخانهای مانند printf و scanf بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه میشوند. در کامپایلر عرضه شده توسط شرکت بورلند (Borland C++ 3.1) نیز کتابخانههای متعددی از توابع برای شما عرضه شدهاند که بتدریج با آنها و کاربردشان آشنا خواهید شد. نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در ابتدای برنامه خود اضافه نمایید ( با استفاده از #include). هر فایل سرآمد شامل تعاریف اولیه گروهی از توابع مرتبط با هم و دادههای مربوط به آنها بوده و در استاندارد قدیمی تر دارای پسوند .h میباشد(در استاندارد جدید پسوند این فایلها حذف شده است). برخی از این فایلهای سرآمد عبارتند از: stdio.h : توابع ورودی و خروجی استاندارد math.h : توابع ریاضی graphics.h : توابع مربوط به عملیات گرافیکی string.h : توابع مربوط به کار با رشته ها
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.