איך להגדיר פונקציה ב-C++ שמקבלת מספר שלם, ויוצרת מערך בגודל אותו מספר שהיא קיבלה - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

איך להגדיר פונקציה ב-C++ שמקבלת מספר שלם, ויוצרת מערך בגודל אותו מספר שהיא קיבלה


assaf990

Recommended Posts

  • תגובות 39
  • נוצר
  • תגובה אחרונה

לבנות מערך מהצורה הזו

1 בריבוע

2 בריבוע

3 בריבוע

.

.

.

N בריבוע

פחות חשוב:

ובגדול השאלה שלי היא זו:

נתונה כותרת הפונקציה check הבאה:

int check(int a[], int n, int m)

הפונקציה מקבלת מערך aשל מספרים שלמים, את אורכו n ומספר שלם m.

ידוע שהמערך a ממוין בסדר לא יורד.

הפונקציה עונה על השאלה הבאה:

האם המערך a מכיל את כל האיברים של הקבוצה (ההיא שציינתי לעיל) אם כן הפונקציה מחזירה 1 אחרת מחזירה 0.

השלם את גוף הפונקציה.

קישור לתוכן
שתף באתרים אחרים

טוב, בדרך הקלה אתה באמת צריך להשתמש במערך בגודל m.

אין לי מושג איך לימדו אתכם לעשות את זה (new או malloc), אבל אבל בעצם יש לך מערך בגודל n שאתה יכול להשמש בו (אם m גדול מ- n אז יש לך חיים עוד יותר קלים)

קישור לתוכן
שתף באתרים אחרים

אוקי, יש שתי דרכים:

דרך ראשונה היא לעשות לולאה חיצונית שעוברת מ-1 עד m, ובודקת עבור כל ערך אם הריבוע שלו מופיע במערך a (באמצעות עוד לולאה).

הדרך הזו לא יעילה - (O(n^2, אבל היא אינה דורשת .

הדרך השנייה היא להקצות מערך בוליאנים בגודל m, כך:


bool *b = new bool[m];

ולאפס את כולו. אח"כ עוברים על a, ומסמנים את התאים שעוברים עליהם - נניח, אם מופיע ב-a המספר 9, נסמן true בתא השלישי ב-b (תא מספר 2, כמובן, כי הספירה מתחילה מ-0).

אח"כ אתה צריך לבדוק שכל התאים ב-b מכילים true.

חשוב: אחרי שסיימת, לפני שיוצאים מהפונקציה, חייבים למחוק את המערך b, אחרת הוא נשאר בזכרון:


delete b;

קישור לתוכן
שתף באתרים אחרים

אוקי, יש שתי דרכים:

דרך ראשונה היא לעשות לולאה חיצונית שעוברת מ-1 עד m, ובודקת עבור כל ערך אם הריבוע שלו מופיע במערך a (באמצעות עוד לולאה).

הדרך הזו לא יעילה - (O(n^2, אבל היא אינה דורשת .

הדרך השנייה היא להקצות מערך בוליאנים בגודל m, כך:


bool *b = new bool[m];

ולאפס את כולו. אח"כ עוברים על a, ומסמנים את התאים שעוברים עליהם - נניח, אם מופיע ב-a המספר 9, נסמן true בתא השלישי ב-b (תא מספר 2, כמובן, כי הספירה מתחילה מ-0).

אח"כ אתה צריך לבדוק שכל התאים ב-b מכילים true.

חשוב: אחרי שסיימת, לפני שיוצאים מהפונקציה, חייבים למחוק את המערך b, אחרת הוא נשאר בזכרון:


delete b;

אם כבר אז


delete[] b;

קישור לתוכן
שתף באתרים אחרים

אתה יכול להוריד ספרייה שמוסיפה את הפונקציה ל-C++

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

עכשיו אני -

מה?!

אתה בטוח שאתה יודע על מה אתה מדבר?

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

ב- C++ אתה לא יכול בשום אופן להגדיר על ה- stack מערך בגודל שלא קבוע בזמן הקומפילציה.

אבל כמו שכבר אמרו קודם - אין שום בעיה להקצות אותו על ה- heap בעזרת new או malloc.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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


×
  • צור חדש...