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

معلوماتي عن شيفرة موريس + اسئلة على ما اجهله فيها

بدأه tantie L في 9 فبراير 2014 · 7 رد · 1,053 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته اساتذتي اخواني اخواتي  ^_^

ادعو الله ان تكونوا بخير و عافية انا الحمد لله في احسن الاحوال بعد الاختبارات

اليوم اردت ان اكتب هذا الموضوع البسيط عن شيفرة موريس و ما اعرفه عنها و فيه اردت ان اطرح بعض الاسئلة عن ما اجهله فيها

اولا :

من يكون موريس؟ :

هو صامويل فينلي بريز مورس ( 27/4/1791 - 2/4/1872 ) مخترع امريكي فهو من اخترع التيليغراف، عمل رساما طوال حياته و لانه لم يلق الاهتمام الذي يستحقه عانى من الفقر في بداياته و عندما صنع اول نموذج للتيليغراف أحدث بهذا ثورة في مجال الاتصالات.

ماهي شيفرة موريس؟ :

شيفرة موريس و قد سميت نسبة لمن اوجدها تعتمد على التشفير بالاستبدال اي انه قد اوجد ابجدية خاصة به تشفر الابجدية التي نفهمها نحن و هي ترتكز على النقطة (.) و المطّة (-) اذ ان لكل حرف ما يقابله في هذه الشيفرة فمثلا 

A : -.

0 : -----

و هذه هي الصورة التي توضح التشفير الخاص بالابجدية الانجليزية ( الفرنسية ) و الارقام :

 qQ5cF.png

كما لاحظت انا في الشيفرة فانه لا توجد علاقة تربط بين الانتقال من حرف الى حرف اي انه ان شفرنا A فانه لا يمكننا ايجاد علاقة انتقال الى B من شيفرة A او اي حرف اخر اما الارقام فلدينا 0 و شيفرته هي ( ----- ) و نلاحظ ان الانتقال الى الارقام التي تليه يتم باستبدال المطات بالنقاط و ذلك حسب العدد الذي نريد تشفيره فمثلا نريد تشفير 2 فاننا نستبدل مطتين بنقطتين فنحصل على تشفير 2

هذه الصورة ممكن تشرح اكثر :

qdmwW.png

 

و هكذا دواليك الى ان ننهي التشفير الخاص بالارقام، لكن عندما نصل الى 5 ( ..... ) فهنا نقوم باستبدال النقاط بالمطات حسب القيمة المطلقة للفرق بين الرقم المراد تشفيره و 5 مثل  

5-9= 4- اي لتشفير 9 نستبدل |4-| ( أي 4 ) نقاط من البداية بـ 4 مطات

 

و هنا ملاحظة :

الارقام الاقل من 5 لتشفيرها نستبدل النقاط بمطات من الاخير 

اما الارقام الاكبر من 5 لتشفيرها نستبدل النقاط بمطات من البداية

 

اي على حسب ما فكرت انا انه يمكن الاستفادة من تشفير 0 ( ----- ) و تشفير 5 ( ..... ) لايجاد علاقة تمكننا من تقصير الكود ( و انا لم اطبقها مع الاسف  :(  )

 

هذه الشيفرة بسيطة في وقتنا الآني لذلك سألت شخصا هو أكبر مني و يدرس البرمجة ايضا عن طرق اخرى لجعل شيفرة مورس أقوى و اكثر تعقيدا فاجابني بطرق جعلت رأسي يدور  :wacko:

قال لي :

هناك طرق كثييرة لجعل هذه الشيفرة اكثر تعقيدا و من بينها :

الاشتقاق - عملية الرقم الثنائي المهمل - والرقم الثنائي المتمم - العملية المنطقية xor - والنظام السداسي عشر -الترميز الثنائي

هنا يأتي سؤالي و هو : كيف يتم جعل شيفرة مورس اكثر تعقيدا بهذه الطرق ؟ و ما هو شرحها ؟ فأنا لم افهم كيف يتم ذلك  :( 

لذلك ارجو من حضرتكم ان تفيدوني بمعرفتكم و تطلعوني على اي معلومة تفيدني هنا فالفضول قد تملّكني و هذا الشخص للان لم يجبني لانه منشغل 

 

بالمناسبة هذا هو الكود الخاص بي لشيفرة مورس أرجو ان لاتفزعوا من كمّ الاسطر فهو كثير جدا  :blush:  و هو 306 سطر ( يا الهي )

استعملت القوائم في هذا الكود 

ارجو ان تفيدوني باي انتقاد و تصحيح او تقليص للكود و ساكون لكم من الشاكرات  :lol: 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct liste
{
    char alpha;
    char cipher[6];
    struct liste *ptrn;
}alphaCode;
typedef struct liste2
{
    char num;
    char cipher[6];
    struct liste2 *ptrn;
}numCode;
alphaCode *init_l_A()
{
    alphaCode *tete,*a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9,*a10,*a11,*a12,*a13,*a14,*a15,*a16,*a17,*a18,*a19,*a20,*a21,*a22,*a23,*a24,*a25,*a26;
    tete=NULL;
    a1=(alphaCode*)malloc(sizeof(alphaCode));
    a1->alpha='z';
    strcpy(a1->cipher,"--..");
    a1->ptrn=tete;
    tete=a1;
    //******************************
    a2=(alphaCode*)malloc(sizeof(alphaCode));
    a2->alpha='y';
    strcpy(a2->cipher,"-.--");
    a2->ptrn=tete;
    tete=a2;
    //******************************
    a3=(alphaCode*)malloc(sizeof(alphaCode));
    a3->alpha='x';
    strcpy(a3->cipher,"-..-");
    a3->ptrn=tete;
    tete=a3;
    //******************************
    a4=(alphaCode*)malloc(sizeof(alphaCode));
    a4->alpha='w';
    strcpy(a4->cipher,".--");
    a4->ptrn=tete;
    tete=a4;
    //******************************
    a5=(alphaCode*)malloc(sizeof(alphaCode));
    a5->alpha='v';
    strcpy(a5->cipher,"...-");
    a5->ptrn=tete;
    tete=a5;
    //******************************
    a6=(alphaCode*)malloc(sizeof(alphaCode));
    a6->alpha='u';
    strcpy(a6->cipher,"..-");
    a6->ptrn=tete;
    tete=a6;
    //******************************
    a7=(alphaCode*)malloc(sizeof(alphaCode));
    a7->alpha='t';
    strcpy(a7->cipher,"-");
    a7->ptrn=tete;
    tete=a7;
    //******************************
    a8=(alphaCode*)malloc(sizeof(alphaCode));
    a8->alpha='s';
    strcpy(a8->cipher,"...");
    a8->ptrn=tete;
    tete=a8;
    //******************************
    a9=(alphaCode*)malloc(sizeof(alphaCode));
    a9->alpha='r';
    strcpy(a9->cipher,".-.");
    a9->ptrn=tete;
    tete=a9;
    //******************************
    a10=(alphaCode*)malloc(sizeof(alphaCode));
    a10->alpha='q';
    strcpy(a10->cipher,"--.-");
    a10->ptrn=tete;
    tete=a10;
    //******************************
    a11=(alphaCode*)malloc(sizeof(alphaCode));
    a11->alpha='p';
    strcpy(a11->cipher,".--.");
    a11->ptrn=tete;
    tete=a11;
    //******************************
    a12=(alphaCode*)malloc(sizeof(alphaCode));
    a12->alpha='o';
    strcpy(a12->cipher,"---");
    a12->ptrn=tete;
    tete=a12;
    //******************************
    a13=(alphaCode*)malloc(sizeof(alphaCode));
    a13->alpha='n';
    strcpy(a13->cipher,"-.");
    a13->ptrn=tete;
    tete=a13;
    //******************************
    a14=(alphaCode*)malloc(sizeof(alphaCode));
    a14->alpha='m';
    strcpy(a14->cipher,"--");
    a14->ptrn=tete;
    tete=a14;
    //******************************
    a15=(alphaCode*)malloc(sizeof(alphaCode));
    a15->alpha='l';
    strcpy(a15->cipher,".-..");
    a15->ptrn=tete;
    tete=a15;
    //******************************
    a16=(alphaCode*)malloc(sizeof(alphaCode));
    a16->alpha='k';
    strcpy(a16->cipher,"-.-");
    a16->ptrn=tete;
    tete=a16;
    //******************************
    a17=(alphaCode*)malloc(sizeof(alphaCode));
    a17->alpha='j';
    strcpy(a17->cipher,".---");
    a17->ptrn=tete;
    tete=a17;
    //******************************
    a18=(alphaCode*)malloc(sizeof(alphaCode));
    a18->alpha='i';
    strcpy(a18->cipher,"..");
    a18->ptrn=tete;
    tete=a18;
    //******************************
    a19=(alphaCode*)malloc(sizeof(alphaCode));
    a19->alpha='h';
    strcpy(a19->cipher,"....");
    a19->ptrn=tete;
    tete=a19;
    //******************************
    a20=(alphaCode*)malloc(sizeof(alphaCode));
    a20->alpha='g';
    strcpy(a20->cipher,"--.");
    a20->ptrn=tete;
    tete=a20;
    //******************************
    a21=(alphaCode*)malloc(sizeof(alphaCode));
    a21->alpha='f';
    strcpy(a21->cipher,"..-.");
    a21->ptrn=tete;
    tete=a21;
    //******************************
    a22=(alphaCode*)malloc(sizeof(alphaCode));
    a22->alpha='e';
    strcpy(a22->cipher,".");
    a22->ptrn=tete;
    tete=a22;
    //******************************
    a23=(alphaCode*)malloc(sizeof(alphaCode));
    a23->alpha='d';
    strcpy(a23->cipher,"-..");
    a23->ptrn=tete;
    tete=a23;
    //******************************
    a24=(alphaCode*)malloc(sizeof(alphaCode));
    a24->alpha='c';
    strcpy(a24->cipher,"-.-.");
    a24->ptrn=tete;
    tete=a24;
    //******************************
    a25=(alphaCode*)malloc(sizeof(alphaCode));
    a25->alpha='b';
    strcpy(a25->cipher,"-...");
    a25->ptrn=tete;
    tete=a25;
    //******************************
    a26=(alphaCode*)malloc(sizeof(alphaCode));
    a26->alpha='a';
    strcpy(a26->cipher,".-");
    a26->ptrn=tete;
    tete=a26;
    //******************************
    return tete;
}
numCode *init_l_N()
{
    numCode *tete,*a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9,*a10;
    tete=NULL;
    a1=(numCode*)malloc(sizeof(numCode));
    a1->num='9';
    strcpy(a1->cipher,"----.");
    a1->ptrn=tete;
    tete=a1;
    //******************************
    a2=(numCode*)malloc(sizeof(numCode));
    a2->num='8';
    strcpy(a2->cipher,"---..");
    a2->ptrn=tete;
    tete=a2;
    //******************************
    a3=(numCode*)malloc(sizeof(numCode));
    a3->num='7';
    strcpy(a3->cipher,"--...");
    a3->ptrn=tete;
    tete=a3;
    //******************************
    a4=(numCode*)malloc(sizeof(numCode));
    a4->num='6';
    strcpy(a4->cipher,"-....");
    a4->ptrn=tete;
    tete=a4;
    //******************************
    a5=(numCode*)malloc(sizeof(numCode));
    a5->num='5';
    strcpy(a5->cipher,".....");
    a5->ptrn=tete;
    tete=a5;
    //******************************
    a6=(numCode*)malloc(sizeof(numCode));
    a6->num='4';
    strcpy(a6->cipher,"....-");
    a6->ptrn=tete;
    tete=a6;
    //******************************
    a7=(numCode*)malloc(sizeof(numCode));
    a7->num='3';
    strcpy(a7->cipher,"...--");
    a7->ptrn=tete;
    tete=a7;
    //******************************
    a8=(numCode*)malloc(sizeof(numCode));
    a8->num='2';
    strcpy(a8->cipher,"..---");
    a8->ptrn=tete;
    tete=a8;
    //******************************
    a9=(numCode*)malloc(sizeof(numCode));
    a9->num='1';
    strcpy(a9->cipher,".----");
    a9->ptrn=tete;
    tete=a9;
    //******************************
    a10=(numCode*)malloc(sizeof(numCode));
    a10->num='0';
    strcpy(a10->cipher,"-----");
    a10->ptrn=tete;
    tete=a10;
    //******************************
    return tete;
}
void alpha_coding(alphaCode *tete,numCode *tete1,char *t)
{
    int len,i;
    alphaCode *P;
    numCode *Q;
    char c;
    P=tete;
    Q=tete1;
    len=strlen(t);
    c=t[0];
    for(i=0;i<=len;i++)
    {
        c=tolower(c);
        if(isalpha(c))
        {
            while(P!=NULL && c!=P->alpha)
            {
                 P=P->ptrn;
            }
            if(c==P->alpha)
            {
                 printf("%s",P->cipher);
            }
            c=t[i+1];
            P=tete;
            Q=tete1;
        }
        else if(isdigit(c))
        {
            while(Q!=NULL && c!=Q->num)
            {
                 Q=Q->ptrn;
            }
            if(c==Q->num)
            {
                 printf("%s",Q->cipher);
            }
            c=t[i+1];
            Q=tete1;
            P=tete;
        }
        else
        {
            printf("%c",c);
            c=t[i+1];
            P=tete;
            Q=tete1;
        }
    }
}
main()
{
    alphaCode *Morisse_Code_tete_A;
    numCode *Morisse_Code_tete_N;
    char word[100];
    printf("\t\tThis simple code for encryption manner Morris\n\n");
    printf("Enter the word please ^_^ :\n");
    gets(word);
    Morisse_Code_tete_A=init_l_A();
    Morisse_Code_tete_N=init_l_N();
    alpha_coding(Morisse_Code_tete_A,Morisse_Code_tete_N,word);
    printf("\n\nThank you ^O^\nTake care ^_^.\n");
}

استودعكم الله و ارجو ان تفيدوني بما تعرفون سواء انتقاد او نصيحة فأنا سائرة على طريق من سبقني و لابد لي من نصحكم حتى الحق بركبكم 

بالتوفيق مع بالغ احترامي  ^_^

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#2

تستحقين عقوبة على هذا الكود !

alphaCode *init_l_A()
{
alphaCode *tete,*a1,*a2,*a3,*a4,*a5,*a6,*a7,*a8,*a9,*a10,*a11,*a12,*a13,*a14,*a15,*a16,*a17,*a18,*a19,*a20,*a21,*a22,*a23,*a24,*a25,*a26;
tete=NULL;
a1=(alphaCode*)malloc(sizeof(alphaCode));
a1->alpha='z';
strcpy(a1->cipher,"--..");
a1->ptrn=tete;
tete=a1;
//******************************
a2=(alphaCode*)malloc(sizeof(alphaCode));
a2->alpha='y';
strcpy(a2->cipher,"-.--");
a2->ptrn=tete;
tete=a2;
//************

يجب أن تغيريها جميعاً كما يلي :

alphaCode *init_l_A()
{
    alphaCode *tete,
    *a[26]={
    {'z',"--.."},
    {'y',"-.--"},
إلى آخره   
    };

سأتابع الرد بعد أداء الامتحان  , بالتوفيق لي :lol:

___________________________

الحمد لله

لن اناقش طريقة عمل الكود ولكن

هناك عدة طرق لتقصيره مثل التي ذكرتها قبل قليل , وأيضاً عمل ماكرو #define إلى آخره ...

بالتوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 10 فبراير 2014 في 21:37

#3

الكود التالي كتبته بدون أختبار قد يحتوى على اخطاء، قم بتجربته و أعلمنى إن اردت توضيح لأى جزء:

 

الملف tables.hpp

#ifndef MORSE_TABLES_HPP
#define MORSE_TABLES_HPP

// morse code
const char* mcode[] =
{
	"-----", // 0
	"----.", // 1
	"---..", // 2
	"--...", // 3
	"-....", // 4
	".....", // 5
	"....-", // 6
	"...--", // 7
	"..---", // 8
	".----", // 9
	"-.",    // A
	"...-",  // B
	".-.-",  // C
	"..-",   // D
	".",     // E
	".-..",  // F
	".--",   // G
	"....",  // H
	"..",    // I
	"---.",  // J
	"-.-",   // K
	"..-.",  // L
	"--",    // M
	".-",    // N
	"---",   // O
	".--.",  // P
	"-.--",  // Q
	".-.",   // R
	"...",   // S
	"-",     // T
	"-..",   // U
	"-...",  // V
	"--.",   // W
	"-..-",  // X
	"--.-",  // Y
	"..--"   // Z
};

// Morse code string hash
// computed using hash_string
unsigned mcode_hash[] =
{
	0x349529AD, // 0
	0x349529AE, // 1
	0x349629ED, // 2
	0x3514396E, // 3
	0x639B0A2D, // 4
	0xA787692E, // 5
	0xA787692D, // 6
	0xA78668EE, // 7
	0xA708596D, // 8
	0x788188AE, // 9
	0x002D0B41, // A
	0x730E56FF, // B
	0x7290477E, // C
	0x16D4D4AD, // D
	0x0000002E, // E
	0x7290477F, // F
	0x16D3D46E, // G
	0x730E5700, // H
	0x002E0B80, // I
	0x44087681, // J
	0x1656C52C, // K
	0x730D56C1, // L
	0x002D0B40, // M
	0x002E0B7F, // N
	0x1655C4ED, // O
	0x728F4740, // P
	0x44868601, // Q
	0x16D3D46F, // R
	0x16D4D4AE, // S
	0x0000002D, // T
	0x1656C52D, // U
	0x44878641, // V
	0x1655C4EE, // W
	0x44878640, // X
	0x440976BF, // Y
	0x730D56C0, // Z
};

// size of mcode/mcode_hash array
const int array_size = sizeof(mcode) / sizeof(char*);

// index of first alpha character
const int alpha_idx = 10;

#endif // MORSE_TABLES_HPP

الملف morse.cpp

#include <iostream>#include <string>#include "tables.hpp"using namespace std;inline unsigned hash_string(const string& value, int start_index, int count){		unsigned result = 0;		for (int i=start_index; i<count; ++i)			result = value + (result << 6) + (result << 16) - result;		return result;};template<typename t, int size>inline int index_of(const t& value, const t (&arr) [size]){	for(int i=0; i<size; ++i)		if (arr == value) return i;	return -1;}inline string to_morse_code(const string& value){	string s;	for(int i=0; i<value.size(); ++i)	{		char c = value;		// if lower-case letter convert to upper,		// if upper-case letter or digit it won't harm;		c &= 0xDF;			if ((c >= 'A' && c <= 'Z'))			s.append( mcode[ alpha_idx + 'A' - c ] );		else			s.append( mcode[ '0' - c ] );	}	return s;}inline string from_morse_code(const string& value){	string s;	const int size = value.size();	for(int i=0; i<size; ++i)	{		if (value == ' ') continue;		int start_idx=i, count=0;		for(++i; i<size && value != ' '; ++i);		count = ((value == ' ')? i-1: i) - start_idx + 1;		int idx = index_of( hash_string(value, start_idx, count), mcode_hash );		if (idx == -1) return string();		if (idx < alpha_idx)			s.append( 1, '0' + idx );		else			s.append( 1, 'A' + (idx - alpha_idx) );		s.append( 1, ' ' );	}		return s;}int main(){	while(true)	{		int c = 0;		cout << "What to do:\n\t1)Encrypt.\n\t2)Decrypt.\n\t3)Exit.\n\nChoise? ";		cin >> c;		if (c > 2) break;		string s;		cout << "Enter string: ";		cin >> s;				if (c == 1)			cout << "result: " << to_morse_code(s);		else			cout << "result: " << from_morse_code(s);				cout << endl;	}}

و الله ولي التوفيق

1

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

#4

@مصطفى 36a2

بالفعل لقد عاقبتني يا استاذ  :blush:  فأنا الان اعيد الكود حتى لا يكون سيئا

اخي الكريم مصطفى عندما عرفت a عرفتها و كأنها جدول خاناته بها حقلين ام هي قائمة؟ فانا على حد علمي لملأ القائمة لابد من استعمال malloc و اسناد قيم للحقول

وفقك الله في امتحاناتك و اعانك عليها  ^_^ شكرا جزيلا لك  :lol:

@C++er

اشكرك على هذا و قد قمت بتجريب الكود لكن البرنامج يعلق و تظهر لي نافذة مفادها يجب غلق البرنامج ربما هذا عائد الى اسناد المؤشرات + هل يمكنك ان تشرح لي ما هو الملف tables.hpp

بالتوفيق 

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#5

عذراً الخطأ مني المصفوفة لعناصر عادية وليس مؤشرات

كتبت كود بسيط يبيّن الفكرة بشكل واضح (على ما أظن)

#include<stdio.h>#include<string.h>#include<stdlib.h>struct morse{    char letter;    char*cipher;};main(){    struct morse a[3]={        {'z',"--.."},        {'y',"-.--"},        {'x',"-..-"},    };    //input    char w='x';    char *C="-.--";    int i;    for(i=0;i<3;i++)    {        if(a.letter==w)        {            printf("cipher of %c is %s\n",a.letter,a.cipher);        }    }    for(i=0;i<3;i++)    {        if(strcmp(a.cipher,C)==0)        {            printf("decipher of %s is %c\n",a.cipher,a.letter);        }    }    return 0;}

طبعاً عليك فقط إكمال الجدول لجميع الحروف .

بالتوفيق

#6

إليك تصحيح الدالة to_morse_code:

inline string to_morse_code(const string& value){	string s;	const int size = value.size();	for(int i=0; i<size; ++i)	{		char c = value;		// if lower-case letter convert to upper,		// if upper-case letter or digit it won't harm;		c &= 0xDF;		if ((c >= 'A' && c <= 'Z'))			s.append( mcode[ alpha_idx + c - 'A' ] );		else			s.append( mcode[ c - '0' ] );		s.append( 1, ' ' );	}	return s;}
اقتباس
هل يمكنك ان تشرح لي ما هو الملف tables.hpp

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

بالنسبة للحرف فأقوم بتحويلها للحالة الكبيرة و اقوم بطرح قيمة الحرف A منها للحصول على موقع الحرف من الرقم 0 و بعدها أضيف قيمة alpha_idx حتى احصل على الشفرة الخاصه بذلك الحرف.

 

المصفوفة mcode_hash تحتوى على هاش النص الموجود داخل mcode و أستخدمها فى تحويل شفرة موريس إلى الحرف المقابل لها و ذلك عندما تدخل الشفرة أقوم بأخذها و تمرير محتواها إلى الدالة hash_string و التى تعيد هاش للشفرة و بعدها أمرر ذلك الرقم للدالة index_of للحصول على موقع ذلك الرقم داخل المصفوفة mcode_hash و حيث أن الرقم الذى تم إيجاده موقعه داخل mcode_hash يماثل موقع الشفرة داخل mcode بالتالي أقوم بإستخدام ذلك الموقع للحصول على الحرف.

 

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

 

للعلم الطريقة التى اتبعتها هنا بالمصفوفتين هى طريقة بدائية لـ hard-coded hash table أو string map.

 

 

و الله ولي التوفيق

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

#7

السلام عليكم و رحمة الله و بركاته 

اخيرا وجدت الوقت حتى اعدل في ذلك الكود الطويل و الحمد لله 

اشكرك اخي الكريم مصطفى على تنبيهي لذلك و اعطائي الفكرة الاساسية للكود

هذا هو الكود بعد ان عدلته و صار 73 سطر بدل 306 و الحمد لله  ^_^

ارجو ان لا يكون سيئا جدا هذه المرة ايضا  :wacko:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct morse{
    char letter;
    char cipher[6];
}tab;
main()
{
    tab a[36]={
    {'a',".-"},
    {'b',"-..."},
    {'c',"-.-."},
    {'d',"-.."},
    {'e',"."},
    {'f',"..-."},
    {'g',"--."},
    {'h',"...."},
    {'i',".."},
    {'j',".---"},
    {'k',"-.-"},
    {'l',".-.."},
    {'m',"--"},
    {'n',"-."},
    {'o',"---"},
    {'p',".--."},
    {'q',"--.-"},
    {'r',".-."},
    {'s',"..."},
    {'t',"-"},
    {'u',"..-"},
    {'v',"...-"},
    {'w',".--"},
    {'x',"-..-"},
    {'y',"-.--"},
    {'z',"--.."},
    {'9',"----."},
    {'8',"---.."},
    {'7',"--..."},
    {'6',"-...."},
    {'5',"....."},
    {'4',"....-"},
    {'3',"...--"},
    {'2',"..---"},
    {'1',".----"},
    {'0',"-----"},
    };
    int len,i,j;
    char word[100],c;
    printf("enter the word please :\n");
    gets(word);
    len=strlen(word);
    c=word[0];
    for(i=0;i<len;i++)
    {
        c=tolower(c);
        if(isalpha(c) || isdigit(c))
        {
            for(j=0;j<36;j++)
            {
                if(c==a[j].letter)
                {
                    printf("%s",a[j].cipher);
                }
            }
        }
        else
        {
            printf("%c",c);
        }
        c=word[i+1];
    }
}

@C++er

 

C++er كتب:

 

بالنسبة للحرف فأقوم بتحويلها للحالة الكبيرة و اقوم بطرح قيمة الحرف A منها للحصول على موقع الحرف من الرقم 0 و بعدها أضيف قيمة alpha_idx حتى احصل على الشفرة الخاصه بذلك الحرف.

 

هل هذا يعني بانك استخدمت الكود اسكي في الكود الخاص بك؟

 

و اما فيما يخص الدالة from_morse_code  باذن الله ان وجدت الوقت ساحاول ان اقوم  برؤية الاخطاء التي بها حتى اتعلم منها و احاول تصحيحها و اتعلم اكثر عن C++

شكرا لك  :lol: 

بالتوفيق

تم تعديل هذه المشاركة بواسطة tantie L في 12 فبراير 2014 في 19:26

1

ابتسم للدنيا تبتسم لك و افعل الخير و انساه و لا تنسى أي أمر سيء قمت به حتى لا تكرره


لا تنسونا من صالح دعائكم أعانكم الله و ثبتكم على سواء السبيل


:)  :lol:  ^_^ 

#8

رائع .. الكود جيد جداً ..

اقتباس

هل هذا يعني بانك استخدمت الكود اسكي في الكود الخاص بك؟

يمكنك التعامل مع متغيرات char دوماً بقيم الآسكي الخاصة بها ,

فعليّاً لا يوجد أي مكان يتعامل مع المحارف بشكلها الحقيقي سوى العرض .. أما باقي العمليات فكلها تتعامل مع قيم الآسكي

putchar(10);char string[]={97,98,99,100,101,0};puts(string);

وهكذا ..

بالمثل أيضاً لا يتم التعامل مع الأعداد بشكلها العشري سوى عند العرض ! أما باقي العمليات فهي بالثنائي ..

 

بالتوفيق

1

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…