Khaled Alshaya

هل لديك طريقة لتحويل حرف من Upper إلى Lower ؟

36 ردود في هذا الموضوع

السلام عليكم ,,

السؤال واضح من عنوانه, نريد تحويل حرف من Upper Case to Lower Case,

تصور أن لدينا المتغير التالي من نوع char :

char A = 'A';

نريد طريقة برمجية بلغة ++C لتحويل الحرف 'A' إلى 'a' !!

هذا هو المطلوب فقط,

ضع حلك في الموضوع و لنتناقش حوله,

بعد أن ينتهي الأخوة من وضع الحلول, سأضع طريقتي :)

و صدقوني أؤكد لكم أنكم لم تروها من قبل :P

تحياتي ,,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


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

السلام عليكم :

التحويل باستخدام الدالة:

[size=4]char A = 'A' ;
A=tolower(A) ; // from head <cctype>
cout<<A<<endl;[/size]

0

شارك هذا الرد


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

السلام عليكم ,,

حسناً سنعتبر إجابة الأخ فهد هي الإجابة رقم 1,

رغم أني كنت أريد طريقة دون استخدام دوال جاهزة, و لكن لابأس فأنا لم أحدد في السؤال,

تحياتي ,,

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


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

الحل هو عن طريق ترميز ASCI Code

لو نلاحظ ان الحرف A يمثل الرقم 65

إذا الحروف من A إلى Z تمتد من 65 إلى 90

والحروف من a إلى z من 97 إلى 122

فالفرق بين a و A هو 32

فالتحويل من a إلى A هو قيمة a وهي 97 ناقص 32 وسيعطي الناتج التالي 65 وهو عباره عن A كما هو موضح

#include <iostream>

using namespace std;

int main(void) {
char small;

cout << "Enter a small letter: ";
cin >> small;

cout << "Capital letter is: " << (char)(small - 32) << endl;

return 0;
}

دمتم في رعاية الله

0

شارك هذا الرد


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

السلام عليكم ,,

محاولة طيبة أخي Robatic ,,

في الحقيقة هذه هي الطريقة القياسية في التحويل, أعتقد أن الدالة التي عرضها الأخ فهد تستخدم هذه الطريقة,

و لكن ما رأيكم أن لدي طريقة أخرى :lol:

سأنتظر الحلول ثم سأعرضها إذا فقدتم الأمل :P

0

شارك هذا الرد


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

السلام عليكم لدي طريقه جميله اخذتها من هذا الموضوع:البتات

char(A^32)

الجميل في هذه الطريقه انه اذا كان كبير يرجع صغير والعكس صحيح.

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

شارك هذا الرد


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

السلام عليكم ,,

جميل أخ فهد,

أول مرة أعرف هذه الطريقة, واستخدام الـ Modular Addition أجمل B)

هذه هي الطريقة الثانية التي يعرضها الأخ فهد, بعد قليل سوف أعرض طريقتي,

تحياتي ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
char low2(char a)
{
if (a>='A' && a<='Z')
{
return a+('a'-'A');
}
return a;
}

0

شارك هذا الرد


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

الطريقة التي أقترحها هي كالتالي,

لو نظرنا لقيمة الحرف 'A' و قيمة الحرف 'a' في نظام ASCII و لكن هذه المرة بالنظام الثنائي :

A = 01000001

a = 01100001

إذا كنت شديد الملاحظة, ستلاحظ أن العددين متطابقين باستثناء الـ Bit السادس, و ذلك هو الحال بالنسبة لبقية الأحرف,

الأحرف الصغير و الكبيرة متطابقة باستثناء الـ Bit السادس, فهو في الأحرف الصغيرة دائماً يساوي 1, بينما في الأحرف الكبيرة يساوي 0.

حسناً ما علينا فعله لتحويل حرف كبير لحرف صغير هو كتابة التالي :

char a = 'A' | 0x20;

و بالطبع لتحويل حرف صغير لحرف كبير :

char A = 'a' & ~(0x20);

هذا كل ما لدي و عذراً على التقصير,

تحياتي ,,

======================

عذراً عندما وضعت هذا الرد لم يكن رد الأخ محمد موجوداً,

بالنسبة للطريقة التي عرضتها أخ محمد فهي صحيحة أيضاًَ, و يمكن اعتبارها الحل رقم 4 B)

بالنسبة لطريقتي فأنا أرضى بالمركز الخامس :lol:

تم تعديل بواسطه Khaled.Alshaya
تعليق على مشاركة الأخ محمد
0

شارك هذا الرد


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

أجمل شئ في السي توفرعدة طرق لحل مشكله.

شكرا لك خالد على هذا السؤال الجميل

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

بالتوفيق ..ان شاء الله.

0

شارك هذا الرد


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

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

هنا دالة الupper الى الlower ..

void upper_to_lower()
{
int i,j;
char c4[80],c3;
for (i=0;(c3=getchar())!=EOF;i++)
c4[i]=(c3>='A' && c3<='Z')?('a' + c3 -'A'):c3;
printf("
The lower case equivalent is ");
for (j=0;j<i;j++)
putchar(c4[j]);
return;
}

هنا العكس ..

 void lower_to_upper()
{
int i,j;
char c2[80],c1;
for (i=0;(c1=getchar())!=EOF;i++)
c2[i]=(c1>='a' && c1<='z')?('A' + c1 -'a'):c1;
printf("
The upper case equivalent is ");
for (j=0;j<i;j++)
putchar(c2[j]);
return;
}

تحياتي العطرة ..

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

مهلا مهلا يا دكتور خالد ...

ما تفسير هذا الكود :

char a = 'A' | 0x20;

المقصد هو 0x20 ماذا يعني ؟؟!

وشكرا لك ..

يعطيك العافية

تحيااااتي

0

شارك هذا الرد


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

المقصد هو 0x20 ماذا يعني ؟؟!

يعني قيمه 20H ،

أي 20 في النظام السادس عشر Hex .

وفعلا طريقه خالد هي أسهل أطريقه ....

وعلى حسن حظك أنك وضعت الجواب بسرعه والا لكنت فاجئتك بالحل :) :) .

حيث هي معروفه وخاصه لمن كتب برنامج لنفس الغرض بلغه الأسمبلي .

0

شارك هذا الرد


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

خدعه جميله :clapping:

ولكنها ليست طريقه جديده لأنك عندما تقوم بعمل (AND) مع القيمه 20H فإنها نفس عملية جمع 32 D إلى قيمة الحرف , === الطريقة الثانية . :P

:thumb_up:

0

شارك هذا الرد


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

هي الخدعة جميلة .. ولكنها مشابهه للكود الذي وضعه فهد ..

يعني 20H هي 32 بالنظام الهيكس ..

فنجد ان الطريقة متشابهه نوعا ..

صح يا خالد ؟؟

0

شارك هذا الرد


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

ولكنها ليست طريقه جديده لأنك عندما تقوم بعمل (AND) مع القيمه 20H فإنها نفس عملية جمع 32 D إلى قيمة الحرف , === الطريقة الثانية . :P

:thumb_up:

لا طبعا ليست نفسها هناك فرق كبير

الـ AND تؤثر على البت السادسة فقط مهما كانت قيمة العدد

أما جمع 32 فسيؤثر على البت السادسة وما بعدها على حسب قيمة العدد الآخر

طبعا في حالتنا هذه لن يكون هناك فرق لكن لا يمكن أن نقول أن AND مع 0x20 هي نفسها جمع 32

0

شارك هذا الرد


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

السلام عليكم أعتقد ان الطريقتين مختلفة:

الطريقه التي كتبهتا اخذتها من درس البتات لخالد:

والى يعتمد على فكرة من افكار التشفير

حيث ان الفرق ثابت بين الحروف الكبيرة والصغيرة نستطيع التحويل مباشرتا:

فنستطيع جعل a A والعكس صحيح لان الفرق بينهم 32.


int a=31;
int b=10;
int u=a-b;
cout<<(a^u)<<endl;
cout<<(b^u)<<endl;
int d=11;
int g=3;
int j=11-3;
cout<<(d^j)<<endl;
cout<<(g^j)<<endl;
return 0;

0

شارك هذا الرد


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

ماذا يحدث فى حاله اللغات الأخرى كالفرنسيه و الألمانيه و باقى مشتقات اللغه الاتينيه ؟؟

0

شارك هذا الرد


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

ماذا يحدث فى حاله اللغات الأخرى كالفرنسيه و الألمانيه و باقى مشتقات اللغه الاتينيه ؟؟

اللغة الانجليزية فقط إما ASCII أو utf8, و هذا hack من أيام تصميم ترميز ASCII و ليس طريقة جيدة في الحقيقة :lol:

إذا أردت تطبيق هذا الشيء على utf16 فيجب عليك الأخذ في عين الاعتبار الـ Endianess أو اقرأ BOM إذا كنت تقرأ من ملف على Windows ...

تحياتي ..

تم تعديل بواسطه Khaled.Alshaya
0

شارك هذا الرد


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

توجد دالة جاهزة في المكتبة ctype.h وظيفتها تعمل هذا الشي و بالعكس!. :hmm:

لا اعلم لم الارباك؟ :excl:

-1

شارك هذا الرد


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

لا اعلم لم الارباك؟

لم نكن نحاول اختراع طريقة, عبارة عن سؤال للمتعة لا أكثر :)

0

شارك هذا الرد


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

هل يمكنك معرفة اذا كان الحرف كبيرا او صغيرا بالاصل

اي التميز بينهم قبل التحويل؟

0

شارك هذا الرد


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

أخ محمد,

هناك العديد من الدوال في المكتبة القياسية لـ C لمعرفة نوع الحرف:

http://en.wikipedia.org/wiki/Ctype.h#The_contents_of_.3Cctype.h.3E

0

شارك هذا الرد


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

موضوع ممتع......... :)

0

شارك هذا الرد


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

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

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