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

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

مغلق
بدأه superboy في 15 ديسمبر 2006 · 16 رد · 1,221 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

ســـــــــــ ;) ــــــــؤال صغير :

كيف يمكن عدد عناصر المصففة أثناء التشغيل على نمـــ :wacko: ــط

cin>>x;

int y[x];

و شكرا

#2

و بحثت ووجدت الكود و لكني لم أفهم هل يمكنك شرحه الكود هو

int i ;

cin >> i;

int Array=new int ;

for (int j=0;j<i; j++)

cin >> Array[j];

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

#3
int *Array=new int ;

تصحيح :)

هذا يسمى الـ Dynamic Allocation انت تعرف المصفوفة بالـ heap وهي الطريقة الوحيدة الي يكون فيها تحديد الـ size حق المصفوفة خلال الـ runtime

رغم ان كومبايلر الـ Linux يقبل عادي انك تسوي الحركة الاولى :) غريبة ؟! بس يقبل

اذا كان عندك كتاب الـديتل افتح اول قسم الداتا ستركتشرز بتلقى فيه شرح

int a[5];

هنا المصفوفة يكون مكاناها في الـ Stack

#4

في الحقيقة .. الأخ NullFlag أجاب على سؤال ..

ولكن أود أن أضيف أن المؤشرات هي من مميزات C و ++C في التعامل مع الذاكرة .

قد يستغرب البعض من طريقة ++C و C في حجز المتغيرات Dynamic Allocation وقت التشغيل. و لكنها تعطي مرونة في التعامل من قبل المبرمج ..

كثير من اللغات الأخرى تمكن المبرمج من حجز المتغيرات وقت التشغيل دون ازعاجه بالتعامل مع الذاكرة :)

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 16 ديسمبر 2006 في 00:09

#5

شكرا لك على الشرح لكن لماذا لا نتاعامل في بقية الكود مع *arrayy

بل نتعامل مع array بلا نجمة حيث array اسم متغير المصفوفة أهذا لسهولة الكتابة

#6

array كذا يحتوي على عنوان اول عنصر

(array+1)

عنوان ثاني عنصر وكذا

*array يحتوي على اول قيمة

*(array+1) ثاني قيمة

وانت ماشي

array[1]= *(array+1)

#7

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

#8

مرحبا superboy .. :)

أكيد انت تعاملت مع المصفوفات قبل اليوم ... :rolleyes:

طيب لما نعرف مصفوفة شو اللي بيصير !

خذ هذا المثال ..

int arr[5];

هذه المصفوفة ثابتة مكونة من خمس عناصر و لكن ما في شي في الكمبيوتر بيشيل خمس عناصر.. هذا نوع من تراكيب البيانات Data Structures .

طيب .. اللي بيصير انه بيتم حجز خمسة متغيرات من نوع int في الذاكرة .. طيب و بعدين .. :blink:

المتغير الذي تستخدمه عبارة عن متغير لحمل عنوان أول عنصر في المصفوفة .. بس لا تنسى ان المصفوفة تكون محجوزة ضمن Stack البرنامج نفسه .

في ++C يمكنك استخدام & للحصول على عنوان المتغير :

cout << &arr; // This will print the address of the first element of the array.

cout << &arr + sizeof(int) * 3; // This will print the address of the fourth element.

الدلة sizeof بتعطيك حجم النوع مثل int أو double أو غيره عند حجزه في الذاكرة .

هذه كله تمام ما في مشاكل معاه ..

في شيء اسمه Heap .. منطقة في الذاكرة حرة مثل ساحة خردة ! تقدر تحجز فيها مكان لأي غرض بدك تخزنه أو تقدر تشيل الغرض متى ما حبيت ..

Stack البرنامج مثل الغرفة محدد بحجم معين ما فيك تغيره.

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

مقدمة بسيطة .. :)

نجي لسؤالك :

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

أول شي شو بتقصد بالوقت المحدد .. :blink:

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

#9

<<< متااابعه

ويعطيكم الف عافيه

والله معلومات حلوة من جد تعطوني طموح اكبر اكمل برمجه :)

#10

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

لكن لدي مشكلة صغيرة

لقد كتبت كود لإجاد ناتج كثير حدود عندما معطي و حدث خطأ لا أعلمه :

[qoute]

error C2064: term does not evaluate to a function

[/qoute]

و السؤال ما معنى هذا الخطأ و شكرا لك و كيف حله و المثال لو سمحت

و سؤال أخير (إذا ما صار في قلة ذوق مني بسبب كثرة الأسئلة) :unsure:

هل المنطقة heap من الذاكرة تكون مساحنها بقدر مساحة الذاكرة كلها ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#11

أهلين أخ superboy ... :)

بالنسبة للسؤال الأول ممكن تحط الـ Code حتى نعرف من وين الغلط ..

ثاني سؤال .. الـ Heap منطقة افتراضية في الذاكرة و ما هي موجودة حقيقة ..

بس اللي يصير انه لما تطلب جزء من الذاكرة يعطيك اياها نظام التشغيل اللي تستخدمه ( لذلك السبب أنظمة التشغيل معقداً جداً رغم بساطة فكرتها و هي توفير الموارد المادية للتطبيقات ) ضمن الجزء اللي حدده ليكون ذاكرة Dynamic .

معلوماتي ليست بالكثيرة عن الموضوع , أتمنى لك التوفيق

#12

سلام عليكم

حوار جميل بارك الله فيكم

error C2064: term does not evaluate to a function

يظهر هذا الخطأ عند تكوين شكل استدعاء دالة و هى غير معرفة وغالباً ما يكون لسبب نسيان علامة الضرب.

مثلاً

 y=x*(z+2);	//OK
y=x(z+2); //error C2064
#13

شكرا لكما أخي PointerVC ره الكود و ستعلم أين الخطأ

و أخي خالد ألأف شكر لك حبيب قلبي الكود هو :

#include "stdafx.h"
#include "iostream"
#include "cmath"
using namespace std;
int main()
{
	int dg; // the power of the "الحد الجبري درجته"
	double sol = 0; //the slove
	double  x; // the Variable x
	int cnt;
	cin>> dg;
	int *par = new int[++dg];//the ByWord "الأمثال"
	for(cnt = dg -1; cnt >= 0; cnt--) cin >> par[cnt];
	cin >> x;

	for(cnt = dg-1; cnt >= 0; cnt--)
		sol += pow(x , double( cnt - 1)) * par(cnt + 1);//error C2064 here
		cout<<sol;
	return 0;
}

تم تعديل هذه المشاركة بواسطة superboy في 22 ديسمبر 2006 في 20:45

#14
 sol += pow(x , double( cnt - 1)) * par[cnt+1];//You can't multiply Value with address

:)

#15
اقتباس
//You can't multiply Value with address

ماذا تعني

أسف جدا لأني شغلتكم يغبائي فأنا مبرمج vb سابق و المصفوفة في vb تكتب على الشكل )( و ليس على الشكل []

لذا غطت و كان هذا الخطأ و شكرا

#16
 (p+1) هذا يعطيك قيمة Address

يعني مو القيمة الي داخل الادرس هذا

|ADDRESS| -------->|VALUE|
#17

لم أفهم لا تزعل مني لأني بليد

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

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

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

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

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

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