עבור לתוכן

תוכנית עוברת קומפילציה ולא פועלת נכון

Featured Replies

פורסם

שלום,

התכנית הנ"ל אמורה להרגיל מספרים בין -10 ל+10 לתוך מטריצה של 6x5, כשהזוגיים בהתחלה והאי זוגיים בסוף. הקומפיילר אומר שהתוכנית תקינה, אך היא לא מבצעת את המשימה כמו שצריך!

רעיונות?

	#include <stdio.h>
#include <stdlib.h>
#define rowsize 6
#define colsize 5

void main ()
{
int row,col,mat[rowsize][colsize],num;
randomize ();

for(row=0;row<rowsize;row++)
{
for(col=0;col<colsize;col++)
{
num=random(20)-10;
if(num%2==0)
mat[row][col]=num;
else mat[rowsize-1-row][colsize-1-col]=num;
}
}
for(row=0;row<rowsize;row++)
{
for(col=0;col<colsize;col++)
printf("%d",mat[row][col]);
}
}

פורסם

השיטה שאתה משתמש לא מי יודע מה טובה.

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

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

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

פורסם
  • מחבר

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

פורסם

אה...אני חשבתי שזה צריך להיות 15 זוגיים ואחרייהם 15 אי זוגיים.

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

עכשיו במקום שתי לולאות, אתה פשוט יכול להעביר את משתנה הספירה לבסיס 6 או בסיס 5(תלוי אם המטריצה שוכבת או עומדת).

כמובן שאפשר גם בשיטה של למלא זוגיים מההתחלה ולמלא אי זוגיים מהסוף אבל אז אתה לא שולט בכמה מספרים זוגיים/אי זוגיים יש לך. איך שבא לך. אני אוהב את השיטה הראשונה

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

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

פורסם

אז תעשה בשיטה השנייה

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

פורסם

הבעיה שלך נובעת מזה שאתה לא דואג "לזכור" באיזה מקום היית מההתחלה ומהסוף.

מה הכוונה?

נניח שהמספר הראשון שהגרלת יצא זוגי - אז הוא ישב בתא 0,0.

המספר הבא שהגרלת יצא אי זוגי - אז הוא ישב בתא איפשהו בסוף.

המספר הבא יצא זוגי שוב - אז הוא ישב בתא 0,2.

שים לב שדילגת על תא 0,1.

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

אתה צריך להחזיק שני row ו-col - זוג אחד שמתחיל מ-0,0 ועולה (עבור המספרים הזוגיים) וזוג אחד שמתחיל מ-5,4 ויורד (עבור האי זוגיים).

וחוץ מזה אינדקס שרץ מ-0 עד 29 בשביל הלולאה עצמה.

פורסם

לדעתי, אתה צריך לאתחל את המטריצה עם מספר שלא הולך להיות אפשרי מפלט, כלומר -30 למשל....

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

אחרת, סיים.....

פורסם
  • מחבר

שניצל, עזרת מאוד!

גרסא מעודכנת:

#include <stdio.h>
#include <stdlib.h>
#define rowsize 2
#define colsize 3

void main ()
{
int row,col,row1,col1,row2,col2;
int mat[rowsize][colsize],num,count=0;
randomize ();

while(count<6)
{
num=random(2)+1;
printf("%d\n",num);
count++;
if(num%2==0)
{
for(row1=0;row1<rowsize;row1++)
for(col1=0;col1<colsize;col1++)
mat[row1][col1]=num;
}

else if(num%2!=0)
{
for(row2=rowsize-1;row2<=0;row2--)
for(col2=colsize-1;col2<=0;col2--)
mat[row2][col2]=num;
}
}
//test:
for(row=0;row<rowsize;row++)
for(col=0;col<colsize;col++)
printf("%d",mat[row][col]);
}

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

איך אני מתקדם מפה?

פורסם

לדעתי, אתה צריך לאתחל את המטריצה עם מספר שלא הולך להיות אפשרי מפלט, כלומר -30 למשל....

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

אחרת, סיים.....

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

פורסם

לא נראה כל כך יעיל מה שעשית שם.

תנסה:


int num, i1, i2, j1, j2, mat[rowsize][colsize];

for(i1=j1=0, j2=colsize-1, i2=rowsize-1;i1<i2 || i1==i2 && j1<=j2;)
{
num = random(20)-10;
if(num%2==0)
{
mat[i1][j1] = num;
j1+=1;
if(j1>=colsize)
{
j1=0;
i1+=1;
}
}

else
{
mat[i2][j2] = num;
j2-=1;
if(j2<0)
{
j2=colsize-1;
i2-=1;
}
}
}

פורסם
  • מחבר

לא הבנתי כ"כ מה עשית, אני חושב שאנחנו לא על אותה גרסא של C.

יש אפשרות שתוכל להטמיע את השינויים שלך לגרסא שלי?(בעמוד הקודם)

תודה.

פורסם

השתמשתי בANSI-C אותה גירסה.

אתה רק צריך להוסיף את הMAIN.

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

פורסם
  • מחבר

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

פורסם

רשמת RANDOMIZE בהתחלה?

ארכיון

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

דיונים חדשים