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

اختبر مهاراتك في المؤشرات (الحلقة الثالثة)

مغلقرائج
بدأه khaled_prg في 25 فبراير 2012 · 70 رد · 4,452 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أهلا بكم مجددا في الحلقة الثالثة من سلسلتكم اختبر مهاراتك في المؤشرات.

تحدثنا في الحلقة الأولى عن كيفية إجراء بعض العمليات الحسابية (البسيطة و المركبة) على المؤشرات و بذلك انتقلنا إلى الحلقة الثانية التي تحدثنا فيها عن أنواع المؤشرات من حيث الثبوتية و من حيث الإشارة.

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

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

هذه المشاريع ستتم برمجتها في بيئة الــ console لأنها الأصعب .. فلا يوجد شيء جاهز للاستخدام. أنت من ستبني مشروعك من الصفر !

فائدة هذه المشاريع تكمن بالدرجة الأولى في النقاط الثلاثة الآتية :

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

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

post-225348-064468500 1330180062_thumb.g

مشروعنا هذه المرة عبارة عن مُحاكاة لعملية التسجيل في المواقع أو المنتديات. لنأخذ الــ Yahoo على سبيل المثال :

post-225348-071576000 1330180095_thumb.p

لا تسرح بخيالك بعيداً .. لأننا لسنا بصدد دراسة التقنيات المتقدمة التي يستخدمها الموقع من أجل هذه العملية, كل ما يهمنا الآن هو الطريقة لكلاسيكية في التحقق من الإيميل و كلمة المرور. و شروط المشروع كالتالي :

  1. شروط الإيميل :
    • نفترض أنه توجد كتابتان لأي إيميل Yahoo. النسخة الإنجليزية تكون هكذا :

      xxxxxx@yahoo.com


      و النسخة الفرنسية تكون هكذا :

      xxxxxx@yahoo.fr


    • الجزء الموجود قبل @ يجب أن لا يقل عن 6 خانات و لا يتجاوز الــ 20.
    • يمكن للإيميل أن يحتوي فقط على الحروف الإنجليزية أو الأرقام أو هذا الرمز _ .

[*]شروط كلمة المرور :

  • كلمة المرور يجب أن لا تحتوي على الرموز الآتية :

    <,>,|,:,",',/,\


  • يجب أن لا يقل طول كلمة المرور عن 10 خانات و لا يتعدى 30 خانة.

[*]رسائل الخطأ :

  • إذا كان الإيميل الـمُدخل لا يتوافق مع الشروط فستظهر رسالة تحذير باللون الأحمر :
    post-225348-091834600 1330180549_thumb.p
  • إذا كانت كلمة المرور الـمُدخلة لا تتوافق مع الشروط فستظهر رسالة تنبيه باللون الأصفر :
    post-225348-048282500 1330180570_thumb.p
  • إذا كان الإيميل المُدخل موافق للشروط و كلمة المرور أيضا موافقة, فستظهر رسالة ترحيبية باللون الوردي تحمل اسم المستخدم :
    post-225348-072718900 1330180588_thumb.p

تحياتي.

المرفقات
post-89451-1198550777.gifkhaled_prg.pngProjet_Email.pngProjet_pass.pngProjet_cool.png

تم تعديل هذه المشاركة بواسطة khaled_prg في 27 فبراير 2012 في 14:55

1
#2

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

مرحباً من جديد ...

اقتباس
هذه المشاريع ستتم برمجتها في بيئة الــ console لأنها الأصعب .. فلا يوجد شيء جاهز للاستخدام. أنت من ستبني مشروعك من الصفر !

غاوى تعب إنت :D

اقتباس
لا تسرح بخيالك بعيداً .. لأننا لسنا بصدد دراسة التقنيات المتقدمة التي يستخدمها الموقع

لا بالعكس التقنيات المتقدمة دى أسهل بكتير من إلى إنت طالبه :blink: لو كان الفحص هيكون على متصفح المستخدم هنستخدم لغة javaScript وطبعاً مع regular expression "التعبير النظامى" هيكون أسهل. وطبعاً ما تعتمدش على التحقق من خلال javaScript لأنها بتتم على جهاز المستخدم قبل إرسال البيانات للسيرفر على إفتراض إن نيته سليمه وكان بيستخدم متصفح مش بيدعم الجافا سكريبت هتسببلك أنت مشاكل , ولو كان نيته مش سليمه هيوقف تشغيل الجافا سكريبت من المتصفح ويبدأ يدور على ثغرات

للإنقضاض عليك :D

فالأفضل عمل تحقق على السيرفر أيضاً على سبيل المثال سوف تقوم بعمل تحقق أيضاً بلغة php بإستخدام دوال التحقق والإستبدال مع regular expression وإن كنت من مستخدمى asp فلا أعلم كيف يتم ذلك لأنى لا أتعامل معها :angry:

بالنسبة لحته الألوان دى يعنى لازم أنا دالة textcolor لم تعمل عندى :hmm:

لا نطيل عليكم كثيراً إليكم الكود بلغة السي :

#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
int main(void)
{   
	bool isEmail=true;
    bool isInRang=false;
	bool at=false;
	bool com=false;
	bool isPassInRang=true;
	bool isPassword=true;
	char get;
	int count=0,i=0,atCount=0,afterAtCount=0,passCount=0;
	printf("Enter Your YAHOO e-mail:");
    while(1){
		get=getchar();
		if(get=='\n')break;
		count++;
        isInRang=false;
		if(at==false)
		{
			    if((count<7 && get==64)||(count>21 && get==64))
				{
                    isEmail=false;
				    break;
			    }
                for(i=48;i<=57;i++)
				    if(get==i)isInRang=true;
			    for(i=65;i<=90;i++)
				    if(get==i)isInRang=true;
                for(i=97;i<=122;i++)
				    if(get==i)isInRang=true;
                if(get==95)isInRang=true;
                if(get==64)
			    {
				    at=true;
			        isInRang=true;
                    atCount++;
                    if(atCount==2)
                    {
                        isEmail=false;
						break;
                    }					
                }			   
		}
		else if(at==true)
		{
     		afterAtCount++;
		    switch(afterAtCount)
			{
			    case 1:
				    if(get==89 || get==121)isInRang=true;
					break;
				case 2:
				    if(get==65 || get==97)isInRang=true;
					break;
				case 3:
				    if(get==72 || get==104)isInRang=true;
					break;
				case 4: case 5:
				    if(get==79 || get==111)isInRang=true;
					break;
				case 6:
				    if(get==46)isInRang=true;
					break;
				case 7:
				    if(get==67 || 99)
					{
					    com=true;
						isInRang=true;
                    }
					else if(get==70 || get==102)isInRang=true;
					break;
				case 8:
				    if(com==true && (get==79 || get==111))isInRang=true;
					else if(get==82 || get==114)isInRang=true;
					break;
				case 9:
				    if(com==true && (get==77 || get==109))isInRang=true;
					break;
				default :
				{
				   isInRang=true;
				}
			}
		}

	    if(isInRang==false)
		{   
		    isEmail=false;
			break;
		}
	}
	if(count<10)isEmail=false;

    printf("Enter Your YAHOO Password:");
    while(1){
		get=getchar();
		if(get=='\n')break;
		passCount++;
        isPassInRang=true;
		if(get==12 || get==34 || get==39 || get==47 || get==58 || get==60 || get==62 || get==92)isPassInRang==false;
	    if(isPassInRang==false)
		{   
		    isPassword=false;
			break;
		}
	}
    if(!(passCount>=10 && passCount<=30))isPassword=false;
	if(isEmail==true && isPassword==true)
	printf("E-mail Valide :)\n");
	else if(isEmail==false)
	printf("E-mail invalide :(\n");
    else if(isPassword==false)
	printf("Password invalide :(\n");
    return 0;
}

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#3

ماشاء الله رائع

أنتظر مشاركى ليلة اليوم

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

#4

السلام عليكم

هذه أول مشاركة لي في هذا المنتدى منذ سنوات ( لانني كنت شاركت بحساب آخر قبل عدة سنوات قاربت السبع )

لا أدري ان كانت مشاركتي موافقة لشروط هذه المسابقة أم لا ( لاني لم استعمل المؤشرات ) ولكني سأضيفها وان لم تقبل سأعيدها باستعمال المؤشرات و عدم استعمال std::string

وددت لو سمح لنا باستخدام النسخة المطورة لــسي بلس بلس C++11 أو ماكان يعرف بــC++0x والتي تحوي عدة اضافات من بينها regex والتي كانت ستسهل العمل كثيرا ( دون الحاجة الى مكتبات مثل boost::regex )

المهم اليكم المشاركة :

نظام التشغيل ويندوز و المترجم GCC ( MinGW ) نسخة 4.6 على Netbeans

ملاحظة: البرنامج يفترض الحروف الانجليزية الصغيرة فقط.

#include <iostream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

#define ERROR_COLOR (FOREGROUND_RED|FOREGROUND_INTENSITY)
#define WARNING_COLOR (0x0E)
#define WELCOME_COLOR (FOREGROUND_BLUE + FOREGROUND_RED)
#define MESSAGE_COLOR (FOREGROUND_GREEN|FOREGROUND_INTENSITY)
#define INPUT_COLOR (0x0F)



void report(const string& msg, WORD color);
bool validate_username(const string& username,string& name);
bool validate_password(const string& password);

WORD get_text_color();
void change_text_color(WORD new_color);


int main(){
    string username,password,name("");
    WORD old_color_console = get_text_color();
    change_text_color(MESSAGE_COLOR);
    cout << "Enter your YAHOO username : " ;
    change_text_color(INPUT_COLOR);
    cin >> username;
    change_text_color(MESSAGE_COLOR);
    cout << "Enter your password : ";
    change_text_color(INPUT_COLOR);
    cin >> password;

    bool no_error = true;

    if(!validate_username(username,name)){
        report("Erreur de saisie - Adresse Email invalide !",ERROR_COLOR);
        no_error = false;
    }
    if(!validate_password(password)){
        report("Erreur de saisie - Mot de passe invalide !",WARNING_COLOR);
        no_error = false;
    }
    if(no_error){
        char buf[1024];
        sprintf(buf,"Merci %s, vous etes le bienvenue :)",name.c_str());
        report(string(buf),WELCOME_COLOR);
    }




    change_text_color(old_color_console);
}


bool validate_username(const string& username,string& name){
    const string accepted_chars("abcdefghijklmnopqrstuvwxyz_0123456789");
    const string::size_type not_found = string::npos;
    string::size_type posAt = username.find('@');
    if(posAt == not_found)
        return false;
    string beforeAt = username.substr(0,posAt);
    if(beforeAt.length() < 6 || beforeAt.length() > 20)
        return false;
    string afterAt = username.substr(posAt + 1);
    if(afterAt.find("yahoo.fr") == not_found && afterAt.find("yahoo.com") == not_found)
        return false;
    if(beforeAt.find_first_not_of(accepted_chars) != not_found)
            return false;
    name = beforeAt;
    return true;
}
bool validate_password(const string& password){
    const string not_accepted_chars("<>|:\"'/\\");
    if(password.length() < 10 || password.length() > 30)
        return false;
    if(password.find_first_of(not_accepted_chars) != string::npos)
        return false;
    return true;
}



WORD get_text_color(){
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO info;
    GetConsoleScreenBufferInfo(handle,&info);
    return info.wAttributes;
}

void change_text_color(WORD new_color){
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle,new_color);
}


void report(const string& msg, WORD color){
    change_text_color(color);
    cout << msg << endl;
}

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

تم تعديل هذه المشاركة بواسطة OmniVore في 26 فبراير 2012 في 14:46

وما كلُّ ذِي لُبٍّ بمِؤْتيكَ نُصحَه ****** وما كلُّ مؤْتٍ نُصحَه بلبيب

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

ما دعوة أنفع يا صـــــاحبي .... من دعوة الغــــائب للغــــائب

ناشدتك الــــرحمن يا قــــارئاً .... أن تسأل الغفران للكاتب (ولوالديه)

#5
اقتباس
لا بالعكس التقنيات المتقدمة دى أسهل بكتير من إلى إنت طالبه :blink:

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

مثلا, بافتراض أنه لدينا عدة حقول سيتم تخزين محتواها لاحقا في قاعدة البيانات, يجب التحقق من تصفية الرموز الخاصة ESCAPE CHARACTERS بشكل صحيح و ذلك من أجل تفادي تشغيل هذه الرموز التي من شأنها حقن قاعدة البيانات أو التلاعب بمحتوياتها. يأتي الحديث هنا عن ثغرة SQL injection

يمكن أيضا التغلب على الثغرة من خلال عدم تفعيل الجمل النصية (DISABELING LITERALS).

بعد انتهاء عملية التسجيل, سيُرسل الـ Yahoo رسالة ترحيبية إلى إيميل المستخدم الجديد. يمكننا استخدام الدالة mail لإرسال الرسالة إلى إيميل المستخدم. عمل هذه الدالة يرتبط بشكل رئيسي بدعم السيرفرات لها. إذا كان السيرفر لا يدعمها يمكننا اسخدام الفئة PHP Mailer المُختصة في عملية الإرسال.

إذا كنا نريد إجراء العملية العكسية, أي أن المُستخدم سيُرسل رسالة إلى الموقع (ممكن تكون مثلا شكوى من محاولة اختراق تعرض لها المستخدم) فيمكننا استخدام $_SERVER لرصد معلومات دقيقة عن المُرسل, مثل SERVER_ADDR إن أردنا معرفة عنوان الـ IP أو HTTP_USER_AGENT إذا كنا نريد معرفة نظام التشغيل و المتصفح الذي يستخدمه المُرسل.

أيضا, يجب الأخذ في الإعتبار وجود نوعين من المستخدمين, simple user و administrator و يجب التعامل مع كل نوع حسب مستواه (هناك حقول و أشياء يراها الــ admin و لا يراها الــ user).

اقتباس
لو كان الفحص هيكون على متصفح المستخدم هنستخدم لغة javaScript وطبعاً مع regular expression "التعبير النظامى" هيكون أسهل. وطبعاً ما تعتمدش على التحقق من خلال javaScript لأنها بتتم على جهاز المستخدم قبل إرسال البيانات للسيرفر على إفتراض إن نيته سليمه وكان بيستخدم متصفح مش بيدعم الجافا سكريبت هتسببلك أنت مشاكل , ولو كان نيته مش سليمه هيوقف تشغيل الجافا سكريبت من المتصفح ويبدأ يدور على ثغرات

للإنقضاض عليك :D

فالأفضل عمل تحقق على السيرفر أيضاً على سبيل المثال سوف تقوم بعمل تحقق أيضاً بلغة php بإستخدام دوال التحقق والإستبدال مع regular expression وإن كنت من مستخدمى asp فلا أعلم كيف يتم ذلك لأنى لا أتعامل معها :angry:

نعم أخي أحمد, يمكننا التحقق من صحة الإيميل في PHP من خلال Expressions régulières.

أو يمكننا استخدام filter_var بدون وجع راس يعني :D

بالإضافة إلى ذلك, توفر لنا عائلة PCRE الدالة preg_match لفعل مثل هذا الأمر.

لكن لا أظن أن الـ Yahoo يستخدم مثل هذه الأشياء .. ممكن تكون عندو فئات ذات استخدامات مُتقدمة قام بتطويرها للحصول على نتيجة أسرع و بدقة أكبر خصوصا أنه يُدير عشرات ملايين عناوين البريد.

كما قلت آنفا .. المشروع لا يدرس مثل هذه الحالات و لكنني أدرت إدراجها فقط من أجل لفت انتباه القارئ إلى أن عملية تسجيل الدخول أكثر تعقيدا مما نُحاول محاكاته.

اقتباس
بالنسبة لحته الألوان دى يعنى لازم أنا دالة textcolor لم تعمل عندى :hmm:

العجيب في الأمر أن الدلة textcolor مع cprintf لم تعمل معي حتى على الــ Borland 4.5 :D

إذا كنت تعمل على الويندوز فيمكنك استخدام الدالة SetConsoleTextAttribute هكذا :

#include <stdio.h>
#include <windows.h>

void Color(int couleurDuTexte)
{
         HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
         SetConsoleTextAttribute(hCon,couleurDuTexte);
}

int main (void)
{
	Color(9);
    printf("Hello World en 'Bleu foncé' !\n");
    return 0;
}

أو يمكننا كتابة الكود الآتي إذا أردنا المزيد من الدقة :

#include <stdio.h>
#include <windows.h>

int main (void)
{
	// initialisation
	CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
	WORD wOldColorAttrs;
	HANDLE hStdout;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
	// 1- on récupère le handle de la console en cours
    if (hStdout == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, TEXT("GetStdHandle"), TEXT("Console Error"),
            MB_OK);
        return 1;
    }

    // On sauvegarde la couleur par defaut

    if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
    {
        MessageBox(NULL, TEXT("GetConsoleScreenBufferInfo"),
            TEXT("Console Error"), MB_OK);
        return 1;
    }

    wOldColorAttrs = csbiInfo.wAttributes;
    printf("premiere ligne\n");
    printf("deuxieme ligne\n");
    //on écrit en rouge a partir de maintenant
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY); 
    printf("troisieme ligne en rouge\n");
    printf("quatrieme ligne en rouge \n");
    // on remet la couleur de base
	SetConsoleTextAttribute(hStdout,wOldColorAttrs); 
    printf("cinquième ligne de retour a la couleur de base\n");
    printf("sixième ligne\n");
    printf("septième ligne\n");
    return 0;
}

أما إذا كنت تعمل على Linux فيمكنك مراجعة هذا الموضوع :

Des couleurs dans la console (Linux)

اقتباس
لا نطيل عليكم كثيراً إليكم الكود بلغة السي

قمت بتنفيذ الكود على عُجالة و قد لاحظت الأخطاء التالية :

الخطأ الأول :

Enter Your YAHOO e-mail:yes@yahoo.fr

Enter Your YAHOO Password:E-mail invalide :(

Process returned 0 (0x0) execution time : 8.053 s

الخطأ الثاني, (كلمة المرور يجب أن تكون غير صحيحة !) :

Enter Your YAHOO e-mail:khaled_prg@yahoo.fr

Enter Your YAHOO Password:oOoxXx/\xXxoOooo

E-mail Valide : )

Process returned 0 (0x0) execution time : 57.762 s

الخطأ الثالث, عند إدخال كلمة المرور يجب أن تظهر نجوم أو دوائر سوداء بدل الأحرف.

هناك أيضا خطأ يتعلق بنص المشروع :D إذا كان الإيميل خاطئ فيجب إظهار رسالة الخطأ و الخروج من البرنامج. أما إذا كان الإيميل صحيح فسيطلب البرنامج كلمة المرور.

و كملاحظة أخيرة : الحلول تُرسل عبر الخاص حتى لا يتم حرق المشروع ! :D

اقتباس
هذه أول مشاركة لي في هذا المنتدى منذ سنوات ( لانني كنت شاركت بحساب آخر قبل عدة سنوات قاربت السبع )

مرحبا بك أخي الكريم :)

لا أستطيع الرد عليك حاليا لأنني تعبت من الكتابة :D

لي عودة :)

تم تعديل هذه المشاركة بواسطة khaled_prg في 27 فبراير 2012 في 15:00

#6
اقتباس
لكن لا أظن أن الـ Yahoo يستخدم مثل هذه الأشياء .. ممكن تكون عندو فئات ذات استخدامات مُتقدمة قام بتطويرها للحصول على نتيجة أسرع و بدقة أكبر خصوصا أنه يُدير عشرات ملايين عناوين البريد.

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

اقتباس

قمت بتنفيذ الكود على عُجالة و قد لاحظت الأخطاء التالية :

الخطأ الأول :

عذراً نسيت أنى عدلت الكود ولم أعاود إختبار البرنامج بالشكل الكافى :rolleyes:

والخطأ الثانى أيضاً كان مترتب على الخطأ الأول

وإليكم الكود بعد إضافة التعديلات:

#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
int main(void)
{   
	bool isEmail=true;
    bool isInRang=false;
	bool at=false;
	bool com=false;
	bool isPassword=true;
	char get;
	int count=0,i=0,atCount=0,afterAtCount=0,passCount=0;
	printf("Enter Your YAHOO e-mail:");
    while(1){
		get=getchar();
		if(get=='\n')break;
		count++;
        isInRang=false;
		if(at==false)
		{
			    if((count<7 && get==64)||(count>21 && get==64))
				{
                    isEmail=false;
				    break;
			    }
                for(i=48;i<=57;i++)
				    if(get==i)isInRang=true;
			    for(i=65;i<=90;i++)
				    if(get==i)isInRang=true;
                for(i=97;i<=122;i++)
				    if(get==i)isInRang=true;
                if(get==95)isInRang=true;
                if(get==64)
			    {
				    at=true;
			        isInRang=true;
                    atCount++;
                    if(atCount==2)
                    {
                        isEmail=false;
						break;
                    }					
                }			   
		}
		else if(at==true)
		{
     		afterAtCount++;
		    switch(afterAtCount)
			{
			    case 1:
				    if(get==89 || get==121)isInRang=true;
					break;
				case 2:
				    if(get==65 || get==97)isInRang=true;
					break;
				case 3:
				    if(get==72 || get==104)isInRang=true;
					break;
				case 4: case 5:
				    if(get==79 || get==111)isInRang=true;
					break;
				case 6:
				    if(get==46)isInRang=true;
					break;
				case 7:
				    if(get==67 || 99)
					{
					    com=true;
						isInRang=true;
                    }
					else if(get==70 || get==102)isInRang=true;
					break;
				case 8:
				    if(com==true && (get==79 || get==111))isInRang=true;
					else if(get==82 || get==114)isInRang=true;
					break;
				case 9:
				    if(com==true && (get==77 || get==109))isInRang=true;
					break;
				default :
				{
				   isInRang=true;
				}
			}
		}

	    if(isInRang==false)
		{   
		    isEmail=false;
			break;
		}
	}
	if(count<15)isEmail=false;
    if(isEmail==true)
    {
    printf("Enter Your YAHOO Password:");
    while(1){
		get=getchar();
		if(get=='\n')break;
		passCount++;
		if(get==12 || get==34 || get==39 || get==47 || get==58 || get==60 || get==62 || get==92)
		{   
		    isPassword=false;
			break;
		}
	}

    }
	else
   {
       printf("E-mail invalide :(\n");
		exit(0);
   }
		if(!((passCount>=10)&&(passCount<=30)))
              isPassword=false;
	   if(isPassword==false)
	   {
	    printf("Password invalide :(\n");
	   }
	   else
       printf("Login Ok :)\n");
    return 0;
}

جربوا البرنامج وإن كانت هناك أخطاء أخرى وافونا بجديد الأخبار

اقتباس
الخطأ الثالث, عند إدخال كلمة المرور يجب أن تظهر نجوم أو دوائر سوداء بدل الأحرف.

سوف أتدربر أمره لاحقاً

اقتباس
و كملاحظة أخيرة : الحلول تُرسل عبر الخاص حتى لا يتم حرق المشروع ! :D

المشاريع القادمة إن شاء الله

دمتم بخير

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#8

السلام عليكم

تم التعديل على المشروع بحيث :

1- لا يطلب كلمة المرور الا اذا كان اسم المستخدم صحيحا.

2- اخفاء كلمة المرور بحيث يظهرها على شكل نجوم ( لم انتبه من قبل لذلك :wacko: )

عذرا لكن كيف ارسل على الخاص ؟؟؟ لم اجد رابطا لذلك !!!!

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

وما كلُّ ذِي لُبٍّ بمِؤْتيكَ نُصحَه ****** وما كلُّ مؤْتٍ نُصحَه بلبيب

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

ما دعوة أنفع يا صـــــاحبي .... من دعوة الغــــائب للغــــائب

ناشدتك الــــرحمن يا قــــارئاً .... أن تسأل الغفران للكاتب (ولوالديه)

#9

السلام عليكم

أبدأ مع الأخ أحمد سعود :)

بداية, كيف لك أن تستخدم الدالة exit دون تضمين المكتبة stdlib ؟؟ :blink:

ثانيا, قمت بتجربة الكود الجديد و ما زال تحققه من الإيميل غير مُكتمل .. انظر :

Enter Your YAHOO e-mail:khaled_prg@yahoo.commmmmmmmmmmmmmm

Enter Your YAHOO Password:xxxxxxxxxxxxxxxx

Login Ok : )

Process returned 0 (0x0) execution time : 3.418 s

بالإضافة إلى ذلك, عندما يكون الإيميل و كلمة المرور صحيحين يجب أن تحتوي الرسالة الترحيبية على اسم المستخدم !

أيضا, يجب أن يُنشئ المبرمج مكتبة جديدة و يضع فيها كافة الدوال التي كتبها. و يكون ملف .cpp مُستقل ذاتيا .. فالمشروع ليس سوى بداية .. ماذا لو أردنا تطوير المشروع ؟ هل سنعود إلى الكود و نقوم بتغييره سطر .. سطر ..؟؟ أم يكفينا تغيير بضعة أسطر في دوال المكتبة ؟؟

عند الحديث عن مُصطلح مشروع يجب وضع الأمور في نصابها, يعني كل شيء مُنظم ! :)

لم تقم بتلوين الرسائل .. و كلمة المرور تظهر للعيان ! :) و هذا مُخالف لنص المشروع. (إذا لم تتوصل إلى إيجاد فكرة إخفاء كلمة المرور فلا ضير أن تنتظر حتى تكتمل محاولتك :) )

post-225348-064308000 1330341115_thumb.g

بالنسبة للأخ OmniVore :

الكود الذي كتبتَه لا يحتوي على دالة تحقق واحدة مُكتملة !!, يعني مثلا : انت استخدمت not_accepted_chars من أجل إبعاد الرموز الغير مرغوب فيها !, أنا هنا أسأل .. ما دمتَ قد سمحتَ لنفسك باستخدام دوال جاهزة لتنفيذ المطلوب .. أين الفكرة في الكود ؟!؟!؟

السبب الرئيسي من برمجة المشروع في الـ console هو تحدي المشاكل و الصعوبات التي ستواجهك في هذه البيئة التي لا تقدم لك أية أدوات للمساعدة, يعني لو قمنا مثلا ببرمجة المشروع في الــ GUI ... أكيد بضغطة زر واحد سنجعل حقل كلمة المرور يحتوي على نجوم أو دوائر سوداء !! لكن هذه ليست فكرة !! لأننا لم نفكر في طريقة عمل هذا الخيار و إنما استخدمناه بكامل العفوية, الــ IDE هنا تولى عنا مشقة هذا العمل و هذا هو السبب الرئيسي الذي جعلني أهرب من الــ GUI و أوجه الــ console.

مع كل هذا ...... الكود لا زال غير مُكتمل و يحتوي على العديد من الأخطاء و نقاط الضعف, انظر :

Enter your YAHOO username : khaled_prg@ya hoo;com

Enter your password : Erreur de saisie - Adresse Email invalide !

Erreur de saisie - Mot de passe invalide !

Process returned 0 (0x0) execution time : 8.689 s

Enter your YAHOO username : khaled_prg@yahoo.frrrrrrrrrr

Enter your password : xxxxxxxxxxxxxxxxxxxx

Merci khaled_prg, vous etes le bienvenue : )

Process returned 0 (0x0) execution time : 9.898 s

Enter your YAHOO username : xxxxxxxxxxxxxxxxx @yahoo.fr

Enter your password : Erreur de saisie - Adresse Email invalide !

Erreur de saisie - Mot de passe invalide !

Process returned 0 (0x0) execution time : 6.531 s

و هذا خطأ مُشترك بينكما (أنت و أحمد سعود) :

Enter your YAHOO username : khaled_prg@yahoo.fr error

Enter your password : Erreur de saisie - Mot de passe invalide !

Process returned 0 (0x0) execution time : 12.142 s

اقتباس
تم التعديل على المشروع

أين وضعت التعديلات ؟؟ لا أرى أي جديد في الكود ! :blink:

اقتباس
كيف ارسل على الخاص ؟؟؟ لم اجد رابطا لذلك !!

إذا كان زر الإرسال معطل, راجع الموضوع التالي لتعرف السبب :

إيقاف الرسائل الخاصة عن مجموعة الأعضاء الجدد مؤقتاً

أخيرا, على كل مشارك في هذه الحلقة أن يضع نصب عينيه النقاط التالية :

  • الهدف من المشروع هو اختبار قدرات المشاركين و ليس تصحيح محاولاتهم.
  • المُبرمج يجب أن يكون قادرا على فحص ثغرات أو أخطاء برنامجه بنفسه. و ليس المُستخدم هو من يتولى تحديد هذه الأخطاء ثم يأتيه ليُخبره بطبيعة الخطأ !
  • يمكن أن يكون المُستخدم مُخترقا و يحاول الوصول إلى ثغرة في البرنامج تُمكنه من العمل كــ root (أو يمكنه الدخول باسم مستخدم آخر).
  • ابتداء من الآن, كل عضو سيضع محاولة واحدة و سيتم نقاش المحاولات بعد انتهاء الفترة الزمنية المُحددة.
  • يجب على العضو اختبار محاولته جيدا قبل طرحها هنا و إذا كانت المحاولة لا ترقى إلى مستوى التحقق الصحيح فلن تتم مناقشتها عند نهاية الحلقة.
  • المشروع لا زال في بدايته و هذه هي نسخته الأولى, في الحلقات المقبلة ستكون هناك نسخ أكثر تطوير و أكثر تعقيد أيضا.

المطلوب الآن هو : (هذه النقاط إلزامية و إذا فُقدتْ إحداها في أية محاولة فهذا معناه أن المحاولة لا تُحقق شروط المشروع و بالتالي لن تتم مناقشتها)

  1. كتابة دوال للتحقق من الإيميل و كلمة المرور في مكتبة منفصلة.
  2. التحقق يجب أن يكون باستخدام المؤشرات فقط (و إلا فما فائدة هذه السلسلة إذا كنا نستعمل وجبات جاهزة من مكتبات اللغة ؟!؟!؟).
  3. كل خطأ يجب أن يحتوي على رسالة تُوضح ماهية الخطأ (حتى يفهم المستخدم طبيعة الخطأ الذي وقع فيه).
  4. تلوين رسائل الخطأ و إظهار كلمة المرور على شكل نجوم شرطين أساسيين في المشروع.

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

المرفقات
post-225348-064468500 1330180062.gif
#10

السلام عليكم

تم تعديل الكود كما يلي :

1- انشاء كلاس مستقل StringUtility يوفر الخدمات المتعلقة بالتعامل مع السلاسل الحرفية ( char * ) يمكننا استعماله مع أي مشروع.

2- انشاء كلاس مستقل Console يوفر بعض الخدمات المتعلقة بالتعامل مع الــconsole ( تغيير لون النص مثلا وقراءة كلمة المرور وتحويل الحروف الى اي شكل )

3- انشاء كلاس مستقل AccountValidation يقوم باختبار اسم المستخدم و كلمة المرور حسب المطلوب ( أو كما اعتقد ).

4- استعمال الجميع في المشروع. الملف main.cpp

ملاحظة:

بما أن ارسال الرسائل الخاصة محظور على المسجلين الجدد فانا ارفق المشروع هنا.

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

EMailValidation.zip

وما كلُّ ذِي لُبٍّ بمِؤْتيكَ نُصحَه ****** وما كلُّ مؤْتٍ نُصحَه بلبيب

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

ما دعوة أنفع يا صـــــاحبي .... من دعوة الغــــائب للغــــائب

ناشدتك الــــرحمن يا قــــارئاً .... أن تسأل الغفران للكاتب (ولوالديه)

#11

عندي سؤالين أخ khaled_prg:

اقتباس

1. كتابة دوال للتحقق من الإيميل و كلمة المرور في مكتبة منفصلة.

هل تقصد في مكتبة ربط Lib. مستقلة؟ أم ينفع استخدام ملف مصدري c. أو cpp. مستقل فقط؟

اقتباس

2. التحقق يجب أن يكون باستخدام المؤشرات فقط (و إلا فما فائدة هذه السلسلة إذا كنا نستعمل وجبات جاهزة من مكتبات اللغة ؟!؟!؟).

هل تعني بأنه غير مسموح استخدام دوال المكتبة القياسية مثل ()strlen و ()memcpy على سبيل المثال؟

#12

OmniVore@

تم استلام المحاولة, لم أجربها بعد ولكن لي عودة :)

ElectroDoc@

اقتباس
هل تقصد في مكتبة ربط Lib. مستقلة؟ أم ينفع استخدام ملف مصدري c. أو cpp. مستقل فقط؟

لا LIB و لا DLL أيضا :) فقط أريد استعمال ملف رأسي (Header file) لتنظيم محتوى المشروع.

لمن لا يعرف الفرق بين ملفات h. .lib .dll يمكنه زيارة هذا الموضوع.

اقتباس
هل تعني بأنه غير مسموح استخدام دوال المكتبة القياسية مثل ()strlen و ()memcpy على سبيل المثال؟

المُحذر منه هو استخدام دالة جاهزة تُساعدك على التحقق بأي شكل من الأشكال.

تماما كما فعل الأخ OmniVore عندما استخدم not_accepted_chars ... كان يجب عليه أن يتولى إقصاء هذه الرموز ينفسه دون الإستعانة بأي شيء جاهز في اللغة.

واضح ؟؟

يمكنك استخدام strlen و memcpy. يمكنك أيضا استخدام memmove إن أدرت :)

بالتوفيق.

#13

عُدنا :)

يبدو أن الأخ الفاضل OmniVore لم يقرأ شروط المشروع !! :sleep:

اقتباس
  • التحقق يجب أن يكون باستخدام المؤشرات فقط (و إلا فما فائدة هذه السلسلة إذا كنا نستعمل وجبات جاهزة من مكتبات اللغة ؟!؟!؟).
  • كل خطأ يجب أن يحتوي على رسالة تُوضح ماهية الخطأ حتى يفهم المستخدم طبيعة الخطأ الذي وقع فيه (يجب إظهار الحرف أو الأحرف المُخالفة التي أدخلها المُستخدم في الإيميل أو كلمة المرور).

تم استلام محاولة العضو OmniVore التي لا تحقق شروط المشروع و بالتالي تم سحبها من لائحة المحاولات التي ستتم مناقشتها.

بالتوفيق.

#14

السلام عليكم

اقتباس

(يجب إظهار الحرف أو الأحرف المُخالفة التي أدخلها المُستخدم في الإيميل أو كلمة المرور).

هذا المقطع لم يكن في الشروط السابقة !!!!!!!!!!!!!

اقتباس
التحقق يجب أن يكون باستخدام المؤشرات فقط (و إلا فما فائدة هذه السلسلة إذا كنا نستعمل وجبات جاهزة من مكتبات اللغة ؟!؟!؟)

التحقق كان عن طريق المؤشرات فقط ( انظر الكلاس StringUtility ) وانا لم استعمل مكتبات جاهزة للتحقق من الايميل و كلمة المرور , فالبرنامج لا يستعمل الا دوال الادخال و الاخراج و strlen ودالة تغيير لون النص أما باقي الكود الموجود في كل الكلاسات فهو من انجازي !!!!

اما اذا كان هناك شيء تقصده انت و لم افهمه انا فالرجاء التوضيح اكثر ,

ملاحظة :

- الكود المرفق السابق به خطأ بسيط في الملف Console.cpp السطر 40 فالتعليمة :

buffer = '\n';

كان يجب ان تكون :

buffer = '\0';

تعديل :

تم تعديل المشروع الى الاصدار 0.2 بحيث :

- اضيفت خاصية التعديل على كلمة المرور عند ادخالها ( الغاء آخر حرف مدخل عن طريق الــbackspace ).

- اضيفت خاصية ابلاغ المستخدم عن الحروف الخاطئة في اسم المستخدم و كلمة المرور ( لان الاخ خالد اضاف هذا الشرط ).

- استعمال دالة أخرى من الدوال القياسية و هي memset.

- اضافة دالة اخرى للكلاس StringUtility وهي HasNoneOf للتأكد من ان السلسلة الحرفية لا تحتوي ايا من الحروف الممررة للدالة.

المشروع في المرفقات

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

EMailValidation_version0.2.zip

تم تعديل هذه المشاركة بواسطة OmniVore في 28 فبراير 2012 في 00:15

وما كلُّ ذِي لُبٍّ بمِؤْتيكَ نُصحَه ****** وما كلُّ مؤْتٍ نُصحَه بلبيب

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

ما دعوة أنفع يا صـــــاحبي .... من دعوة الغــــائب للغــــائب

ناشدتك الــــرحمن يا قــــارئاً .... أن تسأل الغفران للكاتب (ولوالديه)

#15

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

أولاً مادام هذا مشروع كما تقول فمن الأحرى أن تحدد لغة برمجه معينة ليعمل عليها جميع المشاركين .

khaled_prg كتب:

أخيرا, على كل مشارك في هذه الحلقة أن يضع نصب عينيه النقاط التالية :

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

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

يمكن أن يكون المُستخدم مُخترقا و يحاول الوصول إلى ثغرة في البرنامج تُمكنه من العمل كــ root (أو يمكنه الدخول باسم مستخدم آخر).

ابتداء من الآن, كل عضو سيضع محاولة واحدة و سيتم نقاش المحاولات بعد انتهاء الفترة الزمنية المُحددة.

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

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

ومن أين ظهرت تلك القوانين فجأه كان عليك أيضاً وضعها مسبقاً لا بعد بدأ العمل حتى يتسنى لنا أتعجبنا الشروط لنبدأ أم لا.

فعلاً لن ترتقى مشاركتى لكى يتم مناقشتها طبقاً للوائح الجديدة ...

دمتم بخير

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#16

السلام عليكم

مرحبا أخي :)

اقتباس
هذا المقطع لم يكن في الشروط السابقة !!!!!!!!!!!!!

المقطع كان هناك ضمنيا, و السبب في إضافة الجملة الجديدة هو توضيح الفكرة أكثر لا غير !

عندما تُدخل إيميل مخالف في الــ Yahoo سيُخبرك بأنك أدخلت إحدى الحروف الممنوعة و هذا ما نريد محاكاته بالضبط. (عموما هذا ليس بالخطأ الجسيم, لأنه بإضافة جملة واحدة إلى مشروعك سيتحقق الأمر :) )

كما قلتُ لكم سابقا, المُستخدم ليس مسئولا عن الأخطاء التي يرتكبها المبرمج في حق مشروعه !

بما أنني صاحب الموضوع و أنا من عليه تسيير و تنظيم محاولات المشاركين فيجب أن تكون هناك حقيقية يعلمها الجميع :) :

أنا لا أملك الوقت الكافي لتتبع الكود سطر .. سطر و النظر في محتوى كل دالة !, فقط سأقوم باختبار البرنامج, إذا كان يؤدي المطلوب فهذا جيد و إذا كان هناك أي نقص (مهما كان) سيتم إبعاد المُحاولة من النقاش المُرتقب. و الهدف من هذه الخطوة هو جمع المحاولات التي تلبي شروط المشروع بالكامل و إلا فسيتحول المشروع إلى فوضى.

أعود الآن إلى الأخ OmniVor قمتُ بتنفيذ مشروعك في Code ::Blocks و Netbeans 7.1 – GCC 4.6.2 و لم يعمل معي, كانت النتيجة هكذا :

main.o:main.cpp:(.text+0x47)||

undefined reference to `Console::GetTextColor()'|

main.o:main.cpp:(.text+0x5b)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

main.o:main.cpp:(.text+0x7b)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

main.o:main.cpp:(.text+0xb1)||

undefined reference to `AccountValidation::AccountValidation()'|

main.o:main.cpp:(.text+0xd3)||

undefined reference to `AccountValidation::ValidateEmail(char const*)'|

main.o:main.cpp:(.text+0x16c)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

main.o:main.cpp:(.text+0x18c)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

main.o:main.cpp:(.text+0x1b7)||

undefined reference to `Console::ReadPassword(char, char*, unsigned int)'|

main.o:main.cpp:(.text+0x1d1)||

undefined reference to `AccountValidation::ValidatePassword(char const*)'|

main.o:main.cpp:(.text+0x2b2)||

undefined reference to `StringUtility::CopyUntil(char const*, int, char*, unsigned int, char)'|

main.o:main.cpp:(.text+0x379)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

main.o:main.cpp:(.text+0x388)||

undefined reference to `AccountValidation::~AccountValidation()'|

main.o:main.cpp:(.text+0x415)||

undefined reference to `AccountValidation::~AccountValidation()'|

main.o:main.cpp:(.text+0x438)||

undefined reference to `Console::ChangeTextColor(unsigned long)'|

||=== Build finished: 14 errors, 0 warnings ===|

لست هنا لأبحث عن سبب الخطأ ( حتى أقول لك أنه يجب تضمين .cpp بدلا من .h) لأنه لا يعنيني !!.. أنت من يجب عليه التحقق جيدا من طريقة تنفيذ أكوادك قبل طرحها هنا :)

هكذا هي القوانين ......... و لكن سنتغاضى عنها هذه المرة حتى لا نُفسد وجبة أخونا OmniVore التي يبدو أنها شهية بعض الشيء :D

في المرات القادمة سيكون هناك شيئ من الصرامة .. لن نقبل بأبسط خطأ في المشروع مهما كان سببه. السي/السي++ عايزه مُبرمج صاحي زي ما قال الأخ أحمد أبو السعود :)

عموما, حتى لا أكون غير مُنصف سأقبل بإدراج محاولتك ضمن لائحة المُحاولات التي ستتم مناقشتها و أنت الآن تتصدر لائحة المشاركين.

هناك مُلاحظة أخيرة, أنتَ قمتَ بالإعلان عن مصفوفة ديناميكية بطول 1024 للخوف من الوقوع في الــ Overflow و لكنك وقعت في مصيبة أخرى و هي عدم تسيير استخدام الذاكرة ! :). حاول التغلب على هذه المشكلة دون اللجوء إلى طريقة الحجز الأعمى !

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

المشروع يمكن كتابته بالسي أو بالسي++ و يمكن دمجهما أيضا إن استدعى الأمر ذلك (كما فعل أخونا OmniVor مع sprintf مثلا :D)

اقتباس
ومن أين ظهرت تلك القوانين فجأه كان عليك أيضاً وضعها مسبقاً لا بعد بدأ العمل حتى يتسنى لنا أتعجبنا الشروط لنبدأ أم لا.

فعلاً لن ترتقى مشاركتى لكى يتم مناقشتها طبقاً للوائح الجديدة ...

مهلا أخي أحمد !, لماذا كل هذا التشائم ؟؟ :blush:

أنت الآن بقي لك شرط واحد و هو الأخير !

هل سيقف التلوين عائقا أمام مشاركة إخوتك في هذه السلسلة التي كنت أنت من أهم الأعضاء الذين ساعدوا في تواصلها ؟؟؟ طبعا لا يمكن أن أتخيل أنك لن تشاركنا و إلا فسألغي هذا المشروع بالمرة ! :sad:

التلوين بسيط جدا, دالة واحدة فقط تقوم بالتلوين و أنا أرفقتها لك سابقا .. إذا لم تفهمها فأنا مستعد للشرح :)

اقتباس
تعديل :

تم تعديل المشروع الى الاصدار 0.2 بحيث :

- اضيفت خاصية التعديل على كلمة المرور عند ادخالها ( الغاء آخر حرف مدخل عن طريق الــbackspace ).

- اضيفت خاصية ابلاغ المستخدم عن الحروف الخاطئة في اسم المستخدم و كلمة المرور ( لان الاخ خالد اضاف هذا الشرط ).

- استعمال دالة أخرى من الدوال القياسية و هي memset.

- اضافة دالة اخرى للكلاس StringUtility وهي HasNoneOf للتأكد من ان السلسلة الحرفية لا تحتوي ايا من الحروف الممررة للدالة.

سأنظر في تلك النعديلات غدا بإذن الله.

تحياتي لكما.

#18

اتمنى ان ﻻيغلق باب المشاركة حتى منتصف ليل القاهرة اليوم بودى مشاركتكم كودى

يبدو اننى لن استطيع اكمال الكود الليلة سأعود المواصلة باكر غدا

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 28 فبراير 2012 في 22:21

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

#19

السلام عليكم

اقتباس

المقطع كان هناك ضمنيا, و السبب في إضافة الجملة الجديدة هو توضيح الفكرة أكثر لا غير !

عندما تُدخل إيميل مخالف في الــ Yahoo سيُخبرك بأنك أدخلت إحدى الحروف الممنوعة و هذا ما نريد محاكاته بالضبط. (عموما هذا ليس بالخطأ الجسيم, لأنه بإضافة جملة واحدة إلى مشروعك سيتحقق الأمر smile.gif )

لكن عند النظر الى صور المشروع المرفقة مع أول مشاركة لك ( عند اقتراح الموضوع ) لا نجد الا رسالة خطأ بسيطة دون تحديد الحروف الخاطئة sleep.gif وهذا ما جعلني لا اضيف ذلك في مشاركتي الاولى و الثانية !!!!

اقتباس

هناك مُلاحظة أخيرة, أنتَ قمتَ بالإعلان عن مصفوفة ديناميكية بطول 1024 للخوف من الوقوع في الــ Overflow و لكنك وقعت في مصيبة أخرى و هي عدم تسيير استخدام الذاكرة ! smile.gif. حاول التغلب على هذه المشكلة دون اللجوء إلى طريقة الحجز الأعمى !

فعلت ذلك عن عمد لانني اعتقد ان المطلوب هو ابراز استعمال المؤشرات و قد حققت ذلك في اغلب البرنامج اما ما اعتبرته دوال مساعدة Helper functions لا تؤثر كثيرا في القيمة التعليمية للمشروع فقد استعملت مصفوفات ثابتة السعة و متغيرات في الــstack ( مثل ما هو الحال مع المتغير account في الدالة main فلم اشأ جعله مؤشرا لان هدف المشروع لا يقتضي ذلك و ان شئتم بعد المسابقة نعيد كل المشروع فقط باستعمال المؤشرات حتى مع ابسط الانواع char و int laugh.gif ) وسيكون ايضا من الممتع استعمال الخصائص الجديدة للغة مع الاصدار C++11 happy.gif

اقتباس
كما قلتُ لكم سابقا, المُستخدم ليس مسئولا عن الأخطاء التي يرتكبها المبرمج في حق مشروعه !

بما أنني صاحب الموضوع و أنا من عليه تسيير و تنظيم محاولات المشاركين فيجب أن تكون هناك حقيقية يعلمها الجميع smile.gif :

أنا لا أملك الوقت الكافي لتتبع الكود سطر .. سطر و النظر في محتوى كل دالة !, فقط سأقوم باختبار البرنامج, إذا كان يؤدي المطلوب فهذا جيد و إذا كان هناك أي نقص (مهما كان) سيتم إبعاد المُحاولة من النقاش المُرتقب. و الهدف من هذه الخطوة هو جمع المحاولات التي تلبي شروط المشروع بالكامل و إلا فسيتحول المشروع إلى فوضى.

أعود الآن إلى الأخ OmniVor قمتُ بتنفيذ مشروعك في Code ::Blocks و Netbeans 7.1 – GCC 4.6.2 و لم يعمل معي, كانت النتيجة هكذا :

كنت اعتقد ان Netbeans سوف ينشئ لك آليا ملف Makefile عند اضافة ملفات مشاركتي الى مشروع فارغ ويعدله لك و الواضح اني كنت مخطئا في ذلك. ملف الــMakefile الخاص بالمشروع في المرفقات و اليك خطوات تنفيذ المشروع :

1- انشئ مشروع c++ جديد على Netbeans لكن في الخطوة الثانية ( خطوة اختيار الاسم) لا تنشئ ملف و دالة main لاننا سنضيف الملف فيما بعد,

2- انسخ ملفات المشروع السبعة ( ملفات h و cpp ) الى مجلد المشروع الجديد, ثم انسخ ملف الــMakefile المرفق هنا كذلك,

3- ثم بزر الفـارة الايمن على اسم مشروعك في Netbeans ثم Add Existing Item و اختر جميع ملفات الــh و cpp و ملف الــMakefile

4- build and runsmile.gif

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

Makefile.zip

وما كلُّ ذِي لُبٍّ بمِؤْتيكَ نُصحَه ****** وما كلُّ مؤْتٍ نُصحَه بلبيب

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

ما دعوة أنفع يا صـــــاحبي .... من دعوة الغــــائب للغــــائب

ناشدتك الــــرحمن يا قــــارئاً .... أن تسأل الغفران للكاتب (ولوالديه)

#20

بالمناسبة، متى آخر موعد لتقديم المحاولات؟

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

#21

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

khaled_prg كتب:

المشروع يمكن كتابته بالسي أو بالسي++ و يمكن دمجهما أيضا إن استدعى الأمر ذلك (كما فعل أخونا OmniVor مع sprintf مثلا :D)

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

khaled_prg كتب:

مهلا أخي أحمد !, لماذا كل هذا التشائم ؟؟ :blush:

أخى الكريم خالد أين هذه الشتائم !!! هذه مجرد وجهه نظر تجاه التعديلات الدستورية الجديده على المشروع :wink: وإن كان بها بعض العصبية :D

وما دعانى لهذا الرد هو أننى كنت أشارك كتكملة لموضوعنا السابق ليس إلا بما لدينا من المعلومات البسيطه عن اللغة

من مواد الدستور الجديد: من لم يكمل جميع الشروط لا يقوم بتقديم كوده ... إذا فكان لزاماً هذا قبل البدأ حتى يحدد الشخص الجزئيات التى يعلمها والتى تحتاج لبحث عنها لمعرفتها.

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

khaled_prg كتب:

التلوين بسيط جدا, دالة واحدة فقط تقوم بالتلوين و أنا أرفقتها لك سابقا .. إذا لم تفهمها فأنا مستعد للشرح :)

كما ذكرت لك سابقاً المشكلة فى المترجم الذى لدى لم يقبل دالة التلوين وأيضاً الدالة التى أرفقتها ليست ضمن مكتبات المترجم الذى أستخدمه وهو Pelles c IDE

وباقى المترجمات التى لدى لا تعمل مثل Dev C++ والمترجمات المتوافقة مع NetBeans IDE بسب مشاكل أثناء تهيئة أكثر من مترجم معاً مما أدى لتوقف أغلبهم عن العمل.

وبالتالى يتوجب على إعاده تهيئة نسخه وندوز من جديد ليرجع الأمر كما عليه "وهذا مالا أريده حالياً" .

khaled_prg كتب:

هل سيقف التلوين عائقا أمام مشاركة إخوتك في هذه السلسلة التي كنت أنت من أهم الأعضاء الذين ساعدوا في تواصلها ؟؟؟ طبعا لا يمكن أن أتخيل أنك لن تشاركنا و إلا فسألغي هذا المشروع بالمرة ! :sad:

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

دمتم بخير

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#22
khaled_prg كتب:

مهلا أخي أحمد !, لماذا كل هذا التشائم ؟؟ :blush:

ahmedsaoud31 كتب:

أخى الكريم خالد أين هذه الشتائم !!!

sleep.gif

الأخ خالد يقصد "لماذا كل هذا التشاؤم"

(بصراحة أنا أيضاً قرأتها خطأ في البداية)

من الممتع أن أجد مشجعين لـ Pelles C غيري laugh.gif

أنا أيضاً أستخدمه، وأراه بصراحة أفضل بيئة تطوير C لويندوز على الإطلاق. عيبه الوحيد أنه لا يدعم ++C.

على كلٍ، أنا لست خبيراً بالـ ++C، وأستخدم الـ C بشكل أساسي لكل مشاريعي البرمجية، لذلك فهو يفي بالغرض بالنسبة لي.

من أجل تغيير الألوان أخ أحمد: استخدم الدالة textcolor وهي موجودة في Pelles C، لكن عليك أن تفعل التالي:

1. ضمن الملف conio.h في أول الكود.

2. من القائمة: Project ثم Project options. اختر الصفحة Compiler ثم فعّل خيار Define compatibility names.

3. (اختياري) عرف الماكرو CONIO_RETRO_COLORS_ قبل سطر تضمين الملف conio.h (للسماح لك باستخدام أسماء للألوان بدل الأرقام. (انظر الكود التالي).

الآن بإمكانك استعمال دالة textcolor كما يلي:

#define _CONIO_RETRO_COLORS
#include <conio.h>
#include <stdio.h>

int main(void) {
	textcolor(YELLOW);
	printf("Hello, World!\n");

	return 0;
}

وهناك دالة textbackground لتغيير لون خلفية النص.

توجد دالة textcolor_ وهي أسهل استخداماً، لكنها موجودة ضمن Pelles C فقط، أما textcolor فلها توافقية أعلى مع بقية المترجمات (على ما أظن).

طبعاً تبقى طريقة الأخ خالد في استخدام Windows API هي الأفضل والأكثر توافقية مع ويندوز، لكن طرحت هنا فكرة دالة textcolor كبديل أسهل وأسرع.

تم تعديل هذه المشاركة بواسطة ElectroDoc في 28 فبراير 2012 في 17:50

1
#23

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

ElectroDoc كتب:

Posted Image

الأخ خالد يقصد "لماذا كل هذا التشاؤم"

(بصراحة أنا أيضاً قرأتها خطأ في البداية)

عذراً قرأتها قرأه عابره ولم أدقق النظر :blink: أسف على هذا.

ElectroDoc كتب:
من الممتع أن أجد مشجعين لـ Pelles C غيري Posted Image

فعلاً وأنا أيضاً هذا أفضل مترجم أحب التعامل معه فى لغه السي.

ElectroDoc كتب:

من أجل تغيير الألوان أخ أحمد: استخدم الدالة textcolor وهي موجودة في Pelles C، لكن عليك أن تفعل التالي:

بارك الله فيك يا دكتور فعلاً رائع ووفرت على مجهود كبير لحل المشكلة دى ... سلمت يداك ...

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#24

السلام عليكم

مرحبا إخوتي :)

بداية أعتذر عن التأخير لظروف خارجة عن إرداتي.

لنبدأ مع الأخ OmniVore :)

للأسف, مشروعك يحتوي على العديد من الأخطاء القاتلة .. يمكننا القول أن نسبة التحقق من صحة المُدخلات كانت تساوي 5%. إليك بعض أخطاء برنامجك :

  • توجد رسالة خطأ خاصة بالأحرف الغير مرغوب فيها و لكن لا توجد رسالة خطأ خاصة بطول الإيميل. و بالتالي إذا كان طول الإيميل مخالف فليست هناك رسالة محددة تُرشد المستخدم إلى الطول الصحيح !
  • نفس الشيء بالنسبة لكلمة المرور.
  • الإيميل لا يدعم الأرقام ( من قال لك أن الإيميل لا يمكن أن يحتوي على أرقام !؟ :) ) :
    Enter your YAHOO username : Arabteam2000@yahoo.com
    Erreur de saisie - Adresse Email invalide !
    Les caracteres refuses sont (entre ' et ') : '2000'
    Process returned 0 (0x0)   execution time : 1.630 s

  • إذا أدخل المستخدم كلمة مرور ثم قام بمسحها و واصل الضغط على الــ Backspace فسيتم تسجيل الدخول دون شرط أو قيد :
    Enter your YAHOO username : xxxxxxxxxxxxxxxxx@yahoo.com
    Enter your password :
    Merci xxxxxxxxxxxxxxxxx, vous etes le bienvenue :)
    Process returned 0 (0x0)   execution time : 6.983 s

  • إذا كانت كلمة المرور عبارة عن مجموعة رموز غير مرئية (espace مثلا ) فسيتم تسجيل الدخول دون شرط أو قيد !
  • ... هناك أيضا خطأ من نوع آخر !! :
    Enter your YAHOO username : khaled_prg@@@HaCkeR@@@yahoo.com
    Enter your password : *********************
    Merci khaled_prg, vous etes le bienvenue :)
    Process returned 0 (0x0)   execution time : 3.801 s

اقتباس
عند النظر الى صور المشروع المرفقة مع أول مشاركة لك ( عند اقتراح الموضوع ) لا نجد الا رسالة خطأ بسيطة دون تحديد الحروف الخاطئة

ألم تعلم أنه تم تحديث شروط المشروع في نهاية المشاركة رقم 9 ؟

اقتباس
اعتقد ان المطلوب هو ابراز استعمال المؤشرات و قد حققت ذلك في اغلب البرنامج

عزيزي, مشكلة الــ Overflow تُعتبر من أكبر تحديات هذا المشروع !, لا يمكننا بأي حال من الأحوال تجاهل هذه النفطة :)

اقتباس
ان شئتم بعد المسابقة نعيد كل المشروع فقط باستعمال المؤشرات حتى مع ابسط الانواع char و int

لا أظن أن بقية الأعضاء سيوافقون على مثل هذا الأمر :D

اقتباس
سيكون ايضا من الممتع استعمال الخصائص الجديدة للغة مع الاصدار C++11

يبدو أنك متحمس لهذا الإصدار :), عموما لا يمكننا كتابة المشروع بالإصدار الجديد لأننا لا نضمن أن كافة المشاركين على دراية كافة به !

اقتباس
اليك خطوات تنفيذ المشروع :

1- انشئ مشروع c++ جديد على Netbeans لكن في الخطوة الثانية ( خطوة اختيار الاسم) لا تنشئ ملف و دالة main لاننا سنضيف الملف فيما بعد,

2- انسخ ملفات المشروع السبعة ( ملفات h و cpp ) الى مجلد المشروع الجديد, ثم انسخ ملف الــMakefile المرفق هنا كذلك,

3- ثم بزر الفـارة الايمن على اسم مشروعك في Netbeans ثم Add Existing Item و اختر جميع ملفات الــh و cpp و ملف الــMakefile

4- build and run

و لماذا كل هذا التعب ؟؟, يمكننا أن نقوم بتضمين ملفات الــ .cpp بدل .h و عندها ستسير الأمور على ما يُرام :)

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

نحن بانتظارك, لكن لا تتأخر :)

اقتباس
بالمناسبة، متى آخر موعد لتقديم المحاولات؟

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

أبشر أخي ElectroDoc :)

انتهاء تسليم المحاولات سيكون 02 Mars إن شاء الله.

بالمناسبة, قمت بعمل برنامج صغير يتحقق من صحة كلمة المرور.

البرنامج لا يحتمل وجود أية أخطاء (بما في ذلك الــ Overflow ) لأن التحقق يحدث بشكل لحظي بمعنى أنه عند الضغط على أي زر من أزرار لوحة المفاتيح ستحدث عملية تحقق من الزر المُدخل, إذا كان موافقا سيواصل البرنامج و إذا كان مخالفا سيتم الخروج من البرنامج مع إظهار رسالة توضح طبيعة الخطأ بشكل دقيق.

البرنامج كتبتُه بالسي فقط من أجل إيجاد عدة محاولات بلغات مختلفة.

سأكمل الكود لاحقا حتى يشمل التحقق من الإيميل إن شاء الله.

ملاحظة : من أجل أن تكون الأكواد قياسية على مستوى المشاركين, يُفضل تسمية المتغيرات و الدوال بنفس الأسماء التي أخذها OmniVor.

PasswordValidation.rar

#25
اقتباس
أنا أعلم أن هذا ممكن باللغتين سي وسي++ ولكن بما أنه أصبح به تقييم للكود الأفضل فيجب أن تكون المقارنة على إستخدام لغة واحده ليتثنى أن يكون التقييم سليم .

لا أعتقد أنه من الإنصاف إبعاد السي عن السي++ أو العكس, أغلب مبرمجي السي++ يعتمدون بشكل رئيسي على السي في برمجة مشاريعهم و إلا فما فائدة الأشياء التي ورثتها السي++ عن السي ؟ :)

اقتباس
أخى الكريم خالد أين هذه الشتائم !!! هذه مجرد وجهه نظر تجاه التعديلات الدستورية الجديده على المشروع :wink: وإن كان بها بعض العصبية :D

شتائم إيه يا صاحبي ؟؟ :D هههه العتب ع النظر بس :lol:

اقتباس
وما دعانى لهذا الرد هو أننى كنت أشارك كتكملة لموضوعنا السابق ليس إلا بما لدينا من المعلومات البسيطه عن اللغة

من مواد الدستور الجديد: من لم يكمل جميع الشروط لا يقوم بتقديم كوده ... إذا فكان لزاماً هذا قبل البدأ حتى يحدد الشخص الجزئيات التى يعلمها والتى تحتاج لبحث عنها لمعرفتها.

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

تم تحديد فترة انتهاء تسليم المحاولات.

لكي يُشارك الجميع (و حتى لا نستبعد محاولة OmniVore) لن تكون هناك قوانين صارمة .. يمكن للجميع المشاركة .. كل حسب مستواه :)

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

تسلم حبيبي, الله يخليك :blush:

اقتباس
الأخ خالد يقصد "لماذا كل هذا التشاؤم"

(بصراحة أنا أيضاً قرأتها خطأ في البداية)

سبحان الله !! :D

اقتباس
من أجل تغيير الألوان أخ أحمد .......

بارك الله فيك, فعلا مشاركة قيمة.

بالمناسبة, أود أن أبدأ باستخدام Pelles :)

حسب رأيك, ما هي أفضل نسخة منه و هل يتوافق البرنامج مع Mingw أم Cygwin ؟

هذا الموضوع مغلق.

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