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

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

مغلق
بدأه Khaled.Alshaya في 11 فبراير 2008 · 35 رد · 13,361 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

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

char A = 'A';

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

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

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

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

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

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 11 فبراير 2008 في 07:32

#2

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

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

char A = 'A' ;
A=tolower(A) ;  // from head <cctype>
cout<<A<<endl;
tvquran_6.gif

#3

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

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

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

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 11 فبراير 2008 في 08:29

#4

الحل هو عن طريق ترميز 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;
}

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

#5

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

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

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

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

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

#6

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

char(A^32)

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

تم تعديل هذه المشاركة بواسطة فهدالشلوي في 11 فبراير 2008 في 09:44

tvquran_6.gif

#7

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

جميل أخ فهد,

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

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

تحياتي ,,

#8
char low2(char a)
{
if (a>='A' && a<='Z')
{
return a+('a'-'A');
}
return a;
}
d4baa0.gif
#9

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

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

A = 01000001

a = 01100001

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

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

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

char a = 'A' | 0x20;

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

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

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

تحياتي ,,

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

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

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

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

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 11 فبراير 2008 في 10:39 — السبب: تعليق على مشاركة الأخ محمد

#10

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

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

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

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

tvquran_6.gif

#11

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

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

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

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

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#12

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

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#13

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

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

char a = 'A' | 0x20;

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

وشكرا لك ..

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

تحيااااتي

للصداقة البرمجية

pro-vb6@hotmail.com

#14
اقتباس
المقصد هو 0x20 ماذا يعني ؟؟!

يعني قيمه 20H ،

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

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

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

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

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#15

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

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

:thumb_up:

#16

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

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

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

صح يا خالد ؟؟

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#17
خلدون خالد2 كتب:
خدعه جميله :clapping:

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

:thumb_up:

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

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

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

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

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#18

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

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

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

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

فنستطيع جعل 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;
tvquran_6.gif

#19

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

مدونتي: C++ Tips and Tricks

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

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

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

تحياتي ..

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 24 مايو 2009 في 15:40

#21

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

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

−1
#22
اقتباس
لا اعلم لم الارباك؟

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

#23

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

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

#25

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

00020309t.gif

1958_1963.gif

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

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