szyfr "telefoniczny"

szyfr "telefoniczny"
D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
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..

OA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 95
0

Możesz zrobić to np. tak:

Kopiuj
#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:

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

(ideone)

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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;
  }
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

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

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Uzupełniasz i po sprawie:

Kopiuj
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
     {
     }
  }
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
 {'a',"21"}, {'b',"22"}, {'c',"23"},
        {'d',"31"}, {'e',"32"}, {'f',"33"},

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

Kopiuj
{"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.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.