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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
markzigler
Сообщений: n/a
#1

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

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

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

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

заранее благодарю.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Venteux
7 / 7 / 1
Регистрация: 19.09.2010
Сообщений: 21
18.04.2012, 16:23     Программа для создания анаграм #2
А в чём, собственно, проблема?
cactus09
Чайник
69 / 69 / 4
Регистрация: 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"
diagon
Higher
1922 / 1188 / 49
Регистрация: 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;
}
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
18.04.2012, 18:21     Программа для создания анаграм #5
diagon, Не вижу в этом не чего плохого . Я же не использую в программе еще каки-либо назавания которые совподали с пространством имен std, а так каждый раз писать srd:: упаришся
diagon
Higher
1922 / 1188 / 49
Регистрация: 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. а чтобы не упариваться, можно изучить метод слепой печати, очень полезная штука в программировании.
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$

diagon
Higher
1922 / 1188 / 49
Регистрация: 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 убрать(скобки оставить), но не в этом суть.
Я много раз использовал такой конструктор, но при этом даже не подозревал, как близко лежат грабли. И все это благодаря банальному стилю >_<''

TheAthlete
151 / 151 / 12
Регистрация: 31.08.2010
Сообщений: 529
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
diagon
Higher
1922 / 1188 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
08.05.2012, 18:12     Программа для создания анаграм #10
TheAthlete, однако долго же вы думали >_<''
Этот баг(хорошо, фича) взят из книги Саттера "Новые сложные задачи на с++".
У него это неплохо описано, в частности, там объясняется, что эта проблема появилась из-за совместимости с С.
И, кстати, вы не учли третье решение - явно указывать пространство имен. Оно же наилучшее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2012, 18:21     Программа для создания анаграм
Еще ссылки по теме:

C++ Программа для создания и управления порталом (наподобие siteedit)
C++ Набор для создания 3d игр
Литература для создания элементарного языка управляющих сигналов и интерпретатора для него C++
Программа для создания матриц C++
Интерфейс для создания приложения C++

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

Или воспользуйтесь поиском по форуму:
TheAthlete
151 / 151 / 12
Регистрация: 31.08.2010
Сообщений: 529
08.05.2012, 18:21     Программа для создания анаграм #11
Цитата Сообщение от diagon Посмотреть сообщение
TheAthlete, однако долго же вы думали >_<''
я этот топик только увидел

В контексте данной задачи лучше объявлять именованные переменные итераторов. Как раз в вышеупомянутой книге вместо std::cin передается объект dataFile и использовать пространства имен будет неуместно.
Yandex
Объявления
08.05.2012, 18:21     Программа для создания анаграм
Ответ Создать тему
Опции темы

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