נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: אלגוריתם בשפת C הסרת ספרות כפולות

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
avihy11
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 05 November 2009
משתמש: מנותק/ת
הודעות: 7
נשלח בתאריך: 05 November 2009 בשעה 17:11 | IP רשוּם
ציטוט avihy11

שלום,
יש לי תרגיל להגשה בשפת C בו אני נדרש לבנות תוכנית שהמשתמש יקליד מס' חיובי ועל התוכנה להסיר ספרות כפולות מהמספר שהמשתמש הקליד כך שעבור הספרה שמופיעה יותר מפעם אחת, רק המופע בעל הערך הגבוה ביותר יישאר (ככל שהמיקום שמאלי יותר - כך גבוה יותר)

לדוגמא: המשתמש הקליד 121314 הפלט 1234

תודה רבה
חזרה לתחילת העמוד הצג את כרטיס החבר של avihy11 חפש הודעות אחרות של avihy11
 
גד
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 05 November 2009 בשעה 23:47 | IP רשוּם
ציטוט גד

הנה דרך פשוטה (די מתחכמת):

1. קלוט מספר חיובי לתוך משתנה שלם num
2. אתחל משתנה מחרוזת num_str1
3. אתחל משתנה מחרוזת num_str2
4. המר את num למחרוזת והכנס למשתנה num_str1

5. אתחל משתנה שלם i
6. עבור (i = 0 , i < num_str1.length, i = i + 1) , בצע (לולאת for פשוטה):
    6.1 אם בתוך num_str2 לא נמצא התו במיקום ה-i של num_str1, אזי:
        6.11 הוסף ל-num_str2 את התו במיקום ה-i של num_str1

7. הצג את num_str2 (ניתן גם להמיר בחזרה למשתנה שלם, אבל לא חובה)

שים לב ששלב 6.1 משתמש בפעולה מובנת של מחרוזות:
String.IndexOf
חזרה לתחילת העמוד הצג את כרטיס החבר של גד חפש הודעות אחרות של גד בקר בדף הבית של גד
 
גד
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 05 November 2009 בשעה 23:52 | IP רשוּם
ציטוט גד

בשפת C תוכל להשתמש ב strchr()
חזרה לתחילת העמוד הצג את כרטיס החבר של גד חפש הודעות אחרות של גד בקר בדף הבית של גד
 
avihy11
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 05 November 2009
משתמש: מנותק/ת
הודעות: 7
נשלח בתאריך: 06 November 2009 בשעה 09:11 | IP רשוּם
ציטוט avihy11

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 06 November 2009 בשעה 11:57 | IP רשוּם
ציטוט גד

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


הצטרף / הצטרפה: 05 November 2009
משתמש: מנותק/ת
הודעות: 7
נשלח בתאריך: 06 November 2009 בשעה 12:36 | IP רשוּם
ציטוט avihy11

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 06 November 2009 בשעה 15:23 | IP רשוּם
ציטוט גד

ניתן גם להשתמש ברשימה (List) של משתנים מסוג שלם (Integer), כך:

ראשי:

1. קלוט מספר חיובי לתוך משתנה שלם num
2. אתחל רשימה חדשה של מספרים שלמים allDigitsList

3. כל עוד num גדול מאפס, בצע:
    3.1 הוסף לתוך allDigitsList את שארית החלוקה של num ב-10
    3.2 חלק את num ב-10.

4. הפעל על allDigitsList את הפעולה הפוך_סדר_איברים
5. אתחל רשימה חדשה של מספרים שלמים singleDigitsList

6.אתחל משתנה שלם i
7. עבור (i = 0 , i < allDigitsList.Count, i = i + 1) , בצע:
    7.1 אם בתוך singleDigitsList לא נמצאה הספרה במיקום ה-i של allDigitsList, אזי:
        7.11 הוסף את הספרה במיקום ה-i של allDigitsList לתוך singleDigitsList

8. אפס את num
9. עבור (i = 0 , i < singleDigitsList.Count, i = i + 1) , בצע:
    9.1 הכנס ל-num את תוצאת החישוב (num כפול 10) פלוס הספרה במיקום ה-i של singleDigitsList

10. הצג את num

הפוך_סדר_איברים:
קולט: רשימת מספרים שלמים lst
מחזיר:
רשימת מספרים שלמים


1. אתחל רשימה חדשה של מספרים שלמים reversedList

2. אתחל משתנה שלם i
3. עבור (i = lst.Count - 1 , i >= 0, i = i - 1) , בצע:
    3.1 הוסף את הספרה במיקום ה-i של lst לתוך reversedList

4. החזר את reversedList



שים לב שבשורה 3 מתקיימת לולאת while, בשורה 7 ו-9 לולאות for רגילות, ובשורה 3 של הפעולה הפוך_סדר_איברים מתקיימת לולאת for הפוכה (מהסוף להתחלה)
מקווה שהבנת...
חזרה לתחילת העמוד הצג את כרטיס החבר של גד חפש הודעות אחרות של גד בקר בדף הבית של גד
 
avihy11
משתמש מתחיל
משתמש מתחיל


הצטרף / הצטרפה: 05 November 2009
משתמש: מנותק/ת
הודעות: 7
נשלח בתאריך: 06 November 2009 בשעה 16:40 | IP רשוּם
ציטוט avihy11

גד

ראשית תודה רבה!!!!

שנית לא נראה לי שמותר לנו להשתמש בLIST כי עדיין לא למדנו...

יש אפשרות אחרת??

חזרה לתחילת העמוד הצג את כרטיס החבר של avihy11 חפש הודעות אחרות של avihy11
 
גד
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 06 November 2009 בשעה 17:22 | IP רשוּם
ציטוט גד

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


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 07 February 2010 בשעה 02:05 | IP רשוּם
ציטוט חיים

בס"ד

הנה פתרון ללא רשימות ואפי' ללא מערכים. לולאות מקוננות בלבד:

/*  With God's help.  */


# include <stdio.h>
# include <conio.h>

void main()
{
  int num, tmpNum, finalNum = 0, tmpFinal, digitsCount = 0, i;
  double j = 1;

  clrscr();

  printf("Enter a num     ");
  scanf("%d", &num);
  tmpNum = num;

  // מציאת מס' הספרות
  while(tmpNum)
  {
 tmpNum /= 10;
 digitsCount++;
  }

  /*
  יצרנו משתנה 'סופי' שישמור מס' המורכב מספרות בלתי כפולות. בתחילה ערכו 0
  השלבים: 1. נפרק את המספר הנקלט מספר פעמים כמספר ספרותיו
  בכל פעם נמצא את הספרה הבאה בתור- מהראשונה ואילך
  שלב 2. נפרק את המשתנה ה'סופי' לספרותיו ונבודקן אחת-אחת אם אינן זהות לספרה הנ"ל
  שלב 3. אם לא- נוכל להוסיף את הספרה הזו ל משתנה ה'סופי' הנ"ל
  */
  for(i = 0; i < digitsCount; i++)
  {
 tmpNum = num;
 tmpFinal = finalNum;
 j *= 10;

 while(tmpNum > j) tmpNum /= 10; // Step 1.

 while(tmpFinal)
 {
  if(tmpNum % 10 == tmpFinal % 10) break; // Step 2.

  tmpFinal /= 10;
 }

 if(!tmpFinal) // Step 3
 {
  finalNum *= 10;
  finalNum += (tmpNum % 10);
 }
  }

  printf("%d", finalNum);

  getch();
}

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

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

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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