Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

На Windows результат на несколько единиц меньше от правильного; на Linux все работает как нужно

20.02.2014, 17:07. Просмотров 927. Ответов 13
Метки нет (Все метки)

Вот программа, которая переводит введенные цифры в целое число, почему на виндовсе результат на несколько единиц меньше от правильного? На линуксе все работает как нужно.
C++
#include <stdio.h>
#include <locale.h>
#include <math.h>
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    char s[256];
    int a[7];
    int k = 0;
    int n = 0;
    printf("Введите число n: ");
    scanf("%s", s);
 
    for(int i = 0; i < 7; i++)
        if(s[i] >= '0' && s[i] <= '9'){
            a[k] = s[i]-'0';
            k++;
        }
 
    for(int i = 0; i < k; i++)
        n += a[k-i-1] * pow(10,i);
 
    printf("Вы ввели число %d\n", n);
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 17:07
Ответы с готовыми решениями:

Выгрузили меньше единиц - загрузили больше. Как так получается?
Всего из контейнера ************* было выгружено: 1 стяжка – 149 ед. + 1 стяжка – 62 ед. + 1...

Как для правильного треугольника и правильного четырёхугольника вычислить его стороны
Составить блок-схему и программу вычисления сторон правильного треугольника (a3=R sqr(3)) и...

Получить все n-элементные последовательности из нулей и единиц содержащие ровно m единиц (m<=n)
Получить все n-элементные последовательности из нулей и единиц содержащие ровно m единиц (m&lt;=n)...


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

Или воспользуйтесь поиском по форуму:
13
Ilot
Эксперт С++
1831 / 1189 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
20.02.2014, 17:12 2
Лучший ответ Сообщение было отмечено programina как решение

Решение

Ошибка округления pow.
Нет ф-и pow(int, int). Есть
C++
1
_CRTIMP double  __cdecl pow(double, double);
1
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 1
20.02.2014, 17:24 3
C++
1
2
3
4
5
6
int stepen=1;
for(int i = 0; i < k; i++)
{
       n += a[k-i-1] * stepen;
       stepen*=10;
}
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.02.2014, 17:30  [ТС] 4
Цитата Сообщение от Ilot Посмотреть сообщение
Ошибка округления pow
верно.
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,677
20.02.2014, 17:33 5
Цитата Сообщение от programina Посмотреть сообщение
for(int i = 0; i < k; i++)
n += a[k-i-1] * pow(10,i);
можно попроще

C++
1
2
3
4
5
6
n=0;
  for(int i = k-1; i <=0; i++)
     {
       n*=10;
       n += a[k];
      }
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.02.2014, 17:37  [ТС] 6
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
n=0; 
 
for(int i = k-1; i <=0; i++) 
{ 
    n*=10; n += a[k]; 
}
точно. вылетело из головы, что можно просто сдвигать разряд.
0
Kuzia domovenok
2322 / 2070 / 481
Регистрация: 25.03.2012
Сообщений: 7,378
Записей в блоге: 1
20.02.2014, 17:42 7
А что, на Линухе работает правильно? Ой, плохой Виндоус!
2
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,677
20.02.2014, 17:42 8
programina,
пардон косяк, даже стыдно
не
Цитата Сообщение от ValeryS Посмотреть сообщение
for(int i = k-1; i <=0; i++)
а, конечно же
C++
1
for(int i = k-1; i <=0; i--)
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
20.02.2014, 17:44  [ТС] 9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А что, на Линухе работает правильно? Ой, плохой Виндоус
Иммменнно!

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
for(int i = k-1; i <=0; i--)
галочка не в ту сторону смотрит
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,677
20.02.2014, 17:48 10
Цитата Сообщение от programina Посмотреть сообщение
галочка не в ту сторону смотрит
точно
скопировал твой цикл и поправил, но не все
вот наглядный пример ущербности пути "Copy / Paste"
1
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 1
21.02.2014, 17:39 11
ValeryS
n=0;
не нулю, а единице.
1
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,677
21.02.2014, 17:41 12
Цитата Сообщение от zss Посмотреть сообщение
не нулю, а единице.
это ты про какой листинг?
0
zss
Модератор
Эксперт С++
7179 / 6678 / 4226
Регистрация: 18.12.2011
Сообщений: 17,622
Завершенные тесты: 1
21.02.2014, 17:43 13
Цитата Сообщение от ValeryS Посмотреть сообщение
это ты про какой листинг?
Пост №5
0
ValeryS
Модератор
7262 / 5516 / 692
Регистрация: 14.02.2011
Сообщений: 18,677
21.02.2014, 17:52 14
zss,
а теперь переведи число хотя бы 10 с n=1
C++
1
2
3
4
5
6
n=1;
  for(int i = k-1; i >=0; i--)
   {
     n*=10;
     n += a[k];
    }
итак массив из двух элементов a[1]=1 a[0]=0 k=2
i=1
n*=10;
1*10=10;
n += a[1];
10+1=11

i=0
n*=10;
11*10=110;
n += a[1];
110+0=110

как то не совпадает
теперь тоже самое с 0

C++
1
2
3
4
5
6
n=0;
  for(int i = k-1; i >=0; i--)
   {
     n*=10;
     n += a[k];
    }
i=1
n*=10;
0*10=0;
n += a[1];
0+1=1

i=0
n*=10;
1*10=10;
n += a[1];
10+0=10
1
21.02.2014, 17:52
Ответ Создать тему
Опции темы

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