הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   עזרה ב-C - מטריצה (https://hosts.co.il/forums/showthread.php?t=69170)

Xinxy 05-11-08 20:44

עזרה ב-C - מטריצה
 
שלום,
אני צריך לעשות מטריצת אותיות 5X5 שזה יהיה בעצם תפזורת וצריך לחשב בה את מספר המופעים של מילה מסויימת בתפזורת, המופע הזה יכול להיות מלמעלה, מלמטה, ימין, שמאל

לדוגמא:
A B A G I
C A M P U
M B O Y R
Z A O Z U
U R U B C

נגיד זה יבקש ממני את השורה הראשונה אז יהיה רשום
ABAGI
בשורה השניה:
CAMPU
שלישית:
MBOYR
רביעית:
ZAOZU
חמישית:
URUBC

ואז אם נגיד אני ירשום שזה יחפש כמה פעמים המילה URU או ABA מופיעה זה יגיד לי שתיים

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

HELP ME :-/

daMn 05-11-08 20:48

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

Xinxy 05-11-08 21:01

ציטוט:

נכתב במקור על ידי daMn (פרסם 679686)
יש לי רעיון, אני לא יודע עד כמה הוא יעיל אבל גם רעיון.
תבצע לולאה שתעבור על כל המטריצה ותבדוק אם האות הנוכחית(i) שווה לאות הראשונה במילה המבוקשת,
אם שווה תמשיך לבדוק מכל צד(למעלה, למטה , ימין ושמאל) אם האות הבאה שווה לאות השנייה של המילה המבוקשת, אם כן תמשיך רקורסיבית(יש לדאוג לבדיקה של מספר אותיות).
אם לא שווה להמשיך לרוץ על הלולאה.

סיבכת אותי :S
ואם הבנתי נכון אז זה נראה לי קצת בעיה לבדוק מילה כי אם אני יקיש מחרוזת אז זה לא יסתדר
ולפי מה שאני יודע אי אפשר להשוות מחרוזות בC

daMn 05-11-08 21:05

ציטוט:

נכתב במקור על ידי Xinxy (פרסם 679694)
סיבכת אותי :S
ואם הבנתי נכון אז זה נראה לי קצת בעיה לבדוק מילה כי אם אני יקיש מחרוזת אז זה לא יסתדר
ולפי מה שאני יודע אי אפשר להשוות מחרוזות בC

לא דיברתי על השוואת מחרוזת...דיברתי על השוואת תווים.
אני לא בטוח איך זה בC אבל בוא אני אתן דוגמא.
קוד:

str = "test";
print str[0]; // will print t
print str[2]; // will print 2

ואז אתה משווה את הראשון לתו שאתה מקבל בלולאה.

Jerba 05-11-08 21:40

רוץ פעם על השורות ופעם על העמודות ותחפש...לא כזה קשה..
יש אלכסונים גם? אם לא אז זה יחסית פשוט..

Xinxy 05-11-08 21:42

ציטוט:

נכתב במקור על ידי Jerba (פרסם 679716)
רוץ פעם על השורות ופעם על העמודות ותחפש...לא כזה קשה..
יש אלכסונים גם? אם לא אז זה יחסית פשוט..

לא אין אלכסונים
ואיך לרוץ על העמודות?

SDF 05-11-08 22:56

אחריי שתסיים יש לי קוד בשבילך, נשווה.

ובנתיים:
איך רצים לפי שורות:
קוד:

int i, j;
for (i = 0; i < MATRIX_SIZE; i++)
{
 for(j = 0; j < MATRIX_SIZE; j++)
  printf("%c\t", matrix[i][j]);
 printf("\n");
}

זה כמובן מדפיס את המטריצה, אם אתה על GCC, אתה יכול לשים sleep אחריי ה printf ותראה שהוא הולך לפי שורות.
בשביל ללכת לפי עמודות, אתה צריך:
matrix[j][i]
להחליף את האינדקסים, שים לב שאתה לא חורג מגבולות מערך אם יש לך מטריצה לא ריבועית.

Xinxy 05-11-08 23:13

ציטוט:

נכתב במקור על ידי SDF (פרסם 679744)
אחריי שתסיים יש לי קוד בשבילך, נשווה.

ובנתיים:
איך רצים לפי שורות:
קוד:

int i, j;
for (i = 0; i < MATRIX_SIZE; i++)
{
 for(j = 0; j < MATRIX_SIZE; j++)
  printf("&#37;c\t", matrix[i][j]);
 printf("\n");
}

זה כמובן מדפיס את המטריצה, אם אתה על GCC, אתה יכול לשים sleep אחריי ה printf ותראה שהוא הולך לפי שורות.
בשביל ללכת לפי עמודות, אתה צריך:
matrix[j][i]
להחליף את האינדקסים, שים לב שאתה לא חורג מגבולות מערך אם יש לך מטריצה לא ריבועית.

מגניב לא חשבתי על דבר כזה
מה שעשיתי היה:
קוד:

for(i = 0; i < 5; i++)
 {
        printf("%c ", a[0][i]);
 }
 
 printf("\n");

 for(i = 0; i < 5; i++)
 {
        printf("%c ", a[1][i]);
 }

 printf("\n");

 for(i = 0; i < 5; i++)
 {
        printf("%c ", a[2][i]);
 }

 printf("\n");

 for(i = 0; i < 5; i++)
 {
        printf("%c ", a[3][i]);
 }

 printf("\n");

 for(i = 0; i < 5; i++)
 {
        printf("%c ", a[4][i]);
 }

 printf("\n\n");

עריכה:
יש לי עוד בעיה
ביינתים עשיתי את הקוד הזה:
קוד:

#include <stdio.h>
#define ROW 4
#define COL 4
#define MATRIX_SIZE 5

int main ()
{
 char a[ROW][COL];
 int i, j;
 char forCheck[4];
 for(i = 0; i < 5; i++)
 {
        printf("row %d: ", i + 1);
        scanf("%s", a[i]);
 }


 for (i = 0; i < MATRIX_SIZE; i++)
 {
        for(j = 0; j < MATRIX_SIZE; j++)
        {
                printf("%c ", a[i][j]);
        }
        printf("\n");
 }
}

וכשאני מריץ אותו התוכנה VISUAL C++ אומרת לי:
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
איך אפשר לסדר את זה?

עריכה שוב:
שוב אני מנסה עכשיו לעשות את הבדיקה אבל אני פשוט לא יודע איך להתחיל
חשבתי אולי לעשות בדיקה על כל אות ז"א a[0], a[1], a[2], a[3], a[4]
אבל זה יהיה מטורף אני יצתרך איזה 200 לולאות FOR נראה לי
מה אתם אומרים יש דרך יותר קצרה אולי?

SDF 05-11-08 23:30

טעית בגדולים
char a[MATRIX_SIZE][MATRIX_SIZE]

Xinxy 05-11-08 23:34

ציטוט:

נכתב במקור על ידי SDF (פרסם 679759)
טעית בגדולים
char a[MATRIX_SIZE][MATRIX_SIZE]

אופס נכון, טיפש אני :\

עריכה:
הצלחתי להגיע לדבר כזה:
קוד:

C:\C>matrix.exe
row 1: aaaaaaaaaa
row 2: zzzzzzzz
row 3: xxxxxxxxx
row 4: cccccccc
row 5: vvvvvvvv
a a a a a
z z z z z
x x x x x
c c c c c
v v v v v
your word:az
az appears 10 times

הבעיה פה היא שזה בודק כמה פעמים a מופיעה וכמה z מופיעה ואני לא יודע איך אני יעשה שאם זה ימצא את האות a אז זה יחפש אותה עם הצירוף z
זה הקוד שעשיתי:
קוד:

for(i = 0; i < MATRIX_SIZE; i++)
 {
      for(j = 0; j < MATRIX_SIZE; j++)
      {
            for(z = 0; z < howmany + 1; z++)
            {
                  if(forCheck[z] == a[i][j])
                  {
                      ok++;
                  }
            }
           
      }
 }

למישהו יש רעיונות? :\


כל הזמנים הם GMT +2. הזמן כעת הוא 22:12.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ