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

كتابة برنامجين بلغة ال C++

بدأه علموني في 31 مارس 2009 · 9 رد · 1,249 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

بإستخدام المؤشرات اكتب برنامج يحتوي على الهيكل student والذي يحتوي على العناصر التالية :

id رقم الطالب عدد صحيح

name اسم الطالب مصفوفة احرف

grade معدل الطالب رقم حقيقي

البرنامج سيقرأ هذه العناصر ويطبعا على الشاشة

* استخدام الدالة malloc لحجز موقع في الذاكرة للهيكل بدلا من اسم للمتغير الهيكلي ؟

_____________________________

س2 )

اكتب دالة باسم ()change1 تستخدم المؤشرات وتقوم بوضع اصفار في ثلاث متغيرات داخل الدالة الرئيسية التي تستدعي الدالة ()change1 ؟

______________

اخوتي المعذرة ان كنت اطلب شيء مو من حقي ربما لكن عن جد انا ضايعة في هذه اللغة ومو فاهمتها كثير ومتوهقة

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

#2

بســم الله الـرحمــن الرحيــم

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

مرحبا بك في القسم , اللغة بسيطة وليست بتلك الصعوبة التي تتوهمينها , فقط يلزمك بعض الجهد في البداية

ولان قواعد القسم تمنع وضع حلول الواجبات ساعطيك فكرة الحل بـ ++C ويبقى عليك تحويلها للسي

السؤال الاول :

 

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

struct student
{
 unsigned int ID;
 float Grade;
 string Name;

 void ShowStudentInfo(void)
  {
   cout << "Student's ID	: " << ID			<< endl;
   cout << "Student's Name  : " << Name.c_str()  << endl;
   cout << "Student's Grade : " << Grade		 << endl;
  } 

};


int main()
{
 student  *me;
 me = new student;

 (*me).ID = 1;	   // me->ID = 1;
 me->Grade = 95.95;  // (*me).Grade = 95;
 (*me).Name = "Ali"; // me->Name = "Ali";

 me->ShowStudentInfo();
 delete me;

 return 0;
}

السؤال الثاني :

 

#include <iostream>
using namespace std;

change1(int *a ,int *b ,int *c)
{
 *a = 0;
 *b = 0;
 *c = 0;
}

int main()
{
 int A = 1;
 int B = 2;
 int C = 3;

 cout << "Original Values of A,B,C" << endl;

 cout << "A = " << A << endl;
 cout << "B = " << B << endl;
 cout << "C = " << C << endl;

 change1(&A,&B,&C);

 cout << "Modified Values of A,B,C" << endl;

 cout << "A = " << A << endl;
 cout << "B = " << B << endl;
 cout << "C = " << C << endl;

 return 0;
}

تحياتي

تم تعديل هذه المشاركة بواسطة HaTy في 31 مارس 2009 في 22:05

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#3

بسم الله الرحمن الرحيم

تسلم اخوي على الرد ,

سويت اللي قلتة لكن هم مو متأكدة اذا ممكن تطلع اشوي على الحل

#include <stdio.h>

#include <stdlib.h>

void maim(std);

struct student

{

int ID;

float Grade=95;

char Name[20];

{

ptr=(int Student's ID*)malloc(size of(int));

ptr->ID = 1;

ptr=(char Student's Name.x[20]*)malloc(size of(char));

ptr->Name = "Ali";

ptr=(float Student's Grade*)malloc(size of(float));

ptr->Grade = 95;

printf("\n%c%d",ptr->ID,ptr->Grade);

gets(ptr->name);

printf("enter the name");

}

}student.*ptr;

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

ليه الصفحة تكون معكوسة مدري

تم تعديل هذه المشاركة بواسطة علموني في 31 مارس 2009 في 23:50

#4

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

الكود التالي ينفذ المطلوب

#include <stdio.h>
#include<string.h>
#include <stdlib.h>
struct student{int id;char name[30];float grade;};
int main(int argc, char *argv[])
{
struct student *studen;
int s,i,g;
char str[30];
float f;
printf("How student add:");
scanf("%d",&s);
studen=(struct student*)malloc(sizeof(struct student)*s);
for(i=0;i<s;i++)
{
printf(" Enter Id:");
scanf("%d",&g);
fflush(stdin);
printf(" Enter Name:");
scanf("%s",&str);
fflush(stdin);
printf(" Enter garde:");
scanf("%f",&f);
fflush(stdin);
studen.id=g;
strncpy(studen.name,str,30);
studen.grade=f;
}
for(i=0;i<s;i++)
{
printf("\n Id:%d\n name:%s\n grade:%4.2f\n",studen.id,studen.name,studen.grade);
}
return 0;
}
tvquran_6.gif

#5

بســم الله الـرحمــن الرحيــم

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

اخي فهد لماذا ضمنت الملف string.h ؟

وهل يجب استخدام الدالة fflush(stdin); لاقراغ البفر قبل استخدام scanf ام ان ذلك ضروري فقط قبل استخدام الدالة gets ?

#include <stdio.h>
#include <stdlib.h>

struct student
{
 unsigned int ID;
 float Grade;
 char Name[20];

};

int main()
{
 struct student *me;
 me =( struct student* )malloc(sizeof(struct student));

 if( me == NULL ){
  printf( "Insufficient memory available\n" );
  exit(1);
 }

 printf("Enter Student's ID : ");
 scanf("%d",&me->ID);

 printf("Enter Student's Name : ");
 fflush(stdin);
 gets(me->Name);

 printf("Enter Student's Grade : ");
 scanf("%f",&me->Grade);

 printf("\nStudent's Info ...\n\n");

 printf("Student's ID	: %d\n",me->ID);
 printf("Student's Name  : %s\n",me->Name);
 printf("Student's Grade : %0.2f\n",me->Grade);

 // or
 //printf("Student's ID : %d\nStudent's Name : %s\nStudent's Grade : %0.2f\n",me->ID,me->Name,me->Grade);

 free(me);

 exit(0) ;
}

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#6

بسم الله الرحمن الرحيم

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

#include <stdio.h>

#include <stdlib.h>

void maim(std);

struct student

{

int ID;

float Grade=95;

char Name[20];

{

ptr=(int Student's ID*)malloc(size of(int));

ptr->ID = 1;

ptr=(char Student's Name.x[20]*)malloc(size of(char));

ptr->Name = "Ali";

ptr=(float Student's Grade*)malloc(size of(float));

ptr->Grade = 95;

printf("\n%c%d",ptr->ID,ptr->Grade);

gets(ptr->name);

printf("enter the name");

}

}student.*ptr;

البرنامج الثاني

#include<stdio.h>

Void chang1(int*a,int*b,int*c)

{

Int a;

Int b;

Int c;

Printf(“a%d,b=%d,c=%d\n”,&a,&b,&c);

Printf(“a=%d,b=%d,c=%d\n)

}

Void chang1(int*a,int*b,int*c)

{

*a=0;

*b=0;

*c=0;

}

تم تعديل هذه المشاركة بواسطة علموني في 1 أبريل 2009 في 03:50

#7

بســم الله الـرحمــن الرحيــم

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

اولا حتى يظهر الكود سليم وغير معكوس على صفحة المنتدى يجب حصره بوسم الكود وذلك كالاتي:

الضغظ على زر الكود تجدينه في الجهة اليسرى اعلى صندوق كتابة المشاركات وعليه رمز #

فسيقوم بكتابة كلمة CODE بين قوسين [] والكلمة الاخرى /CODE بين قوسين , فنقوم بوضع اكواد البرنامج بين هاتين الكلمتين

او نقوم بوضع كود البرنامج في صندوق تحرير المشاركة ثم نقوم بتضليل كود البرنامج فقط ثم نضغط على زر الكود وهو معلم بالرمز #

~~~

فيما يخص سؤالك فحلك غير صحيح .

لنحلل البرنامج في مشاركتي السابقة خطوة بخطوة حتى نفهم البرنامج بشكل افضل

#include <stdio.h>

لتضمين الملف الرأسي stdio.h والذي به دوال الادخال و الاخراج

#include <stdlib.h>

لتضمين الملف الرائسي stdlib.h والذي به دوال التحويل ودوال تخصيص الذاكرة


{
unsigned int ID;
float Grade;
char Name[20];
};
struct student

هذا تركيب انشئناه به ثلاث انواع من من البيانات وهي ID من النوع الصحيح الموجب , و Grade من النوع الكسري , Name[20] مصفوفة حرفية تحمل 19 حرف

نلاحظ دائما ان التركيب يكون مسبوق بكلمة struct وهي اختصار لـ structure ثم اسم التركيب يختاره المبرمج وهو في مثالنا student ثم القوس المعكوف { ثم المتغيرات و انواعها وهي في مثالنا ID,Grade,Name ثم قوس قفل التركيب } متبوعا بالفاصلة المنقوطة " الفارزة " ;

التركيب يكون قبل الدالة الرئيسة main() حتى يتعرف عليه البرنامج

حسنا الان نأتي الى تصميم البرنامج ويبدأ من الدالة الرئيسة main() وهي من النوع int حتى تقوم بارجاع قيمة لنظم التشغيل تعلمه بحالة البرنامج

يمكن ايظا ان تكون من النوع void اي انها لن ترجع معلومات لنظام التشغيل وهو نظام الونوز في حالتنا

الدالة main() كباقي الدوال ستكون محصورة بين قوسين معكوفين {} حيث تكون الاكود البرمجية للدالة بين هاذين القوسين

struct student *me;

قمنا في هذا السطر البرمجي بالاعلان عن مؤشر باسم me من نوع التركيب sudent

والاعلان كأننا نقول للبرنامج ايها البرنامج المحترم اعلم بإن لديك الاخ المؤشر me وهو من نوع التركيب student الموجد اعلاه وسوف اخبرك ماذا تفعل به لاحقا.

المؤشر يكون مسبوقا بعلامة * النجمة ,وفائدة المؤشر انه يؤشر الى عنوان في الذاكرة يمكن حجزه فيما بعد ليحمل بيانات من نفس نوع المؤشر

me =( struct student* )malloc(sizeof(struct student));

هذا السطر البرمجي يأمر البرنامج ويقول له ايه البرنامج المحترم قم بحجز جزء من الذاكرة لبيانات من نوع التركيب student وبحجم التركيب student واعطى عنوانها للمؤشر me الذي اخبرتك عنه سابقا

هنا سيقوم برنامجنا المحترم بمخاطبة نظام التشغيل ويقول له ايه النظام ويندوز قم باعطائي حيزا فارغا من الذاكرة حتى اضع فيه بيانات الاخ me علما بأن حجم الاخ me هو نفس حجم التركيب student

ولان برنامجنا مشغول ببعض الاعمال المكتبية فضلا عن كونه كسولا ولا يقوم الا باصدار الاوامر سيقوم بارسال الدالة malloc لنظام التشغيل حتى تقوم بحجز غرفة فارغة في فندق الذاكرة Heap .

الدالة malloc تعني حجز الذاكرة او memory allocate فاذا كان هناك فراغ في الذاكرة سوف يتكرم نظام التشغيل و يعطي الدالة malloc عنوان الذاكرة " عنوان الغرفة " التي سيقم فيها الاخ me

اما اذا كان الموسم السياحي مزدهرا وجميع غرف فندق الذاكرة مشغولة بيانات البرامج الاخرى , فإن نظام التشغيل سيقول للدالة malloc اسف فليس لدي اماكن خالية يمكن ان يشغلها الاخ me وهنا ستعود الدالة malloc للبرنامج بخفي منتظر وهي القيمة NULL

بعد رجوع الدالة malloc من رحلتها العجيبة الغريبة من نظام التشغيل الى البرنامج ستعطى القيمة التي رجعت بها للاخ me

وهنا تتضح اهمية هذا الجزء البرمجي


printf( "Insufficient memory available\n" );
exit(1);
}
if( me == NULL ){

حيث يقوم البرنامج بالاطلاع على قيمة الاخ المؤشر me فاذا كان خالى الوفاض اي حاملا للقيمة NULL سيعلم المستخدم على صفحات جرائد الكونسول بانه لاتوجد ذاكرة كافية كل هذا ستقوم به الكاتبة الصحفية الشهيرة وهي الاخت الدالة printf في مقالة بالبنط العريض بعنوان "Insufficient memory available\n"

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

scanf("%d",&me->ID);

الدالة scanf تعمل على ادخال القيم وفي السطر البرمجي السابق اعلمنا الدالة scanf بان نوع البيانات المدخلة سيكون من النوع int وهذا تم بواسطة المرسوم السامي "%d" وبالطبع نستطيع تغييره اي انواع اخرى مثل "%s" للسلاسل الحرفية string او "%f" للارقام الكسرية float او "%c" للحروف char

الجزء الاخر من بارمترات الدالة سيكون فيه العنوان الذي ستضع فيه الدالة القيمة التي سيتم ادخالها وفي مثالنا هي &me->ID

وهنا يتضح ان السطر البرمجي السابق سيقوم باخذ قيمة من المستخدم من النوع Int ووضعها في عنوان me->ID.

fflush(stdin);

تعمل هذه الدالة على افراغ بفر Buffer الادخال ويجب استخدامها قبل الدالة gets

gets(me->Name);

الدالة gets اختصارا لـ get string وتعمل على اخذ النص ووضعه في المتغير المحدد وهو في مثالنا me->Name

يمكننا استخدام الدالة scanf لادخال النصوص ولكنها ستهمل اي نص بعد الفراغ space فمثلا لو كان الاسم ali ali ستاخذ ali الاولى فقط

واستخدام scanf مع النص كالاتي

scanf("%s",&me->Name);

نقطة اخرى للوصول الى عناصر المؤشر نستخدم الشرطة و السهم مثل me->ID وتوجد طريقة اخرى وهي كالاتي :

(*me).ID

اخيرا بعد الانتهاء من التعامل مع الاخ التركيب me وبعد تأكدنا من عدم حاجة البرنامج اليه سنقوم باخراجه من غرفته في فندق الذاكرة لان برنامجنا على وشك الانتهاء ولن يكون قادرا على دفع تكاليف الاقامة ومن سيقوم باخراج الاخ التركيب me من غرفته هو امن فندق الذاكرة وهي الدالة free وهذه الدالة تعمل على تحرير مقاطع Blocks من الذاكرة بنفس الحجم الذي تم حجزه باستخدام الدالة malloc , ويجب الانتباه دائما الى ضرورة تحرير الذاكرة التي حجزناها يدويا باستخدام دالة تخصيص الذاكرة malloc حتى لا يحدث تسرب للذاكرة memory leak

exit(0);

وتعني الخروج من البرنامج بنجاح

يمكن ايظا استخدام

return 0;

لترجع بقيمة 0 لنظام التشغيل و التي تعني انهاء البرنامج بنجاح

اخيرا تجدين في المرفقات كتاب الاخ " خليل اونيس " وهو كتاب سلس وسهل ومن افضل الكتب التى تعتبر مدخلا للغة السي

ارجو ان اكون افدتك

تحياتي

index.pdf

تم تعديل هذه المشاركة بواسطة HaTy في 1 أبريل 2009 في 10:25

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#8

نعم يا اخي HaTy جربها بدون fflush .

تحرير الذاكرة نسيت ان اضيفه .

بالنسبه لملف الراس string.h استخدمت متغيرات وسيطة من ضمنا متغير نصي فمن اجل نسخه الي آخر احتجت الدالة strncpy وكان بالامكان الاستغنا عنها اصلا والعمل مباشرتا.

هناك دائما عدة طرق للوصول الي نفس الهدف.

tvquran_6.gif

#9

بســم الله الـرحمــن الرحيــم

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

شكرا اخي فهد على التوضيح , وضحت الصورة

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#10

بسم الله الرحمن الرحيم

اخي haty

يسلم وجودك بجد استفدت من شرحك ....( انت عملة نادرة )

والكتاب ان شاء الله راح استعين بيه

اكرر شكري

تم تعديل هذه المشاركة بواسطة علموني في 1 أبريل 2009 في 21:47

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…