به این مثال توجه کنید؛ فرض کنید بخواهیم برنامه ای بنویسیم که مقدارn! را حداکثر تا n=7 محاسبه کند و فرض کنید برنامه ی زیر را در پاسخ نوشته ایم:
▪ 10 INPUT N
▪ 20 IF N>7 OR N<0 THEN GOTO 10
▪ 30 FOR I=1 TO N
▪ 40 Factoriel =Factoriel * i
▪ 50 NEXT I
▪ 60 PRINT N, "!= ", Factoriel
▪ 70 END
اگر این برنامه را در محیط برنامه نویسی Basic اجرا کنید با هیچ نوع خطایی مواجه نخواهید شد، ولی هربار و به ازای هر مقدار N فقط پاسخ 0(صفر) را دریافت خواهید نمود! برنامه ظاهرا" درست است ولی یک مشکل کوچک وجود دارد. گرچه حلقه ی نوشته شده در سطر 30 برای محاسبه ی فاکتوریل کاملا" درست است ولی نتیجه ی درست از برنامه به دست نمی آید. علت چیست؟ علت این است که متغیر صحیح Factoriel مقدار دهی اولیه نشده است و Basic هر متغیری را که مقدار دهی اولیه نشده باشد در اولین استفاده از آن، صفر فرض می کند . پس در اولین اجرای سطر 40 ، مقدار Factoriel مساوی صفر است و به همین دلیل حلقه ی فوق در واقع عبارت را محاسبه می کند که به طور قطع 0 (صفر) خواهد بود. البته مثال فوق، مثال بسیار کوچکی است و پیدا کردن علت و رفع نقص برنامه هم بسیار ساده است ولی هر قدر حجم برنامه بیشتر شود، کار عیب یابی و رفع نقص هم بسیار دشوار و طاقت فرسا خواهد بود.
یکی از رایج ترین دلایل بروز این نوع مشکل در برنامه های کامپیوتری، عدم مقدار دهی اولیه ی متغیرهاست و این موضوع زمانی جدی می شود که متغیرهای استفاده شده از نوع اشاره گر (Pointer) باشند که گاهی ممکن است حتی بدون آن که شما متوجه شوید، باعث صدمه زدن به دستگاه کامپیوتر هم بشوند.
متاسفانه این نوع مشکل به گونه ای است که مفسرها و کامپایلرهای زبان های برنامه نویسی هیچگونه اخطار یا گزارشی در خصوص آنها به استفاده کننده نمی دهند و تنها راه برای یافتن این اشکالات، آزمودن نتایج برنامه و اطمینان از صحت آنهاست. اما اگر در یک برنامه با چنین اشکالی مواجه شدید و نتوانستید در بررسی اولیه علت آن را بیابید، به شما توصیه می کنیم با اجرای خط به خط برنامه و کنترل عملیات اجرایی هر سطر، سعی کنید علت مشکل را بیابید. برای این منظور در محیط C ، Basic و Pascal می توانید از کلید F8 برای اجرای سطر به سطر برنامه استفاده کنید. توجه داشته باشید که یکی از پنهان ترین مشکلات در امر برنامه نویسی این است که برنامه نتواند به طور دقیق همان پاسخ مورد نظر را تولید کند. به خصوص زمانی که طول برنامه از حدود 100 خط تجاوز کند، یافتن منشا مشکلات فوق به قدری مشکل خواهد شد که گاهی برنامه نویس را از ادامه ی کار برنامه نویسی دلسرد خواهد کرد . همانگونه که گفته شد این اشکالات به آن دلیل بسیار پنهان هستند که کامپایلرها و مفسرهای زبان های برنامه نویسی هرگز هیچگونه گزارش و هشداری به برنامه نویس نمی دهند، اما با این وجود، نگارش های جدید زبان های برنامه نویسی امکانات خاصی جهت کنترل روند اجرای برنامه در اختیار برنامه نویس قرار می دهند. از جمله این که این برنامه ها به برنامه نویس امکان می دهند در حال اجرای برنامه، محتویات تمام متغیرهای معرفی شده در برنامه را هم در هر لحظه مشاهده کند. پرهیز از این اشکالات فقط با دقت زیاد در زمان برنامه نویسی و آزمایش نتایج حاصل از برنامه ممکن خواهد شد. لیکن توجه به نکات زیر می تواند مفید باشد:
1) تا جایی که می توانید عملکرد کل برنامه را به زیر برنامه ها تقسیم کرده و برای هر یک تابع مناسبی بنویسید. با این کار پیدا کردن محل بروز مشکل بسیار ساده تر خواهد شد.
2) اگر پاسخ دلخواه را از برنامه نگرفته اید، در یافتن علت مشکل عجله نکنید. گاهی مجبور می شوید ساعت ها برای یافتن مشکل وقت صرف کنید و گاهی حتی رفع مشکل نیز خود بسیار وقت گیر خواهد بود.
3) هرگز سعی نکنید یک برنامه ی طولانی را یکباره بنویسید بلکه آن را به زیر برنامه های مستقل تقسیم کرده و هر بخش را پس از نوشتن برنامه ی مناسب با دقت بسیار آزمایش کنید و از صحت عملکرد آن مطمین شوید. علاوه بر این افرادی که به تازگی کار برنامه نویسی را شروع کرده اند و یا کسانی که به تازگی با یک زبان جدید برنامه نویسی آشنا شده اند و سعی دارند توسط آن زبان، برنامه بنویسند، با مشکلات بیشتری مواجه خواهند شد. دقت در برنامه نویسی و مطالعه ی کتب راهنمای زبان های برنامه نویسی مورد استفاده و به خصوص صبر و حوصله، می توانند کلیدهای طلایی موفقیت این افراد باشند.
2) الگوریتم
سعی ما در این مجموعه مقالات، ارایه یک سری مطالب تکراری برای شما نیست و شما هم باید بدانید که فقط با مطالعه ی مقالات یک مجله نمی توانید برنامه نویس قابلی بشوید و مطالعه ی کتب مربوطه برای شما یک ضرورت است. لذا در هر کجا که احساس کنیم، شما را به مطالعه ی این کتاب ها ارجاع می دهیم. از جمله اینکه اگر بخواهید در خصوص تعریف الگوریتم و خصوصیات یک الگوریتم خوب بیشتر بدانید، می توانید به کتاب مبانی کامپیوتر و انفورماتیک سال سوم رشته ی ریاضی - فیزیک مراجعه کنید. لیکن چند مطلب مهم وجود دارد که در ادامه به طور مختصر بیان می گردند.
1-2) ارایه ی الگوریتم
شما به هر روشی که مساله را حل کنید، در نهایت بایستی راه حل پیدا شده را توسط یک الگوریتم مناسب پیاده کنید. این الگوریتم که می تواند به زبان محاوره ای نیز تهیه گردد، برنامه نویسی را برای شما بسیار ساده می کند و به علاوه فهم برنامه را برای افرادی که بعدا" آن را مطالعه می کنند،تسهیل می بخشد. البته باید خیلی دقت کنید که الگوریتم را به نوعی تهیه کنید که تمام مراحل آن را بتوانید به سادگی توسط زبان برنامه نویسی مورد نظرتان پیاده سازی کنید. در برنامه نویسی حرفه ای وجود الگوریتم و نمودارهای مختلف از روند اجرای برنامه، یک بخش جدایی ناپذیر از برنامه نویسی کامپیوتر است.
2-2) کوتاه تر بودن مراحل الگوریتم
به غیر از موارد بسیار نادر کسی نمی تواند مدعی شود که در مورد یک مساله ی خاص، کوتاهترین راه حل را پیدا کرده است و معمولا" با تفکر بیشتر می توان راه حل های کوتاهتری نیز یافت. منظور از کوتاه بودن مراحل الگوریتم این است که بتوان مساله را با طی نمودن مراحل عملیاتی کوتاهتر و کمتر حل کرد.
3-2) صحیح بودن الگوریتم
منظور از صحیح بودن الگوریتم این است که بین مراحل مختلف یک الگوریتم ارتباط منطقی وجود داشته باشد و الگوریتم نیز در پایان نتیجه ی مطلوب را به دست دهد. به علاوه هر مرحله ی الگوریتم به تنهایی از نقطه نظر منطقی درست بوده و قابل اجرا باشد و هیچ یک از مراحل الگوریتم با مراحل دیگر تضاد عملیاتی و یا تناقض نداشته باشد.
4-2) هوشمندانه بودن الگوریتم
از آنجا که الگوریتم به بیانی فقط پیاده سازی راه حل مساله در یک سری مراحل منطقی و پیوسته می باشد، لذا هوشمندانه بودن الگوریتم بیشتر به معنی هوشمندانه بودن راه حل مسیله است: از آنجا که هر مسیله تنها یک راه حل ندارد، گاهی افراد خلاق و باهوش برای حل یک مساله راه حل های بسیار جالب کشف می کنند که بسیار کوتاه بوده و سریع به جواب می رسند که می توان اینگونه راه حل ها را، راه حل های هوشمندانه نامید.
5-2) عدم پیچیدگی زیاد
گاهی اوقات ماهیت یک مساله پیچیده بوده و لذا راه حل آن هم پیچیده می گردد. کامپیوتر همواره برای ساده تر شدن مسایل زندگی به کار می رود و لذا در برنامه نویسی هم ما همیشه سعی می کنیم تا حد ممکن راه حل ساده ای برای مسایل بیابیم. منظور از عدم پیچیدگی الگوریتم این است که تمام مراحل الگوریتم به حدی واضح باشند که برای فهم آن نیاز به تفکر زیاد و یا احتمالا" تجزیه و تحلیل مساله نباشد. به نوعی می توان گفت که بیان ساده حل یک مساله در واقع یک هنر است ولی تجربه هم در این امر بسیار موثر می باشد.
▪ در اینجا لازم است نکاتی تذکر داده شود:
یکی از نکات مهم در نوشتن الگوریتم این است که باید سعی کرد هر یک از مراحل مستقل الگوریتم را به تنهایی توسط زبان برنامه نویسی به برنامه تبدیل کرد. به این دلیل به طور قطع بین الگوریتمی که یک برنامه نویس مبتدی برای راه حل مشخص یک مساله تهیه می کند و الگوریتمی که یک برنامه نویس با تجربه آماده می سازد، تفاوت های زیادی وجود خواهد داشت. چرا که هر چقدر در امر برنامه نویسی با تجربه تر باشید، الگوریتم تهیه شده شما از کلیت بیشتری برخوردار است. یک برنامه نویس با تجربه، چند مرحله ی متوالی و مکملِ هم را یکی می کند، چون قبلا" بارها و بارها تمام آن مراحل را پیاده کرده و حالا به سبب تسلطی که بر آن دارد نیازی نمی بیند که تمام جزییات را بیان کند، ولی این مهارت برای یک برنامه نویس مبتدی وجود ندارد. بنابراین ممکن است الگوریتم های ارایه شده توسط افراد مختلف از این نظر متفاوت باشند، ولی هیچ یک غلط نبوده و بر دیگری برتری خاصی ندارد.
به عنوان نمونه ممکن است یک مرحله از الگوریتمی چنین نوشته شود:
ولی کسی که دارای تجربه ی بیشتر است بنویسد
این تفاوت در مورد برنامه های بزرگ بسیار قابل توجه خواهد بود. مثلا" یک برنامه نویس با تجربه الگوریتم سیستم اطلاعاتی دانش آموزان یک کلاس را چنین می نویسد:
0- شروع کن
1) کلیه ی اطلاعات فردی و نمره ای دانش آموزان را بگیر
2) وضعیت تحصیلی هر دانش آموز را چاپ کن
3) پایان
فکر می کنید یک برنامه نویس مبتدی همین الگوریتم را در چند مرحله بنویسد؟!
نکته ی مهم دیگری که باید مورد توجه قرار بگیرد این است که تمام عوامل پنجگانه ای که اشاره شد به یک اندازه مهم نیستند، بلکه بستگی زیادی به محل و موقعیت حل مساله و همچنین استعداد برنامه نویس و نیازهای خود برنامه دارد. گاهی لازم است روش های ساده تر ولی طولانی تر را جایگزین روش های هوشمندانه تر کرد و گاهی بر عکس سعی کنیم تا حد ممکن راه حل را کوتاه کنیم. تشخیص این مساله مهم به عهده شخص برنامه نویس است.