Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 08.04.2016
Сообщений: 21
1

Шифр Цезаря. Чтение аргумента строки

11.04.2016, 11:22. Показов 2531. Ответов 7
Метки си (Все метки)

Author24 — интернет-сервис помощи студентам
Написать программу,которая шифруют сообщение шифром Цезаря.Первый дополнительный параметр—целое число int,сдвиг.Остальные параметры— строка, которую нужно зашифровать. Массив строк склеить в одну строку через пробел.Шифровать следует только буквы английского алфавита(верхний и нижний регистр).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2016, 11:22
Ответы с готовыми решениями:

Шифр Цезаря в Си
Программа осуществляет шифрование текста, написанного латинским алфавитом, по методу Цезаря с...

Шифр Цезаря
Пологаю, все знают о чем идет речь. Вот ссылка если что...

Шифр Цезаря
Добрый день, возникла одна проблема, написал программу зашифровывающую строку шифром Цезаря, но...

Шифр Цезаря. Обратный сдвиг
#include<stdio.h> #include<string.h> int main() { char E = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ...

7
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
11.04.2016, 20:08 2
Вот накидал по простому.
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
#include <stdio.h>
#define is_upper(c)  ((c) >= 'A' && (c) <= 'Z')
#define is_lower(c)  ((c) >= 'a' && (c) <= 'z')
char* cesar_code(int k, char* s);
char* cesar_decode(int k, char* s);
 
 
int main(void){
    char s[] = "ABCDEF Hello World !!! END zero (XYZ)";
    int    k = 15;
 
    printf("source str: %s\n", s);
    printf("coder  str: %s\n", cesar_code(k, s) );
    printf("decode str: %s\n", cesar_decode(k, s) );
    return 0;
}
 
//шифратор
char* cesar_code(int k, char* s){
    int   i;
    char* t = s;
 
    k %= 26;
    if(k < 0)
        k = -k;
 
    for(; *s; ++s){
        if(is_lower(*s)){
            i  = (*s - 'a' + k) % 26;
            *s = 'a' + i;
        } else if(is_upper(*s)){
            i  = (*s - 'A' + k) % 26;
            *s = 'A' + i;
        }
    }
    return t;
}
 
//дешифратор
char* cesar_decode(int k, char* s){
    int   i;
    char* t = s;
 
    k %= 26;
    if(k < 0)
        k = -k;
 
    for(; *s; ++s){
        if(is_lower(*s)){
            i = *s - 'a' - k;
            if(i < 0)
                i += 26;
            *s = 'a' + i;
        } else if(is_upper(*s)){
            i = *s - 'A' - k;
            if(i < 0)
                i += 26;
            *s = 'A' + i;
        }
    }
    return t;
}
Пример работы кода
0
Заблокирован
19.04.2016, 12:46 3
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
void main(int argc,char* argv[])
{                     
    int i,n,l,k;
    char *p=0;
    
    l=0;
    for(i=1; i<argc; i++)
    if(i==1) n=atoi(argv[1]);
    else
    {
        p=realloc(p,l+strlen(argv[i])+(l?2:1));
        p[l]=' ';
        strcpy(p+l+(l?1:0),argv[i]);
        l=strlen(p);
    }
    printf("%s\n",p);
    for(i=0; i<strlen(p); i++) 
    if(p[i]>='A' && p[i]<='Z' || p[i]>='a' && p[i]<='z')
        p[i]=(n+p[i])%256;
    printf("%s\n",p);
    for(i=0; i<strlen(p); i++) 
    {
        k=(256-n+p[i])%256;
        if(k>='A' && k<='Z' || k>='a' && k<='z')
            p[i]=k;
    }
    printf("%s\n",p);
    free(p);
    system("pause");
}
Добавлено через 7 минут
с учетом пользования только аглицкого алфавита все 256 можно убрать
0
0 / 0 / 1
Регистрация: 08.04.2016
Сообщений: 21
20.04.2016, 12:30  [ТС] 4
Данные следует читать из аргументов командной строки, обратное обозна-
чено в варианте. При необходимости проверять количество аргументов и их
формат.

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
#include <stdio.h>
 
 
int main(void)
{
    int k;
    char n;
    scanf("%i %c", &k, &n);
    while (n != 10)
    {
        if (n >= 'a' && n <= 'z')
        {
            n = n + k;
                if(n < 'a')
                    n += 26;
        }
        else
            if(n >= 'A' && n <= 'Z')
        {
            n = n + k;
                if(n < 'A')
                    n += 26;
        }
        printf ("%c", n);
        scanf("%c", &n);
    }
 
      
        return 0;
}
0
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
20.04.2016, 12:51 5
можно поподробней что там обозначено в варианте
0
194 / 193 / 15
Регистрация: 12.12.2010
Сообщений: 270
20.04.2016, 14:10 6
http://lord-n.narod.ru/downloa... 6/0604.htm

Код
#include <stdio.h> 
#include <stdlib.h>  
int main(int argc, char *argv[]) {   
  if(argc!=2) {     
    printf("Вы забыли ввести свое имя.\n");     exit(1);  
  }   
  printf("Привет %s", argv[1]);    
  return 0; 
}
0
0 / 0 / 1
Регистрация: 08.04.2016
Сообщений: 21
21.04.2016, 11:09  [ТС] 7
Нужно проверять количество аргументов, если их недостаточно или слиш-
ком много, то выводить соответствующее сообщение (например, пользо-
ватель обязательно должен указывать команду) с использованием на-
звания программы argv[0].
• Программа должна содержать встроенную справку по командам. Справ-
ка выводится по --help.
О том как избавится от такого повторяющегося кода будет в следующих лабах.
• Если пользователь вводит несуществующую команду, следует его об
этом предупредить.
• Если не указано в варианте, все аргументы для вычислений передаются
через командуню строку.
• Все аргументы для вычислений должны быть соответствующего форма-
та, иначе следует сообщать об ошибке.
1.
• --what выводит строку "Boo says 'WHAT?'".
• --foo вычисляет y = a cos x + b sin x.
• --exp вычисляет y = e^x
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
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
bool streq (char *a, char *b) {
while (*a != '\0' && *b != '\0' && *a == *b) {
a++;
b++;
}
return *a == '\0' && *b == '\0';
 }
void printHelp () {
printf("Доступные команды:\n");
printf("--what\n"
"выводит строку\n"
"Дополнительные аргументы игнорируются\n");
printf("--foo [a] [b] [x]\n"
"Вычисляет значение y = a*cos(x)+b*sin(x)\n");
printf("--help\n"
"Выводит справку\n"
"Дополнительные аргументы игнорируются\n");
printf("--exp [x]\n"
"Вычисляет значение y = exp(x)\n");
}
void printUsage (int argc, char *argv[]) {
printf("Использование: %s [КОМАНДА] [А1] [А2] ... [АN]\n", argv[0]);
printf("Справка по доступным командам: %s --help\n", argv[0]);
exit(EXIT_FAILURE);
}
void what () {
printf("Boo says 'WHAT?'\n");
}
bool parseDouble (char *str, double *result) {
char *end;
double a = strtod(str, &end);
if (end != str && *end == '\0') {
*result = a;
return true;
}
return false;
}
double doParseDouble (char *str, char *param) {
double a;
if (!parseDouble(str, &a)) {
printf("Параметр %s должен быть числом с плавающей точкой\n", param);
exit(EXIT_FAILURE);
}
return a;
}
void foo (int argc, char *argv[]) {
if (argc != 5) {
printf("Использование: %s foo-- [a] [b] [x]\n", argv[0]);
printf("Неверное количество аргументов\n");
exit(EXIT_FAILURE);
}
double a = doParseDouble(argv[2],"a");
double b = doParseDouble(argv[3],"b");                                 double x = doParseDouble(argv[4],"x");
printf("y = %lg\n", a*cos(x) + b*sin(x));
void exp (int argc, char *argv[]) {
if (argc != 4) {
printf("Использование: %s --exp [x]\n", argv[0]);
printf("Неверное количество аргументов\n");
exit(EXIT_FAILURE);
}
double x = doParseDouble(argv[2], "x");
printf("exp = %lg\n", exp(x));
 }
int main (int argc, char *argv[]) {
if (argc < 2) {
printUsage(argc, argv);
}
if (streq(argv[1], "--help")) {
printHelp();
return 0;
} else if (streq(argv[1], "--foo")) {
foo(argc, argv);
return 0;
} else if (streq(argv[1], "--what")) {
what();
return 0;
} else if (streq(argv[1], "--exp")) {
exp(argc, argv);
return 0;
} else {
printf("Неизвестная команда %s\n", argv[1]);
printUsage(argc, argv);
}
 }
}
0
0 / 0 / 1
Регистрация: 08.04.2016
Сообщений: 21
23.04.2016, 06:55  [ТС] 8
Данные следует читать из аргументов командной строки, обратное обозна-
чено в варианте. При необходимости проверять количество аргументов и их
формат.

Написать программу,которая шифруют сообщение шифром Цезаря.Первый дополнительный параметр—целое число int,сдвиг.Остальные параметры— строка, которую нужно зашифровать. Массив строк склеить в одну строку через пробел.Шифровать следует только буквы английского алфавита(верхний и нижний регистр).

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
#include <stdio.h>
 
 
int main(void)
{
    int k;
    char n;
    scanf("%i %c", &k, &n);
    while (n != 10)
    {
        if (n >= 'a' && n <= 'z')
        {
            n = n + k;
                if(n < 'a')
                    n += 26;
        }
        else
            if(n >= 'A' && n <= 'Z')
        {
            n = n + k;
                if(n < 'A')
                    n += 26;
        }
        printf ("%c", n);
        scanf("%c", &n);
    }
 
      
        return 0;
}
0
23.04.2016, 06:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2016, 06:55
Помогаю со студенческими работами здесь

Шифр Цезаря - ошибка в коде
Добрый день похожих вариантов задания было много, но не нашла ответа на свой вопрос. Как все...

Шифр Цезаря выдает Segmentation fault
не работает, помогите разобраться(компилируется без ошибок, но при запуске и вводе ключа шифра...

Шифр Цезаря через командую строку
Здравствуйте.Помогите пожалуйста дописать программу. Вот условие задачи: Программа осуществляет...

Шифр Цезаря. Чтение из файла
Задача заключается в том, что нужно из определенного файла достать текст и расшифровать его или...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru