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

برنامج Kind of a Blur

بدأه awaTaiba في 3 مايو 2012 · 12 رد · 1,048 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

برنامج الـ Kind of a Blur

post-261317-072113200 1336053854_thumb.p

post-261317-027000100 1336053882_thumb.p

هذا البرنامج مقرر علي كـمشروع وانا في سنتي الاولى للحاسب

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

واجعل المستخدم يدخل عدد الصفوف وعدد الاعمده

ومن ثم ادخال العناصر لها ..

ومن ثم اضع هذه الطلبات في الدواره DO

او الدوار while

واضع شرط لهذه الدواره بحيث ان المستخدم اذا ادخل الارقام ( 000) تنتهي الدوره

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

لكي تصبح لدي المخرجات كالصوره الثانيه ..

وغايتي من طرح هذا الموضوع اني اريد ان اعرف هل طريقتي لفهم المسأله صحيح؟

واريد من حضراتكم الخبراء في البرمجه شرح المساله لي واعطائي بعض الافكار التي تساعدني في الحل ..

اتمنى منكم المساعده بقدر المستطاع وانا واثقه بأنكم تستطيعون المساعده ^^

شاكره لكم مساعدتكم

المرفقات
ه7664578.png3576987979.png
1
#2
اقتباس
وغايتي من طرح هذا الموضوع اني اريد ان اعرف هل طريقتي لفهم المسأله صحيح؟

قومي بتحويل شرحك إلى كود ثم ضعيه هنا و سيتم مناقشته إن كنت تسعي إلى تحسينه او افتحي موضوع جديد من نوع سؤال و ضعي الكود به ليتم محاولة تصحيحه لك.

و الله ولي التوفيق

2

مدونتي: C++ Tips and Tricks

#3

حسنا شكرا لك ^^

2
#4

وهذه هي محاولتي اعزائي

اعرف لدي الكثير من الاخطاء بل ومن الممكن ان تكون عمليه الحل بأكملها خاطئه

 #include<iostream>
using namespace std;

int main()
{


    int rows = 0, cols = 0;
    do
    {
    cout << "pleze enter rows: ";
    cin >> rows;
    cout << "pleze enter cols: ";
    cin >> cols;
    if (rows&&cols==0)
    {
break;
}
else
{
    int *pnewrow;
    int **pMatrix = new int * [rows];

    int i, x, index = 0;
    for (i = 0; i < rows; i++)
    {
        pnewrow = new int[cols];
        *(pMatrix + i) = pnewrow;
        for (x = 0; x < cols; x++)
        {
            cout << "Enter Row: " << i + 1 << " Col: " << x + 1 << ": ";
            cin >> *(*(pMatrix + i) + x); // or cin >> *(pnewrow+x);
        }
    }
    for (i = 0; i < rows; i++)
    {
        for (x = 0; x < cols; x++)
        {
            cout << endl << "Row: " << i + 1 << " Col: "
                    << x + 1 << ": " << *(*(pMatrix + i) + x)<<endl;

        }
    }


    for (x = 0; x < rows; x++)
        delete [] pMatrix[x];
    delete [] pMatrix;
}
}
while(rows||cols==1);

    system("PAUSE");
    return 0;
}

ارجوا منكم المساااعده

في شرح المسأله لي واعطائي بعض الافكار عن الاكواد التي سأستخدمها

شاكره لكم تعاونكم ^^

تم تعديل هذه المشاركة بواسطة awaTaiba في 3 مايو 2012 في 20:13

1
#5

اخواني المبرمجين

احتاج الى مساعدتكم في هذا البرنامج

ارجوا منكم الاطلاع عليه واعطائي افكار بسيطه تساعدني في حله

شاكره لكم مساعدتكم وتعاونكم اخواني الكرام ^-^

1
#6

حسب ما فهمت من سؤال هو اننا هنعمل برنامج ايفكت بلور لصوره ابيض واسود وان القيمالبيكسل المدخله اقل من 100.

هنطلب من المستخدم فى الاول

ارتفاع الصورة بالبيكسل

و عرض الصورة بالبيكسل

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

طبعا هو رغى كتيير فى الموضوع بس جودة الصورة مش كويسه فمعرفتش اقراء كويس

بس مبدايا نبتدى ببعض ملاحظات فى الكود

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

وبعدين برده لو افترضنا ان قال

الشرط ده ميخلهاش تكرر

rows||cols==1

ثانيا شرط الى فيه بريك

rows&&cols==0

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

بتهيالى افضل ان الشرط يكون كده

if (rows <=0 || cols <=0 )

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

احنا ممكن نعمل ببساطه كده

int pMatrix[100][100];

وطبعا هو مقلش نعرض قبل كل بيكسل الجمله العرض ديه يكفى كل سطر لان بكده هنلبخ الى بيدخل

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

int pixel;

        for (int i = 0; i < rows; i++)
       {

            for (int j = 0 ; j < cols; j++)
            {
                cin >> pixel;
                pMatrix[j] = pixel;
            }
        }

وطبعا مينفعش نعمل المعادله اثناء الادخال لاننا ببساطه مش هنتوقع المستقبل بعد ما تتم عملية تخزين نبدا نعمل بلور.

هننشأ مصفوفة ماتريكس تانيه عشان نخزن فىيها الصوره بعد البلور.

int afterblur[100][100];

ونبداء نعمل حلقة فور من جديد هيبقوا تلاته فى بعض

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

ثانيا حلقه تكراريا هتبقى للعموايد وهنراعى برده نفس الموضوع بس الاختلاف هيبقى ان الاغلاق هيبقى مجموع العموايد ناقص 1

معلش اسف حصل حاجه كده هبقى اكمل لما ارجع سلام مؤقت

3
#7

مشكووووووور ي اخي ع المسااااعده

بس مش مره فاهمه من الشرح ..

انتظر عودتك واكمال الشرح ..

واذا ماعليك امر ممكن تخبرني كيف بيكون الكود النهائي ؟؟

وشكرا جزيلا لك ^^

1
#8

الفكرة هى تمثيل عدد أثنين مستوى من وضوح الصورة.

المستوى الاول: وهو المستوى العادى التى تظهر به الصورة فى أعلى درجة وضوح.

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

سنفرض ان الصورة مكونة من مجموعة من النقاط طولا وعرضا

يمكننا تمثيل نقاط الصورة على شكل مصفوفة ثائية البعد

الآن لديك الصورة فى المستوى الاول على شكل مصفوفة

كيف يمكن تحولها الى المستوى الثانى ؟

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

السؤال الان كيف نحدد موقع هذة النقاط أقصد ما هى القاعدة التى نحدد بها موقع النقاط المحيطة بالنقطة الحالية ؟ أظن أن اجابه هذا السؤال له قانون انتم درستموة .

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

فى حالة تحديد القانون أو الفكرة فأنة بسهولة يمكن اجراء القسمة وارجاعة الصورة فى المستوى الثانى

قومى بأغلاق الحاسب واحضار ورقة وقلم واحسبى وحلل كل نقطة حتى تصلى الى القانون او الفكرة أم بخصوص الكود فيمكننا هنا بالمنتدى بمساعدتك فى ثوان .

تمنياتى بالتوفيق

4

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#9

إنظري لهذا التحليل السريع لتحديد أماكن العناصر النقاط المجاورة لعنصر في مصفوفة :

[0][0]     [0][1]     [0][2]

[1][0]     [1][1]     [1][2]

[2][0]     [2][1]     [2][2]

x = 1, y = 1    <-- The center

UP    UP     = x-1, y
DOWN  DOWN   = x+1, y
RIGHT RIGHT  = x  , y+1
LEFT  LEFT   = x  , y-1
UP    RIGHT  = x-1, y+1
UP    LEFT   = x-1, y-1
DOWN  RIGHT  = x+1, x+1
DOWN  LEFT   = x+1, y-1

قيمة x و y يجب أن ﻻ يقل حجمهما أو يزيد على حجم المصفوفة (مشكلة مع العنصر الموجودة في الأطراف).

وهذا مثال بسيط :

#include<iostream>
using namespace std;

int main(void) {

    int array[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    int x = 1;
    int y = 1;

    cout << "Center      = " << array[x][y]   << endl;
    cout << "UP    UP    = " << array[x-1][y] << endl;
    cout << "DOWN  DOWN  = " << array[x+1][y] << endl;
    cout << "RIGHT RIGHT = " << array[x][y+1] << endl;
    cout << "LEFT  LEFT  = " << array[x][y-1] << endl;

    return(0);
}

تم تعديل هذه المشاركة بواسطة Mr.B في 4 مايو 2012 في 23:50

3
#10

شكرا جزيلا لكم اخوتي ..

Mr.B و AudaNix و seikoo

رائع ما قدمتم ورائع هو حضوركم ..

اخي seikoo :

هل من الممكن اكمال شرحك اذا سمحت ؟؟

انا في انتظار ابداعك القادم ^^

جعلها الله في موازين حسناتكم^^

1
#11

السلام عليكم أخوانى:

لقد قمنا بتحليل المشكلة كما هو موضح أعلاة بمشاركتى.

والحمد لله قمت بتحويل التحليل الى كود ، الكود يعمل بشكل اﻵلى سواء اعطيتة مصفوفة 2 فى 2 او 3فى3 الخ..

الكود:

/*
 * File:   main.cpp
 * Author: Mohammed Abu Zayed(AudaNix)
 *
 * Created on May 7, 2012, 2:30 PM
 */

#include <list>
#include <iostream>
#include <numeric>

using namespace std;

int main(int argc, char** argv)
{
    int row, col;    
// لادخال عدد الصفوف والاعمدة بالمصفوفة
    int rows = 0, cols = 0;
    cout << "pleze enter rows: ";
    cin >> rows;
    cout << "pleze enter cols: ";
    cin >> cols;

    int *pnewrow;
    int **img = new int * [rows];
    int **img2 = new int * [rows];

    int i, x;
    for (i = 0; i < rows; i++)
    {
        pnewrow = new int[cols];
        *(img + i) = pnewrow;
        for (x = 0; x < cols; x++)
        {
            cout << "Row: " << i + 1 << " Col: " << x + 1 << ": ";
            cin >> *(*(img + i) + x); // or cin >> *(pnewrow+x);
        }
    }
    for (i = 0; i < rows; i++)
    {
        pnewrow = new int[cols];
        *(img2 + i) = pnewrow;        
    }  

    int coor[5] =
    {
        0/*up*/,
        0/*Down*/,
        0/*Right*/,
        0 /*Left*/,
        0 /*Center*/
    };
    for (row = 0; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
        {
            ((row - 1) < 0) ? coor[0] = -1 : coor[0] = img[row - 1][col];
            ((row + 1) > rows-1) ? coor[1] = -1 : coor[1] = img[row + 1][col];
            ((col + 1) > cols-1) ? coor[2] = -1 : coor[2] = img[row ][col + 1];
            ((col - 1) < 0) ? coor[3] = -1 : coor[3] = img[row ][col - 1];
            coor[4] = img[row][col];

            int  count = 0;
            float sum = 0.0, avg = 0.0;

            for(int z=0; z<5; z++)
            {
                if (coor[z] != -1)
                {
                    ++count;
                    sum += coor[z];
                }
            }
            avg = sum / count;
            img2[row][col] = avg;
        }
    }

    //----------------------------------------------------------------//
    // print out the new image.....
    cout << "New image: 2"<<endl;
    for (row = 0; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
        {
            cout << *(*(img2 + row) + col) << " ";
        }
        cout << endl;
    }  


    // كود تحرير الذاكرة التى تم حجزها
    for (x = 0; x < rows; x++)
        delete [] img[x];
    delete [] img;

    // كود تحرير الذاكرة التى تم حجزها
    for (x = 0; x < rows; x++)
        delete [] img2[x];
    delete [] img2;

    return 0;
} // end of main

المدخلات والمخرجات:

pleze enter rows: 3
pleze enter cols: 3
Row: 1 Col: 1: 2
Row: 1 Col: 2: 30
Row: 1 Col: 3: 17
Row: 2 Col: 1: 25
Row: 2 Col: 2: 7
Row: 2 Col: 3: 13
Row: 3 Col: 1: 14
Row: 3 Col: 2: 0
Row: 3 Col: 3: 35
New image: 2
19 14 20 
12 15 18 
13 14 16 
Press [Enter] to close the terminal ...

وفى النهاية احمد الله الذى اعاننى على ذلك ...

تقبلو مرورى والله ولى التوفيق

تم تعديل هذه المشاركة بواسطة AudaNix في 7 مايو 2012 في 15:43

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#12

D أختصارا الى Distance المقصود بها فى السؤال هى مسافة التقاط الصورة بين الصورة الاصلية والصورة الجديدة

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#13

اها مشكوووووووووووووووووور جدا اخي

يعطيك ربي العافيه ..

شكرا لانك ساعدتني ستفيدني بالمستقبل هذه الحلول ...

شكرا جزيلا لكل من ساعدني وافادنيييييي بالمعلومات ^^

تحياتي واحترامي لجميع الدكاتره والعباقرة والمبرمجين اللذين اسعدوني بمرورهم^^

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