Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77

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

02.11.2013, 13:11. Показов 806. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся тут на задание по программированию, от нечего делать решил его сделать на 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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2013, 13:11
Ответы с готовыми решениями:

задачи с двумерным массивом, решение должно быть похоже на решение 8-ми классника
Без рандома, все вводится с клавиатуры, без Inc, без Break и т.д. 1)Сколько учеников не имеет в году задолженностей? 2)Распечатать...

Найти решение уравнения, изоклинную и интегральную кривые, решение задачи Коши
Помогите пожалуйста! а) Найти решение вида: x=a,y=b,y=kx+b y'=\frac{y^2-4}{xy},\\ y'=x-y+2 б) Какая кривая является одновременно...

Аналитическое решение решение краевой задачи для ОДУ второго порядка
Здравствуйте! Задача: Аналитически найти частное решение ОДУ. Изначально в частных производных, но это оду(если я неправ поправьте!) ...

13
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.11.2013, 13:16
Почему не так:
C++
1
2
3
bool isletter( int c ) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
Так же есть стандартная функция isalpha.
1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
02.11.2013, 13:23
во первых зачем
Цитата Сообщение от 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=='$')
в остальном криминала не заметил
"не Айс" конечно, но терпимо
задание скорее всего было чтобы научится работать со строкой
вот и нужно было ввести строку а потом анализировать её, а не посимвольный ввод
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.11.2013, 13:24
Странно инклюдить <string>, а пользоваться char*. Ручным сравнением кодов лучше не пользоваться. Как уже сказал castaway, есть стандартные функции. С учетом локали в том числе. Цикл в itsletter не совсем правильный, при нахождении символа можно сразу выходить из цикла.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
02.11.2013, 13:29
Цитата Сообщение от 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;
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:33  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Почему не так:
C++
1
2
3
bool isletter( int c ) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
Потомучто это слишком изящно для меня, лол. Я правильно понимаю, строка return возвратит ту часть (левую или правую), которые будут true?


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

задание скорее всего было чтобы научится работать со строкой
вот и нужно было ввести строку а потом анализировать её, а не посимвольный ввод
Навроде, когда строка полностью записывается в массив, а потом этот массив анализируется через for какой-нибудь? Делал как-то уже.
Только, опять же, там я тоже сделал ввод "по белому списку", т.е., если введённое не проходило теста на букву, то оно не записывалось в массив вовсе.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.11.2013, 13:35
Цитата Сообщение от landgen Посмотреть сообщение
Я правильно понимаю, строка return возвратит ту часть (левую или правую), которые будут true?
Да, но если обе будут false, значит и возвратит false.
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:36  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
да до неё я не добрался теперь поехали
1 массив каждый раз создается при входе в функцию
А как лучше? Создать массив в main и дать функции доступ к нему по ссылке?
Цитата Сообщение от ValeryS Посмотреть сообщение
2 в массиве опять волшебные числа а не символы
Не знаю, люблю сравнивать символы по ASCII-кодам. Исправлюсь
Цитата Сообщение от ValeryS Посмотреть сообщение
3 размер массива указан явно. причем в двух местах, если добавишь /удалишь элемент и забудешь поправить будет нехорошо
Сначала все упоминания размера делал через статическую переменную LIMIT, но потом решил, что здесь это будет лишним, т.к. упоминаний-то всего два.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
02.11.2013, 13:48
Цитата Сообщение от 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;
}
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 13:53  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
лишнее это
вот твоя функция(извини не буду всю таблицу набивать)
Cпасибо, понял уже. Но решение в одну строку от castaway мне больше понравилось. Я что-то подобное и искал, вроде проверки принадлежности к интервалу из букв, но ничего толкового не нагуглил. Плюс не знал, что в C++ можно сравнивать на больше-меньше с буквами.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
02.11.2013, 13:55
при помощи табличного метода можно вообще сверхбыструю функцию сделать
например проверяет диапазон 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];
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.11.2013, 13:57
ValeryS, лучше уж 0, 1.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
02.11.2013, 14:02
Цитата Сообщение от Tulosba Посмотреть сообщение
ValeryS, лучше уж 0, 1.
можно вообще битовый массив все не 256 а 32 байта
а так дело вкуса,
на больших компах это вряд ли понадобится,а в микроконтроллерах смотреть нужно что выгодней
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
02.11.2013, 14:06  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
при помощи табличного метода можно вообще сверхбыструю функцию сделать
например проверяет диапазон A- D
разберешься?
Вау, круто. В массиве из булевых переменных в тех индексах, где ASCII-код соответствует кодам A-D, подставлены значения true. Соответственно, по индексам A, B, C, D мы и найдём значения true, во всех остальных - false. А inline, наверное, для скорости. Вродё всё так понял. Круто
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.11.2013, 14:06
Помогаю со студенческими работами здесь

Найдите общее решение и решение задачи Коши для ОДУ
Найдите общее решение и решение задачи Коши для ОДУ (с разделяющимися переменными, с однородной правой частью, или сводящееся к ним) : (1...

Найти общее решение или решение задачи Коши
вот пример:

оцените как я две задачи сделал
вот архив в нём код, задания и входной выходной файл для 4 задания

Оцените эффективность алгоритма тестовой задачи
Всем Доброго времени суток. Хотелось поделиться с вами небольшой историей и попросить оценить программу. Я проработал в отделке/ремонте 5...

Оцените решение. Подбираю родственнику
бюджет понятное дело ограничен материнская плата - ASUSTeK M4N78-AM процессор - Athlon II X4 640 (3000/4x512/HT2000) жесткий...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru