Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2010, 16:38   #1
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию "Шифр Цезаря" на СИ, проблема с русским алфавитом

Здравствуйте, у меня такая проблема:
Нужно написать программу которая шифровала бы текстовые файлы аналогично "Шифру цезаря" т.е. дан текстовый файл и число k, каждую букву в текстовом файле заменить на букву которая находится на k позиций впереди )) как то так... Буква Ё не учитывается....
С латинским алфовитом программа работает нормально, а вот с русским что то никак... по идее функция CheckAlpha должна определять что считанный символ это буква, русского или латинского алфавита, с латинским она определяет, т.к там стандартная функция, а вот мои условия ему что то ненравятся, или может я считываю как то покривому... ВОбщем помогите пожалуйста переделать, так чтобы программа работала еще и с русским алфавитом. Заранее благодарен...

Исходный код:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
int CheckAlpha(char ch);
FILE *infile, *outfile;
char Infilename[23];
char Outfilename[23];

int CheckCH(int ch)
{
if ((isalpha(ch))||((ch>='А')&&(ch<='Я '))||
((ch>='а')&&(ch<='п')&&(ch>='р')&&( ch<='я'))) return 1;
return 0;
}

void EnterInfo(int &k, int &wish)
{


printf("The Cipher Program");
printf("\nEnter Input Filename:");
scanf("%s",Infilename);
printf("\nEnter Output Filename:");
scanf("%s",Outfilename);
printf("\nEnter 1 if you wish to encode latin Alphabet");
printf("\nEnter 2 if you wish to decode latin Alphabet");
printf("\nEnter 3 if you wish to encode Russian Alphabet");
printf("\nEnter 4 if you wish to decode Russian Alphabet");
printf("\nEnter your choice here:");
scanf("\n%d",&wish);
printf("Enter k: ");
scanf("\n%d",&k);
}


void Encode(int k,char firstCH,char endCH,int APower)
{
int ch;

if (((outfile=fopen(Outfilename,"w"))= =NULL) ||
((infile=fopen(Infilename,"r"))==NU LL))
{
printf("ERROR: Opening files\n");
exit(-1);
}

while((ch=getc(infile))!=EOF)
{
if (CheckCH(ch)) {
if ((ch>=firstCH)&&(ch<=endCH))
{
ch=firstCH+((ch+k-firstCH)%APower);
fprintf(outfile,"%c",ch);
}
else {
ch=toupper(ch);
ch=firstCH+((ch+k-firstCH)%APower);
fprintf(outfile,"%c",tolower(ch));
}
}
else {
fprintf(outfile,"%c",ch);
}
}
fclose(outfile);
fclose(infile);
}

void Decode(int k,char firstCH,char endCH,int APower)
{
int ch;

if (((outfile=fopen(Outfilename,"w"))= =NULL) ||
((infile=fopen(Infilename,"r"))==NU LL))
{
printf("ERROR: Opening files\n");
exit(-1);
}

while((ch=getc(infile))!=EOF)
{
if (isalpha(ch)) {
if ((ch>=firstCH)&&(ch<=endCH))
{
ch=endCH+((ch-k-endCH)%APower);
fprintf(outfile,"%c",ch);
}
else {
ch=toupper(ch);
ch=endCH+((ch-k-endCH)%APower);
fprintf(outfile,"%c",tolower(ch));
}
}
else {
fprintf(outfile,"%c",ch);
}
}
fclose(outfile);
fclose(infile);
}

void main()
{
int k,wish;
char firstCH, endCH, endch, firstch, APower;
EnterInfo(k,wish);

switch (wish)
{
case 1:firstCH='A'; endCH='Z'; APower=26;
Encode(k,firstCH,endCH,APower);
break;
case 2:firstCH='A'; endCH='Z'; APower=26;
Decode(k,firstCH,endCH,APower);
break;
case 3:firstCH='А'; endCH='Я'; APower=32;
Encode(k,firstCH,endCH,APower);
break;
case 4:firstCH='А'; endCH='Я'; APower=32;
Decode(k,firstCH,endCH,APower);
break;
}


}
Antowka вне форума Ответить с цитированием
Старый 24.01.2010, 21:56   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Цитата:
Код:
((ch>='а')&&(ch<='п')||(ch>='р')&&( ch<='я'))
Кстати, не уверен, что toupper будет корректно работать с русскими буквами
Росли вроде умными, выросли дурнями... (c)А.Васильев

Последний раз редактировалось Greblin; 24.01.2010 в 21:59.
Greblin вне форума Ответить с цитированием
Старый 25.01.2010, 00:20   #3
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
Кстати, не уверен, что toupper будет корректно работать с русскими буквами
Да я вроде проверял, работает... весь прикол что компилятор какбудто непонимает что считывается буква... а в чем ошибка я так и не расдуплил... там вообще таблица аски если выводить числовые значения от А до Я то выводит от -128 до -97 чтоли) почему минус я незнаю... а так если прописать от 128 - 160 вроде то пропишет то же самое от А до Я
Antowka вне форума Ответить с цитированием
Старый 25.01.2010, 00:33   #4
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

Я думал вообще что можно сделать все с массивами алфавитов,но так получится не интересно и помоему долго программа работать будет... Раз уж начал хочу вот так но немогу...
Antowka вне форума Ответить с цитированием
Старый 25.01.2010, 00:50   #5
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

А то, что я выделил, исправили?
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 25.01.2010, 00:56   #6
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
А то, что я выделил, исправили?
а что там исправлять? Я может быть неправильно понял, но строчные буквы русского алфавита в таблице аски разбиты на 2 части от а до п и от р до я, т е условие вроде нормальное маленькая буква может быть или в 1 или во 2 промежутке ...
Antowka вне форума Ответить с цитированием
Старый 25.01.2010, 00:58   #7
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Ну вот именно что ИЛИ, а у Вас там &&, я ж специально красным выделил
------------------------------------------
У Вас там везде стоит && - и где надо &&, и где надо ||. Во всяком случае в первом посте именно так
Росли вроде умными, выросли дурнями... (c)А.Васильев

Последний раз редактировалось Greblin; 25.01.2010 в 01:09.
Greblin вне форума Ответить с цитированием
Старый 25.01.2010, 01:06   #8
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Greblin Посмотреть сообщение
Ну вот именно что ИЛИ, а у Вас там &&, я ж специально красным выделил
Дак ведь от а И до п ИЛИ(||) от р до Я просто я может быть указал не те знаки в условии.... т е я отталкивался от того что А это -128 т е у меня почему-то все русские буквы выводились со знаком минус... хотя в таблице аски вообще значений с минусами нет...
Antowka вне форума Ответить с цитированием
Старый 25.01.2010, 01:11   #9
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

ой прости я затупил )) ты поправил знак а я думал ты выделил его красным типа он неправильно там стоит !) Ок щас попробую... но помоему всеравно работать не будет потому что с большие буквы он тоже не воспринимает...
Antowka вне форума Ответить с цитированием
Старый 30.01.2010, 18:32   #10
Antowka
Пользователь
 
Регистрация: 11.06.2007
Сообщений: 29
По умолчанию

Вот кому может быть надо, конечный вариант ) Правда стиль программирования не фонтан, и какаято некрасивость присутствует )

PHP код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
int CheckAlpha(char ch);
FILE *infile, *outfile;
char Infilename[23];
char Outfilename[23];

int CheckCH(int ch)
{
 if (((
ch>=192)&&(ch<=223))|| ((ch>=224)&&(ch<=255))) return 1;
 return 
0;
}

void CheckFile()
{
 if (((
infile=fopen(Infilename,"r"))==NULL))
                       {
                        
printf("ERROR: Opening file\n");
                        exit(-
1);
                       }
 else if (((
outfile=fopen(Outfilename,"w"))==NULL))
                       {
                        
printf("ERROR: Create files\n");
                        exit(-
1);
                       }
}



void EnterInfo(int &kint &wish)
{
 
printf("The Cipher Program");
 
printf("\nEnter Input Filename:");
 
scanf("%s",Infilename);
 
printf("\nEnter Output Filename:");
 
scanf("%s",Outfilename);
 
printf("\nEnter 1 if you wish to encode Russian Alphabet");
 
printf("\nEnter 2 if you wish to decode Russian Alphabet");
 
printf("\nEnter your choice here:");
 
scanf("\n%d",&wish);
 
printf("Enter k: ");
 
scanf("\n%d",&k);
}


void Encode(int k,int firstCH,int endCH,int APower)
{
 
int chfirstch=firstCH+APower;;

  
CheckFile();
  while((
ch=getc(infile))!=EOF)
 {
  if (
CheckCH(ch)) {
            if ((
ch>=firstCH)&&(ch<=endCH))
             {
              
ch=firstCH+((ch+k-firstCH)%APower);
              
fprintf(outfile,"%c",ch);
             }
            else {
                    
ch=firstch+((ch+k-firstch)%APower);
                    
fprintf(outfile,"%c",ch);
                  }
               }
  else {
    
fprintf(outfile,"%c",ch);
        }
 }
  
fclose(outfile);
  
fclose(infile);
}

void Decode(int k,int firstCH,int endCH,int APower)
{
 
int chendch=endCH+APower;

  
CheckFile();
  while((
ch=getc(infile))!=EOF)
 {
  if (
CheckCH(ch)) {
            if ((
ch>=firstCH)&&(ch<=endCH))
             {
              
ch=endCH+((ch-k-endCH)%APower);
              
fprintf(outfile,"%c",ch);
             }
            else {
                   
ch=endch+((ch-k-endch)%APower);
                   
fprintf(outfile,"%c",ch);
                  }
               } 
  else {
    
fprintf(outfile,"%c",ch);
       }
 }
  
fclose(outfile);
  
fclose(infile);
}

void main()
{
 
int k,wish;
 
int firstCHendCHendchfirstchAPower;
 
EnterInfo(k,wish);

   switch (
wish)
   {
    case 
1:firstCH=192endCH=223APower=32;
        
Encode(k,firstCH,endCH,APower);
        break;
    case 
2:firstCH=192endCH=223APower=32;
        
Decode(k,firstCH,endCH,APower);
        break;
   }

Antowka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 18:47
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
реализация шифрования. шифр Цезаря + Хэш-функция BlackThornGreed Помощь студентам 0 07.06.2009 10:21