עבור לתוכן

חיפוש בינארי על שורה ראשונה במטריצה C

Featured Replies

פורסם

אהלן,

אני מנסה לעשות חיפוש בינארי על שורה ראשונה בטריצה C(השורה הראשונה כבר ממויינת).

משום מה זה לא עובד ואני לא מבין למה:


main CALL:
Search(C,cols);


fucntion:

void Search(int C[][],int cols)
{
int x;
int low=0,mid,high;
printf("Please enter an integer for search:\n",x);
scanf("%d",&x);
high=cols-1;
while(low<=high)
{
mid=(low+high)/2;
if(x<C[mid])
high=mid-1;
else
if(x>C[mid])
high=mid+1;
else
if(x==mid)
printf("%d",mid);
}
printf("No matches found\n");
}

errors:



Error 7 error C2040: '<' : 'int' differs in levels of indirection from 'int [1]' c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 188
Error 9 error C2040: '>' : 'int' differs in levels of indirection from 'int [1]' c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 191
Error 5 error C2087: 'C' : missing subscript c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 178
Error 6 error C2446: '<' : no conversion from 'int *' to 'int' c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 188
Error 8 error C2446: '>' : no conversion from 'int *' to 'int' c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 191
Error 10 error C2664: 'Search' : cannot convert parameter 1 from 'int [10][15]' to 'int [][1]' c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 283
11 IntelliSense: an array may not have elements of this type c:\users\offir\documents\visual studio 2010\projects\tar33\tar33\amir.cpp 178

פורסם

אם C הוא מערך דו מימדי, אז מה זה [C[mid?

איך ניגשים לאיברים מהשורה הראשונה במערך דו מימדי?

פורסם
  • מחבר

לא שמתי לב...

אבל אני לא מבין דבר פשוט.בקריאה אני קורא למטריצה אבל אני רוצה לקבל כמערך את הראושנה..

אני חותר לדבר הבא:

אם בקריאה לפונרציה הייתי כותב C[0] הייתי מקבל את השורה הראשונה כמערך ועובד עליה בלי בעיה...

אבל המגבלה שלי שאסור לי לגעת בMain.

אז כל פעם אני אצטרך לעשות [cols ][0] כדי לעבוד על העמודות?

פורסם
  • מחבר

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

הנה הפונקציה המתוקנת...





void Search(int C[][MAX_COLS],int cols)
{
int x=0;
int low=0,mid,high;
printf("Please enter an integer for search:\n",x);
scanf("%d",&x);
high=cols-1;
while(low<high)
{
mid=(low+high)/2;
if(x<C[0][mid])
high=mid-1;
else
if(x>C[0][mid])
high=mid+1;
else
printf("%d",mid);
}
printf("No matches found\n");
}




פורסם
  • מחבר

הקפצה

פורסם

א. כתוב פונקציה שעושה חיפוש בינארי על מערך חד מימדי של אלמנטים, תדבג אותה ותוודא שהיא עובדת נכון.

ב. אח"כ מתוך הפונקציה שמחפשת במטריצה, תעביר אליה את השורה הראשונה שכתבת בא'

חיפוש בינארי הוא על אוסף ("חד מימדי") ממויין של אלמנטים. מערך דו מימדי ("מטריצה") לא נוגעת ישירות לעניין, לכן מוטב לפרק את הבעיה לשניים כמו שהצעתי למעלה.

פורסם
  • מחבר

לא הבנתי אותך נכון...

תראה:


void Search(int C[Max_Cols],int cols)

מן הסתם שזה יתן לי שגיאת קומפילציה כי הוא לא יכול להמיר את זה ממטריצה למערך.

וזה בדיוק מה ששניצל הסביר לי-בCALL מהMAIN אתה מבקש מטריצה אז בפונקציה תקבל מטריצה אבל תעבוד רק על השורה הראשונה וזה מה שהעלאתי בהמשך השרשור אבל זה לא עובד.....

פורסם

שורה במטריצה = מערך חד מימדי. אין בעיה להעביר אותה כפרמטר לפונקציה, דהיינו:

Search(c[0], cols);

פורסם
  • מחבר

נכון!,אבל ההגבלה שאני לא יכול לשנות את הmain דהיינו אני לא יכול לשנות את:


Search(C,Cols)

רק בגלל זה אני מסתבך..

פורסם

אז תשמור את השורה הראשונה של המטריצה במשתנה עזר בצד, ואז תשתמש רק בו.

פורסם
  • מחבר

וואלה,לא חשבתי על זה,כבר אעדכן.

פורסם
  • מחבר

טוב זה כבר ממש מוזר..

עשיתי מערך עזר שקיבל מהמטריצה את השורה הממוינת..

עובד מעולה אבל שוב באיטרציה השנייה של ה while(כשאני מדבאג את התכנית) הלולאה עובדת אבל אין הכנסת ערכים.

ז"א אני לוחץ F10 הלולאה רץ על התנאי הקודם כל הזמן ואני לא מבין למה..

יכול להיות נגמר הזיכרון במחסנית?

פורסם
  • מחבר

צירפתי תמונה אולי זה ייתן אינדיקציה יותר טובה למה הבעיה

http://imageshack.us/f/593/omer.jpg/

פורסם

תסתכל על הקוד שלך, לך step by step, תסתכל על ערכי המשתנים בכל שלב, עד שתמצא מה הבעיה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים