ahmed.o.mohamed

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

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

السلام عليكم

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<entier, entier>

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

مثال :

post-219439-083542100 1347202380_thumb.p

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

0

شارك هذا الرد


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

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

يعني تريد اعادة تعريف << و >> في الكلاس 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[i]==' ') continue;
if(stage==0&&s[i]=='<'){
stage=1;
continue;
}else if(stage==1&&s[i]==','){
stage=2;
continue;
}else if(stage==2&&s[i]=='>'){
std::cout<<"merci pour le point: <"<<p.x<<","<<p.y<<">\n";
break;
}else if(s[i]>='0'&&s[i]<='9'){
if(stage==1){
while(s[i]>='0'&&s[i]<='9')
p.x = (p.x*10) + (s[i++]-'0');
i--;
}else if(stage==2){
while(s[i]>='0'&&s[i]<='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>

تم تعديل بواسطه أحمد الشنقيطي
0

شارك هذا الرد


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

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

هذه محاولتي :

#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
0

شارك هذا الرد


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

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

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

محاولتي :

#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[i]) {
if (test[i] == ' ')
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>), لكن من السهل جدا تطويره ليدعم عدة أرقام لكل إحداثية.

0

شارك هذا الرد


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

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

يُغلق.

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

تم تعديل بواسطه أحمد الشنقيطي
إضافة الرابط.
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

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

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