
13-12-2007, 09:46
|
|
|
|
חבר מתאריך: 30.07.05
הודעות: 949
|
|
טוב, נתחיל קצת באיכות הקוד, אתה כותב ב-++C, נכון?
אז ככה: כשאתה מצרף קובץ ספרייה לקוד שלך, ב-++C אין סיומת .h.
את הסיומת הזו ירש ה-++C מה-C, וזה שם רק כדי ליצור תאימות מסויימת בין השפות.
לכן רצוי להשתמש ב:
דבר שני, הספריות של ++C עצמן מכילות חלוקה שנקראת namespaces.
לפונק' ב-++C יש לא רק שם, אלא גם שם משפחה.
רב הפונק' בספריות הסטנדרטיות כולן נמצאות במשפחת ה-std.
כעקרון, רצוי להכניס כל דבר שאתה עומד להשתמש בו בנפרד:
קוד:
using std::cout;
using std::cin;
אבל אם אתה מאד עצלן, אפשר להכניס פשוט את כל המשפחה (זה קצת פחות רצוי כי יכנסו המון דברים שאתה כנראה לא תרצה):
קוד:
using namespace std;
---
חוץ מהעובדה שהספריות של ++C קצת שונות מ-C משהו אחד זהה: פונק' ה-main היא פונק' מטיפוס INT, לא VOID!
היא מחזירה ערך למערכת ההפעלה (בד"כ 0).
איתחול המשתנים שלך הוא גם ברוח ה-C, ולא רוח ה-++C.
לא יודע אם הגעת כבר למחלקות, אבל מה שאתה עושה זה ליצור טיפוס INT ואז להעתיק אליו ערך:
קוד:
int i=0,counter=0,countermax=0,flag=0;
אתה סתם מעביד את המחשב בקוד הזה.
++C עושה הפרדה ברורה בין איתחול משתנים, לבין השמה למשתנים.
מה שאתה עושה פה זה השמה!
זה אמור היה להראות ככה:
קוד:
int i(0),counter(0),countermax(0),flag(0);
זה איתחול.
=========================
עכשיו בוא נעבור לקוד עצמו שלך שמנסה לבצע את הפעולה:
נתחיל מהאלגוריתם שאתה השתמשת בו - קודם כל קלטת את כל המספרים, שמרת דגל למספר האחרון ואז עברת שוב על המערך וחיפשת את הסדרה היורדת הארוכה ביותר.
הדגשתי ששמרת דגל למספר האחרון כי למעשה לא באמת עשית את זה - שמרת דגל לאיבר הריק הראשון במערך וזה לא מה שהתכוונת אליו.
לכן מודפס לך המספר הלא נכון! מודפס לך המספר שקודם למספר שמתחיל את הסדרה.
התיקון:
קוד:
flag=i-1; // was flag=i;
בעיה נוספת היא שאתה פשוט מדפיס את המספר שנמצא countermax איברים לפני האיבר האחרון במערך - כלומר אתה מניח שהסדרה הארוכה ביותר נגמרת עם הקלט.
זה טעות!
אתה חייב לזכור את האינדקס של הסדרה הארוכה ביותר!
קוד:
if (counter>countermax) {
countermax=counter;
maxindex = i;
*אל תשכח להגדיר את המשתנה הנוסף maxindex...
בנוסף, יש לך משום מה 2 IFs שעושים בדיוק אותו הדבר, בזה אחר זה... בשביל מה?!
קוד:
else
{
if (counter>countermax) {
countermax=counter;
maxindex = i;
}
counter=0;
}
if (counter>countermax) // Why is this if here?!
countermax=counter; // Delete it...
לבסוף, יש לך IF לחלוטין מיותר:
זה אומר שהמשפט יודפס רק אם יקלטו כל 50 המספרים?
למה..?
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.
|