עבור לתוכן

עזרה במערך דו מימדי בC

Featured Replies

פורסם
  • מחבר

אני יתקן את הGOTO לבד..

אני עכשיו מוריד אותו.....

פורסם

יש לך פה לא מעט טעויות :)

if (cheak[c]=x) צריך להיות == (בדיקת שוויון ולא הצבה)

cheak(i*total+j)=x; צריך להיות עם סוגריים מרובעים

אתה יודע שאתה יכול לעשות מארך חד מימדי בגודל M*N במקום לעשות מארך של מצביעים שמצביעים למארכים בדיוק כמו שיצרת את check?

פשוט בשביל לגשת לאיבר i,j תצטרך לגשת לאיבר i*M+j או משהו בסיגנון

עריכה - להבא modify.gif

פורסם
  • מחבר

זה התוכנית אני עכשיו יריץ אותה אם יהיו טעוית אני יבדוק בכל אופן זה ללא הGOTO

#include <stdio.h>

#include <alloc.h>

#include <stdlib.h>

void main()

{

int i,total,j,x,c,stop;

int **line,*cheak;

randomize();

printf("please insert the line of the riboa");

scanf("%d",&total);

line=(int**)malloc(total*sizeof(int*));

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

line=(int*)malloc(total*sizeof(int));

cheak=(int*)calloc(total*total,sizeof(int));

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

for(j=0;j<total;j++)

  {

x=random(total*total+1);

  for(c=0;c<(i*total+j);c++)

    if (cheak[c]==x)

      stop=1;

  if (stop==1)

   {

    J--

break;

   }   

  else

   {

     line[j]=x;

     cheak[i*total+j]=x;

   }

  }

}

האם יש איזה דברים מוסכמים מראש בערך לדבי הסידור של התוכנית רווחים וכאלה...האם FOR שמים קדימה ואת הפקודות הפנימיות האם לשים רווח ....אני פשוט מעט מסתבך עם כל הרווחים בשביל שזה יראה מסודר..

פורסם

בשביל מה ה-stop הזה בכלל?

אם אתה עושה j-- אחרי break אתה בחיים לא תגיע לפקודה הזאת

בכלל כל ה-stop מיותר, במקום לעשות stop=1 אתה יכול ישר לעשות

j--; braek;

אם אתה מתעקש לעשות stop אתה חייב לאפס אותו כל פעם.

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

פורסם
  • מחבר

לא ראיתי את ההודעה שלך וכבר תיקנתי

פורסם
  • מחבר

לא ראיתי את ההודעה שלך וכבר תיקנתי

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

התכוונתי לעשות עריכה אבל בטעות עשיתי צטט/

אני עכשיו ישנה את זה לWHILE ......

ורעיון נחמד מה שאמרת עם המערך החד מימדי.....

פורסם
  • מחבר

טעותתתתתתתתתתתת

פורסם

תראה, אני מנסה לא להפוך את הפורום הזה לפורום debuging.

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

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

כשיש לך קוד סופי אם יש לך עוד בעיות או שאלות תכתוב פה.

פורסם
  • מחבר

הקוד הזה הוא לא סופי אבל הוא לא מבצע מה שהוא אמור לעשות.............

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

לדוגמא לקלט 3 אני יקבל משהו כמו........

8 6 4

5 1 3

2 7 9

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

#include <stdio.h>

#include <alloc.h>

#include <stdlib.h>

void main()

{

int i,total,j,x,c,h;

int **line,*cheak;

randomize();

printf("please insert the line of the riboa\n");

scanf("%d",&total);

line=(int**)malloc(total*sizeof(int*));

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

line=(int*)malloc(total*sizeof(int));

cheak=(int*)calloc(total*total,sizeof(int));

j=0;

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

while (j<total)

{

x=random(total*total+1);

c=0;

h=0;

while(c<total*total)

if (cheak[c]==x || c==(i*total+j))

{

h=c;

c=total*total;

}

else

c++;

if (cheak[h]!=x)

{

line[j]=x;

cheak[i*total+j]=x;

j++;

}

}

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

{

for(j=0;j<total;j++)

printf("%d ",line[j]);

printf("\n");

}

free(line);

free(cheak);

}

פורסם

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

כל המשחק עם c=total*total בשביל לעצור את הלולאה פשוט מכוער, למה לא לעשות break?

למה c לא הולך מראש עד i*total+j במקום total*total?

השימוש שלך ב-check גם די מעפן, למה שלא תעשה אותו מארך שמקבל 0 או 1?

check שווה 0 אם לא השתמשת עדיין במספר i

check שווה 1 אם השתמשת כבר במספר i

עריכה -

יעזור אם תיישר את הקוד כמו שצריך, הוא יהיה הרבה יותר קריא

הנה כמה תיקונים, אני לא בטוח אם הכל עובד עכשיו

#include <stdio.h>

#include <alloc.h>

#include <stdlib.h>

void main()

{

int i,total,j,x,c,h;

int **line,*cheak;

randomize();

printf("please insert the line of the riboa\n");

scanf("%d",&total);

line=(int**)malloc(total*sizeof(int*));

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

line=(int*)malloc(total*sizeof(int));

cheak=(int*)calloc(total*total,sizeof(int));

j=0;

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

while (j<total)

{

x=random(total*total+1);

while(c=0;c<i*total+j;c++)

if (cheak[c]==x)

break;

if (c!=total*total && cheak[c]!=x)

{

line[j]=x;

cheak[i*total+j]=x;

j++;

}

}

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

{

for(j=0;j<total;j++)

printf("%d ",line[j]);

printf("\n");

}

free(line);

free(cheak);

}

פורסם
  • מחבר

אוקיי מה שרה זה שפשוט התבלבלתי בין הפקודות חשבתי שBREAK מפסיק רק את הסיבוב הנוכחי....

C הולך עד i*total+j בשביל יעילות למה לסרוק בפעם החמישית את כל המערך שהוכנסו רק ארבע מספרים.

ההצעה האחרונה שלך עם הCHEAK טובה אני יעשה אותה אחרי שאני יראה שהתוכנית הזאת תעבוד...

בכל אופן המהדר לא מאשר את התוכנית יש בה שלוש שגיאות...וכולם באותה שורה של הWHILE השני

פורסם

מין הסתם כי זה צריך להיות for ולא while

פורסם
  • מחבר

מין הסתם כי זה צריך להיות for ולא while

אני פשוט ממש חדש בשפה וגם לא ממש משקיע.....

ובאמת שראיתי שהבאת לי WHILE זה נראה לי מאוד מוזר כי לא ראיתי כזה דבר..

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

אז איך אני סוף סוף יזכה לראות ריבוע יפה...

פורסם

טעות אחת קטנה

אחרי שעברת עם j מ-for ל-while שכחת לאפס את j בתחילת כל לולאה ואיתחלת אותו רק פעם אחת בהתחלה

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

#include <stdio.h>

#include <stdlib.h>

#include <stdlib.h>

void main()

{

int i,total,j,x,c;

int **line,*cheak;

randomize();

printf("please insert the line of the riboa\n");

scanf("%d",&total);

line=(int**)malloc(total*sizeof(int*));

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

line=(int*)malloc(total*sizeof(int));

cheak=(int*)calloc(total*total,sizeof(int));

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

{

for(j=0;j<total;)

{

x=random(total*total+1);

for(c=0;c<i*total+j;c++)

if (cheak[c]==x)

break;

if (c!=total*total && cheak[c]!=x)

{

line[j]=x;

cheak[i*total+j]=x;

j++;

}

}

}

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

{

for(j=0;j<total;j++)

printf("%d ",line[j]);

printf("\n");

}

free(line);

free(cheak);

}

השינוי היחיד הוא שעברתי ל-for במקום while ודגאתי לאפס את j ב-for הזה. שים לב שאני לא מקדם את j בפקודה עצמה של ה-for אלה רק במקרה הצורך בהמשך

פורסם
  • מחבר
טעות אחת קטנה

אחרי שעברת עם j מ-for ל-while שכחת לאפס את j בתחילת כל לולאה ואיתחלת אותו רק פעם אחת בהתחלה

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

כל תוכנית בסופו של דבר לא עובדת בגלל טעויות "קטנות"...............

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

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

ארכיון

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

דיונים חדשים