תרגיל ב-C#

פורום רשתות, IT ומחשוב כללי - רשתות, ראוטרים, מחשבים ניידים, אביזרים וכו'.
gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #1 

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


לדוגמא אם אני מכניס את הטקסט:

test abcd$rrr.tyu ver
asd dfg

אז אני מקבל את המילים מסודרות ככה:

test
abcd
rrr
tyu
ver
asd
dfg

התחלתי לכתוב משהו אבל אני מסתבך:

קוד: בחירת הכל

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

namespace PrintWordWordFromText
{
    class Program
    {
        static void Main(string[] args)
        {
            //define temp 
            string temp = "";

            int WordIndex = 0;
            
            //read text from user
            Console.Write("Enter Text: ");
            string line = Console.ReadLine();

            //define array
            string[] Words = new string[100];

            while (line.Length != 0)
            {
                for &#40;int i = 0; i < line.Length; i++&#41;
                &#123;
                    //We have a regular character - part of a word 
                    if &#40;line&#91;i&#93; != ' ' & line&#91;i&#93; != ' ' & line&#91;i&#93; != ',' & line&#91;i&#93; != '.' & line&#91;i&#93; != '$'&#41;
                    &#123;
                        temp += line&#91;i&#93;;
                    &#125;

                    //special characters 
                    else
                    &#123;
                        Words&#91;WordIndex&#93; = temp;
                        WordIndex++;
                        temp = "";
                    &#125;
                &#125;
            &#125;

            for &#40;int i = 0; i < WordIndex; i++&#41;
              &#123;
                  Console.Write&#40;Words&#91;i&#93;&#41;;
              &#125;
            
            Console.ReadLine&#40;&#41;;

        &#125;
    &#125;
&#125;

Itsik_G
חבר ותיק
חבר ותיק
תגובות: 1178
הצטרף: יולי 2005
מיקום: מרכז הארץ
נתן תודות: 38 פעמים
קיבל תודות: 77 פעמים

שליחה #2 

אתה יכול להשתמש ב StringCollection?
אם כן, נסה את זה:

קוד: בחירת הכל


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

namespace ConsoleApplication1
&#123;
    class Program
    &#123;
        static void Main&#40;string&#91;&#93; args&#41;
        &#123;
            StringCollection sc = new StringCollection&#40;&#41;;
            bool done = false;
            string&#91;&#93; seperators = &#123; ",", " ", ".", "$" &#125;;
            while &#40;!done&#41;
            &#123;
                string lineInput = Console.ReadLine&#40;&#41;;
                if &#40;lineInput == ""&#41;
                    done = true;
                else
                &#123;
                    foreach &#40;string seperator in seperators&#41;
                    &#123;
                        lineInput = lineInput.rep&#108;ace&#40;seperator, "|"&#41;;
                    &#125;
                    string&#91;&#93; arrItems = lineInput.Split&#40;'|'&#41;;
                    foreach&#40;string item in arrItems&#41;
                        sc.Add&#40;item&#41;;
                &#125;
            &#125;
            DisplayItems&#40;sc&#41;;
        &#125;
        static void DisplayItems&#40;StringCollection items&#41;
        &#123;
            foreach &#40;string item in items&#41;
                Console.WriteLine&#40;item&#41;;
        &#125;
    &#125;
&#125;

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

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #3 

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

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

אני יכול לרשום מה שרשמתי ?

while (line.Length != 0)
נערך לאחרונה על ידי gshhar ב 10/06/2011 14:11, נערך פעם 1 בסך הכל.

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #4 

התרגיל הזה צועק regular expressions.

http://www.radsoftware.com.au/articles/ ... yntax.aspx

תחפש בMSDN על REGEX, כי לC# יש כמה סימנים מיוחדים שלא נפוצים בשאר השפות.

Itsik_G
חבר ותיק
חבר ותיק
תגובות: 1178
הצטרף: יולי 2005
מיקום: מרכז הארץ
נתן תודות: 38 פעמים
קיבל תודות: 77 פעמים

שליחה #5 

gshhar כתב: איך אני יכול למשל לדעת שהיוזר הכניס שורה ריקה ז"א הכניס טקסט, לחץ אנטר ובשורה השנייה לא הכניס טקסט אלא לחץ שוב אנטר ואז התרגיל מתחיל ?

אני יכול לרשום מה שרשמתי ?

while (line.Length != 0)
...
כן, זה ייתן אותה תוצאה.

יוני_א
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 848
הצטרף: מרץ 2008
שם מלא: יוני
נתן תודות: 34 פעמים
קיבל תודות: 24 פעמים

שליחה #6 

אפשר גם להשתמש ב console.ReadKey במקום ב RealLine

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #7 

אם אתה לא יכול לעשות REGEX, אז בIF שאתה בודק את האות שהיא רגילה,
תשתמש ב isLetter של CHAR (וזה האובייקט שאתה מקבל כשפונים לאינדקס בסטרינג)
http://msdn.microsoft.com/en-us/library ... s.71).aspx

בנוסף
יש לך פוטנציאל לבאג, בגלל שכל פעם שאתה נתקל במילה שהיא לא אות, אתה מקדם את האינדקס במערך הפתרונות, עבור קלט
"hello$$world"
המערך של המילים יראה
[0] "hello"
[1]
[2] "world"

ובהתאם תהיה לך שורה ריקה בפלט.

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #8 

וואי וואי אתם זורקים לי פה מושגים ואין לי מושג מה הם אומרים כי רק התחלתי ללמוד C#.

אני אנסה צעד צעד:

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

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #9 

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

הלולאה שלך של ה line.length != 0 תעבוד.
רק בשביל שזה יקרא את השורה מחדש, צריך להכניס בסוף הלולאה (לפני שאתה סוגר אותה)
line = console.readLine() כדי שהמשתנה יתעדכן.

אז הקוד הבא:

קוד: בחירת הכל

String line = Console.ReadLine&#40;&#41;;
while &#40;line.length != 0&#123;
	Console.WriteLine&#40;line&#41;;
	line = Console.ReadLine&#40;&#41;;
&#125;
Console.WriteLine&#40;"end"&#41;;
ידפיס מחדש כל טקסט שתכתוב, עד שתכניס שורה ריקה, ואחריה הוא ידפיס end.
שים לב לשורה האחת לפני אחרונה, בלעדיה, אם תכניס כל דבר שהוא לא שורה ריקה בתחילת התוכנה, היא תכנס ללולאה אין סופית.

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #10 

מסלול של פיתוח תוכנה

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #11 

מכללה? או קורס של חברה כמו ג'ון ברייס?

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #12 

כן.

איפה אני מכניס את הקוד שנתת לי ?
מה עם הלולאה שלי:

קוד: בחירת הכל

                    //We have a regular character - part of a word 
                    if &#40;line&#91;i&#93; != ' ' & line&#91;i&#93; != ' ' & line&#91;i&#93; != ',' & line&#91;i&#93; != '.' & line&#91;i&#93; != '$'&#41;
                    &#123;
                        temp += line&#91;i&#93;;
                    &#125;
                    //special characters 
                    else
                    &#123;
                        Words&#91;WordIndex&#93; = temp;
                        WordIndex++;
                        temp = ""; 
                    &#125;

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #13 

קוד: בחירת הכל

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

namespace PrintWordWordFromText 
&#123; 
    class Program 
    &#123; 
        static void Main&#40;string&#91;&#93; args&#41; 
        &#123; 
            //define temp 
            string temp = ""; 

            int WordIndex = 0; 
            
            //read text from user 
            Console.Write&#40;"Enter Text&#58; "&#41;; 
            string line = Console.ReadLine&#40;&#41;; 

            //define array 
            string&#91;&#93; Words = new string&#91;100&#93;; 

            while &#40;line.Length != 0&#41; 
            &#123; 
                for &#40;int i = 0; i < line.Length; i++&#41; 
                &#123; 
                    //We have a regular character - part of a word 
                    if &#40;line&#91;i&#93; != ' ' & line&#91;i&#93; != ' ' & line&#91;i&#93; != ',' & line&#91;i&#93; != '.' & line&#91;i&#93; != '$'&#41; 
                    &#123; 
                        temp += line&#91;i&#93;; 
                    &#125; 

                    //special characters 
                    else 
                    &#123; 
                        Words&#91;WordIndex&#93; = temp; 
                        WordIndex++; 
                        temp = ""; 
                    &#125; 
                &#125;
				//If this line isn't here the program will be stuck in an infinite loop.	
				line = Console.ReadLine&#40;&#41;;	
				////////////////////////////////////////////////////////////////////////
            &#125; 

            for &#40;int i = 0; i < WordIndex; i++&#41; 
              &#123; 
                  Console.Write&#40;Words&#91;i&#93;&#41;; 
              &#125; 
            
            Console.ReadLine&#40;&#41;; 

        &#125; 
    &#125; 
&#125;
הוספתי את זה,
תוודא שאתה מבין למה השורה צריכה להיות שם, ומה היא בדיוק עושה. (אחרי הכל, תרגיל)

gshhar פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 655
הצטרף: מאי 2007
נתן תודות: 0
קיבל תודות: 3 פעמים

שליחה #14 

יש פה עדיין בעיה זה לא עובד הוא משום מה לא נכנס ל-ELSE:

קוד: בחירת הכל


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

namespace PrintWordWordFromText
&#123;
    class Program
    &#123;
        static void Main&#40;string&#91;&#93; args&#41;
        &#123;
            //read text from user
            Console.Write&#40;"Enter Text&#58; "&#41;;
            string line = Console.ReadLine&#40;&#41;;

            //define array
            string&#91;&#93; Words = new string&#91;100&#93;;

            //define temp 
            string temp = "";

            int WordIndex = 0;

            while &#40;line.Length != 0&#41;
            &#123;                
                for &#40;int i = 0; i < line.Length; i++&#41;
                &#123;
                    //We have a regular character - part of a word 
                    if &#40;line&#91;i&#93; != ' ' & line&#91;i&#93; != ' ' & line&#91;i&#93; != ',' & line&#91;i&#93; != '.' & line&#91;i&#93; != '$'&#41;
                    &#123;
                        temp += line&#91;i&#93;;
                    &#125;
                    //special characters 
                    else
                    &#123;
                        Words&#91;WordIndex&#93; = temp;
                        WordIndex++;
                        temp = ""; 
                    &#125;                      
                &#125;

                line = Console.ReadLine&#40;&#41;;
            &#125;

            for &#40;int i = 0; i < WordIndex; i++&#41;
            &#123;
                Console.Write&#40;Words&#91;i&#93;&#41;;
            &#125; 

            Console.ReadLine&#40;&#41;;

        &#125;
    &#125;
&#125;

bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #15 

קוד: בחירת הכל

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

namespace PrintWordWordFromText 
&#123; 
    class Program 
    &#123; 
        static void Main&#40;string&#91;&#93; args&#41; 
        &#123; 
            //read text from user 
            Console.Write&#40;"Enter Text&#58; "&#41;; 
            string line = Console.ReadLine&#40;&#41;; 

            //define array 
            string&#91;&#93; Words = new string&#91;100&#93;; 

            //define temp 
            string temp = ""; 

            int WordIndex = 0; 

            while &#40;line.Length != 0&#41; 
            &#123;                
                for &#40;int i = 0; i < line.Length; i++&#41; 
                &#123; 
					///////////////DEBUG/////////////////////////
					Console.WriteLine&#40;i&#41;;
					Console.WriteLine&#40;line&#91;i&#93;&#41;;
					/////////////////////////////////////////////
                    //We have a regular character - part of a word 
                    if &#40;line&#91;i&#93; != ' ' & line&#91;i&#93; != ' ' & line&#91;i&#93; != ',' & line&#91;i&#93; != '.' & line&#91;i&#93; != '$'&#41; 
                    &#123; 
                        temp += line&#91;i&#93;; 
                    &#125; 
                    //special characters 
                    else 
                    &#123; 
                        Words&#91;WordIndex&#93; = temp; 
                        WordIndex++; 
                        temp = ""; 
                    &#125;                      
                &#125; 

                line = Console.ReadLine&#40;&#41;; 
            &#125; 

            for &#40;int i = 0; i < WordIndex; i++&#41; 
            &#123; 
                Console.Write&#40;Words&#91;i&#93;&#41;; 
            &#125; 

            Console.ReadLine&#40;&#41;; 

        &#125; 
    &#125; 
&#125; 
הוספתי שתי שורות שאמורות להדפיס את האינדקס ואת התו שנמצא באנינדקס, אתה יכול להוסיף עוד שורות של הדפסה בשביל לעקוב אחרי הבעיה.

אבל:
הרבה יותר קל להשתמש בbreakpoints אם אתה יודע מה זה, אם לא. אני מציע לך לקרוא על זה.

shayze
סמל אישי של משתמש
חבר ותיק
חבר ותיק
תגובות: 2626
הצטרף: מאי 2011
נתן תודות: 165 פעמים
קיבל תודות: 137 פעמים

שליחה #16 

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

קוד: בחירת הכל

if &#40;line&#91;i&#93; >= &#40;int&#41;'a' && line&#91;i&#93; <=&#40;int&#41;'z'
ולעשות אותו תנאי על A-Z באותיות גדולות.
תמיד עדיף בדוק מה עונה על התנאים ולא את כל אלה שלא עונים על התנאים.
ואז זה רק עניין של לזהות התחלה וסוף של מילה, ולאחסן את המילים באיזה מבנה נתונים שלמדת עליו.
חשוב שיהיה ניתן לשינוי באופן דינמי כי אתה לא יודע מה גודל הקלט המקסימלי שלך.
עלינו לשמור על איכות הסביבה למען ילדינו. לפעמים פעולות קטנות כל יום עושות שינוי גדול.

The story of stuff
http://www.storyofstuff.com/

haimbl
חבר ותיק
חבר ותיק
תגובות: 1202
הצטרף: פברואר 2009
נתן תודות: 29 פעמים
קיבל תודות: 39 פעמים

שליחה #17 

אם הבנתי נכון את התרגיל שלך, זה אמור לעבוד:

קוד: בחירת הכל

  int indexLocation = 0;
            var words = new string&#91;100&#93;;
            string input = string.Empty;

            while &#40;!string.IsNullOrWhiteSpace&#40;&#40;input = Console.ReadLine&#40;&#41;&#41;&#41;&#41;
            &#123;
                string&#91;&#93; inputWords = input.Split&#40;' ', ',', '.', '$'&#41;;
               
                foreach &#40;var inputWord in inputWords&#41;
                &#123;
                    words&#91;indexLocation&#93; = inputWord;
                    indexLocation++;
                &#125;
            &#125;


bg1987
חבר ותיק
חבר ותיק
תגובות: 1232
הצטרף: פברואר 2008
נתן תודות: 26 פעמים
קיבל תודות: 30 פעמים

שליחה #18 

לא חבל לפתור לא את התרגיל?
חוץ מזה, haimbl אתה פותר את זה הרבה יותר בקלות עם REGEX.

shayze
סמל אישי של משתמש
חבר ותיק
חבר ותיק
תגובות: 2626
הצטרף: מאי 2011
נתן תודות: 165 פעמים
קיבל תודות: 137 פעמים

שליחה #19 

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

The story of stuff
http://www.storyofstuff.com/

haimbl
חבר ותיק
חבר ותיק
תגובות: 1202
הצטרף: פברואר 2009
נתן תודות: 29 פעמים
קיבל תודות: 39 פעמים

שליחה #20 

shayze כתב:בכל מקרה עושה רושם שיש באג בקוד בתנאי העצירה (מקרה קצה)
...
איזה מקרה קצה?

שלח תגובה

חזור אל “רשתות, אינטרנט ו- Fiber”