עזרה במערך דו מימדי בC - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


THE-MASTER

Recommended Posts

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

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

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

ובאמת שראיתי שהבאת לי 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(זה קשה-הרבה טכניקה).

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

ארכיון

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

×
  • צור חדש...