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

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

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

قيمة 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++)
{
.
.
.
}
}الأهم مما سبق هو تحديد موقع العنصر المراد رفعه ، الصورة التالية توضح لك الأمر :

اخترت لك المشهد الذي سيتم فيه رفع الأحرف من 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] = ' ';
}
}في القسم الثاني من المشهد لن يختلف الأمر كثيراً :

في البداية نرفع 14 حرفاً ثم 13 إلى أن نرفع حرفاً واحداً ، لاحظ أننا نرفع الأحرف التي على يمين h ، أي أن k ( المتغير في الدوران الداخلي ) تبدأ قيمته من h وتنتهي بـ 14 ( العمود أقصى اليمين ) كما في الصورة أعلاه .
for(int h=1; h<15; h++)
{
for(int k=h; k<=14; k++)
{
.
.
.
}
}سنحدد موقع الحرف مرة أخرى ، العمود هو k دائماً ، أما الصف :

فيساوي 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;
}
◄ سبحانك لا علم لنا إلا ما علمتنا إنك أنت العليم الحكيم
◄ للأمانة العلمية يرجى ذكر المصدر عند النقل
رابط الموضوع الأصلي : http://psd-development.com/vb/t687.html
