szyfr "telefoniczny"

0

Witam.
Chciałbym napisać program szyfrujący i deszyfrujący, ale kompletnie nie wiem jak się za niego zabrać.
Szyfr miałby polegać na tym, że np. wyraz "Ala" to 21 53 21.(tylko bez przerw). 2 to numer na klawiaturze w telefonie gdzie znajdziemy tę literkę, a druga cyfra (w tym przypadku 1) to ile razy trzeba nacisnąć ten przycisk, aby wypisać tę literkę. Mówię o pierwszej parze "21". 0 to przerwa i tak dalej..

0

Możesz zrobić to np. tak:

#include <stdio.h>

struct Kodowanie {
    int miejsce;
    int ilosc;
};
typedef struct Kodowanie Kodowanie;

Kodowanie szyfr[256];
void init(void) {
    /* Tutaj wypelniamy tablice szyfr wartosciami, np.: */
    szyfr['a'].miejsce = 2;
    szyfr['a'].ilosc = 1;
    /* Mozna tez zrobic jakas petle. */
}

int main(void) {
	init();
	
    printf("a -> %d%d\n", szyfr['a'].miejsce, szyfr['a'].ilosc);

    return 0;
}

(ideone)

Jeszcze innym sposobem byłoby założenie, że taki tekst może mieć maksymalnie 2 znaki i przechowywanie od razu gotowych łańcuchów:

char szyfr[256][3];
sprintf(szyfr['a'], "%d%d", 2, 1);

(ideone)

0
const char *code(char ch)
  {
   static struct phonecode { const char ch; const char phone[3]; } tb[]=
     {
        {'a',"21"}, {'b',"22"}, {'c',"23"},
        {'d',"31"}, {'e',"32"}, {'f',"33"},
        ...
     };
   for(unsigned i=0;i<sizeof(tb)/sizeof(*tb);++i) if(ch==tb[i].ch) return tb[i].phone; // zastanowić się nad wyszukiwaniem binarnym
   return NULL;
  }
0

@_13th_Dragon ale to przecież c++ więc czemu nie użyć do tego mapy?

0

Wiecie, nie miałem niektórych rzeczy na lekcji. I nauczyciel (bo to na lekcje) może mieć pretensje że tego użyłem itd .. Jakoś prościej? Ew. szyfr w którym alfabet będzie wspak czyli a-z, b-y. Nie było mnie na tych lekcjach, więc jest kłopot.

0

Uzupełniasz i po sprawie:

const char *code(char ch)
  {
   if(ch<'m')
     {
      if(ch<'g')
        {
         if(ch<'c')
           {
            if(ch<'b') return ch<'a'?NULL:"21"
            else return "22"; //b
           }
         else
           {
           }
        }
      else
        {
        }
     }
   else
     {
     }
  }
0
 {'a',"21"}, {'b',"22"}, {'c',"23"},
        {'d',"31"}, {'e',"32"}, {'f',"33"},

Ale po co dwa elementy? Zamiast pierwszego można operować indeksem.

{"21","22","23","31","32","33",...}

i wiemy, że pod indeksem [0] jest 'a', więc wystarczy odjąć 'a' od szukanej litery, by otrzymać indeks do tablicy.

1

Najlepiej tak, nie jest optymalnie, ale zrozumiale i prosto:

const char *buttons=  {
     "", // 0
     " ", "abc", "def",
     "ghi", "jk;", "mno",
     "pqrs", "tuv", "wxyz"
};

bool encodeChar(char ch, char *buff) {
     ch = lower(ch);
     if (isalpha(ch)) {
         int i, j;
         for (i=2; i<=9; ++i) {
              char *p = strchr(buttons[i], ch);
              if (p) {
                    j = p-buttons[i]+1;
                    break;
              }
         }
         sprintf(buff, "%d%d", i, j);
         return true;
     } else {
         sprintf(buff, "%c", ch);
         return false;
     }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1