עבור לתוכן

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

Featured Replies

פורסם

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

השאלה:

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ים הראשונים) וכן עצר כשרציתי, אבל בחלק השני זה לא עבד? הרי אין ביניהם הבדל

פורסם

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

ארכיון

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

דיונים חדשים