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

طباعة نص متصاعد وكأنك في power point !

بدأه namespace في 24 يوليو 2010 · 9 رد · 3,096 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كالعادة أعضاء المنتدى الأكارم ، فور جهوز الموضوع وطرحه في شبكة تكنولوجيا المعلومات والهندسة التقنية ، سأضع نسخة منه في بيتي الثاني منتديات الفريق العربي للبرمجة ، أرجو أن ينال إعجابكم وتقديركم ، لأن تعبي في كتابة الكود لا يقارن بذاك في شرحه وتقديمه ، أترككم مع الموضوع :

استكمالاً لفكرة الحركات التفاعلية التي طرحناها في مواضيع سابقة ، ولجعل ++C أكثر حيوية ، أقدم لكم هذا الموضوع الغريب العجيب ، ليبرهن لك أن إمكانيات الـ ++C لا حدود لها ، فقط استخدم خيالك !

ما نود الوصول إليه في النهاية هو الشكل التالي :

2gv8toy.jpg

إذا فكرنا بالموضوع من ناحية برمجية علينا استخدام مصفوفة ثنائية 15 × 15 ، تتغير محتوياتها كما يلي لتعطينا الصورة السابقة ، ومن ثم يتم طباعتها .

2u5qr8y.jpg

لاحظوا معي الآتي :

38510_134553786582712_100000842732216_171055_5772660_n.jpg

قيمة h تزداد حتى تصل إلى 14 ، إذا نظرنا أفقياً فإن قيمة 1 + h في الواقع هي عدد الأحرف التي سيتم رفعها خطوة واحدة إلى الأعلى ، في البداية نرفع حرفاً واحداً ثم حرفين إلى أن نرفع 14 حرفاً . في كل مرة سنرفع فيها الأحرف ، سنحتاج إلى دوران داخلي بالطبع ، مثلاً عند رفع 5 أحرف ( h = 4 ) سنحتاج إلى دوران داخلي من 0 إلى 4 ، كذلك الأمر عند رفع 6 أحرف ( h = 5 ) سنحتاج إلى دوران داخلي من 0 إلى 5 ، أي أن k ( المتغير في الدوران الداخلي ) تبدأ قيمته من 0 وتنتهي بـ h ، ارجع إلى الصورة أعلاه .

  for(int h=0; h<15; h++)
  {
        for(int k=0; k<=h; k++)
        {
            .
            .
            .
        }
  }

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

38510_134553783249379_100000842732216_171054_2258151_n.jpg

اخترت لك المشهد الذي سيتم فيه رفع الأحرف من C إلى T خطوة واحدة للأعلى ، لاحظ أن h تبقى مكانها بينما k تتغير من 0 إلى h كما أسلفنا للمرور على تلك الأحرف .

موقع الحرف يحدد بالصف والعمود ، كما هو واضح كل الحروف المراد رفعها تقع في العمود k ، أما الصف ؛ كما تلاحظ فإن السهم العمودي يساوي السهم الأفقي كل مرة ، وعدد المربعات التي يقطعها يساوي : h - k ، لكن هذا كان بالنظر من أسفل ، وكما تعلمون في ++C موقع الصف يحسب من أعلى المصفوفة لا من أسفلها ، لذا نطرح ذلك المقدار من 14 ( عدد الصفوف ناقصاً 1 ) .

بعد وضع الحرف في المكان المناسب في العمود علينا إخفاء أثره ، أي التخلص من موقعه السابق ، ذلك يتم من خلال وضع فراغ ' ' في مكانه السابق ( الذي يدنوه بصف ) وبذلك نكون نقلناه كلياً إلى الموقع الجديد . .

  for(int h=0; h<15; h++)
  {
        for(int k=0;  k<=h; k++)
        {
            ch[14 - ( h - k)][k] = str[k];  // move the letter up one step

            // the previous location of the letter  will be replaced with space

            ch[14 - ( h - k ) + 1][k] = ' ';
        }
  }

في القسم الثاني من المشهد لن يختلف الأمر كثيراً :

38510_134553779916046_100000842732216_171053_3681644_n.jpg

في البداية نرفع 14 حرفاً ثم 13 إلى أن نرفع حرفاً واحداً ، لاحظ أننا نرفع الأحرف التي على يمين h ، أي أن k ( المتغير في الدوران الداخلي ) تبدأ قيمته من h وتنتهي بـ 14 ( العمود أقصى اليمين ) كما في الصورة أعلاه .

  for(int h=1; h<15; h++)
  {
        for(int k=h;  k<=14; k++)
        {
            .
            .
            .
        }
  }

سنحدد موقع الحرف مرة أخرى ، العمود هو k دائماً ، أما الصف :

38510_134553789916045_100000842732216_171056_4482584_n.jpg

فيساوي k - h ( السهم الأفقي الذي يساوي السهم العمودي ، موقع الصف يمثله السهم العمودي ) لن نطرح ذلك المقدار من 14 ، لأننا ننظر إلى الصف من أعلى ، خلاف المرة السابقة . .

  for(int h=0; h<15; h++)
  {
        for(int k=0;   k<=h; k++)
        {
            ch[k - h][k] = str[k];

            ch[k - h + 1][k] = ' ';
        }
  }

سيكون لدينا اقتران print للطباعة ، يتم استدعاؤه بعد التعديل على المصفوفة في كل مرة .

كما سيكون هنالك اقتران sleep يثبت المشهد لمدة بسيطة قبل الانتقال إلى الصورة التالية .

الجملة الأولى في الاقتران الرئيسي هي إجراء شكلي فقط لإظهار الحروف مضاءة .

هذا هو الكود كاملاً ، أتمنى أن ينال الموضوع إعجابكم . .

#include <ctime>
#include <iostream>
#include <windows.h>

using namespace std;

void sleep(int d)
{
    clock_t start = clock();
    while(clock() - start < d);
}

char ch[15][15]={' '}; // declaring & initializing the array

void print()
{
    // printing the array

    for(int i=0; i<15; i++,cout<<endl)
        for(int j=0; j<15; j++)
            cout << ch[j];

    sleep(40); // 40 ms delay

    system("cls"); // to clear the screen
}

int main()
{
    // make the text bright

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);  

    char str[16] = "CONGRATULATIONS";  // the text to be printed

    for(int i=0; i<15; i++)  // put the text in the bottom of the array
        ch[14] = str;

   // construct the first part of the scene

    for(int h=0; h<15; h++)
    {
        for(int k=0; k<=h; k++)
        {
            ch[14 - h + k][k] = str[k];  // move the letter up one step

            // the previous location of the letter will be replaced with space

            ch[14 - h + k + 1][k] = ' ';
        }

        print();
    }

    // construct the second part of the scene

    for(h=1; h<15; h++)
    {
        for(int k=h; k<=14; k++)
        {
            ch[k - h][k] = str[k];

            ch[k - h + 1][k] = ' ';
        }

        print();
    }

    cout << str << endl;   // when finishing, print the text

    system("pause");  // press any key to continue

    return 0;
}

2gv8toy.jpg

◄ سبحانك لا علم لنا إلا ما علمتنا إنك أنت العليم الحكيم

◄ للأمانة العلمية يرجى ذكر المصدر عند النقل

رابط الموضوع الأصلي : http://psd-development.com/vb/t687.html

8

البرمجة = الرياضيات

#2

ماهذا التميز يا حمزه.... أستاذ دائما :D

#3

إنها الأفكار النيرة

ما شاء الله

ازادك الله من العلم

#4

بارك الله فيك و بعلمك ..

بالتوفيق ..

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#5

حركة جميلة ، يعطيك العافية ،،

#6

بجد موضوع متميز جدا

وفقققك الله

شغل جميل جدا

جزاك الله خيرا

Software Developer
Mahmoudkelany.com


 

#7

فكرة ممتازة ، واعتمادك على مصفوفة فكرة أجمل :-) .. بس أحب أتفلسف قليلاً ، لذا عندي ملاحظتين :

- ملاحظة صغيرة على sleep ، أظن أنها توقف thread بشكل كامل ، ماذا لو استخدمت دالة أخرى مثل الدالة time ؟ أو بما أنك استدعيت windows ، جرّب مثلاً GetTickCount .

- الكود لن يعمل على Linux كما تعلم ، فبما أنك أردت التطبيق على Console ، هل يمكن الاستغناء عن خدمات windows.h ؟

عمل رائع أخي ،وكود منظم ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8
الشمري كتب:

- ملاحظة صغيرة على sleep ، أظن أنها توقف thread بشكل كامل ، ماذا لو استخدمت دالة أخرى مثل الدالة time ؟ أو بما أنك استدعيت windows ، جرّب مثلاً GetTickCount .

- الكود لن يعمل على Linux كما تعلم ، فبما أنك أردت التطبيق على Console ، هل يمكن الاستغناء عن خدمات windows.h ؟

شكراً لك أخي الكريم

ملاحظاتك ستؤخذ بعين الاعتبار وسأقوم بتعديل الكود على ذلك الأساس

اقتباس
هل يمكن الاستغناء عن خدمات windows.h ؟

بالتأكيد

البرمجة = الرياضيات

#9

راااائع جدا

:)

#10

لكن انا عندما طبقتو اعطاني error

for(  h=1; h<15; h++)

هنا نسيت ان تضع int h

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