ABA


"עזרה בכתיבת קוד בשפת C - עבודת הגשה בלימודים"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #22277 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 22277
Excel
חבר מתאריך 3.8.04
6541 הודעות
   14:12   16.11.18   
אל הפורום  
  עזרה בכתיבת קוד בשפת C - עבודת הגשה בלימודים  
 
   אהלן אנשים

במסגרת עבודת הבית שאנחנו נדרשים להגיש, אחד מסעיפים העבודה דורש
שבהנתן קלט של מספר בין 7 ל8000.

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

לדוג' :
קלט 7 - פלט 5 ו 11

הרעיון שעלה לי לראש הוא כזה.

קליטת מספר מהמשתמש - להחסיר ב1 ולבדוק האם המספר ראשוני, במידה ולא להחסיר עוד אחד ולבדוק עד הגעה למספר ראשוני.
ועוד לולאה דומה רק עם הוספה של אחד ובדיקת המספר שהתקבל האם הוא ראשוני או לא.

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

תודה לעוזרים


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  בהנחה ואתה מדבר רק על הלולאה החיצונית ולא על הפונקציה שבודקת אם המספר ראשוני The Slayer  16.11.18 14:26 1
     למה 2 לולאות חיצוני ופנימי? Moshe4PRO 16.11.18 14:48 2
         צודק, לא כתבתי נכון כלכך The Slayer  16.11.18 15:18 4
  מה היעילות הנדרשת? Mad Hatter 16.11.18 14:53 3
  מה שכתבת נכון.. אולי תעלה את הקוד יהיה יותר קל לעזור TheKid 16.11.18 16:48 5
     אפשר גם לדלג אם ספרת האחדות היא 5 offer1 16.11.18 16:53 6
     אני מצרף את הקובץ exe של העבודה המדובר Excel 17.11.18 11:10 7
  לא יודע אם זה מתאים אבל: nadavs  17.11.18 16:06 8
     יש קאטצ', אי אפשר להשתמש בפונק' כאלו ואחרות Excel 17.11.18 16:14 9
         אתה יכול לממש בעצמך את האלגוריתמים שקובעים האם מספר הוא ראשוני או לא Mad Hatter 17.11.18 17:14 10
  הבן אדם בקושי יודע לעשות לולאה כולכם פה קפצתם עליו עם סיבוכיות... Zeet3x  18.11.18 10:43 11
     1+ Moshe4PRO 18.11.18 11:20 12
  2 אופציות -UC- 18.11.18 11:32 13
     דבר ראשון, תודה רבה על התגובה - מעריך מאוד : ) Excel 18.11.18 17:11 14
     מכתב Excel 18.11.18 17:12 15
     אחרי הרבה מאוד ניסיונות, הצלחתי בדרך כלשהי לעשות את זה Excel 18.11.18 18:03 16
  אפשר גם רקורסיבית אם למדת Bar  21.11.18 11:24 17
     קצת באיחור, בבקשה Bar  25.11.18 11:18 18

       
The Slayer 
חבר מתאריך 29.4.03
7959 הודעות, 2 פידבק
   14:26   16.11.18   
אל הפורום  
  1. בהנחה ואתה מדבר רק על הלולאה החיצונית ולא על הפונקציה שבודקת אם המספר ראשוני  
בתגובה להודעה מספר 0
 
   כי לבדוק אם המספר ראשוני יש הרבה שיטות והיותר יעילות בודקות על השורש של המספר ורק על האי זוגיים

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Moshe4PRO
חבר מתאריך 26.6.16
593 הודעות
   14:48   16.11.18   
אל הפורום  
  2. למה 2 לולאות חיצוני ופנימי?  
בתגובה להודעה מספר 1
 
  
הוא צריך רק שני לולאות אחד למעלה והשני למטה
אבל שלא יהיו אחד בתוך השני

לגבי הא"ז לא חובה אולי עדיף


@The Slayer@


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
The Slayer 
חבר מתאריך 29.4.03
7959 הודעות, 2 פידבק
   15:18   16.11.18   
אל הפורום  
  4. צודק, לא כתבתי נכון כלכך  
בתגובה להודעה מספר 2
 
   התכוונתי פונקציה פנימית ולולאה חיצונית
הפונקציה הפנימית תכיל את הלולאה שבודקת אם המספר ראשוני


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Mad Hatter
חבר מתאריך 19.12.15
1421 הודעות, 2 פידבק
   14:53   16.11.18   
אל הפורום  
  3. מה היעילות הנדרשת?  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 16.11.18 בשעה 15:09 בברכה, Mad Hatter
 
בשביל הפתרון שלך אתה קודם צריך למצוא דרך לקבוע האם מספר הוא ראשוני או לא
אם אני זוכר נכון יש אלגוריתם יעיל שפותח על ידי הודי ביעילות של lg n.

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

כמובן שאפשר ליעל את הקוד כך שזה יהיה רק O(1) אבל זה יעלה לך בזכרון אך אני לא חושב שזה נדרש בשאלה הזאת, וזה יהיה שונה לחלוטין ממה שאתה מתכנן.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   16:48   16.11.18   
אל הפורום  
  5. מה שכתבת נכון.. אולי תעלה את הקוד יהיה יותר קל לעזור  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
offer1
חבר מתאריך 22.9.09
221 הודעות
   16:53   16.11.18   
אל הפורום  
  6. אפשר גם לדלג אם ספרת האחדות היא 5  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Excel
חבר מתאריך 3.8.04
6541 הודעות
   11:10   17.11.18   
אל הפורום  
  7. אני מצרף את הקובץ exe של העבודה המדובר  
בתגובה להודעה מספר 5
 
   כעיקרון,
אסור להשתמש במערכים, מותר רק בלולאות for, do while, if else.


@TheKid@




                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
nadavs 
חבר מתאריך 22.9.09
1921 הודעות
   16:06   17.11.18   
אל הפורום  
  8. לא יודע אם זה מתאים אבל:  
בתגובה להודעה מספר 0
 
   מספר המספרים הראשוניים בין 1 ל8000 הוא די קטן, אפשר לשמור את כולם מראש וככה לבדוק ראשוניות בזמן קבוע.

אם זה לא חוקי מבחינת תנאי התרגיל תצטרך באמת לבדוק ראשוניות לכל מספר ומספר עד שתתקל באחד כזה, פתרון נפוץ יש בסיבוכיות של OsqrtN והפתרון האידיאלי היום הוא בOlogn^6 (AKS(

בגדול האלגוריתם שהגדרת הוא די נאיבי ותוכל לשפר אותו כי אם הקלט X לדוגמה זוגי
והוספת 1 כך שהמספר X+1 לא ראשוני גם הוא, באיטרציה הבאה הבדיקה האם X+2 ראשוני היא מיותרת כי 2 הוא מהמחלקים של X

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Excel
חבר מתאריך 3.8.04
6541 הודעות
   16:14   17.11.18   
אל הפורום  
  9. יש קאטצ', אי אפשר להשתמש בפונק' כאלו ואחרות  
בתגובה להודעה מספר 8
 
   אפשר לעשות רק באמצעות לולאות for, do while, if else
אופרטרים אריתמטיים, אופרטורי השמה למיניהם...

כעיקרון רק מה שנמצא בספריית <stdio.h>
וגם ללא מערכים למיניהם.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Mad Hatter
חבר מתאריך 19.12.15
1421 הודעות, 2 פידבק
   17:14   17.11.18   
אל הפורום  
  10. אתה יכול לממש בעצמך את האלגוריתמים שקובעים האם מספר הוא ראשוני או לא  
בתגובה להודעה מספר 9
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zeet3x  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 14.2.12
9976 הודעות, 24 פידבק
   10:43   18.11.18   
אל הפורום  
  11. הבן אדם בקושי יודע לעשות לולאה כולכם פה קפצתם עליו עם סיבוכיות...  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Moshe4PRO
חבר מתאריך 26.6.16
593 הודעות
   11:20   18.11.18   
אל הפורום  
  12. 1+  
בתגובה להודעה מספר 11
 
  

@Zeet3x@


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק
   11:32   18.11.18   
אל הפורום  
  13. 2 אופציות  
בתגובה להודעה מספר 0
 
1. כפי שהציעו - מציאת כל המספרים הראשוניים בין 7 ל-8000 ואז תוכל לבדוק מה המספר הקטן והגדול הכי קרובים לקלט
2. 2 לולאות for - אחת שיורד מהמספר שלך ואחת שעולה ממנו (אל תשכח לבצע בדיקות תקינות וכו') - קוד חלקי לדוגמא:

#include <stdio.h>
#include <stdbool.h>

int main()
{
int number = 56;
int primeNumberBigger = -1;

if (number < 1 || number > 8000)
{
//show error - not in range
}
else
{
for (int n = number + 1; n < 8000; n++)
{
bool found= false;

for(int i = 2; i <= n/2; ++i)
{
if(n % i == 0)
{
found = true;
break;
}
}

if (!found)
{
primeNumberBigger = n;
break;
}
}
}

printf("value = %d", primeNumberBigger);

return 0;
}


@Excel@


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Excel
חבר מתאריך 3.8.04
6541 הודעות
   17:11   18.11.18   
אל הפורום  
  14. דבר ראשון, תודה רבה על התגובה - מעריך מאוד : )  
בתגובה להודעה מספר 13
 
   דבר שני,
אסור לנו להשתמש בספרייה אחרת שהיא לא stdio.h
אני משער שאני יכול במקום הfound לעשות איזה flag במקום עם ערכים של 0 ו1.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Excel
חבר מתאריך 3.8.04
6541 הודעות
   17:12   18.11.18   
אל הפורום  
  15. מכתב  
בתגובה להודעה מספר 13
 
  

@-UC-@


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Excel
חבר מתאריך 3.8.04
6541 הודעות
   18:03   18.11.18   
אל הפורום  
  16. אחרי הרבה מאוד ניסיונות, הצלחתי בדרך כלשהי לעשות את זה  
בתגובה להודעה מספר 13
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bar  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
24027 הודעות, 7 פידבק
   11:24   21.11.18   
אל הפורום  
  17. אפשר גם רקורסיבית אם למדת  
בתגובה להודעה מספר 0
 
  

נשלח ע"י הסלולרי


He who makes a beast out of himself,
gets rid of the pain of being a man.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Bar  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 24.3.02
24027 הודעות, 7 פידבק
   11:18   25.11.18   
אל הפורום  
  18. קצת באיחור, בבקשה  
בתגובה להודעה מספר 17
 
   ערכתי לאחרונה בתאריך 25.11.18 בשעה 12:00 בברכה, Bar
 

#include <stdio.h>

#define MAXVAL 8000
#define MINVAL 7

int is_prime(int num);
int adjPrime(int num,int dir);

int main(){
int userInput=0;
int validInput=0;
do{
printf("Please enter a number between %d and %d\n>",MINVAL,MAXVAL);
scanf("%d",&userInput);
printf("\n");
}while(!((userInput > MINVAL) && (userInput < MAXVAL)));

int above = adjPrime(userInput+1,1);
int below = adjPrime(userInput-1,-1);
printf("The closest prime from below is %d, and the closest prime from above is %d\n",below,above);

return 0;
}

int is_prime(int num){
if (num <= 1) return 0;
if (num % 2 == 0 && num > 2) return 0;
for(int i = 3; i < num / 2; i+= 2){
if (num % i == 0)
return 0;
}
return 1;
}

int adjPrime(int num,int dir){
return is_prime(num) ? num : adjPrime(num + dir,dir);
}

@Excel@


He who makes a beast out of himself,
gets rid of the pain of being a man.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net