خطاهای رایج در شروع برنامهنویسی
خطاهای رایج در شروع برنامهنویسی 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;
}

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