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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
#1

Почему не взяли на обучение в CQG, на сайте нашел испытательное задание, сделал и отослал. Не взяли и не объяснили почему. Хочу услышать мнения. - C++

10.10.2011, 16:16. Просмотров 1511. Ответов 17
Метки нет (Все метки)

/ Программа получает на вход текстовый файл и расшифровывает его первую строчку получая ключ.
//



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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include "stdafx.h"
//Запрещенные биграммы, т.е. для буквы А запрещено Q и т.д. Биграммы взяты из книги А.П.Алферов "Основы криптографии". это быиграммы запрещены для литературно текста. 
char A[1]={'Q'};
char B[15]={'B','C','D','F','G','H','K','M','N','P','Q','V','W','X','Z'};//запрещенные биграммы вида: 'BB' и т.д.
char C[11]={ 'B', 'F', 'G', 'J', 'N', 'Q',  'S', 'V', 'W', 'X','Z'};
char D[4]={  'J', 'Q',  'X', 'Z'};
char E[1]={'Z'};
char F[2]={'K','Z'};
char G[5]={'J','K','V','X','Z'};
char H[8]={'D','J','K','L','V','X','Z','Q'};
char I[4]={'I','J','W','Y'};
char J[21]={ 'B', 'C', 'D',  'F', 'G', 'H',  'J', 'K', 'L', 'M', 'N', 'P','Q', 'R', 'S', 'T',  'V', 'W', 'X', 'Y','Z'};
char K[18]={ 'B', 'C', 'D',  'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','P','Q', 'R',  'V', 'W', 'X', 'Z'};
char L[3]={'V','X','Z'};
char M[9]={'D','F','G','J','K','L','V','X','Z'};
char N[1]={'Z'};
char O[4]={'J','K','Q','X'};
char P[12]={ 'C', 'D',  'F', 'G',  'J', 'K',  'N', 'Q',  'V', 'W',  'Y','Z'};
char Q[25]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T',  'V', 'W', 'X', 'Y','Z'};
char R[3]={'Q','X','Z'};
char S[3]={'K','X','Z'};
char T[4]={'K','Q','X','Z'};
char U[7]={'H','J','U','W','X','Y','Z'};
char V[20]={ 'B', 'C',  'F', 'G', 'H',  'J', 'K', 'L', 'M', 'N',  'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Z'};
char W[13]={'D','F','G','J','K','P','Q','R','U','V','X','Y','Z'};
char X[18]={ 'B',  'D', 'E',  'G', 'H',  'J', 'K', 'L', 'M', 'N', 'Q', 'R', 'S',  'U', 'V',  'X', 'Y','Z'};
char Y[7]={'J','K','U','V','X','Y','Z'};
char Z[24]={ 'B', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z'};             
//Английский алфавит
char EngAlphabet[26]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P','Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y','Z'};
int Search1(char KOL[],int n);//функция предназначенная для отбрасывания неправильных переводов
int Search(char m);//функция для поиска индекса буквы в ангийском алфавите
int Search2(char k[], char n,int m);//функция поиска запрещеных биграм, если биграмма запрещена возвращает 1
void main()
{
        
                
        string name;//название файла
        cout<<"Enter name file"<<endl;
        cin>>name;
        FILE * shifr;
    char str[100000];
        shifr = fopen (name.c_str() , "r");
        if (shifr != NULL) //если файл открылся
        {
                fgets(str,sizeof(str),shifr); 
        
     }
        else
        {
                cout<<"File not open"<<endl;
        }
        
         
         for(int i=0;str[i];i++)
        {
                str[i]=toupper(str[i]);//преводим в верхний регистр
        }
         int n=strlen(str);
         char *rashifr=new char[n];//массив для расшифрованного текста
        for(int k=1;k<26;k++)//перебираем все возможные ключи
         {
                 for(unsigned int i=0;i<strlen(str);i++)//расшифровываем текст с ключем к
                 {
                         if(str[i]>='A'&&str[i]<='Z')
                         {
                                 int h=Search(str[i]);
                                 if(h-k<0)h+=26;
                                 int num=(h-k)%26;
                                 
                                 rashifr[i]=EngAlphabet[num];
                                 
 
                         }
                         else
                         {
                                 rashifr[i]=str[i];
                         }
                        
                 
                
                 }
                 
                if(Search1(rashifr,n)==0)//если запрещенных биграмм нет то функция возвратит 0
                {
                        cout<<"Possible variant:"<<endl;
                         for(unsigned int i=0;i<n;i++)
                                cout<<rashifr[i];//расшифровка не имеющая запрещенных биграмм
                         
                         cout<<"Key:"<<k<<endl;//возможный ключ
                }
        }
}
        
         int Search(char m)
         {
                 for(int i=0;i<26;i++)
                 {
                         if(m==EngAlphabet[i])
                         {
                                 return i;//возвращает индекс буквы m в английском алфавите
                         }
                        }
                 return -1;
         }
         int Search2(char k[], char n,int m)
         {
                
                 for(unsigned int i=0;i<m;i++)
                 {
                         if(n==k[i])//если запрещенная биграмма найдена
                         {
                                 return 1;
 
                         }
                         
                 }
                 return 0;
 
         }
         
         int Search1(char KOL[],int n)
         {
                 
                 
                        int f=0;
                 int m=0;
                 for(int i=0;i<n;i+=2)//начинаем просматривать расшифровку по биграммам
                 {
                        
                        
                        if(KOL[i+1]!=' '||KOL[i+1]!='_'||KOL[i+1]!=','||KOL[i+1]!='.'||KOL[i+1]!='?'||KOL[i+1]!='!'){//если вторая буква в биграмме не . или не , или не ! или не ? или не _
                        char name=KOL[i];//название массива
                        
                        switch(name)
                        {
                        case 'A':m=1; if(Search2(A,KOL[i+1],m)>0){f++;} break;//если в массиве А найдена запрещенная биграмма прибавляем f;
                                case 'B': m=15;if(Search2(B,KOL[i+1],m)>0){f++;} break;
                                        case 'C': m=11;if(Search2(C,KOL[i+1],m)>0){f++;}break;
                                                case 'D':m=4; if(Search2(D,KOL[i+1],m)>0){f++;}break;
                                                        case 'E':m=1; if(Search2(E,KOL[i+1],m)>0){f++;}break;
                                                                case 'F':m=2; if(Search2(F,KOL[i+1],m)>0){f++;}break;
                                                                        case 'G':m=5; if(Search2(G,KOL[i+1],m)>0){f++;} break;
                                                                                case 'I':m=4;if(Search2(I,KOL[i+1],m)>0){f++;} break;
                                                                                        case 'J':m=21;if(Search2(J,KOL[i+1],m)>0){f++;} break;
                                                                                                case 'H':m=8; if(Search2(H,KOL[i+1],m)>0){f++;;}break;
                        
                        case 'K':m=18; if(Search2(K,KOL[i+1],m)>0){f++;}break;
                                case 'L':m=3; if(Search2(L,KOL[i+1],m)>0){f++;}break;
                                        case 'M':m=9; if(Search2(M,KOL[i+1],m)>0){f++;}break;
                                                case 'N':m=1; if(Search2(N,KOL[i+1],m)>0){f++;}break;
                                                        case 'O':m=4; if(Search2(O,KOL[i+1],m)>0){f++;}break;
                                        
                        case 'P':m=12; if(Search2(P,KOL[i+1],m)>0){f++;}break;
                        case 'Q':m=25; if(Search2(Q,KOL[i+1],m)>0){f++;}break;
                                case 'R':m=3; if(Search2(R,KOL[i+1],m)>0){f++;}break;
                                        case 'S':m=3; if(Search2(S,KOL[i+1],m)>0){f++;}break;
                                                case 'T':m=4; if(Search2(T,KOL[i+1],m)>0){f++;}break;
                                                        case 'U':m=7; if(Search2(U,KOL[i+1],m)>0){f++;}break;
                                                                case 'V':m=20; if(Search2(V,KOL[i+1],m)>0){f++;}break;
                                                                        case 'W':m=13; if(Search2(W,KOL[i+1],m)>0){f++;}break;
                        case 'X':m=18; if(Search2(X,KOL[i+1],m)>0){f++;}break;
                                case 'Y':m=7; if(Search2(Y,KOL[i+1],m)>0){f++;}break;
                                        case 'Z':m=24; if(Search2(Z,KOL[i+1],m)>0){f++;}break;
                        }
 
                        }
                 }
                return f;//возвращаем количество запрещенных биграм, если таковых нет фозвращаем 0
         }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2011, 16:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не взяли на обучение в CQG, на сайте нашел испытательное задание, сделал и отослал. Не взяли и не объяснили почему. Хочу услышать мнения. (C++):

Создал калькулятор, хочу услышать мнения - C#
Всем привет. Мне было поставлено задание создать калькулятор, банальное задание но все же, оцените код. Мне кажется он слегка...

Хочу услышать Ваши мнения о данной сборке - Игровой компьютер
Доброго времени суток! Планирую собрать комп на след. Комплектующих: Корпус- corsair graphite 780t Бп-corsair hх 850i Проц- i7...

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

Не понятно откуда взяли числа - C++
Здорова! Есть код: // computer-generated x-y coordinates for 60 points around a circle const int Cex25cView::nX = { 0, 105,...

Сколько бы вы взяли за такой запрос? - SEO
колеблюсь - не знаю что сказать заказчику: запрос -медицинская одежда причем только два слова. он как бы среднечастотный - но даже не...

с отрезка [-1,1] наугад взяли два числа - Теория вероятностей
С отрезка наугад взяли два числа. Какая вероятность того, что их сумма будет больше нуля, а произведение меньше нуля ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
10.10.2011, 16:29 #2
Цитата Сообщение от nikola166 Посмотреть сообщение
#include "stdafx.h"
Ух ты, намертво к студии привязываем?
Цитата Сообщение от nikola166 Посмотреть сообщение
int Search1(char KOL[],int n);//функция предназначенная для отбрасывания неправильных переводов
int Search(char m);//функция для поиска индекса буквы в ангийском алфавите
int Search2(char k[], char n,int m);//функция поиска запрещеных биграм, если биграмма запрещена возвращает 1
Название функции должно говорить за себя, а не комментарий.
Цитата Сообщение от nikola166 Посмотреть сообщение
cout<<"Enter name file"<<endl;
Английский хромает?
Цитата Сообщение от nikola166 Посмотреть сообщение
cin>>name;
FILE * shifr;
А почему в коде С++ используются сишные структуры для работы с файлами, где потоки?
Цитата Сообщение от nikola166 Посмотреть сообщение
char str[100000];
Нехило ты со стеком работаешь с размахом...
Цитата Сообщение от nikola166 Посмотреть сообщение
if (shifr != NULL) //если файл открылся
{
fgets(str,sizeof(str),shifr);
}
else
{
cout<<"File not open"<<endl;
}
проверку в функцию с говорящим названием (если так сильно хочется откомментить свою строчку), во-вторых, у тебя файл не открылся, но ты вывел сообщение и пошел дальше программу выполнять, как будто ниче не было... Ладно бы еще сообщение было правильное. Если языка на знаешь, то зачем выпендриваться? А если выпендриваешься, то почему комментарии на русском?

P. S. дальше смотреть не хочется, скучно...
nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
10.10.2011, 17:19  [ТС] #3
не выпендривался я не перед кем
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
10.10.2011, 17:25 #4
Цитата Сообщение от nikola166 Посмотреть сообщение
не выпендривался я не перед кем
ну а в чем тогда смысл писать по-английски, когда коменты в проге на русском?
nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
10.10.2011, 17:32  [ТС] #5
просто не задумывался даже над этим
Vourhey
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
10.10.2011, 17:35 #6
Цитата Сообщение от nikola166 Посмотреть сообщение
просто не задумывался даже над этим
Вот ты не задумывался, а читающему в глаза сразу бросается. Что человек:
1. Плохо знает английский
2. Он не знает о том, что плохо его знает, раз на нем пишет.

И вот все как-то так печально сложилось...
nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
10.10.2011, 17:40  [ТС] #7
спасибо за информацию

Добавлено через 17 секунд
больше такой ошибки точно не повторю
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.10.2011, 09:56 #8
Цитата Сообщение от nikola166
C++
1
2
3
4
5
6
7
8
9
10
                 case 'A':m=1; if(Search2(A,KOL[i+1],m)>0){f++;} break;//если в массиве А найдена запрещенная биграмма прибавляем f;
                                case 'B': m=15;if(Search2(B,KOL[i+1],m)>0){f++;} break;
                                        case 'C': m=11;if(Search2(C,KOL[i+1],m)>0){f++;}break;
                                                case 'D':m=4; if(Search2(D,KOL[i+1],m)>0){f++;}break;
                                                        case 'E':m=1; if(Search2(E,KOL[i+1],m)>0){f++;}break;
                                                                case 'F':m=2; if(Search2(F,KOL[i+1],m)>0){f++;}break;
                                                                        case 'G':m=5; if(Search2(G,KOL[i+1],m)>0){f++;} break;
                                                                                case 'I':m=4;if(Search2(I,KOL[i+1],m)>0){f++;} break;
                                                                                        case 'J':m=21;if(Search2(J,KOL[i+1],m)>0){f++;} break;
                                                                                                case 'H':m=8; if(Search2(H,KOL[i+1],m)>0){f++;;}break;
неясный код:
- однострочные конструкции - мешают отладке
- слипшиеся операции - этопростонечитаемотаккакнепонятночтокчемуотноситсяачтокчемунеотносится
- копипаст - это можно записать гораздо компактнее
в общем, хорошая среда для размножения ошибок
nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
11.10.2011, 11:39  [ТС] #9
спасибо огромное за информацию, приму к сведению
CMETAHA
Сообщений: n/a
11.10.2011, 15:59 #10
Цитата Сообщение от Vourhey Посмотреть сообщение
Ух ты, намертво к студии привязываем?
Да. Там сказано использовать именно её.


nikola166, Из Самары? Меня взяли. Решал эту же задачу. Вот код если интересно:

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
#include "stdafx.h"
#include <string>
#include <iostream>
#include <algorithm>
#include <map>
#include <fstream>
 
using namespace std;
 
string ApplyShift(string String, int Shift)//Создаёт новую строку с указанным сдвигом
{
    string Str_result = "";
    for (int i = 0; i < String.size(); i++)
    {
        char c = String[i];
        switch (c)
        {
        case ' ': case '.': case ',': case '!': case '?': case ':': case ';': case '-': Str_result += c; break;
        case '0..9': Str_result += c; break;
        default:
            c += (char)Shift;
            if (c > 'Z') c -= (char)26;
            Str_result += c;
        }
    }
    return Str_result;
}
 
bool IsVowel(char Letter)
{
    return (Letter == 'A') || (Letter == 'E') || (Letter == 'I') || (Letter == 'O') || (Letter == 'U');
}
 
double Relevance(string String)//Определяет релевантность слова
{
    bool CurrentIsVowel;
    bool PreviousIsVowel = IsVowel(String[0]);
    double Result = 1.0;//Начальная релевантность
    for (int i = 1; i < String.size(); i++)
    {
        if(String[i] != ' ')
        {
            CurrentIsVowel = IsVowel(String[i]);
            //Если тип звука, подряд идущих букв, совпадает, то уменьшаем релевантность
            if (CurrentIsVowel == PreviousIsVowel)
                Result *= (PreviousIsVowel ? 0.75 : 0.5);
            else
                PreviousIsVowel = CurrentIsVowel;
        }
    }
    return Result;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream iFile;
    iFile.open(argv[1]);
    string String;
    iFile.unsetf(ios::skipws);
    char temp;
    while(iFile >> temp)
    {
        String += temp;
    }
    String.push_back(' ');//Пробел в конце - для удобства
    transform(String.begin(),String.end(),String.begin(),toupper);
    map<string, double> StringAndRel;//Ключ - строка, данные - релевантность
    string DopString;//Дополнительная переменная
    for(int i = 0; i < 26; i++)
    {
        DopString = ApplyShift(String,i);
        StringAndRel[DopString] = Relevance(DopString);
    }
    double variable = 0;
    //Выбираем строку с максимальной релевантностью
    for(map<string, double>::iterator Iter = StringAndRel.begin(); Iter != StringAndRel.end(); Iter++)
    {
        if((*Iter).second > variable)
        {
            variable = (*Iter).second;
            DopString = (*Iter).first;
        }
 
    }
    iFile.close();
    cout << DopString << endl;
    return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.10.2011, 16:53 #11
Цитата Сообщение от CMETAHA Посмотреть сообщение
case '0..9':
Извиняюсь, а это как? Или это не чистый С++?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
11.10.2011, 19:19 #12
Можно условие задачи полностью? Просто интересно.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.10.2011, 22:23 #13
nikola166, исходник даже смотреть противно, не то чтобы его проверять.

Добавлено через 16 секунд
Цитата Сообщение от Deviaphan Посмотреть сообщение
Извиняюсь, а это как? Или это не чистый С++?
Это нормально.

Добавлено через 1 минуту
Хотя нет, нормально было бы так:
C
1
case '0'...'9':
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.10.2011, 02:15 #14
Цитата Сообщение от fasked
Хотя нет, нормально было бы так:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void)
{
    switch ('m') {
        case 'a' ... 'z':
            printf("1\n");
            break;
    }
    return 0;
}
Код
[guest@localhost tests]$ gcc -Wall -pedantic -std=c99 t.c -o t
t.c: В функции ‘main’:
t.c:7:9: предупреждение: диапазоны в операторе switch не поддерживаются ISO C
[guest@localhost tests]$ ./t
1
[guest@localhost tests]$
CMETAHA
Сообщений: n/a
12.10.2011, 09:55 #15
Цитата Сообщение от Deviaphan Посмотреть сообщение
Извиняюсь, а это как? Или это не чистый С++?
Ой. Извините. Это черновик. Конечно же там
C++
1
case '0': case '1': case '2' и т.д.
Цитата Сообщение от fasked Посмотреть сообщение
Хотя нет, нормально было бы так:
У меня тоже такой вариант не работает.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Можно условие задачи полностью? Просто интересно.
Конечно можно. Программа получает через параметр командной строки название текстового файла в котором содержится зашифрованная шифром Цезаря строка. Необходимо вывести на экран исходную строку на литературном английском.

АПД.: nikola166, ты не использовал STL. Для CQG это критично. Они даже очень хорошие решения без STL забраковывали.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2011, 09:55
Привет! Вот еще темы с ответами:

Объясните немного подробнее, как взяли интеграл - Математический анализ
Было дано задание вычилить работу при поднятии тела на высоту, в методичке есть похожая задача, и я не могу понять последнего шага её...

Taylor, разложение (не пойму откуда взяли значение) - Математический анализ
Привет всем, пытаюсь с рядом Тейлора разобраться, есть решенный пример, профессор так решает, но я не понимаю что он проделывает, в книге...

Что нужно знать, чтобы взяли на работу C++-программистом? - C++
всем привет. Я учу С++ уже 10 месяцев. по двум книгам, первую я закончил это Джес либерти 21 день. Вторая Это стивен прата 9 издание...

Хочется услышать мнения - Выбор ноутбука
msi u270 vs lenovo ideapad s205 мси подкупает своим E2-1800 и чётким видео ATI 7340, у леново чуть хуже E-450 и видео ATI 6320. Выбор...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2011, 09:55
Ответ Создать тему
Опции темы

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