עבור לתוכן

הדפסה פעם אחת בלבד עם אינדקס גדל (שפת C)

Featured Replies

פורסם

שלום לכולם.

יש לי שאלה בשפת C:

בניתי את הקוד הבא:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

[left]printf("Please enter an Unsigned Number: ");
scanf("%u",&a);
flushall();

while(a!=0)
{
c=a;//temp for remembering a's value
b=a%10;// 12345--->5

while(b!=count)//until b=count
count++;//0--->1--->2... (until it gets the right figure)

while(b==count)
{
count2++;//1--->2--->3... (until it gets the number of shows)

if(a==0)
break;

a/=10;
b=a%10;

}

//need to print only the max show value of each figure
printf("\n %u = %d times\n",count,count2);

a=c;//get back a's value
a/=10;//12345--->1234
count=0;//get counter back to 0
count2=0;//get counter back to 0

}[/left]


עכשיו בעקרון זה קוד הבודק כמה פעמים מופיעה כל ספרה במספר מוגדר ע"י המשתמש

ומציג את התשובה בצורה כזו:

לדוגמא: המספר 123444

1 = 1 times

2 = 1 times

3 = 1 times

4 = 3 times

ככה זה צריך להראות בקומפיילר.

אבל בפועל זה מציג לי ככה

1 = 1 times

2 = 1 times

3 = 1 times

4 = 1 times

4 = 2 times

4 = 3 times

איך אני משנה את ה פרינט ככה שהוא יציג לי רק את הערך המקסימלי של ההופעה של כל ספרה?

תודה רבה לעוזרים!

פורסם

קודם כל - קצת סדר:

אתה משתמש בלולאות WHILE כאשר צריך התניות פשוטות וזה פשוט לא נכון לעשות.

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

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

באשר לאלגוריתם:

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

אתה צריך להשתמש בלולאת FOR במקום ה WHILE השני.

כמו כן לולאת FOR במקום ה WHILE השלישי.

משתמשים בלולאת WHILE כאשר לא יודעים מתי תהיה עצירה. אבל כאן אתה יודע - הלולאה הפנימית נעצרת כאשר הגעת לסוף המספר בכל פעם והלולאה החיצונית נעצרת כאשר סיימת לבדוק את הכל הספרות מ 0 עד 9.

פורסם

עוד בקשה קטנה: ערוך בבקשה את ההודעה ושים את הקוד שלך בתוך תגית קוד (כפתור # ליד הכפתור של הציטוט).

פורסם
  • מחבר

קודם כל תודה רבה על העזרה.

אבל אולי תוכל בבקשה לרשום את השינויים שאני צריך לעשות מ-WHILE ל-FOR (אני לא בטוח אילו תנאים לרשום ב FOR)?

את השורות של המונים החלפתי.

לא הבנתי כל כך איפה בדיוק לסגור את הלולאה הגדולה עם סוגריים מסולסלים, האם אתה מתכוון ש הCOUNT השני יהיה בכלל מחוץ לכל הלולאות, ז"א רק בתוך ה CASE?

בכל מקרה ממש תודה על העזרה.

פורסם

באשר למעבר מלולאת WHILE ל FOR - אתה צריך לשבת ולחשוב מה התנאים שמתקיימים בתחילת הפעולה, בסיום איטרציה יחידה ובסיום הלולאה כולה.

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

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

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

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

ורק אז תנסה לכתוב מחדש את כל הקוד.

פורסם
  • מחבר

נכון, רק התחלתי ללמוד.

(למרות שאני יודע דיי טוב את המרכיבים של לולאת FOR)

תודה על הטיפים, אני חושב שנתת לי כיוון טוב, אני אלך לשבת על זה עכשיו.

תודה ויום טוב :)

פורסם
  • מחבר

טוב יש לי קוד חדש (הוא עדיין עם לולאת WHILE)

printf("Please enter an Unsigned Number: ");
scanf("%u",&a);//12345
flushall();


while(a!=0)//12345--->1234--->123--->12--->1--->0 stop!
{
b=a%10;//12345--->5
c=a;//placeholder for a
while(a!=0)//12345--->1234--->123--->12--->1--->0 stop!
{
a/=10;//12345--->1234
d=a%10;//1234--->4
if(b==d)//5=4 ?
{
count=count++;//1--->2--->3...
}
}

a=c;//get a's original value
a/=10;//12345--->1234 forever!


//if there are no repetitions
if(count==1)
{
printf("\n%u = %d time\n",b,count);//5 = 1 time
}

count=1;//get counter back to 1
}

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

לדוגמא: המספר 123444

1 = 1 times

2 = 1 times

3 = 1 times

4 = 3 times

ככה זה צריך להראות בקומפיילר.

אבל בפועל זה מציג לי ככה

1 = 1 times

2 = 1 times

3 = 1 times

4 = 1 times

4 = 2 times

4 = 3 times

איך אני משנה את ה פרינט ככה שהוא יציג לי רק את הערך המקסימלי של ההופעה של כל ספרה?

תודה רבה לעוזרים!

פורסם

אתה עצלן !

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

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

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

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

פורסם

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

פורסם
  • מחבר

זה בסדר.

אני מבין שאתה רק מנסה להכניס בי מוטיבציה להבין באמת את הקוד.

אני יושב על זה כבר כמה ימים ועדיין לא מצאתי דרך.

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

זה לא שזה הדבר היחיד שאני לומד כרגע, אז להשקיע רק בזה זה לא אפשרי..

אם תוכל בכל זאת לתת לי את הקוד להדפסה אני אודה לך מאד , ואם תוכל להסביר לי איפה טעיתי גם אודה לך. :)

יום טוב.

***עריכה:

זה הקוד החדש, הצלחתי להשיג את מה שרציתי!

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

printf("Please enter an Unsigned Number: ");
scanf("%u",&a);//12345
flushall();

while(a!=0)//12345--->1234--->123--->12--->1--->0 stop!
{
b=a%10;//12345--->5 1234--->4 123--->3 ...
c=a;//placeholder for a (12345--->1234--->123--->...)
temp=count2;//at first = 0 --->50--->540--->5430...

while(a!=0)//12345--->1234--->123--->12--->1--->0 stop!
{
a/=10;//12345--->1234--->123--->...
d=a%10;//1234--->4 123--->3

///temp=0--->50--->540--->5430--->54320--->543210
while(temp!=0)//doesnt work in the first time (temp=0)
{
temp/=10;//0--->0 50--->5 540--->54 5430--->543 ...
e=temp%10;//0--->0 5--->5 54--->4 543--->3 ...

if(e==b)//0=4?--->5=3?--->
EXIT2=1;//get flag to "yes" if the number allready showed
}

if(b==d && !EXIT2)//5=4 ? (dont do it if flag is "yes")
{
count++;//1--->2--->3...
}
}

if(!EXIT2)//only if flag is "no"
{
printf("\n%u = %d times\n",b,count);//5 = 1 time
}

EXIT2=0;//get flag back to "no"
count2+=b;//0--->5--->54--->543--->5432--->54321
count2*=10;//50--->540--->5430--->54320
a=c;//get a's original value c=12345--->a=12345
a/=10;//12345--->1234 forever!

count=1;//get counter back to 1

}
count2=0;//get counter back to 0
temp=0;//get temp back to 0

האם יש למישהו פתרון? (או סיבה?)

פורסם

קצת בסיס - INT מוגדר כ 2 בחזקת 32 - כלומר מקסימום 4 בתים.

אם הכנסת מספר יותר גדול מזה - אתה מקבל גלישת זיכרון.

ארכיון

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

דיונים חדשים