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

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

مغلق
بدأه Snack3r في 8 سبتمبر 2012 · 8 رد · 832 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

post-219439-033453200 1347110097_thumb.p

مثال :

post-219439-045602000 1347110287_thumb.p

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

المرفقات
TabMorsecode.pngtestCode.png
#2

هذه محاولتي :

#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++)
	change(string,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++)
    	change(string);

return 0;
}

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 8 سبتمبر 2012 في 18:34 — السبب: دمج المشاركات.

#3
#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 في 8 سبتمبر 2012 في 18:51

[سبحان الله و بحمده, سبحان الله العظيم]

#4

محاولتي :

#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 != 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;
}
#5
اقتباس
أين هو الخطأ المنطقي إذا لم يكن char i لأني غيرتها إلى int ؟

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

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

#6

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

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

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

هذه محاولتي

#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==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

i love you mama

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

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

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

#9

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

يُغلق.

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

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

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