السلام عليكــم ورحمـة الله وبركاتــه
عندي استفسار لمن عنده وقت طويل في C
هل هناك مكتبة قياسية في C تسمح باستقبال "محرف وحيد" من الدخل في console دون echo على الشاشة؟
getch() تفعل لكنها في مكتبة ليست قياسية وهذا ما أحاول تجنب استخدامه.
شكراً سلفاً.
السلام عليكــم ورحمـة الله وبركاتــه
عندي استفسار لمن عنده وقت طويل في C
هل هناك مكتبة قياسية في C تسمح باستقبال "محرف وحيد" من الدخل في console دون echo على الشاشة؟
getch() تفعل لكنها في مكتبة ليست قياسية وهذا ما أحاول تجنب استخدامه.
شكراً سلفاً.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
وعليكــم السـلام ورحمة الله وبركاتـه..
للأسف لا سي|سي++ القياسيه تحتوي على داله كهذه (ودوال المكتبه conio.h) ،، وانما هي مكتبه من صنع بورلاند قديما .. على العموم الكثير من المترجمات تدعم هذه المكتبه conio.h كتوافق مع البرامج التي تستخدم هذه المكتبه ،، المترجم g++|gcc يدعمها بلا مشاكل ،
وحتى فيجول سي++ يدعمها أيضا : _getch, _getwch .
بالتوفيق :) .
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science
السلام عليكم ,,
اعذرني X و لكن لماذا تريد مثل هذه الدالة ؟ ( إذا كانت لصنع قائمة بسيطة فلا تجبني على سؤالي :lol: )
عموماً هناك سؤال يطرح نفسه, هل تؤثر هذه الدالة على الـ buffer الخاص بالـ streams او stdio في C, و إن كانت تؤثر فما هو تأثيرها ؟
اقتباسgetchar أو getc
أخ فهد هذه تقوم بالسحب من الـ buffer الخاص بـ cin, أما دالة borland فإنها تقوم بعمل system call فوراً في انتظار الحرف :)
تحياتي ,,
عند عمل جدول مثلا سعر و عدد و مجموع
بحيث عند الانتقال اضغط tab
هناك طريقتين اعرفها بالسي بلس بلس احتاج كتابه ومسح مستمر
وبهذه الداله getch نفذ مباشرتا
مثال:
شكرا أخ وجدي، نعم أعلم أنها مدعومة من قبل العديد من المترجمات، الفكرة أني أحاول تفاديها حتى لا أقوم بتضمين ملف مكتبة خارجي مع ملف المشروع الاساسي *.cpp لأنه وظيفة ولا أستطيع تجاوز الخطوط الحمراء بسهولة :lol:
اقتباستستطيع استخدام getchar أو getc لكن ليست مثل getch فهي لا تنهي إلا بالضغط على انتر.
وهذا ما لا أريده كما ذكرت من قبل بكلمة وحيد ودون echo.
اقتباساعذرني X و لكن لماذا تريد مثل هذه الدالة ؟
حتى أقوم بالتحقق من قيم المصفوفة التي تكلمنا عنها دون إخراجها على الشاشة قبل التحقق من أنها ضمن مجال محدد [1-4] فقط، أيضاً يصبح من السهل حينها التحكم بالنقر على أي زر آخر كـ return أو backspace.
اقتباسهل تؤثر هذه الدالة على الـ buffer الخاص بالـ streams او stdio في C
لا أعتقد أنك تتكلم عن getch لأنك كما ذكرت هي دالة unbuffered، فأي دالة تقصد؟
----------
المختصر المفيد:
عندي متاهة ممثلة بمصفوفة ثنائية البعد يجب إدخال قيم الخلايا فيها من قبل المستخدم فبفرض أبعادها 10×10 سيتوجب إدخال 100 قيمة بالإضافة إلى نقر Enter 100 مرة وأثناءها يجب التحقق من القيمة المدخلة فإن كانت خارج المجال المسموح به للقيم يجب طلبها مرة أخرى وهكذا، عمل سئ :P
فضلت أن أقوم بأخذ القيمة وفحصها ثم إخراجها على الشاشة قبل أن يتابع في إدخال بقية القيم بحيث أسمح له بأن يقوم بإدخال القيم بشكل سلسلة أرقام تظهر في سطر مباشرة على الشاشة أثناء الإدخال بدلاً من طلبها حسب السطر والعمود والنقر على زر Enter ينقله للسطر الثاني منها فقط عندما يصبح طول السلسلة مساوي للعرض المحدد 10.
إن كان هناك اقتراحات أخرى أرجو التفضل بذكرها.
شكراً :)
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
بكل بساطة عزيزي X
لمادا لا تضيف المصفوفة على شكل ملف نصي و تجعل البرنامج يقرئها مباشرة من الملف
و هكدا تريح المستعمل من كتابة المعلومات كل مرة و كدلك يستطيع تصميم المصفوفة
مباشرة في الملف
ملاحظة اظن ان هده الطريقة احسن لكن ربما سوف يعتقد الاستاد انك سرقت الكود :lol:
شيئ من هدا القبيل
char buffer[100], cut1[9], cut2[9], copy[100];
int i = 0;
FILE *fd;
if ((fd = fopen (config_file, "r")) == NULL)
{
printf ("No config file found: using default configs\n");
}
while (fgets (buffer, 100, fd) != NULL)
{
strncpy (cut1, buffer, 8);
strncpy (cut2, cut1, 8);
if (cut1[0] == '#')
{
i = 0;
}
else if (cut1[0] == 'N' && cut1[1] == 'E') // this is the line NETWORK_SIZE
{
i = 12;
while (buffer != '=')
{
i++;
}
// advance the pointer one bit after '='
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
NETWORK_SIZE = atoi (copy);
}
else if (cut1[0] == 'S' && cut1[6] == 'X')
{
i = 13;
while (buffer != '=')
{
i++;
}
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
START_X_COORD = atoi (copy);
}
else if (cut1[0] == 'S' && cut1[6] == 'Y')
{
i = 13;
while (buffer != '=')
{
i++;
}
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
START_Y_COORD = atoi (copy);
}
else if (cut1[0] == 'S' && cut1[6] == 'N')
{
i = 22;
while (buffer != '=')
{
i++;
}
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
STARTING_BATTERY_POWER = atoi (copy);
}
else if (cut1[0] == 'C')
{
i = 8;
while (buffer != '=')
{
i++;
}
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
CH_RATIO = atof (copy);
}
else if (cut1[0] == 'T')
{
i = 12;
while (buffer != '=')
{
i++;
}
i++;
while (buffer == ' ')
{
i++;
}
strcpy (copy, buffer + i);
TOTAL_ROUNDS = atoi (copy);
}
}
if (fclose (fd) != 0)
{
printf ("\n Closing Problem \n");
exit (1);
}نسخته لك مباشرة من كود قديم :lol:
العمل كثير و الوقت قليل أعاننا الله
في الواقع فكرة أن أقوم بحفظ قيم المتاهة (كمصفوفة ثنائية البعد) في ملف أمر مثير للاهتمام ومعقول خصوصاً أنه بالإمكان إضافة خاصة للبرنامج تجعله يقوم بقراءة templates تم إعدادها مسبقاً لهذا الغرض بدلاً من عملية الإدخال اليدوية التي قد تكون مملة جداً...
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
بالفعل الأدخال من الملف أفضل لتلك الحاله ،، ويمكنك أن تقرأ البيانات من الملف بدون تغيير في البرنامج ،، فقط أستخدم خاصيه الre-direction والتي بامكانها قرائه محتويات الملف وتضعها في الbuffer وعندما يبدأ برنامجك سوف يقرأ منها ،،
لكي تستخدمها من سطر الأوامر :
demo.exe < input.txt
demo هو اسم برنامجك ، input.txt هو اسم الملف الذي يحتوي على المدخلات ،،
بنفس الفكره لو أردت المخرج في ملف بدلا من طباعتها في الشاشه ،، حول المخرج لملف أخر :
demo.exe < input.txt > output.txt
بالتوفيق :) .
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science