تعیین انتهای خط:
انتهای خط در فایل های متنی توسط کلید RETURN مشخص میشود ولی در فایل های باینری انتهای خط نداریم. اطلاعات بصورت رکورد کنار هم قرار میگرند تا فایل تمام شود.
تعیین انتهای فایل: در فایل های متنی توسط دو حر ف TA (در مبنای 16 (دکمه های CTRL+Z) انتهای فایل مشخص میشود. در فایل های باینری تعداد رکورد (که توسط سیستم نگهداری میشود) انتهای فایل مشخص میشود.
باز کردن فایل
هر فایلی که میخواهیم مورد استفاده قرار دهیم ابتدا باید آن را باز کرد. تابع fo pen برای باز کردن فایل میباشد.
بستن فایل:
بعد از اینکه برنامه کارش با فایل تمام شد فایل را باید بست. تابع fclose() برای بستن فایل میباشد.
نوشتن و خواندن فایل (یک کاراکتر)
- تابع pute () برای نوشتن یک کاراکر در فایل میباشد.
تابع gete() برای خواندن یک کاراکر از فایل میباشد.
خواندن و نوشتن رشته ها در فایل
- تابع fgets () برای خواندن رشته از فایل
- تابع puts() برای نوشتن رشته در فایل
حذف فایل برای حذف فایل از تابع remove () استفاده میشود.
- توابع فوق در فایل سرآیند stdio.h قرار دارند.
سازمان فایل: نحوه ذخیره شدن اطلاعات در فایل بدو صورت کلی زیر ؟؟ و بهمین صورت هم قابل دستیابی (بازیابی) هستند.
1- سازمان فایل ترتیبی (seqwen~Tiac)
2- سازمان فایل تصادفی (RANDOM)
- در سازمان ترتیبی: رکوردها به همان ترتیبی که از ورودی خوانده میشود در فایل قرار میگرند و هنگام بازیابی، به همان ترتیبی که در فایل ذخیره شده اند مورد بررسی قرار میگرند.
- در سازمان فایل تصادفی: هر رکورد از طریق آدرس (محل قرار گرفتن در فایل) مستقیماً مورد دستیابی قرار میگرند بدون اینکه رکوردهای قبل از آن خوانده شوند.
موارد جزئی تر و مثال به کتاب مراجعه شود. (فصل هشتم)
متغیرهای محلی و عمومی
- متغیرهائی که در داخل هر تابعی تعریف شوند متغیرهای محلی های تابع نامیده میشوند و فقط هم در همان تابع معتبر و قابل استفاده هستند.
- متغیرهائیکه در خارج از توابع و در بالای تابع main() تعریف شوند در تمام توابع موجود در برنامه قابل استفاده اند و معتبر هستند را متغیرهای عمومی گویند.
توجه:
- تفاوت های متغیرهای محلی و عمومی دراین است که:
- متغیرهای عمومی دارای مقدار اولیه صفر هستند.
توجه: اگر در تابعی متغیر همنام با متغیر عمومی تعریف شود. این متغیر عمومی در تابع قابل استفاده نیست (معتبر نیست) و همان مقدار محلی قابل استفاده و بهره برداری است.
مثال: برای متغیرهای عمومی و محلی:
- برنامه ای بنویسید که 5 عدد صحیح را از ورودی خوانده (در یک تابع) و مجموع مربعات آنها را در تابعی دیگر محاسبه نموده و حاصل نهایتاً در برنامه اصل چاپ گردد.
دو تا تابع داریم
int k,sq,sum.تعریف متغیرهای عمومی در خارج از تابع اصلی main()
void input (void).
Void square (void). الگوی توابع در خارج از تابع main
Int main(0
{
Int jg i=1. متغیرهای کلی
Printf (in ENTER RIVE NUMBER?)ز
Fon(j=o ز j
Input ()ز صدا زده می شود (فراخوانی)input پنج بار تابع
Printf (In sum of SQARE is=:%d, sum)ز
Getch ()ز
returnQ ز
} انتهای تابع اصلی برگشت
Void input (void) شروع تابع
{
Scanf ( %d, &k)ز
sQuare ()فراخوانی میشود sQuareتابع
sum+= sQز
انتشار تابع
input
void squahe (void)
{
عدد به توان 2 میرسد. برگشت
Sq=k kز
انتهای تابع:
Square
پس از کامبایل و اجرا
ENTER Five NUMBER 47 842
Sum of SQUARE K- 149
بارگشتی RECURSIVE
- بازگشتی یعنی تابعی در حین اجرا خودش را فراخوانی کند. توابع میتوانند به طور مستقیم یا غیر مستقیم خودشان را فراخوانی کنند.
- در روش مستقیم یکی از دستورات تابع، فراخوانی خودش است. در روش غیر مستقیم تابعی مثل F1() تابع F2 () را فراخوانی می کند و تابع F2() نیز به نوبه خود تابع f1() را فراخوای مینماید.
- توجه شود که برای ایجاد بازگشتی- الگوریتمی که توسط تابع پیاده سازی میشود باید خصوصیت بازگشتی داشته باشد.
- هر فراخوانی تابع سرانجام باید به اتمام برسد و حالت توقف و ختم فراخوانی بیش بیاید، از دستور if بصورت قابل استفاده میشود (فرم کلی)
(به حال توقف و خاتمه رسیدی) if
مسئله های توقف را حل کن.
Else
تابع را بار دیگر فراخوانی کن
مثال: در محاسبه فاکتوریل n داریم اگر
اگر
یعنی n=o حالت توقف و n>o فراخوانی تابع:
به جای 3! توجه شود:
مکانیسم حل فاکتور ریل یک عدد مسئله بازگشتی را ایجاب می کند.
بطور کلی: اگر تابعی داشته باشیم که عددی مثل n را به عنوان آرگومال بپذیرد و فاکتوریل آن را برگرداند، این تابع باید خودش را آنقدر فراخوانی کند تا به حالت توقف برسد. با رسیدن به حالت توقف به برنامه فراخوانی بر میگردد.
مثال: برنامه ای بنویسید که عدد n را از ورودی خوانده به کمک تابع بازگشتی، فاکتوریل آن را محاسبه به تابع فراخوان ارسال نماید.
تست شد/cffacto
الگوی تابع ز Unsigned long foct (int)
Int main (0
ز{long int (m)
ز Clrscr ()
ز Printf (in ENTER A POSITIVE INTEGEN NUMBGN?)
ز Scan f (y.d , &n)
فراخوانی تابع ز M= fact (n)
ز Print f (in NUMBER =%d , FACTORIA=%ld , n,m)
ز Getch ()
ز Returr
}
Unsigned long fact (int X)
{
تابع خودش را فراخوانی کرده است If
}
پس از ترجمه و اجرا مثلاً برابر عدد 5 خواهیم داشت.
ENTER APOSMIVE NUMBCOR?5
NUMBER =5 FACTOAIAL=120
روش فراخوانی با ارجاع
در این روش توابع میتوانند بیش از یک مقدار به تابع فراخوان برگردانند.در این حالت یعنی فراخوانی تابع با ارجاع به جای مقدار آرگومان تابع اصلی آدرس آنها (محلی که در حافظه قرار دارند) را در پارامتر قرار میدهد. و از طریق آدرس این متغیرها میتوانیم محتویات آنها را پردازش کنیم.
تابع
اشاره گر یا آدرس
آدرس هر متغیر در حافظه را، اشاره گر میگویند.
- حافظه کامپیوتر، مجموعه ای از چندین بایت است. هر بایت دارای یک شماره ردیف است، شماره ردیف هر بایت از حافظه را آدرس آن محل از حافظه گویند.
- در ضمن متغیرها نامی برای محل های حافظه هستند و لذا بایت هائی از حافظه را اشغال میکنند، آدرس اولین بایتی از حافظه که به متغیر اختصاص مییابد، آدرس آن متغیر نام دارد.
متغیرها/اشاره گر
اشاره گر یا آدرس در یک متغیری ذخیره میشود و آدرس هم یک عدد است پس از تعریف متغیر، باید نوع آن با نوع آدرس یکی باشد، این متغیرها را متغیرهای اشاره گر میگویند و بصورت کلی زیر تعریف میشوند.
ز متغیر *نوع
یعنی متغیر اشاره گری که بخواهد آدرس متغیرهای برنامه را نگهداری کند باید در کنار متغیر اشاره گر علامت ستاره (*) قرار داد. مثلاً
P2/P1 اشاره به محل های شکل میکنند که عدد صحیح در آنها است int * pl*p2
F1,f2 به محل هائی اشاره میکنند که مقادیر آنها عدد بزرگ قرار دارد.
Char*ch
Ch به محلی اشاره می کند که در آن محل یک کاراکتر قرار دارد.
عملگرها. اشاره:
دو عملگر *,& در انجام عملیات با اشاره گرها مورد استفاده قرار میگرند. عملگر & آدرس عملوند (مقدار) خودش را مشخص میکند و عملگر * محتویات جائی را (آدرس را) مشخص میکند که عملوندش به آن اشاره میکند.
مثال: برنامه اصلی و دو تابع بنویسید که طول و عرض مستطیل را در یک تابع بخواند و برای تابع اصلی بفرستد. سپس برنامه اصلی طول و عرض را به تابع دیگر ارسال و در تابع مساحت و محیط مستطیل محاسبه و نتیجه به برنامه اصلی باز گردانده شود و در آنجا چاپ نماید. ص 151
توجه: چون در تابع ها، دو مقدار به برنامه اصلی ارسال میشود پس آنها را از طریق فراخوانی با ارجاع باید ارسال کرد.
تست شد
Int main ( )
{
جدا کردن دو تابع inpot برای خواندن داروه ورودی و تابع most برای محاسبه
ز Printf (length=%d, width=%d , len,wid)
مساحت در محیط دارسال آن به برنامه اصلی:
Printf (in area=%d ,perlmer=%d,area,per):
پارامترهای ارجاع
{
تابع input برای خواندن طول و عرض
Void input (int*p1,int*p2)
P1,p2 طول عرض مستطیل خوانده میشود از طریق پارامترهای ارجاع به برنامه اصلی ارسال میشود.
{
ز Print f(ENTER LENGTH, WIDTH?)
Scan f(%d%s.p1/p2)ز
پارامترهای مقدار
پارامترهای ارجاع
Void most (int x. int g. int *a,int *p)
تابع most برای محاسبه طول و عرض از برنامه اصلی به تابع most ارسال مساحت و محیط از طریق پارامترهای ارجاع به برنامه اصلی ارسال میشود.
}
در تبادل اطلاعات به شکل زیر توجه شود:
توجه (مهم): در تعریف کلمه void آمده بود که توابعی که هیچ مقدار به تابع بر نمیگردانند با void تعریف میشوند. ولی در مثال فوق با اینکه دو مقدار به برنامه اصل بصورت ارجاعی بر میگردانند. ؟؟
توابع کتابخانه ای فصل 9 ص 259
1- ریاضی: توکید اعداد تصادفی- ؟؟؟ قدر مطلق لگارتیم و اعمال مثلثاتی را نام برد الگوی تابع در math.h قرار دارد.
2- کاراکتری: کپی رشته در رشته دیگر- مقایسه رشته ها الگوی تابع در string.h میباشد.
3- رشته ای: کپی رشته در رشته دیگر- مقایسه رشته ها الگوی تابع در string.h قرار دارد.
توابع کتابخانه ای توابعی هستند که از قبل توسط شرکت های تولید کننده نرم افزار (سیستم عامل –مترجم...) نوشته شده و همراه مترجم قرار داده اند و در صورت نیاز کافی است نام تابع به همراه داده مورد نظر به سیستم داده شود. پس از عملیات لازم روی داده جواب را بما بر می گرداند.