Jak napisać program szyfrujący pliki szyfrem gaderypoluki?

Jak napisać program szyfrujący pliki szyfrem gaderypoluki?
WD
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:2
0

Na wstępie tylko nadmienię, że jestem na studiach informatycznych, przerobiliśmy tylko if, for, tablice i switch.

Dostaliśmy polecenie projektu do wykonania.

Napisz program, który koduje plik przy użyciu szyfru gaderypoluki. Szyfr powinien pozwalać na użycie co najmniej 3 słow-kluczy, które mają być wybierane przez switch -t. Program powinien być uruchamiany z konsoli z danymi parametrami: program.exe -i input.txt -o output.txt -t 1.

Całość ma być napisana w C. Nie mam bladego pojęcia czym są te parametry, nie wiem jak przeprowadzać operacje na pikach oraz jak ogólnie miałby wyglądać taki kod.
Wiem, że wygląda to jakbym prosił o gotowe zadanie ale po prostu w tym poleceniu jest strasznie dużo rzeczy, których nie wiem a sytuacja nie rozjaśnia się po czytaniu różnych poradniczków i innych tego typu rzeczy w internecie.

Chciałbym przynajmniej wiedzieć jak się za to zabrać. Proszę o pomoc.

edytowany 4x, ostatnio: flowCRANE
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
0

przerobiliśmy tylko if, for, tablice i switch.

W takim razie nie chce mi się wierzyć, że:

Dostaliśmy polecenie projektu do wykonania.
"Napisz program, który koduje plik przy użyciu szyfru gaderypoluki. Szyfr powinien pozwalać na użycie co najmniej 3 słow-kluczy, które mają być wybierane przez switch -t. Program powinien być uruchamiany z konsoli z danymi parametrami: program.exe -i input.txt -o output.txt -t 1."

WD
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:2
0
kmph napisał(a):

przerobiliśmy tylko if, for, tablice i switch.

W takim razie nie chce mi się wierzyć, że:

Dostaliśmy polecenie projektu do wykonania.
"Napisz program, który koduje plik przy użyciu szyfru gaderypoluki. Szyfr powinien pozwalać na użycie co najmniej 3 słow-kluczy, które mają być wybierane przez switch -t. Program powinien być uruchamiany z konsoli z danymi parametrami: program.exe -i input.txt -o output.txt -t 1."

Gdyby tak nie było to bym tu nie pisał.

JA
  • Rejestracja:prawie 15 lat
  • Ostatnio:dzień
1

Właśnie napisałem ten program za Ciebie, ale oczywiście nie wyślę go, bo to byłoby danie ryby, zamiast wędki. W zamian za to dam parę wskazówek.

Zdefiniuj sobie tablicę kluczy. Później zrób pętlę w której przejdziesz po wszystkich argumentach programu (→ poczytaj o argc i argv w C).
Jeśli napotkasz na "-t", "-i" lub "-o" (→ porównaj argument używając strcmp), to odczytaj argument o indeksie i + 1. W zależności od tego co to jest:

1/ Jeśli to nr klucza, zapisz go jako unsigned int w pewnej zmiennej.
2/ Jeśli to -i, otwórz plik do odczytu (→ fopen) o odpowiedniej nazwie.
3/ jeśli to -o, otwórz plik do zapisu (→ fopen) o odpowiedniej nazwie.

Później wybierz odpowiedni klucz z tablicy kluczy.

Jeśli otwarto obydwa pliki, to wczytaj linia po linii plik do odczytu przez → fgets.
W pętli przejdź po wszystkich znakach. Dla każdego znaku:
1/ przejdź po literkach klucza, iterując co dwa znaki.
2/ Zapisz do zmiennej first znak o parzystym indeksie oraz second → znak o nieparzystym indeksie.
3/ jeśli literka z pliku do odczytu jest równa first, zapisz do pliku second (jeśli second, zapisz first).
4/ jeśli nie udało się znaleźć literki z pliku do odczytu w wybranym kluczu, zapisz literkę z pliku do odczytu bez zmian

Zamknij wszystkie otwarte pliki.

Dla ułatwienia wrzucam mój program z liniami w losowej kolejności (rozsypanka). Może uda Ci się ułożyć z tego program w dobrej kolejności:

Kopiuj
which = 1;
                        fprintf(output_file, "%c", second);
            case '2':
            case '0':
#include <stdio.h>
        "KACEMINUTOWY"
                    char first = key[key_idx];
        char line[1024] = {0};
            i++;
            i++;
            i++;
                    char second = key[key_idx + 1];
            }
            }
                    else if(second == current_char) {
    if(output_file != NULL) {
                if(!substituted) {
                break;
                break;
                break;
                which = 0;
}
            input_file = fopen(argv[i + 1], "r");
        fclose(output_file);
                char current_char = line[idx];
        if(strcmp(argv[i], "-t") == 0 && i < argc - 1) {
                which = 2;
            for(unsigned idx = 0; idx < 1024 && line[idx] != '\0'; ++idx) {
        while(fgets(line, 1024, input_file) != NULL) {
                    fprintf(output_file, "%c", current_char);
    if(input_file != NULL && output_file != NULL) {
        }
        }
        }
        }
#include <stdbool.h>
                }
                }
                for(unsigned key_idx = 0; key_idx < strlen(key) && !substituted; key_idx += 2) {
    }
    }
    }
    }
                bool substituted = false;
    };
        "GADERYPOLUKI",
            output_file = fopen(argv[i + 1], "w");
            default:
    const char *keys[] = {
#include <string.h>
                        substituted = true;
                        substituted = true;
                    if(first == current_char) {
        else if(strcmp(argv[i], "-i") == 0 && i < argc - 1) {
    for(unsigned i = 1; i < argc; ++i) {
int main(int argc, char *argv[])
    if(input_file != NULL) {
    FILE *input_file = NULL, *output_file = NULL;
        else if(strcmp(argv[i], "-o") == 0 && i < argc - 1) {
                return 1;
    const char *key = keys[which];
    return 0;
                printf("Nie znam takiego klucza!\n");
        "POLITYKARENU",
        fclose(input_file);
{
            which = argv[i + 1][0];
            switch(argv[i + 1][0]) {
            case '1':
    unsigned which = 0;
                    }
                    }
                        fprintf(output_file, "%c", first);```
edytowany 1x, ostatnio: jackweb
KM
Wyprzedziłeś mnie... :(
WD
O taką odpowiedź mi chodziło. Dziękuję.
JA
W razie niejasności → pisz na forum :)
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
1

Sam szyfr jest prosty i do zrobienia z takim zasobem umiejętności, ale żeby od kogoś uczonego programowania od podstaw wymagać używania parametrów konsoli i otwierania plików bez wyjaśnienia tego? Nie wiem, może nie nadążam za trybem edukacji.

No dobrze, na szybko:

Otwieranie pliku do czytania:

Kopiuj
FILE *plik_wejsciowy = fopen("nazwa_pliku", "r");

Czytanie z tego pliku:

Kopiuj
char ch;
fscanf(plik_wejsciowy, "%c", &ch)

Czyli dokładnie tak, jak czytasz z konsoli, tylko zamiast scanf(format, zmienne) piszesz fscanf(plik, format, zmienne)

Uwaga: fscanf (jak i scanf) zwraca za każdym razem , do ilu zmiennych udało mu się zapisać. Jeśli plik się skończy, no to fscanf zwróci, że nie udało mu się zapisać (czyli zwróci EOF) Dlatego czytanie z pliku znak po znaku:

Kopiuj
while(fscanf(plik_wejsciowy, "%c",& ch) == 1) {
  //kod
}

Lub:

Kopiuj
while(fscanf(plik_wejsciowy, "%c", &ch) != EOF) {
   //kod
}

Pomijam to ew. problem gdy plik jest w nieodpowiednim formacie (np. chcesz liczbę a masz alsdkjf;slkdj). Gdyż ten problem nie ma tu chyba znaczenia.

Otwieranie pliku do pisania:

Kopiuj
FILE *plik_wyjsciowy = fopen("nazwa_pliku", "w");

Pisanie do tego pliku:

Kopiuj
char ch = 'a';
fprintf(plik_wyjsciowy, "%c", ch);

Szyfr Gaderypoluki:

https://pl.wikipedia.org/wiki/Gaderypoluki

Argumenty konsoli:

Zamiast:

Kopiuj
int main()
{

}

Piszesz:

Kopiuj
int main(int argc, char* argv[])
{

}

argc - liczba przekazanych parametrów, licząc nazwę pliku.

argv - tablica stringów zawierająca parametry. Przy czym argv[0] zawsze zawiera nazwę pliku z programem. argv[1] do argv[argc-1] włącznie to są parametry.

Np przy przykładowym wywołaniu program.exe -i input.txt -o output.txt -t 1 będzie:

argc będzie równe 7
argv będzie zawierało: ["program.exe", "-i", "input.txt", "-o", "output.txt", "-t", "1"]

A więc masz tu stringa "1". Przerzucić go do liczby możesz tak:

Kopiuj
char str[] = "1";
int i = atoi(str);
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
0

Zapomniałem jednego:

Zamykanie pliku:

Kopiuj
fclose(plik);

Czyli np.:

Kopiuj
FILE *plik = fopen("bla.txt", "w");
/// piszemy do pliku
fclose(plik);

Aha, i zakładam też, że plik wejściowy i wyjściowy są różne. Jeśli są te same, to robi się bardziej skomplikowanie.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)