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

سؤال سوف يحفزك تفكيرك

بدأه mental-driller في 11 يونيو 2011 · 32 رد · 2,784 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

هذا اول موضوع اقوم بكتابته في المنتدى

بالرغم من اني لست بارع في كتابة المواضيع ولكني ارى انه في هذا الموضوع تحفيز فكري للاشخاص الذين يرغبون في التحدي وتنمية قدراتهم الذهنية

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

يمكن تقليل عدد حلقات التكرار فيه الى حلقه واحده

السؤال بكل بساطة : مطلوب منك كتابة برنامج ياخذ رقم من المستخدم يمثل حجم الشكل الذي ستقوم برسمه ومن ثم يقوم البرنامج برسم شكل معين

ولكن باستخدام بنية تكرار loop واحده فقط !

One and only one loop

Enter the desired size
9
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

في الاعلي مثال على تنفيذ البرنامج

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#2

السلام عليكم..

بلغة مثل الـPHP، هل يمكن استخدام str_repeat؟؟ ليس loop، مجرد دالة!

هل هذا متاح؟!

#3

لا، الهدف ليس الاختصار وانما طباعة الشكل حرف حرف باستخدام اللوب

بحيث اللوب يحتوي على عدد الفراغات والرموز التي ستقوم بطباعتها

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#4

ارجو الرد

ما تقصده من هدف السؤال

هو طباعة تكرار النجوم بالسطر

وتكرار الاسطر

مثلا

انت طرحت رقم 9, لدينا في حال الخرج , 9 اسطر,

وعدد النجوم بالسطر المنتصف 9 *********

.

وكل هذا العمل بحلقة تكرار واحدة..........

سنجرب

بالتوفيق للجميع

A hope by smiling,,,,so why to be sad.....

#5

الفكرة تقوم على حساب عدد الفراغات يمين ويسار النجوم في كل سطر. هذا الكود بلغة Python ولكنه مفهوم لمن لا يعرفها على ما أعتقد:

number = int(input('Enter the desired size: '))
width = 1
increment = 2
for i in range(0,number):
    if width >= number:        
        increment = -2
    spaceCount = number - width + 2
    print(' '*(spaceCount//2) + '*'*width + ' '*(spaceCount//2))
    width = width + increment

لا يعمل بشكل جيد على الأعداد الزوجية، ولكن هذا عائد لطبيعة طريقة الرسم.

والآن كاستعراض لقوة بايثون (وقوة البرمجة الـfunctional بشكل عام) نفس البرنامج بدون أي loop :lol:

from functools import *
number = int(input('Enter the desired size: '))

spaceCount = lambda width, number: number - width + 2     
drawLine = lambda width, number: ' '*(spaceCount(width, number)//2) + '*'*width + ' '*(spaceCount(width, number)//2)
widths = list(range(1, number+1, 2))
widths.extend(list(range(max(widths)-2,0,-2)))
lines = map(lambda width: drawLine(width, number),widths)
string = reduce(lambda x,y: x+'\n'+y, lines)

print(string)
1
#6

كانت المسألة تحتاج تفكير بالفعل , و كانت مشكلتى الأكبر اننى اريد تحدى نفسى و كتابتها بلغة ليست بلغتى اليومية و هى سى ++

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
	int lines;
	cin >> lines;
	for( int line=0; line<lines; line++){

		int astr = line<lines/2 ? (line+1)*2-1 : (lines-line)*2-1;
		int spaces = lines/2-astr/2;
		if( spaces>0 ){
			cout.width(spaces);
			cout.fill(' ');
			cout << ' ';
		}
		cout.width(astr);
		cout.fill('*');
		cout << '*'<< endl;
	}
	return 0;
}

اشكرك على المسألة القيمة و ارجو ان تعيد الكرة بمسألة اخرى ,

ولكن ارجو الإبتعاد عن مسائل project euler لأنها تطلب الناتج ارقام اما هذة المسألة متعتها فى ان المخرجات أشكال :)

1
#7

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

اخي هذا حل السؤال بالفيجوال بيسك


Dim n As Integer = Convert.ToInt32(Console.ReadLine())
Dim c As String = ""
Dim h As Integer = (n + 1) / 2
Dim inc As Integer = 1
For i As Integer = 1 To n
If i <= h Then
Console.WriteLine(c.PadLeft(h - i, " "c) & c.PadLeft(inc, "*"c))
inc += 2
Else
Console.WriteLine(c.PadLeft(h - (n + 1 - i), " "c) & c.PadLeft(inc - 4, "*"c))
inc -= 2
End If
Next
Console.WriteLine("Enter the desired size?")

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

... -9 -7 -5 -3 -1 0 1 3 5 7 9 ...

1

.:: Wish to become better and better ::.

#8

الشرط في السؤال هو استخدام جملة طباعة واحده وطباعة حرف واحد فقط في كل تكرار

printf("*");

او

printf(" ");

او

printf("*\n");

يعني يجب ان تطبع حرف واحد في كل تكرار سواء كان * او * متبوع بسطر جديد او فراغ

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

+1 لكل شخص حاول بجديه :)

بشكر ليكم مروركم بالموضوع ، بس استحملوني كمان شويه ، هي المتعه تبدأ فعلا لما المسأله تصير بطباعة حرف واحد فقط في كل تكرار مما يصعب المسأله ولكن يجعلها ممتعه اكثر

سبب رفضي لاستخدام دوال الwidth والpad هو انها بتستخدم لوب ضمني بداخل الداله مما يجعل الامر كانك استخدمت لوب اخر

:)

تم تعديل هذه المشاركة بواسطة mental-driller في 11 يونيو 2011 في 07:54

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#9

هل من المتاح أخي استعمال المتغيرات و المصفوفات؟ و طباعة النتيجة بعد التكرار؟؟

#10

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

بما انك تستخدم بي اتش بي بدلا من استخدام printf سوف تستخدم echo على ما اعتقد

وهنا عليك طباعة حرف واحد فقط في كل تكراره اما يكون نجمه asterisk او نجمه متبوعه بسطر جديد او فراغ

هذا هو الهدف من السؤال وهنا تكمن الصعوبه ، اما استخدام الدوال التي تقوم هي بتكرار النجمات او الفراغات من نفسها مرفوض فهي تستخدم جملة تكرار داخليه تجعل برنامجك

وكانه تم ادخال حلقة تكرار جديد داخل برنامجك

البرنامج سوف يكون اقرب الى الشكل التالي

variables initialization
for loop
condition 1 : print *
condition2 : print " "
condition : "*\n"

هذا pseudo code مشابه لما ستقوم به ولكنه ليس كل التفاصيل موضحه فيه ، ترتيب طباعه الحروف ليس بالضروره صحيح

1

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#11

اعذرني فأنا أسأل بكثرة! لماذا لا نضع مسافات بعد النجوم (من اليمين) في الأسطر التي فيها مسافات من اليسار أيضاً، ألن يكون هذا أسهل؟؟

تم تعديل هذه المشاركة بواسطة sitesmaker في 11 يونيو 2011 في 11:49

#12
from math import *
number = int(input("Enter number: "))
width = 1
center = ceil(number/2)
stars = 
increment = 2
for i in range(1, number**2+1):
    x = i%number

    if x in stars or x==0 and 9 in stars:
        print("*",end="")
    else:
        print(" ",end="")

    if x==0:
        print("\n",end="")
        if width >= number:
            increment = -2
        width+=increment
        half = width//2
        stars = list(range(center-half, center + half + 1))

تم تعديل هذه المشاركة بواسطة System Down في 11 يونيو 2011 في 12:17

1
#13

غير معقول بقالي من البارح ساعة حطيت الموضوع ومش حصلت هههه غبي مثلا !!! :blush:

هل توجد طرق معينة علمية للبحث عن الالغوريتم

جاري المحاولة :wacko: ...

#14

هذا ما توصلت اليه بالسي اضن انه الحل

رغم انه ليس افضل حل ولكن على قد عقلي :P

#include<stdio.h>

main()
{
	int n,i,end,strt,colonne,revers=0;

	scanf("%d",&n);

	strt=end=(n+1)/2;

	colonne = 1;
	for(i=1;i<n*n;i++)
	{
		if(colonne>=strt && colonne<= end)
			printf("*");

		else if (colonne>end)
			{
				if(revers)
				{
					strt++;
					end--;

				}else{
					strt--;
					end++;
					}

				colonne=0;
				printf("\n");
				}
		else 
			printf(" ");

		if(colonne==n)
			revers=1;

		colonne++;

	}
}

تم تعديل هذه المشاركة بواسطة youssefchou في 11 يونيو 2011 في 17:12

1
#15

تحسين :)

#include<stdio.h>

main()
{
        int n,i,end,strt,colonne,revers=0;

        scanf("%d",&n);

        strt=end=(n+1)/2;

        colonne = 1;
        do
        {
                if(colonne>=strt && colonne<= end)
                        printf("*");

                else if (colonne>end)
                        {
                                if(revers)
                                {
                                        strt++;
                                        end--;

                                }else{
                                        strt--;
                                        end++;
                                        }

                                colonne=0;
                                printf("\n");
                                }
                else 
                        printf(" ");

                if(colonne==n)
                        revers=1;

                colonne++;

        }while(strt<=end);
}

بالتوفيق

1
#16

youssefchou وماله حلك تمام :) ارجو ان تكون استفدت ذهنيا من هذا التمرين

System Down عمل رائع ، كنت شبه متاكد ان احد الاعضاء سوف يستخدم ال functional programming ولكن كنت اعتقد انك سوف تستخدم haskell or lisp وليس بايثون

sitesmaker لا ادري كيف يمكن ان تستفيد من وضع فراغات في اليمين الا في حالة انك تطبع شكلين متجاورين بشكل افقي

تم تعديل هذه المشاركة بواسطة mental-driller في 11 يونيو 2011 في 20:55

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#17
mental-driller كتب:

youssefchou وماله حلك تمام :) ارجو ان تكون استفدت ذهنيا من هذا التمرين

System Down عمل رائع ، كنت شبه متاكد ان احد الاعضاء سوف يستخدم ال functional programming ولكن كنت اعتقد انك سوف تستخدم haskell or lisp وليس بايثون

sitesmaker لا ادري كيف يمكن ان تستفيد من وضع فراغات في اليمين الا في حالة انك تطبع شكلين متجاورين بشكل افقي

هذا لأنني لا أعرف Haskell أو Lisp :lol:

خبرتي في الـFP تنحصر تقريباً في بعض اللغات الـimperative التي تدعمها: بايثون، #C و VB.NET. واللغة الـfunctional الوحيدة التي أعرفها هي #F.

#18
mental-driller كتب:

sitesmaker لا ادري كيف يمكن ان تستفيد من وضع فراغات في اليمين الا في حالة انك تطبع شكلين متجاورين بشكل افقي

في رأيي أستطيع! إذا أردنا كتابة 9 أسطر، إذن سيكون من السهل أن يكون تكرار الـLoop بعدد 9*9، صحيح؟ هذا غير ممكن إلا بترك نفس عدد الفراغات الموجودة على اليسار في اليمين كذلك!

أياً كان أنا يئست من المحاولة.. و لم أعد أريد التجربة، ههههههه! فضلاً عن أني لا أفهم هذه الأكواد المكتوبة في الصفحة لعدم معرفتي بالبرمجة بهذه اللغات..

#19

في رأيي أستطيع! إذا أردنا كتابة 9 أسطر، إذن سيكون من السهل أن يكون تكرار الـLoop بعدد 9*9، صحيح؟ هذا غير ممكن إلا بترك نفس عدد الفراغات الموجودة على اليسار في اليمين كذلك!

بالضبط اخي 9*9 باحتساب تلك المسافات

اي لغة تتقن اخي الكريم

اأياً كان أنا يئست من المحاولة...

حاول غدا مثلا :)

و لم أعد أريد التجربة، ههههههه! فضلاً عن أني لا أفهم هذه الأكواد المكتوبة في الصفحة لعدم معرفتي بالبرمجة بهذه اللغات..

نا ايضا لم افهم ايه دي الي بتحكوا عليها هل هي modular programming ؟ في السي مثلا ?

#20
youssefchou كتب:

في رأيي أستطيع! إذا أردنا كتابة 9 أسطر، إذن سيكون من السهل أن يكون تكرار الـLoop بعدد 9*9، صحيح؟ هذا غير ممكن إلا بترك نفس عدد الفراغات الموجودة على اليسار في اليمين كذلك!

بالضبط اخي 9*9 باحتساب تلك المسافات

اي لغة تتقن اخي الكريم

لا أريد تحويل الموضوع.. لكني أتقن PHP.

#21

sitesmaker قم بكتابة for loop عاديه واستخدم داله الطباعة الخاصة بPHP واطبع اما فراغ او نجمه او نجمه متبوعه بسطر جديد

ليس للامر دخل بتفاصيل لغات البرمجه، كل ما تحتاجه هو اساسيات اللغة التي تبرمج بها

بخصوص الفراغات اللي على اليمين ، مش مشكله استخدمهم مادام راح يسهلوا عليك الامور، انا كان قصدي انك سواء طبعتهم او لا ليس لهم تاثير

اذا مازلت تواجه مشاكل سوف اعطيك مساعده

استمر بالمحاوله

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#22

شكراً لك أخي mental-driller على التشجيع! أنا لم أربط الموضوع باللغة، أنا سُـئلت في الموضوع هنا من أحد الإخوة ما اللغة التي أستخدمها، فرددت عليه لعله يستطيع مساعدتي..

لم أستطع برمجة أكثر من هذا:

<?php 

function show_stars($number){$loop=$number; $count=1; $start_stars_at=ceil($number/2); $stars_no=1; $lines_done=0;

while($loop){
if($count >= $start_stars_at){

if($stars_no-$count <= 0){echo "*\n"; $lines_done++;
if($lines_done < ceil($number/2)){$start_stars_at=$start_stars_at-2; $stars_no=$stars_no+2; $loop--; $count=0;}
else{$start_stars_at=$start_stars_at+2; $stars_no=$stars_no-2; $loop--; $count=0;}
}

else echo "*";
}

else echo " ";

$count++;
}
}
?>

هذه دالة بسيطة من برمجتي بعد ساعات من المحاولات.. لم أصل للنتيجة المرجوة، لكني قطعت على الأقل 75% من المطلوب..

في حالة ضبط المتغير number إلى 3 تعمل بشكل ممتاز و صحيح:

 *
***
 *

في حالة ضبطه مثلاً لـ5، يخرج نتيجة خاطئة، تحتاج فقط إضافة مسافة قبل السطر الثاني، و قبل السطر الرابع:

  *
***
*****
***
  *

في حالة ضبطه لـ7، يخرج نتيجة خاطئة، تحتاج إضافة مسافة قبل السطر الثالث و قبل الخامس، و إضافة مسافة و بعدها نجمة قبل السطر الثاني و قبل السطر السادس:

   *
 **
*****
*******
*****
 **
   *

في حالة ضبطه لـ9:

    *
  *
*****
*******
*********
*******
*****
  *
    *

من الواضح أن الأخطاء الناتجة عن الكود هي نفسها أي بالتدقيق وراءها يمكن إصلاحها.. ربما أحاول إصلاحها و وضع الكود الصحيح هنا إن شاء الله، و إن استطعت..

شكراً!

تم تعديل هذه المشاركة بواسطة sitesmaker في 13 يونيو 2011 في 22:37

1
#23

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

اعتقد انه يمكن ان يكون الحل كالأتى وذلك على ان يكون الـ Loop فى N ^ 2 وذلك باستخدام الفيجوال بيسك

Private Sub cmd_draw_Click()
Dim i, q, n, d As Integer
txt_plan = ""
n = Val(txt_num)
For i = 1 To n ^ 2
    q = Int((i - 1) / n) + 1
    If q <= (n + 1) / 2 Then
        q = q
    Else
        q = n + 1 - q
    End If
    d = i Mod n
    If d = 0 Then d = n
      If d > (n - 2 * q + 1) / 2 And d < (n + 2 * q + 1) / 2 Then
            txt_plan = txt_plan + " * "
        Else
            txt_plan = txt_plan + "   "
        End If
        If i Mod n = 0 Then
            txt_plan = txt_plan + "   " + vbCrLf
        End If
Next i
End Sub

Private Sub Form_Load()
txt_num = 9
End Sub

ويوجد فى المرفقات الملفات بالكود والملف التنفيذى

How To Draw N.rar

1
#24

sitesmaker الخطأ عندك هو هنا

$start_stars_at=$start_stars_at-2
$start_stars_at=$start_stars_at+2

عدد الفراغات يزيد بمقدار الواحد وليس بشكل فردي

$start_stars_at=$start_stars_at-1
$start_stars_at=$start_stars_at+1

الان ستحصل على عدد فراغات صحيح ولكن عدد النجوم لا زال غير صحيح وهذه هي مهميك التاليه

Enter size
7
   *
  *
 ****
*******
 ****
  *
   *

الى حد الان اعتقد ان هذا 80%

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#25

السلام عليكم، تم بفضل الله و بمساعدتك أخي mental-driller كتابة كود يلائم المطلوب، و 100% إن شاء الله، و لو أني تأخرت كثيراً!

<?php 

function show_stars($number){$loop=$number; $count=1; $spaces_no=floor($number/2); $stars_no=1; $lines_done=0;
$spaces=$spaces_no; $stars=$stars_no;
while($loop){
if($spaces){echo " "; $spaces--;}

elseif($stars > 1){echo "*"; $stars--;}


else{echo "*\n"; $lines_done++;
if($lines_done < ceil($number/2)){$spaces_no=$spaces_no-1; $stars_no=$stars_no+2; $loop--; $spaces=$spaces_no; $stars=$stars_no;}
else{$spaces_no=$spaces_no+1; $stars_no=$stars_no-2; $loop--; $spaces=$spaces_no; $stars=$stars_no;}
}
}
}

?>

هذا كود مختلف كثيراً، و لكنه أبسط إن شاء الله..

جربته من 3 إلى 21، و يعمل بشكل صحيح، و لله الحمد..

تم تعديل هذه المشاركة بواسطة sitesmaker في 14 يونيو 2011 في 11:07

1

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