• توضیحات زبان C عملکرد Scanf C: توضیحات. با همه این نوع متغیرها چه باید کرد

    کتابخانه استاندارد C/C++ شامل تعدادی عملکرد برای خواندن و نوشتن روی کنسول (صفحه کلید و مانیتور) است. این توابع داده ها را به عنوان یک جریان ساده از کاراکترها می خوانند و می نویسند.

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

    تابع خروجی استاندارد printf()

    تابع printf() یک تابع خروجی استاندارد است. با استفاده از این تابع می توانید رشته ای از کاراکترها، یک عدد، مقدار یک متغیر را روی صفحه نمایشگر نمایش دهید.

    تابع printf() یک نمونه اولیه در stdio.h دارد
    int printf(char *control string, ...);

    در صورت موفقیت آمیز بودن، printf() تعداد کاراکترهای چاپ شده را برمی گرداند.

    خط کنترل شامل دو نوع اطلاعات است: کاراکترهایی که مستقیماً روی صفحه چاپ می شوند و مشخص کننده های قالب که نحوه چاپ آرگومان ها را مشخص می کنند.

    تابع printf() یک تابع خروجی فرمت شده است. این بدان معناست که در پارامترهای تابع لازم است فرمت داده هایی که خروجی می شود مشخص شود. فرمت داده ها توسط مشخص کننده های قالب مشخص می شود. مشخص کننده قالب با یک کاراکتر % و سپس یک کد قالب شروع می شود.

    مشخص کننده های قالب:

    ٪با سمبل
    %d عدد صحیح اعشاری
    ٪من عدد صحیح اعشاری
    %e عدد اعشاری به شکل x.xx e+xx
    %E عدد اعشاری به شکل x.xx E+xx
    % f
    %F عدد ممیز شناور اعشاری xx.xxxx
    % g %f یا %e، هر کدام کوتاهتر باشد
    %G %F یا %E، هر کدام کوتاهتر باشد
    %o عدد اکتال
    %s رشته کاراکتر
    %u عدد اعشاری بدون علامت
    ٪ایکس عدد هگزادسیمال
    ٪ایکس عدد هگزادسیمال
    %% سمبل ٪
    ٪پ اشاره گر
    %n اشاره گر

    علاوه بر این، اصلاح کننده های l و h را می توان برای دستورات فرمت اعمال کرد.

    %ld چاپ طولانی int
    %hu تمبر کوتاه بدون امضا
    %Lf مهر بلند دوتایی

    در مشخص کننده فرمت، پس از نماد % می توان دقت (تعداد ارقام بعد از نقطه اعشار) را مشخص کرد. دقت به صورت زیر تنظیم می شود: %n<код формата>. جایی که n تعداد ارقام بعد از نقطه اعشار و<код формата>- یکی از کدهای داده شده در بالا.

    برای مثال، اگر یک متغیر x=10.3563 از نوع float داشته باشیم و بخواهیم مقدار آن را با دقت 3 رقم اعشار نمایش دهیم، باید بنویسیم:

    printf("متغیر x = %.3f",x);

    نتیجه:
    متغیر x = 10.356

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

    برای مثال، اگر بنویسید:

    printf("%5d",20);

    سپس نتیجه به شرح زیر خواهد بود:
    20

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

    مثلا:

    printf("%05d",20);

    نتیجه:
    00020

    علاوه بر مشخص‌کننده‌های قالب داده، خط کنترل ممکن است دارای کاراکترهای کنترلی باشد:

    \b BS، پایین
    \f صفحه جدید، تغییر صفحه
    \n خط جدید، خوراک خط
    \r برگشت محموله
    \ t جدول بندی افقی
    \ v زبانه عمودی
    \" دو نقل قول
    \" آپستروف
    \\ بک اسلش
    \0 کاراکتر پوچ، بایت پوچ
    علامت
    \ N ثابت هشتی
    \xN ثابت هگزادسیمال
    \? علامت سوال

    اغلب از کاراکتر \n استفاده می کنید. با این کاراکتر کنترلی می توانید به یک خط جدید بروید. به برنامه های نمونه نگاه کنید و همه چیز را متوجه خواهید شد.

    نمونه هایی از برنامه ها

    /* مثال 1 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    int a,b,c; // اعلام متغیرهای a,b,c
    a=5;
    b=6;
    c=9;
    printf("a=%d، b=%d، c=%d",a,b,c);
    }

    نتیجه برنامه:
    a=5، b=6، c=9

    /* مثال 2 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    شناور x,y,z;

    X=10.5;
    y=130.67;
    z=54;

    Printf("مختصات شیء: x:%.2f، y:%.2f، z:%.2f، x، y، z);
    }

    نتیجه برنامه:
    مختصات شیء: x:10.50، y:130.67، z:54.00

    /* مثال 3 */
    #عبارتند از

    void main()
    {
    int x;

    X=5;
    printf("x=%d"، x*2);
    }

    نتیجه برنامه:
    x=10

    /* مثال 4 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    printf("\"متن در نقل قول\"");
    printf("\nمیزان اکسیژن: 100%٪");
    }

    نتیجه برنامه:
    "متن در نقل قول"
    میزان اکسیژن: 100%

    /* مثال 5 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    int a;

    A=11; // 11 در اعشار برابر با b در هگزادسیمال است
    printf("a-dec=%d, a-hex=%X",a,a);
    }

    نتیجه برنامه:
    a-dec=11، a-hex=b

    /* مثال 6 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    char ch1,ch2,ch3;

    Ch1="A";
    ch2="B";
    ch3="C";

    Printf("%c%c%c",ch1,ch2,ch3);
    }

    نتیجه برنامه:
    ABC

    /* مثال 7 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    char *str="رشته من.";

    Printf("این %s است"،str);
    }

    نتیجه برنامه:
    این خط من است.

    /* مثال 8 */
    #عبارتند از

    خالی اصلی (باطل)
    {
    printf("سلام!\n"); // پس از چاپ، انتقال به یک خط جدید وجود دارد - \n
    printf ("اسم من پاول است."); // این در یک خط جدید چاپ خواهد شد
    }

    نتیجه برنامه:
    سلام!
    اسم من پاول است.

    تابع ورودی استاندارد scanf()

    تابع scanf() یک تابع ورودی فرمت شده است. با کمک آن می توانید داده ها را از یک دستگاه ورودی استاندارد (صفحه کلید) وارد کنید. داده های ورودی می توانند اعداد صحیح، اعداد ممیز شناور، کاراکترها، رشته ها و اشاره گرها باشند.

    تابع scanf() دارای نمونه اولیه زیر در stdio.h است:
    int scanf(char *control string);

    تابع تعداد متغیرهایی را که یک مقدار به آنها اختصاص داده شده است برمی گرداند.

    رشته کنترل شامل سه نوع کاراکتر است: مشخص کننده های قالب، فاصله ها و سایر کاراکترها. مشخص کننده های قالب با کاراکتر % شروع می شوند.

    مشخص کننده های قالب:

    هنگام وارد کردن یک رشته با استفاده از تابع scanf() (مشخص کننده فرمت %s)، رشته قبل از اولین فاصله وارد می شود!! آن ها اگر رشته "Hello world!" با استفاده از تابع scanf()


    scanf("%s",str);

    سپس پس از وارد کردن رشته به دست آمده، که در آرایه str ذخیره می شود، از یک کلمه "Hello" تشکیل می شود. تابع قبل از فضای اول وارد یک رشته می شود! اگر می خواهید رشته هایی را با فاصله وارد کنید، از تابع استفاده کنید

    char *gets(char *buf);

    با تابع gets() می توانید رشته های کامل را وارد کنید. تابع gets() کاراکترها را از صفحه کلید می خواند تا زمانی که کاراکتر خط جدید (\n) ظاهر شود. وقتی اینتر را فشار می دهید، خود کاراکتر خط جدید ظاهر می شود. تابع یک اشاره گر را به buf برمی گرداند. buf - بافر (حافظه) برای رشته ورودی.

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

    #عبارتند از

    خالی اصلی (باطل)
    {
    بافر char; // آرایه (بافر) برای رشته ورودی

    دریافت (بافر)؛ // یک خط را وارد کنید و اینتر را فشار دهید
    printf("%s", buffer); // خروجی رشته وارد شده به صفحه نمایش
    }

    یک نکته مهم دیگر! برای وارد کردن داده با استفاده از تابع scanf() باید آدرس های متغیر را به عنوان پارامتر ارسال کند نه خود متغیرها. برای به دست آوردن آدرس یک متغیر، باید قبل از نام متغیر با علامت & (امپرسند) قرار دهید. علامت & به معنای گرفتن آدرس است.

    آدرس یعنی چی؟ سعی میکنم توضیح بدم در برنامه یک متغیر داریم. یک متغیر مقدار خود را در حافظه کامپیوتر ذخیره می کند. بنابراین این آدرسی است که از آن استفاده می کنیم و آدرسی در حافظه کامپیوتر است که مقدار متغیر در آن ذخیره می شود.

    بیایید به یک برنامه مثال نگاه کنیم که به ما نشان می دهد چگونه از &

    #عبارتند از

    خالی اصلی (باطل)
    {
    int x;

    Printf("متغیر x را وارد کنید:");
    scanf("%d"،&x);
    printf("متغیر x=%d",x);
    }

    حالا بیایید به خط کنترل تابع scanf() برگردیم. از نو:

    int scanf(char *control string);

    کاراکتر فاصله در رشته کنترل دستور می دهد یک یا چند فاصله در جریان ورودی رد شوند. علاوه بر فضا، یک برگه یا کاراکتر خط جدید قابل درک است. یک کاراکتر غیر تهی نشان می دهد که کاراکتر خوانده شده و کنار گذاشته شده است.

    جداکننده‌های بین دو عددی که وارد می‌کنید عبارتند از space، tab یا newline. * بعد از % و قبل از کد قالب (مشخص کننده فرمت) دستور می دهد که نوع داده خوانده شود، اما به آن مقدار اختصاص داده نمی شود.

    مثلا:

    scanf("%d%*c%d"،&i،&j);

    با وارد کردن 50+20، متغیر i روی 50، متغیر j روی 20 تنظیم می شود و کاراکتر + خوانده می شود و نادیده گرفته می شود.

    دستور format می تواند بزرگترین پهنای فیلد را برای خواندن مشخص کند.

    مثلا:

    scanf("%5s",str);

    نشان دهنده نیاز به خواندن 5 کاراکتر اول از جریان ورودی است. اگر 1234567890ABC را وارد کنید، آرایه str فقط شامل 12345 می شود، کاراکترهای باقی مانده نادیده گرفته می شوند. جداکننده ها: فاصله، برگه و خط جدید - هنگام وارد کردن نماد، مانند سایر کاراکترها با آنها رفتار می شود.

    اگر کاراکترهای دیگری در رشته کنترل وجود داشته باشد، برای شناسایی و رد شدن کاراکتر مربوطه در نظر گرفته شده است. اپراتور جریان کاراکتر 10plus20

    scanf("%dplus%d"،&x،&y);

    مقدار 10 را به متغیر x، مقدار 20 را به متغیر y اختصاص می‌دهد و از کاراکترهای بعلاوه به دلیل اینکه در رشته کنترل وجود دارند، صرفنظر می‌کند.

    یکی از ویژگی های قدرتمند تابع scanf() توانایی آن در تعیین یک اسکن ست است. مجموعه جستجو مجموعه ای از کاراکترها را تعریف می کند که کاراکترهای خوانده شده توسط تابع scanf() با آنها مقایسه می شوند. تابع scanf() تا زمانی که کاراکترها در مجموعه جستجو ظاهر شوند می خواند. به محض اینکه کاراکتر وارد شده در مجموعه جستجو یافت نشد، تابع scanf() به فرمت مشخص کننده بعدی منتقل می شود. مجموعه جستجو با لیستی از کاراکترهای محصور در پرانتز تعریف می شود. علامت % قبل از براکت باز قرار می گیرد. بیایید با یک مثال به این موضوع نگاه کنیم.

    #عبارتند از

    خالی اصلی (باطل)
    {
    char str1, str2;
    scanf("%%s", str1, str2);
    printf("\n%s\n%s",str1,str2);
    }
    بیایید مجموعه ای از کاراکترها را وارد کنیم:
    12345abcdefg456

    برنامه روی صفحه نمایش داده می شود:
    12345
    abcdefg456

    هنگام تعیین مجموعه جستجو، همچنین می توانید از کاراکتر خط فاصله برای تعیین فاصله و همچنین حداکثر عرض فیلد ورودی استفاده کنید.

    scanf("%10"، str1);

    همچنین می توانید کاراکترهایی را که در مجموعه جستجو گنجانده نشده اند تعریف کنید. اولین مورد از این کاراکترها با یک ^ جلوتر است. بسیاری از کاراکترها بین حروف کوچک و بزرگ تفاوت قائل می شوند.

    اجازه دهید یادآوری کنم که هنگام استفاده از تابع scanf() باید آدرس های متغیر را به عنوان پارامتر به آن ارسال کنید. کد بالا نوشته شده بود:

    char str; // آرایه 80 کاراکتری
    scanf("%s",str);

    توجه داشته باشید که str قبل از & نیست. این کار به این دلیل انجام می شود که str یک آرایه است و نام آرایه - str یک اشاره گر به اولین عنصر آرایه است. بنابراین نباید از علامت & استفاده شود. ما قبلاً آدرس را به تابع scanf() ارسال می کنیم. خوب، به زبان ساده، str آدرسی در حافظه کامپیوتر است که مقدار اولین عنصر آرایه در آن ذخیره می شود.

    نمونه هایی از برنامه ها

    مثال 1.
    این برنامه درخواست "چند ساله هستید؟:" را نمایش می دهد و منتظر ورود داده می شود. اگر مثلاً عدد 20 را وارد کنید، برنامه خط "شما 20 ساله هستید" را نمایش می دهد. هنگام فراخوانی تابع scanf() یک علامت & جلوی متغیر age قرار می دهیم، زیرا تابع scanf() به آدرس های متغیر نیاز دارد. تابع scanf() مقدار وارد شده را در آدرس مشخص شده می نویسد. در مورد ما، مقدار وارد شده 20 به آدرس متغیر سن نوشته می شود.

    /* مثال 1 */

    #عبارتند از

    خالی اصلی (باطل)
    {
    بین سن

    Printf("\nچند سالته؟:");
    scanf("%d"،&age);
    printf("شما %d سال دارید."، سن);
    }

    مثال 2.
    برنامه ماشین حساب. این ماشین حساب فقط می تواند اعداد را اضافه کند. وقتی 100+34 را وارد کنید، برنامه نتیجه را می دهد: 100+34=134.

    /* مثال 2 */

    #عبارتند از

    خالی اصلی (باطل)
    {
    int x, y;

    Printf("\nماشین حساب:");
    scanf("%d+%d"، &x، &y);
    printf("\n%d+%d=%d"، x، y، x+y);
    }

    مثال 3.
    این مثال نحوه تنظیم عرض فیلد خواندن را نشان می دهد. در مثال ما، عرض فیلد پنج کاراکتر است. اگر رشته ای با تعداد کاراکتر زیاد وارد کنید، تمام کاراکترهای بعد از 5 حذف می شوند. به فراخوانی تابع scanf() توجه کنید. علامت & قبل از نام آرایه نیست زیرا نام آرایه آدرس اولین عنصر آرایه است.

    /* مثال 3 */

    #عبارتند از

    خالی اصلی (باطل)
    {
    نام شخصیت؛

    Printf("\nنام کاربری خود را وارد کنید (حداکثر 5 کاراکتر):");
    scanf("%5s"، name);
    printf("\n%s را وارد کردید"، نام);
    }

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

    /* مثال 4 */

    #عبارتند از

    خالی اصلی (باطل)
    {
    char bal;

    Printf("امتیاز شما 2،3،4،5 است:");
    scanf("%"، &bal);
    printf("\nرتبه %c"، bal);
    }

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

    انواع برنامه ها

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

    بسته به نوع پروژه، فاکتورهای زیادی برای انتخاب زبان برنامه نویسی وجود دارد. در اینجا لیستی از مهمترین عوامل ذکر شده است:

    تالیف، تفسیر و تدوین JIT

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

    زبان های برنامه نویسی تفسیر شده توسط برنامه ای به نام مفسر خوانده می شوند و توسط همان برنامه اجرا می شوند. زبان های برنامه نویسی تفسیر شده می توانند بر روی سیستم عامل های مختلف مانند مفسر اجرا شوند و حتی زمان کامپایل طولانی ندارند. اما برنامه‌هایی که با استفاده از زبان‌های تفسیر شده نوشته می‌شوند، بسیار کندتر از برنامه‌های کامپایل شده مشابه اجرا می‌شوند.

    و در نهایت، به اصطلاح کامپایل on-the-fly (یا کامپایل JIT). چنین زبان هایی در زمان راه اندازی برنامه به سرعت کامپایل می شوند. برنامه هایی که به زبان های JIT نوشته شده اند، به عنوان یک قاعده، بهینه سازی نمی شوند، در نتیجه روند کامپایل را سرعت می بخشد و تعادل بین عملکرد و سازگاری بین پلتفرم را بازیابی می کند.

    سطوح برنامه نویسی بالا یا پایین

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

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

    سیستم های نوع داده زبان برنامه نویسی

    برای هر زبان برنامه نویسی، مشخصاتی وجود دارد که قوانین مختلفی را تعریف می کند که زبان های برنامه نویسی باید از آنها پیروی کنند. برخی از زبان ها انواع داده ندارند، بنابراین این مورد در مورد آنها صدق نمی کند. با این حال، اکثر زبان ها (از جمله C++) دارای انواع داده هستند، بنابراین این اطلاعات برای شما مفید خواهد بود.

    سیستم نوع داده قوی یا ضعیف

    یک سیستم ورودی ضعیف هیچ محدودیتی ایجاد نمی کند؛ برنامه نویس باید بر این موضوع نظارت داشته باشد. وقتی می‌گویم «سیستم داده ضعیف»، منظورم این است که زبانی با چنین سیستم داده‌ای، پخش‌های نوع داده موجود را به‌شدت تنظیم نمی‌کند. به عنوان مثال، اگر یک رشته یا نماد را به جای یک عدد به تابع ضرب بفرستید، زبان های برنامه نویسی با تایپ غیر دقیق، چنین کدی را اجرا می کنند، اگرچه نتیجه ضرب معنی خود را از دست می دهد، زیرا یک رشته نمی تواند در یک ضرب شود. عدد. علاوه بر این، نتیجه انجام این ضرب بی معنی غیرقابل پیش بینی خواهد بود. اگر زبان برنامه نویسی به شدت تایپ شده باشد، در مرحله کامپایل، مترجم یک خطا را گزارش می کند و روند ساخت پروژه را متوقف می کند. مثلا،

    // برنامه نمونه در C++ #include با استفاده از namespace std. int main())( char string = "مثال"؛ int number = 5؛ cout<< string * number << endl; // умножаем строку на число }

    در نتیجه، کامپایلر یک خطا را گزارش خواهد کرد:

    خطا: عملوندهای نامعتبر از انواع "char" و "int" به "operator*" باینری

    ما سعی خواهیم کرد همین کار را در یک زبان برنامه نویسی بدون تایپ - php انجام دهیم. لطفاً توجه داشته باشید که حتی هنگام اعلان متغیرها، نیازی به تعیین نوع داده ندارید.

    نتیجه اجرای این کد صفر خواهد بود. هیچ خطایی رخ نمی دهد، اگرچه به نظر می رسد که نمی توانید یک رشته را در یک عدد ضرب کنید. اما در PHP همه چیز امکان پذیر است. کامپایلر زبان PHP خطایی را گزارش نمی کند، اسکریپت کار می کند و حتی نتیجه را تولید می کند و اگر برنامه ما از 1000 خط کد تشکیل شده باشد، پیدا کردن این خطا برای ما دشوار خواهد بود. این یک مثال واضح از یک زبان برنامه نویسی با "سیستم نوع داده ضعیف" است، یعنی جلوگیری از چنین عملیات پوچ کاملاً بر دوش برنامه نویس است.

    نوع داده تعریف شده یا تعریف نشده

    این برای هر دو زبان کامپایل شده و ترجمه شده صدق می کند. بسیاری از زبان‌ها نیاز به تعریف صریح از نوع متغیرها دارند، بنابراین هیچ ابهامی وجود ندارد، کامپایلر و مفسر به وضوح می‌دانند چه کاری باید انجام دهند. برخی از زبان های برنامه نویسی نیازی به تعریف صریح از نوع متغیرها ندارند. نوع داده به طور خودکار بر اساس محتویات متغیر تعیین می شود.

    نوع داده ایستا یا پویا

    اگر زبان به صورت ایستا تایپ شده باشد، کامپایلر/مفسر یک بار قبل از فرآیند کامپایل/تفسیر تایپ را بررسی می کند. اگر نوع داده پویا باشد، انواع داده ها در زمان اجرا بررسی می شوند.

    سیستم نوع داده ایمن یا ناامن

    ممکن است شرایطی وجود داشته باشد که ممکن است منجر به نتایج یا خطاهای غیرمنتظره شود. یک زبان ایمن تا حد امکان محدودیت‌های زیادی را برای اطمینان از عدم بروز چنین موقعیت‌هایی ایجاد می‌کند. در حالی که یک زبان ناامن تمام مسئولیت را بر عهده برنامه نویس می گذارد.

    این عوامل می توانند یک یا چند زبان برنامه نویسی را مشخص کنند.

    پارادایم های برنامه نویسی پشتیبانی شده

    پارادایم های برنامه نویسی متدولوژی ها یا روش های برنامه نویسی هستند که یک زبان برنامه نویسی از آنها پشتیبانی می کند. در اینجا لیستی از پارادایم های اصلی آمده است:

    پارادایم اعلامی

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

    پارادایم عملکردی

    برنامه نویسی تابعی زیرمجموعه ای از برنامه نویسی اعلامی است که سعی در حل مسائل از نظر معادلات و توابع ریاضی دارد. برنامه نویسی تابعی، بر خلاف زبان های امری، متغیرها و اشیاء را به عنوان داده هایی که به اشتراک گذاشته نمی شوند، در نظر می گیرد.

    پارادایم تعمیم یافته

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

    پارادایم ضروری

    زبان‌های امری به برنامه‌نویسان اجازه می‌دهند تا فهرستی منظم از دستورالعمل‌های لازم برای تکمیل یک کار را به رایانه بدهند. زبان های برنامه نویسی امری در مقابل زبان های برنامه نویسی اعلانی قرار می گیرند.

    پارادایم ساختاری

    هدف زبان های برنامه نویسی ساختاری ارائه نوعی کد – یک ساختار سلسله مراتبی است. هنگامی که ساختار کد به وضوح قابل مشاهده است، ترتیب اجرای دستورات به طور مستقیم واضح می شود. چنین زبان هایی معمولاً از "پرش" از یک قسمت کد به قسمت دیگر جلوگیری می کنند، به عنوان مثال، عملگر goto که همه ما می شناسیم، که در زبان های C و C++ تعریف شده است.

    پارادایم رویه ای

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

    پارادایم شی گرا

    برنامه نویسی شی گرا (گاهی اوقات به اختصار OOP) زیرمجموعه ای از برنامه نویسی ساخت یافته است که برنامه ها را بر حسب "اشیاء" بیان می کند. این پارادایم امکان استفاده مجدد از کد را فراهم می کند و درک این رویکرد بسیار ساده است.

    استاندارد سازی

    آیا زبان ها استاندارد رسمی دارند؟ استانداردسازی برای اطمینان از درک بدون تعارض برنامه توسط کامپایلرها/مفسران مختلف بسیار مهم است. برخی از زبان ها توسط موسسه استاندارد ملی آمریکا (ANSI) استاندارد شده اند، برخی دیگر توسط سازمان بین المللی استاندارد (ISO) استاندارد شده اند. همه زبان های برنامه نویسی باید استاندارد باشند، در غیر این صورت هیچ توافقی در مورد صحیح و نادرست بودن نحو وجود نخواهد داشت.

    بیایید زبان برنامه نویسی C++ را مشخص کنیم

    اکنون که ویژگی های اصلی زبان های برنامه نویسی را بررسی کردیم، اجازه دهید مشخص کنیم که زبان برنامه نویسی C++ چه عواملی را برآورده می کند.

    C++ یک زبان برنامه نویسی استاندارد ISO است.

    برای مدتی، C++ استاندارد رسمی نداشت، با این حال، از سال 1998، C++ توسط کمیته ISO استاندارد شده است.

    زبان کامپایل شده C++

    C++ مستقیماً در کد ماشین کامپایل می شود و آن را به یکی از سریع ترین زبان های جهان تبدیل می کند.

    C++ یک زبان قوی تایپ شده است.

    C++ فرض می‌کند که برنامه‌نویس می‌داند چه کاری انجام می‌دهد، و تعداد باورنکردنی از امکانات را می‌دهد که فقط با تخیل محدود می‌شوند.

    C++ از انواع داده های ایستا و پویا پشتیبانی می کند.

    بنابراین، بررسی نوع داده را می توان در زمان کامپایل یا در زمان اجرا انجام داد. و این یک بار دیگر انعطاف پذیری C++ را ثابت می کند.

    C++ از بسیاری از پارادایم ها پشتیبانی می کند.

    C++ از پارادایم های برنامه نویسی رویه ای، عمومی و شی گرا و بسیاری از پارادایم های دیگر پشتیبانی می کند.

    C++ یک زبان برنامه نویسی قابل حمل است.

    C++ به عنوان یکی از پرکاربردترین زبان‌های دنیا و به‌عنوان یک زبان باز، دارای طیف گسترده‌ای از کامپایلرها است که بر روی پلتفرم‌های مختلف اجرا می‌شوند. کد کتابخانه استاندارد C++ روی بسیاری از پلتفرم ها اجرا می شود.

    C++ کاملاً با زبان C سازگار است

    در C++ می توانید از کتابخانه های C استفاده کنید و آنها به درستی کار خواهند کرد.

    این مقاله تابع scanf() را به طور کلی بدون ارجاع به استاندارد خاصی مورد بحث قرار می دهد، بنابراین داده های هر استاندارد C99، C11، C++11، C++14 در اینجا گنجانده شده است. ممکن است در برخی استانداردها عملکرد متفاوت از مطالب ارائه شده در مقاله باشد.

    تابع scanf C - توضیحات

    scanf() تابعی است که در فایل هدر stdio.h(C) و cstdio(C++) قرار دارد و به آن ورودی فرمت شده برنامه نیز گفته می شود. scanf کاراکترها را از ورودی استاندارد (stdin) می خواند و آنها را بر اساس فرمت تبدیل می کند، سپس آنها را روی متغیرهای مشخص شده می نویسد. فرمت به این معنی است که داده ها، پس از دریافت، به یک فرم خاص کاهش می یابد. بنابراین، تابع scanf C شرح داده شده است:

    scanf("%format"، &variable1[، &variable2،[…]])،

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

    برخی از برنامه نویسان توابعی مانند scanf() یا printf() را به دلیل تشابه با زبان های دیگر فراخوانی می کنند.

    Scanf به شما اجازه می دهد تا انواع زبان های اصلی را وارد کنید: char، int، float، string و غیره. در مورد متغیرهای نوع رشته، نیازی به نشان دادن علامت آدرس - "&" نیست، زیرا یک متغیر از نوع رشته یک آرایه است و نام آن آدرس اولین عنصر آرایه در حافظه رایانه است.

    قالب ورودی داده یا رشته کنترل

    بیایید با نگاهی به مثالی از استفاده از تابع scanf C از توضیحات شروع کنیم.

    #عبارتند از int main() (int x; while (scanf("%d"، &x) == 1) printf("%d\n"، x); بازگشت 0؛ //نیاز برای سیستم های لینوکس)

    فرمت ورودی از چهار پارامتر زیر تشکیل شده است: نوع %[*][width][modifiers]. در این مورد، علامت و نوع "%" پارامترهای مورد نیاز هستند. یعنی حداقل قالب به این صورت است: "%s"، "%d" و غیره.

    به طور کلی، کاراکترهایی که یک رشته قالب را تشکیل می دهند به دو دسته تقسیم می شوند:

    • مشخص کننده های قالب - هر چیزی که با نماد % شروع می شود.
    • کاراکترهای جداکننده یا فضای خالی - اینها فضا، تب (\t)، خط جدید (\n) هستند.
    • کاراکترهای غیر از فضای خالی

    عملکرد ممکن است ناامن باشد.

    به جای scanf() از scanf_s() استفاده کنید.

    (ارسال شده توسط ویژوال استودیو)

    تایپ، یا فرمت مشخص کننده ها، یا نویسه های تبدیل، یا نویسه های کنترل

    شرح scanf C باید حداقل شامل یک فرمت مشخص کننده باشد که در انتهای عباراتی که با علامت "%" شروع می شوند نشان داده می شود. به برنامه می‌گوید چه نوع داده‌ای را باید در هنگام ورودی، معمولاً از صفحه‌کلید، انتظار داشت. لیستی از تمام مشخص کننده های فرمت در جدول زیر آمده است.

    معنی

    برنامه منتظر می ماند تا یک کاراکتر وارد شود. متغیری که باید نوشته شود باید از نوع کاراکتر char باشد.

    برنامه انتظار دارد یک عدد اعشاری صحیح وارد شود. متغیر باید از نوع int باشد.

    برنامه انتظار دارد که یک عدد ممیز شناور به صورت نمایی باشد. متغیر باید از نوع float باشد.

    برنامه انتظار دارد که یک عدد ممیز شناور وارد شود. متغیر باید از نوع float باشد.

    7

    برنامه انتظار دارد که یک عدد ممیز شناور وارد شود. متغیر باید از نوع float باشد.

    برنامه انتظار دارد که یک عدد اکتال وارد شود. متغیر باید از نوع int باشد.

    برنامه انتظار دارد یک رشته وارد شود. رشته به مجموعه ای از هر کاراکتر تا اولین کاراکتر جداکننده در نظر گرفته می شود. متغیر باید از نوع رشته باشد.

    برنامه انتظار دارد یک عدد هگزادسیمال وارد شود. متغیر باید از نوع int باشد.

    متغیر انتظار ورودی اشاره گر را دارد. متغیر باید از نوع اشاره گر باشد.

    مقدار صحیحی را برای متغیری می نویسد که برابر با تعداد کاراکترهایی است که تاکنون توسط تابع scanf خوانده شده است.

    برنامه یک عدد صحیح بدون علامت را می خواند. نوع متغیر باید عدد صحیح بدون علامت باشد.

    برنامه انتظار دارد که یک عدد باینری وارد شود. متغیر باید از نوع int باشد.

    مجموعه ای از شخصیت های قابل اسکن. برنامه منتظر ورودی کاراکترها از یک استخر محدود مشخص شده بین scanf می ماند و تا زمانی که کاراکترهایی از مجموعه مشخص شده در جریان ورودی وجود داشته باشد کار خواهد کرد.

    کاراکترها در رشته قالب

    ستاره (*)

    ستاره (*) پرچمی است که نشان می دهد عملیات انتساب باید سرکوب شود. یک ستاره بلافاصله بعد از علامت "%" قرار می گیرد. مثلا،

    Scanf("%d%*c%d"، &x، &y); //کاراکتر بین دو عدد صحیح را نادیده بگیرید. scanf("%s%*d%s", str, str2); //عدد صحیح بین دو رشته را نادیده بگیرید.

    یعنی اگر خط "45-20" را در کنسول وارد کنید، برنامه موارد زیر را انجام می دهد:

    1. به متغیر "x" مقدار 45 اختصاص داده می شود.
    2. به متغیر "y" مقدار 20 اختصاص داده می شود.
    3. و علامت منفی (خط تیره) "-" به لطف "%*c" نادیده گرفته می شود.

    عرض (یا عرض میدان)

    این یک عدد صحیح بین علامت "%" و مشخص کننده فرمت است که حداکثر تعداد کاراکترهایی را برای خواندن در طول عملیات خواندن فعلی مشخص می کند.

    چند نکته مهم را باید در نظر داشت:

    1. scanf در صورت برخورد با یک کاراکتر جداکننده متوقف می شود، حتی اگر 20 کاراکتر را شمرده باشد.
    2. اگر ورودی شامل بیش از 20 کاراکتر باشد، تنها 20 کاراکتر اول در متغیر str نوشته می شود.

    اصلاح کننده های نوع (یا دقیق)

    اینها پرچم های خاصی هستند که نوع داده های مورد انتظار برای ورودی را تغییر می دهند. پرچم در سمت چپ مشخص کننده نوع مشخص شده است:

    • L یا l (L کوچک) هنگام استفاده از "l" با مشخص کننده های d، i، o، u، x، پرچم به برنامه می گوید که انتظار ورودی از نوع long int را داشته باشد. هنگام استفاده از "l" با مشخص کننده e یا f، پرچم به برنامه می گوید که باید انتظار داشته باشد که مقدار دو برابری وارد شود. استفاده از "L" به برنامه می گوید که مقداری از نوع long double مورد انتظار است. استفاده از "l" با مشخص کننده های "c" و "s" به برنامه می گوید که کاراکترهای دو بایتی از نوع wchar_t مورد انتظار هستند. به عنوان مثال، "%lc"، "%ls"، "%l".
    • h پرچمی است که نوع short را نشان می دهد.
    • hh - نشان می دهد که متغیر یک اشاره گر به مقداری از نوع علامت char یا char بدون علامت است. پرچم را می توان با مشخص کننده های d، i، o، u، x، n استفاده کرد.
    • ll (دو L کوچک) - نشان می دهد که متغیر یک اشاره گر به یک مقدار از نوع signed int یا unsigned long long int است. پرچم با مشخص کننده ها استفاده می شود: d, i, o, u, x, n.
    • j - نشان می دهد که متغیر یک اشاره گر برای تایپ intmax_t یا uintmax_t از فایل هدر stdint.h است. با مشخص کننده ها استفاده می شود: d، i، o، u، x، n.
    • z - نشان می دهد که متغیر یک اشاره گر به نوع size_t است که تعریف آن در stddef.h است. با مشخص کننده ها استفاده می شود: d، i، o، u، x، n.
    • t - نشان می دهد که متغیر یک اشاره گر برای تایپ ptrdiff_t است. تعریف این نوع در stddef.h است. با مشخص کننده ها استفاده می شود: d، i، o، u، x، n.

    تصویر با اصلاح کننده ها را می توان با وضوح بیشتری در قالب یک جدول ارائه کرد. این توضیحات scanf C برای برنامه نویسان واضح تر خواهد بود.

    شخصیت های دیگر

    هر نویسه ای که در قالب با آن مواجه می شود کنار گذاشته می شود. شایان ذکر است که وجود فضای خالی یا کاراکترهای محدودکننده (خط جدید، فاصله، تب) در رشته کنترل می‌تواند منجر به رفتار متفاوت تابع شود. در یک نسخه، scanf() بدون ذخیره کردن هیچ تعداد جداکننده می خواند تا زمانی که با کاراکتری غیر از جداکننده مواجه شود، و در نسخه دیگر، فاصله ها (فقط آنها) اهمیتی ندارند و عبارت "%d + %d" معادل است. به "% d+%d".

    مثال ها

    بیایید به تعدادی مثال نگاه کنیم تا به شما در فکر کردن و درک دقیق‌تر نحوه عملکرد تابع کمک کند.

    Scanf("%3s"، str); //اگر خط "1d2s3d1;3" را در کنسول وارد کنید، فقط "1d2" در str scanf نوشته می شود("%dminus%d", &x, &y); //کاراکترهای منهای بین دو عدد حذف خواهند شد scanf("%5", str); //کاراکترها تا زمانی که 5 مورد از آنها وجود داشته باشد و کاراکترها اعدادی از 0 تا 9 باشند در str وارد می شوند. scanf("%lf", &d); //ورودی مورد انتظار از نوع double scanf("%hd", &x); //انتظار تعدادی از نوع short scanf("%hu", &y); //انتظار تعدادی از نوع scanf کوتاه بدون علامت ("lx", &z); //تعداد مورد انتظار از نوع long int

    از مثال های داده شده می توانید ببینید که چگونه عدد مورد انتظار با استفاده از نمادهای مختلف تغییر می کند.

    scanf C - توضیحات برای مبتدیان

    این بخش برای مبتدیان مفید خواهد بود. اغلب شما نیاز دارید که شرح کاملی از scanf C را در اختیار نداشته باشید، بلکه نیاز به جزئیات نحوه عملکرد عملکرد دارید.

    • عملکرد تا حدودی منسوخ شده است. چندین پیاده سازی مختلف در کتابخانه های نسخه های مختلف وجود دارد. به عنوان مثال، عملکرد scanf بهبود یافته S C، که شرح آن را می توان در وب سایت مایکروسافت یافت.
    • تعداد مشخص کننده ها در قالب باید با تعداد آرگومان های ارسال شده به تابع مطابقت داشته باشد.
    • عناصر جریان ورودی باید فقط با تعیین حروف جدا شوند: فاصله، برگه، خط جدید. کاما، نقطه ویرگول، نقطه و غیره - این کاراکترها جداکننده تابع scanf() نیستند.
    • اگر scanf با یک کاراکتر جداکننده مواجه شود، ورودی متوقف خواهد شد. اگر بیش از یک متغیر برای خواندن وجود داشته باشد، scanf به خواندن متغیر بعدی می‌رود.
    • کوچکترین اختلاف در فرمت داده های ورودی منجر به نتایج غیر قابل پیش بینی از برنامه می شود. خوب است اگر برنامه فقط با یک خطا تمام شود. اما اغلب برنامه به کار خود ادامه می دهد و آن را به اشتباه انجام می دهد.
    • scanf("%20s ..."، ...); اگر جریان ورودی بیش از 20 کاراکتر باشد، scanf 20 کاراکتر اول را می خواند و در صورت مشخص شدن، به خواندن متغیر بعدی پایان می دهد یا ادامه می دهد. تماس scanf بعدی به خواندن جریان ورودی از جایی که تماس scanf قبلی متوقف شد ادامه خواهد داد. اگر در حین خواندن 20 کاراکتر اول با یک کاراکتر جداکننده مواجه شد، scanf اجرا را متوقف می‌کند یا به خواندن متغیر بعدی می‌رود، حتی اگر 20 کاراکتر را برای متغیر اول نخوانده باشد. در این حالت، تمام کاراکترهای شمارش نشده به متغیر بعدی متصل خواهند شد.
    • اگر مجموعه کاراکترهایی که باید اسکن شوند با علامت "^" شروع شود، scanf داده ها را تا زمانی که با یک کاراکتر جداکننده یا یک کاراکتر از مجموعه مواجه شود، می خواند. به عنوان مثال، "%[^A-E1-5]" داده ها را از جریان می خواند تا زمانی که یکی از نویسه های انگلیسی بزرگ A تا E یا یکی از اعداد 1 تا 5 مواجه شود.
    • تابع scanf C، همانطور که توضیح داده شد، عددی برابر با تعداد موفقیت آمیز ورودی ها به متغیرها برمی گرداند. اگر scanf 3 متغیر بنویسد، نتیجه عملکرد موفقیت آمیز تابع، برگرداندن عدد 3 خواهد بود. اگر scanf نتوانست هیچ متغیری بنویسد، نتیجه 0 خواهد بود. همه به دلایلی، نتیجه EOF خواهد بود.
    • اگر تابع scanf() کار خود را به درستی کامل نکرده باشد. به عنوان مثال، scanf("%d"، &x) - یک عدد مورد انتظار بود، اما نمادها به عنوان ورودی دریافت شدند. فراخوانی scanf() بعدی از نقطه‌ای در جریان ورودی که فراخوانی تابع قبلی به پایان رسیده است آغاز می‌شود. برای غلبه بر این مشکل، باید از شر شخصیت های مشکل ساز خلاص شوید. این را می توان برای مثال با فراخوانی scanf("%*s") انجام داد. یعنی تابع یک رشته از کاراکترها را می خواند و آن را دور می اندازد. با این روش هوشمندانه می توانید به وارد کردن داده های مورد نیاز ادامه دهید.
    • برخی از پیاده سازی های scanf() اجازه نمی دهند که از "-" در مجموعه کاراکتر اسکن شود.
    • مشخص کننده "%c" هر کاراکتر از جریان را می خواند. یعنی کاراکتر جداکننده را هم می خواند. برای رد شدن از کاراکتر جداکننده و ادامه خواندن کاراکتر مورد نظر، می توانید از "%1s" استفاده کنید.
    • هنگام استفاده از مشخص کننده "c"، استفاده از عرض "% 10c" قابل قبول است، اما پس از آن باید آرایه ای از عناصر از نوع char را به عنوان متغیر به تابع scanf ارسال کنید.
    • "%" به معنای "همه حروف کوچک الفبای انگلیسی" است و "%" به سادگی به معنای 3 کاراکتر است: "z"، "a"، "-". به عبارت دیگر، کاراکتر "-" تنها زمانی به معنای یک محدوده است که بین دو کاراکتر به ترتیب صحیح ظاهر شود. اگر "-" در انتهای یک عبارت، در ابتدا، یا در ترتیب اشتباه کاراکترها در دو طرف آن باشد، آنگاه به سادگی نشان دهنده یک کاراکتر خط فاصله است، نه یک محدوده.

    نتیجه

    این توضیح scanf C را به پایان می‌رساند. این یک تابع راحت برای کار در برنامه‌های کوچک و هنگام استفاده از روش برنامه‌نویسی رویه‌ای است. با این حال، اشکال اصلی تعداد خطاهای غیرقابل پیش بینی است که می تواند هنگام استفاده از scanf رخ دهد. بنابراین، بهتر است هنگام برنامه نویسی، توضیحات scanf C را جلوی چشم خود نگه دارید. در پروژه های بزرگ حرفه ای، از iostream ها استفاده می شود زیرا دارای قابلیت های سطح بالاتری هستند، بهتر می توانند خطاها را بگیرند و پردازش کنند و همچنین با حجم قابل توجهی از اطلاعات کار می کنند. همچنین لازم به ذکر است که شرح scanf C به زبان روسی در بسیاری از منابع آنلاین و همچنین نمونه هایی از استفاده از آن با توجه به سن عملکرد موجود است. بنابراین، در صورت لزوم، همیشه می توانید پاسخ را در انجمن های موضوعی پیدا کنید.

    زبان برنامه نویسی C++

    آخرین به روز رسانی: 1396/08/28

    زبان برنامه نویسی C++ یک زبان برنامه نویسی سطح بالا، تایپ ایستا، کامپایل شده و همه منظوره است که برای ایجاد طیف گسترده ای از برنامه ها مناسب است. امروزه C++ یکی از محبوب ترین و گسترده ترین زبان هاست.

    این زبان ریشه در زبان C دارد که در سال‌های 1969-1973 در آزمایشگاه‌های بل توسط برنامه‌نویس دنیس ریچی توسعه یافت. در اوایل دهه 1980، برنامه نویس دانمارکی Bjarne Stroustrup، که در آن زمان در آزمایشگاه Bell کار می کرد، C++ را به عنوان پسوند زبان C توسعه داد. در واقع، در ابتدا، C++ به سادگی زبان C را با برخی از قابلیت های برنامه نویسی شی گرا تکمیل کرد. و به همین دلیل است که استروستروپ در ابتدا آن را «C با کلاس‌ها» نامید.

    پس از آن، زبان جدید شروع به محبوبیت کرد. ویژگی های جدیدی به آن اضافه شد که آن را نه تنها یک زبان برنامه نویسی جدید، بلکه به زبان C اضافه کرد. در نتیجه، "C با کلاس ها" به C++ تغییر نام داد. و از آن زمان به بعد، هر دو زبان شروع به توسعه مستقل از یکدیگر کردند.

    C++ یک زبان قدرتمند است که قابلیت های حافظه غنی را از C به ارث برده است. بنابراین، C++ اغلب در برنامه نویسی سیستم، به ویژه هنگام ایجاد سیستم عامل ها، درایورها، ابزارهای مختلف، آنتی ویروس ها و غیره استفاده می کند. در ضمن، سیستم عامل ویندوز بیشتر به زبان C++ نوشته شده است. اما استفاده از این زبان به برنامه نویسی سیستم محدود نمی شود. C++ را می توان در برنامه های هر سطحی که سرعت و عملکرد مهم هستند استفاده کرد. اغلب برای ایجاد برنامه های گرافیکی و برنامه های کاربردی مختلف استفاده می شود. همچنین اغلب برای ایجاد بازی هایی با تجسم غنی و غنی استفاده می شود. علاوه بر این، اخیراً جهت موبایل شتاب بیشتری گرفته است، جایی که C++ نیز کاربرد خود را پیدا کرده است. و حتی در توسعه وب، شما همچنین می توانید از C++ برای ایجاد برنامه های کاربردی وب یا برخی از خدمات پشتیبانی که برنامه های کاربردی وب را ارائه می دهند استفاده کنید. به طور کلی، C++ یک زبان پرکاربرد است که می توانید تقریباً هر نوع برنامه ای را در آن ایجاد کنید.

    C++ یک زبان کامپایل شده است، به این معنی که کامپایلر کد منبع C++ را به یک فایل اجرایی که حاوی مجموعه‌ای از دستورالعمل‌های ماشین است، ترجمه می‌کند. اما پلتفرم های مختلف ویژگی های خاص خود را دارند، بنابراین برنامه های کامپایل شده را نمی توان به سادگی از یک پلتفرم به پلتفرم دیگر منتقل کرد و در آنجا اجرا کرد. با این حال، در سطح کد منبع، برنامه های C++ تا حد زیادی قابل حمل هستند مگر اینکه از برخی توابع خاص سیستم عامل استفاده شود. و در دسترس بودن کامپایلرها، کتابخانه ها و ابزارهای توسعه برای تقریباً همه پلتفرم های رایج به شما امکان می دهد همان کد منبع ++C را در برنامه های کاربردی این پلتفرم ها کامپایل کنید.

    برخلاف C، زبان C++ به شما اجازه می‌دهد تا برنامه‌ها را به سبک شی گرا بنویسید، که یک برنامه را به عنوان مجموعه‌ای از کلاس‌ها و اشیاء در تعامل با یکدیگر نشان می‌دهد. که ایجاد برنامه های بزرگ را ساده می کند.

    مراحل اصلی توسعه

    در سال های 1979-1980، Bjarne Stroustrup پسوندی را برای زبان C توسعه داد - "C with Classes". در سال 1983 این زبان به C++ تغییر نام داد.

    در سال 1985 اولین نسخه تجاری زبان C++ و همچنین اولین ویرایش کتاب "The C++ Programming Language" منتشر شد که نشان دهنده اولین توصیف این زبان در غیاب استاندارد رسمی بود.

    در سال 1989 نسخه جدیدی از زبان C++ 2.0 منتشر شد که شامل تعدادی ویژگی جدید بود. پس از این، این زبان تا سال 2011 به آرامی توسعه یافت. اما در همان زمان در سال 1998 اولین تلاش برای استانداردسازی زبان توسط سازمان ISO (سازمان بین المللی استانداردسازی) صورت گرفت. اولین استاندارد ISO/IEC 14882:1998 یا به اختصار C++98 نام داشت. متعاقباً در سال 2003 نسخه جدیدی از استاندارد C++03 منتشر شد.

    در سال 2011، استاندارد جدید C++11 منتشر شد که حاوی اضافات بسیاری بود و زبان C++ را با تعداد زیادی قابلیت جدید غنی کرد. به دنبال این، یک افزودنی کوچک به استاندارد که با نام C++14 نیز شناخته می شود، در سال 2014 منتشر شد. و یک نسخه کلیدی دیگر از این زبان برای سال 2017 برنامه ریزی شده است.

    کامپایلرها و محیط های توسعه

    برای توسعه برنامه‌ها در C++، به یک کامپایلر نیاز دارید - کد منبع در C++ را به یک فایل اجرایی ترجمه می‌کند، که سپس می‌توانید آن را اجرا کنید. اما در حال حاضر کامپایلرهای مختلفی وجود دارد. آنها ممکن است در جنبه های مختلف، به ویژه در اجرای استانداردها، متفاوت باشند. یک لیست اولیه از کامپایلرها برای C++ را می توان در ویکی پدیا یافت. برای توسعه توصیه می شود کامپایلرهایی را انتخاب کنید که در حال توسعه و پیاده سازی آخرین استانداردها هستند. بنابراین، در طول این آموزش، ما در درجه اول از کامپایلر رایگان موجود g++ که توسط پروژه گنو توسعه یافته است، استفاده خواهیم کرد.

    همچنین می توانید از IDE هایی مانند Visual Studio، Netbeans، Eclipse، Qt و غیره برای ایجاد برنامه استفاده کنید.

    این آموزش ها برای همه است، چه تازه کار برنامه نویسی داشته باشید و چه تجربه برنامه نویسی گسترده در زبان های دیگر! این مطالب برای کسانی است که می خواهند زبان های C/C++ را از اصول اولیه تا پیچیده ترین ساختارها یاد بگیرند.

    C++ یک زبان برنامه نویسی است، دانش این زبان برنامه نویسی به شما این امکان را می دهد که کامپیوتر خود را در بالاترین سطح کنترل کنید. در حالت ایده‌آل، می‌توانید کاری کنید که رایانه هر کاری که می‌خواهید انجام دهد. سایت ما به شما در تسلط بر زبان برنامه نویسی C++ کمک می کند.

    نصب /IDE

    اولین کاری که باید قبل از شروع یادگیری C++ انجام دهید این است که مطمئن شوید که یک IDE - یک محیط توسعه یکپارچه (برنامه ای که در آن برنامه نویسی خواهید کرد) دارید. اگر IDE ندارید، پس به اینجا بروید. هنگامی که در مورد انتخاب IDE تصمیم گرفتید، آن را نصب کنید و ایجاد پروژه های ساده را تمرین کنید.

    مقدمه ای بر C++

    زبان C++ مجموعه ای از دستورات است که به کامپیوتر می گوید چه کاری انجام دهد. این مجموعه از دستورات معمولا کد منبع یا به سادگی کد نامیده می شود. دستورات یا "توابع" یا "کلمات کلیدی" هستند. کلمات کلیدی (کلمات رزرو شده C/C++) بلوک های اصلی زبان هستند. توابع بلوک‌های ساختمانی پیچیده‌ای هستند زیرا بر حسب توابع ساده‌تر نوشته شده‌اند - این را در اولین برنامه ما که در زیر نشان داده شده است خواهید دید. این ساختار توابع شبیه محتویات یک کتاب است. محتوا می تواند فصل های کتاب را نشان دهد، هر فصل در کتاب می تواند محتوای خاص خود را داشته باشد که از پاراگراف ها تشکیل شده است، هر پاراگراف می تواند زیر پاراگراف های خاص خود را داشته باشد. اگرچه C++ بسیاری از توابع رایج و کلمات رزرو شده را ارائه می دهد که می توانید از آنها استفاده کنید، هنوز نیاز به نوشتن توابع خود وجود دارد.

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

    بنابراین چگونه به این ویژگی های استاندارد دسترسی پیدا می کنید؟ برای دسترسی به توابع استاندارد همراه با کامپایلر، باید فایل هدر را با استفاده از دستورالعمل پیش پردازشگر اضافه کنید - #include . چرا این کار موثر است؟ بیایید به مثالی از یک برنامه کاری نگاه کنیم:

    #عبارتند از << "Моя первая программа на С++\n"; cin.get(); }

    اجازه دهید عناصر برنامه را با جزئیات در نظر بگیریم. #include یک دستورالعمل "پیش پردازنده" است که به کامپایلر می گوید قبل از ایجاد فایل اجرایی، کد را از فایل هدر iostream در برنامه ما قرار دهد. با اتصال یک فایل هدر به یک برنامه، به بسیاری از توابع مختلف دسترسی خواهید داشت که می توانید در برنامه خود از آنها استفاده کنید. برای مثال، عملگر cout به iostream نیاز دارد. خط با استفاده از namespace std. به کامپایلر می گوید که از گروهی از توابع که بخشی از کتابخانه استاندارد std هستند استفاده کند. این خط همچنین به برنامه اجازه می دهد تا از عملگرهایی مانند cout استفاده کند. نقطه ویرگول بخشی از نحو C++ است. به کامپایلر می گوید که این پایان دستور است. در یک لحظه خواهید دید که نقطه ویرگول برای پایان دادن به اکثر دستورات در ++C استفاده می شود.

    خط مهم بعدی برنامه int main () است. این خط به کامپایلر می گوید که تابعی به نام main وجود دارد و تابع یک عدد صحیح برمی گرداند. مهاربندهای فرفری ( و ) شروع (و پایان) یک تابع را علامت می دهند. بریس های فرفری در سایر بلوک های کد نیز استفاده می شوند، اما همیشه یک چیز را نشان می دهند - به ترتیب ابتدا و انتهای بلوک.

    در C++، شی cout برای نمایش متن (با تلفظ "C out") استفاده می شود. او از نمادها استفاده می کند<< , известные как «оператор сдвига», чтобы указать, что отправляется к выводу на экран. Результатом вызова функции cout << является отображение текста на экране. Последовательность \n фактически рассматривается как единый символ, который обозначает новую строку (мы поговорим об этом позже более подробно). Символ \n перемещает курсор на экране на следующую строку. Опять же, обратите внимание на точку с запятой, её добавляют в конец, после каждого оператора С++.

    دستور بعدی cin.get() است. این فراخوانی تابع دیگری است که داده ها را از جریان داده ورودی می خواند و منتظر می ماند تا کلید ENTER فشار داده شود. این دستور تا زمانی که کلید ENTER را فشار دهید پنجره کنسول بسته نمی شود. این به شما فرصت می دهد تا خروجی برنامه را ببینید.

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

    #عبارتند از با استفاده از namespace std. int main() (cout<<"Моя первая программа на С++\n"; cin.get(); return 1; }

    برای ادغام مطالب، کد برنامه را در IDE خود تایپ کرده و اجرا کنید. وقتی برنامه اجرا شد و خروجی را دیدید، کمی با عبارت cout آزمایش کنید. این به شما کمک می کند تا به زبان عادت کنید.

    حتما در مورد برنامه های خود نظر بدهید!

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

    با همه این نوع متغیرها چه باید کرد؟

    گاهی اوقات داشتن چندین نوع متغیر ممکن است گیج کننده باشد، زمانی که برخی از انواع متغیرها زائد به نظر می رسند. استفاده از نوع متغیر صحیح بسیار مهم است، زیرا برخی از متغیرها به حافظه بیشتری نسبت به بقیه نیاز دارند. علاوه بر این، به دلیل نحوه ذخیره آن ها در حافظه، اعداد ممیز شناور، انواع داده های شناور و دوگانه «نادقیق» هستند و زمانی که نیاز به ذخیره یک عدد صحیح دقیق است، نباید از آنها استفاده شود.

    اعلان متغیرها در C++

    برای تعریف یک متغیر، از نوع نحو استفاده کنید<имя>; . در اینجا چند نمونه از اعلان متغیرها آورده شده است:

    عدد داخلی شخصیت کاراکتر; float num_float;

    اعلام چند متغیر از یک نوع در یک خط مجاز است؛ برای انجام این کار، هر یک از آنها باید با کاما از هم جدا شوند.

    Int x, y, z, d;

    اگر دقت کرده باشید، ممکن است دیده باشید که یک اعلان متغیر همیشه با یک نقطه ویرگول دنبال می شود. می‌توانید درباره کنوانسیون «نام‌گذاری متغیرها» بیشتر بدانید.

    اشتباهات رایج هنگام اعلان متغیرها در C++

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

    استفاده از متغیرها

    بنابراین اکنون می دانید که چگونه یک متغیر را تعریف کنید. در اینجا یک نمونه برنامه وجود دارد که استفاده از یک متغیر را نشان می دهد:

    #عبارتند از با استفاده از namespace std. int main() (int number; cout<< "Введите число: "; cin >> شماره؛ cin.ignore(); کوت<< "Вы ввели: "<< number <<"\n"; cin.get(); }

    بیایید نگاهی به این برنامه بیندازیم و کد آن را خط به خط بررسی کنیم. کلمه کلیدی int نشان می دهد که عدد یک عدد صحیح است. تابع cin >> مقدار را به عدد می خواند، کاربر باید بعد از عدد وارد شده اینتر را فشار دهد. cin.ignore() تابعی است که یک کاراکتر را می خواند و آن را نادیده می گیرد. ما ورودی خود را در برنامه سازماندهی کرده ایم؛ پس از وارد کردن یک عدد، کلید ENTER را فشار می دهیم، نمادی که به جریان ورودی نیز منتقل می شود. ما به آن نیاز نداریم، پس آن را دور می اندازیم. در نظر داشته باشید که متغیر به عنوان یک نوع عدد صحیح اعلام شده است، اگر کاربر بخواهد عدد اعشاری را وارد کند، کوتاه می شود (یعنی قسمت اعشاری عدد نادیده گرفته می شود). سعی کنید یک عدد اعشاری یا دنباله ای از کاراکترها را وارد کنید، وقتی برنامه مثال را اجرا می کنید، پاسخ به مقدار ورودی بستگی دارد.

    توجه داشته باشید که هنگام چاپ از یک متغیر، از نقل قول استفاده نمی شود. عدم وجود نقل قول به کامپایلر می گوید که یک متغیر وجود دارد و بنابراین برنامه باید مقدار متغیر را بررسی کند تا نام متغیر را با مقدار آن در هنگام اجرا جایگزین کند. چند دستور شیفت در یک خط کاملاً قابل قبول است و خروجی به همان ترتیب انجام می شود. شما باید حرف های رشته ای (رشته های محصور شده در گیومه ها) و متغیرها را جدا کنید و به هر کدام عملگر شیفت خاص خود بدهید.<< . Попытка поставить две переменные вместе с одним оператором сдвига << выдаст сообщение об ошибке . Не забудьте поставить точку с запятой. Если вы забыли про точку с запятой, компилятор выдаст вам сообщение об ошибке при попытке скомпилировать программу.

    تغییر و مقایسه ارزش ها

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

    • * ضرب،
    • - منها کردن،
    • + اضافه کردن،
    • / تقسیم،
    • = تکلیف،
    • == برابری،
    • > بیشتر
    • < меньше.
    • != نابرابر
    • >= بزرگتر یا مساوی با
    • <= меньше или равно

    عملگرهایی که توابع ریاضی را انجام می دهند باید در سمت راست علامت تخصیص استفاده شوند تا نتیجه را به متغیر سمت چپ نسبت دهیم.

    در اینجا چند نمونه آورده شده است:

    A = 4 * 6; // از کامنت خط و نقطه ویرگول استفاده کنید، a برابر 24 a = a + 5 است. // برابر با مجموع مقدار اصلی و پنج a == 5 // پنج را اختصاص نمی دهد، بررسی می کند که آیا برابر با 5 است یا خیر

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

    آ< 5 // Проверка, a менее пяти? a >5 // بررسی کنید، آیا بیشتر از پنج است؟ a == 5 // بررسی، آیا برابر با پنج است؟ a != 5 // بررسی کنید، آیا برابر با پنج نیست؟ a >= 5 // بررسی کنید که a بزرگتر یا مساوی پنج است؟ آ<= 5 // Проверка, a меньше или равно пяти?

    این مثال‌ها استفاده از علائم مقایسه را خیلی واضح نشان نمی‌دهند، اما وقتی شروع به مطالعه عملگرهای انتخاب کنیم، متوجه خواهید شد که چرا این کار ضروری است.