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

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

بدأه Hadjer في 17 يناير 2012 · 5 رد · 820 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اريد بناء برنامج بالسي يقوم على اساس الحجز الديناميكي للمصفوفات في الذاكرة

المصفوفة ذات بعد واحد وعناصرها عبارة عن سجلات-هياكل-(record,struct) وهي بذاتها عنصر في هيكل يحتوي عليها وعلى سعتها وهذا الهيكل هو مايسمى TasMaxبالفرنسية او heapبالانجليزية

نريد ادخال عناصر هيكل سميته

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

وهذه محاولتي فارجو التوجيه الى الاخطاء

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct date

{int day,month,year;};

struct commande

{int NoClient,NoCommande,quantity;char name[],surname[];struct date dt;};

struct TasMax

{commande*Arr,lg=100;};

void main

{

struct commande array[50];int i;

Arr=(struct commande*)malloc(sizeof(struct commande

for(i=0;i<?;i++)

{

printf("enter number of client,number of commande and quantity:");

scanf("%d%d%d",&commande.NoClient,commande.NoCommande,commande.quantity);

printf("enter the name,surname:");

scanf("%c%c",&commande.name,commande.surname);

printf("enter the date:");

scanf("%d%d%d",&commmande.date.day,commande.date.month,commande.date.year);

}

_________لااعرف كيف اضع الحد الاقصى للمصفوفة لهذا وضعت علامة الاستفهام في خصائص الحلقة

لقد بحثت في كثير من الكتب ولدي العديد من المعلومات لكنني لااجيد ترتيبها وهذا يؤلمني كثيرا لذا ساكون ممتنة لمن يصحح لي البرنامج

دمتم بخير وعافية

#2
اقتباس
اريد بناء برنامج بالسي يقوم على اساس الحجز الديناميكي للمصفوفات في الذاكرة

struct commande array[50]

الكود السابق ليس حجزا ديناميكيا للذاكرة انما حجز تلقائى للذاكرة أو ما يسمى Static memory Allocation

فى حالة ما كنا نريد حجز ديناميكى فاننا ﻻ بد ان نستخدم المؤشرات لكى تشير الى المنطقة المحجوزة ديناميكيا بأستخدام الدالة malloc

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

struct Commande *Array;
    Array = (struct Commande*)malloc(sizeof(struct Commande) * 50 );

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 17 يناير 2012 في 10:51

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

#3

هذا الكود ا شاء يعمل بعد اجراء القليل من التعديلات ....

اتمنى ان يكون سهل الفهم وبسيط .....

اذا كان هناك اى استفسار فأعضاء المنتدى جاهزووون ان شاء الله ...

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

struct MyDate
{
    int day,month,year;
};
struct MyCommande
{
    int NoClient,NoCommande,Quantity;
    char Name[15],SurName[15];
    struct MyDate dt;
};
//struct TasMax
//{
//   commande*Arr,lg=100;
//};
void main()
{
    /// we will insert one record for simplfiying data entry
    /// testing program ...
    int nCmdx= 1;
    struct MyCommande *MyCmdx[nCmdx];
    int i;
    for(i=0; i < nCmdx; i++)
    {
        MyCmdx=(struct MyCommande*)malloc(sizeof(struct MyCommande));

        printf("Enter number of client,number and quantity of commande: %d : ", i+1);
        scanf("%d%d%d",&MyCmdx->NoClient,&MyCmdx->NoCommande,&MyCmdx->Quantity);
        printf("Enter the name then surname: ");
        scanf("%s%s",MyCmdx->Name, MyCmdx->SurName );
        printf("Enter the date: ");
        scanf("%d%d%d",&MyCmdx->dt.day,&MyCmdx->dt.month,&MyCmdx->dt.year);
    }
    /// print out data ....
    int j=0;
    for(j = 0; j< i; j++)
    {
        printf("******************************Command no : %d *****************************\n", j+1);
        printf("Client: %d Number: %d Quantity: %d \n",MyCmdx[j]->NoClient,MyCmdx[j]->NoCommande,MyCmdx[j]->Quantity);
        printf("Name : %s , %s\n ",MyCmdx[j]->Name, MyCmdx[j]->SurName );
        printf("Date: %d:%d:%d\n ",MyCmdx[j]->dt.day,MyCmdx[j]->dt.month,MyCmdx[j]->dt.year);
        printf("*****************************************************************************\n");
    }
// free memory ..... .
    j=0;
    for(j = 0; j< i; j++)
    {
        free(MyCmdx[j]);
    }
}

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 17 يناير 2012 في 20:33

1

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

#4

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

1--الرمز<- مافائدته.. هل هو ضروري للوصول الى حقول السجل.. لاني كنت استعمل النقاط دائما

2--السجلTasMax

commande*Arr,lg=100 ;قمت بتعريف lg كالتاليdefine lg 100 # اما commande*Arr فلم استطع

3--عند اختبار البرنامج استقبل خطا يتكرر عدة مرات يقول ان العداد غير معرف ولم اعرف اين بالضبط

#5
اقتباس
1--الرمز<- مافائدته.. هل هو ضروري للوصول الى حقول السجل.. لاني كنت استعمل النقاط دائما

هذا الرمز هو طريقة سهلة وبديلة عن النقطة مثلا:

struct_x.age // or struct_x->name
(*struct_x).age = 100 // struct_x->age = 100;
//ايهما اسهل ..

اقتباس
2--السجلTasMax

انا لم افهم ماذا تقصدين بة أو ما فائدتة؟

اقتباس
3--عند اختبار البرنامج استقبل خطا يتكرر عدة مرات يقول ان العداد غير معرف ولم اعرف اين بالضبط

انا اختبرت الكود جيدا جدا ومتأكد من عملة وهو مشروع سي وليس سي++

ثانيا انا استخدم بيئة تطوير كود بلوك 10.5

عذرا لو تكرمتى كتابة رسائل الخطأ هنا

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

#6

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

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

كلنا يعلم أنه لايمكن حجز عدد عناصر المصفوفة أثناء تشغيل البرنامج أى فى حالة runtime

ولكن نستطيع ذلك بإسخدام المؤشرات ودالة حجز الذاكرة ()malloc على النحو التالى :

#include <stdio.h>
void main(){
int n,i;
int *pn;
printf("please enter the number of array elements:\n");
scanf("%d",&n);
pn=(int *)malloc(n*sizeof(int));
printf("please enter the values of the array:\n");
for(i=0;i<n;i++)
scanf("%d",pn+i);
printf("the Values in the array:\n");
for(i=0;i<n;i++)
printf("\n",*(pn+i));
}

فى المثال السابق تم حجز مساحة من الذاكرة قدرها على حسب عناصر المصفوفة التى يدخلها المستخدم مضروباً فى حجم

نوع البيانات المعرف منها المصوفة وهنا تم تعريف مصفوفة من نوع int أى عدد صحيح وكل عدد صحيح يشغل 4 بايت من الذاكرة وهكذا ...

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

وبنفس تلك الطريقة تطبق على المصفوفات ثنائية البعد

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

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

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

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

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

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

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