לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 12-12-2007, 23:36
  Nihi Nihi אינו מחובר  
 
חבר מתאריך: 17.11.07
הודעות: 16
מחרוזת קטנה בC++ שמשום מה עושה לי בעיות

שלום,
כתבתי תוכנית שמקבלת 50 מספרים (שנגמרת אחרי 50 מספרים או אחרי שהוקש 1-) ובתוך המערך ניסיתי לבדוק את הסידרה היורדת הארוכה ביותר ולהגיד מאיזה מספר התחילה סידרה זו.

הצלחתי לכתוב את התוכנית כך שתעשה באמת את הבדיקה ותחזיר את המספר ממנו מתחילה סידרת המספרים הארוכה ביותר, אבל הבעיה שלי היא שברגע שמכניסים 1- והקלט נגמר (לפני שבאמת נכנסו 50 מספרים) אז אני לא מצליח להראות את המספר והכל מתחרבש לי
הבעיה היא בelse האחרון (אני מניח)
הנה הקוד:
קוד:
#include <iostream.h> void main() { int arr[50]; int i=0,counter=0,countermax=0,flag=0; cout<<"Enter 50 numbers\n"; while ((i<50) && (arr[i-1]!=-1)) { cin>>arr[i]; if (arr[i]==-1) flag=i; i++; } for (i=0;i<50;i++) { if (arr[i]>arr[i+1]) counter++; else { if (counter>countermax) countermax=counter; counter=0; } if (counter>countermax) countermax=counter; } if (flag==0) cout<<"the biggest down series starts with the number:"<<arr[i-countermax-1]<<"\n"; else cout<<<<arr[flag-countermax]; }

תודה מראש

נערך לאחרונה ע"י Nihi בתאריך 12-12-2007 בשעה 23:41.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 13-12-2007, 09:46
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 1 שנכתבה על ידי Nihi שמתחילה ב "מחרוזת קטנה בC++ שמשום מה עושה לי בעיות"

טוב, נתחיל קצת באיכות הקוד, אתה כותב ב-++C, נכון?

אז ככה: כשאתה מצרף קובץ ספרייה לקוד שלך, ב-++C אין סיומת .h.
את הסיומת הזו ירש ה-++C מה-C, וזה שם רק כדי ליצור תאימות מסויימת בין השפות.
לכן רצוי להשתמש ב:
קוד:
#include <iostream>


דבר שני, הספריות של ++C עצמן מכילות חלוקה שנקראת namespaces.
לפונק' ב-++C יש לא רק שם, אלא גם שם משפחה.
רב הפונק' בספריות הסטנדרטיות כולן נמצאות במשפחת ה-std.
כעקרון, רצוי להכניס כל דבר שאתה עומד להשתמש בו בנפרד:

קוד:
using std::cout; using std::cin;


אבל אם אתה מאד עצלן, אפשר להכניס פשוט את כל המשפחה (זה קצת פחות רצוי כי יכנסו המון דברים שאתה כנראה לא תרצה):
קוד:
using namespace std;

---

חוץ מהעובדה שהספריות של ++C קצת שונות מ-C משהו אחד זהה: פונק' ה-main היא פונק' מטיפוס INT, לא VOID!
היא מחזירה ערך למערכת ההפעלה (בד"כ 0).

קוד:
int main()


איתחול המשתנים שלך הוא גם ברוח ה-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 לחלוטין מיותר:
קוד:
if (flag==0)

זה אומר שהמשפט יודפס רק אם יקלטו כל 50 המספרים?
למה..?
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 22:18

הדף נוצר ב 0.04 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר