ahmed.o.mohamed

اختبر قدراتك في C/CPP - الحلقة الثالثة, الجزء الثاني

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

السلام عليكم

الحلقة الأولى.

الحلقة الثانية - الجزء الأول.

الحلقة الثانية - الجزء الثاني.

الحلقة الثانية - الجزء الثالث.

الحلقة الثانية - الجزء الرابع.

الحلقة الثانية - الجزء الخامس.

الحلقة الثانية - الجزء السادس و الأخير.

الحلقة الثالثة - الجزء الأول.

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

الإختبار الثالث (الجزء الثاني) :

اكتب برنامج يطلب من المستخدم إدخال سلسلة محارف ثم يُخزن الــ Morse code المقابل للجملة المُدخلة في ملف نصي.

الأحرف التي يجب تشفيرها هي :

  • الأحرف الأبجدية (نفترض أنها صغيرة small)
  • الأرقام (0,1,2, .. 9)
  • النقطة (.)

إذا احتوت المُدخلات على أحرف أخرى, يقوم البرنامج بإظهار علامات استفهام في مكان الــ Morse code.

و هذا هو جدول التشفير :

post-219439-033453200 1347110097_thumb.p

مثال :

post-219439-045602000 1347110287_thumb.p

سأضع حل السؤال بعد إنتهاء عرض المحاولات.

0

شارك هذا الرد


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

هذه محاولتي :


#include<cstdio>
void change(char c,FILE*file)
{
char charsToMorse[37][7]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---",
"-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",
".--","-..-","-.--","--..",".-.-.-","-----",".----","..---","...--",
"....-",".....","-....","--...","---..","----."};

if(c>='a'&&c<='z')fprintf(file,"%s ",charsToMorse[c-'a']);
else if(c>='0'&&c<='9')fprintf(file,"%s ",charsToMorse[27+c-'0']);
else if(c=='.')fprintf(file,"%s ",charsToMorse[26]);
else fprintf("? ",file);
}
#include<cstdio>
int main()
{
char string[1000];
scanf("%[^\n]",string);
FILE*out=fopen("Morse.txt","w");
if(out)
for(int i=0;string[i];i++)
change(string[i],out);

return 0;
}

و هذه نسخة لإظهار الناتج على شاشة الكونسول لا داخل الملف ...

#include<cstdio>
void change(char c)
{
char charsToMorse[37][7]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---",
"-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",
".--","-..-","-.--","--..",".-.-.-","-----",".----","..---","...--",
"....-",".....","-....","--...","---..","----."};

if(c>='a'&&c<='z')printf("%s ",charsToMorse[c-'a']);
else if(c>='0'&&c<='9')printf("%s ",charsToMorse[27+c-'0']);
else if(c=='.')printf("%s ",charsToMorse[26]);
else printf("?");
}
#include<cstdio>
int main()
{
char string[1000];
scanf("%[^\n]",string);

for(int i=0;string[i];i++)
change(string[i]);

return 0;
}

تم تعديل بواسطه أحمد الشنقيطي
دمج المشاركات.
0

شارك هذا الرد


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

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

int main() {
char c, mcodeIndex;
int i = 0;
char mcode[38][7] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".-.-.-", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "??????"};
FILE *F = fopen("mcode.txt", "wb");
printf("type your lettre: ");
for(c=getche(); c!=13; c=getche()){
if(c>='a'&&c<='z') mcodeIndex = c - 'a';
else if(c>='A'&&c<='Z') mcodeIndex = c - 'A';
else if(c>='0'&&c<='9') mcodeIndex = c - '0' + 27;
else if(c=='.') mcodeIndex = 26;
else mcodeIndex = 37;
fprintf(F, "%6s%s", mcode[mcodeIndex], !(i++%10)?"\r\n":" ");
}
fclose(F);
return 0;
}

إذا

أين هو الخطأ المنطقي إذا لم يكن char i لأني غيرتها إلى int؟؟

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

شارك هذا الرد


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

محاولتي :

#include <stdio.h>
#include <string.h>
#define NL 37

int main() {
char ligne[128];
int i, j;

struct code {
char lettre;
char * morse;
};
struct code table[NL] = {'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', "--..", '.', ".-.-.-", '0', "-----", '1',
".----", '2', "..---", '3', "...--", '4', "....-", '5', ".....", '6', "-....",
'7', "--...", '8', "---..", '9', "----."};


printf("Donnez votre message (1 ligne maxi) : \n");
gets(ligne);

FILE * fileMorseCode = fopen("fileMorseCode.txt", "wt");
fprintf(fileMorseCode, "%s", "Voici la traduction de votre message : \n");
for (i = 0; i < strlen(ligne); i++) {
j = 0;
while (ligne[i] != table[j].lettre && j++<NL - 1);
if (j < NL) fprintf(fileMorseCode, "%7s", table[j].morse);
else fprintf(fileMorseCode, "%s", "??????");
if (!((i + 1) % 10)) fprintf(fileMorseCode, "%s", "\n");
}

return 0;
}

0

شارك هذا الرد


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

أين هو الخطأ المنطقي إذا لم يكن char i لأني غيرتها إلى int ؟

هذا ما لاحظتُه فقط :)

أخطاء الــ Casting خطيرة جدا .. و قد تكون سببا في انهبار برنامجك !, لذا كن حذرا في المرات القادمة :happy:

0

شارك هذا الرد


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

ماذا عن الخطأ الذي ذكرته ... عن أن الإدخال لا ينتهي بضغط Enter !!

حيث أن رقمه هو 10 وليس 13 ..

#include<cstdio>
main()
{
return printf("%i",'\n');
}

0

شارك هذا الرد


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

هذه محاولتي

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

void viderBuffer(void);
int lire(char *, int );


int main()
{
size_t n=0;
int i=0,j=0,log=1;

FILE *w=fopen("test.txt","w");

char message[MAX]="";
const char *q="ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789";
const char *p[37]=
{
".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--",
"-.","---", ".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
".-.-.-","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."
};

puts("donnez votre message (1 ligne maxi):\n\n");

if(lire(message,MAX))
{
n=strlen(message);

for(i=0;i<n;i++)
{
log=0;

for(j=0;j<37;j++)
{
if(message[i]==q[j])
{
fputs(p[j],w); log=1; break;
}

}
if(log==0) fputs("??????",w);
}
}

fclose(w);

return 0;
}

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

int lire(char *chaine, int longueur)
{
char *positionEntree = NULL;

if (fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if (positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}

bGM20634.jpg

0

شارك هذا الرد


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

ماذا عن الخطأ الذي ذكرته ... عن أن الإدخال لا ينتهي بضغط Enter !!

الزر Enter يُولد رمزين هما على التوالي CR (carriage return) و LF (line feed).

العددين 10 و 13, هما الــ ASCII codes المقابلة للرمزين السابقين.

0

شارك هذا الرد


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

تم منح النقاط للمشاركات المفيدة و حذف الردود الغير مفيدة, حفاظا على تنسيق الموضوع.

يُغلق.

أراكم في الجزء الثالث من الحلقة الثالثة.

0

شارك هذا الرد


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

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

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