עבור לתוכן

שלום. שאלה ב c++.

Featured Replies

פורסם

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

בכל אופן ניסיתי לקחת את המערך המקורי(orig)(הסתפקתי בשמונה איברים בינתיים) ולסדר אותו לפי האיבר הראשון בכל זוג, כך שיווצר מערך חדש (new1) שיכיל אותם איברים אבל הם יסודרו בזוגות לפי הראשון בכל זוג, בקובץ המצורף לדוגמה -

3,4 2,9 1,7 0,8.

לא הצלחתי עדיין. אולי אתם תבינו מה הבעיה.

פורסם

נסה להסביר בצורה יותר ברורה מה אתה רוצה לעשות

פורסם
  • מחבר

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

למשל : 2,6 0,9 3,1 1,7 .

האיברים השמאליים בכל זוג הם סדרה מ-0 ועד 3, ולכן המערך החדש צריך להיות:

0,9,1,7,2,6,3,1 .

כלומר אותם איברים אבל מסודרים (תוך שמירה על הזוגות) מ-0 עד 3.

מקווה שהבהרתי את עצמי. (צרפתי גם קובץ בהודעה המקורית)

פורסם

void give(int new1[x], int orig[y])

{

new1[x] = orig[y];

new1[x+1] = orig[y+1];

}

int main()

{

int orig[8]={ 2,9 , 0,8 , 1,7 , 3,4};

int new1[8];

int a,b,t;

int x,y;

for(a=0; a<4; a++)

for(b=0; b<7; b+2)

if(a==orig)

{

t=2*a;

give(new1[t], orig);

}

cout<<new1;

return(0);

}

well, i program in delphi at work and dont remember c++ syntax that well but i think you'll get a compiltaion error on give(new1[t], orig) the function give expects an array but u send an integer (one cell of new and one cell of orig).

another thing is i dont think you can declare a function like this: void give(int new1[x], int orig[y])

the complier will give an error because you try to make two arrays with sizes defined by the variables x and y who's size is yet unknown.......

to sum it up, if i found 2 errors in 1 minute and as i said before my c++ is REALLY rusty you probably got a lot more.... those errors show a basic misunderstanding of c++ basics....

פורסם
  • מחבר

I really thank you! :bash:

Never mind, I Know that I am a begginer but I want to solve this problem anyway.

About the size of the array I am quite sure that you are wrong since in the declaration of the array I write orig[8] and 8 as far as I know is not a variable.

But I don't know how to call the function correctly, if what you're saying is right.

Hoping for different responses...

פורסם
  • מחבר

חוץ מזה הפונקציה לא מצפה לשום מערך! בשביל שתצפה למערך לא שמים בכלל את הסוגריים המרובעים!

פורסם

void give (int arr1[], int arr2[], int i, int j)

{

arr1=arr2[j];

arr1[i+1]=arr2[j+1];

}

int main()

{

int orig[8]={2,9,0,8,1,7,3,4}

int new[8];

int i,j;

for(i=0;i<4;i++)

for(j=0;j<8;j+2)

if(i==orig[j])

give(new,orig,2*i,j)

}

as for printing to screen you cant do it with a simple cout as far as i remember... it will print the address of the array or something... you need a loop (for, while etc) to print it cell by cell....

פורסם
  • מחבר

אולי מישהו יכול לנסות בכל זאת?

פורסם

אממ...... ניסית את הקוד שכתבתי?

פורסם
  • מחבר

כן. אמנם ניתן לבצע קומפילציה אבל התכנית עצמה לא עובדת (נתקעת) וחייבים להפסיק אותה עם ctrl+break.

פורסם

זה ב C ולא ++C אבל עושה את העבודה יופי !

#include <stdlib.h>

int sort_function( const void *a, const void *b)

{

return( (pair *)a->first - (pair *)b->first );

}

int main(void)

{

pair nums[4] = { {0,8} , {1,7} , };

qsort((void *)nums, 4, sizeof(pair), sort_function);

}

פורסם

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

חוץ מזה אפילו לא הסתכלתי אם באמת הפונקציה עושה מה שהיא אמורה לעשות

אבל התוצאה יצאה נכון אז כנראה שהיא עובדת:)

אם לא ברור לך משהו ממה ששיניתי, רק תגיד, אני אשמח להסביר...

#include <iostream.h>

void give(int *x, int *y)

{

*x = *y;

*(x+1) = *(y+1);

}

int main()

{

int orig[8]={ 2,9 , 0,8 , 1,7 , 3,4};

int new1[8];

int a,b,t;

for(a=0; a<4; a++)

for(b=0; b<7;)

      {

if(a==orig)

{

t=2*a;

give(new1+t, orig+b);

}

         b=b+2;

      }

   for(int i=0;i<8;i++)

      cout<<new1;

return(0);

}

פורסם
  • מחבר

קודם כל תודה רבה! :jump:

לגבי הפתרון שהוצע ב- c לצערי אני לא מכיר את רוב הפקודות שם.

אבל אריאל, אליך יש לי שתי שאלות:

- בלולאת for השנייה (הפנימית) מה המשמעות של להשאיר את המקום של גודל הקפיצה ריק (כמו שעשית), ומדוע לא יכולת

לשים שם את ה - b=b+2 ?

- לי זה נראה כאילו ערבבת פוינטרים ומערכים. הכרזת על מערכים והפונקציה משתמשת בפוינטרים. את זה אני לא מבין.

ושוב תודה רבה לכל מי שענה וניסה לענות עד שהגענו לפתרון!

פורסם

אז ככה קודם כל בבקשה :)

עכשיו בקשר לשאלה הראשונה, האמת אין לי מושג, לא זכרתי אם אפשר אחרי ; לרשום b=b+2 ועכשיו כשאני חושב על זה (בלי שבדקתי) אין שום סיבה שזה לא יעבוד גם ככה, וזה שהשארתי את זה ריק זה אומר שפשוט לא יעשה כלום בתיבה ההיא:) , אני מקווה אבל ששמת לב שהוספתי b=b+2 בסוף...

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

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

כלומר כשהגדרת מערך arr בגודל 10 אז arr עצמו הוא בעצם פויינטר למקום הראשון, כלומר:

האיבר הראשון הוא arr[0] = *(arr + 0) = *arr

ובעצם תחילת המקום בזיכרון שבוא נמצא המערך הוא: arr = &arr[0] = arr + 0

באופן דומה לחלוטין המקום ה10 במערך שווה ל: arr[10] =*(arr + 10)

והמקום בזיכרון שבוא נמצא האיבר העשירי הוא: arr[10] = arr + 10

אז בעצם את הפונקציה:

void give(int *x, int *y)

{

*x = *y;

*(x+1) = *(y+1);

}

ניתן לכתוב ככה:

void give(int *x, int *y)

{

x [ 0 ] = y [ 0 ];

x[ 1 ]= y[ 1 ];

}

וזה יהיה נכון בדיוק בגלל מה שניסיתי להסביר מקודם (בתקווה שהצלחתי)

פורסם
  • מחבר

מסובך... :o

1. איך יכול להיות שכשאתה כותב למשל [0]x אין הכוונה לאיבר מסויים במערך אלא הוא משתנה בהתאם ל - t ו- b ?

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

ארכיון

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

דיונים חדשים