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

Оцените решение задачи - C++

Восстановить пароль Регистрация
 
landgen
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:11     Оцените решение задачи #1
Наткнулся тут на задание по программированию, от нечего делать решил его сделать на C++. Человеку его задали в университете, а я там никогда не учился, да и в С++ я новичок. Не знаю, в общем, как принято решать такие задания.
Один ньюанс: я пока не умею работать с многофайловыми программами (лол), поэтому немного переделал задание. Без файлов, просто пользователь вводит строку, вводит, если хочет, символы # и $ а потом программа показывает ему, что получилось.

Оцените, пожалуйста, у кого есть время, решение задачи. В правильном направлении хоть мыслю? Можно такое было бы с чистой совестью показать преподавателю?
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <string>
#include <windows.h>
#include <conio.h>
using namespace std;
 
bool itsletter (int);
 
int main()
{   
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char var[101];
    bool stopit = false;
    int temp = 0,
        position = 0;
 
    cout << "Введите исходную строку: ";
    // будем принимать от пользователя символы до тех пор, пока он не нажмёт enter
    while(stopit != true){
        
        temp = _getch();
        // если нам ввели букву, то запишем её в массив
        if (itsletter(temp)){
            cout << static_cast<char>(temp);
            var[position] = temp;
            position++;     
        }
        // если пользователь ввёл #
        else if (temp == 35){
            if (position!=0) position--;
            cout << "#";
        }
        // если пользователь ввёл $
        else if (temp == 36){
            if (position!=0){
                var[position] = var[position-1];
                position++;
            }
            cout << "$";
        }
        // если пользователь ввёл enter
        else if (temp == 13){
            cout << "\n";
            stopit = true;
        }
    }
    // выводим получившееся на экран
    cout << "Вот ваша строка: ";
    for (int j = 0; j < position; j++){
        cout << var[j];
    } 
    _getch();
    return 0;
}
 
// функция itsletter, сверяет полученный аргумент с массивом из ASCII-кодов русских и английских
// букв, и, если находит совпадение, то возвращает true
 
// вообще-то, в массиве нету кроме букв ничего, поэтому программа не позволит нам ввести символы
// вроде "!, №, %" итд, но я поленился вписывать их ASCII-коды в массив
bool itsletter (int variable){
    int letters[117] = {     113,97,122,119,115,120,101,100,99,114,102,118,116,103,98,
                             121,104,110,117,106,109,105,107,111,108,112,233,246,243,
                             234,229,237,227,248,249,231,245,250,244,251,226,224,239,
                             240,238,235,228,230,253,255,247,241,236,232,242,252,225,
                             254,201,212,223,214,219,215,211,194,209,202,192,204,197,
                             207,200,205,208,210,195,206,220,216,203,193,217,196,222,
                             199,198,213,221,218,81,65,90,87,83,88,69,68,67,82,70,86,
                             84,71,66,89,72,78,85,74,77,73,75,79,76,80,8};
    bool result = false;
    for (int j = 0; j < 117; j++){
        if (variable == letters[j]) result = true;
    }        
    return result;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2013, 13:11     Оцените решение задачи
Посмотрите здесь:

Решение задачи C++
Решение задачи C++
Решение задачи c++ C++
C++ оцените как я две задачи сделал
C++ Решение задачи
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
02.11.2013, 13:16     Оцените решение задачи #2
Почему не так:
C++
1
2
3
bool isletter( int c ) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
Так же есть стандартная функция isalpha.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
02.11.2013, 13:23     Оцените решение задачи #3
во первых зачем
Цитата Сообщение от landgen Посмотреть сообщение
int temp = 0,
а затем кастуешь его к char
сразу
C++
1
char temp;
во вторых
Цитата Сообщение от landgen Посмотреть сообщение
else if (temp == 35){
Цитата Сообщение от landgen Посмотреть сообщение
else if (temp == 36){
зачем эти волшебные числа проверяй на символ
C++
1
2
if(temp=='#')
if(temp=='$')
в остальном криминала не заметил
"не Айс" конечно, но терпимо
задание скорее всего было чтобы научится работать со строкой
вот и нужно было ввести строку а потом анализировать её, а не посимвольный ввод
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 13:24     Оцените решение задачи #4
Странно инклюдить <string>, а пользоваться char*. Ручным сравнением кодов лучше не пользоваться. Как уже сказал castaway, есть стандартные функции. С учетом локали в том числе. Цикл в itsletter не совсем правильный, при нахождении символа можно сразу выходить из цикла.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
02.11.2013, 13:29     Оцените решение задачи #5
Цитата Сообщение от landgen Посмотреть сообщение
bool itsletter (int variable)
да до неё я не добрался теперь поехали
1 массив каждый раз создается при входе в функцию
2 в массиве опять волшебные числа а не символы
3 размер массива указан явно. причем в двух местах, если добавишь /удалишь элемент и забудешь поправить будет нехорошо
4
Цитата Сообщение от landgen Посмотреть сообщение
for (int j = 0; j < 117; j++){
if (variable == letters[j]) result = true;
если буква найдена мы все равно продолжаем крутить цикл
вот так будет правильней
C++
1
2
3
4
for (int j = 0; j < sizeof(letters); j++)
       if (variable == letters[j]) 
              return true;
return false;
landgen
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:33  [ТС]     Оцените решение задачи #6
Цитата Сообщение от castaway Посмотреть сообщение
Почему не так:
C++
1
2
3
bool isletter( int c ) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
Потомучто это слишком изящно для меня, лол. Я правильно понимаю, строка return возвратит ту часть (левую или правую), которые будут true?


Цитата Сообщение от Tulosba Посмотреть сообщение
Как уже сказал castaway, есть стандартные функции.
Понял, спасибо.

задание скорее всего было чтобы научится работать со строкой
вот и нужно было ввести строку а потом анализировать её, а не посимвольный ввод
Навроде, когда строка полностью записывается в массив, а потом этот массив анализируется через for какой-нибудь? Делал как-то уже.
Только, опять же, там я тоже сделал ввод "по белому списку", т.е., если введённое не проходило теста на букву, то оно не записывалось в массив вовсе.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
02.11.2013, 13:35     Оцените решение задачи #7
Цитата Сообщение от landgen Посмотреть сообщение
Я правильно понимаю, строка return возвратит ту часть (левую или правую), которые будут true?
Да, но если обе будут false, значит и возвратит false.
landgen
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:36  [ТС]     Оцените решение задачи #8
Цитата Сообщение от ValeryS Посмотреть сообщение
да до неё я не добрался теперь поехали
1 массив каждый раз создается при входе в функцию
А как лучше? Создать массив в main и дать функции доступ к нему по ссылке?
Цитата Сообщение от ValeryS Посмотреть сообщение
2 в массиве опять волшебные числа а не символы
Не знаю, люблю сравнивать символы по ASCII-кодам. Исправлюсь
Цитата Сообщение от ValeryS Посмотреть сообщение
3 размер массива указан явно. причем в двух местах, если добавишь /удалишь элемент и забудешь поправить будет нехорошо
Сначала все упоминания размера делал через статическую переменную LIMIT, но потом решил, что здесь это будет лишним, т.к. упоминаний-то всего два.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
02.11.2013, 13:48     Оцените решение задачи #9
Цитата Сообщение от landgen Посмотреть сообщение
А как лучше? Создать массив в main и дать функции доступ к нему по ссылке?
глобальный массив
массив со словом static
Цитата Сообщение от landgen Посмотреть сообщение
Не знаю, люблю сравнивать символы по ASCII-кодам. Исправлюсь
а ты и сравниваешь их по кодам, не волнуйся
просто не надо будет потом вводить расшифровку что каждый код означает, и если уж любишь работать с кодами используй 16-ричную запись, во первых она во всех таблицах, во вторых легче уследить закономерность
Цитата Сообщение от landgen Посмотреть сообщение
Сначала все упоминания размера делал через статическую переменную LIMIT, но потом решил, что здесь это будет лишним, т.к. упоминаний-то всего два.
лишнее это
вот твоя функция(извини не буду всю таблицу набивать)
C++
1
2
3
4
5
6
7
bool itsletter (char variable){
static char letters[] = {'A','B','C'};
  for (int j = 0; j < sizeof(letters); j++)
     if (variable == letters[j])
        return true;
 return false;
}
landgen
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:53  [ТС]     Оцените решение задачи #10
Цитата Сообщение от ValeryS Посмотреть сообщение
лишнее это
вот твоя функция(извини не буду всю таблицу набивать)
Cпасибо, понял уже. Но решение в одну строку от castaway мне больше понравилось. Я что-то подобное и искал, вроде проверки принадлежности к интервалу из букв, но ничего толкового не нагуглил. Плюс не знал, что в C++ можно сравнивать на больше-меньше с буквами.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
02.11.2013, 13:55     Оцените решение задачи #11
при помощи табличного метода можно вообще сверхбыструю функцию сделать
например проверяет диапазон A- D
разберешься?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
inline bool itsletter(unsigned char c)
{
 static bool tbl[256]=
  {false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false, 
    false,true, true, true, true,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false, 
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,
    false,false,false,false,false,false,false,false,false,false,false,false,false,false,false,false}; 
return tbl[c];
}
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.11.2013, 13:57     Оцените решение задачи #12
ValeryS, лучше уж 0, 1.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
02.11.2013, 14:02     Оцените решение задачи #13
Цитата Сообщение от Tulosba Посмотреть сообщение
ValeryS, лучше уж 0, 1.
можно вообще битовый массив все не 256 а 32 байта
а так дело вкуса,
на больших компах это вряд ли понадобится,а в микроконтроллерах смотреть нужно что выгодней
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2013, 14:06     Оцените решение задачи
Еще ссылки по теме:

C++ Решение задачи
C++ Решение задачи
Решение задачи C++

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

Или воспользуйтесь поиском по форуму:
landgen
1 / 1 / 0
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 14:06  [ТС]     Оцените решение задачи #14
Цитата Сообщение от ValeryS Посмотреть сообщение
при помощи табличного метода можно вообще сверхбыструю функцию сделать
например проверяет диапазон A- D
разберешься?
Вау, круто. В массиве из булевых переменных в тех индексах, где ASCII-код соответствует кодам A-D, подставлены значения true. Соответственно, по индексам A, B, C, D мы и найдём значения true, во всех остальных - false. А inline, наверное, для скорости. Вродё всё так понял. Круто
Yandex
Объявления
02.11.2013, 14:06     Оцените решение задачи
Ответ Создать тему
Опции темы

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