Форум программистов, компьютерный форум CyberForum.ru

С++ шифр цезаря, пожалуйста, 5ый час бьюсь - C++

Восстановить пароль Регистрация
 
arigatu
1 / 1 / 0
Регистрация: 06.12.2012
Сообщений: 12
06.12.2012, 11:48     С++ шифр цезаря, пожалуйста, 5ый час бьюсь #1
Доброго времени суток всем! Помогите пожалуйста! никак не пойму, что нужно сделать и как это реализовать
https://github.com/Markoutte/pla3-eltech вот ссылка на задание, а вот мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <string.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <getopt.h>
#include <vector>
#define _Z 'z'
#define _A 'a'
using namespace std;
string input;
int shift;
int length;
void codeString(){
   for (int i = 0; i < length; i++){
        if (isalnum(input[i])){
           input[i] = tolower(input[i]);
           for (int j = 0; j < shift; j++){
               if (input[i] == _Z){
                  input[i] = _A;
               }
               else
               input[i]++;
           }
        }
    }
}
void printString(){
cout << "\nResult:  " << input << endl;
}
void getString (){
    char* doc = new char;
    cout << "Enter FILENAME: ";
    cin >> doc;
    ifstream str(doc);
    if (str.fail()){
       cout << "Can't open file: " << doc << endl;
       system("pause");
       exit(1);
    }
    delete doc;
    while (getline(str, input));
    length = (int)input.length();
}
int main(){
    getString();
    cout << "Enter SHIFT: ";
    cin >> shift;
    codeString();
printString();
    system("pause");
    return 0;
}
Каким образом добиться того, чтобы программа запусказалась из командной строки при помощи параметров, указанных в задании?

ИЛИ есть вариант переписать код, найденный в интернете, но этот код очень хитрый P.S. Тому, кто поможет переписать код, могу кинить 100руб на интернет-кошелек, просто необходимо сдать программу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <string.h>
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <getopt.h>
#include <vector>
 
using namespace std;
//функция для вывода помощи
void printHelp()
{
    printf ("%s\n","$ crypt [options] <key> <source> [<dest>]");
    printf ("%s\n","options:");
    printf ("%s\n","-a, alphabet=<alphabet>  alphabet — алфавит для работы алгоритма (по умолчанию содержит буквы из латниского алфавита и цифры: AaBbCc..Zz0..9)");
    printf ("%s\n","-t, type=<type>          type может быть 'encode' или 'decode', по умолчанию — encode");
    printf ("%s\n","-h, help                 выводит эту справку");
    printf ("%s\n","key:");
    printf ("%s\n","ключ для шифрования/дешифрования");
    printf ("%s\n","source:");
    printf ("%s\n","исходный файл для шифрования/дешифрования");
    printf ("%s\n","dest:");
    printf ("%s\n","файл, куда будет записан новый, зашифрованный текст. Если не указан, то переписывает source");
}
//function printing error by code
void printError(int code)
{
    switch(code)
    {
        case 1: printf("%s\n", "Invalid options"); break;
        case 2: printf("%s\n", "Wrong key, or invalid source");break;
        case 3: printf("%s\n", "File doesnt exist");break;
        default : printf("%\ns", "Error, what are you doing? Try -h"); break;
    }
}
 
int main(int argc, char *argv[])
{
    //if too many or not too much parameters call error
    if (argc<2||argc>8)
    {
        printError(1);
        return 0;
    }
    //what we do with file:
    //0 - encode, 1 - decode, by default - encode
    bool type = 0;
    //special alphabet, default value is /0
    string alphabet = "/0";
    //next variables, use in getopt_long
    //structure that determine options
    const struct option longOptions[] =
    {
        //long option return his short analogue
        {"alphabet", required_argument, NULL, 'a'},
        {"type", required_argument, NULL, 't'},
        {"help", no_argument, NULL, 'h'},
        {NULL,0,NULL,0}
    };
    //variable determine short options
    const char * shortOptions = "a:ht:";
    int longIndex;
    int option;
    //while all options isnt check, finding options
    while ((option = getopt_long(argc, argv, shortOptions, longOptions, &longIndex)) != -1)
    {
        switch (option)
        {
            //if user need help print it, close program
            case 'h':printHelp();return 0; break;
            case 't':
                        {
                            //if type is decode type = TRUE, else if type isnt encode call error
                            if (strcmp(optarg, "encode")==0||strcmp(optarg, "decode")==0)
                            type = strcmp(optarg, "decode")==0;
                            else {printError(1); return 1;} break;
                        }
            case 'a':
                        {
                            //if using special alphabet put it in alphabet variable
                            if(optarg != NULL) alphabet = optarg;
                            else {printError(1); return 1;} break;
                        }
        }
    }
        //if number of options is 1, and help
        //isnt close program above, close program
        if (argc==2) {printError(1); return 1;}
        //imagine that options contain destination path, source and key
        char * dest = argv[argc-1];
        char * source = argv[argc-2];
        char * key = argv[argc-3];
        //if we have key, call error
        if ((atoi(source)==0)&&(atoi(key)==0))
        {
            printError(1);
            printf("\n");
            printError(2);
            return 2;
        }
   //key == padding
int padding;
atoi(key)==0 ? padding = atoi(source):padding = atoi(key);
   //check key is not negative value
if (padding<0) {printError(2);return 0;}
   //if need decode make key negative
type == 1 ? padding = padding*(-1):0;
 
char *inputName = source;
char *outputName = dest;
   //if we havent destination save in the same file
if (atoi(key)==0)
{
inputName = outputName;
}
 
FILE *input,*output;
input = fopen(inputName, "rb");
 
if (input == NULL) {printError(3); return 3;}
char lib;
   //buffer contain input file
vector <char> buffer;
   //checking alphabet
   //return: 0 - no special alphabe, 1 - use special
bool specAlphabet = (alphabet != "/0");
   //reading file and apply crypting
while (!feof(input))
{
fread (&lib ,sizeof(char) , 1, input);
if (feof(input)) break;
        //if using special alphabet, and current letter
        //should not change go to the next
if (specAlphabet&&alphabet.find(lib,0)==-1) {buffer.push_back(lib); continue;}
        //type is character range by code
int type = -1;
        // character in 0..9 range
lib >= 48 ? type++:0;
        //A..Z
lib >= 65 ? type++:0;
        //a..z
lib >= 97 ? type++:0;
        //keep only letters or digits and crypt
switch (type)
{
            //encode formula:
            // y == (x + k) % n
            //decode formula:
            //x = = (y - k + n) % n
case 0: lib <= 57 ? lib =48+(int(lib)-48+padding+10*type)%10 : 0;break;
case 1: lib <= 90 ? lib =65+(int(lib)-65+padding+26*type)%26 : 0;break;
case 2: lib <= 122 ? lib =97+(int(lib)-97+padding+26*type)%26 : 0;break;
}
buffer.push_back(lib);
    }
    fclose(input);
    output = fopen(outputName, "wb");
    int size = (int) buffer.size();
    for (int i =0;i < size; i++) fwrite(&buffer[i],sizeof(char),1,output);
   return 0;
}
Добавлено через 11 часов 6 минут
хоть кто-нибудь, помогите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 11:48     С++ шифр цезаря, пожалуйста, 5ый час бьюсь
Посмотрите здесь:

Шифр Цезаря C++
C++ Шифр Цезаря
Шифр Цезаря C++
C++ Шифр Цезаря
Шифр цезаря C++
C++ Шифр цезаря на кириллице
C++ Шифр Цезаря C++
C++ Шифр Цезаря

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему

Метки
5ый, бьюсь, цезаря, час, шифр
Опции темы

Текущее время: 01:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru