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

Вычисление арифметических выражений в условии цикла с параметром

04.06.2017, 21:15. Показов 1627. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Объясните, пожалуйста. Уже, вроде, кучу сайтов перечитал, но так и не нашел ответа.
Есть цикл
C++
1
2
for (i = st1.length()-1; i > st1.length() - st2.length(); i--)
    {...}
Значения st1.length() и st2.length(), например, равны 7.
При данном коде, параметр i меняется, как и положено от 6 до 1 (i равна единице на последнем проходе цикла).
Но если в условии поставить нестрогое неравенство:
C++
1
2
for (i = st1.length()-1; i >= st1.length() - st2.length(); i--)
    {...}
то i меняется от 6 до -1 (i = -1 при последней проходе).
Почему так происходит? Ведь выражение st1.length() - st2.length() равно нулю.
В тоже время, если вычислить это выражение до начала цикла:
C++
1
2
3
int s = st1.length() - st2.length();
for (i = st1.length()-1; i >= s; i--)
    {...}
то всё работает нормально (i меняется от 6 до 0).
Я понимаю, что вопрос элементарный, но ответа на него найти так и не смог(
Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.06.2017, 21:15
Ответы с готовыми решениями:

Вычисление арифметических выражений
Здраствуйте. Меня волнует такой вопрос по С++ - вот я к примеру хочу вычислить какое-нибудь арифметическое выражение с переменными x, y, z....

Вычисление арифметических выражений
У меня есть пример к которому надо написать программу чтоб его посчитала. Так вот я ее сделал но ответы не совпадают #include...

Вычисление суммы n ряда с использованием цикла с параметром
Помогите пожалуйста написать программу. Составить программу вычисления суммы 20 членов ряда S=x^2/2! - x^4/4! + x^8/6! - ... , используя...

10
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.06.2017, 22:03
Цитата Сообщение от ChroniC_2 Посмотреть сообщение
то i меняется от 6 до -1 (i = -1 при последней проходе).
i = 0 удовлетворяет условию, и выполнение цикла продолжается А вот при i = -1 условие уже не выполняется и происходит выход из цикла.
0
3 / 3 / 1
Регистрация: 26.01.2016
Сообщений: 21
04.06.2017, 22:19  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
i = 0 удовлетворяет условию, и выполнение цикла продолжается А вот при i = -1 условие уже не выполняется и происходит выход из цикла.
Да, но со значением i=-1 выполняется тело цикла. Хотя, по идее, это уже условию не удовлетворяет.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.06.2017, 22:22
Цитата Сообщение от ChroniC_2 Посмотреть сообщение
но со значением i=-1 выполняется тело цикла. Хотя, по идее, это уже условию не удовлетворяет.
Скорее всего вы меняете строку (ее длину) в теле. Ищите СВОЮ ошибку.
0
3 / 3 / 1
Регистрация: 26.01.2016
Сообщений: 21
04.06.2017, 22:30  [ТС]
Вот полный код цикла.
Значение строки там нигде не меняется. Эта конструкция работает правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int s = st1.length() - st2.length();
for (i = st1.length()-1; i >= s; i--)
    {
        cout << "i = " << i << endl;
        dig1 = int(st1[i]) - 48;
        dig2 = int(st2[i-s]) - 48;
        dig3 = dig1 + dig2;
        if (dig3 > 9)
        {
            st3 = char(dig3 % 10 + 48 + per) + st3;
            per = 1;
        }
        else
        {
            st3 = char(dig3 + 48 + per) + st3;
            per = 0;
        }
}
Но если написать в условие цикла не переменную s, а выражение st1.length() - st2.length(), то происходит вышеописанная ошибка.
В теле цикла при этом ничего не изменяя.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.06.2017, 23:06
ChroniC_2, Увы! Ничего сказать не могу. Ошибки не вижу. Возможно, она где-то прячется в другом месте. Может быть каким-то образом совместились st2 и st3. Трудно сказать.
И как я понял, это сложение столбиком длинных чисел, да? Могу дать совет по небольшому сокращению кода
C++
1
2
3
4
5
st3 = char(dig3 % 10 + 48 + per) + st3;
if (dig3 > 9)
            per = 1;
else
            per = 0;
Смысла это не меняет, но выглядит приятнее.
И еще. Может быть лучше держать в строках не символы цифр, а их числовое значение. А прибавить 48 уже в самом конце вычислений, перед выводом.
И еще, если хочется эффективности, считать не в десятичной системе, а в 256-ичной, например. А еще лучше в 215-ичной.
Впрочем, я понимаю, что сейчас вам не до этих изысков.
Удачной ловли насекомых!
2
3 / 3 / 1
Регистрация: 26.01.2016
Сообщений: 21
04.06.2017, 23:41  [ТС]
Байт, Спасибо вам большое за помощь! Код сократил, как у вас)
Буду дальше думать, значит, что-то раньше пошло не так.

Не по теме:

Не по теме, но коль уж об этом речь зашла: как-то читал (Окулов С.М. Программирование в алгоритмах.) про следующий способ сложения длинных чисел: исходные числа разбиваются на четырехзначные (можно и больше) числа и записываются в целочисленные массивы. И далее происходит сложение уже этих чисел, а не поразрядно, как у меня. Это примерно то, о чем вы говорите?
Я тогда подумал, зачем такие ухищрения, если есть строки, через них всё просто делается. Но, я так понимаю, через строки реализовывать сложение длинных чисел это наименее эффективный способ?

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.06.2017, 23:53
Цитата Сообщение от ChroniC_2 Посмотреть сообщение
Это примерно то, о чем вы говорите?
Да, именно об этом.
Но там возникает одна проблема (преодолимая) - переводить результат в человеческий вид - десятичный. Поэтому, может быть имеет смысл считать в 1000-ричной сс. И можно большие числа сразу триадами выводить. Типа "1 234 567"
Ну и еще один маленький секретик.
C++
1
2
3
4
unsigned int a, b, c;
c = a + b;
  // Как поймать переполнение?
if (c < a) ... // вот так!
Ну это так, на будущее...
1
3 / 3 / 1
Регистрация: 26.01.2016
Сообщений: 21
05.06.2017, 13:17  [ТС]
Байт, Спасибо вам большое за помощь!!! Буду пробовать.

Добавлено через 12 часов 49 минут
Разобрался с первоначальным вопросом. Может кому пригодится.
Оказывается, функция
C++
1
st1.length()
возвращает значение типа unsigned int, следовательно и выражение
C++
1
st1.length() - st2.length()
имеет тот же тип.
Подробно же прочитать про сравнение знаковых и беззнаковых типов (довольно интересный аспект) можно здесь:
Сравнение знаковых и беззнаковых чисел
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.06.2017, 13:36
ChroniC_2, поздравляю! Замечательно!
А ошибочка-то была проста и лежала на поверхности, а вовсе не в тех глубинах, о которых мы с вами думали. И дело было просто в замыленом глазе. (И вашем, и моем)
Что ж поделаешь! Такова наша профессия! Зато какое удовольствие эту блоху за хвост поймать, не правда ли?
0
05.06.2017, 13:44  [ТС]

Не по теме:

Байт, Спасибо)
Удовольствие и правда не малое) Правду говорят, утро вечера мудренее.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2017, 13:44
Помогаю со студенческими работами здесь

Цикл: Вычисление значения с использованием операторов цикла с параметром, с предусловием, с постусловием
Разработать консольную программу в C++, для нахождения значения Y, с использованием операторов цикла с параметром, цикла с предусловием,...

Задания на вычисление значения выражений с использованием операторов цикла с внутренним разветвлением. Необходимо найти ошибку
#include &lt;cmath&gt; #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;cmath&gt; void main() { float i,a; ...

Разбор арифметических выражений
Задача на указатели из учебника Р.Лафоре. если вкратце, то суть заключается в том, что мы вводим строку без пробелов и скобок(например,...

Табулирование арифметических выражений
Написать программу для вычисления табулированных значении функции y = f(x) на интервале от xn до xk с шагом дельта x. Предусмотреть ввод...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru