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

הוסטס - פורום אחסון האתרים הגדול בישראל (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++;
                  }
            }
           
      }
 }

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

SDF 06-11-08 00:13

לא ברור מכאן מה זה howmany.
ולמה הלולאה השלישית?

אני יכול לתת לך את הפתרון, השאלה אם זה מה שיעזור לך.

Xinxy 06-11-08 00:15

ציטוט:

נכתב במקור על ידי SDF (פרסם 679764)
לא ברור מכאן מה זה howmany.
ולמה הלולאה השלישית?

אני יכול לתת לך את הפתרון, השאלה אם זה מה שיעזור לך.

עשיתי את howmany כדי שאני ידע כמה מילים מכיל מה שהמשתמש רשם לחיפוש במתריצה
והלולאה השלישית כדי לבדוק אם האות נמצאת - לא אני לא מצליח לחשוב על משהו אחר :\

SDF 06-11-08 00:17

לא אמרת שמכניסים מילה אחת?

Xinxy 06-11-08 00:19

ציטוט:

נכתב במקור על ידי SDF (פרסם 679766)
לא אמרת שמכניסים מילה אחת?

אמ.. מילה אחת כמו lala :\

נראה לי שלא הסברתי טוב
עשיתי את howmany כדי שאני ידע כמה אותיות יש בדיוק במילה ואז לעשות עליה לולאה שתבדוק

עריכה:
אופס התכוונתי בהודעה הקודמת לכמה אותיות

SDF 06-11-08 00:27

אז אין צורך בפלוס אחד,
נניח ויש לך המילה ABA,
str[0] = A
str[1] = B
str[2] = A
סה"כ מילה בת 3 אותיות, כשהאינדקס האחרון הוא 2, אתה חורג שם מהגבול.

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

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

אם לא היה ברור, הנה ההתחלה של הפונקציה לחיפוש מילה:
קוד:

int searchMatrix(char **mat, int x, int y, char * what)
{
        int length = strlen(what);
        int i, j, whatIndex = 0;
        int foundCounter = 0;


Xinxy 06-11-08 00:43

ציטוט:

נכתב במקור על ידי SDF (פרסם 679770)
אז אין צורך בפלוס אחד,
נניח ויש לך המילה ABA,
str[0] = A
str[1] = B
str[2] = A
סה"כ מילה בת 3 אותיות, כשהאינדקס האחרון הוא 2, אתה חורג שם מהגבול.

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

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

אם לא היה ברור, הנה ההתחלה של הפונקציה לחיפוש מילה:
קוד:

int searchMatrix(char **mat, int x, int y, char * what)
{
        int length = strlen(what);
        int i, j, whatIndex = 0;
        int foundCounter = 0;


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

אהה ולא השתמשתי בstrlen בגלל שלא למדנו ואנחנו יכולים להשתמש רק בפונקציות שלמדנו

וד"א אני מודה לך על העזרה אני מעריך את זה מאוד

SDF 06-11-08 00:50

אז תכתוב strlen משלך =)
קוד:

int strlen( char* st)
{
 int count = 0;
 for ( ; *st ; st++) count++;
 return count;
}

ה + 1 מיותר, אם ה
VS
לא זורק שגיאה, זה עוד לא אומר שזה נכון.

Xinxy 06-11-08 00:56

ציטוט:

נכתב במקור על ידי SDF (פרסם 679775)
אז תכתוב strlen משלך =)
קוד:

int strlen( char* st)
{
 int count = 0;
 while (*ch) count++;
 return count;
}

ה + 1 מיותר, אם ה
VS
לא זורק שגיאה, זה עוד לא אומר שזה נכון.

אז זהו שגם בפונקציות אנחנו לא יכולים להשתמש כי לא למדנו
וד"א זה לא קשור לVS
הנה זה מה שעשיתי
קוד:

for(i = 0; i < 6; i++)
 {
      if(forCheck[i] > 6)
      {
              howmany = i + 1;
      }
 }

ואז בלולאה השלישית מה שעשיתי היה שאם הHOWMANY שווה ל4 אז שזה יעשה קטן מחמש כי רק אז זה יבדוק לי 4
(אני לא יכול להשתמש גם בגדול ושווה כי לא למדנו)

SDF 06-11-08 02:10

אתה לומד בתיכון?
מה ז"א לא יכול להשתמש כי לא למדתם?
למה אני לא יכול לפתור בעיה במטמטיקה עם אינטגרל כי לא למדנו?

גדול שווה זה כבר מוגזם, strlen אני מבין, סבבה, אבל גדול שווה?

Jerba 06-11-08 07:39

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

לא למדת דמיון , תפתור בלי דמיון

Xinxy 06-11-08 10:17

ציטוט:

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

לא למדת דמיון , תפתור בלי דמיון

אבל הגדול שווה זה לא כ"כ נורא כי אפשר להסתדר בלעדיו

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

Jerba 06-11-08 15:45

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

Xinxy 08-11-08 20:42

אוף אני כבר מיואש :\
הנה הדבר שניסיתי אבל גם הוא לא הצליח!
PHP קוד:

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

int main ()
{
     
char a[ROW][COL];
     
int ijk,
      
howmany 0,
      
ok 0,
      
found 0;
     
char forCheck[5];
 
     for(
05i++)
     {
         
printf("Please enter row number %d in the matrix: "1);
         
scanf("%s"a[i]);
     }

     
printf("\nThe Marix is:\n");

     for (
0MATRIX_SIZEi++)
     {
         for(
0MATRIX_SIZEj++)
         {
             
printf("%c "a[i][j]);
         }
         
printf("\n");
     }

     
printf("Please enter a word no longer than 5 letters or \"exit\" to leave the program:");
     
scanf("%s"forCheck);
 
     for (
0forCheck[i] != '\0'; ++i)
     {
         
howmany++;
     }

     
//מימין לשמאל
     
for(0howmanyj++)
     {
         for(
0ROWi++)
         {
             for(
0COLk++)
             {
                if(
forCheck[j] == a[i][k])
                {
                    
ok++;
                }
            }
        }
         
found ok;
         
ok 0;
    }
     
//סוף
     
     //מלמעלה למטה
     
for(0howmanyj++)
     {
         for(
0ROWi++)
         {
             for(
0COLk++)
             {
                if(
forCheck[j] == a[i][k])
                {
                    
ok++;
                }
            }
        }
         
found ok;
         
ok 0;
    }
     
//סוף

     //מלמטה למעלה
     
for(howmany0j--)
     {
         for(
ROW0i--)
         {
             for(
COL0k--)
             {
                if(
forCheck[j] == a[i][k])
                {
                    
ok++;
                }
            }
        }
         
found ok;
         
ok 0;
    }
    
//סוף

     //משמאל לימין
     
for(howmany0j--)
     {
         for(
ROW0i--)
         {
             for(
COL0k--)
             {
                if(
forCheck[j] == a[k][i])
                {
                    
ok++;
                }
            }
        }
         
found ok;
         
ok 0;
    }

         if(
found == 0)
         {
             
printf("not found");
         }
         else
         {
             
printf("%d"found);
         }




SDF 08-11-08 22:19

הנה הפתרון שלי, מחפש רק משמאל-לימין ומלמעלה למטה.
מתקפל יופי ב:
קוד:

gcc version 4.2.1 20070719  [FreeBSD]
לא ניסיתי קומפיילרים אחרים.

הקוד כאן


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

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