namespace

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

10 ردود في هذا الموضوع

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

استكمالاً لفكرة الحركات التفاعلية التي طرحناها في مواضيع سابقة ، ولجعل ++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[i][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][i] = str[i];

// 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

ما شاء الله

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

بالتوفيق ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

وفقققك الله

شغل جميل جدا

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

بالتأكيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .