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

سؤال مهم في المصفوفات عرقل البرنامج كاملاً

مغلق
بدأه الزهرة الرقمية في 22 مايو 2007 · 15 رد · 1,220 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ...

لدي سؤال في لغة C أتمنى أن يكون الحل لديكم ...

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

عرض رسالة تخبرك ( الادخال رقمي وليس حرفي ) ويتم الادخال بشكل طبيعي لمواقع المصفوفة .

#2

السلام عليكم

بإمكانك إستعمال الدالة () isdigit المعرفة في ctype.h

#3

شكراً أخي على مشاركتك الطيبة ...

لكي أكون واضحاً أكثر البرنامج التالي يوضح استخدام الدالة isalpha لتجنب ادخال الحروف لكن البرنامج يخرج بمجرد ادخال حرف وانا اريد ان يعرض رسالة ادخال خطا للحرف ثم يطلب منه الادخال مرة أخرى والملاحظ في البرنامج وكأن الدالة هنا ليس منها فائدة .

الكود هو :

# include<iostream.h>
# include<ctype.h>
main()
{
int a[5],i=0,x;
cout<<"Enter Valuse Of Array :";
while (i<5)
{
	cin>>x;
	if (isalpha(x))
	{	cout<<"Input Is letter ........please Is Digit :";
		continue;
	}
	else
	{
		a=x;
		i++;
	}
}
for(i=0;i<5;i++)
cout<<a;
}
#4
char *x;

و أيضا

 
isalpha(*x)

a = atoi(x)

تم تعديل هذه المشاركة بواسطة Yousof في 22 مايو 2007 في 22:47

#5
int a[5],i=0;
char x;
cout<<"Enter Valuse Of Array :";
while(i<5)
{
	cin>>x;
	if (isalpha(x))
	{   
		cout<<"Input Is letter ........please Is Digit :";
		//continue;
		//break;
	}
	else
	{
		a=atoi(&x);
		i++;
	}

}
for(i=0;i<5;i++)
cout<<a;
#6

أخي Yousof ...

أشكرك على هذا الكود ، لكن هناك رسالة تظهر تقول فيه ( صادف البرنامج مشكله ويجب إغلاقه ) ولا ادري ماهو السبب .

#7

أخي نيزك ...

الكود الذي أعطيتني ممتاز لكن لدي سؤالين :

أولاً : لماذا أضفت & مع المتغير X يعني ماذا معنى ذلك ؟

ثانياَ : إذا ادخل المستخدم رقم مكون من جزئين مثل 23 كيف يمكن تجنب هذه المشكلة واعتباره رقم واحد يدخل في أي موقع من مواقع المصفوفة ؟

#8
الزهرة الرقمية كتب:
أخي Yousof ...

أشكرك على هذا الكود ، لكن هناك رسالة تظهر تقول فيه ( صادف البرنامج مشكله ويجب إغلاقه ) ولا ادري ماهو السبب .

نسيت أن أضيف هذا الكود لك و هو يقوم بحجز الذاكره

x = new char[5];

أضيفيه بعد هذا

char *x;
#9

أشكرك أخي يوسف على هذه المعلومة ...

لكن سؤالي إلى الآن جوابه لم يكتمل كما وضحته للأخ نيزك من حيث ادخال رقم مكون من خانتين مثل ( 12).

#10

الأخ الفاضل ...

جرب استخدام التالى

#include <iostream.h>
#include <ctype.h>
#include <stdlib.h>

#define		MAX_ARRAY	5

int getusernumber()
{
	char	buff[11];
	int	n, l;

	do
	{
		cin.clear();
		cin.getline(buff, 10);

		l = cin.gcount() - 1;
		for(n=0; n<l; n++)
			if(!isdigit(buff[n]) && !(buff[n] == '-' && !n))
			{
				cout << "Input have letters... please enter digits: ";
				break;
			}
	}
	while(n != l);

	return atoi(buff);
}

int main(int argc, char* argv[])
{
	int	a[MAX_ARRAY];
	int	i;

	for(i=0; i<MAX_ARRAY; i++)
	{
		cout <<"Enter values of array Elemnt[" << i+1 << "]: ";
		a = getusernumber();
	}

	cout <<"\n\nYour array values: ";
	for(i=0; i<MAX_ARRAY; i++)
		cout << a << "  ";

	return 0;
}

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 25 مايو 2007 في 12:21

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#11

الأخ Eng.Usama El-mokadem ...

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

لكن اتمنى كمعروف أخير ان تشرح لي كود الدالة getusernumber حتى استطيع استيعابه بشكل أكبر فهناك اشياء لم افهمها واشياء مالغرض منها مثل:

cin.clear();- cin.gcount() ماعملهما بالضبط ؟

cin.getline لماذا استخدمتها ولم تستخدم cin.get ؟

if(!isdigit(buff[n]) && buff[n] != '-') متى ينفذ هذا الشرط في أي حالة ؟

if (n != l) كذلك لم افهم متي تأتي هذه الحالة ؟

أسف إن أطلت في اسئلتي لكنني احب افهم ماذا يعمل الكود بشكل واضح ؟

#12

الأخ الفاضل ...

  1. الدالة getusernumber: لضمان إرجاع قيمة رقمية صحيحة من المستخدم، وفى حالة ادخال حروف، يعيد طلب ادخال قيمة رقمية
  2. cin.clear: للتخلص من أى بقايا سابقة فى مخزن لوحة المفاتيح قبل الادخال
  3. cin.gcount: لإرجاع طول ما تم ادخاله من خلال الدالة getline بما فى ذلك مفتاح "Enter"، لذا هذا الرقم مطروح منه واحد يعطى طول النص الذى تم ادخاله، مثل الدالة strlen
  4. cin.getline: لكى لا يفصل فى المدخلات اذا كانت تحتوى مسافة، ويرجع عند الضغط على "Enter" (الافتراضى)
  5. ((if(!isdigit(buff[n]) && !(buff[n] == '-' && !n: ينفذ هذا الشرط إذا كان الحرف [buff[n غير رقمى، أو اول حرف وليس سالب، (لامكانية ادخال ارقام سالبة)
  6. n != l: يحدث عند الخروج من الحلقة التكرارية قبل اكتمالها بالامر break مما يعنى انه قابلنا رمز غير رقمى مما يتطلب إعادة الادخال (أى رقم خطاً)

ملحوظة: تم تحديث بسيط فى الكود

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 25 مايو 2007 في 12:35

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#13

برنامج الأخ اسامه أكثر من رائع ..

ان لم تفهمي البرنامج، جربي هذا و ان شاء الله ما تكون فيه أخطاء

#include <iostream.h>
#include <conio.h>
# include<ctype.h>
#define MAX  5

main()
{
char x[256];
int len;
int array[MAX];
int temp;

for(int i=0; i< 5; i++)
{
here:
  cin.getline(x,256);
  len = strlen(x);

  for(int j=0; j<len; j++)
  {
	if(j == 0 && x[j] == '-') 
	{
	  j++;
	  continue;
	}

	if(!isdigit(x[j]))
	{
	  cout<<"please enter a valid number"<<endl;
	  goto here;
	}

  } 
  array = atoi(x);
}

cout<<" ______________________"<<endl;

for(int i=0; i<MAX; i++)
  cout<<array<<endl;

getch();
return 0;
}

تم تعديل هذه المشاركة بواسطة Yousof في 25 مايو 2007 في 16:37

#14
اقتباس
أولاً : لماذا أضفت & مع المتغير X يعني ماذا معنى ذلك ؟

ثانياَ : إذا ادخل المستخدم رقم مكون من جزئين مثل 23 كيف يمكن تجنب هذه المشكلة واعتباره رقم واحد يدخل في أي موقع من مواقع المصفوفة ؟

أولا : إشارة & تعطي المؤشر الذي يؤشر علي المتغير x في الذاكرة فكما تعلم نعطي الدالة (atoi(x متغير من نوع مؤشر والتي يتم تعريفها كالتالي:

cahr *x;

ولكني قمت بتعريف x من نوع حرف (char) لذلك كان يجب ان اعطي الدالة مؤشر هذا المتغير

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

 char x[4];

حيث x هو مؤشر على المصفوفة اذا لا داعي لإستخدام الرمز& معها

الثاني:

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

هناك امر أخر قمت بإستبدال الدالة ()isalpha "لأنها لا تعتبر الرموز مثل + وغيرها أحرف " بالدالة ()isdigit التي تتأكد من أن المتغير المعطى رقم

int a[5],i=0;
char x[4],y;
bool l=0;
cout<<"Enter Valuse Of Array :";
while(i<5)
{
	cin>>x;
	l=0;
	for(int t=0;t<strlen(x);t++)
	{
		y=x[t];
		if(!isdigit(y))
		{   
			l=1;
		}
	}
	if (l==1)
	{   
		cout<<"Input Is letter ........please Is Digit :";
	}
	else
	{
		a=atoi(x);
		i++;
	}

}
for(i=0;i<5;i++)
cout<<a<<endl;

تم تعديل هذه المشاركة بواسطة نيزك في 26 مايو 2007 في 10:15

#15

الأخوة في هذا المنتدى ، اعجز عن الشكر والتقدير لكم على ماقدمتموه لي وبمشاركتكم اثبتم للمنتدى أنكم أهل له .

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

واتمنى قبل أن اختم هذه المشاركة ان يوضح السيد Eng.Usama متى ينفذ الأمر n! ؟

وشكراً لكم مرة أخرى

#16

الأخ الفاضل ...

بالإشارة للمثال السابق ← ... يتم تنفيذ n! عندما تكون قيمة n تساوى صفر، وحيث أن n يشير الى موضع الحرف فى الـ buff، فعندما تكون n تساوى صفر هذا معناه أنه أول حرف، وبالتالى الشرط هو استثناء إذا كان أول رقم رمز سالب '-' وليس رقم فيتم قبوله، وذلك لإتاحة إدخال ارقام سالبة.

أى الكود (buff[n] == '-' && !n) بالضبط مثل (buff[n] == '-' && n==0)

شكراً

تم تعديل هذه المشاركة بواسطة Eng. Usama El-Mokadem في 27 مايو 2007 في 21:58

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

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

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