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

שפת סי - הדרכה בקוד לזיהוי תמורות במערכים


sharonp

Recommended Posts

בוקר אור

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

לדוגמא:

array1=[a,b,c,a,b,c] zz

array2=[a,a,b,b,c,c] zz

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

אם למשל

array1=[a,b,c,a,c] zz

array2=[a,a,b,c,c,b] zz

אז המערך הראשון אינו תמורה של השני כי בראשון b מופיע פעם אחת ובשני פעמיים

המטרה היא להדפיס בסוף אם המערך הראשון הוא תמורה של השני או לא

בהנחה שכבר הכנסתי למערכים את האיברים שלהם והם כולם אותיות אנגליות קטנות, מה האלגוריתם להשוואה בין המערכים?

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

שתי דרכים:

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

ב. למיין את שני המערכים, ואז להשוות איבר-איבר. אם המערכים מכילים רק תווים באנגלית אז אפשר אפילו להוסיף להם '0\' בסוף ולהשוות אותם כמחרוזות באמצעות strcmp.

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

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

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

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

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

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

זהו שבאיזשהו שלב נתקעתי בו

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

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

printf("please enter 7 non-capital english letters of the first array:\n");
scanf("%c %c %c %c %c %c %c",&arr_1[0],&arr_1[1],&arr_1[2],&arr_1[3],&arr_1[4],&arr_1[5],&arr_1[6]);
for (i=0; i<N; i++){
if ((arr_1[i]<97) || (arr_1[i]>122)){
printf("Illegal Character");}
}

printf("please enter 7 non-capital english letters of the second array:\n");
scanf("%c %c %c %c %c %c %c",&arr_2[0],&arr_2[1],&arr_2[2],&arr_2[3],&arr_2[4],&arr_2[5],&arr_2[6]);
for (i=0; i<N; i++){
if ((arr_2[i]<97) || (arr_2[i]>122)){
printf("Illegal Character");}
}

for (i=0; i<N; i++){
counter_1[i]=0;
counter_2[i]=0;}

for (i=0; i<N; i++){
for (j=i; j<N; j++){
if (arr_1[i]==arr_1[j]){ counter_1[i]++;}
}
}
for (i=0; i<N; i++){
for (j=i; j<N; j++){
if (arr_2[i]==arr_2[j]){ counter_1[i]++;}
}
}

יש לי 2 בעיות:

1 - זה כל הזמן כותב לי שהכנסתי אותיות לא חוקיות למערך השני, אבל אם אני מבודד אותו מהראשון הוא לא כותב דבר

2 - אני לא יודע לאן להמשיך מכאן (מה שאמרתי מקודם הוא שעד כאן הבנתי)

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

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

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

קודם כל' date=' תכתוב פונקציה שבודקת את מספר המופעים של 'a' בשני המערכים שווים, ואחר כך תמשיך משם.

[/quote']

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

אתה צודק, באמת לא הבנתי נכון את מה שכתבת ותיקנתי עכשיו

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

yzmy4u5ewj4m.jpg

לכן לולאה לא תתאים

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

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

למה שלולאה לא תתאים?

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

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

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

בכל מקרה, הצליח. תודה :xyxthumbs:

אני בטח אחזור בקרוב עם השאלה הבאה שהיא יותר מסובכת, משהו עם מערכים דו-מימדיים ויותר מדי דרישות

שבת שלום!

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

ארכיון

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

×
  • צור חדש...