![]() |
|
Модераторы: Poseidon |
![]()
|
|
| vipclient |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.1.2009 Репутация: нет Всего: нет |
вот сама задача
Задача 1.18. "ШИФРОВАНИЕ ОБРАТНОЙ ПЕРЕСТАНОВКОЙ БИТОВ". Вводится последовательность строк символов не длиннее 46 символов. Допустимые символы в строке - латинские буквы, цифры, знаки препинания и пробел. Окончание входного потока - ввод строки, начинающейся с символа "?". Максимальное количество строк равно 7. Шифрование состоит в том, что в двоичном коде каждого символа (байте) биты переставляются в обратном порядке, а затем бит 7 устанавливается в 0/1 при не/четном количестве 1-битов в байте, формируя код зашифрованного символа. Формируется также статистическая информация. Примерный вид выходной информации: Входной текст: (последовательность входных строк) Введено К строк, всего N символов, минимальная длина строки М1 символов. максимальная длина строки М2 символов. Получен шифрованный текст: (последовательность обработанных строк ну вот допустим я все строки записал в масивы,а каждый элемент этого массива это символ. вопрос:что делать дальше?как выдрать из него биты поменять их местами,а затем запихнуть обратно? можете код набросать или сказать алгоритм Добавлено через 8 минут и 47 секунд язык программы просто СИ |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 2 Всего: 162 |
Для домашних заданий, курсовых, существует "Центр Помощи".
Тема перенесена! |
|||
|
||||
| airyashov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
есть волшебные операции << >> && ||
-------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
| vipclient |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.1.2009 Репутация: нет Всего: нет |
про << >> && || я знаю,но кто бы мог помочь составить алгоритм переварачивания битов???????
|
|||
|
||||
| solverr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 31.12.2008 Репутация: 1 Всего: 1 |
проверка того, что в x установлен i-й бит: if (x&(1<<i)) { ... }
установка i-го бита: x |= 1<<i; сброс i-го бита: x &= ~(1<<i); |
|||
|
||||
| vipclient |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.1.2009 Репутация: нет Всего: нет |
всё,вот какойкод я написал
#include <STDIO.H> #include<CONIO.H> #include <STRING.H> void Title ( void ); void refer( void ); void OutRez( void ); void GetStrings( void ) ; int YesNo( char *query ); void Finish( void ); /* числовые костынты */ #define MAXLINE /*Максимальное количество строк*/ #define MAXSIM /*Максимальное количество символов в строке*/ /* строки константы */ char *NAME = "Шифрование строк"; char *START = "\nВходной текст : "; char *NUMBERS = "минимальна длина строки = %d символов, максимальна длина строки = %d бсимволов"; char *FINAL = "Работа закончена!"; char *QUERY = "Повторить?"; char *OUTMSG = "Введено = %d строк, вего символов = %d"; char *OUTMSG2 = "Получен шифрованный текст : "; /* Глобальные переменные*/ int i, /*щётчик для символов*/ k, /*щётчик для строк*/ j, /*щётчик обрабатываемых строк строк */ p, /*максимальное количество символов в строке*/ kolvo[6], /*Массив для значений длин строк */ count, /*Показатель чётности */ Lenth, /*Длина текущей строки */ m, /*количество введённых строк */ min ; /*минимальное количество символов в строке */ char bits[64][64]; /*массив дл хранени зашифрованных строк */ char V[64][64]; /*массив дл хранени всех введённых строк */ char Strin[64]; /*массив дл хранени текущей вводимой строки */ void main( void ) { do { Title(); GetStrings(); refer(); OutRez(); } while ( YesNo( QUERY ) ); Finish(); } void Title( void ) /***** Вход: Нет. Действие: С новой строки выводит строку NAME. Выход: Нет. *****/ { clrscr(); printf( "\n%s",NAME ); } void GetStrings( void ) /***** Вход: Нет. Действие: получени входного текста от пользовател. Выход: нет. *****/ { printf(START); k = 0 ; while( k < MAXLINE - 1 || Strin[0] != '?' ) { m = k ; printf( "\n"); scanf("%s",Strin); kolvo[k] = Lenth ; if ( p < Lenth ) { p = Lenth ; } min = Lenth ; if ( min > Lenth && Strin[0] != '?' ) { min = Lenth ; } if (Strin[0]=='?') { Lenth = 64 ; m = k ; k = 8 ; } for (i = 0 ; i < Lenth ; i++) { V[k][i] = Strin[i] ; } k = k++ ; } } void refer ( void ) /***** Вход: Нет. Действие: Шифрование полученного текста. Выход: Нет. *****/ { fflush(stdin); k = 0 ; for (k = 0 ; k < 7 ;k++) { for (j = 0 ; j < kolvo[i] ; j++ ) { bits[k][j] = V[k][j] & 0177 ; bits[k][j] = ((bits[k][j] & 0x0F) << 4) | ((bits[k][j] & 0xF0) >> 4); bits[k][j] = ((bits[k][j] & 0x33) << 2) | ((bits[k][j] & 0xcc) >> 2); bits[k][j] = ((bits[k][j] & 0x55) << 1) | ((bits[k][j] & 0xaa) >> 1); count = 0; for (i = 1; i <= 16; i++) {if ( ((bits[k][j] >> i) & 0x1) == 0x1) {count = count ^ 0x1;}} if ( count == 1 ) ( bits[k][j] = bits[k][j] | 1 ); else if ((bits[k][j] | 1) == bits[k][j]) ; else bits[k][j] =( bits[k][j] + 1) ; } } } void OutRez (void) /***** Вход: Нет. Действие: Вывод статистической информации,вывод зашифрованого текста. Выход: Нет. *****/ { for ( i = 0 ; i < m ; i++ ) { kolvo[0] = kolvo[0] + kolvo[i+1]; } printf("\n"); printf(OUTMSG,m,kolvo[0] - 1); printf("\n"); printf(NUMBERS,min,p); printf("\n"); printf(OUTMSG2); for ( k = 0 ; k < m ; k++) { kolvo[i] = 0 ; printf("\n"); for ( i = 0 ; i < p ; i++ ) { printf("%c",bits[k][i] ) ; } } } int YesNo(char *msg) /***** Вход: Текст запроса типа "Да/Нет". Действие: С новой строки выводит текст запроса на экран, добавляет "[Y/N]" и ожидает реакции пользователя. Выход: Возвращает 1 при нажатии клавиши 'y' или 'Y', иначе 0. *****/ { int c ; printf("\n%s[Y/n]",msg); fflush( stdin ); c = getchar(); if ( (c== 'y') || (c== 'Y') ) return 1; else return 0; } void Finish ( void ) /***** Вход: Нет. Действие: С новой строки выводится строка FINAL. Выход: Нет. *****/ { printf("%s",FINAL); } |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |