Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
markzigler
1

Программа для создания анаграм

17.04.2012, 23:26. Просмотров 1526. Ответов 10
Метки нет (Все метки)

Помогите, пожалуйста! Знаю, мозговитых людей здесь много... Думаю, кто-нибудь заинтересуется

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

заранее благодарю.
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2012, 23:26
Ответы с готовыми решениями:

Программа для создания матриц
Задание прикреплено в файле. Вот что я смог написать, прошу, чем проще, тем лучше. лучше с...

Программа для создания словаря
Словарь представляет из себя любые слова и их ID.Я сделал класс Dictionary и методы этого класса...

Программа для создания и управления порталом (наподобие siteedit)
Здравствуйте! Нужно сделать прогу для создания и управления порталом за основу можно взять прогу...

Программа для создания файла и внесения в него данных
Уважаемые компьютерные гении, я начинающий ученик уже больше часа не могу написать действующую...

10
7 / 7 / 0
Регистрация: 19.09.2010
Сообщений: 21
18.04.2012, 16:23 2
А в чём, собственно, проблема?
0
Чайник
69 / 69 / 9
Регистрация: 15.02.2012
Сообщений: 475
18.04.2012, 17:24 3
Ну вот собственно программа для зашифровки
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
  char mass[10], tmp; //ñòðîêà èç 10 ñèìâîëîâ è ïåðåìåííàÿ äëÿ âðåìåííîãî õðàíåíèÿ ñèâîëà
  cout<<"Vvedite stroky: "; 
  for(int i=0;i<10;i++){
  cin>>mass[i];}
  
  for(int i=0;i<9;i+=2){ // öèêûë çàêîí÷èòñÿ êîãäà i=8, òê mass[10]='\0' (ñèìâîë îêîí÷àíèÿ ìàññèâà)
  tmp=mass[i];
  mass[i]=mass[i+1];
  mass[i+1]=tmp;}
  
  cout<<"Zashifrovannaia stroca: ";
  for(int i=0;i<10;i++){
  cout<<mass[i];}
  
  cout<<endl;
  system("PAUSE");  
  return 0;
}
При введеном "hello_word" выдает "ehll_oowdr"
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.04.2012, 18:12 4
Цитата Сообщение от cactus09 Посмотреть сообщение
using namespace std;
Зря вы так пишите, зря-зря-зря.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
#include <algorithm>
 
int main()
{
    std::string str;
    std::cin >> str;
    for (int i = 1; i < (int) str.length(); i += 2)
        std::swap( str[i - 1], str[i] );
        
    std::cout << str;
}
0
Чайник
69 / 69 / 9
Регистрация: 15.02.2012
Сообщений: 475
18.04.2012, 18:21 5
diagon, Не вижу в этом не чего плохого . Я же не использую в программе еще каки-либо назавания которые совподали с пространством имен std, а так каждый раз писать srd:: упаришся
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.04.2012, 18:29 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от cactus09 Посмотреть сообщение
каждый раз писать srd:: упаришся
Заметно.)

Цитата Сообщение от cactus09 Посмотреть сообщение
diagon, Не вижу в этом не чего плохого
А оно есть.
Вот простой(хотя не очень) пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
#include <iterator>
 
int main()
{
    std::vector< int > my_array
    (
        std::istream_iterator< int > (std::cin),
        std::istream_iterator< int > () 
    );
    
    std::cout << my_array.size() << std::endl;
}
Обычная программа, правильно работает.
Но стоит только убрать все std:: и поставить вместо них using namespace std; и она уже не компилируется.
P.S. а чтобы не упариваться, можно изучить метод слепой печати, очень полезная штука в программировании.
1
soon
18.04.2012, 19:24
  #7

Не по теме:

Цитата Сообщение от diagon Посмотреть сообщение
Но стоит только убрать все std:: и поставить вместо них using namespace std; и она уже не компилируется.
С небольшими ухищрениями
компилируется
Bash
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
soon@desktop:~/Src/C++/main$ cat main.cpp && make
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    std::vector< int > my_array
    (
        istream_iterator< int > (::cin),
        istream_iterator< int > () 
    );
    
    cout << my_array.size() << endl;
}
g++ -c -Wall -D_GLIBCXX_USE_NANOSLEEP -O3 --std=gnu++11 main.cpp -o main.o
g++ main.o -lm  -lboost_regex -lboost_filesystem -lboost_system -lboost_timer -lboost_date_time -lboost_thread -o main
soon@desktop:~/Src/C++/main$ cat main.cpp && make
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    std::vector< int > my_array
    (
        move(istream_iterator< int > (cin)),
        istream_iterator< int > () 
    );
    
    cout << my_array.size() << endl;
}
g++ -c -Wall -D_GLIBCXX_USE_NANOSLEEP -O3 --std=gnu++11 main.cpp -o main.o
g++ main.o -lm  -lboost_regex -lboost_filesystem -lboost_system -lboost_timer -lboost_date_time -lboost_thread -o main
soon@desktop:~/Src/C++/main$
:)

1
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.04.2012, 19:41 8
Цитата Сообщение от soon Посмотреть сообщение

Не по теме:

С небольшими ухищрениями

компилируется
Bash
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
soon@desktop:~/Src/C++/main$ cat main.cpp && make
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    std::vector< int > my_array
    (
        istream_iterator< int > (::cin),
        istream_iterator< int > () 
    );
    
    cout << my_array.size() << endl;
}
g++ -c -Wall -D_GLIBCXX_USE_NANOSLEEP -O3 --std=gnu++11 main.cpp -o main.o
g++ main.o -lm  -lboost_regex -lboost_filesystem -lboost_system -lboost_timer -lboost_date_time -lboost_thread -o main
soon@desktop:~/Src/C++/main$ cat main.cpp && make
#include <iostream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    std::vector< int > my_array
    (
        move(istream_iterator< int > (cin)),
        istream_iterator< int > () 
    );
    
    cout << my_array.size() << endl;
}
g++ -c -Wall -D_GLIBCXX_USE_NANOSLEEP -O3 --std=gnu++11 main.cpp -o main.o
g++ main.o -lm  -lboost_regex -lboost_filesystem -lboost_system -lboost_timer -lboost_date_time -lboost_thread -o main
soon@desktop:~/Src/C++/main$
:)

Не по теме:


Во втором листинге можно move убрать(скобки оставить), но не в этом суть.
Я много раз использовал такой конструктор, но при этом даже не подозревал, как близко лежат грабли. И все это благодаря банальному стилю >_<''

1
172 / 169 / 19
Регистрация: 31.08.2010
Сообщений: 569
08.05.2012, 17:36 9
Цитата Сообщение от diagon Посмотреть сообщение
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector< int > my_array
(
std::istream_iterator< int > (std::cin),
std::istream_iterator< int > ()
);
std::cout << my_array.size() << std::endl;
}
Обычная программа, правильно работает.
Но стоит только убрать все std:: и поставить вместо них using namespace std; и она уже не компилируется.
P.S. а чтобы не упариваться, можно изучить метод слепой печати, очень полезная штука в программировании.
На самом деле данную программу можно переписать по-другому, чтобы была понятна ошибка и особенность данной ошибки, точнее 2 ошибки (опишу далее):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <iterator>
 
using std::vector;
using std::cout;
using std::endl; 
 
using std::istream_iterator;
 
int main()
{
  vector<int> vec(istream_iterator<int>(std::cin), istream_iterator<int>());
  cout << vec.size() << endl;
 
  return 0;
}
Данный код нормально компилируется, но если мы опустим std у cin, то смысл данной строки кардинально изменится:

в данном случае будет определяться функция vec, возвращающая тип vector<int>. Функция vec получает два параметра:
  • Первый параметр, cin, относится к типу istream_iterator<int>. Лишние круглые скобки вокруг cin игнорируются. Т.е. cin это пользовательская переменная, которая приводится к типу istream_iterator<int>, а не библиотечный std::cin
  • Второй параметр не имеет имени. Он относится к типу указателя на функцию, которая вызывается без параметров и возвращает istream_iterator<int>

Если мы используем std::cin, то компилятор знает, что это не пользовательская переменная и все идет как надо, т..е мы здесь инициализируем вектор.

Лучшим решением данной проблемы будет либо использование круглых скобок в первом параметре, при этом отпадает необходимость следить за std в cin и в других стандартных операторах:

C++
1
vector<int> vec((istream_iterator<int>(std::cin)), istream_iterator<int>());
и если здесь мы опустим std, то компилятор нам выдаст ошибку, что оператор cin не определен в данной области видимости, что потребует отдельного включения определения using, например так:

C++
1
2
using std::cin;
vector<int> vec((istream_iterator<int>(cin)), istream_iterator<int>());
Вторым решением (более предпочтительным) является использование именованных итераторов вместо анонимных:
C++
1
2
3
4
using std::cin;
istream_iterator<int> dataBegin(cin);
istream_iterator<int> dataEnd;
vector<int> vec((dataBegin, dataEnd);
Более подробно о данной проблеме можете ознакомиться в книгах
  1. "Мейерс С. Эффективное использование STL. Библиотека программиста" Совет 6. Остерегайтесь странностей лексического разбора C++
  2. "Герб Саттер Решение сложных задач на С++". Задача 10.1. Инициализация. Часть 1
1
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.05.2012, 18:12 10
TheAthlete, однако долго же вы думали >_<''
Этот баг(хорошо, фича) взят из книги Саттера "Новые сложные задачи на с++".
У него это неплохо описано, в частности, там объясняется, что эта проблема появилась из-за совместимости с С.
И, кстати, вы не учли третье решение - явно указывать пространство имен. Оно же наилучшее.
0
172 / 169 / 19
Регистрация: 31.08.2010
Сообщений: 569
08.05.2012, 18:21 11
Цитата Сообщение от diagon Посмотреть сообщение
TheAthlete, однако долго же вы думали >_<''
я этот топик только увидел

В контексте данной задачи лучше объявлять именованные переменные итераторов. Как раз в вышеупомянутой книге вместо std::cin передается объект dataFile и использовать пространства имен будет неуместно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 18:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Программа для создания шрифтов
Всем доброго времени суток. Планирую на C++ Builder создать программу для работы со шрифтами...

Программа для создания тестов
Подскажите а то вообще не понимаю с чего начать Помогите позарез нужно Короче нужна такая...

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

Программа для создания анкоров
Всем привет. Создал программу по созданию анкоров. Выложил на одном из форумов, но сказали, что...

Программа для создания видеоуроков
Нужна программа которая может записывать видео с экрана, делать скриншоты. Желательно возможность...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.