مرسی.
فقط اون تابعی اش رو نفهمیدم!
میشه 1 کم کاملتر توضیح بدید؟
ممنون
مرسی.
فقط اون تابعی اش رو نفهمیدم!
میشه 1 کم کاملتر توضیح بدید؟
ممنون
ما به جاي اينکه از کلمات int و double و float و char تو ليست پارامترها و نوع داده برگشتي تابع استفاده کنيم از arrTemp استفاده کرديم . حالا هر نوع داده اي که ما بخوايم به تابع بفرستيم ميره تو نوع داده قالبي arrTemp قرار مي گيره و بعد sum رو که از نوع arrTemp تعريف کرديم دوباره برمي گردونيم .
چون ما اگه تو ليست پارامتر مون int مي نوشتيم و مي خواستيم براش عدد 12.32 بفرستيم مي گفت که متغير arr از نوع int تعريف شده و نمي تونه double ذخيره کنه .
خوب حالا توابع بازگشتي .
به نظر من سخت ترين مبحث ++C همين توابع بازگشتي هستش . تو علم رياضيات هم هميشه بحث بازگشت پيچيده بود .
خود من هم تا حالا درست و حسابي اينو درک نکردم . ولي اگه يه برنامه اي رو بشه از طريق بازگشتي نوشت نسبت به مدل مشابه ساده خود بسيار بسيار حجم کد کمتري خواهد داشت . ولي هميشه بايد بين کارايي و زيبايي يکي انتخاب شود . چون برنامه هاي بازگشتي ظاهر مطلوبي ندارن . Trace کردنش براي هر کسي ساده نيست . مثلا براي من .
حالا شروع کنيم ببينيم چي ميشه .
توابعي که خودشون رو در داخل بلاکشون احضار مي کنن توابع بازگشتي هستن . نه بابا !!!
کلا اساس کار توابع بازگشتي اينه که اين گونه توابع معمولا دو قسمت دارن . يه قسمت که قسمت پايه ناميده ميشه رو مي دونن چجوري حل کنن . مثلا فرض کنين ما مي خوايم برنامه فاکتوريل رو از طريق توابع بازگشتي بنويسيم . اين تابع بازگشتي ما در حالت پايه مي دونه که فاکتوريل 1 و 0 ميشه 1 . بنابراين وقتي تو بلاکش با اين دو عدد مواجه ميشه بدون انجام هيچ کار اضافي عدد يک رو برمي گردونه . ولي وقتي با عددي مثل 2 روبرو شد ديگه نمي تونه اين قسمت رو حل کنه . بنابراين بايد تا جايي اين قسمتي رو که نمي تونه حل کنه رو ساده کنه تا برسه به حالت پايه . اين کار با فراخواني متوالي خودش انجام ميشه .
مثال برنامه فاکتوريل رو مي زنم و يه بار Trace اش مي کنم . من فقط تابع بازگشتي رو مي نويسم . تابع main رو نميارم . اينجا همون طور که مي دونين تابع main با يه آرگوماني تابع factorial رو احضار کرده . فرض کنين اين آرگومان 4 هست .
خطکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
رو نوشتن واقعا صحت و سلامتي کامل بدن رو مي طلبه .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا اگه فرض کردين که آرگومان 4 هست اين 4 ميره تو number قرار مي گيره .
حالا شايد بپرسين long و unsigned چي هستن ؟
long يه نوع داده اي هست و unsigned هم مي گه که نمي تونيم تو number اعداد منفي قرار بديم .
پرانتز بسته .
الان number ما برابر 4 هست . مياد ميگه آيا number <= 1 هست ؟ هست ؟ خير نيست . پس ميره سراغ else .
تو قسمت else تابع ما دوباره فراخواني ميشه . توسط خودش . با آرگومان number - 1 . يعني تو اين قسمت مي خواد
رو برگردونه . number ما که مشخصه 4 هست . ولي قسمت دوم مشخص نيست . پس 4 اينجا منتظر مي مونه و ميره دوباره تابع factorial رو با آرگومان number - 1 يعني 3 فراخواني مي کنه . اين بار هم number <= 1 نيست و مياد سراغ else . اين بار هم مي خوادکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
رو بر گردونه . الان number ما 3 هست . قبلا هم يه 4 داشتيم . پس اين بار هم 3 * 4 رو نگه مي داره و تابع factorial رو با آرگومان number -1 يعني 2 فراخواني مي کنه . باز هم number <= 1 نيست و مياد سراغ else . حالا 2 * 3 * 4 رو نگه مي داره و تابع رو با آرگومان 1 فراخواني مي کنه . اين بار ديگه مي رسه به حالت پايه . کار تابع تموم ميشه و نتيجه کار 2 * 3 * 4 يعني 24 هست .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خودم هم نفهميدم چي گفتم .
ولي اگه سوالي هست مضايقه نکنين .![]()
شما که همین کار رو کردی!توابعي که خودشون رو در داخل بلاکشون احضار مي کنن توابع بازگشتي هستن . نه بابا !!!
+
این کجاش سخت ترین بود؟!!×؟!؟×؟!؟!×
در مورد جمله اولتون منظورتونو نفهميدم .
در مورد دومي هم يعني جدي راحت بود ؟ چون هم استاد هاي برنامه نويسي و هم استاد هاي رياضي ( ساختمان گسسته ) و هم خود ديتل هم به اين مسئله اعتراف کردن که بازگشت سخته .
منظورم همون چیزی ه که نقل قول کردم.
شما گفتی که توابعي که خودشون رو در داخل بلاکشون احضار مي کنن، بازگشتی نیستند.
ولی مثالی که زدی، دقیقاً خودش رو تو بلاک خودش احضار کرده و بلافاصله هم return کرده!
جدی کجاش سخت بود؟!؟![]()
من کي همچين حرفي زدم ؟
احتمالا اين کلمه "نه بابا !!" شما رو دچار اشتباه کرده . اين رو يه جور ديگه براي خودتون تفسير کنين . قصدم شوخي بود .
کدوم قسمت ++C براتون سخته دوست عزيز ؟جدی کجاش سخت بود؟!؟
احتمالا سختي اين قسمت زماني مشخص بشه که برنامه رو بدن بگن با تابع بازگشتي بنويس . شايد الان کد آماده رو مي بينين ميگين راحته .
به هر حال اگه شما به اين راحت بگين بقيه مطالب ++C از آب خوردن هم راحت تره .
به نظر منم بازگشت راحته. من زیاد ازش استفاده میکنم. ولی برای خیلیا سخته. همون طور که برای خیلیا درس ریاضی سخت ترین درسه.
سلام دوستان ....................
بحث رو مي خوايم ادامه بديم ...
فايل ها
قبلا که برنامه مي نوشتيم ، داده ها رو تو متغيرها و آرايه ها به صورت موقتي ذخيره مي کرديم که با اتمام اجراي برنامه اين مقادير هم از بين مي رفتن . براي ذخيره دائمي اين داده ها ، اونا رو تو فايل ها ذخيره مي کنيم .
با توجه به اينکه منبع اصلي من براي اين قسمت يعني فايل ها ، فصل 17 کتاب ديتل هست ، و تو اون چند تا تعريف قبل از بحث فايل ها اومده ، من هم لازم مي دونم اونا رو ذکر کنم .
بيت : کوچکترين عنصر داده اي که کامپيوتر ها پشتيباني ميکنند .
بايت : هر هشت بيت يک بايت را تشکيل مي دهد .
کاراکتر : از ترکيب چند بيت ، کاراکتر تشکيل مي شود . ( نويسنده ( خودم ) : هر کاراکتر يا نوع داده اي char تو ++C ، يک بايت حافظه اشغال مي کنه . يعني هشت بيت . پس براي نمايش يک کاراکتر تو کامپيوتر به هشت تا صفر يا يک نياز هست که در نتيجه يک عدد هشت رقمي باينري تشکيل ميشه که معادل کد اسکي کاراکتر مورد نظر در مبناي 10 يا دسيمال هست . )
نکته ( نويسنده ) : البته کاراکترهاي Unicode دو بايت حافظه اشغال مي کنن که ما فعلا به اونا کاري نداريم .
فيلد : مجموعه اي از کاراکتر ها که معني و مفهوم داشته باشند . مثلا نام يک شخص .
رکورد : از ترکيب چند فيلد تشکيل مي شود . مثلا يک رکورد مي تونه شامل فيلد هاي زير باشه :
نام نام خانوادگي شماره شناسنامه محل تولد نام پدر نام پدربزرگ ...................
فايل : مجموعه اي از رکورد هاي مرتبط با هم
براي سهولت دسترسي به رکورد هاي خاص از فايل ، حداقل يک فيلد داخل هر رکورد به عنوان کليد رکورد در نظرگرفته ميشه . مثلا شماره شناسايي .
رکورد ها با چند روش مختلف در فايل ها سازمان دهي ميشن . نوع متداول اون ، فايل ترتيبي هست که رکوردها بر اساس کليد رکورد مرتب ميشن .
ممکنه شرکتي از چند فايل براي ذخيره داده هاش استفاده کنه . فايل حسابهاي دريافتي ، فايل حساب هاي پرداختي ، فايل انبارداري و . ... مجموعه اي از فايل هاي مرتبط با هم در يک بانک اطلاعاتي ذخيره مي شن . مجموعه برنامه هاي که براي ايجاد و مديريت بانک هاي اطلاعاتي طراحي ميشن سيستم مديريت بانک اطلاعاتي نام دارن .
++C هيچ ساختاري تو يه برنامه ايجاد نمي کنه . بنابراين مفهومي مثل رکورد در يک فايل ++C وجود نداره و برنامه نويس بايد خودش اين فايل ها رو سازمان بده .
خوب حالا .........
يه مثال مثل هميشه ميارم و توضيحات مربوطه :
بالا کاملا مشخصه که چرا اون هدرها رو include کرديم . iostream براي استفاده از نامهاي cerr , cin, cout, endl, ios . هدر fstream براي اسفاده از نام ofstream و cstdlib براي استفاده از نام exit . کاربرد هر کدومو خودتون خواهيد ديد .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اولين خط تابع مانند اينه که شيء outClientFile رو از کلاس ofstream نمونه سازي کرديم و به سازنده اش دو تا آرگومان فرستاديم که آرگومان محل ذخيره فايل در حافظه و نام فايل رو نشون ميده و آرگومان دوم نوع باز کردن فايل . که ios::out يعني اين که فايل براي نوشتن باز شه . در اين مورد بعدا توضيح مي دم . شرط بعدي نشون ميده که اگه به هر دليلي برنامه قادر به ايجاد فايل نبود برنامه فورا خاتمه پيدا کنه . بهتره که اينو هميشه داشته باشين . اگه outClientFile موجود نباشه مقدار false مي گيره که نقيض اون ميشه true و شرط اجرا ميشه .
حالا مي رسيم به قسمت :
وقتي داخل شرط اورديم که while ( cin >> account يعني اينکه اگه عمليات ورودي موفقيت آميز هستش ، همون مقادير رو تو فايل ذخيره کن . اين جا براي خاتمه دادن به اجراي برنامه بايد کليد انتهاي فايل فشرده بشه که تو ويندوز ، CTRL + Z هست و بعد از اون کليد Enter بايد زده شه .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ادامه دارد .........
سلام ...
قبلا گفتيم که وقتي از ofstream شيئي مي گيريم دو تا آرگومان بهش مي ديم که اونجا آرگومان دوم نوع باز کردن فايل رو نشون مي داد . گفتيم که ios::out براي نوشتن فايل هست . اگه فايل مربوطه به اين شکل باز شه ، محتويات قبليش حذف ميشه و فايل براي نوشتن مجدد آماده ميشه . اگه فايل از قبل تو اون محل مشخص شده وجود نداشته باشه ، يه فايل با اون نام ايجاد ميشه . اگه اين آرگومان دوم مشخص نشه ، به صورت پيش فرض ، فايل براي نوشتن باز ميشه . يعني ios::out انتخاب ميشه . بقيه حالت ها هم اينا هستن :
ios::app : داده ها رو تو ادامه فايل اضافه مي کنه . يعني در پايان فايل . همون جايي که ما قبلا با CTRL + Z مشخص کرديم .
ios::in : فايل رو براي خوندن باز مي کنه .
ios::trunc : اگه فايل از قبل موجود باشه محتويات فايل رو پاک مي کنه .
ios::binary : فايل رو براي خوندن و نوشتن به صورت باينري باز مي کنه .
راستي يه چيزي تو پست قبلي يادم رفته بودم بگم . آرگومان اول رو که به شيء outClientFile فرستاديم C:\\Client.dat بود . شايد بپرسين چرا از دو تا Backslash استفاده کرديم . براي اينکه براي چاپ يه علامت \ تو يه رشته يعني بين دو تا گيومه بايد از \\ استفاده کرد . زيرا خود \ يه escape sequence هست و بايد يه کاراکتر ديگه به دنبال اون بياد تا يه کاراکتر معني دار داشته باشن . مثلا شما از يه escape sequence به نام n\ استفاده مي کنين تا به خط بعدي برين .
گفتيم که مي تونيم به شيء مون آرگومان دوم رو نفرستيم . مي تونيم آرگومان اول رو هم نفرستيم و فقط يه شيء از ofstream ايجاد کنيم و بعدا فايلمون رو باز کنيم . يعني :
براي بستن فايل هم از دستور زير استفاده مي کنيم :کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
توصيه ميشه که وقتي با فايل ديگه کاري ندارين تو برنامه ، فايل رو ببندين .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
قبلا يه فايل ايجاد کرديم و اطلاعاتي رو توش نوشتيم . حالا مي خوايم اطلاعات يه فايل رو بخونيم .
براي خواندن يه فايل ، يه شيء از ifstream ايجاد مي کنيم . مسير مورد نظر رو به اضافه نوع باز کردن فايل ( که ما اينجا براي خواندن مي خوايم يعني ios::in ) رو به عنوان آرگومان براش مي فرستيم . يعني :
چون داده ها قبلا به صورت ترتيبي تو فايل نوشته شده بودن الان هم ميشه به ترتيب اونا رو خوند . مثلا سه تا متغير يکي از نوع int ، يکي آرايه اي از char و ديگري از نوع double تعريف کنين . همون طوري که موقع نوشتن اين کارو کردين . بعد از دستور زير براي انتقال داده ها به اين متغيرها استفاده کنين :کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
فرض کرديم که اون سه تا متغيري که تعريف کردين اسمشون account و name و balance بودن . مي تونستين هر اسم ديگه اي تعريف کنين .کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا مي تونين اين سه متغير رو توسط cout چاپ کنين تا ببينين که واقعا اين اطلاعات از فايل خونده شدن .
فکر کنم فايل ها تا همين جا کافي باشه .![]()
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)