Szyfr Cezara w języku C

Odpowiedz Nowy wątek
2015-01-18 14:07
0

Witam wszystkich bardzo serdecznie. Mam problem z którym nie mogę sobie poradzić mimo sprawdzenia wszystkich możliwych interpretacji tego szyfru w językach C/C++ program nie kompiluje mi się i w zasadzie nie mam też za bardzo "pomysłu" jak program ma przesuwać litery o podany zakres w pętli.

Oto co sam uskrobałem:

 #include<stdio.h>
int main(void)
{
    int a;
    char tab[101];
    printf("Podaj wiadomosc ktora chcesz zaszyfrowac: ");
    fgets(tab,100,stdin);
    printf("Podaj przesuniecie (zakres do 1 do 25): ");
    scanf("%d", &a);

    while(a<1 || a>25)
    {
        printf("Te dane sa bledne!\n");
        printf("Podaj przesuniecie w postaci liczby naturanej (zakres do 1 do 25): ");
        scanf("%d", &a);
    }

    for(int i=0;i<100;i++)
    {
        if(tab[i]>=65 && tab[i]<=90-a) {
            tab[i]=int(tab[i])+a; 
        }

        else if(tab[i]>=91-a && tab[i]<=90) {
            tab[i]=int(tab[i])-26+a; 
        }

        else if(tab[i]>=97 && tab[i]<=122-a) {
            tab[i]=int(tab[i])+a;
        }

        else if(tab[i]>=123-a && tab[i]<=122) {
            tab[i]=int(tab[i])-26+a; 
        }

    }

    printf("Zaszyfrowana wiadomosc:\n");
    printf(tab);
    return 0;
}

Pozostało 580 znaków

2015-01-18 14:20
2
  1. Proponowałbym zacząć od tego, że litery mają reprezentację liczbową, i spokojnie można to załatwić przez podanie literki zamiast jakiegoś z czapki przesunięcia.
  2. Doucz się jak dział printf.
  3. W C++ to można o wiele prościej zrobić, czy to musi być koniecznie C?

Pozostało 580 znaków

2015-01-18 14:27
0
  1. No tak ale ja mam przesuniecie o określoną przez użytkownika wartość
  2. Co jest nie tak tutaj z printf ?
  3. Niestety C :(

Pozostało 580 znaków

2015-01-18 14:31
0

printf(tab) wygląda raczej nie za bardzo, tak się cstrnga nie printfuje.

Pozostało 580 znaków

2015-01-18 14:33
0

int(x) to wywołanie funkcji, a nie rzutowanie, skądinąd i tak niepotrzebne, bo w C na charze można wykonywać dokładnie te same operacje co na intach.

Poza tym:
1.Cały ten Twój algorytm szyfrowania jest przesadnie skomplikowany.
2.Przypuśćmy, że wpisuję wiadomość do zaszyfrowania Hello World! - ale mimo to Twój kod leci po wszystkich stu znakach i robi się z tego wtf potem.


edytowany 1x, ostatnio: Patryk27, 2015-01-18 14:35
Przecież int(foo) == (int)foo - Ola Nordmann 2015-01-18 15:49
Przecież napisał C/C++ - Ola Nordmann 2015-01-18 16:01
Niestety C; a fragment mimo sprawdzenia wszystkich możliwych interpretacji tego szyfru w językach C/C++ raczej odnosi się do tego, że sprawdzał w C/C++, ale musi ostatecznie mieć to w C. - Patryk27 2015-01-18 16:04
no to ma chłopak lipę - Ola Nordmann 2015-01-18 16:08

Pozostało 580 znaków

2015-01-18 14:45
0

To w takim razie jak go można "odkomplikować" nie używać tablic ? pętli for ? tylko coś innego ? - co ?

Pozostało 580 znaków

2015-01-18 14:45
0

Jak sobie wyobrażasz szyfrowanie cezara bez użycia tablic? (pomijając rzecz w stylu: wpisujesz jeden znak i od razu wypisujesz ten zakodowany)


edytowany 1x, ostatnio: Patryk27, 2015-01-18 14:46

Pozostało 580 znaków

2015-01-18 15:02
0

mój znajomy zrobił to z użyciem getchar'a i instrukcji if. ;) z tym że nie wiem jak on to zrobił. Czy jest tutaj ktoś kto pomoże mi w rozwiązaniu mojego problemu ? proszę sobie wyobrazić że jestem kompletnym laikiem i chce to po prostu zrozumieć.

Pozostało 580 znaków

2015-01-18 15:07

@Patryk27:

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

int main(void)
  {
   int ch,key;
   printf("Podaj przesuniecie: "); // nawet ujemne ujdzie do odszyfrowania
   scanf("%d",&key);
   key%=26;
   if(key<0) key+=26;
   printf("Podaj wiadomosc (<Ctrl-Z>-koniec):");
   while((ch=getchar())!=EOF)
     {
      if(isupper(ch)) putchar('A'+(ch-'A'+key)%26);
      else if(islower(ch)) putchar('a'+(ch-'a'+key)%26);
      else putchar(ch);
     }
   return 0;
  }

;P


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
fajny knif z tą resztą z dzielenia, eliminuje wielokrotne "obroty" wokół alfabetu. Bo pierwsze co się nasuwa to jednak chyba if-else. - alagner 2015-01-18 15:23
Jeżeli pierwsze co się nasuwa to if-else oznacza to że ten komu to się nasuwa jest bardzo początkujący. - _13th_Dragon 2015-01-18 15:25

Pozostało 580 znaków

2015-01-18 15:42
0

Okey to jest już coś co powoli rozumiem. Tylko nie miałem jeszcze "isupper" "islower" i jak interpretować tą linijke " while((ch=getchar())!=EOF)" ?

Pozostało 580 znaków

2015-01-18 15:44
1

Control-Z da Ci znak EOF i wpisze go do zmiennej ch, wtedy pętla się zakończy.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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