עזרה בשפת C

liatbi30

New member
עזרה בשפת C

שבת שלום לכולם!

צריכה עזרה בתרגיל

כתוב פונקציה בשפת סי אשר תוגדר int string(char *s1,char *s2

התכנית תקלוט שני מחרוזות מחרוזת S1 ומחרוזת S2 על הפונקציה לבדוק:

**אם כל התווים בS2 באותיות קטנות ז"א a,b,c..... ואם כל האותיות שונות זו מזו אם כן הפונקציה תמשיך אם לא תחזיר 0

**הפונקציה תבדוק האם כל התווים במחרוזת S2 נמצאים באותו סדר בS1 למשל:

'ABC' מחרוזת ראשונה 'ANVBJHKCKJ' מצב תקין תחזיר 1
'ABC' מחרוזת ראשונה 'ANHCBCKJ' מצב לא תקין כי C יש גם לפני B תחזיר 0
וגם אם חסרה אות אחת ממחרוזת S2 מצב לא תקין תחזיר 0

מקווה שרשמתי ברור את התרגיל .... קצת הסתבכתי עם הסעיף השני התכנית שלי היא:

#include<stdio.h>
int string(char *s1,char*s2)
{
int c1=0;
char *help=s1,*help=s2,*s1=s1,*s2=s2;
while(*s2!='\0'){
c1++;
}
s2=s2-c1;
while(*s2!='\0')
if(*s2<'a'||*s2>'z')
return 0;
s2=s2-c1;
while(*(s2+1)!='\0')
if(*s2==*(s2+1))
return 0;
s2=s2-c1;
while(*s1!='\0'&&*s2!='\0'){
while(*s1!=*s2)
s1++;
if(*s1=='\0')
return 0;
else{
*help=*s1;
while(*s1!=*s2)
s1++;
if(*s1==*(s2+1)){
s2++;
*help=*s1;
}
}
}
return 1;
}
void main()
{
char s1[100],s2[100],*s1,*s2;
printf("Enter string:");
gets(s1);
printf("Enter string:");
gets(s2);
printf("%d",string(s1,s2));
}








התוכנה גם נותנת לי הודעת שגיאה :

error C2082: redefinition of formal parameter 's1'
error C2082: redefinition of formal parameter 's2'
error C2372: 's1' : redefinition; different types of indirection
see declaration of 's1'
error C2372: 's2' : redefinition; different types of indirection
see declaration of 's2'

מצטערת על האורך של ההודעה אשמח לכל עזרה או רעיון
 

pitbol3

New member
אמממ

התחלתי לקרוא את הקוד והוא מאוד לא ברור(חסרות הערות)...

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

הסעיף השני: את צריכה לבדוק את המחרוזות החל מאיבר הראשון של כל אחת מהן, כלומר: (S2 צריכה להיות באותו הסדר כמו S1)

כדי שזה יקרה צריכים להתקיים שני תנאים:

איבר כלשהו בS2 נמצא ב S1, וגם האיבר הזה הוא האיבר הראשון ב S1(אחרת זה לא לפי הסדר). כמובן שצריך ללכת פה לפי הסדר...
 

liatbi30

New member
תכנית עם הסבר!

כשרשמתי

#include<stdio.h>
int string(char *s1,char*s2)
{
int c1=0;
char *help=s1;
while(*s2!='\0'){
c1++;
}
s2=s2-c1;//החזרת מצביע לתחילת המחרוזת
while(*s2!='\0'){//בדיקה אם המחרוזת השנייה נמצאת בטווח של אסקי
if(*s2<'a'||*s2>'z')
return 0;
s2++;
}
s2=s2-c1;//החזרת מצביע לתחילת המחרוזת
while(*(s2+1)!='\0'){//בדיקה אם התווים במחרוזת השנייה שונים
if(*s2==*(s2+1))
return 0;
s2++;
}
s2=s2-c1;//החזרת המצביע לתחילת המחרוזת
while(*s2!='\0'){//תנאי לעצירה
while(*s1!=*s2)
s1++;
s2++;
if(*s1=='\0')//אם המחרוזת הראשונה הגיעה לסיום בלי למצוא שום דבר
return 0;
else{
*help=*s1;
while(*s1!=*s2)
s1++;
if(*help==*s2&&*s1==*(s2+1)){
s2++;
*help=*s1;
}
}
}
return 1;
}
void main()
{
char s1[100],s2[100];
printf("Enter string:");
gets(s1);
printf("Enter string:");
gets(s2);
printf("%d",string(s1,s2));
}
 

nocgod

New member
מאחר ואת גם ככה יכולה לכתוב פונקציות

אז אולי תעשה שפוקנציה string תקרא ל 2 פונקציות עזר, כל פונקציית עזר תבצע חלק במטלה?
פירוק של בעיה גדולה לכמה בעיות קטנות יפשט את כל הבלאגן הזה בקוד :)
זה נראה כאילו את בכיוון הנכון.

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

s1 = "abcd"
s2 ="akbkckd"

או ש s1 חייב להיות תת-מחרוזת בתוך s2?
 

liatbi30

New member
לא

יכול להיות שS1 בכלל לא מכילה את S2 ואז הפונקציה תחזיר 0
העניין הוא שמבקשים פונקציה אחת שעושה הכל ,בודדתי את הפעולות וסידרתי ..אתה צודק גם הבדיקה לא היתה נכונה
ובכלל לא קידמתי את המצביעים ...
זו התכניתהמתוקנת אני תקועה בבעיה השנייה לבדוק שאם S1 כן מכילה את S2 האם הם נמצאים באותו סדר אגב אין חשיבות ששתי המחרוזות יכילו אות ראשונה אותו דבר ז"א a יכולה להיות גם באינדקס השני במחרוזת S1

#include<stdio.h>
int string(char *s1,char*s2)
{
int c1=0;
char *help1=s1,*help2=s2;
while(*s2!='\0'){
c1++;
s2++;
}
s2=s2-c1;//החזרת מצביע לתחילת המחרוזת

while(*s2!='\0'){//בדיקה אם המחרוזת השנייה נמצאת בטווח של אסקי
if(*s2<'a'||*s2>'z')
return 0;
s2++;
}
s2=s2-c1;//החזרת מצביע לתחילת המחרוזת
while(*(s2+1)!='\0'){//בדיקה אם התווים במחרוזת השנייה שונים
help2=s2+1;
while(*help2!=*s2)
help2++;
if(*help2==*s2)
return 0;
s2++;
}
s2=s2-c1;//החזרת המצביע לתחילת המחרוזת
/*while(*s2!='\0'){//תנאי לעצירה
while(*s1!=*s2)
s1++;
s2++;
if(*s1=='\0')//אם המחרוזת הראשונה הגיעה לסיום בלי למצוא שום דבר
return 0;
else{
*help=*s1;
while(*s1!=*s2)
s1++;
if(*help==*s2&&*s1==*(s2+1)){
s2++;
*help=*s1;
}
}
}
return 1;*/
}
void main()
{
char s1[100],s2[100];
printf("Enter string:");
gets(s1);
printf("Enter string:");
gets(s2);
printf("%d",string(s1,s2));
}
 

nocgod

New member
לא הבנתי

S2 צריכה להיות ממש תתמחרוזת ב S1 כלומר קלט תקין יהיה:
S2 = "abc"
S1 = "lkjlkjlkjabcsadfsadf"

או שמופע התווים בS1 מתוך S2 חייב להיות באותו הסדר אך יכולים להיות ביניהם עוד תווים כלומר האם הקלט הזה יהיה תקין?
S2 = "abc"
S1 = "kakbkck"
 

liatbi30

New member
כן

יש אפשרות שיהיו ביניהם תווים אחרים צירפתי קובץ עם התרגיל אולי לא הסברתי נכון
 

nocgod

New member
את קרובה מאוד...

פשוט תציירי את זה על דף ותעשי את זה ידנית ורק אז תכניסי למחשב.
כתבתי את התרגיל הזה ואני מצרף אותו כי הוא לא דומה לשלך כל כך...תשימי לב למה הולך שם, ותגידי לי אם עשיתי נכון לפי התרגיל כי אני עשיתי איך שאני הבנתי...
#include <stdio.h>

int string(char* s1, char* s2)
{

char* anchorS1 = s1;
char* anchorS2 = s2;
char* traverserS1 = s1;
char* traverserS2 = s2;
char* looperS2 = s2; // could user the anchor but it doesn't cost money to declare another pointer ;)

/* check that all characters in s2 are lowercase
* if the function gets through this while =>
* there are no characters in the string that are not lower case
*/
while (*traverserS2)
{
if (*traverserS2 < 'a' || *traverserS2 > 'z')
{
return 0;
}
traverserS2++;
}
traverserS2 = anchorS2; // return our traveler home

/* check if there are no double characters in the string
* if we pass this test there are no double characters in this string
*/
while (*looperS2)
{
while (*(++traverserS2))
{
if (*looperS2 == *traverserS2 && looperS2 != traverserS2) // we failed the test
{
return 0;
}
}
looperS2++;
traverserS2 = anchorS2;
}
traverserS2 = anchorS2; // return our traveler home

while (*traverserS2) // for each character in S2 we check
{
while(*traverserS1) // for each character in S1
{
if (*traverserS1 == *traverserS2) // if we encounter the right character in S2 we more S2++
{
traverserS2++;
}
traverserS1++;
}
}
/* if we have reached the end of S1 but not the end of S2 meaning some
* characters from S2 were not found in S1 or were in the wrong order
*/
return (*traverserS2 == 0 && *traverserS1 == 0);
}

void main()
{
char s1[100],s2[100];
printf("Enter string:");
gets(s1);
printf("Enter string:");
gets(s2);
printf("%s\n", string(s1,s2) == 0 ? "false" : "true");
}
 

liatbi30

New member
לא הבנתי

מה עשית בלולאה השלישית האחרונה??
אם יש דבר כזה:
S1 'BAGHCBC'
S2 ABC'
זה לא תקין כי C נמצא לפני B אם תוכל לשלוח לי במסר את האי מייל שלך אני אוכל לשלוח לך את התרגיל כמו שהמרצה הסביר אולי אני לא הסברתי נכון
 
למעלה