Szyfr Cezara w języku C

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;
}
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?
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 :(
0

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

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.

0

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

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)

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ć.

2

@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

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)" ?

1

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

1

Nie miałeś to znajdź w google lub napisz sam: int islower(int ch) { return ('a'<=ch)&&(ch<='z'); }
Interpretować zgodnie z nawiasami: wpisz wynik getchar() w ch po czym porównaj to z EOF

0

Okey dziękuję za pomoc bardzo, projekt zrealizowany wydaje mi się całkiem okey. Ten C cały czas mnie zaskakuje.

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