לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 08-12-2007, 23:34
  ghostdog47 ghostdog47 אינו מחובר  
 
חבר מתאריך: 05.07.07
הודעות: 56
שאלה מאוד מעניינת בתכנות שפת C

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

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

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 09-12-2007, 09:37
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 4 שנכתבה על ידי ghostdog47 שמתחילה ב "מגניב"

הרעיון הוא יחסית די פשוט:
פונק' הספרייה של stdio.h בשם getch היא פונק' (שכתובה בשפת הסף של המחשב - אסמבלי) אשר מחכה לקלט מהמקלדת.
כאשר מגיע קלט מהמקלדת היא פשוט מחזירה את התו שנקלט - בניגוד לרב פונק' הקלט האחרות שמנהלות גם מנגנון ECHO שמדפיס בחזרה את הקלט שמתקבל.

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

עכשיו ככה: \b זה תו ה-Backspace - למקרה שלא ידעת, זהו תו ככל התווים.
הדפסה של התו הזה, מחזירה את סמן הכתיבה יחידה אחת אחורה ואז הטקסט הקודם ידרס.
כדי להעלים את הכוכבית שעליה נמצא עכשיו סמן הכתיבה, אני שותל תו \0 כדי למחוק את סימון הכוכבית, ואז שוב חוזר אחורה.

ירידת שורה אמיתית במחשב היא לא רק \n אלא צירוף: \r\n התו הראשון - \r זהו תו שמסמן למדפסת (מסך) להחזיר את מתקן הכתיבה לראש השורה (הסמן חוזר לתו הראשון כמו רצף של \b) ואילו התו השני \n מציין להרים את הדף בשורה (ירידת שורה במסך) [לפני שנוצרו המסכים, המחשבים היו מחוברים למדפסות, התווים הללו הם שרידים מאז].
למרות שבמסך אתה לא תראה את זה, אם יש לך מערכת הפעלה ישנה מאד אתה תמצא שתו \n לבדו רק יוריד את הסמן בשורה, אבל הוא יגיע לאמצע השורה הבאה עד לקבלת תו ה \r
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 09-12-2007, 09:41
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 9 שנכתבה על ידי ghostdog47 שמתחילה ב "[font=Verdana]אם אפשר להוסיף..."

יש לך 2 שגיאות קלות:
א) פונק' main היא פונק' מטיפוס INT ומחזירה 0 בסיום מוצלח או קוד אחר בסיום לא מוצלח!
ב) ב-C, כשריד לתקן של c89 בו לא הייתה רשימת ארגומנטים לפונק', לא נהוג להשאיר את הסוגריים של הפונק' ריקות מתוכן, כי אז הקומפיילר עלול להסיק שהפונק' מקבלת כמות לא מוגדרת של פרמטרים.
אם הפונק' שלך לא מקבלת פרמטרים - היא מקבלת void

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

קוד:
#include <stdio.h> #define STR_LEN 255 void get_pass(char str[]); int main(void) { char str[STR_LEN]; printf("Please enter your code: "); get_pass(str); return 0; }
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 10-12-2007, 22:23
  ghostdog47 ghostdog47 אינו מחובר  
 
חבר מתאריך: 05.07.07
הודעות: 56
מידע בקשר לשגיאות :)
בתגובה להודעה מספר 1 שנכתבה על ידי ghostdog47 שמתחילה ב "שאלה מאוד מעניינת בתכנות שפת C"

בקשר ל main אתה צודק במאה אחוז כי אני בעצמי בדקתי מזמן באינטרנט ורשמו שמומלץ לרשום
int ולהחזיר ערך 0 אבל המרצה שלי והמתרגל אמרו לי שזה שטויות וזה לא נכון לעשות ככה כי אז אתה לא יכול לעבוד עם פונקציות void כשאתה רוצה...אני אישית לא הבנתי מה הם רוצים ממני (לך תתוכח עם m.a במדעי מחשב) כי קראתי את זה במאמר חיצוני שאומר שאם אתה לא מחזיר ערך לפונקציה כמו שלכאורה אני עשיתי, אתה בעצם מחזיר ערך אקראי למערכת, ואם ממירים את זה לקוד אסימבלי אתה רואה שאתה גורם לשגיאה מסוג stck משהו באוגרים SP I IP משהו כזה....הסברתי להם את זה בערך ככה אבל עדיין אומרים שאסור לעבוד עם int ולהחזיר 0 (בתור פונקציה ראשית) main.

בקשר ל-DEFINE כמו שאני זוכר זה פונקציית preprocessor קדם מעבד שמחליפה טקסט בטקסט...אני ייזכור את זה שאמרת לתוכניות גדולות אני יעריך את זה בינתיים עבדי בערך עם 600 שורות קוד לא יותר חח

תודה על שהקדשת מזמנך, אני מאוד מעריך את זה

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


נערך לאחרונה ע"י ghostdog47 בתאריך 10-12-2007 בשעה 22:40. סיבה: ללא תוכן (בטעות) +נ.ב.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #12  
ישן 11-12-2007, 23:07
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 11 שנכתבה על ידי ghostdog47 שמתחילה ב "בקשר לשגיאות :)"

את הידע העודף שלי אכן למדתי לבד.. התעניינתי בתחום כמה שאני יכול לזכור את עצמי בכלל...

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

פתאום אחרי שבועים, כשאתה חצי דרך לקראת סוף התוכנית, הוא פתאום נזכר שיש 4 טעויות ב-3 נוסחאות, קבוע שהתפקששו בו כמה ספרות, ובכלל יש לו 2550 עובדים.

עכשיו לך תעבור על 10000 שורות קוד ונסה להבין אם זו נוסחא עם טעות או נוסחא בלי?
ואיך לוודא שלא שכחת אף אחת?

בסופו של דבר אתה תקלל את היום שבו נולדת, אז לפני שזה יקרה, ולפני שיכשילו אותך בקורס "מבוא לתכנות מערכות", כדאי שתסגל לך הרגל טוב לחיים: enum ו-DEFINE בכל מקום שבו יש "מספרי קסם"...
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #17  
ישן 14-12-2007, 00:19
  ghostdog47 ghostdog47 אינו מחובר  
 
חבר מתאריך: 05.07.07
הודעות: 56
בתגובה להודעה מספר 1 שנכתבה על ידי ghostdog47 שמתחילה ב "שאלה מאוד מעניינת בתכנות שפת C"

ציטוט:
Dark Knightאת הידע העודף שלי אכן למדתי לבד.. התעניינתי בתחום כמה שאני יכול לזכור את עצמי בכלל...

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

פתאום אחרי שבועים, כשאתה חצי דרך לקראת סוף התוכנית, הוא פתאום נזכר שיש 4 טעויות ב-3 נוסחאות, קבוע שהתפקששו בו כמה ספרות, ובכלל יש לו 2550 עובדים.

עכשיו לך תעבור על 10000 שורות קוד ונסה להבין אם זו נוסחא עם טעות או נוסחא בלי?
ואיך לוודא שלא שכחת אף אחת?

בסופו של דבר אתה תקלל את היום שבו נולדת, אז לפני שזה יקרה, ולפני שיכשילו אותך בקורס "מבוא לתכנות מערכות", כדאי שתסגל לך הרגל טוב לחיים: enum ו-DEFINE בכל מקום שבו יש "מספרי קסם"...


חח עכשיו זה נשמע למה define הוא דיי חזק..
אבל בקשר לעובדים, בדיוק למדנו על הקצאות זכרון דינמית..ובעצם נניח ובאמת למשתמש היו 2550 עובדים ולא 255 עובדים אז לפני הכנסת הקלט אפשר היה להקצות זכרון בהתאם לכמות העובדים שיש באמת, וככה גם אם מתפטרים חלק או באים פשוט מקצים זכרון נוסף.
אני תוהה אם זה נכון כי זה לא נראה לי ממש רעיון טוב, חוץ מזה שזה לא נראה לי בר יישום או יעיל (ההקצאה הדינמית) למען האמת האם יש איזשהו ייתרון להקצאה דינמית חוץ מלהגדיר מערכים דינמיים אחרת השימוש בdefine נראה מאוד מפתה במקרים כאלה.
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #18  
ישן 14-12-2007, 11:12
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 17 שנכתבה על ידי ghostdog47 שמתחילה ב "[QUOTE] Dark Knightאת הידע..."

הדוגמאות שכתבתי היו מהדברים הראשונים שעלו לי בראש, אבל תחשוב על דוגמא פשוטה בהרבה:
אתה כותב תוכנית מתמטית - וכמו בכל תוכנית כזו אתה זקוק למספר פאי: 3.14.
אלא מה, זו תוכנה מתמטית, אתה צריך דיוק של 32-16 ספרות משמעותיות:
3.1415926535897932384626433832795

תחשוב שיש לך 30 פונק' שמשתמשות ב-PI, ובכל אחת משתמשים בו 10 פעמים.
קודם כל, לדחוף מספר כזה לכל מקום, זה מייגע.
דבר שני, יש לך עכשיו איזה 300 מופעים שלו, נניח ב-10 מהם טעית בספרה אחת... לך תמצא את זה עכשיו....

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

עקרונית, גם פה ה-define יכול לעזור, אם כי אני לא יודע אם למדתם שימוש שכזה:

קוד:
#define ALLOC_STR(to, from) ((to) = (char*)malloc(sizeof(char)*strlen((from))+1))

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #19  
ישן 16-12-2007, 13:19
  ghostdog47 ghostdog47 אינו מחובר  
 
חבר מתאריך: 05.07.07
הודעות: 56
בתגובה להודעה מספר 18 שנכתבה על ידי Dark Knight שמתחילה ב "הדוגמאות שכתבתי היו מהדברים..."

ציטוט:
Dark Knightהדוגמאות שכתבתי היו מהדברים הראשונים שעלו לי בראש, אבל תחשוב על דוגמא פשוטה בהרבה:
אתה כותב תוכנית מתמטית - וכמו בכל תוכנית כזו אתה זקוק למספר פאי: 3.14.
אלא מה, זו תוכנה מתמטית, אתה צריך דיוק של 32-16 ספרות משמעותיות:
3.1415926535897932384626433832795

תחשוב שיש לך 30 פונק' שמשתמשות ב-PI, ובכל אחת משתמשים בו 10 פעמים.
קודם כל, לדחוף מספר כזה לכל מקום, זה מייגע.
דבר שני, יש לך עכשיו איזה 300 מופעים שלו, נניח ב-10 מהם טעית בספרה אחת... לך תמצא את זה עכשיו....

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

עקרונית, גם פה ה-define יכול לעזור, אם כי אני לא יודע אם למדתם שימוש שכזה:

קוד:
#define ALLOC_STR(to, from) ((to) = (char*)malloc(sizeof(char)*strlen((from))+1))


שזה יכול מאד לעזור לא לכתוב קודים שלמים מחדש...


הדוגמה עם ה_pi מסבירה מצויין
ובקשר להקצאה, התחלנו מבנים בקושי עוד לא הגענו ל"רשימות משורשרות/מקושרות"
תודב על שהקדשת מזמנך לענות על שאלותיי.
regards ghostdog
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

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

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 11:26

הדף נוצר ב 0.08 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר