עבור לתוכן

עזרה ב-C

Featured Replies

פורסם

שלום לכולם

זקוק לעזרתכם בתרגיל הבא:

  כתוב פונקציה המקבלת שני מערכים  בגודל זהה (n) ומספר שלם k ומחזירה ערך שונה מ-0 (לדוגמא 1) אם קיימים שני אברים, אחד במערך a ואחד במערך b,  a, b[j], כך שמתקיים a-b[j]=k  . במקרה זה על הפונקציה להחזיר את שני האינדקסים שלהם (באמצעות הפרמטרים:  index1 , index2). במידה ולא קיימים שני איברים כאלו הפונקציה תחזיר 0.

חתימת הפונקציה: int find_elements(int a[], int b[], int n, int k, int *index1, int *index2).

לדוגמא:

2 14 2 12 4     :a

9 3 7 11 14   :b

עבור  k= 3  למשל, הפונקציה תחזיר 1 ואילו עבור k= 6 הפונקציה תחזיר 0.

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

הערות:

- לשם בדיקה והגשה, עליכם להגדיר 5=N.

- תזכורת: עליכם להשתמש ב-  #define N  5 אבל אין להשתמש ב-N בתוך הפונקציה (אלא רק ב-n).

כאן נתקעתי:

#include<stdio.h>
#define N 5

int main()
{
int a[N],b[N],i,j,n=N,k,element_num,index1,index2,value1,value2;

find_elements (a,b,n,k,element_num,&index1,&index2,&value1,&value2);
printf("\n%d elements exist",element_num);
printf("\nThe index in the first array is: %d, the value is: %d",index1,value1);
printf("\nThe index in the second array is: %d, the value is: %d",index2,value2);
return 0;
}

int find_elements(int a[],int b[],int n,int k,int element_num,int *index1,int *index2,int *value1,int

*value2)
{
int i,j,result;
printf("Please insert the first array (5 numbers): \n");
for(i=0;i<n-1;i++)
  if (scanf("%d ",&a[i])!=1) 
    {
    printf("\nInput error!");
    return 1;
    }
printf("\nPlease insert the second array (5 numbers): \n");
for(j=0;j<n;j++)
  if (scanf("%d ",&b[j])!=1) 
    {
    printf("\nInput error!");
    return 1;
    }
printf("\nPlease insert k: \n");
  if (scanf("%d\n",k)!=1)
    {
    printf("\nInput error!");
    return 1;
    }
for(i=0,element_num=0;i<n-1;i++)
for(j=0,element_num=0;j<n-1;j++)
  {
  if (a[i]-b[j]!=k)
    result=0;
  else
    {
    element_num++;
    *value1=a[i];
    *value2=b[j];
    index1=&i;
    index2=&j;
    result=1;
    }
  }
return result;
}

תודה מראש על העזרה   :)

פורסם


index1=&i;
index2=&j;

למה?

אינדקס 1 שווה לכתובת של איי, אינדקס 2 שווה לכתובת של ג'יי

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

פורסם
  • מחבר

איך אפשר לתקן?

פורסם

אני מרגיש כמו זקן שדורכים לו על הדשא אבל כמה פעמים אפשר להגיד לכם לא להעביר מערכים על ה- stack . כמה?!

ועוד להשתמש בפרמטרים עם אותם שמות כמו משתנים גלובליים.

isildur צודק, וגם הלולאה שלך לא יוצאת כשהיא מוצאת את האינדקסים הנכונים.

פורסם
  • מחבר

במקום להגיב בהגדלת פונטים אולי תגיב בתיקון? לדעתי, הרבה יותר מועיל :-\

פורסם
  • מחבר

תיקנתי קצת, אבל התוכנית לא מגיעה ל-printf-ים למטה:

 #include<stdio.h>
#define N 5
int i,j,result,k,n,*index1,*index2;

int main()
{
int a[N],b[N],k,*index1,*index2;
printf("\nPlease insert the first array (5 numbers): \n");
for(i=0;i<N-1;i++)
  if (scanf("%d ",&a[i])!=1) 
    {
    printf("\nInput error!");
    return 1;
    }
printf("\nPlease insert the second array (5 numbers): \n");
for(j=0;j<N;j++)
  if (scanf("%d ",&b[j])!=1) 
    {
    printf("\nInput error!");
    return 1;
    }
printf("\nPlease insert k: \n");
  if (scanf("%d\n",k)!=1)
    {
    printf("\nInput error!");
    return 1;
    }
find_elements (a,b,N,k,index1,index2);

return 0;
}

int find_elements(int a[],int b[],int n,int k,int *index1,int *index2)
{

for(i=0;i<n-1;i++)

  {
  for(j=0;j<n-1;j++)
  if (a[i]-b[j]!=k)
    return 0;
  else
    {
    *index1=a[i];
    *index2=b[j];
    a[i]=i;
    b[j]=j;
    result=i+1;
    }
  }
printf("\n%d elements exist",result);
printf("\nThe index in the first array is: %d, the value is: %d",a[i],*index1);
printf("\nThe index in the second array is: %d, the value is: %d",b[j],*index2);
return result;
}

פורסם

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

#include<cstdio>
#define N 5

int find_elements(int a[],int b[],int n,int k,int *index1,int *index2);

int main()
{
int a[N],b[N],k,index1,index2;
int i,j;
printf("\nPlease insert the first array (5 numbers): \n");
for(i=0;i<N;i++)
if (scanf("%d",&a[i])!=1)
{
printf("\nInput error!");
return 1;
}
printf("\nPlease insert the second array (5 numbers): \n");
for(j=0;j<N;j++)
if (scanf("%d",&b[j])!=1)
{
printf("\nInput error!");
return 1;
}
printf("\nPlease insert k: \n");
if (scanf("%d",&k)!=1)
{
printf("\nInput error!");
return 1;
}
find_elements(a,b,N,k,&index1,&index2);

return 0;
}

int find_elements(int a[],int b[],int n,int k,int *index1,int *index2)
{
int i,j,result1=0;
for(i=0;i<n;i++)

{
for(j=0;j<n;j++)
if ((a[i]-b[j])==k)
{
*index1=a[i];
*index2=b[j];
result1=i+1;
printf("%d elements exist\n",result1);
printf("The index in the first array is: %d, the value is: %d\n",i,*index1);
printf("The index in the second array is: %d, the value is: %d\n",j,*index2);
return result1;
}
}
return result1;
}

פורסם
  • מחבר

תודה רבה :-*

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

a: 4 4 4 4 4

b: 2 2 2 2 2

k=2

אבל עדיין, כל הכבוד. עזרת לי מאד :yelclap:

פורסם

תעשה result+=1;

בלי קשר לi.

פורסם
  • מחבר

תודה רבה, עזרתם לי מאד  :xyxthumbs:

קוד סופי עובד:

 #include<stdio.h>
#define N 5

int find_elements(int a[],int b[],int n,int k,int *index1,int *index2);

int main()
{
int a[N],b[N],k,index1,index2;
int i,j;
printf("\nPlease insert the first array (5 numbers): \n");
for(i=0;i<N;i++)
if (scanf("%d",&a[i])!=1)
  {
  printf("\nInput error!");
  return 1;
  }
printf("\nPlease insert the second array (5 numbers): \n");
for(j=0;j<N;j++)
  if (scanf("%d",&b[j])!=1)
  {
  printf("\nInput error!");
  return 1;
  }
printf("\nPlease insert k: \n");
if (scanf("%d",&k)!=1)
  {
  printf("\nInput error!");
  return 1;
  }
find_elements(a,b,N,k,&index1,&index2);

return 0;
}

int find_elements(int a[],int b[],int n,int k,int *index1,int *index2)
{
int i,j,result=0,x,y;
for(i=0;i<n;i++)

  {
  for(j=0;j<n;j++)
  if ((a[i]-b[j])==k)
    {
    *index1=a[i];x=i;
    *index2=b[j];y=j;
    result++;
    }
  }
if (result!=0)
  {
  printf("%d elements exist\n",result);
  printf("The index in the first array is: %d, the value is: %d\n",x,*index1);
  printf("The index in the second array is: %d, the value is: %d\n",y,*index2);
  }
return result;
}

פורסם

אני מקווה שאתה גם מבין מה היו הטעויות שלך

פורסם
  • מחבר

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

ארכיון

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

דיונים חדשים