2010-03-21 25 views
0

J'essaie de créer un programme RLE (Run-Length Encoder) uniquement pour les caractères. J'ai lu la façon dont cela fonctionne sur les notes sur le net. Et j'ai essayé de réparer mon code! Peu importe je pense que les étapes du code sont bonnes, le code ne marche pas! Il semble étrange "Z" comme il s'exécute. Je ne peux vraiment pas trouver ce qui est faux! Pourriez-vous s'il vous plaît me donner un conseil?Encodage RLE ... Quel est le problème?

#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; 
} 

par exemple. J'ai donné l'entrée:

AAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEGGGGGGGGGGGGGGGGVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRHD RRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMS TTTTTTTTTTHHHHHHHHHHHH

et je suis sortie:

Z0AZZ0AZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0FZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0EZZ0GZZ0GZZ0GZZ0GZZ0GZZ0GZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0VZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0SZZ0RZZ0RZZ0RZZ0RZZ0 ZZ0RZZ0RZZ0RZZ0RZZ0RZZ0RZZ0HZZ0HZZ0HZZ0HZZ0HZZ0HZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0AZZ0

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

Répondre

2

Conversion commentaires précédents dans une réponse ...

  • Il y a des problèmes avec des missions dans le « si » les conditions - comme l'a fait dans l'autre réponse.

  • Vous ne pouvez pas affecter une valeur à un caractère non signé, puis attendre de détecter EOF. Oubliez le nom - rappelez-vous que getc() et getchar() (et fgetc()) retournent un entier, pas un char; ils doivent renvoyer un nombre entier car ils doivent renvoyer toutes les valeurs de caractères valides plus EOF! Le test de if(currChar=='EOF') est bizarre.Vous utilisez une constante à plusieurs caractères, qui est au mieux définie par l'implémentation, et qui ne va pas égaler EOF (sans guillemets) comme retourné par getchar(). De plus, le type de currChar est faux.

  • reverse() renvoie toujours 0; c'est ce que tu voulais vraiment?

  • La ligne 'while(currChar=getchar() != EOF)' a besoin de parenthèses supplémentaires pour que cela fonctionne comme prévu: 'while((currChar = getchar()) != EOF)'. Pour l'instant, il affecte 0 (NUL, '\ 0') ou 1 (Control-A) à currChar. La boucle while interne ne lit aucun caractère, donc elle va envoyer votre programme dans une frénésie - elle a aussi besoin de la notation ''. Ensuite, vous devez déterminer quelle est la sortie attendue, car je ne pense pas que cela ait beaucoup de sens - en particulier, le 'printf("%c",currChar);' après le test principal est douteux - c'est peut-être une impression de débogage que vous avez laissée derrière accident. Vous devez également considérer comment le code devrait gérer des choses comme les retours à la ligne - et c'est avant que nous arrivions à des questions d'ambiguïté dans la sortie (comment faites-vous la différence entre les données codées RLE et les données contenant des valeurs numériques. est beaucoup à vous soucier de votre algorithme il est surtout pas correct, je suis désolé de signaler

Voici une partie semi-travail;!. refuse explicitement de traiter avec des chiffres (mais c'est tout)

/* 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; 
} 

Et ceci est la sortie quand je l'exécute sur son propre code source (notez que j'utilise des espaces, pas des onglets). Les messages 'Bogus character' sont imprimés sur stderr, pas sur 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 ; 
} 
+0

merci, c'était une aide précieuse :) – FILIaS

3

Regardez cette ligne:

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

vous assignez 'A' à currChar vous assignez 'Z' à currChar et ainsi de suite ...

Vous devez changer = à == pour le rendre comparaison au lieu d'affectation.

aussi, que voulez-vous dire par (currChar='A')&&(currChar='Z')? currChar ne peut pas être « A » et « Z » en même temps, je crois que vous vouliez dire de mettre voici une vérification pour currChar étant inclus dans un certain intervalle. Donc, il devrait probablement:

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

de même pour la deuxième partie de votre condition.

+0

Oups! Vous avez raison! Mais encore, le problème reste le même! :( – FILIaS