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

رجاء شرح اكواد عن الarrys & pointer

بدأه طموحي كبير في 31 أكتوبر 2010 · 8 رد · 2,042 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كيفكم ؟

عدت من جديد وعندي كووم اسئلة

فجزاكم الله خير

لاتنسوني من مساعداتكم

لان برمجة 2 لحست مخي صح

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

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

نبدا مع الاسئله

هذا الكود وش فايدته

#include <iostream>
using namespace std;
int main()
{
   int num;

   cout << "Enter a five-digit number: ";
   cin >> num;

   cout << num / 10000 << "   ";
   num = num % 10000;
   cout << num / 1000 << "   ";
   num = num % 1000;
   cout << num / 100 << "   ";
   num = num % 100;
   cout << num / 10 << "   ";
   num = num % 10;
   cout << num << endl;

   return 0;
}

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
   char str[80];
   char token [80];
   char *p,*q ;
   cout <<"Enter  a sentence : " ;
   gets(str);

   p=str;
//read a token at a time from the string 
   while (*p) // هذه الجزئيه ما فهمتها الى الاخير
   {
	   q=token;

// read a characters until either a space or the null terminator is encountered 
	   while (*p!=' ' && *p)
	   {*q= *p;
	   q++;p++;}
	   if(*p)p++; //advance past the space 
	   q ='\0';//null terminate the token*
	   cout << token << endl;}

   return 0;
}

تم تعديل هذه المشاركة بواسطة طموحي كبير في 31 أكتوبر 2010 في 19:19

http://groups.google.com.sa/group/Cplusplusimamgroup

تفضلوا بالزيارة لقروبي :)

#2
اقتباس
هذا الكود وش فايدته

الكود سطليب من المستخدم إدخال عدد يحتوي على 5 أرقام ثم يظهر كل رقم بشكل منفرد.

while (*p)

السطر السابق يعني :

ما دام المؤشر p يختلف عن الصفر أي مادامت السلسلة الحرفية لم تنتهي بعد.

في هذا السطر :

q=token;

سيشير q إلى أول عناصر السلسلة token.

هذا السطر :

while (*p!=' ' && *p)

يعني : مادامت الحرف الحالي يختلف عن space و السلسلة str لم تنتهي بعد.

*q= *p;

في السطر السابق قمنا بنسخ الحرف الذي كان يشير إليه p ووضعه في الخانة التي يشير إلىيها q , طبعا هذه الخانة تابعة للسلسة token

q++;p++;

هنا سيتقدم كلا المؤشرين ليشير إلى العنصر القادم

*q ='\0'

قمنا بإسناد الحرف \0 إلى الخانة التي يشير إليها q و ذلك للدلالة على نهاية اللسلة الحرفية ثم قمنا بإظهارها في السطر القادم.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة khaled_prg في 31 أكتوبر 2010 في 20:18

1
#3

و عليكم السلام ,

بالنسبة للكود الأول : يدخل المستخدم رقم مكون من خمسة ارقام .. ويعرض لي كل الارقام المدخلة و بينهم مسافات ..

يعني يدخل 34235 ويعرض .. 5 3 2 4 3 ,

مافيه شي الكود , بس يعرض العدد وهو مقسوم على 10000 (لأن العدد مكون من خمسة ارقام) عشان يعرض العدد الاول ,

بعدين يقول ان الرقم يساوي باقي قسمته على الرقم 10000 , عشان اتخلص من الرقم اللي طبعته اول شي .. و هكذا ..

واضح ؟

بالنسبة للكود الثاني ..

عرف في البرنامج مصفوفتين لهم نفس الطول , و مؤشرين .. كل مؤشر يؤشر على مصفوفة ..

طبعًا إذا بنأشر على مصفوفة كذا :

p=str;

يعني اننا نأشر على اول عنصر ف المصفوفة فقط ,

 while (*p)

يعني طالما ان الجملة لم تنتهي ,

  q = token;

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

 while (*p!=' '&& *p)
           {
		    *q = *p;
             q++;
		     p++;
		   }

الحين المؤشر p يؤشر على العنصر الاول بالمصفوفة , فنقول ان طالما انه يؤشر على حرف (يعني لم تنتهي الجملة بعد ) , و اللي يأشر عليه مب مسافة ,

نبي نستخدم المصفوفة الثانية اللي هي token , اللي خلينا المؤشر q يؤشر عليها ..

فنقول ان الحرف الاول من المصفوفة token يساوي الحرف الاول من المصفوفة str (الجملة المدخلة من قبل المستخدم ) ..

خلاص الحين عبينا العنصر الاول للمصفوفة token ,

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

ننتهي من هذي الحلقة و المصفوفة token قيمتها الكلمة الاولى من الجملة المدخلة في المصفوفة str ,

Ok ؟

if(*p)p++;

يسأل هل المؤشر لازال يؤشر على قيمة ؟ هنا يقصد فيها الـ space , لأن يمكن المستخدم ادخل اكثر من كلمة .. إذا true , انتقل للعنصر اللي بعده ..

 q ='\0'

يعني ان المصفوفة انتهت , بيطبع بس اللي نسخته فيما سبق , بالعربي عشان ما يطبع خرابيط من الذاكرة , لأن المصفوفة طولها 80 ,

cout << token << endl;

يطبع الكلمة الاولى , وينزل سطر ..

انتهينا من الكلمة الاولى من الجملة , ونرجع للحلقة مرة اخرى إذا الجملة لم تنتهي بعد ..

اتمنى يكون واضح .. واي سؤال حاضرين :happy: ,

المعذرة يا استاذ خالد , ما انتبهت لمشاركتك . ماشاء الله مختصرة و مفيدة +1 ..

مب مثلي رحنا و جينا :P ,

موفق :happy: ,

تم تعديل هذه المشاركة بواسطة إشراقة فجر في 31 أكتوبر 2010 في 20:39

2

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

#4

جـــــــزاكم الله كل خير

كفيتو ووفيتوا

الشرح واضح مرررررا

الله يسعدكم يارب :blush:

http://groups.google.com.sa/group/Cplusplusimamgroup

تفضلوا بالزيارة لقروبي :)

#6

عندي سؤال اخر بالبوينتر ما ادري احس هذا البوينتر على كثر ما اقرى فيه احسه ما ينفهم :wacko:

وش الفرق بين هذي الاكواد ؟؟

الكود الاول :

#include <iostream>
using namespace std;

//declare swap () uing pointer 
void swap(int *x,int *y);
int main()
{
	int i,j;
	i=10;
	j=20;
	cout <<" initial values of i and j : " ;
	cout << i << ' ' << j << '\n' ;
	swap (&i ,& j); // call sawp funtion    هنا ليه غير الا شاره الى & 
	cout << "Sawpped values of i and j : " ;
   cout << i << ' ' << j << '\n' ;

   return 0;
}
void swap(int *x,int *y) // هنا ليش الاشاره* غير عن الاستدعاء 
{
	int temp ;

	temp = *x ; //  save the value at address x
	*x= *y;// put y into x
	*y= temp ;// put x into y
}

الكود الثاني :

#include <iostream>
using namespace std;

//declare swap () uing pointer 
void swap(int *x,int *y);
int main()
{
	int i,j;
	i=10;
	j=20;
	cout <<" initial values of i and j : " ;
	cout << i << ' ' << j << '\n' ;
	swap (i , j); // call sawp funtion     
	cout << "Sawpped values of i and j : " ;
   cout << i << ' ' << j << '\n' ;

   return 0;
}
void swap(int &x,int &y) 
{
	int temp ;

	temp = x ; //  save the value at address x
	x = y;// put y into x
	y= temp ;// put x into y
}

ادري السؤال غبي لكن وش اسوي مخي انحاس معهم

وهذا كود ثالث

#include <iostream>
using namespace std;

//declare swap () uing pointer 
void f(int&) ;
int main()
{
	int val =1;
	cout << " old value for val : " << val <<endl ;
	f(val);// pass address of val to f()
	cout << " new value for val : " << val <<endl ;

   return 0;
}
void f (int & i )  
{
	i=10; // this modifies calling argument 
}

ساعدوني :wacko:

http://groups.google.com.sa/group/Cplusplusimamgroup

تفضلوا بالزيارة لقروبي :)

#7

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

نبدأ بالكود الأول:

اقتباس
هنا ليه غير الا شاره الى &

لأن الدالة تستقبل عنوان و ليس قيمة !

اقتباس
هنا ليش الاشاره* غير عن الاستدعاء

لأن وسائط الدالة هي مؤشرات و ليست قيم عادية !

========

#include <iostream>
using namespace std;

//declare swap () uing pointer 
void swap(int *x,int *y);
int main()
{
        int i,j;
        i=10;
        j=20;
        cout <<" initial values of i and j : " ;
        cout << i << ' ' << j << '\n' ;
        swap (&i ,& j); // call sawp funtion    هنا ليه غير الا شاره الى & 
        cout << "Sawpped values of i and j : " ;
   cout << i << ' ' << j << '\n' ;

   return 0;
}
void swap(int *x,int *y) // هنا ليش الاشاره* غير عن الاستدعاء 
{
        int temp ;

        temp = *x ; //  save the value at address x
        *x= *y;// put y into x
        *y= temp ;// put x into y
}

هذا الكود يقوم بتبديل قيم متغيرين عن طريق دالة.

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

#include <iostream>
using namespace std;

//declare swap () uing pointer 
void swap(int x,int y);
int main()
{
        int i,j;
        i=10;
        j=20;
        cout <<" initial values of i and j : " ;
        cout << i << ' ' << j << '\n' ;
        swap (i ,j); // call sawp funtion    
        cout << "Sawpped values of i and j : " ;
   cout << i << ' ' << j << '\n' ;

   return 0;
}
void swap(int x,int y)  
{
        int temp ;

        temp = x ; //  save the value at address x
        x= y;// put y into x
        y= temp ;// put x into y
}

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

=======

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

=======

الكود الثالث عبارة عن دالة تستقبل مرجع ثم تقوم بإسناد القيمة 10 للمتغير ذو العنوان المستقبل.

=======

كخلاصة للقول:

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

تم تعديل هذه المشاركة بواسطة khaled_prg في 31 أكتوبر 2010 في 21:36

#8

السلام عليكم مشكوررين على جهودكم الله يجعلها بموازين حسناتكم

رجاء ممكن تصححون حلي لهذا الكود

وهذا السؤال

A phone service provider company wants to calculate the total bills for each customer; that is, one customer can have more than one phone numbers and therefore bills (you do not know how many phone numbers he/she may has. For each customer, unique ID is generated automatically, and once established it can’t be modified.

1. Complete the following code

2. Use non class member function which takes object/s as argument to compare the number of contacts between two customers and return ID of customer with more numbers [note that this function can access private data members of the class directly]

#include <iostream>
#include <string>
using namespace std;
static int count ;
int i ;
class phoneNumber{ // 1
	double Bill;
public:         
	void setBill(double bill){Bill=bill;}
	double getBill(){return Bill;}
	void print(){ cout<<"Phone Number Bill: "<<Bill<<"\n";}

	numbers ;
};
//=============================
class CustomerPhones // 2
{
	phoneNumber  numbers  ;
	const int ID;
////Write a composite object here
int NumOfcontacts;
public:
    CustomerPhones(int ); //Set Bill for each phone number
    double  CalculateNetBill();// return total bill for all phone numbers 
    ~CustomerPhones();
    void print();//Make this function call phoneNumber print function
    int getNumOfcontacts(){return NumOfcontacts;}
	friend const int CompareCutomer(CustomerPhones ,CustomerPhones);


};//------------------------

CustomerPhones  :: CustomerPhones(int num ): ID (count +1)

{
double bi  ; // bill
NumOfcontacts = num ;
numbers = new int * [num];
for (  i=0 ; i==NumOfcontacts;i++)
	cout << " Enter the Bill" << endl; 
cin >> bi;
numbers.setBill(bi);
}
const int CompareCutomer(CustomerPhones obj1 ,CustomerPhones obj2)
{
	if (obj1 .NumOfcontacts > obj2 .NumOfcontacts)
		return obj1 .ID ;
	else 
		return obj2 .ID ;
}
void CustomerPhones :: print()
{
	cout << "ID"<< ID <<endl;
	for ( i =0 ; i < NumOfcontacts ; i++)
		numbers.print(); }

//=============================
int main()
{ int num1, num2 ;
cout << " Enter numbers of phones " << endl; 
cin >> num1 ;
cout << "If you have another number Enter it " << endl ;
cin >> num2 ;

	CustomerPhones obj1(num1),obj2 (num2);
obj1.print() ;
cout << CompareCutomer(obj1 ,obj2);

//Complete 
return 0;
}

تم تعديل هذه المشاركة بواسطة طموحي كبير في 7 نوفمبر 2010 في 17:01

http://groups.google.com.sa/group/Cplusplusimamgroup

تفضلوا بالزيارة لقروبي :)

#9

مرحبا ,

عندج أخطاء في الكود (ما جربته لأن ما عندي مترجم ) ..

في الـ Class الاول ,

اولاً : ما اعطيتي نوع للمتغير numbers .. اتوقع بيخليها int إفتراضي ..

ثانيًا : مالفائدة من المتغير اصلاً ؟

في الـ Class الثاني ,

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

فيكون تعريفها كالتالي :

phoneNumber  *numbers  ;

و يوجد خطأ عن إعطاء المصفوفة الحجم .. في هالسطر :

numbers = new int * [num];

ليه قلتي ان نوع المصفوفة int ؟ عرفتيها قبل و خليتي نوعها الـ Class الأول .. التصحيح :

numbers = new phoneNumber[num];

تصحيح دالة الهدم ..

~CustomerPhones(){delete [] numbers ;};

ايضًا يوجد خطأ هنا .. إشارة المساواة و لا توجد اقواس ..

for (  i=0 ; i==NumOfcontacts;i++)
        cout << " Enter the Bill" << endl; 
cin >> bi;
numbers.setBill(bi);

التصحيح :

for (  i=0 ; i<NumOfcontacts;i++)
{
cout << " Enter the Bill" << endl; 
cin >> bi;
numbers.setBill(bi);
}

و هنا ..

 for ( i =0 ; i < NumOfcontacts ; i++)
numbers.print();

لا تنسين ان الـ numbers هي مصفوفة ..

التصحيح :

 for ( i =0 ; i < NumOfcontacts ; i++)
 numbers.print();

وناقص دالة الحساب ..

بالتوفيق ..

سبحآن الله وبحمده .. سبحآن الله العظيم .. ,

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