نمایش نتایج: از شماره 1 تا 7 , از مجموع 7

موضوع: Re: آموزش برنامه نویسی با ++c 2

  1. #1
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    New 1 Re: آموزش برنامه نویسی با ++c 2

    Re: آموزش برنامه نویسی با ++c

    رشته های کاراکتری
    یک مجموعه از کاراکترها را یک رشته کاراکتری(یا بطور خلاصه 'رشته' یا string) میگویند. مثلاً "This is a string" یک نمونه از رشته هاست. یک ثابت رشته ای همیشه در دوتا " قرارمیگیرد. اما ما دونوع رشته داریم: 1.مجموعه ای از char ها(که به رشته های سبک C-style) C) (منظور زبان C است) هم معروف اند) 2.از نوع کلاس string

    رشته های سبک C
    رشته های اصلی ++C هستند. برای این به فرمت C مشهورند که قبل از ++C در C وجود داشتند. این رشته ها در اصل آرایه ای از کاراکترها هستند. مثلاً رشته "char str[7] = "String ، که از 6 کاراکتر بعلاوه کاراکتر پایان رشته(که خود کامپایلر اضافه میکند) تشکیل شده و در هنگام تعریف مقدار اولیه گرفته است.

    کاراکتر پایان رشته که به آن کاراکتر پوچ پایان دهنده (terminating null character) هم میگویند، در اصل یک کاراکتر است که وقتی چاپ شود یک فاصله چاپ خواهد شد(البته کاراکتر فاصله چیز دیگری است و کد اسکی آن 32 است)، و نام اصلی آن کاراکتر پوچ (null) است که در اینجا برای مشخص کردن پایان یک رشته از آن استفاده میشود. کد اسکی آن 0 است و بصورت کاراکتری '0\' نوشته میشود، بنابراین از کاراکتر '0' که کداسکی 48 دارد و یک 0 چاپ میشود متمایز میگردد. پس هر جایی که این کاراکتر در یک رشته قرار گیرد پایان آنرا مشخص میکند(حتی اگر بعد از آن کاراکترهای دیگری قرار داشته باشند) و در اعمال مختلفی که روی رشته انجام میشود معیار پایان آن قرار میگیرد. مثلاً وقتی یک رشته را با دستور cout << str چاپ کنید، فقط تا قبل از کاراکتر پوچی که در رشته قرار دارد چاپ میشود.

    هر ثابت رشته ای که در بین دوتا " قرار میگیرد شامل یک '0\' هم در پایان خود هست، هرچند که شما چنین چیزی را مشخص نمیکنید، بنابراین وقتی با دستور "char str[7] = "String یک رشته را تعریف میکنید، کاراکتر هفتم آن '0\' قرار میگیرد (و مثلاً کاراکتر ششم g هست).
    روش دیگر برای مقدار دهی یک آرایه کاراکتری(که در اصل نمایشگر یک رشته است) استفاده از مقداردهی هر کاراکتر بطور جداگانه است، مثلاً {'0\','char str[7] = {'S','t','r','i','n','g که همان String را نمایش میدهد، اما چون خودمان هر کاراکتر را مشخص کرده ایم، باید '0\' را هم مشخص کنیم.

    برای مقدار دهی اولیه تهی('0\') به تمام اعضای یک آرایه کاراکتری میتوانید از عبارت {'char str[7] = {'\0 استفاده کنید، یا اینکه بجای '0\' بگذارید 0 چراکه همانطور که میدانید میتوان بجای نوشتن یک کاراکتر بین دوتا ' کد اسکی آنرا نوشت.

    برای دریافت یک رشته از کاربر، اگر مثلاً [char str[7 را تعریف کرده باشیم، دستور cin >> str یک رشته را از کاربر دریافت میکند. البته باید تعداد کاراکترهای رشته ای که کاربر وارد میکند از طول آرایه کاراکتری ما کمتر باشد، یعنی برای str فقط 6 کاراکتر را از کاربر میتوان دریافت کرد(چرا که کاراکتر آخر را برای '0\' نگه میداریم و دستور cin بعد از دریافت رشته از سوی کاربر هفتمین کاراکتر را '0\' خواهد گذاشت). البته کاربر میتواند کمتر از 6 کاراکتر هم وارد کند، مثلاً اگر 3 تا وارد کند، کاراکتر چهارم مقدار '0\' خواهد گرفت و کاراکترهای پنجم تا هفتم تغییری نخواهند کرد.

    اما اگر میخواهید با این مشکل مواجه نشوید که کاربر تعداد بیشتری کاراکتر وارد کند و برنامه شما هنگ کند، از دستور ;('cin.getline(str,4,'y استفاده کنید، که با استفاده از تابع getline یک ورودی به طول 4(با حساب کردن '0\') را از کاربر میگیرد و در str قرار میدهد، اگر زودتر از آن به کاراکتر y برسد، تا قبل از آن را در str قرار میدهد (در اصل y در اینجا حائل(delimiter) است). هریک از str و 4 و y یک آرگومان تابع getline هستند که شما میتوانید بجای آنها هرچیز دیگری از همان نوع بگذارید. اما مقداری که برای آرگومان دوم(4) در نظر میگیرید، باید با حساب کردن '0\' حداکثر برابر طول آرایه ای که در آرگومان اول مشخص میکنید باشد. یعنی اگر طول آرایه شما 7 هست، حداکثر 7 را میتوانید برای آرگومان دوم در نظر بگیرید و getline شش کاراکتر را از ورودی گرفته و در str قرار میدهد و کاراکتر هفتم را '0\' میگذارد.چنانچه کاربر کاراکتر های بیشتری وارد کند، اگر بعداً دستورات ورودی بیشتری در برنامه داشته باشیم، این کاراکترها را دریافت خواهند کرد، یعنی هیچ وقت ورودی های کاربر از بین نمیروند و در بافر ورودی قرارمیگیرند تا اینکه با یک دستور ورودی خوانده شوند یا با دستوری دیگر یا رسیدن به انتهای برنامه حذف شوند.
    getline یک نمونه دو پارامتری هم دارد، مثلاً مثال قبل را میتوانید اینگونه بنویسید: (cin.getline(str,4 با این دستور کاراکترها تا جایی از کاربر دریافت میشوند که کلید Enter زده شده باشد یا اینکه به حد 3 کاراکتر رسیده باشند(این نمونه از دستور مشابه ('cin.getline(str,4,'\n هست، چراکه فشاردادن کلید Enter مقدار 'n\' را تولید میکند). این شکل از دستور برای زمانی مناسب است که یک حداکثری برای اندازه ورودی کاربر در نظر گرفته ایم اما حداقلی در نظر نداریم.

    یکی از مزیت های getline به cin در دریافت رشته ها: getline رشته ای که بین آن فاصله وجود دارد را هم یکجا میگیرد، اما cin همیشه تاجایی که کاربر یک کاراکتر فاصله وارد کرده است میخواند. بنابراین getline میتواند کل 34 12 را با یک دستور بخواند، اما cin در هر بار فقط یک قسمت را میخواند، اول 12 وبعد 34 را دریافت میکند.

    توجه: 'توابع مفید برای کار برروی رشته ها' و 'رشته های نوع string' بعد از توضیح توابع در قسمت های بعدی آورده خواهند شد.

  2. #2
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    عملگرها
    به هر مجموعه ای از کاراکترها که بتواند بین یا قبل از دو مقدار یا متغیر قرارگیرد و عملی روی آنها(یا با استفاده از آنها) انجام داده و بطور اختیاری مقداری برگرداند، یک عملگر میگویند. مثلاً + یک عملگر است(عملگر جمع) که از یک کاراکتر '+' تشکیل شده، بین دو مقدار یا متغیر قرار میگیرد، عمل جمع را با استفاده از آنها انجام داده و مجموع آنها را برمیگرداند.

    به مقادیر یا متغیرهایی که عملگر بین یا قبل و بعد از آنها قرار میگیرد و عملی را با آنها انجام میدهد، عملوند میگویند. مثلاً در 4 + 5 اعداد 5 و 4 عملوندهای عملگر جمع هستند، پس عملگر جمع دو عملوند دارد(میگیرد).

    به عملگرهایی که فقط یک عملوند دارند یگانی(unary) میگویند. مثلاً عملگر جمعی که یک عملگر بگیرد هم داریم، که در اصل استفاده ای ندارد، چراکه مثلاً 2+ و 2 یکی هستند(اما عملگر یگانی منفی کاربرد برگرداندن مقدار منفی را دارد). عملگرهایی که دو عملوند میگیرند را دوتایی(binary) میگویند، مثل عملوند تفریق(-). عملوندهایی که سه تا عملوند میگیرند را سه تایی(ternary) میگویند، مثل عملگر انتخاب(:?). بعداً خواهید دید که رفتار عملگرها را میتوانید تغییر دهید.

    عملگرهای حسابی
    جمع : + ، تفریق(منفی) : - ، ضرب : * ، تقسیم : / ، باقیمانده : %

    عملگر منفی یک عملوند میگیرد و منفی آنرا برمیگرداند، مثلاً 2- عدد 2 را منفی میکند.

    عملگر / خارج قسمت تقسیم عملوند چپ به راستش را میدهد. اما میگوییم 'تقسیم صحیح' چراکه بعد از تقسیم دو عدد ممکن است باقیمانده ای ایجاد شود، میدانید که اگر تقسیم را ادامه دهیم باید در خارج قسمت ممیز قرار دهیم و جلو رویم، در آخر دیگر خارج قسمت یک عدد 'صحیح' نخواهد بود(اعشاری میشود). مثلاً خارج قسمت تقسیم 7 بر 2 ، 3.5 میشود، اما اگر خارج قسمت را صحیح در نظر بگیریم(یعنی قسمت اعشاری را در نظر نگیریم) میشود 3. در ++C هم عملگر تقسیم خارج قسمت را بصورت یک عدد صحیح میدهد، در نتیجه حاصل 7/2 میشود 3.

    عملگر % باقیمانده تقسیم عملوند سمت چپ بر راستش را میدهد، مثلاً حاصل 2%7 میشود 1 چون باقیمانده تقسیم 7 بر 2 یک میشود.

    اولویت عملگرها (Operator Precedence)
    وقتی عبارتی شامل چندین عملگر را مینویسید، هر عملگر کی محاسبه میشود؟ مثال مشهور ریاضی آن 4*3+2 است، که اگر اول 2 با 3 جمع شود(5) و بعد در 4 ضرب(*) شود، حاصل 20 میشود، اما اگر اول 3 در 4 ضرب(12) و بعد با 2 جمع شود، حاصل 14 میشود، و 20 با 14 مساوی نیست! بنابراین اینکه حاصل کدام عملگر ابتدا محاسبه شود شاید در نتیجه عبارت تأثیرگذار باشد. پس در برنامه نویسی(مثل ریاضی) عملگرها اولویت گذاری شده اند. بنابراین مثلاً عملگر ضرب زودتر از جمع محاسبه میشود.

    اولویت عملگرهای حسابی
    هر دسته که در یک آکولاد قرار دارند اولویت یکسان دارند و از راست به چپ اولویت کم میشود:
    {منفی و مثبت یگانی} {ضرب و تقسیم و باقیمانده} {جمع و تفریق}

    شرکت پذیری عملگرها (Operator Associativity)
    اگر در یک عبارت چندین عملگر که اولویت یکسان دارند داشته باشیم(مثلاً چندین جمع و تفریق)، حالا هرکدام کی محاسبه میشوند؟ اینجا شرکت پذیری مهم میشود. شرکت پذیری دو حالت دارد : راست به چپ و چپ به راست. مثلاً + چپ به راست شرکت پذیر است. یعنی اینکه ابتدا چپ ترین جمع حساب میشود، سپس سمت راست آن و بترتیب تا راست ترین جمع. مثلاً در 4+3+2 ابتدا 2 با 3 جمع میشود و حاصل با 4 جمع میشود. البته دراینجا شرکت پذیری در نتیجه تأثیری نمیگذارد، اما در برخی عبارات حاصل را تغییر میدهد.

    شرکت پذیری عملگرهای حسابی
    چپ به راست: ضرب ، تقسیم ، باقیمانده ، جمع ، تفریق
    راست به چپ: منفی و مثبت یگانی

    در ++C اولویت و شرکت پذیری عملگرها مشخص شده است. میتوانید آنها را در قسمت Operator Precedence and Associativity از MSDN مشاهده کنید.

    عملگر پرانتز که همیشه شامل یک پرانتز باز یا ) و یک بسته یا ( میشود، میتواند ابهام و دردسرهای محاسبه حاصل یک عبارت را برطرف کند. چراکه همیشه محاسبات از درونی ترین پرانتز شروع و به بیرونی ترین ختم میشود. مثلاً با داشتن (4*3)+2 دقیقاً میدانیم که ابتدا باید ضرب و بعد از آن جمع انجام شود. اما 4*(3+2) نشان میدهد که ابتدا جمع و سپس ضرب انجام میشود.

    بنابراین برای آسان و سریع تر خواندن کدی که مینویسید و همچنین کاهش خطا در آن و تغییر آسانتر آن، از پرانتزها استفاده کنید. با استفاده از پرانتزها دیگر نیازی به دانستن اولویت و شرکت پذیری عملگرها برای نوشتن کد ندارید.

    البته اولویت ها طوری هستند که در عبارات معمول و ساده، وقتی از پرانتز استفاده نمیکنید هم به همان نتیجه ای دست خواهید یافت که پرانتزها را میگذاشتید. اما پرانتزها شما را از صحت عبارات مطمئن میسازند و در معمولاً در عبارات پیچیده لازم میشوند

  3. #3
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    <b>
    چند عملگر برای خلاصه کردن اعمال حسابی
    عملگرهای ++ و -- برای افزایش و کاهش یک متغیر به اندازه یکی استفاده میشوند. مثلاً اگر int num = 23 را داشته باشیم، ++num به num یکی اضافه میکند و 24 میشود، اما --num از آن یکی کم میکند. این دستورات را میتوان بطور مستقل در یک دستور جدا بصورت ;--num یا در یک دستور دیگر مانند ;--cout << num استفاده کرد. بهرحال از num یکی کم خواهد شد، اما استفاده همزمان از آن در یک دستور دیگر، به کاهش تعداد خطوط برنامه کمک میکند.

    وقتی دستور cout قبل را اجرا کنید خواهید دید که بازهم مقدار 23 چاپ میشود! در اینجا یکی از num کم میشود اما نکته ای وجود دارد. ما دو نوع از عملگر ++ داریم : پیش افزایشی(preincrement) و پس افزایشی(postincrement)، پس افزایشی همانی است که دیدید و بعد از نام متغیر قرارمیگیرد اما پیش افزایشی قبل از نام متغیر می آید مانند num++ (و همین دو نوع برای -- هم وجود دارد: پیش کاهشی و پس کاهشی). هر دونوع این عملگرها از این نظر که یکی به متغیری اضافه یا از آن کم میکنند فرقی ندارند، اما عملگرها پیش کاهشی و افزایشی وقتی یک متغیر را تغییر میدهند، مقدار تغییر یافته آنرا برمیگردانند، بنابراین همین مقدار تغییر یافته در عباراتی که عملگرها در آن قرار دارند استفاده میشود. مثلاً cout << --num اگر num مقدار 23 داشته باشد، عدد 22 را چاپ میکند، در صورتی که همین دستور با --num مقدار 23 را چاپ میکرد، چرا که پس کاهشی مقدار تغییر یافته را در دستوری که در آن قرار دارد استفاده نمیکند. البته فقط در دستوری که عملگر پس کاهشی در آن قرار دارد مقدار قبلی متغیر استفاده میشود، وگرنه متغیر تغییر یافته است و بعداً هرجا استفاده شود همان مقدارش که یکی کم شده است استفاده خواهد شد. پس این عملگرها معمولاً وقتی درون دستورات دیگر استفاده میشوند، تفاوتشان اهمیت پیدا میکند.

    گفته میشود که چون مثلاً پس افزایشی باید عمل اضافی نگهداری مقدار موقت قبلی متغیر را انجام دهد، از نظر سرعت برنامه بهتر است هرجا که بشود از پیش افزایشی استفاده شود، اما این تفاوت فقط ممکن است در یک جای خاص خود را نشان دهد(مثلاً جایی که استفاده زیاد و پشت سرهم از این عملگر بشود).

    هرجا که نکاتی در مورد پیش افزایشی مطرح شد در مورد پیش کاهشی هم صدق میکند و همینطور در مورد پس افزایشی و کاهشی.

    شما برای اضافه کردن یک مقدار به یک متغیر، مثلاً برای اضافه کردن 2 به num باید از دستور num = num + 2 استفاده کنید، اما راه بهتر و خلاصه تر استفاده از عملگر =+ هست: num += 2 که دوتا به num اضافه میکند. برای عملگرهای - و / و * و % هم اینچنین عملگر معادلی وجود دارد.
    مثلاً num /= 3 متغیر num را بر 3 تقسیم کرده و خارج قسمت آنرا در num قرار میدهد.


    متغیرهای const
    کلمه کلیدی const از constant به معنی ثابت می آید و میتوان برای مشخص کردن عدم تغییر یک متغیر از آن استفاده کرد. یعنی بعد از آنکه متغیر تعریف و مقداردهی اولیه شد دیگر نمیتوان مقدار آنرا تغییر داد. برای تعریف یک متغیر از نوع const کلمه کلیدی const را در ابتدای تعریف متغیر قبل از نوع داده آن بیاورید. مثلاً const int c_num = 23 متغیر c_num را با خاصیت const تعریف میکند.

    اگر بعد از تعریف c_num داشته باشید c_num = 24 یک خطای زمان کامپایل تولید میکند. چرا که مقدار c_num نمیتواند تغییر کند. هر دستور دیگری هم که c_num را تغییر بدهد، خطا تولید میکند.

    متغیر const باید در هنگام تعریف، مقدار اولیه هم بگیرد(چراکه بعداً نمیتوان مقدار آنرا تغییر داد) وگرنه یک خطای زمان کامپایل تولید میشود.

    وقتی که میدانیم یک متغیر نباید تغییر کند، const از این تغییر احتمالی جلوگیری میکند(مثلاً وقتی سرعت نور(یا هرچیز ثابت دیگری) را در یک متغیر ذخیره کنیم).

    استفاده از define# برای تعریف ثوابت
    define# مانند include# یک دستور پیش پردازنده است. از این دستور میتوان برای تعریف ثوابت درون برنامه استفاده کرد. در حقیقت این دستور ثابت مورد نظر را تعریف نمیکند، اما نامی برای آن مشخص میکند، آنگاه در مرحله پیش پردازش هرجا که نام ثابت بکار رفته باشد با مقدار آن جایگزین میکند. بنابراین متغیری تعریف نمیشود و مانند آن است که خود ما مقدار آن ثابت را در برنامه نوشته باشیم. البته define# استفاده های دیگری نیز دارد.

    این دستور را هر کجای برنامه در یک سطر منفرد میتوانید قرار دهید(و چون یک دستور پیش پردازنده است نباید ; در آخر آن بگذارید)، البته معمولاً آنرا قبل از تابع main و بعد از دستورات include# قرار میدهند.

    چون استفاده از متغیرهای const فضایی از حافظه اصلی را برای متغیر میگیرد، اما استفاده از define# فضایی اشغال نمیکند، هرجا که فضای اشغال شده از حافظه اصلی توسط برنامه برای شما مهم است، از define# استفاده کنید. اما در کل استفاده از متغیرهای const بهتر است.

    مثالی از شکل این دستور: 23 define NUM# که ثابت NUM را با مقدار 23 تعریف میکند.

    مثالی از کاربرد این دستور:


    کد:
    #include <iostream>
    using namespace std;

    #define NUM 23

    int main()
    {

    cout << "NUM is a constant: " << NUM << endl;

    return 0;
    }

    توجه: معمولاً نام ثابت ها را با حروف بزرگ مشخص میکنند.

    دستور undef#
    این دستور یک ثابت تعریف شده با define# را به حالت تعریف نشده درمی آورد. مثلاً پس از دستور undef NUM# ثابت NUM تعریف نشده خواهد بود، یعنی اگر از این نام بدون تعریف مجدد آن در برنامه استفاده کنید، خطایی دریافت میکنید.

    برای مقدار دهی مجدد یک ثابت تعریف شده با define# میتوانید آنرا تعریف نشده کنید و دوباره با مقدار مورد نظر تعریف کنید، البته تبدیل به تعریف نشده اجباری نیست و فقط میتوانید دوباره تعریف کنید، اما این کار بهتر است چون ممکن است بعضی کامپایلرها خطایی مبنی بر تعریف مجدد تولید کنند(در VS فقط یک اخطار(warning) تولید خواهد شد که جنبه آگاهی دارد و شما میتوانید برنامه را بسازید، اما خطاها(errors) اجازه ساخت دوباره برنامه را نمیدهند).

    هرجا بخواهید از تعریف نشده بودن یک ثابت اطمینان حاصل کنید میتوانید از undef# استفاده کنید، بنابراین برای استفاده از undef# لازم نیست حتماً ثابت را قبلاً با define# تعریف کرده باشید.
    </b>

  4. #4
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    <b>
    دستورات کنترل برنامه
    وقتی دستورات برنامه را به همان ترتیبی که زیر هم مینویسیم اجرا میشوند، این ساختار ترتیبی برنامه است، یعنی هر دستور به ترتیبی که ظاهر میشود اجرا میشود. اما دو ساختار دیگر نیز کمک کننده هستند: ساختار انتخاب و تکرار.

    دستور انتخاب if
    با دستور if میتوان درستی یک عبارت را بررسی کرد و براساس آن عملی را انجام داد. مثلاً ممکن است در برنامه بخواهیم یک عدد را بعنوان ID(شناسه) شخصی بگیریم و بعد اگر مقدار خاصی بود عملی را انجام دهیم. در اینجا از دستور if میتوان استفاده کرد. ابتدا بهتر است یک برنامه نمونه که از دستور if استفاده میکند را ببینید. این برنامه عددی را بعنوان ID شخص میگیرد و اگر مقدار آن 1 بود به کاربر بعنوان Admin خوش آمد میگوید.


    کد:
    #include <iostream>
    using namespace std;

    int main()
    {
    int ID = 0;

    cout << "Hello, please enter your ID : ";
    cin >> ID;

    if (ID == 1)
    cout << "Welcome Admin" << endl;

    return 0;
    }

    پس از اجرای این برنامه باید عددی را بعنوان ID وارد کنید، اگر ID وارد شده 1 باشد، برنامه پیغام خوش آمد گویی را میدهد. دستور if در این برنامه برای انتخاب این است که آیا پیغام خوش آمد گویی چاپ شود یا نه و این را براساس اینکه ID یک هست یا نه انتخاب میکند(یعنی 'مساوی بودن ID با 1' شرط انتخاب است). شکل دستور if اینگونه است:


    کد:
    if ( condition )
    statement;

    condition شرط انتخاب است و دستور هم فقط یک دستور تنهاست.

    یک نکته را اینجا بگویم: استفاده از معادل های فارسی ممکن است خوب باشد، اما اگر شما با زبان انگلیسی آشنایی لازم را پیدا نکنید، نمیتوانید براحتی از منابع مرتبط با ++C موجود در اینترنت یا هرجای دیگر که به زبان انگلیسی هستند استفاده کنید(مثلاً از MSDN). حتی خود برنامه نویسی هم با دانستن بهتر انگلیسی راحت تر میشود. یعنی میتوان گفت اگر واقعاً قصد کار در زمینه برنامه نویسی یا هرچیز دیگری مرتبط با کامپیوتر را دارید، باید انگلیسی تان را قوی کنید، چرا که بیشتر منابع بروز انگلیسی هستند. در عین حال دیگر نیازی به گرفتن کتاب هم نخواهید داشت و از هزاران کتاب در زمینه های مختلف کامپیوتری که بصورت ebook در اینترنت موجودند میتوانید استفاده کنید یا از آموزشهایی که در سایتها موجودند و... بهره برید . یک نکته دیگر هم تعامل با کاربران موجود در اینترنت است که واقعاً کمک کننده است. مثلاً خیلی از سایت ها مثل همین جا یک انجمن(forum) برای برنامه نویسی دارند و کاربران در آنها با انگلیسی به بحث در مورد مباحث مختلف مشغولند. شما هم با کمی انگلیسی میتوانید به این جمع ها وارد شوید و مثلاً سؤالاتی بپرسید ، از اطلاعات دیگران استفاده کنید و پاسخ آنها را بدهید.
    اما یادگیری انگلیسی برای کامپیوتر آسان و مفرح است! البته با این روش: ابتدا مقدمات قواعد دستور زبان انگلیسی را بلد باشید(مثل ساختار جملات، افعال و...) یعنی در همان حدی که در دبیرستان یاد میگیرید. حالا براحتی میتوانید متون را درک کنید. فقط میماند 'کلمات جدید'، از این به بعد هرجا کلمه جدیدی را در کامپیوتر مشاهده کردید فوراً معنی آنرا یافته و بخاطر بسپارید. استفاده از برنامه Babylon را توصیه میکنم که در اصل مجموعه ای از دیکشنری هاست و براحتی معانی و مترادف ها را در اختیارتان میگذارد و با یک کلیک روی کلمه ای که نمیدانید معنی را برای شما نمایش میدهد. البته ممکن است برخی از دیکشنری ها را نداشته باشید که باید از اینترنت یا جای دیگر بگیرید و به Babylon اضافه کنید. دیکشنری های Oxford هم برای Babylon وجود دارند که توصیه میشود به آن اضافه کنید.


    خوب دوباره برگردیم به برنامه نویسی خودمان!

    با ساختار دستور if آشنا شدید، در برنامه نمونه ای که مشاهده کردید، شرط ما ID == 1 بود. عملگر == با = ارتباطی ندارد. عملگر = برای انتساب است، اما == برای تست برابر بودن است. این گونه عملگرها مقدار منطقی true یا false برمیگردانند. متغیرهای bool هم که قبلاً معرفی شدند برای نگهداری مقادیر منطقی(true یا false) هستند. بنابراین از متغیرهای bool هم میتوان در شرط ها استفاده کرد.

    در دستور if ما فقط یک دستور را مشخص کردیم تا در صورت درستی شرط اجرا شود اما برای داشتن چندین دستور باید با آکولاد باز و بسته دستورات را محصور کنیم. مثلاً دستور if زیر در صورت برقراری شرط، دو دستور cout را اجرا میکند:


    کد:
    if (ID == 1)
    {
    cout << "Welcome Admin" << endl;
    cout << "Learn C++ as soon as possible!" << endl;
    }

    حتی اگر فقط یک دستور هم داشته باشید میتوانید از آکولادها استفاده کنید.

    عملگرهای رابطه ای(Relational Operators)
    این عملگرها چون true یا false را برمیگردانند، نتیجه شان میتواند بعنوان عاملی در عبارات منطقی استفاده شود.

    == : برابری ، =! : نابرابری ، > : کوچکتر ، < : بزرگتر
    => : کوچکتر یا مساوی ، =< : بزرگتر یا مساوی

    برای عملگر نابرابری، مثلاً (x != 1) یعنی x برابر نباشد با یک.

    مراقب باشید بین اجزای عملگرهای چند قسمتی فاصله نیندازید، مثلاً در =< بین = و < اگر فاصله بیفتد دیگر یک عملگر بعنوان بزرگتر مساوی نخواهید داشت بلکه دو عملگر انتساب و بزرگتر نوشته اید و چون به شکل مناسبی استفاده نشده اند خطای زمان کامپایل تولید میکنند.

    توجه: وقتی دارید یک شرط برابری مینویسید ممکن است اشتباهاً = را بجای == بکار برید. این اشتباه ممکن است تولید خطا نکند، چراکه عملگر = مقداری را که به متغیر سمت چپ آن نسبت میدهد، بعنوان نتیجه برمیگرداند و کامپایلر از این مقدار با یک تبدیل بجای یک مقدار منطقی استفاده میکند. بنابراین شرطی مانند ID == 1 اگر ID = 1 نوشته شود، همیشه درست خواهد بود! چراکه ابتدا مقدار 1 به ID نسبت داده میشود و سپس عملگر = همان مقدار 1 را برمیگرداند و چون کامپایلر یک مقدار bool میخواهد، مقدار int برگشتی را به bool تبدیل میکند(چون غیر صفر است true در نظرگرفته میشود) و چون همیشه 1 هست، همیشه true خواهد بود و مثلاً ID = 0 همیشه false خواهد بود.
    پس ما در اینجا دو ضرر کردیم! یکی اشتباه شدن شرط و دیگری تغییر ناخواسته مقدار متغیر. خطایی هم که رخ نداده، پس برنامه اجرا میشود اما با نتایج نادرست. بنابراین در اشکال زدایی برنامه هایتان به این مورد توجه داشته باشید.

    عملگرهای منطقی(Logical Operators)
    مثلاً اگر در یک شرط بخواهید بدانید آیا x>1 و y<2 هست (یعنی دو شرط را با هم and کنید) از عملگر && استفاده کنید: (x>1 && y<2)، این عملگر روی دومقدار منطقی(> و < مقادیر منطقی برمیگردانند) عمل and را انجام داده و حاصل که یک مقدار منطقی است را برمیگرداند.

    && : AND (اگر هردو عملوند true باشند true وگرنه false برمیگرداند)
    || : OR (اگر هر دو عملوند false باشد false وگرنه true برمیگرداند)
    ! : NOT (نقیض عملگر خود را برمیگرداند)

    برای OR، دوخط عمودی را با دوبار زدن کلیدهای Shift و \ تایپ کنید.

    برای NOT، مثلاً در (x!) عملگر ! نقیض x را برمیگرداند(x یک متغیر bool است)، پس اگر true باشد false برمیگرداند، یا مثلاً در ((x == 6)!) نقیض برابری x با 6 را برمیگرداند، پس مانند شرط x مساوی با 6 نباشد هست (x != 6).

    مثال: شرط ( (y != x) || (x <= 3) ) میگوید که y با x برابر نباشد یا x کوچکتر مساوی 3 باشد.

    میبینید که پرانتزها چقدر به رفع ابهام و درک سریع شرط ها کمک میکنند و اینکه خود پرانتز هم بعنوان یک عملگر مقداری را بر میگرداند.
    </b>

  5. #5
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    <b>
    ساختار انتخاب if-else
    با دستور if توانستیم تعیین کنیم که با درستی یک شرط کاری انجام شود، اما با اضافه کردن قسمت else میتوانیم تعیین کنیم که در صورت نادرستی آن شرط کار دیگری انجام شود. در قطعه کد قبل بعد از گرفتن ID در صورتی که یک مقدار خاص بود پیغامی چاپ میکردیم، اما حالا میخواهیم در صورتی که مقدار مورد نظر نبود پیغام دیگری چاپ کنیم، این کار را با اضافه کردن قسمت else به if انجام میدهیم:


    کد:
    if (ID == 1)
    {
    cout << "Welcome Admin" << endl;
    cout << "Learn C++ as soon as possible!" << endl;
    }
    else
    cout << "Welcome User" << endl;

    اگر بیش از یک دستور در قسمت else دارید در آکولادها محصور کنید.

    نکته: هر قسمت else به اولین if قبل از آن مربوط خواهد شد و از ابهام جلوگیری میکند، اما در چنین مواقعی استفاده از پرانتزها خوانایی کد را بالا میبرد.

    نکته: هر دستور if-else بدون توجه به اینکه چند خط باشد در کل یک دستور حساب میشود، بنابراین وقتی دو دستور if-else تودرتو دارید اگر if-else اول هیچ دستوری جز if-else دوم نداشته باشد نیازی به استفاده از آکولادها نیست.

    مثالی برای نکات قبل:


    کد:
    #include <iostream>
    using namespace std;

    int main()
    {
    bool x = true,
    y = false;

    if (x)
    if (y)
    cout << "x & y";
    else
    cout << "x";
    else if (y)
    cout << "y";
    else
    cout << "no one";

    return 0;
    }

    برای تحلیل راحت تر دستورات if-else، به x و y مقادیر اولیه متفاوتی بدهید و خروجی را مشاهده کنید.

    یک نحوه رایج از نوشتن دستور if-else را در زیر میبینید (در این if-else ها بدلیل عدم اهمیت، قسمت شرط و دستورها آورده نشده):


    کد:
    if ()
    else if ()
    else if ()
    else

    این نحوه نوشتن if-else ها (که به ساختار else if مشهور است) چیز جدیدی نیست، فقط if-else های تودرتو هستند که پشت سرهم نوشته شده اند (یعنی else if یک if است که در یک else قرار گرفته). اما رایج است چون برای مواقعی استفاده میشود که چندین حالت متمایز ازهم برای یک موضوع وجود دارد، مثلاً فرض کنید نمره یک دانشجو را گرفته اید و حالا میخواهید براساس بازه نمرات به او اعلام کنید که وضعیت نمره او چگونه است (مثلاً A یا B و...). چون در اینجا هر بازه از دیگری جداست، میتوانید از else if استفاده کنید. البته از چندین if پشت سرهم نیز میتوان استفاده کرد، اما وجود else ها هم خوانایی کد را بالا میبرد (چون نشان میدهد که هر حالت از دیگری جداست)، هم سرعت برنامه را، چون در هنگام اجرای برنامه وقتی دستورات if متوالی داشته باشیم تمام دستورات if اجرا میشوند (یعنی شرطشان چک میشود، اگرچه فقط دستورات یکی از آنها اجرا شود) ولی وقتی else ها را اضافه کنیم، وقتی یک قسمت درست تشخیص داده شود مابقی دستورات if اجرا نمیشوند و هرچه if ها زیادتر باشند بهبود سرعت برنامه محسوس تر خواهد بود. البته وقتی تعداد حالات زیاد باشند اگر امکان داشته باشد استفاده از دستور switch بهتر است (این دستور بعداً توضیح داده میشود).

    استفاده از عملگر :? بجای دستور if-else
    عملگر سه تایی :? دقیقاً کار یک if-else ساده را انجام میدهد و برای زمانی خوب است که یک شرط ساده داریم (یعنی if و else هرکدام فقط یک دستور دارند) و بجای if-else از آن استفاده میکنیم تا تعداد خطوط برنامه کاهش یابد و خواندن آن سریعتر شود.
    شکل کلی استفاده از عملگر :? بدین صورت است:

    دستور نادرستی : دستور درستی ? شرط

    یک مثال برای استفاده از این عملگر (x و y اعداد صحیح هستند و بعلت تقدم عملگرها، استفاده از پرانتزها لازم است):

    ;(cout << (x>y ? x : y

    در این مثال ابتدا شرط x>y چک میشود، اگر صحیح بود حاصل عملگر :? میشود x وگرنه میشود y. یعنی ابتدا شرط قبل از ? چک میشود اگر(if) درست بود عبارت بعد از ? اجرا میشود (اگر متغیر باشد مقدارش برگردانده میشود) وگرنه(else) عبارت بعد از : اجرا میشود. در نهایت دستور cout مقداری که توسط :? برگردانده میشود را چاپ میکند. پس با استفاده از این دستور میتوان براساس یک شرط(درستی یا نادرستی) دستوری را اجرا کرد یا مقداری را برگرداند. مثلاً همین مثال cout قبل را میتوان با استفاده از قابلیت اجرای دستور عملگر :? چنین نوشت:

    ;x>y ? cout << x : cout << y

    دستور انتخاب switch
    این دستور زمانی مناسب است که چندین انتخاب برای یک موضوع داشته باشیم (مثلاً بیش از 4 تا)، در اینصورت استفاده از دستور switch کد را خواناتر از موقعی میکند که if-else استفاده کنیم، همچنین تغییر آنهم راحت تر خواهد بود. در اصل switch برای انتخاب یک یا چند حالت از بین حالات موجود است و برای این منظور مناسبتر از if-else است. برای مثالی از این دستور، یک منو به کاربر نشان میدهیم سپس بر اساس انتخاب او پیغامی چاپ میکنیم:


    کد:
    #include <iostream>
    using namespace std;

    int main()
    {
    int choice;

    cout << "===< Menu >===\n";
    cout << "1. choice 1\n";
    cout << "2. choice 2\n";
    cout << "3. choice 3\n";

    cout << "\n\n Enter a choice number : ";
    cin >> choice;

    switch(choice)
    {
    case 1:
    cout << "You've chosen choice one.\n";
    break;

    case 2:
    cout << "You've chosen choice two.\n";
    break;

    case 3:
    cout << "You've chosen choice three.\n";
    break;

    default:
    cout << "You should enter 1 or 2 or 3.\n";
    }

    return 0;
    }

    در این مثال میخواهیم براساس مقدار choice انتخابی انجام دهیم، بنابراین بعد از switch در پرانتزهای جلوی آن choice را آورده ایم. سپس پس از آن بدنه switch در آکولادها محصور میشود و درون بدنه آن انتخاب های مختلف برای choice را می آوریم. برای هر انتخاب یک case مینویسیم و پس از آن مقدار آن انتخاب را، سپس : و پس از آن دستوراتی که میخواهیم برای آن انتخاب انجام شوند را مینویسیم پایان دستورات هم با break مشخص میشود، همینطور برای انتخاب های دیگرهم case های جداگانه ای می آوریم، در آخر یک قسمت default وجود دارد که اختیاری است (یعنی میتوانید این قسمت را حذف کنید) و اگر هیچ کدام از case ها انتخاب نشوند default انتخاب میشود. مثلاً در این مثال اگر کاربر هرچیزی غیر از 1 و 2 و 3 را وارد کند default انتخاب میشود.

    نکته: دستورات هر case اگر بیش از یکی هم باشند نیازی به استفاده از آکولاد برای محصور کردن آنها نیست و break پایان آنها را نشان میدهد (البته گذاشتن آکولادها اختیاری است). در آخر دستورات قسمت default نیازی به break نیست چون پایان آن با { همراه است.

    نکته: متغیری که روی مقادیر آن انتخاب انجام میدهیم (که در پرانتزهای جلوی switch می آید) باید صحیح(int) باشد یا مستقیماً به int تبدیل شود (مثل char که کد اسکی آن استفاده میشود، اما مثلاً از float نمیتوان استفاده کرد) .

    برای نکات قبل، در مثالی دیگر میخواهیم یک نمره از کاربر بگیریم، سپس براساس آن پیغامی به او نشان دهیم (نمراتA و B و C هستند):


    کد:
    #include <iostream>
    using namespace std;

    int main()
    {
    char mark;

    cout << "Enter a mark : ";
    cin >> mark;

    switch(mark)
    {
    case 'A':
    case 'a':
    cout << "Best mark!\n";
    break;

    case 'B':
    case 'b':
    cout << "Good mark.\n";
    break;

    case 'C':
    case 'c':
    cout << "Bad mark!\n";
    break;

    default:
    cout << "You should enter A or B or C for the mark.\n";
    }

    return 0;
    }

    این مثال هم استفاده از نوع char را نشان میدهد و هم OR کردن انتخاب ها را، یعنی مثلاً در صورتی که کاربر a یا A وارد کند برنامه یک پیغام را نشان میدهد و اگر c یا C را وارد کند پیغام دیگری. اینکه دو case را برای a و A پشت سرهم آورده ایم یعنی که OR کرده ایم. چراکه هر وقت برنامه یکی از case ها را انتخاب میکند تا رسیدن به یک break اجرای دستورات را ادامه میدهد.

    توجه مهم: فراموشی در قراردادن break در آخر دستورات یک case منجر به اجرای دستورات سایر case ها تا رسیدن به یک break میشود.

    توصیه: با گذاشتن break در انتهای default، اگر بعداً case دیگری بعد از default اضافه شود اشتباهی در اثر فراموشی قراردادن case ایجاد نمیشود (اگرچه بهتر است default همیشه آخر آورده شود).

    محدودیت های switch
    انتخاب برروی مقادیر متغیری انجام میشود که نوع آن باید صحیح باشد.
    این انتخاب مانند چندین if-else است که شرط آنها یک تساوی است، بنابراین فقط مقادیر گسسته را میتوان چک کرد، مثلاً برای نمرات میتوان در یک case بیست بودن نمره را چک کرد، اما نمیتوان بین 18 و 20 بودن را چک کرد (یعنی قرارگرفتن در یک بازه را).
    در صورت برخورد با محدودیت های switch از if-else میتوان استفاده کرد.

    نکته: اگر در دستورات یک case متغیری را تعریف میکنید و مقدار اولیه هم میدهید، باید دستورات آن case را در آکولادها محصور کنید.
    </b>

  6. #6
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    <b>
    دستور تکرار for
    این دستور معمولاً زمانی بکار میرود که متغیر شمارنده داریم و شرط حلقه براساس مقدار آن است. ساختار کلی آن چنین است:


    کد:
    for ( counter-initializer; condition; counter-stepping )
    statement

    دستور for دو قسمت کلی دارد، یک قسمت آن دستوراتی است که در هر تکرار اجرا میشوند(در صورتی که بیش از یک دستور باشد در آکولاد محصور کنید)، قسمت دیگر برای کنترل تکرار حلقه است. این قسمت که در بین پرانتزها می آید خود از سه قسمت تشکیل شده که با ; از هم تفکیک میشوند، قسمت اول counter-initializer هست که برای مقداردهی اولیه متغیر شمارنده(و یا همراه با تعریف آن) استفاده میشود، قسمت بعد شرط حلقه است، قسمت آخر برای تغییر در مقدار شمارنده است. ابتدا یک مثال ساده از دستور for را ببینید:


    کد:
    #include <iostream>
    using namespace std;

    int main()
    {
    for (int i=0; i<10; i++)
    cout << i << endl;

    return 0;
    }

    این برنامه اعداد 0 تا 9 را چاپ میکند، که چاپ هرکدام از اعداد در یک تکرار for انجام میشود. قسمت اول دستور for متغیر شمارنده i را تعریف و مقدار اولیه میدهد (اگر i قبل از for تعریف شده بود نیازی به تعریف دوباره آن نبود و مقداردهی با دستور i=0 کافی بود). قسمت بعد مشخص میکند که تا وقتی i کمتر از 10 هست حلقه ادامه یابد و قسمت سوم بعد از هر تکرار حلقه به i یکی اضافه میکند. پس روند اجرای حلقه اینگونه است: ابتدا قبل از اولین تکرار، متغیر i تعریف میشود و مقدار اولیه 0 میگیرد (این عمل فقط همین یکبار انجام میشود). سپس کمتر بودن آن از 10 چک میشود و چون برقرار است اولین تکرار حلقه انجام میشود، در تکرارهای بعدی ابتدا به i یکی اضافه میشود سپس شرط حلقه چک میشود و اگر برقرار بود تکرار بعدی حلقه انجام میشود.

    میتوان در بخش کنترل تکرار for چندین دستور در قسمت های مقداردهی و تغییر شمارنده داشت که باید هرکدام را با کاما(,) جداکرد. مثلاً اگر ما به دو متغیر شمارنده در حلقه نیاز داشته باشیم و آنها x و y باشند که قبل از حلقه تعریف شده اند، میتوان دستور for زیر را براساس x و y داشت (دستورات درون for بدلیل بی اهمیت بودن آورده نشده اند):


    (--for (x=0, y=2; x<10 && y<23; x+=2, y

    در قسمت اول x و y مقدار اولیه میگیرند، قسمت آخر مشخص میکند که بعد از هر تکرار دوتا به x اضافه و یکی از y کم شود، پس همانطور که میبینید میتوان دو(یا چند) دستور کامل را با کاما از هم جدا کرد و همه اجرا خواهند شد.

    هر سه قسمت از بخش کنترل تکرار for اختیاری هستند اما وجود دو کامای جدا کننده الزامی است. یعنی مثلاً اگر به قسمت مقداردهی اولیه از for احتیاج نداشته باشیم (متغیرها از قبل مقداردهی شده باشند) میتوان for را اینگونه نوشت:

    (++for (; i<10; i

    میتوان تمام قسمت ها را حذف کرد و نوشت ( ; ; )for که مانند یک (while(true عمل میکند.

    یادآوری: از دستورات continue و break در for هم میتوان استفاده کرد.

    توجه: از تعریف متغیر شمارنده در قسمت کنترل تکرار حلقه پرهیز کنید و در صورت لزوم فقط آنرا مقداردهی اولیه کنید. چرا که در یک کامپایلر ممکن است پس از تعریف شمارنده در قسمت کنترل تکرار بتوانید از آن در خارج حلقه هم استفاده کنید اما در دیگری نه، و اگر شما از متغیر شمارنده در خارج حلقه استفاده کنید در کامپایلری که این اجازه را نمیدهد با دستور خطا مواجه میشوید. این توصیه موجب رفع ابهام در استفاده از متغیرها هم میشود.
    </b>

  7. #7
    مدیر بازنشسته
    تاریخ عضویت
    2010/01/09
    محل سکونت
    *گیلان-املش*
    سن
    31
    نوشته ها
    5,954

    پیش فرض

    برنامه زیر این کار را انجام میدهد:


    کد:
    #include <iostream>
    #include <cstdlib> // system()
    #include <ctype.h> // isdigit(), isalpha()
    #include <string.h> // strlen()
    using namespace std;

    int main()
    {
    char str[11] = {0};

    cout << "Please enter a string with 10 characters : ";
    cin.getline(str,11);

    int num_count = 0; // number of numbers
    int let_count = 0; // number of letters

    char nums[12] = {0},
    lets[12] = {0};

    int i;
    for (i=0; i<strlen(str); i++) // scan each character in the string
    if (isdigit(str[i]))
    {
    nums[num_count] = str[i];
    num_count++;
    }
    else if (isalpha(str[i]))
    {
    lets[let_count] = str[i];
    let_count++;
    }

    cout << "Numeric characters in the string : " << nums << ", count of them : " << num_count << endl;
    cout << "Alphabetic characters in the string : " << lets << ", count of them : " << let_count << endl;

    system("pause");
    return 0;
    }

    خروجی


    توضیح
    رشته مورد نظر در str گرفته میشود، سپس تک تک کاراکترهای رشته چک میشود. تابع isdigit چک میکند که آیا یک کاراکتر عدد هست یا نه و isalpha چک میکند که آیا حرف (الفبایی) هست یا نه.

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •