צריך עזרה בכתיבת תוכנית בשפת C, כל עזרה תתקבל בברכה! - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

צריך עזרה בכתיבת תוכנית בשפת C, כל עזרה תתקבל בברכה!


Chaos

Recommended Posts

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

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

קליטת הטקסט והכנתו לעיבוד בהמשך:

התוכנית מבקשת מהמשתמש להכניס טקסט, בו משפטים מופרדים ע"י התו '.' (נקודה). סוף הקלט מזוהה על ידי התו enter ('\n').

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

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

הפיכת סדר המילים:

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

שינוי סדר המילים יהיה במקור.

לדוגמא:

עבור הטקסט הבא: I was born in the USA. I was born in ISRAEL.

התוכנית תדפיס:USA the in born was I. ISRAEL in born was I.

שימו לב, מספר הרווחים בין המילים אינו חשוב.

כל עזרה (כתיבת התוכנית, רעיון לכתיבת התוכנית וכדומה) תתקבל בברכה.

בתודה מראש, Chaos.

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

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

טוב בוא נראה...

קודם כל אתה צריך לקלוט את הקלט,נכון?

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

לאחר מכן תעבור על הקלט עד הסוף (עד סוף המחרוזת, התו שערך האסקי שלו הוא אפס ומסומן "\0" [סלש-אפס זה בטח יצא גרוע בגלל העברית...])

סלש אפס אגב:

\0

ותבדוק האם התו מקיים את התנאי הבא:

(נניח כי X=התו)


if ![(x>'a') && (x<'z') || (x>'A') && (x<'Z') || (x==' ') || (x==".")]
{
printf("Error")
return();
}

בעצם מה שזה אמור לעשות (לא בדקתי, לא בטוח אם זה עובד) זה בודק האם X הוא באלף בית האנגלי (גם גדול וגם קטן) או רווח או נקודה

ואם לא אז הוא מדפיס error ומסיים את התוכנית (בהנחה שזה בmain,אחרת זה יחזור לmain,תעשה שיחזיר ערך מסויים[למשל אפס] כאשר מצא טעות)

אחרי הבדיקה, תציב בתא 31 במערך שלך את התו בעל הקוד אסקי של אפס (סלש-אפס)

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

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

(אפשר שהיא תעבור על המשפט, תמצא את כל המילים [מילה=רצף תווים המופרדים ברווח] ואז פשוט תשים אותם מחדש בסדר ההפוך - סתם רעיון)

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

ראשית, תודה רבה.

שנית, איך אני את זה:

"אחרי הבדיקה, תציב בתא 31 במערך שלך את התו בעל הקוד אסקי של אפס (סלש-אפס)

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

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

(אפשר שהיא תעבור על המשפט, תמצא את כל המילים [מילה=רצף תווים המופרדים ברווח] ואז פשוט תשים אותם מחדש בסדר ההפוך - סתם רעיון)"

בתודה מראש, Chaos.

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

טוב אני לא אפתור לך הכל,

אבל בוא נראה


a[31]=0;

זה מציב בתא ה31 אפס

עכשיו בשביל לפרק למשפטים+להפוך, תבנה פונקציה שעובדת כך, היא עוברת על המערך השלם ואז

שתתחיל להעתיק תו-תו למחרוזת (נקרא לה B) עד שהיא מגיעה לנקודה, ברגע שהיא מגיעה לנקודה,

שתעביר את כל מה שהיא העתיקה עד עכשיו (המחרוזת B בעצם זה מה שהיא העתיקה עד עכשיו)

לפונקציה ב' (נדון עליה עוד מעט) ולאחר מכן תאפס את המחרוזת החדשה (B) ותמשיך להעתיק אליה

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

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

פונקציה ב':

מקבלת מחרוזת, מחלקת אותה למילים (תעבור על המחרוזת, תעתיק תו-תו עד שאתה מגיע לרווח ואז תתחיל להעתיק למחרוזת חדשה)

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

טוב זה הרעיון הכללי שיש לי כרגע, אפשר לייעל אבל למי יש כוח...

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

אני בכל מקרה הולך לקצת זמן לראות עכשיו

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

הרעיון הכללי מובן, והינו יפה מאוד.

הבעייה שלי היא, שדרך ביצוע הרעיון בפועל איננה ברורה לי. אין אני יודע את ה Syntax של Arrays או Strings כהוגן ואין אני מכיר את הפונקציות המיוחדות שלהן שאולי מאפשרות ביצוע חלק מהדברים שאמרת.

אשמח לכל עזרה נוספת שאקבל.

בתודה מראש, Chaos.

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

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

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

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

בנוסף, מספר שאלות:

- מה בדבר הנקודה, שאחריה יש צורך לעבור למשפט הבא?

- כיצד ניתן לעבור על המחרוזת תו-תו ולגלות שגיאת קלט?

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

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

מקווה שתתחשבו, ותודה על כל עזרה.

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

טוב, אני רואה שלא הייתה הענות גדולה כל-כך אבל בכל זאת:

/* */
#include <stdio.h>
#include <string.h>
#define max_letters 32
#define max_words 32
#define max_sentences 32
#define enter 10
#define space 32
#define dot 46
#define char_A 65
#define char_Z 90
#define char_a 97
#define char_z 122

void end_of_program();

int main()
{
int i=0, j=0, k=0, temp_k, flag=0;
char letter, line[max_letters][max_words][max_sentences]={"","",""};
do
{
scanf("%c", &letter);
if (letter==enter)
{
flag=1;
continue;
}
if (letter==space)
{
line[i][j+1][k]='\0';
i++;
j=0;
line[i][j][k]=letter;
i++;
flag=1;
}
if (letter==dot)
{
k++;
line[0][0][k]=letter;
flag=1;
}
if ((char_A<=letter && letter<=char_Z) || (char_a<=letter && letter<=char_z))
{
line[i][j][k]=letter;
j++;
flag=1;
}
if (flag!=1)
end_of_program();
temp_k=k;
}
while(letter!=enter);
if (flag==1)
for (k=0; k<=temp_k; k++)
for (; i>=0; i--)
printf("%s", line[i]);
return 0;
}

void end_of_program()
{
char not_in_use;
scanf("%c", &not_in_use);
not_in_use=enter;
printf("error\n");
}

זו גרסה חלקית של התוכנית. הבעייה היא, שעבור כל קלט הפלט הוא האות הראשונה בלבד של המילים ההפוכות. לדוגמא עבור: "I was born in Israel", הפלט יהיה: "I i b w I".

תודה לעוזרים.

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

ארכיון

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

×
  • צור חדש...