עבור לתוכן

עזרה בתרגיל בC - מטריצות

Featured Replies

פורסם

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

1 | 2 | 3| 4 | 5 | 6 |7

24|25|26|27|28|29|8

23|40|41|42|43|30|9

22|39|48|49|44|31|10

21|38|47|46|45|32|11

20|37|36|35|34|33|12

19|18|17|16|15|14|13

בעיקרון אכפת לי מהיעילות ומהדרך עצמה.

פורסם

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

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

פורסם

אתה יכול לפתור את השאלה עם לופ ו- counter שבתוכו יש ארבעה for-ים שיבנו את הצלעות של המרובע, כך שכל פעם הצלע קטנה.

התרגיל הוא משחק עם האינדקסים של המטריצה.

פורסם

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

פורסם

היה לי קצת זמן לשחק עם זה (נראה לי שפותח הדיון לא יחזור).

איך היית הופך את התוכנית לפחות מסורבלת ?

#include <stdio.h>
#define N 7

int main () {

int matrix[N][N];
int counter = 1;

for (int i = 0 ; i < (N+1)/2 ; i++) {

for (int j = N-i-1; j > i; j--) // upper line
matrix[j][i] = counter++;
for (int j = i ; j < N-i ; j++) // left line
matrix[i][j] = counter++;
for (int j = i+1 ; j < N-i ; j++) // bottom line
matrix[j][N-i-1] = counter++;
for (int j = N-i-2; j > i ; j--) // right line
matrix[N-1-i][j] = counter++;
}

for (int j = 0 ; j < N ; j++) { // print matrix
for (int i = 0 ; i < N ; i++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}

return 0;
}

פורסם

אפשר לעשות את זה בלולאת while אחת. מאתחלים את המטריצה ל0 וממלאים אותה במסלול ספירלי לפי אלמנט עולה.

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

עוצרים כשהאלמנט הנוכחי שווה לN*N.

#include <stdio.h>
#define N 7


int main () {
int i = 0, j = 0, tmp;
int d_i = 1, d_j = 0, count = 0, matrix[N][N] = {0};
while (count != N*N) {
matrix[i][j] = ++count;
/* advance */
i += d_i;
j += d_j;
if (i == N || j == N || matrix[i][j] != 0){ /* reached end of matrix or nonzero element */
/* step back */
i -= d_i;
j -= d_j;
/* turn left */
tmp = d_i;
d_i = - d_j;
d_j = tmp;
/* advance */
i += d_i;
j += d_j;
}
}
/* print matrix */
for (j = 0 ; j < N ; j++) {
for (i = N-1 ; i >= 0 ; i--) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
return 0;
}

ארכיון

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

דיונים חדשים