• 0
khaled_prg

اسأل ونحن نجيبك

سؤال

السلام عليكم

سعيا منا في إعادة نشاط هذا القسم (الذي يشهد هذه الأيام حالة من النوم العميق) قمنا بطرح هذا الموضوع الذي نطمح من خلاله إلى التواصل مع كل من يملك سؤالاً و يريد أن يجد له جواباً شافيا كافياً :)

حتى يكون الموضوع منظم سنضع سوية مجموعة قوانين و وقواعد نلتزم بها حفاظا على موضوعية النقاش :

  • هذا الموضوع ليس لحل الواجبات .. على الإطلاق !
  • إذا كان لديك "تمرين" تود مناقشته معنا فقم بإدراج محاولتك أنت أولا.
  • يُمنع كتابة الأسئلة بغير العربية.
  • لدى إضافتك لأي سؤال تأكد أنه لم يطرح من قبل.
  • قبل أن تضع سؤالك تأكد أنه تمت الإجابة على السؤال السابق.
  • يُمنع إضافة أكثر من سؤال في نفس الوقت.
  • إذا مضت على أحد الأسئلة 3 أيام دون وجود إجابة, سيتم تعليق السؤال إلى إشعار آخر.
  • أي مشاركة تُخالف إحدى هذه القواعد سيتم حذفها دون سابق إنذار و إذا تكررت المخالفة سيتم إنذار العضو.
نبدأ الآن مع أول سؤال, على بركة الله :)


فهرس الأسئلة (قيد التحديث)


تم تعديل بواسطه محمد عودة
أضافة فهرس للمجموعة
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

42 إجابة على هذا السؤال .

  • 0

السلام عليكم

شكرا على المبادرة الجميلة

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

وفقكم الله

تم تعديل بواسطه fouad2008
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحباً أخي :)

كل شي مُتاح في هذا الموضوع :happy:

يمكن لأي عضو أن يقترح مشروع معين نبدأ ببرمجته بشكل جماعي و أنا شخصياً على أتم الإستعداد.

يمكن أيضا أن نفتح موضوع جديد للمشروع المُقترح إن تطلب الأمر ذلك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

..

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

جزآكم الله خيراً .

لدي سؤال

Write a program that calculates and output the four arithmetical operations (addition, subtraction, multiplication and division ) of two integer values given by the user .

 Each operation should be performed in one function; named as the following : add() , subtract(), multiply() and divide()

 Each function should receive two integers as parameter and returns the result of the operation

 The output should be as the following:

Hi, enter two integers: 2 2

The addition: 2+2 = 4

The subtraction: 2-2 = 0

The multiplication: 2*2 = 4

The division: 2/2 = 1

كتابة برنامج يحسب والإخراج العمليات الأربع الحسابية (الجمع والطرح والضرب والقسمة) من قيمتين عدد صحيح نظرا من قبل المستخدم.

• يجب أن يتم تنفيذ كل عملية في وظيفة واحدة؛ اسمه على النحو التالي: إضافة ()، طرح ()، وتتضاعف () وتقسيم ()

• يجب أن يكون لكل وظيفة استقبال اثنين من الأعداد الصحيحة كمعلمة وإرجاع نتيجة العملية

• يجب أن يكون الإخراج على النحو التالي:

جربت وحاولت في البرنامج بس يطلع عندي أخطاء

#include <iostream>  
using namespace std;

int x = 2 ;
int y = 2 ;
int addition (int x , int y )
{
cout << " Hi , enter two integers: " << x << y << endl ;

return x+y ;

}


int subtraction (int x , int y )
{
return x-y ;

}


int multiplication (int x, int y )
{
return x*y ;

}


int division ( int x, int y )
{
return x/y ;


int main ()
{
cout << "The addition: \t " << addition << endl ;
cout << "The subtraction: \t " << subtraction << endl ;
cout << "The multiplication: \t " << multiplication << endl ;
cout << "The division: \t " << division << endl ;

return 0 ;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تصحيح الكود :

#include <iostream>
using namespace std;

int addition(int x, int y) {
return x + y;

}

int subtraction(int x, int y) {
return x - y;
}

int multiplication(int x, int y) {
return x*y;
}

int division(int x, int y) {
if (y != 0) return x / y;
//else ...

}

int main() {
int x, y;
cout << " Hi , enter two integers: " << endl;
cin >> x >> y;
cout << "The addition : " << addition(x, y) << endl;
cout << "The subtraction : " << subtraction(x, y) << endl;
cout << "The multiplication : " << multiplication(x, y) << endl;
cout << "The division : " << division(x, y) << endl;
return 0;
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تصحيح الكود :

#include <iostream>
using namespace std;

int addition(int x, int y) {
return x + y;

}

int subtraction(int x, int y) {
return x - y;
}

int multiplication(int x, int y) {
return x*y;
}

int division(int x, int y) {
if (y != 0) return x / y;
//else ...

}

int main() {
int x, y;
cout << " Hi , enter two integers: " << endl;
cin >> x >> y;
cout << "The addition : " << addition(x, y) << endl;
cout << "The subtraction : " << subtraction(x, y) << endl;
cout << "The multiplication : " << multiplication(x, y) << endl;
cout << "The division : " << division(x, y) << endl;
return 0;
}

((1/ لسى ممآ أخذنآ آلـ if رآح أحل في هالسؤال عن طريق function call <???

." 2/ مو هو حآط قيمه الـ X و Y ثابت اللي هو 2 ؟؟؟

<< نفس الـ output !!!!!!!!!!!!!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أختي الفاضلة, أرى أنه من الأفضل لو كتبتِ بالفصحى لأن قوانين القسم تطلب ذلك, أيضا أنا لا أفهم جيدا ما تكتبينه باللهجة :)

((1/ لسى ممآ أخذنآ آلـ if رآح أحل في هالسؤال عن طريق function call <???

درستم الدوال قبل الــ if-else ؟ :blink:

طيب, لا مشكلة ! :)

احذفي الــ if الموجودة و لكن إذا تم تمرير الوسيط الثاني بقيمة معدومة ستحدث كوارث .. :D

." 2/ مو هو حآط قيمه الـ X و Y ثابت اللي هو 2 ؟؟؟

لا ! المستخدم سيُدخل عددين صحيحن (مهما كانا) و البرنامج يحسب العمليات الأربعة.

<< نفس الـ output !!!!!!!!!!!!!!

نفس الـ output في ماذا ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أختي الفاضلة, أرى أنه من الأفضل لو كتبتِ بالفصحى لأن قوانين القسم تطلب ذلك, أيضا أنا لا أفهم جيدا ما تكتبينه باللهجة :)

درستم الدوال قبل الــ if-else ؟ :blink:

طيب, لا مشكلة ! :)

احذفي الــ if الموجودة و لكن إذا تم تمرير الوسيط الثاني بقيمة معدومة ستحدث كوارث .. :D

لا ! المستخدم سيُدخل عددين صحيحن (مهما كانا) و البرنامج يحسب العمليات الأربعة.

نفس الـ output في ماذا ؟

"

نعم لم نأخذ الـ if ’

..

أقصد أن السؤال يطلب أن الـ x=2 , y=2

أي يُصبح الـ output كما هو يلي ::

Hi, enter two integers: 2 2

The addition: 2+2 = 4

The subtraction: 2-2 = 0

The multiplication: 2*2 = 4

The division: 2/2 = 1

"

أي أن لم يطلب من اليوزر الإدخال بل هو قيمه ثابته , ؟؟؟

فهل يمكنني هنا تعريف الـ x , y كـ globle ....؟؟؟؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فهل يمكنني هنا تعريف الـ x , y كـ globle ؟

نعم يُمكن :)

و لكن لا داعي لتعريف المتغيرات في "المنطقة العامة" لأن الدوال الموجودة تستقبل نسخ من القيم و ليس القيم نفسها و بالتالي لا يوجد فرق بين الــ global و الــ local في هذه الحالة.

المتغيرات العامة تُستخدم عندما توجد عدة دوال تعمل على نفس المتغير, بمعنى أن الدالة الأولى تأخذ قيمة المتغير و تعيد قيمة ثانية, الدالة الثانية ستأخذ القيمة الثانية و تغيرها و هكذا .. و بالتالي المتغير العام قابل للقراءة و الكتابة من طرف كافة الدوال الموجودة.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم يُمكن :)

و لكن لا داعي لتعريف المتغيرات في "المنطقة العامة" لأن الدوال الموجودة تستقبل نسخ من القيم و ليس القيم نفسها و بالتالي لا يوجد فرق بين الــ global و الــ local في هذه الحالة.

المتغيرات العامة تُستخدم عندما توجد عدة دوال تعمل على نفس المتغير, بمعنى أن الدالة الأولى تأخذ قيمة المتغير و تعيد قيمة ثانية, الدالة الثانية ستأخذ القيمة الثانية و تغيرها و هكذا .. و بالتالي المتغير العام قابل للقراءة و الكتابة من طرف كافة الدوال الموجودة.

"

سلممت أخي ’

وجزيت الجنه والسعآده ّ

شآكره لك ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا شكر على واجب :)

في الخدمة دائما :happy:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

خطأ في Chaînes de caractères

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

السلام عليكم ورحمة الله تعالى وبركاته ، أريد أن أعرف أين يتواجد الخطأ في هذا السورس كود ، علما أني أظن أن الكود صحيح نسبيا ، عندما أنفذ البرنامج يقع crash ، لماذا ؟؟؟

  #include <stdio.h>
#include <conio.h>
int main(){

char *Nom[4];
int i;
scanf("%s %s %s %s",&Nom[0],&Nom[1],&Nom[2],&Nom[3]);
for(i = 0; i < 4 ; i++){
printf("\nVotre nom est : %s\n",Nom[i]);
}
getch();
return 0;
}

ويقع نفس الخطأ في الكود التالي :

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

int max;

int main(){
struct stagiaire
{
int mat;
int age;
char nom[10];
char prenom[10];
char addresse[10];
}stg[max];

printf("\n\n\t Entrer le nombre des stagiaires : ");
scanf("%d",&max);
int n = 0, j = 0;
do{
system("cls");
printf("\n\n\t\t Stagiaire N %d ",n+1);
printf("\n\n\t Matricule : ");
scanf("%d",&stg[n].mat);
printf("\n\t Nom : ");
scanf("%s",&stg[n].nom);
printf("\n\t Prenom : ");
scanf("%s",&stg[n].prenom);
printf("\n\t Age : ");
scanf("%d",&stg[n].age);
printf("\n\t Addresse : ");
scanf("%s",&stg[n].addresse);
n++;
}while(n!=max);
printf("\n\n\t\t\t*********** Affichage ****************\n\n");
printf("Mat\tNom\t\tPrenom\t\tAge\t\tAddresse\n\n");
do{
printf("%d\t%s\t\t%s\t\t%d\t\t%s\n",
stg[j].mat,stg[j].nom,stg[j].prenom,
stg[j].age,stg[j].addresse);
j++;
}while(j!=max);

system("pause");

return 0;
}

هل هناك طريقة للتعامل مع المصفوفات الحرفية التي تحوي العديد من العناصر بدون حدوث هذا الخطأ ؟؟؟؟

تم تعديل بواسطه Hamza+C+ASM
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السي غير مرنة في التعامل مع الــ Strings, معظم لغات البرمجة حاليا (C++, Java, Python, ..) تُوفر كائنات خاصة للتعامل مع النصوص لأن التعامل مع هذه الأخيرة بالطريقة التقليدية سيكون مملاً جدا ..

خطأك يكمن في عدم تهيئة مصفوفة المؤشرات التي استخدمتها, انظر :

#include <stdio.h>

int main() {

char *name[] = {"Perlis",
"Wilkes",
"Hamming",
"Minsky",};
for (int i = 0; i < 4; i++)
printf("Votre nom est : %s\n", name[i]);
return 0;
}

لكن تبقى الطريقة الأفضل هي تصفير الذاكرة باستخدام memset التي تستقبل ثلاث معاملات, المعامل الأول هو المؤشر الذي نريد الكتابة عليه و المعامل الثاني هو القيمة المراد وضعها بداخل الخانة التي يشير إليها المؤشر و المعامل الثالث هو عدد البايتات أو كمية البيانات المُؤشر عليها انظر المثال:

char* ptr = malloc(sizeof (char));
if (ptr != NULL) {
memset(ptr, 0x00, sizeof (char));

free(ptr);
}

في السي++, سيكون الأمر بسيطا جداً, انظر :

#include <iostream>
using namespace std;

int main() {
string name[4];
cin>>name[0]>>name[1]>>name[2]>>name[3];
for (int i = 0; i < 4; i++)
cout<<"Votre nom est : "<<name[i]<<endl;
return 0;
}

و في الجافا يكون الأمر أسهل :

import java.util.Scanner;

public class stringTest {

public static void main(String[] args) {
String[] name = new String[4];
Scanner scr = new Scanner(System.in);
for (int i = 0; i < 4; i++) {
name[i] = scr.nextLine();
}
for (int i = 0; i < 4; i++) {
System.out.println("String N°"+i+" = "+name[i]);
}
}
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل من مثال توضيحي أخي خالد ؟ المشكلة تكمن في أن الأمور اختلطت علي فسابقا كنت أتعامل مع المصفوفات بشكل عادي ، لكن البارحة أراد مني أحد أصدقائي أن أساعده في أحد البرامج التي تستخدم المصفوفات ، فحين بدأنا كان الأمر عاديا ، فما إن وصلنا إلى هذا الجزء حتى واجهتنا المشاكل ، فقمت بتجريب العديد من الطرق لكن بدون جدوى ، إضافة إلى أنني أجد أن هذا الحل ترقيعي بشكل كبير . لا أظن أن المصفوفات الحرفية تقف عند هذا الحد wacko.gif

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المشكلة ليست في المصفوفات الحرفية بل في مرونة اللغة نفسها ! :)

إذا كنت تُريد التعامل مع النصوص اعتمادا على نوع بدائي مثل char فسيكون الأمر مُرهقاً و بالتالي تجد أن أغلب لغات البرمجة (الكائنية التوجه) تحوي فئات خاصة بالتعامل مع النصوص و مُعظمها يدعم ترميز الــ Unicode أيضا. (يمكنك كتابة النصوص بالعربية مثلا)

للعلم, بإمكانك إنجاز ما تُريد فعله بالنصوص مع السي++ في نصف الوقت الذي ستقضيه في السي. , C++ تتفوق على C في هذه النقطة من ناحية المرونة, السرعة و البساطة أبضاً.

فعلى سبيل المثال, مشكلة الــ OverFlow لا تزال مطروحة بشكل كبير في لغة السي أما في السي++ فيمكنك تخطي عقبة الفيض باستخدام الفئة string.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحباً إخوتي

يُسعدني انضمامكم إلى النقاش التالي :

3 أسباب تجعلني أشك في لغة السي !

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل هناك طريقة للتعامل مع المصفوفات الحرفية التي تحوي العديد من العناصر بدون حدوث هذا الخطأ ؟؟؟؟

مرحبا حمزة

أظنك تملك من الخبرة ما يوضح لك ان *char هو عنوان اول حرف فى مصفوفة حرفية من بعد واحد

اذا فى مثالك يجب ان تجعل كل عنصر فى مصفوفتك (مصفوفة من الحروف)

ثم تحجز لها مكان فى الذاكرة

وهذه الاخيرة هى ما فاتك فى الموضوع

باختصار الكود التالى يحل المشكلة



#include <stdio.h>
#include <conio.h>

int main(){

char Nom[4][50];
scanf("%s %s %s %s",Nom[0],Nom[1],Nom[2],Nom[3]);
int i;
for(i = 0; i < 4; ++i){
printf("\nVotre nom est : %s\n",Nom[i]);
}

getch();
return 0;
}


هنا الحجز داخل التعريف declaration

او ان تحجز مساحة لكل عنصر باستخدام malloc او calloc


for(i = 0; i < 4; ++i){
Nom[i] = (char*) malloc(sizeof(char) * 50);
}

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

المشكلة ليست في المصفوفات الحرفية بل في مرونة اللغة نفسها !

مع خبرتى القليلة مع Java أعشق ++C/C وأرى انهما اكثر مرونة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مع خبرتى القليلة مع Java أعشق ++C/C وأرى انهما اكثر مرونة

السي++ أفضل بكثير من الجافا في التعامل مع النصوص لأن كلتاهما تحتوي على الصنف string و تزيد السي++ بقوة المؤشرات التي لا تدعمها الجافا بشكل مباشر.

أما السي فهي أكثر مرونة من الجافا من حيث "القدرات" و ليس من حيث "وفرة الخدمات" !

هل يمكنك كتابة ما يُكافئ المثال التالي بلغة السي القياسية :

import java.util.Scanner;

public class javaString {

public static void main(String[] agrs) {
String str = new String();
Scanner scr = new Scanner(System.in);
System.out.println("Your Sting : ");
str = scr.nextLine();
System.out.println("Size = " + str.length());
}
}

هذا مثال على المُخرجات :

post-225348-024096000 1350490419_thumb.p

كيف ستحل مشكلة الــ OverFlow علماً أن طول النص الذي سيُدخله المستخدم غير مُحدد مُسبقا !

الحلول المقترحة بالسي ستكون مُعقدة جدا مقارنة مع المثال البسيط المكتوب بالجافا.

في السي++, يُمكننا حل مشكلة الــ OverFlow باستخدام الدالة sync التابعة لفئة الإدخال, هكذا :

bool isOver()
{
return cin.sync() != 0;
}

و بالتالي يُمكننا تنظيف الــ buffer من المُدخلات العالقة إذا كان طول السلسلة المُدخلة أطول من SIZE_MAX هكذا :

while (isOver()) {
cout << "Le nom doit etre de longueur <= " << SIZE_MAX;
cin.clear();
cin.sync();
cin.getline(name, SIZE_MAX + 1, '\n');
}

يُمكننا أيضا بطريقة مُشابهة تنظيف الــ buffer بلغة السي, هكذا :

void clean_stdin(void) {
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}

لكن كيف نعرف أن الفيض قد حدث حتى نستدعي الدالة clean ؟ :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل يمكنك كتابة ما يُكافئ المثال التالي بلغة السي القياسية :

هل تريد ان تقول ان هذا الذى كتبته أفضل من الكود التالى ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟



#include <stdio.h>
#include <cstring>

int main() {
char name[100];
printf("\nYour Name : ");
gets(name);
printf("\nYou Entered : %s \nSize : %d \n", name, strlen(name));
return 0;
}



من أى وجه هو أفضل ؟ الاداء ام استهلاك الموارد ام حجم الكود ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أنت لم تضع حلاً (في الكود الذي كتبتَه) لمشكلة الــ OverFlow :)

هل يُمكنك إدخال نص مثل الذي أدخلتُه أنا بالأعلى دون أن تُغير حجم المصفوفة ؟

.. مستحيل ! و إلا فستحدث كوارث عند تنفيذ البرنامج.

مُلاحظة : cstring تستخدمها سي++, في السي نستخدم المكتبة string.h

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هل يُمكنك إدخال نص مثل الذي أدخلتُه أنا بالأعلى دون أن تُغير حجم المصفوفة ؟

.. مستحيل ! و إلا فستحدث كوارث عند تنفيذ البرنامج.

ومن قال لك ان Java لا تغير حجم المصفوفة ؟ كل ما فى الامر انها أخفت عنك هذه الخطوة التى ربما تتكرر اكثر من مرة وهذه هى الكارثة الحقيقية :)

الفئة String فى Java هى immutable وتبدأ بمصفوفة حرفية ثابتة final بطول 0 حرف


/**
* Allocates a new {@code String} so that it represents the sequence of
* characters currently contained in the character array argument. The
* contents of the character array are copied; subsequent modification of
* the character array does not affect the newly created string.
*
* @param value
* The initial value of the string
*/
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}

وهذا هو ال constructor الذى يتم استدعاؤه فى مثالك فى الخطوة الثانية

لاحظ النص الموجود فى بداية التعليق

Allocates a new

اى انها تعيد خطوة حجز الذاكرة

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

realloc

#include <cstdlib>

void *realloc(void *ptr, size_t size);

The realloc( ) function changes the size of the previously allocated memory pointed

to by ptr to that specified by size. The value of size may be greater or less than the original.

A pointer to the memory block is returned because it may be necessary for realloc( ) to

move the block in order to increase its size. If this occurs, the contents of the old block

are copied into the new block—no information is lost.

If ptr is null, realloc( ) simply allocates size bytes of memory and returns a pointer

to it. If size is zero, the memory pointed to by ptr is freed.

If there is not enough free memory in the heap to allocate size bytes, a null pointer

is returned, and the original block is left unchanged.

Related functions are free( ), malloc( ), and calloc( ).

هل حاولت كتابة فئة string خاصة بك فى ++C ؟

.

تم تعديل بواسطه MOHAMED FATHEI
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ومن قال لك ان Java لا تغير حجم المصفوفة ؟ كل ما فى الامر انها أخفت عنك هذه الخطوة التى ربما تتكرر اكثر من مرة وهذه هى الكارثة الحقيقية

جافا تُغير حجم المصوفة بشكل ديناميكي (أثناء تنفيذ البرنامج) و هذا جيد جداً ما دام الــ Garbage Collector موجود :)

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

و كيف ستسقبل المُدخلات ؟

هل ستقوم بحجز مصفوفة ديناميكية كبيرة باستخدام malloc مثلاً ثم تُعيد الحجز بــ realloc ؟

هل حاولت كتابة فئة string خاصة بك فى ++C ؟

لدي عدة مُحاولات لكن لم أصل بعد إلى محاكاة الشكل الحقيقي للفئة string.

و أنت ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

يمكن كتابة المثال الذي قدمته بتغير حجم المصفوفة دينامكيا أثناء تنفيد البرنامج :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * string_in()
{
char c = 0;
char * tmp_str = NULL;
char * tmp = NULL;
int size = 1;

while((c = getchar()) != '\n')
{
size++;
tmp = (char *) realloc(tmp_str, sizeof(char) * size);
if(tmp != NULL)
{
tmp_str = tmp;
}
else{
free(tmp_str);
exit(0);
}
tmp_str[size - 2] = c;
}
if(!(tmp_str == NULL))
{
tmp_str[size - 1] = '\0';
}
return tmp_str;
}

int main(int argc, char ** argv)
{
char * str = NULL;
printf("Your text :\n");

str = string_in();

printf("Size = %d \n", strlen(str));
free(str);
return 0;
}

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مرحباً أخي biginner2000 :)

+1

تُعجبني شجاعتك :cool:

.. لأنك تُفضل دائما أنت تحل الأمور باستخدام "المؤشرات" و هذا شيء ممتاز لكن له تكاليفه أيضا إن لم نُحسن التعامل :)

عموماً, الكود جميل جداً و متعوب عليه أيضا, بارك الله فيك.

ما أردتَ لفت الإنتباه إليه هو أنه لا توجد فئة (أو لنقل بنية) مُخصصة للتعامل مع النصوص في لغة السي و بالتالي الحل الوحيد سيكون باستخدام المؤشرات و هذا سيكون متعب شيئا ما لأنه في كل مرة ستحتاج إلى محاكاة دالة جديدة (تجدها جاهزة في اللغات الأخرى).

بانتظار سؤال أو نقاش جديد.

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هذه محاولتي

#include <stdio.h>
#include <stdlib.h>
#define MAX 100
void realloc_s(char **,size_t);

int main(void)
{
size_t n=0,i=1;
char *nom=(char*) malloc(MAX*sizeof(char));
if(!nom)
{
puts("No memory !!");
exit(EXIT_FAILURE);
}

while((nom[n++]=fgetc(stdin))!='\n')
if(n==(i*MAX))
realloc_s(&nom,(i++)*MAX);

nom[n]='\0';
printf("\n\n\nsize of text : %u\n\n\ntext : %s",n-1,nom);
free(nom);

return 0;
}

void realloc_s(char **p,size_t size)

{
char *d=(char*)realloc(*p,size*sizeof(char));
if(d) *p=d;
else
{
puts("no memory !!");
free(*p);
*p=0;
exit(EXIT_FAILURE);
}
return;
}

u9LN1.jpg

نفس فكرة الأخ biginner2000 لكن عوض أن نعيد عملية الحجز في كل مرة أدخلنا فيها حرفا واحدا وهذا ما قد يبطئ من أداء البرنامج

لأنه إذا ما أدخلنا 150 حرف مثلا ستتكرر عملية إعادة الحجز 150 مرة mellow.gif . سنكرر هذه العملية (عملية إعادة الحجز)

كل 100 حرف مثلا أو عدد الأحرف التي تريدها أنت وهكذا سنقلل نوعا ما من تكرار هذه العملية .

ما أردتَ لفت الإنتباه إليه هو أنه لا توجد فئة (أو لنقل بنية) مُخصصة للتعامل مع النصوص في لغة السي و بالتالي الحل الوحيد سيكون باستخدام المؤشرات و هذا سيكون متعب شيئا ما لأنه في كل مرة ستحتاج إلى محاكاة دالة جديدة (تجدها جاهزة في اللغات الأخرى).

بانتظار سؤال أو نقاش جديد.

صحيح ما قلته أخي خالد

فحتى لو تلاعبنا بالمؤشرات و الحجز الديناميكي من أجل محاكاة الفئة string الموجودة في c++ فلن تكون النتيجة صحيحة 100/100 و سنواجه العديد من أخطاء الذاكرة

أما لو استعملنا دوال الإدخال (scanf, gets,fgets..) فحتما سيكون ال buffer overflow سيد الموقف

وهذه واحدة من سلبيات العجوز السي wink.gif

تم تعديل بواسطه مومو (momo)
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

تحدثتُ في الموضوع التالي عن إيجابيات و سلبيات الــ Garbage Collector (أرجو لكم قراءة ممتعة :happy:)

الــ GC بين حرية الماضي و قيود الحاضر !

تم تعديل بواسطه khaled_prg
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .