עבור לתוכן

גם אני נתקעתי עם לולאות בC

Featured Replies

פורסם

שלום לכולם.

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

התרגיל אומר כך:

כתבו תוכנית שקולטת N מספרים שלמים. N יתקבל כקלט מהמשתמש. התוכנית תדפיס:

א.כמה מספרים זוגיים הופיעו בסדרה.

ב.מה ערכם של שני המספרים המינימאליים בסדרה ומה היה מקומם בסדרה.

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

אני מוסיף קטע מהקוד שעובד לי בצורה טובה, אך לא ב100% מהמקרים. אשמח לקבל הכוונה איפה בידיוק אני נופל...


#include <stdio.h>
int main()
{
int n, num1, num2, i, min1=0, min2=0;
int even=0, firstpos, secpos, next1, next2;
printf("Enter the size of the series: ");
scanf("%d", &n);
if(n<2){
printf("The series should contain at least 2 elements\n");
return 1;
}
printf("Enter the series: ");
scanf("%d %d", &num1, &num2);
if(num1%2==0){
even++;
}
if(num2%2==0){
even++;
}
for(i=2;i<n;i++){
scanf("%d", &next1);
if(next1%2==0)
even++;
}
if(num1<num2 && num2<next1){
min1=num1;
min2=num2;
}
if(num1<next1 && next1<num2){
min1=num1;
min2=next1;
}
if(num2<num1 && num1<next1){
min1=num2;
min2=num1;
}
if(num2<next1 && next1<num1){
min1=num2;
min2=next1;
}
if(next1<num1 && num1<num2){
min1=next1;
min2=num1;
}
if(next1<num2 && num2<num1){
min1=next1;
min2=num2;
}

printf("There are %d even numbers in the series.\n", even);
printf("The minimal numbers is: %d %d\n", min1, min2);

return 0;
}





פורסם
  • מחבר

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

תודה ;)

פורסם

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

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

לדעתי פספסת שם קליטת מספר אחד.

פורסם

המוח שלך עובד קשה מדי, בגלל זה הלכת קצת לאיבוד עם כל ה ifים האלה..

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

יונקים פשוטים כמוני מצלחים לכתוב קוד :)

לדוגמה את הבעיה הזאת אפשר לפרק ל 4 בעיות קטנות יותר, ככה:

(1) עבור_כל_מספר_בקלט

(2) תעדכן_את_ספירת_הזוגיים_אם_צריך()

(3) תכניס_את_המספר_לרשימת_המספרים_הקטנים_אם_צריך().

(4) תדפיס_דברים_למסך()

שים לב שאני לא חושב כרגע איך אני עושה את 1, אלא מה אני רוצה לקבל מ 1. זאת הכוונה שלי בלחשוב top down.

עכשיו פשוט תחשוב רמה אחת למטה, כלומר ספציפי יותר. משהו כזה:

(1) כל_עוד_יש_מספרים_בקלט_קח_את_המספר_הבא() ואז:

(2) אם_next_הוא_זוגי() תוסיף 1 לספירת הזוגיים

(3) תוודא_שהגדול_יהיה_ראשן() \\ num1

(3) אם_next_קטן_מ_mun1() אז תצב אותו כ nmu1, שמור את האינדקס שלו ותמשיך למספר הבא.

(4) תדפיס_דברים_למסך()

ככה זה בערך יראה בקוד:


int main()
{
int min1 = INT_MAX;
int min1_index = -1;

int min2 = INT_MAX;
int min2_index = -1;

int even_count = 0;

int next;
int total;


for(total = 0; read_next_int(&next, stdin); total++) // 1
{
if (next % 2 == 0) // 2
even_count++;

// 3
if (min1 < min2) // bubble sort of 2 elements
{
swap(&min1, &min2);
swap(&min1_index, &min2_index)
}

if (next < min1)
{
min1 = next;
min1_index = total
}


}

if (total < 2)
die_on_error("Give me at least 2 elements!", EXIT_FAILURE);

display_summary(total, even_count, min1, min2); // 4
return EXIT_SUCCESS;
}

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

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

לך כמה מספרים הכי קטנים הוא רוצה. זה לא קשה.

הנה 2 רמזים:

- תחשוב על איך אתה דוחף את כל הבלאגן של 3 לתוך מבנה נתונים.

- priority queue זאת דוגמה למבנה נתונים.

זהו, מקווה שנתתי לך כיוון. בהצלחה :)

פורסם

כנראה שהוא משתמש מתחיל בקטע של תכנות. הוא ודאי לא מכיר מבני נתונים (ואין לו מוכנים כאלה ב-C)

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

פורסם
  • מחבר

חבר'ה, תודה רבה לכם על העזרה! אני מודה לכם מאוד על הנכונות לעזור ולתרום מהידע ומהניסיון שלכם :yelclap:

אני מקווה שתציצו לשרשורים שלי מדי פעם, כי כמו שזה נראה עכשיו אני הולך לפתוח לא מעט כאלה.

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

אני מצרף כאן את הפתרון הסופי של הבעיה, לטובת כל אלה שיחפשו דברים דומים בעתיד:


#include <stdio.h>
int main()
{
int n, num1, num2, i;
int even=0, min1, min2, next1, pos1, pos2;
printf("Enter the size of the series: ");
scanf("%d", &n);
if(n<2){
printf("The series should contain at least 2 elements\n");
return 1;
}
printf("Enter the series: ");
scanf("%d %d", &num1, &num2);
if(num1%2==0){
even++;
}
if(num2%2==0){
even++;
}
if(num1<num2){
min1=num1;
min2=num2;
pos1=1;
pos2=2;
}
else{
min1=num2;
min2=num1;
pos1=2;
pos2=1;
}
for(i=2;i<n;i++){
scanf("%d", &next1);
if(next1%2==0)
even++;
if(next1<min2){
min2=next1;
pos2=(i+1);
}
if(next1<min1){
min2=min1;
min1=next1;
pos2=pos1;
pos1=(i+1);
}
}
printf("There are %d even numbers in the series.\n", even);
printf("The minimal numbers is: %d, %d\n", min1, min2);
printf("The minimal number positions are: %d, %d\n", pos1, pos2);
return 0;
}




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

פורסם

מצטער לא ניסיתי לזרוק עליך דברים שיגרמו לך אקסטרה כאב ראש. אז: Don't Panic! (אין לי כוח לעשות את זה צבעוני, תשתמש בדמיון :) )

לגבי הקוד שלך, למדת על פונקציות? ואתה לא צריך את ה special case בהתחלה. מליא אם המשתמש עבד עליך בכמות הקלט, scanf תחזיר

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

ולגבי לינוקס, כן זאת אחלה סביבה לפתח בה, במיוחד ב C.

פורסם
  • מחבר

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

הספיישל קייס, כמו שקראת לו, זה אחד הסעיפים בשאלה ובגלל זה הוא שם!

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

את התרגיל הזה ועוד שניים נוספים (שעוד לא נגעתי בהם) יש להגיש עד יום חמישי (הבא), אני אשמח אם תציץ מדיי פעם בפורום. יש לי משום מה הרגשה שאני אפתח עוד נושא או שניים עם הרבה שאלות... :s07:

ארכיון

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

דיונים חדשים