עבור לתוכן

עזרה - תרגיל ב- C#

Featured Replies

פורסם

אהלן... מחר מבחן על חומר של יא' 5יח'. (אשמח לקבל תשובה עד 9:30 בערך ;D)

הגענו למערך תווי, ונתקלתי בשאלה שלא הבנתי. (אני לומד הכל לבד, אף אחד לא מבין את המורה הזו :kopfpatsch:)

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

כתוב תכנית המקבלת כקלט אותיות קטנות מה- abc עד לקליטת '*'. עבור כל אחת מהאותיות שהתקבלו כקלט יש להציג את אורך הרצף הגדול ביותר שהתקבל מאותה אות. כמו-כן יש להציג כפלט את האות/יות שנקלט עבורן הרצף הגדול ביותר.

דוגמה:

עבור הקלט (משמאל לימין) :

r,s,x,x,x,x,s,s,a,d,r,r,r,h,h,h,b,b,b,b,*

יתקבל הפלט :

(a,1), (b,4), (d,1)..........

האותיות שנקלטו הכי הרבה פעמים : b, x.

תודה רבה מראש לעוזרים!! :yelclap::xyxthumbs:

עודד ב.

פורסם

מה לא הבנת בדיוק ? למדתם על Dictionary ?

פורסם

לא צריך DICTONARY שכן טווח הקלט ידוע וקטן

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

אחרי קליטת הקלט תבדוק אם האות דומה לאות האחרונה שנקלטה (יעני רצף) אם כן תגדיל את ה COUNTER ב1

אם לא נשבר הרצף עליך לבדוק אם הCOUNTER כרגע יותר גדול מזה שבמערך (האינדקס מן הסתם היא האות) אם כן לעדכן את המערך

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

אני מניח שאתה תצליח למצוא איך להתייחס ל a כ 0 ו Z כ 26

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

אם לא אז מצבך רע.

פורסם

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

אגב, אם a זה 0 אז z זה 25.

פורסם
  • מחבר

זה יישמע קצת מוזר, אני בטוח.

הצלחתי לפתור את התרגיל, אבל לא בהבנה מוחלטת של מה שעשיתי. :screwy:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int [] x = new int [26];
int [] max = new int [26];
int i = 0;
char last, ch;
ch = char.Parse(Console.ReadLine());
last = ch;
while (ch != '*')
{
last = ch;
while (last == ch && ch!='*')
{
last = ch;
x[ch - 'a']++;
ch = char.Parse(Console.ReadLine());
}
if (ch != '*' && x[last - 'a'] > max[last - 'a'])
{
max[ch - 'a'] = x[ch - 'a'];
x[ch - 'a'] = 0;
}
}
int ma=0;
for (; i < x.Length; i++)
if (x[i] >= x[ma]) ma = i;
Console.WriteLine((char)(ma+'a')+" " +x[ma]) ;

}
}
}

לא הבנתי כל כך מה קורה בהדפסה... הרי מערך max הוא המכיל את הרצף הגדול ביותר. (לפחות ככה תכננתי שיהיה)

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

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

פורסם

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

ההסבר שאני נתתי לפתרון צריך להיות אולי 10 שורות קוד

לא צריכה להיות יותר מלולאת WHILE אחת בכל הקוד לא צריך להיות יותר ממערך אחד

פורסם
  • מחבר

אודה לך מאוד אם תכתוב לי אותו בבקשה. ;)

קצת קשה לי להבין איך לבצע את זה בעזרת while אחד. (עם מערך אחד זה הבנתי איך לעשות)

פורסם


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char ch , lastCh=(char)('z'+1); //hack
int counter=0;
int[] alphbetArray = new int[27];
Boolean shouldContinue=true;
while (shouldContinue)
{
ch = char.Parse(Console.ReadLine());
if (ch == '*')
{
shouldContinue = false;
}

if (ch == lastCh)//retsef
{
counter++;
}
else //shvirat retsef
{
if (alphbetArray[lastCh - 'a'] < counter)
{
alphbetArray[lastCh - 'a'] = counter;
}
counter = 1;//so it count from 1
lastCh = ch;
}
}

for (int i = 0; i < alphbetArray.Length-1; i++)
{
System.Console.WriteLine("the max number of stright appearance for the letter " + (char)('a' + i) + " is " + alphbetArray[i]);
}
}
}
}

ארכיון

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

דיונים חדשים