الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام While

بدأه abeer Eng في 2 يونيو 2009 · 2 رد · 466 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

اولا اعتذر عن كثرة استفساراتي

ولدي مشكله مع جملة الوايل بحيث اذا انتهى الملف فانها تنهي البرنامج

	 if ((number_of_spaces + 8) > line_lenght)
					{
						//textBox2.Text += "\r\n";

						MessageBox.Show("دخل");
						while (number_of_spaces + 8 > line_lenght)
						{
							textBox20.Text += "\r\n";
							MessageBox.Show("دخل");
							strLine = r.ReadLine();
							textBox20.Text += strLine;
							if (strLine == null)
							{

								line_lenght = 80;
								MessageBox.Show(line_lenght.ToString());


							}
							line_lenght = 80 - strLine.Length;
							MessageBox.Show("خرج" + line_lenght.ToString());
							MessageBox.Show(line_lenght.ToString());
						}
											}

المطلوب من الوايل بانها تبحث عن قيمه لطول السطر

اي بما ان طول السطر line_lingth

اقل من عدد معين مضاف اليه ثمانه number_of space+8

اولا تنزل سطر في التيكست بوكس

ثم تقراء من ملف معين نكون قد قرانا منه سابقا

و نرى هل وصلنا الى نهاية السطر ؟؟

   if (strLine == null)
							{
								MessageBox.Show("break"); 
								line_lenght = 80;
								MessageBox.Show(line_lenght.ToString());


							}

اذا كان كذلك نضع القيمه 80

و اذا لم نصل

فننا نحسب قيمه line_lenght

عن طريق هذه المعادله

line_lenght = 80 - strLine.Length;

المشكلة لدي انه اذا وصل نهاية الملف

فانه يخرج من البرنامج و لا يعطي قيمه للمتغير لاين لينث

حاولت كثيرا فيه

ولكن انا اجد صعوبه في فهم و استخدام while

اتمنى مساعدتكم لي في ايجاد الخطاء

#2

ما زلت انتظرمساعدتكم

حاولت بطريقه اخرى ولكن اصبح الان بمجرد يدخل while

يعلق البرنامج

if (strLine != null)

{

while (number_of_spaces + 8 < line_lenght)

{

strLine = r.ReadLine();

if (strLine == null)

{

textBox20.Text += "\r\n";

break;

}

textBox20.Text += "\r\n" + strLine;

line_lenght = 80 - strLine.Length;

}



}

if (number_of_spaces == 0)

{



textBox20.Text += '\t';

}

تم تعديل هذه المشاركة بواسطة abeer Eng في 3 يونيو 2009 في 11:11

#3

ساعيد توضيح المطلوب

الان البرنامج هدفه اضافة مسافات داخل الملف تبعا لخوارزميه wite space

وذلك عن طريقين

1-بنهاية كل سطر في الملف

2-بنهاية الملف النصي

الكود الذي وضعته يطبق فقط الطريقه الاولى

اي يضيف بنهاية السطر فقط و بمجرد انتهاء الاسطر يقف ولا يضيف اي شي

هذا هو الجزء من الكود الذي تواجهني به مشاكل

StreamReader r = new StreamReader(file_path);

				 strLine = r.ReadLine();
				line_lenght = 80 - strLine.Length;
				textBox20.Text += strLine;
				int c = 0;
				for (int m = 0; m < decimal_number.Length; m++)
				{

					number_of_spaces = Convert.ToInt32(decimal_number[m].ToString());


						while (number_of_spaces + 8 > line_lenght )
						{
							strLine = r.ReadLine();

							textBox20.Text+= "\r\n"+strLine;
							line_lenght = 80 - strLine.Length;
						}
						if ((number_of_spaces + 8) < line_lenght)
						{
							c = 1;
						}
								  if (c == 1)
					{

						textBox20.Text += "\r\n";
					}
					if (number_of_spaces == 0)
					{
						textBox20.Text += '\t';

					}

					else
					{
						for (int i = 0; i < number_of_spaces; i++)
						{
							if (i == 0)
							{
								textBox20.Text += '\t';
							}
							textBox20.Text += " ";
						}

					}
					if (strLine != null)
					{
						line_lenght = line_lenght - (number_of_spaces + 8);

					}

				}
				while (strLine != null)
				{

					strLine = r.ReadLine();
					textBox20.Text += "\r\n" + strLine;
				}
				r.Close();

في البداية يقراء البرنامج اول سطر من الملف النصي و يضيفه الى التيكست بوكس

عن طريق

strLine = r.ReadLine();

ثم يحسب عدد الاماكن الفاضيه في هذا السطر

line_lenght = 80 - strLine.Length;

اسااسا يوجد لدينا متغير اسمه

decimal_number

يحوي سلسله من الارقام مثلا

decimal_number="23097543467872"

كل رقم من هذه الارقام راح نعوض عنه بمسافات نضيفها لكل سطر في الملف

لذلك وضعنا for loop

for (int m = 0; m < decimal_number.Length; m++)

ناخذ اول رقم موجود في مصفوفه decimal_number

نخزنه في متغير اسميته number_of_space

number_of_spaces = Convert.ToInt32(decimal_number[m].ToString());

طيب انا اخذ الرقم من المصفوفه

بس فيه شرط لاضافة وهو

لازم قبل اعوض عن كل رقم بمسافات اضع قبلها تاب

اي

\t--

يعني الرقم اللي باعوض عنه هو

المسافات+تاب

بما ان تاب عبارة عن 8 مسافات

اذا انا كل مرة راح اضيف

8+number_of_space

طيب احنا في البداية قرانا اول سطر من الملف

ونقطه مهمه اننا لمى وضعناه في التيكست بوكس لم ننزل سطر استعداد للكتابه بجانبه

وقسنا المسافات الباقيه في السطر استعداد لتعبئتها

بقى نختبر هل المسافات تكفي نضع فيها كل

8+number_of_space

او لا

while (number_of_spaces + 8 > line_lenght )

هذا الشرط بندخله اذا كان المسافه الموجوده بالسطر غير كافيه

لذلك بيبحث عن سطر جديد بحيث تكون فيه مسافه كافيه لتخزين هذه القيمه

و للخروج من الوايل هناك حالتين

1-يجد سطر يحقق هذا الشرط

2- انتهى من قرائة جميع الاسطر في الملف

في الحاله الاولى

راح يكمل تنفيذ الاوامر حتى يبدى بدورة اخرى مع عدد جديد

اما في الحاله الثانيه

فانه سيخرج من جملة while

بالطبع يحمل قيمه للمسافات الخاليه في السطر

في المتغير line_lenght

و هذه القيمه اما ان تكون كافيه و بالتالي سيعمل كما في الحاله الاولى

و ام غير كافيه و بالتالي سوف يدخل الى هذا الشرط

 if ((number_of_spaces + 8) < line_lenght)
						{
							c = 1;
						}

c

هو تغير حساس لاعرف منه اني وصلت الى نهاية الملف و ابدى الاضافة

مباشرة بعد اخر سطر في الملف بدون اي شرط

				if (c == 1)
					{

						textBox20.Text += "\r\n";
					}

ارجوا اني وضحت الكود المكتوب جيدا بقي اوضح النقاط التي اواجه صعوبه في حلها

1-البرنامج بمجرد يخرج من جملة while

فانه ينهي البرنامج ولا يضيف اي شي

2-في كل مرة يزيد الفور راح يرجع يختبر قيمه c

وبما انها صحيحه فانه سوف ينزل سطر جديد كل مره و انا اريد سطر واحد فقط في نهايه الملف و لايهمني الى اي طول سوف يصل

استخدمت طريقه اخرى ولكن نفس المشكله

test:

if (number_of_spaces + 8 > line_lenght && c == 0)

{

textBox4.Text += "\r\n";

strLine = r.ReadLine();

if (strLine == null)

{

c = 1;

}

textBox4.Text += strLine;

line_lenght = 80 - strLine.Length;

goto test;



}

يارب اني قدرت اوضح الفكرة

وتقدرون تساعدوني :(

تم تعديل هذه المشاركة بواسطة abeer Eng في 3 يونيو 2009 في 22:32

مواضيع مشابهة