עבור לתוכן

2 שאלות פשוטות בc++

Featured Replies

פורסם

תודה מראש

1. אם למשל אני מכניס מילה ע"י המקלדת ואני לא יודע מה יהיה גודלה של המילה (מסוג char) אז איך אני מגדיר את המשתנה

למשל אם אגדיר

char i [20]

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

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

כלומר נגיד מילה ראשונה זה "cup" ומילה שניה זה "police"

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

איך אני כותב את זה בשפת c?

תודה רבה לכל המבינים

פורסם

1. למדת על מערכים דינמיים (malloc/free או new/delete)? אם לא, אז חכה שתגיע לנושא הזה ואז תדע. בינתיים תצטרך להסתפק במערכים בגודל קבוע.

2. מה שאתה מחפש נקרא strcmp. יש מקומות ברשת שמסבירים איך לממש אותה, אבל בהנחה שנתנו לך את זה בתור תרגיל, המימוש צריך להיות לולאה פשוטה שעוברת על שתי המחרוזות במקביל.

פורסם

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

ובנימה פרקטית: אלא אם אתה עובד במערכת embedded שבה כל בייט חשוב או שזו דרישה כתרגיל אקדמי גרידא - אתה באמת חושב שכמה (מאות\אלפי) בייטים של זיכרון ש"בוזבז" ישנו משהו?

פורסם

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

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

הנ"ל כמובן בהנחה שאתה עובד ב-C. אם אתה עובד ב-++C, אז אתה יכול להשתמש ב-string (שמנהל את כל ענייני הזכרון עבורך) ובפונקציה getline.

פורסם

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

פורסם
  • מחבר

אוקי

איך אני משתמש בפקודה השמורה strcmp??

אני רושם

strcmp(char s1[],char s2[]))

ואיזה מספר שלילי זה מחזיר במידה וs2 גדול מs1?

-10?-1? איזה שלילי זה מחזיר?

עוד שאלה פשוטה

אם הגדרתי

v[]={5,4,7}

וכאשר אני כותב

cout<<v

מה זה מוציא לי? את הכתובת של v? או את המשתנה 5?

תודה

נ.ב

אתם יכולים לתת לי דוגמא לstrlen

בשתי שורות..תגידו לי אם זה נכון במקרה שלי לתוך a יכנס 3?..כלומר האורך של v? כתבתי את זה נכון?

v[]={5,4,7}

a=strlen(v)

פורסם

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

ב. למה שלא תנסה ותאמר לנו?

ג. strlen עוד על מערכים של תווים (char). איך משתמשים בה ומה היא עושה - ראה א'.

פורסם
  • מחבר

בקשר לא.

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

זאת התוכנית אני מכניס מילה לa ומילה לc

#include <cstdlib>

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

int b;

char a[100];

char c[100];

cin >> a >> c ;

int strcmp(const char a, char c) ;

system("PAUSE");

return EXIT_SUCCESS;

}

איך אני יכול לראות את המספר השלילי החיובי או אפס על המסך??

תודה

נ.ב

ניסיתי לכתוב ככה כדי לראות את הפלט על המסך אך הקומפיילר אמר שיש שגיאה בשורה של ה strcmp כאילו הb= הוא לא חוקי

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

b = int strcmp(const char a, char c) ;

cout << b ;

פורסם

קודם כל, כשאתה כותב כאן קוד, אל תשתמש בתגית יישור לשמאל, אלא בתגית קוד (כפתור # ליד הכפתור של הציטוט).

לגבי שאלתך - אתה לא משתמש נכון ב-strcmp. כמו שאמרתי, חפש בגוגל, יש הרבה דוגמאות לשימוש נכון.

ארכיון

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

דיונים חדשים