עבור לתוכן

עזרה בתרגיל ב-C

Featured Replies

פורסם

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

#include<stdio.h>
#include<string.h>


void teivot(char *s);

void main()
{
char s[10];

printf("Enter string\n");
scanf("%s",&s);
teivot(s);

}



void teivot(char *s)
{
char *p, *q;
int i;
char s1[10];
p=s;
q=s1;

(*q)=(*p);
p++;
q++;

for(i=1;i<8;i++,p++)
{
if (((*p)=' ') && ((*(p+1))!=' '))
{
(*q)=(*p);
q++;
}
}

printf("%s",s1);
}

לא עובד =\

פורסם

שימי לב במשפט ה-if בתוך הלולאה, בדיקת שיוויון באמצעות ==, ולא באמצעות = (המבצע שם השמה).

פורסם
  • מחבר

צודק, אבל זה עדיין לא עובד..[br]פורסם בתאריך: 17.11.2007 בשעה 13:36:05


מצאתי כמה טעויות ותיקנתי.. אבל עדיין לא עובד

void teivot(char *s)
{
char *p, *q;
int i;
char s1[10];
p=s;
q=s1;

(*q)=(*p);
p++;
q++;

for(i=1;i<8;i++,p++)
{
if (((*p)==' ') && ((*(p+1))!=' '))
{
(*q)=(*(p+1));
q++;
}
}

printf("%s",s1);
}

פורסם

תיקונים נכונים, נשאר לך רק:

1. בקלט, בתוכנית הראשית להשתמש ב-gets כי באופן השימוש ב-scanf שעשית הקלט יתקבל עד הרווח הראשון. gets לעומת זאת קולטת עד לקבלת סוף שורה.

2. לפני ההדפסה האחרונה לבצע השמה של NULL במקום עליו מצביע q כדי לסמל סוף מחרוזת.

פורסם

יש לי הצעה איך לפשט לך את התרגיל.

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

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

זה יקל על המימוש ויעזור לך ביתר קלות למצוא שגיאות.

פורסם
  • מחבר

תודה! :yelclap:[br]פורסם בתאריך: 17.11.2007 בשעה 13:55:32


יש לי הצעה איך לפשט לך את התרגיל.

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

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

זה יקל על המימוש ויעזור לך ביתר קלות למצוא שגיאות.

איך עושים את זה?

כי ככה זה לא עובד לי:

void teivot(char *s)
{
char *p;
int i;
p=s;

for(i=1;i<(N-1);i++,p++)
{
if (((*p)==' ') && ((*(p+1))!=' '))
{
printf("%c", (p+1));
}
}

}

פורסם

תדפיסי תחילה את האות הראשונה של המילה הראשונה (גם אם אין רווח לפניה)

ואח"כ בהדפסה תוסיפי כוכבית לפני (p+1)

פורסם
  • מחבר

תדפיסי תחילה את האות הראשונה של המילה הראשונה (גם אם אין רווח לפניה)

ואח"כ בהדפסה תוסיפי כוכבית לפני (p+1)

ולקדם את המצביע..

תודה שוב :]

פורסם

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

פורסם

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 256

void teivot(char *s);

void main()
{
char s[N];

printf("Enter string\n");
gets(s);

teivot(s);

system("pause");
return;
}


void teivot(char *s)
{
int i;

if (s[0]!=' ') printf("%c", s[0]);
for(i=0;i<N-1;i++) {
if ( s[i]==' ' && s[i+1]!=' ')
printf("%c", s[i+1]);
}
}

תבדקי את זה נראה לי זה עובד[br]פורסם בתאריך: 17.11.2007 בשעה 14:29:59


יש לי גם המצלה חמה לעתיד

תפסיקי להשתמש בדברים כמו (S+1)*

ותתחילי להשתמש בצורה היותר קלה [1]S

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

פורסם

מזמן מזמן לא תרגלתי C, וגם לא ניסיתי לקמפל את הקוד הזה, אבל הנה הגרסה שלי (השתדלתי לכתוב כמה שיותר הערות על מנת שהוא יהיה מובן):

void print_initials(char *s)
{
int i = 0;
while (s[i] != '\0')
{
/* go through all spaces. stop if current character is not a space or if we reached the end of the string */
while ((s[i] == ' ') && (s[i] != '\0')) ++i;

/* s[i] is now the first non-space character. print it */
printf("%c", s[i]);

/* now go through the rest of the word, until we reach the first space after the word or until we reach the end of the string */
while ((s[i] != ' ') && (s[i] != '\0')) ++i;

/* now we are at the end of the current word. let's start over again (scan for next word, print char, and scan till end of word) */
}

/* we got here because we reached to the end of the string. bye bye! */
}

פורסם
  • מחבר

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 256

void teivot(char *s);

void main()
{
char s[N];

printf("Enter string\n");
gets(s);

teivot(s);

system("pause");
return;
}


void teivot(char *s)
{
int i;

if (s[0]!=' ') printf("%c", s[0]);
for(i=0;i<N-1;i++) {
if ( s[i]==' ' && s[i+1]!=' ')
printf("%c", s[i+1]);
}
}

תבדקי את זה נראה לי זה עובד[br]פורסם בתאריך: 17.11.2007 בשעה 14:29:59


יש לי גם המצלה חמה לעתיד

תפסיקי להשתמש בדברים כמו (S+1)*

ותתחילי להשתמש בצורה היותר קלה [1]S

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

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

וככה גם מתרגלים את המצביעים...

פורסם

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

ארכיון

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

דיונים חדשים