שפת C - מודולו וטבלת ASCII (שאלה) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שפת C - מודולו וטבלת ASCII (שאלה)


sharonp

Recommended Posts

היי, ערב טוב ;)

השאלה:

zydzknmydzkt.jpg

אני מתקשה בחלק של המפענח (האחרון).

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

zz (Wi - 'a' - i) [?] + 'a' zz

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

אפשר עזרה?

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

אם נסתכל רגע על הדוגמא ועל האות d במקום ה-6 -> i=6

הערך המספרי של d הוא 100

של x הוא 120

zz (100-97-6)%26+97=-3%26+97=-3+97=94

גם אם המודול היה נותן 3 במקום 3- זה לא היה עוזר..

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

תפריד לתחומים, כל עוד getchar()-i>=97 וגם getchar()-i<=122 אין בעיה

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

נניח מוגדר i>0, אתה מוסיף את i לערך של האות ומחסר 26.

נניח שהאות בקוד היא y ו-i=3, אתה תקבל אתה מקבל 121+3-26=98 שזה בדיוק b

אותו סיפור ל-i<0, רק שפה אתה מחבר את הערך של האות פלוס 26 פלוס i.

נניח אות בקוד b ו-i=-3 אתה מקבל 98+26-3=121 שזה בדיוק y

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

טוב, קצת מתמטיקה:

לפעולת מודולו (במתמטיקה, לא ב-C) יש תכונה שעבור מספר כלשהו טבעי m ומספר כלשהו שלם x, תמיד יתקיים:

x % m == (x+m) %m

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

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

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

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

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

#include <stdio.h>

int main (void) {

char w_1, w_2, w_3, w_4, w_5, w_6;
int i;

printf("please insert a six letter word that you would like to encrypt\n");
scanf("%c", &w_1);
scanf("%c", &w_2);
scanf("%c", &w_3);
scanf("%c", &w_4);
scanf("%c", &w_5);
scanf("%c", &w_6);
printf("the encrypt word is: %c%c%c%c%c%c\n", ((w_1-'a'+1)%26+'a'), ((w_2-'a'+2)%26+'a'), ((w_3-'a'+3)%26+'a'), ((w_4-'a'+4)%26+'a'), ((w_5-'a'+5)%26+'a'), ((w_6-'a'+6)%26+'a'));
printf("please enter a six letter word that you would like to decrypt\n");
scanf("%c", &w_1);
scanf("%c", &w_2);
scanf("%c", &w_3);
scanf("%c", &w_4);
scanf("%c", &w_5);
scanf("%c", &w_6);
printf("the decrypted word is: %c%c%c%c%c%c\n", ((w_1-'a'-1)+26)%26+'a', ((w_2-'a'-2)+26)%26+'a', ((w_3-'a'-3)+26)%26+'a', ((w_4-'a'-4)+26)%26+'a', ((w_5-'a'-5)+26)%26+'a', ((w_6-'a'-6)+26)%26+'a');
scanf("%d", &i); /*stop*/
return 0;
}

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

זה בגלל איך שעובדת הפונקציה scanf עם c%.

אני מניח שהקלדת את המילה כשבסופה עשית Enter, נכון? אז ("scanf("%c לא מדלגת על ה-enter אלא קוראת אותו, וזה מה שגורם לך לבעיה.

הפתרון הוא אחת משלוש האפשרויות:

לקרוא את המילה כמחרוזת אחת (בשביל זה תצטרך להגדיר מערך של char ולהשתמש ב-("scanf("%s),

לעשות (fflush(stdin כשאתה מסיים לקרוא כל מילה,

או שכל scanf יכיל רווח לפני ה-c%, כלומר ("scanf(" %c, כי זה אומר לו לדלג על רווחים וירידות שורה.

יש?

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

תודה שניצל, זה עובד

אבל איך אתה מסביר שהחלק הראשון של השאלה עבד בסדר גם בלי הרווחים? (ה- 6 SCANFים הראשונים) וכן עצר כשרציתי, אבל בחלק השני זה לא עבד? הרי אין ביניהם הבדל

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

ארכיון

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

×
  • צור חדש...