أهلا بك،
البرنامج التالي سيساعدك لطباعة مربع من النجوم بالطول الذي يدخله المستخدم وبحلقة لوب for واحدة فقط.
دعني أذكر التوضيح لكل مجموعة من الأسطر على حده ثم أعيد البرنامج كاملا في النهاية.
في البداية نتحقق أن الطول المدخل ليس صفر أو عدد سالب، وإن حدث سنتجاهل الأمر ونطبع نصاً فارغاً، وفي حين كان الطول المخل هو 1 سنطبع نجمة واحد كناتج للبرنامج، ماعدا ذلك نستطيع أن نعتبر الأطوال المدخلة هي أطوال قابلة أن تكون ضلعاً لمربعٍ من النجوم.
إذن الأن هدف البرنامج هو استقبال طول ضلع المربع من المستخدم ورسمه على الشاشة باستخدام النجوم.
public static string CreateASCIISquare(int squareSideLength, char c = '*')
{
if (squareSideLength < 1)
return "";
if (squareSideLength == 1)
return c.ToString();
الفكرة هي أن تتم الطباعة سطر سطر وعدد السطور سيكون نفس الطول المدخل، سنجعل السطر الأول والأخير(الضلعان العلوي والسفلي للمربع)يحتويان على نجوم بعدد الطول المدخل (ليتحقق شرط الأعمدة تساوي الطول المدخل وتساوي عدد السطور) ، والأسطر الداخلية ستحتوي على نجمتين فقط على كل طرف نجمة واحدة بينهما فراغ، وبتكرار طباعة الأسطر الداخلية بهذا الترتيب عدد معين من المرات ستحصل على فراغ في النتصف وحدوده نجوم بشكل مربع تماما أي الطول والعرض متساويان وسيكون عدد الصفوف مساوياً لعدد الأعمدة.
var horizontalOuterRow = new String(c, squareSideLength);
var horizontalInnerRow = $"{c}{new string(' ', squareSideLength - 2)}{c}";
var squareBuilder = new StringBuilder();
سنبدأ بالطباعة على الشاشة وإظهار السطر الأول كما حددناه
squareBuilder.AppendLine(horizontalOuterRow);
يلزم الأن حلقة التكرار for لطباعة الأسطر الداخلية بالطريقة التي ذكرناها، لكن لاحظ أن الحلقة ستستمر بعدد الأسطر الداخلية فقط حيث أننا في النهاية سنضيف السطر الأخير تماما كما أضفنا السطر الأول بشكل منفصل عن حلقة التكرار إذن الحلقة ستتكر بعدد أقل من عدد السطور الكلي(طول الضلع)بمقدار 2 وهذا النقصان سببه الضلعان العلوي والسفلى الذان يضافان على الشاشة بدون تدخل من حلقة التكرار
for (int i = 0; i < squareSideLength - 2; i++)
{
squareBuilder.AppendLine(horizontalInnerRow);
}
سنضيف الأن الضلع السفلي بشكل منفصل كما اتفقنا في إضافة الضلع العلوي
squareBuilder.Append(horizontalOuterRow);
إنتهت عملية الطباعة وسنرجع ناتج الدالة
return squareBuilder.ToString();
}
البرنامج كاملا
public static string CreateASCIISquare(int squareSideLength, char c = '*')
{
if (squareSideLength < 1)
return "";
if (squareSideLength == 1)
return c.ToString();
var horizontalOuterRow = new String(c, squareSideLength);
var horizontalInnerRow = $"{c}{new string(' ', squareSideLength - 2)}{c}";
var squareBuilder = new StringBuilder();
squareBuilder.AppendLine(horizontalOuterRow);
for (int i = 0; i < squareSideLength - 2; i++)
{
squareBuilder.AppendLine(horizontalInnerRow);
}
squareBuilder.Append(horizontalOuterRow);
return squareBuilder.ToString();
}
بالتوفيق...