שאלה בפונקציות C

yossibbc

New member
שאלה בפונקציות C

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


כתוב את הפונקציה int Contains(int number1, int number2).
הפונקציה בודקת אם number1 מכיל את number2 .
במידה וכן, הפונק' תחזיר את האינדקס שבו מופיע number2 ב number1 (מימין לשמאל).
אחרת, הפונק' תחזיר -1.
לדוגמה:
number1 = 2265123 , number2 = 651 הפונק' תחזיר 4.
number1 = 754763 , number2 = 222 הפונק' תחזיר -1.
number1 = 693 , number2 = 693 הפונק' תחזיר 2.
הערה: האינדקס מתחיל מאפס.
 

nocgod

New member
השאלה היא עד כמה קומבינה מותר לך לעשות?

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

char firstNum[10];
char secNum[10];
char* p;

sprintf(firstNum, "%d", number1);
sprintf(secNum, "%d", number2);
p = strstr(firstNum,secNum);
if (p == NULL) return -1;
return (int)(p - firstNum);

או משהו כזה.
 

yossibbc

New member
שכחתי לציין שאסור לי להשתמש בהרבה דברים

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

Guy Yafe

New member
קבל רעיון

מעין מימוש של מכונת מצבים:
הרעיון הכללי שמספר B מוכל במספר A אםם החל מספרה מסוימת בA, אתה יכול לעבור במקביל ספרה ספרה בכל אחד מהמספרים והספרות תהיינה זהות.
האלגוריתם שלי נראה כך (ודא שאין טעויות במצבי קיצון):
נגדיר:
A - המספר המכיל (אולי)
B - המספר המוכל (אולי)
temp - משתנה זמני (מאותחל ל - B)
index - המקום הנוכחי ב-A (מאותחל לאפס)
returnIndex: - האינדקס ממנו מתחילה ההכלה (מאותחל למינוס אחד)
digitTemp - ספרת האחדות ב - temp
digitA - ספרת האחרות ב - A

האלגוריתם הולך כך:
כל עוד A אינו אפס בצע:
אם B שווה לאפס:
החזר את returnIndex
אחרת (B אינו אפס):
בדוק האם digitA=digitB (הבדיקה באמצעות אופרטור %)
אם כן:
הורד את ספרת האחדות מ - temp (באמצעות אופרטור חלוקה)
returnIndex=index
אם לא:
תן ל - temp את הערך של B מחדש
returnIndex=-1
בכל מקרה:
הגדל את index ב - 1
הורד את ספרת האחדות מ-A (באמצעות אופרטור החלוקה)
סוף הלולאה:
החזר returnIndex

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

yossibbc

New member
תודה על העזרה אבל

התוכנית שיצרתי נמצאת בקישור הבא :http://pastebin.com/KKXrPhTM (לצפיה נוחה)

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

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

אלפי תודות.

#include<stdio.h>
int Contains(int number1,int number2);
void main()
{
int num1,num2;
printf("please enter two numbers\n");
scanf("%d%d",&num1,&num2);
printf("%d\n",Contains(num1,num2));
}
int Contains(int number1,int number2)
{
int a,b,temp,index,returnindex,digittemp,digita,digitb;
a=number1;
b=number2;
temp=b;
index=0;
returnindex=-1;
digittemp=temp%10;
digita=a%10;
digitb=b%10;
while(!(a==0))
{
if(b==0)
{
return(returnindex);
}
else if (!(b==0))
{
if(digita==digitb)
{
temp=temp/10;
returnindex=index;
}
else
{
temp=b;
returnindex=-1;
}
}
index++;
a=a/10;
}
return(returnindex);

}

// number1 2265123 int
number2 651 int
a 0 int
b 651 int
temp 651 int
index 7 int
returnindex -1 int
digittemp 1 int
digita 3 int
digitb 1 int
 

Guy Yafe

New member
לא מימשת נכון את מה שרשמתי

ראשית כמה תיקונים קלים לאלגוריתם שכתבתי:
הבדיקה אם B שווה לאפס צריכה להיות רק אחרי הורדת ספרת האחדות מ - temp. זה ימנע לך בעיה של החזרת מינוס אחד במקרה ששני המספרים בעלי ספרה יחידה זהה.
במידה ונמצא שוויון בספרות, יש לבצע את returnIndex=index רק במקרה ש - returnIndex אינו מינוס אחד. אחרת היית מחזיר את האינדקס של סוף חלק המחרוזת הזהה ולא של תחילתה.

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

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

yossibbc

New member
תיקון קוד

זה הקוד שניסתי לתקן אחרי השינויים שאמרת לי http://pastebin.com/ssUeqLsP

אני לא יודע אם תקנתי נכון ואם לזה התכוונת.

תוכל לשנות את כפי שאת חושב לשמור אותו באותו אתר pastbin ולתת לי לינק אליו?

לפי מה שהבנתי ממך אין יותר מידי מה לתקן אז אשמח אם תעזור לי כי ממש התיאשתי מהשאלה הזאת :(
 

Guy Yafe

New member
לא תיקנת נכון

הבדיקה של ספרת האחדות צריכה להיות רק בתוך הלולאה.
 
למעלה