לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

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



  #4  
ישן 07-11-2009, 03:18
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 3 שנכתבה על ידי avihygo שמתחילה ב "..."

במידה ומותר לך לקבוע איך המשתמש מכניס את הקלט שלו, נניח שהוא עושה את זה לתוך מחרוזת.
למה מחרוזת? כי הכי קל לעבור על המספרים בזה אחר זה בתוך הקלט, מאשר להתחיל להמיר מספר int ולפרק אותו לספרות.
שורת הקלט תהיה משהו כזה:
קוד PHP:
 char input[11];
scanf ("%s",input); 

לאחר שקלטנו את המספר למחרוזת (ואנחנו נניח שמשתמש בסדר והכניס מספרים ולא תווים לא חוקיים אחרים), נעבור על המחרוזת לפי הסדר, וננסה לסדר אותה מחדש, בלי המספרים העודפים.
הרעיון הוא לתת עדיפות למספרים הראשונים (משמאל) ולכן תמיד נרוץ אחורה לוודא כי מספר שאנחנו רוצים להדפיס, לא הופיע כבר קודם לכן...
אם הקלט שלנו הוא 121314, אנחנו נרוץ על התא הראשון במחרוזת (תא מס' 0, המכיל את הספרה 1) ונבדוק האם הספרה שאנחנו רואים - הופיעה קודם לכן.
לשם התהליך, נשתמש בלולאה מקוננת (כלומר, שתי לולאות, אחת בתוך השניה).
הלולאה החיצונית תעבור על כל המספר, ספרה אחר ספרה.
הלולאה הפנימית תבדוק עבור אותה ספרה - האם הופיעה כבר בעבר.
במידה ולא הופיעה - מצויין! נדפיס אותה למסך (או נשמור אותה במחרוזת, או בתוך מספר int... מה שרוצים).
במידה וכן הופיעה, מצאנו ספרה כפולה. נתעלם ממנה, ונמשיך עם הלולאה החיצונית לספרה הבאה:

קוד PHP:
 #include <stdio.h>

int main()
{
    
char input[50];
    
int flag 1i,j;
    
printf ("Enter a number:   ");
    
scanf ("%s"input);
    for (
input[i] != '\0' i++)
    {
        
flag 1;
        for (
; (i) && flag j++)
        {
            if (
input[i] == input[j])
            {
                
flag 0;
            }
        }
        if (
flag)
        {
            
printf ("%c",input[i]);
        }
    }
    
scanf ("%s"input);
    return 
0;



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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 09-11-2009, 22:32
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 6 שנכתבה על ידי leemol שמתחילה ב "ואם אסור להשתמש..."

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

זה בערך מה שהצלחתי לעשות (וזה עובד) בלי להשתמש בכלל במערכים או מחרוזות:
קוד PHP:
 #include <stdio.h>

int main()
{
    
int result 0inputone 0two 0three 0four 0five 0six 0seven 0eight 0;
    
int nine 0zero 0tempflag 1i;
    
printf ("Enter a number:   ");
    
scanf ("%d", &input);
    
temp input;
    
input 0;
    while (
temp)
    {
        
input input*10 temp %10;                            // switch direction of input
        
temp /= 10;                                                // 1234 will become 4321
    
}
    while (
input)
    {
        
temp input 10;            // check whether current number has already been seen.
        
if (temp == 1) {one++; if (one 1flag 0;}            // if flag = 0, we have seen
        
else if (temp == 2) {two++; if (two 1flag 0;}        // this number before, so
        
else if (temp == 3) {three++; if (three 1flag 0;}    // it won't be a part of the
        
else if (temp == 4) {four++; if (four 1flag 0;}    // answer.
        
else if (temp == 5) {five++; if (five 1flag 0;}    // An array would be a much
        
else if (temp == 6) {six++; if (six 1flag 0;}        // more ellegant solution 
        
else if (temp == 7) {seven++; if (seven 1flag 0;}    // but... I was not allowed
        
else if (temp == 8) {eight++; if (eight 1flag 0;}    // to use it...
        
else if (temp == 9) {nine++; if (nine 1flag 0;}
        else if (!
temp) {zero++; if (zero 1flag 0;}
        if (
flag)
        {
            
result result*10 input 10;
        }
        
input /= 10;
        
flag 1;
    }
    
printf ("Result: %d\n"result);
    
scanf ("%d", &input);        // <-- to pause the command line from closing
    
return 0;


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

מסורבל, אבל עובד.
זו בדיוק הסיבה שמשתמשים במערכים כשצריך
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

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

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 17:09

הדף נוצר ב 0.08 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר