سؤال

أحاول إنشاء برنامج RLE (الترميز الطول) فقط للشخصيات. قرأت الطريقة التي يعمل بها على الملاحظات على الشبكة. وحاولت إصلاح الكود الخاص بي! بغض النظر عن أعتقد أن خطوات الكود صحيحة ، فإن الكود لا يعمل! يبدو بعض "Z" الغريب أثناء تشغيله. أنا حقا لا أستطيع أن أجد ما خطأ! هل يمكن أن تعطيني نصيحة من فضلك؟

#include <stdio.h>

int main()
{
    int count;
    unsigned char currChar,prevChar=EOF;
    while(currChar=getchar() != EOF)
    {
        if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )
        {
            printf("%c",currChar);
            if(prevChar==currChar)
            {
                count=0;
                currChar=getchar();
                while(currChar!=EOF)
                {
                    if (currChar==prevChar)
                        count++;
                    else
                    {   
                        if(count<=9)
                            printf("%d%c",count,prevChar);
                        else
                        {   
                            printf("%d%c",reverse(count),prevChar);
                        }                       
                        prevChar=currChar;
                        break;
                    }
                }
            }
            else
                prevChar=currChar;

            if(currChar==EOF)
            {   printf("%d",count);
                break;
            }
        }
        else
        {
            printf("Error Message:Only characters are accepted! Please try again! False input!");
            break;
        }
    }
    return 0;
}

int reverse(int x)
{
    int p,y,r=0;
    x=(x<0)?-x:x;
    while (x>0)
    {
        y=x%10;
        p=x/10;
        r=10*r+y;
        x=p;
    }
    printf("%d",r);
    return 1;
}

على سبيل المثال ، أعطيت المدخلات:

وحصلت على الإخراج:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :(

هل كانت مفيدة؟

المحلول

تحويل التعليقات السابقة إلى إجابة ...

  • هناك مشاكل في المهام في ظروف "if" - كما أشار في الإجابة الأخرى.

  • لا يمكنك تعيين قيمة إلى char غير موقعة ثم توقع اكتشاف EOF. ننسى الاسم - تذكر أن getc () و getChar () (و fgetc ()) لإرجاع عدد صحيح ، وليس char ؛ يتعين عليهم إرجاع عدد صحيح لأنهم بحاجة إلى إرجاع كل قيمة شخصية صالحة بالإضافة إلى EOF!

  • الاختبار الخاص بك في if(currChar=='EOF') غريب. أنت تستخدم ثابتًا متعدد الأحرف ، والذي يحدد في أحسن الأحوال ، والذي لن يساوي EOF (غير مؤهل) كما تم إرجاعه بواسطة GetChar (). بالإضافة إلى نوع Currchark خاطئ.

  • عكس () دائما إرجاع 0 ؛ هل هذا ما تريده حقًا؟

  • الخط 'while(currChar=getchar() != EOF)"يحتاج الأقواس الإضافية بحيث تعمل كما هو متوقع:"while((currChar = getchar()) != EOF)'. في الوقت الحالي ، يعين 0 (nul ، ' 0') أو 1 (control-a) إلى currchark.

  • الداخلية في حين أن الحلقة لا تقرأ أي أحرف ، لذلك سوف يرسل برنامجك إلى جنون - فهو يحتاج إلى تعيين "while((currChar = getchar()) != EOF)تدوين أيضا. ثم تحتاج إلى معرفة ما هو الناتج المتوقع حقًا ، لأنني لا أعتقد أنه من المنطقي - على وجه الخصوص ، الطرد "printf("%c",currChar);"بعد الاختبار الرئيسي ، يكون مشكوك فيه - ربما تكون طباعة تصحيح تصحيح تركتها عن طريق الصدفة.

  • تحتاج أيضًا إلى التفكير في كيفية تعامل الكود مع أشياء مثل الخطوط الجديدة - وهذا قبل أن نتوصل إلى قضايا الغموض في الإخراج (كيف يمكنك معرفة الفرق بين البيانات المشفرة RLE والبيانات التي تحتوي على قيم رقمية. هناك الكثير مما يدعو للقلق حول الخوارزمية الخاصة بك! إنه في الغالب غير صحيح ، أنا آسف للإبلاغ.

فيما يلي بعض رمز العمل شبه. يرفض صراحة التعامل مع الأرقام (ولكن هذا كل شيء).

/* RLE - Run Length Encoding */
/* SO 2485285 */

/*
** Input:  stream of data except for digits 0-9
** Output: stream of data with adjacent sets of 3 or more of the same
**         character represented by 3Z (for ZZZ), etc.
*/

#include <stdio.h>
#include <ctype.h>

static void print_rle(int count, int repchar)
{
    if (count > 2)
        printf("%d%c", count, repchar);
    else if (count == 2)
        printf("%c%c", repchar, repchar);
    else if (repchar != EOF)
        printf("%c", repchar);
}

int main()
{
    int count = 1;
    int currChar;
    int prevChar = EOF;

    while ((currChar = getchar()) != EOF)
    {
        if (isdigit(currChar))
            fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
        else if (currChar == prevChar)
            count++;
        else
        {
            print_rle(count, prevChar);
            count = 1;
            prevChar = currChar;
        }
    }
    print_rle(count, prevChar);

    return 0;
}

وهذا هو الإخراج عندما أقوم بتشغيله على رمز المصدر الخاص به (لاحظ أنني أستخدم المساحات ، وليس علامات التبويب). تتم طباعة رسائل "حرف زائفة" على Stderr ، وليس stdout.

/* RLE - Run Length Encoding */
Bogus character 2 read - ignored
Bogus character 4 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
Bogus character 2 read - ignored
Bogus character 8 read - ignored
Bogus character 5 read - ignored
/* SO  */

/*
Bogus character 0 read - ignored
Bogus character 9 read - ignored
** Input:  stream of data except for digits -
Bogus character 3 read - ignored
** Output: stream of data with adjacent sets of  or more of the same
Bogus character 3 read - ignored
**9 character represented by Z (for 3Z), etc.
*/

#include <stdio.h>
#include <ctype.h>

static void print_rle(int count, int repchar)
{
Bogus character 2 read - ignored
4 if (count > )
8 printf("%d%c", count, repchar);
Bogus character 2 read - ignored
4 else if (count == )
8 printf("%c%c", repchar, repchar);
4 else if (repchar != EOF)
8 printf("%c", repchar);
}

int main()
{
Bogus character 1 read - ignored
4 int count = ;
4 int currChar;
4 int prevChar = EOF;

4 while ((currChar = getchar()) != EOF)
4 {
8 if (isdigit(currChar))
12 fprintf(stderr, "Bogus character %c read - ignored\n", currChar);
8 else if (currChar == prevChar)
12 count++;
8 else
8 {
12 print_rle(count, prevChar);
Bogus character 1 read - ignored
12 count = ;
12 prevChar = currChar;
8 }
4 }
4 print_rle(count, prevChar);

Bogus character 0 read - ignored
4 return ;
}

نصائح أخرى

انظر إلى هذا الخط:

if ( ( (currChar='A')&&(currChar='Z') ) || ( (currChar='a')&&(currChar='z') ) )

أنت تقوم بتعيين "أ" currChar ثم تقوم بتعيين "z" currChar وهلم جرا...

كنت بحاجة إلى تغيير = ل == لجعلها مقارنة بدلا من المهمة.

أيضا ، ماذا تقصد (currChar='A')&&(currChar='Z')? currChar لا يمكن أن تكون "A" و "Z" في نفس الوقت ، أعتقد أن ما تعني وضعه هنا هو فحص currChar يتم تضمينها في فاصل زمني معين. لذلك ربما يجب أن يكون:

(currChar>='A')&&(currChar<='Z')

الأمر نفسه ينطبق على الجزء الثاني من حالتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top