خطاهای رایج در شروع برنامه‌نویسی

خطاهای رایج در شروع برنامه‌نویسی C

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

انواع خطا در برنامه‌نویسی

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

۱. خطای نحوی

وقتی قواعد نوشتاری زبان رعایت نشده باشند؛ مانند فراموش کردن نقطه‌ویرگول.

۲. خطای زمان اجرا

وقتی هنگام اجرای برنامه مشکلی رخ دهد؛ مانند تقسیم بر صفر در شرایطی که برنامه آن را کنترل نکرده است.

۳. خطای منطقی

وقتی برنامه اجرا می‌شود، اما به دلیل اشتباه در منطق یا فرمول، نتیجه نادرستی تولید می‌کند.

۱. فراموش کردن نقطه‌ویرگول

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

کد دارای خطا
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n")
    return 0;
}
نتیجه مورد انتظار

این کد به دلیل نبودن نقطه‌ویرگول در انتهای دستور printf ممکن است با خطای کامپایل مواجه شود؛ بنابراین خروجی برنامه نمایش داده نمی‌شود.

برای رفع این خطا، نقطه‌ویرگول را به انتهای دستور اضافه می‌کنیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}
خروجی برنامه
Hello, World!

۲. اشتباه در نوشتن حروف بزرگ و کوچک

زبان C به بزرگی و کوچکی حروف حساس است. به این ویژگی Case Sensitivity گفته می‌شود. بنابراین نام‌هایی مانند main و Main یکسان نیستند.

کد دارای خطا
#include <stdio.h>

int main(void)
{
    Printf("Hello, World!\n");
    return 0;
}
نتیجه مورد انتظار

کامپایلر معمولاً خطایی درباره شناخته‌نشدن تابع Printf گزارش می‌کند؛ زیرا نام صحیح تابع printf است.

نام تابع را با حروف کوچک اصلاح می‌کنیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}
خروجی برنامه
Hello, World!

۳. فراموش کردن فایل سرآیند

برای استفاده از تابع printf باید فایل سرآیند stdio.h را وارد برنامه کنیم. این کار با دستور #include انجام می‌شود.

کد ناقص
int main(void)
{
    printf("Learning C\n");
    return 0;
}
نتیجه مورد انتظار

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

با افزودن فایل سرآیند مناسب، کد کامل می‌شود.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    printf("Learning C\n");
    return 0;
}
خروجی برنامه
Learning C

۴. اشتباه در تعریف متغیر

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

کد دارای خطا
#include <stdio.h>

int main(void)
{
    age = 20;
    printf("%d\n", age);
    return 0;
}
نتیجه مورد انتظار

متغیر age تعریف نشده است؛ بنابراین کامپایلر معمولاً خطایی درباره شناخته‌نشدن این متغیر گزارش می‌کند.

برای رفع مشکل، نوع داده متغیر را هنگام تعریف مشخص می‌کنیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    int age = 20;
    printf("%d\n", age);
    return 0;
}
خروجی برنامه
20

۵. استفاده نادرست از مشخص‌کننده قالب در printf

تابع printf برای نمایش داده‌ها از مشخص‌کننده‌های قالب استفاده می‌کند. برای نمونه، %d برای نمایش مقدار صحیح از نوع int و %f برای نمایش مقدار اعشاری از نوع double در آرگومان‌های تابع مناسب است.

کد دارای اشکال
#include <stdio.h>

int main(void)
{
    int number = 25;
    printf("%f\n", number);
    return 0;
}
نتیجه مورد انتظار

نوع مشخص‌کننده %f با آرگومان از نوع int سازگار نیست. این ناهماهنگی باعث رفتار تعریف‌نشده می‌شود و خروجی قابل اتکایی ندارد.

برای نمایش متغیر صحیح، از مشخص‌کننده %d استفاده می‌کنیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    int number = 25;
    printf("%d\n", number);
    return 0;
}
خروجی برنامه
25

۶. اشتباه در استفاده از عملگرهای مقایسه

در زبان C، عملگر = برای انتساب مقدار و عملگر == برای مقایسه برابری استفاده می‌شود. اشتباه گرفتن این دو عملگر ممکن است باعث شود شرط برنامه رفتاری متفاوت از انتظار داشته باشد.

کد دارای خطای منطقی
#include <stdio.h>

int main(void)
{
    int number = 5;

    if (number = 10)
    {
        printf("Equal to 10\n");
    }

    return 0;
}
خروجی واقعی این کد
Equal to 10

در این کد، مقدار متغیر به ۱۰ تغییر می‌کند و چون مقدار غیرصفر در شرط درست محسوب می‌شود، پیام نمایش داده می‌شود. این رفتار با هدف مقایسه برابری متفاوت است.

اگر هدف بررسی برابری باشد، باید از عملگر == استفاده کنیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    int number = 5;

    if (number == 10)
    {
        printf("Equal to 10\n");
    }
    else
    {
        printf("Not equal to 10\n");
    }

    return 0;
}
خروجی برنامه
Not equal to 10

۷. اشتباه در نوشتن شرط‌ها و حلقه‌ها

در شرط‌ها و حلقه‌ها باید پرانتزها، آکولادها و نقطه‌ویرگول‌ها را درست به کار ببریم. همچنین باید مطمئن شویم شرط حلقه در زمان مناسب نادرست می‌شود؛ در غیر این صورت ممکن است حلقه بدون پایان ادامه پیدا کند.

کد دارای حلقه بی‌نهایت
#include <stdio.h>

int main(void)
{
    int i = 1;

    while (i <= 3)
    {
        printf("%d\n", i);
    }

    return 0;
}
نتیجه اجرای کد

مقدار i هیچ‌گاه تغییر نمی‌کند؛ بنابراین شرط حلقه همیشه درست باقی می‌ماند و عدد ۱ بارها نمایش داده می‌شود.

برای پایان یافتن حلقه، باید مقدار متغیر را در هر تکرار افزایش دهیم.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    int i = 1;

    while (i <= 3)
    {
        printf("%d\n", i);
        i++;
    }

    return 0;
}
خروجی برنامه
1
2
3

۸. اشتباه در محاسبات و منطق برنامه

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

کد دارای خطای منطقی
#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    int average = a + b;

    printf("Average = %d\n", average);
    return 0;
}
خروجی واقعی کد
Average = 30

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

با تقسیم مجموع بر تعداد اعداد، نتیجه درست به دست می‌آید.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    int average = (a + b) / 2;

    printf("Average = %d\n", average);
    return 0;
}
خروجی برنامه
Average = 15

۹. استفاده نادرست از علامت نقل‌قول و رشته‌ها

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

کد دارای خطا
#include <stdio.h>

int main(void)
{
    printf(Hello);
    return 0;
}
نتیجه مورد انتظار

کامپایلر عبارت Hello را به‌عنوان یک شناسه در نظر می‌گیرد، نه متن؛ چون این شناسه تعریف نشده است، کامپایل برنامه با خطا مواجه می‌شود.

با قرار دادن متن داخل علامت نقل‌قول دوتایی، کد اصلاح می‌شود.

کد اصلاح‌شده
#include <stdio.h>

int main(void)
{
    printf("Hello");
    return 0;
}
خروجی برنامه
Hello

۱۰. نادیده گرفتن پیام‌های کامپایلر

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

چگونه پیام‌ها را بررسی کنیم؟

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

روش مناسب برای پیدا کردن خطا

۱

پیام خطا را بخوانید

پیام کامپایلر معمولاً سرنخی درباره نوع خطا و محل احتمالی آن ارائه می‌دهد.

۲

کد را مرحله‌به‌مرحله بررسی کنید

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

۳

یک تغییر در هر مرحله انجام دهید

با اصلاح مرحله‌ای کد، تشخیص علت مشکل آسان‌تر می‌شود.

۴

برنامه را دوباره آزمایش کنید

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

جمع‌بندی

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

تمرین

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

کد تمرین
#include <stdio.h>

int main(void)
{
    int number = 12
    Printf("%d\n", number);
    return 0;
}
💬

دیدگاه کاربران

نظر یا تجربه خود را درباره این مطلب با دیگران به اشتراک بگذارید.

💭 هنوز دیدگاهی ثبت نشده است. اولین نفری باشید که نظر خود را می‌نویسد.
✍️ ارسال دیدگاه

🔒 دیدگاه شما پس از بررسی و تأیید مدیر سایت نمایش داده خواهد شد.

ارسال نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *