Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

C nie c++ ale podobne


JamJestJogurt

Rekomendowane odpowiedzi

Opublikowano

Czesc,

Potrzebuje pomocy z wyjasnieniem na czym polaga ten program?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char kom[100];
int i,szyfr, znak;
scanf("%s", kom);
scanf("%d", &i);
if(strcmp(kom, "deszyfruj")==0)i=-i;

getchar();
while((znak = getchar()) != '\n'){
 if(islower(znak))

	 {
		 szyfr = znak + i;
		 if(szyfr > 'z') szyfr -= 26;
		 if(szyfr < 'a') szyfr += 26;
 }
else if (isupper(znak))
{
 szyfr = znak +i;
 if(szyfr > 'Z') szyfr -= 26;
 if(szyfr < 'A') szyfr += 26;
}
else szyfr = znak;
printf("%c", szyfr);
}

return 0;
}

wiem ze to szyfr cezara ale nie za bardzo jak to działa..

moglby kots napisac co sie dzieje? mneij wiecej w calym kodzie

Opublikowano

ten kod jest beznadziejny, wywal to. Na razie nie napiszę poprawnie, bo nie mam czasu, jutro jak jeszcze nie będzie za późno to wrzucę porządne rozwiązanie.

czas się znalazł

#include <iostream>
#include <string>
int main(void)
{
const char midLowerLetter = ('a' + 'z') / 2;
std::string text;
std::cin >> text;
int i = 0;
while(text[i] != '\0')
 std::cout << char(midLowerLetter*2 - (text[i] < 'a')*('a'-'A')*2 - text[i++] + 1);
}

zmienna midLowerLetter zawiera kod ascii środkowej małej litery alfabetu angielskiego ('m' = 109)

następnie wczytujemy ze standardowego wejścia dane w postaci stringa.

inicjalizacja licznika

pętla wykonująca się dopóki nie zostanie napotkany znak o wartości 0 oznaczający koniec stringa.

 

std::cout << char(midLowerLetter*2 - (text[i] < 'a')*('a'-'A')*2 - text[i++] + 1);

to jest algorytm zamieniający litery na ich "przeciwne".

Och, i muszę to jakoś wytłumaczyć ;d.

 

okej. więc tu jest nie skrócona wersja

std::cout << char(midLowerLetter - (text[i] < 'a')*('a'-'A') + midLowerLetter - (text[i] < 'a')*('a'-'A') - text[i++] + 1);

wyrażenie

midLowerLetter - (text[i] < 'a')*('a'-'A')

oznacza:

jeśli znak jest mniejszy niż 'a' (małe litery alfabetu są w zestawie ASCII po wielkich; ten warunek sprawdza czy jest to wielka litera [zakładam poprawne wejście]) to od midLowerLetter (równe 109, czyli środek zestawu małych liter) o różnicę pomiędzy pierwszą literą małego, a pierwszą literą zestawy wielkich liter

 

wtrącenie; pomoc (tabela znaków w kodowaniu ASCII): http://www.asciitable.com/ łatwiej ogarnąć wizualnie

 

to wyrażenie zwróci wartość środkowego znaku zestawu małych liter jeśli litera do zaszyfrowania jest mała, lub środkowego znaku zestawu wielkich liter jeśli litera do zaszyfrowania jest wielka.

 

pojawia się to 2 razy (więc teraz chyba już wiesz dlaczego można to skrócić do wyżej przedstawionego zapisu). Otrzymujemy w ten sposób dwukrotność wartości środka danego zestawu. Od tego odejmujemy wartość znaku w zmiennej text (przy okazji inkrementując licznik).

 

Ciężko jest mi wytłumaczyć to obliczenie. Najlepiej rozpisz sobie na kartce podstawiając pare przykładowych wartości

Na końcu brzydka konwersja na char w stylu C.

 

Nie jestem najlepszy w tłumaczeniu, ale mam nadzieje, że jest to choć w miare klarowne. W razie czego, postaram się lepiej

Opublikowano

nie działa (chyba, że robi coś innego niż powinien i co ty napisałeś, że robi), kod jest beznadziejny. Napisałem lepszy kod z mam nadzieję dobrym wytłumaczeniem. Jest w poprzednim poście, zedytowałem go. Pytaj śmiało jeśli czegoś dalej nie rozumiesz

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...