سوالاتی در زمینه برنامه نویسی c , c++

shahabv

New Member
سلام
راستش تازه برنامه نویسی c و c++ رو شروع کردم و الآن از turbo c v2.01 استفاده میکنم و فعلا هم توی آموزش c هستم...
این سوالا برام پیش اومده:
1-به طور کلی return0 به چه منظوری توی آخر برنامه استفاده میشه؟
2-من مطلبی که در مورد exit0 و exit 1 جواب داده بودید رو خوندم که معمولا در مورد برنامه هایی که با موفقیت تموم میشه 0 میذارن و اونایی که خطا داره 1 میذارن
دستور exit در سی پلاس
حالا سوالم اینه که اولا برنامه فرق تموم شدن با Exit و Return رو میفهمه؟ دوما ERRORLEVEL که توی همین پست بهش اشاره کردید رو چطور توی برنامه استفاده میکنند؟یعنی فقط برای حالتی که Exit باشه میشه آدرس به این ERRORLEVEL داد؟
3-چه وقتی از int main استفاده میکنیم و چه وقتی از void main?
4-من یه برنامه حلقه بینهایت نوشتم که برنامه از حالت اجرا خارج نمیشه...توی سایتا نوشته بود با ctrl+c خارج میشه ولی نشد...مجبور میشه کلا turboc رو ببندم...راه حلی نداره؟
 

the_king

مدیرکل انجمن
سلام
راستش تازه برنامه نویسی c و c++ رو شروع کردم و الآن از turbo c v2.01 استفاده میکنم و فعلا هم توی آموزش c هستم...
این سوالا برام پیش اومده:
1-به طور کلی return0 به چه منظوری توی آخر برنامه استفاده میشه؟
2-من مطلبی که در مورد exit0 و exit 1 جواب داده بودید رو خوندم که معمولا در مورد برنامه هایی که با موفقیت تموم میشه 0 میذارن و اونایی که خطا داره 1 میذارن
دستور exit در سی پلاس
حالا سوالم اینه که اولا برنامه فرق تموم شدن با Exit و Return رو میفهمه؟ دوما ERRORLEVEL که توی همین پست بهش اشاره کردید رو چطور توی برنامه استفاده میکنند؟یعنی فقط برای حالتی که Exit باشه میشه آدرس به این ERRORLEVEL داد؟
3-چه وقتی از int main استفاده میکنیم و چه وقتی از void main?
4-من یه برنامه حلقه بینهایت نوشتم که برنامه از حالت اجرا خارج نمیشه...توی سایتا نوشته بود با ctrl+c خارج میشه ولی نشد...مجبور میشه کلا turboc رو ببندم...راه حلی نداره؟

return باعث خروج از تابع میشه، return 0 هم باعث خروج از تابع میشه و هم مقدار 0 رو بر می گردونه. چون main تابع اصلی برنامه است، خروج از main به معنای پایان یافتن اجرای برنامه است.
در زبان های ++C / C هر تابعی که در تعریف اش مقدار بازگشتی داره نیاز به دستور return و یک مقدار بازگشتی داره. ()int main هم یک تابع با مقدار بازگشتی است و
وجود اون return الزامی است، گو اینکه بعضی کامپایلر ها نسبت به وجود return حساسیت نشون نمی دهند. اما اینکه 0 برگردونده بشه یا هر عدد دیگری بستگی به تمایل برنامه نویس
و منطق کد اش داره.

exit باعث پایان یافتن اجرای برنامه میشه، در داخل تابع main شبیه return هست، اما return اگر داخل یک تابع بجز main نوشته بشه دیگه ربطی به پایان یافتن اجرای برنامه نداره.
return باعث خروج از تابع میشه و فقط در داخل main ئه که عملکرد خروج از برنامه رو داره. اما exit کاری به این نداره که در کدوم تابع اجرا میشه.
مزیت exit اینه که در هر جایی از کد، چه در main و چه در تابع دیگری باعث خروج از برنامه میشه. return 0 یا return EXIT_SUCCESS فرقی با (exit(0 یا (exit (EXIT_SUCCESS نداره.
EXIT_SUCCESS معادل عدد 0 ئه و اصولا برای خروج موفقیت آمیز از برنامه بکار میره.

ERRORLEVEL یک عبارت مخصوص فایل های Batch ئه که پسوند bat یا cmd دارند. ربطی به زبان C++/C یا هر زبان دیگری هم نداره. یک متغیر از پیش تعریف شده است و
آخرین برنامه ای که اجراش تموم شده مقدار بازگشتی اش در این متغیر قرار می گیره. فرقی نمی کنه که شما در برنامه C++/C تان به چه طریقی مقدار بازگشتی
رو تعیین می کنید، 0 ئه، مگر اینکه با return یا exit صریحا مقدار دیگری رو برگردونید.

کلا ()void main استاندارد نیست، بعضی از کامپایلر ها ازش پشتیبانی می کنند اما کلا باید ازش پرهیز بشه. void main با return 0 یا هر return همراه مقدار دیگری سازگار نیست،
چون void مقدار بازگشتی نداره. برنامه ای که با ()void main تعریف شده مقدار 0 بر می گردونه مگر اینکه با exit مقدار دیگری برگردونده بشه.



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

تمامی نرم افزار ها موقعی که اجرا شون تموم میشه این مقدار عددی رو بر می گردونند، این مورد از دوران MS-DOS به یادگار مونده. اگه بصورت مشخص اون مقدار خروجی مشخص نشه
عدد صفر بر گردونده خواهد شد. فرقی نمی کنه که اجرای برنامه چطور پایان پیدا می کنه، چه با return و چه exit و چه هر شیوه دیگری، به هر حال اون مقدار بازگشتی رو داره.

دو نوع اجرا داریم، یک اجرای تحت نظارت Debugger که ممکنه فشار یک ترکیب کلیدی در اجرای برنامه موثر باشه و یک اجرای بدون نظارت Debugger که فقط ترکیب های کلیدی خاصی
عمل می کنند که در کد برنامه صریحا بهشون اشاره بشه. Ctrl + C معمولا در دریافت های ورودی مثل scanf یا cin دریافت میشه، اما در سایر موارد نه.
شما لابد داخل حلقه تان کدی ندارید که نسبت به ترکیب کلیدی خاصی حساس باشه، بنابر این در هنگام اجرای بدون نظارت Debugger روی ترکیب کلیدی Ctrl + C حساسیتی نشون نمیده.

وقتی کلید ESC فشار داده بشه اجرای برنامه رو خاتمه میده :
کد:
#include <stdio.h>
#include <conio.h>

int main()
{
    char c;
    do {
    _asm {
         IN AL, 0x60;
         MOV c, AL }
    } while (c != 1);
    return 0;
}
 

shahabv

New Member
خیلی ممنون از پاسخ کاملتون سه تا سوال اولو خیلی خوب متوجه شدم... مورد آخری که پاسخ دادید رو کامل متوجه نشدم...تو این مثالی که براش زدید در داخل دستور do دستوراتی نوشتید که من متوجه نمیشم...و چرا از هدر conio.h استفاده کردید ... کدوم دستورتون مربوط به اون هدر میشه؟
دو تا سوال دیگه هم دارم:
یکی اینکه تابع geta() رو چه زمانی میشه استفاده کرد...من وقتی استفاده میکنم خطا میگیره...هدر خاصی میخواد به جز stdio.h یا قانون خاصی داره؟
دوم هم اینکه چرا وقتی از تابع clrscr() قبل از تعریف متغیر هام استفاده میکنم خطا میگیره و وقتی میبرمش بعد از تعریف متغیر هام درست میشه؟مگه فرقی هم توی منطقش داره؟
 

the_king

مدیرکل انجمن
خیلی ممنون از پاسخ کاملتون سه تا سوال اولو خیلی خوب متوجه شدم... مورد آخری که پاسخ دادید رو کامل متوجه نشدم...تو این مثالی که براش زدید در داخل دستور do دستوراتی نوشتید که من متوجه نمیشم...و چرا از هدر conio.h استفاده کردید ... کدوم دستورتون مربوط به اون هدر میشه؟
دو تا سوال دیگه هم دارم:
یکی اینکه تابع geta() رو چه زمانی میشه استفاده کرد...من وقتی استفاده میکنم خطا میگیره...هدر خاصی میخواد به جز stdio.h یا قانون خاصی داره؟
دوم هم اینکه چرا وقتی از تابع clrscr() قبل از تعریف متغیر هام استفاده میکنم خطا میگیره و وقتی میبرمش بعد از تعریف متغیر هام درست میشه؟مگه فرقی هم توی منطقش داره؟

طبق عادت conio.h رو include کردم وگرنه موردی که مربوط به conio.h باشه نداره، حذف اش هم بکنید اتفاق خاصی نمی افته.
با دو دستور زبان اسمبلی کد کلیدی که در صفحه کلید فشار داده شده رو در متغیر c کپی کردم. پورت 0x60 مربوط به صفحه کلید کامپیوتر ئه.
این شیوه بدون نیاز به تابع خاصی اجازه میده که بدون ایجاد کردن وقفه در اجرای برنامه و منتظر شدن برای فشار یک کلید از وضعیت صفحه کلید با خبر شویم.
تابع استانداردی به اسم ()geta نداریم.
اگه کاراکتر ; بعد از ()clrscr و بعد از تعریف متغیر هاتون رو فراموش نکرده باشید نباید فرقی بکنه که کدوم رو ابتدا بنویسید.
 

Mose96

New Member
سلام
خسته نبباشید عذر میخوام بابت این سوال
میخواستم بدونم تو برنامه نویسی c++ برای اینکه کدی بنویسیم تا با زدن کلید خروج یا اینتر یا هر کلید دیگه ای کنسول بسته بشه؟
 

the_king

مدیرکل انجمن
سلام
خسته نبباشید عذر میخوام بابت این سوال
میخواستم بدونم تو برنامه نویسی c++ برای اینکه کدی بنویسیم تا با زدن کلید خروج یا اینتر یا هر کلید دیگه ای کنسول بسته بشه؟
با توجه به کامپایلر و سیستم عامل ممکنه لازم باشه توابع متفاوتی رو بکار ببرید.

C++:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

const int ESCAPE=27;
const int RETURN=13;

bool get(string & s);

int main()
{
    string str;

    get(str);

    cout << str << endl;

    cout << "\nhit enter to quit...";
    cin.get();
    return 0;
}

bool get(string & s)
{
    char c;
    s="";

    while (true)
    {
        c=getch();

        if (c==ESCAPE)
        {
            s="(input aborted)";
            cout << endl;
            return false;
        }

        if (c==RETURN)
        {
            cout << endl;
            return true;
        }

        cout.put(c) << flush;
        s+=c;
    }
}
رجوع شود به :
 

جدیدترین ارسال ها

بالا