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

اختبر قدراتك في C/CPP - الحلقة الثالثة, الجزء الخامس و الأخير

مغلق
بدأه Snack3r في 9 سبتمبر 2012 · 4 رد · 653 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

الحلقة الثالثة - الجزء الثاني.

الحلقة الثالثة - الجزء الثالث.

الحلقة الثالثة - الجزء الرابع.

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

سؤالنا هذه المرة لا يتعلق بالملفات بشكل مباشر, بقدر ما يتعلق بقنوات الإدخال و الإخراج (Stream Input/Output).

الحلقة الرابعة ستكون مُخصصة لأسئلة الــ OOP, لذا أحببتُ أن يكون السؤل الأخير من هذه الحلقة يحوي جزءاً من "البرمجة الكائنية التوجه", حتى يكون بمثابة حلقة وصل بين الحلقتين, الثالثة و الرابعة.

الإختبار الثالث (الجزء الخامس و الأخير) :

لتكن الفئة التالية ذات الإسم Point :

class point {
    int x, y;
public:
    // fonctions membre
};

قم بإعادة تعريف المعاملين, >> و << بحيث يستطيع المُستخدم إدخال و إخراج زوج إحداثيات (نقطة) باستخدام الرمزين < >, نفترض أنه يتم تمثيل زوج الإحداثيات هكذا :

<entier, entier>

مع إمكانية وجود مسافات بيضاء داخل الرمزين < >.

مثال :

post-219439-083542100 1347202380_thumb.p

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

المرفقات
imgTest.png
#2

هذه المرة لم أفهم المطلوب كثيرا

يعني تريد اعادة تعريف << و >> في الكلاس point؟ ثم كيف راح نستخدمهم في main؟

عموما, هذا الكود حسب ما فهمت من التمرين:

#include<iostream>
#include<conio.h>

class point {
    int x, y;
public:
    point() {
		x=y=0;
	}
	friend std::ostream &operator<<(std::ostream &out, point &p)
	{
		out<<"point : <"<<p.x<<","<<p.y<<">\n";
        return out;
	}
	friend std::istream &operator>>(std::istream &in, point &p)
	{
		p.x = p.y = 0;
		char s[32];
		std::cout<<"donnez un point : ";
		in.getline(s, 32);
		for(int stage=0, i=0; i<strlen(s); i++){
			if(s==' ') continue;
			if(stage==0&&s=='<'){
				stage=1;
				continue;
			}else if(stage==1&&s==','){
				stage=2;
				continue;
			}else if(stage==2&&s=='>'){
				std::cout<<"merci pour le point: <"<<p.x<<","<<p.y<<">\n";
				break;
			}else if(s>='0'&&s<='9'){
				if(stage==1){
					while(s>='0'&&s<='9')
						p.x = (p.x*10) + (s[i++]-'0');
					i--;
				}else if(stage==2){
					while(s>='0'&&s<='9')
						p.y = (p.y*10) + (s[i++]-'0');
					i--;
				}
			}else{
				std::cout<<"** Information incorrecte\n";
				break;
			}
		}
        return in;
	}
};

int main(){
	class point p1, p2;
	std::cin>>p1>>p2;
	std::cout<<"p1:"<<p1<<"p2:"<<p2;
	_getch();
}

output:

donnez un point : <121,    451>
merci pour le point: <121,451>
donnez un point :    < 44  ,   55  >
merci pour le point: <44,55>
p1:point : <121,451>
p2:point : <44,55>

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 9 سبتمبر 2012 في 22:13

[سبحان الله و بحمده, سبحان الله العظيم]

#3

أرى أنها أسهل حلقة بين أخواتها... ولكن مثل ما قال ياسين يجب أن يكون السؤال أكثر وضوحاً ...

هذه محاولتي :

#include<cstdio>
#include<cctype>
class point {
    	int x, y;
public:
    	point(int a=0,int b=0){x=a,y=b;}
    	int operator<<(point&q)
    	{
    	char a;a=getchar();
                    	x=0,y=0;
                    	while(a==' ')a=getchar();
                    	if(a!='<')
						{
							while(a!='\n')a=getchar();
							return 0;
						}a=getchar();
						while(a==' ')a=getchar();
                    	while(isalnum(a))
                            	{
                                    	x+=(a-48);
                                    	x*=10;
                                    	a=getchar();
                            	}
                            	x/=10;
                    	while(a==' ')a=getchar();
                    	if(a=!','){
							while(a!='\n')a=getchar();
							return -1;
						}a=getchar();
						while(a==' ')a=getchar();
                    	while(isalnum(a))
                            	{
                                    	y+=(a-48);
                                    	y*=10;
                                    	a=getchar();
                            	}
                            	y/=10;
                    	while(a==' ')a=getchar();
                    	if(a!='>'){
							while(a!='\n')a=getchar();
                            	return -2;}
						while(a!='\n')a=getchar();
                    	q.x=x,q.y=y;
                            	return 1;
    	}
void operator>>(point&a)
{
    	printf("<%i,%i>\n",a.x,a.y); 
}
bool operator!()
{
	if(x==0&&y==0)return 0;
	else return 1;
}
}Point;

int main()
{
    	point a,b;
    	int error;
   	do
    	{
            	printf("donnez un point :");
            	if((error=Point<<a)==1)
                    	printf("merci pour le point: "),Point>>a;
            	else
                    	printf("**information incorrect error no.%i\n",error);
    	}while(!a);
            	return 0;
}

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 9 سبتمبر 2012 في 22:00

#4
اقتباس
أرى أنها أسهل حلقة بين أخواتها... ولكن مثل ما قال ياسين يجب أن يكون السؤال أكثر وضوحاً ...

السؤال واضح وضوح الشمس و المثال يوضح المطلوب :)

محاولتي :

#include <iostream>
using namespace std;

class point {
    int x, y;
public:

    point(int abs = 0, int ord = 0) {
        x = abs;
        y = ord;
    }

    int abscisse() {
        return x;
    }
    friend ostream & operator <<(ostream &, point);
    friend istream & operator >>(istream &, point &);
};

ostream & operator <<(ostream & sortie, point p) {
    sortie << "<" << p.x << "," << p.y << ">";
    return sortie;
}

istream & operator >>(istream & entree, point & p) {
    char c = '\0';
    float x, y;
    int ok = 1;
    entree >> c;
    if (c != '<') ok = 0;
    else {
        entree >> x >> c;
        if (c != ',') ok = 0;
        else {
            entree >> y >> c;
            if (c != '>') ok = 0;
        }
    }
    if (ok) {
        p.x = x;
        p.y = y;
    } else entree.clear(ios::badbit | entree.rdstate());
    return entree;
}

int main() {
    char ligne [121];
    point a(2, 3), b;

    cout << "point a : " << a << " point b : " << b << endl;
    do {
        cout << "Donnez un point : ";
        if (cin >> a) cout << "Merci pour le point : " << a << endl;
        else {
            cout << "Information incorrecte !" << endl;
            cin.clear();
            cin.getline(ligne, 120, '\n');
        }
    } while (a.abscisse());

    return 0;
}

يُمكننا أيضا حل السؤال بالطريقة التقليدية :

#include <iostream>
#include<cstring>
using namespace std;

bool isPoint(string str) {
    if (str.length() >= 5)
        return (str[0] == '<' && isdigit(str[1]) && str[2] == ','
            && isdigit(str[3]) && str[4] == '>' && str[5] == '\0');
    else return false;
}

int main() {
    int i = 0;
    string test;
    cout << "Donnez un point : ";
    getline(cin, test, '\n');
    while (test) {
        if (test == ' ')
            test.erase(i--, 1);
        i++;
    }
    if (isPoint(test) == true)
        cout << "Merci pour le point : " << test << endl;
    else
        cout << "Erreur, Information incorrecte !" << endl;
    return 0;
}

الكود الثاني يدعم الإحداثيات التي تتكون من رقمين فقط (مثل <1,2>), لكن من السهل جدا تطويره ليدعم عدة أرقام لكل إحداثية.

#5

تم منح النقاط للمشاركات المفيدة و حذف الردود الغير مفيدة, حفاظا على تنسيق الموضوع.

يُغلق.

أراكم في الجزء الأول من الحلقة الرابعة.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 10 سبتمبر 2012 في 15:58 — السبب: إضافة الرابط.

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

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