תוכנית עוברת קומפילציה ולא פועלת נכון - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


SpiritKnight

Recommended Posts

שלום,

התכנית הנ"ל אמורה להרגיל מספרים בין -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;
}
}
}

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

ארכיון

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

×
  • צור חדש...