עזרה

pilot23

New member
עזרה

שלום,
אשמח אם מישהו יוכל לומר לי אם הרעיון שלי+ מה שעשיתי עד עכשיו זה טוב:
נותנים לי את ה- ABC וליד כל אות נותנים לי את הערך שלה בקוד מסוים... כלומר A ב- ABC הרגיל יהיה שווה ל- C בקוד המבוקש, B יהיה שווה ל- D, ו- E יהיה שווה ל- Z בקוד המבוקש וכו'...
בהמרה לקוד המבוקש ממירים אות אות, אין הבדל בין אותיות קטנות לגדולות ( 'A' מומר ל- 'C' ו-' a' מומר ל- 'c' ).
מספרים וכל דבר אחר ישארו אותו דבר.
צריך קוד שעושה אמרה וקוד שהופך חזרה לאנגלית.

הקוד:
(זו פונקציה)
אני מניחה שגם הדברים לא ממש בסדר הנכון...

int i,j;
char str[]={'A','B','C','D','E','F','G','I','K','N','M','L','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
char str2[]={C,D,G,U,Z,B,A,Y,Q,W,R,V,T,X,H,F,O,E,I,P,S,N,L,M,K,J};

for ( i=o, i<strlen(str), i++) zz לולאות מקנונות
for (j=o, j<strlen(str2), j++) zz
if (str[j]==' 'zz
str=str2[j]
ואת השאר אני לא ממש יודעת...
];
 

BravoMan

Active member
אני לא ממש מבין מה ניסית לעשות עם הקוד:

בשביל מה הלולאה המקוננת?
למה להשוות לרווח?
למה להחליף תווים בין 2 המחרוזות?
היכן המחרוזת (משפט) שאת אמורה להצפין?

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

pilot23

New member
תשובות

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

nocgod

New member
בעצם...

מה שאת אמורה לעשות כדי להצפין זה
לקחת אות מהמשפט ולהחליף אותה באות מהמערך האותיות החדש במקום i כך ש i מייצגת את מקום האות שנלקחה מהמשפט בABC האנגלי (A = 0 B = 1 וכן הלאה עד Z = 25)

נתון משפט str
נתון מערך [newArr[0..25
לכל תו c מstr נעשה: אם c-'a' גדול שווה מ/ל 0 וקטן מ 26 נחליף את האות c באות [newArr['a'-c עד שלא מגיעים ל 0\.

תהליך הפיצוח בדיוק הפוך...
 

pilot23

New member
תשובה

זאת אומרת שאני צריכה רק for אחד ?

לכל תו c מstr נעשה: אם c-'a' גדול שווה מ/ל 0 וקטן מ 26 נחליף את האות c באות [newArr['a'-c עד שלא מגיעים ל 0\.
למה a-c... לא ממש הבנתי... וגם את העניין של /0 שמסיים את המחרוזת...
 

nocgod

New member
מה נראה לך?

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

pilot23

New member
אני לא עושה פשוט for אחד

ובתוכו i=0, i<strlen(str), i++ ?
 

nocgod

New member
כן...

אני שוב אגיד
תכתבי על דף (דף אמיתי עם עט או עיפרון) את המשפט hello world this is me
ותכתבי טבלה שבה לכל אות מהABC את תשייכי אות פנויה אחרת

תעברי אות אות במשפט ותחליפי באות ששייכת לה

ותעני לעצמך על השאלות:
1) מאיזה אינדקס אני מתחילה את ההחלפות?
2) עד איזה אינדקס אני עושה את ההחלפות? האם האינקדס הזה מציין משהו?
3) מה אני עושה עם תווים כמו רווח אשר אין לי בשבילם החלפה? (סוד -> כלום)

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

pilot23

New member
התשובה שלך לא מדויקת, כי

אין פה הפרש קבוע... אם A=C, אבל G=A, ובכלל H=Y... אז אין פה חוקיות מבחינת ASCII
 

nocgod

New member
מה קשור הפרש קבוע?

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

תכתבי טבלה (על דף אמיתי עם עט אמיתי, לא בדמיון) שבחלק העליון שלה יש מספרים מ 0 עד 25 ומתחת לכל מספר תכתבי אות, ככה שהאותיות לא יחזרו על עצמן.
תעברי על כל אות במילה hello ותתאימי אותה לאות אשר מופיעה מתחת למספר של האות בABC (ככה שתחליפי את האות h באות אשר כתבת מתחת ל7 (כי h היא האות השמינית בABC))
אחרי שתעשי את זה תכתבי את הקוד, הוא מאוד מאוד פשוט. כדי להצפין צריך בדיוק 3 שורות קוד בלי ההגדרה של המערך עם התווים וה int i, 3 שורות
עוד 7 שורות כדי להחזיר אותו למצב הרגיל שלו.

את מתעקשת לקבל עזרה וזה מוערך, אבל אם את מבקשת ואנשים נותנים לך את תוציאי מזה את המקסימום ואשכרה תקשיבי לעצות שלהם ולמה שמסבירים/אומרים לך.
עשית דברים כאלה כשהייתי ילדה קטנה על דף.

for (i = 0; i < strlen(stringToEnrypt); i++)
if(stringToEnrypt >= 'a' && stringToEnrypt <='z')


רמז/טיפ/שתי שליש פיתרון...
 

BravoMan

Active member
אז ככה:

למעשה, רוב התרגיל הזה זהה לתרגיל הקודם שבו ביצענו הצפנה ע"י חיסור הערך 3 מערך ASCII של כל אות.

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

כאן יש שתי אפשרויות:
הדרך הקשה:
להשתמש במשפט switch (אם למדת) או הרבה if else כדי להתאים אותיות.

הדרך היפה:
להשתמש ב-"מילון".

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

עכשיו, מה שעליך לעשות זה להשתמש בו על המשפט שקלטת מהמשתמש, במקום על סתם מערך של אותיות.

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

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

pilot23

New member
תשובה

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

זו הבעיה, שאני לא יודעת איך להמשיך משם... מה הדרך חשיבה שלי צריכה להיות החלק מהחלק שכתבתי ?
 

עדין ר

New member
קודם כל

שימי לב שהאותיות ב-ASCII הן פשוט רצף של מספרים. כלומר התו 'A' הוא 65, התו 'B' הוא 66, והתו 'C' הוא 67 וכן הלאה. כמו כן, התו 'a' הוא 97, התו 'b' הוא 98, התו 'c' הוא 99 וכן הלאה.

מכאן, את יכולה לבדוק אם תו מסוים c הוא אות גדולה באמצעות התנאי הבא

c >= 'A' && c <= 'Z'

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

חוץ מזה, בהינתן תו עם אות גדולה את יכולה ל"תרגם" אותו לאינדקס בין 0 ל-25 ע"י חיסור 'A' ממנו (ובאופן דומה גם עבור אות קטנה). אינדקס כזה יכול לשמש אותך לגישה למערך שבו באינדקס הראשון שמורה האות באנגלית שמתאימה לאות A בקידוד, באינדקס השני שמורה האות באנגלית שמתאימה לאות B בקידוד וכן הלאה.
נסי לכתוב פונקציה שמשתמשת במערך כזה ובחישוב האינדקס כדי להחזיר את האות האנגלית שמתאימה לאות נתונה בקידוד (מבלי להשתמש בלולאה או switch או הרבה if-ים!). בדוגמא שנתת, עבור הקלט 'A', הפונקציה תחזיר 'G'; עבור הקלט 'B' הפונקציה תחזיר 'F', עבור הקלט 'C' הפונקציה תחזיר 'A', וכן הלאה. עבור קלטים שאינם אותיות, הפונקציה תחזיר פשוט את הקלט.
 
למעלה