21

Re: Проблема з обчисленням в С++

koala написав:

Підтверджую баг. Переоптимізував :)

        if (strchr("+-", arr[i]))
        {
            if (znak == '+')
                summa += atoi(num);
            else
                summa -= atoi(num);
            j = 0;
            num[0] = '\0';
            znak = arr[i];
        }
        else
        {
            num[j++] = arr[i];
            num[j] = '\0';
        }

http://ideone.com/6fNjh3
Так краще?

 num[j] = '\0';

це так обнуляється змінна?
чи буде  num[0] = '\0'; == num[0] = "";?

22 Востаннє редагувалося koala (08.11.2014 20:33:58)

Re: Проблема з обчисленням в С++

Skyzerks Synx написав:

я такий спосіб використання while бачу вперше.

istream::operator bool. В стандарт його не так давно додали. Якщо операція вводу була невдала, повертає false.

Skyzerks Synx написав:
 num[j] = '\0';

це так обнуляється змінна?
чи буде  num[0] = '\0'; == num[0] = "";?

Стандартні "рядки" в C/C++ - це масиви char-ів, які закінчуються символом з кодом 0 (решта масиву не вважається частиною рядка). Тому в кінець рядка треба додавати '\0'.

23 Востаннє редагувалося Skyzerks Synx (12.11.2014 23:30:39)

Re: Проблема з обчисленням в С++

Маємо такий код:

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    float arr[10], c[12];
    int a, b, i;
    cout<<"Введите натуральное число а: ";
    cin>>a;
    cout<<"\nВведите натуральное число b (b>a): ";
    cin>>b; cout<<'\n';
    if(a<b)
    {
    c =a/b;
    for(i=0; i<sizeof(arr); i++) 
        {
        arr[i]=c[i+2];
        cout<< arr[i]<<'\n';
        }
    }
    else cout<< "а больше или равно b";
    system("pause");
    return 0;
}

В мене банальна проблема:
https://pp.сайт-злодій/c620019/v620019617/1ffe7/jkvW47XQuyE.jpg
ну трохи криво я зробив 15 рядок, ідей немає як це виправити. (нажаль)

24

Re: Проблема з обчисленням в С++

Ви знову не читаєте, що вам пише компілятор?

Подякували: koala1

25

Re: Проблема з обчисленням в С++

quez написав:

Ви знову не читаєте, що вам пише компілятор?

ну тепер тут потрібно перетворити це у float.
наприклад
с=1/3=0,3333;

26 Востаннє редагувалося Skyzerks Synx (12.11.2014 23:46:20)

Re: Проблема з обчисленням в С++

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    int arr[10]; 
    double c;
    int a, b, i;
    cout<<"Введите натуральное число а: ";
    cin>>a;
    cout<<"\nВведите натуральное число b (b>a): ";
    cin>>b; cout<<'\n';
    if(a<b)
    {
    c=a/b;
    char arr0[12]={c};
    for(i=0; i<sizeof(arr); i++)
        {
        arr[i]=arr0[i+2];
        cout<< arr[i]<<'\n';
        }
    }
    else cout<< "а больше или равно b";
    system("pause");
    return 0;
}

Тепер працює (некоректно), закінчується помилкою "stack around "arr" was corupted"

27 Востаннє редагувалося 0xDADA11C7 (12.11.2014 23:56:19)

Re: Проблема з обчисленням в С++

погляньте на

int arr[10]; 
...
sizeof(arr)
Подякували: quez1

28

Re: Проблема з обчисленням в С++

http://ideone.com/777ndH
1. sizeof працює трохи не так, як ви це собі уявляєте
2. Нащо ви приводите double до char? Тим більше, що у вас с завжди менше одиниці, це завжди даватиме нуль-символ.
3. Перевіряєте (a<b). Ок. Вводимо два рівних числа. Що виведе? «а больше или равно

29

Re: Проблема з обчисленням в С++

quez написав:

http://ideone.com/777ndH
1. sizeof працює трохи не так, як ви це собі уявляєте
2. Нащо ви приводите double до char? Тим більше, що у вас с завжди менше одиниці, це завжди даватиме нуль-символ.
3. Перевіряєте (a<b). Ок. Вводимо два рівних числа. Що виведе? «а больше или равно

Яким чином тоді мені задати це число (і так воно має бути менше 1) якщо char верне тільки 0. Я вже пробував різними способами, ось один із них:

#include "stdafx.h"
#include <iostream>
using namespace std;
#pragma warning(disable: 4996)
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    int arr[10]; 
    double c;
    int a, b, i;
    cout<<"Введите натуральное число а: ";
    cin>>a;
    //scanf("%d", &a);
    cout<<"\nВведите натуральное число b (b>a): ";
    cin>>b;
    //scanf("%d", &b); cout<<'\n';
    if(a<b)
    {
    c=a/b;
    double *arr0[12]={&c};
    for(i=0; i<10; i++)
    {
        arr[i]=(int)arr0[i+2];
        cout<< arr[i]<<'\n';
    }
}
    else cout<< "а больше или равно b\n";
    system("pause");
    return 0;
}

але все ж таки виводить нулі.

30

Re: Проблема з обчисленням в С++

Skyzerks Synx написав:
int a, b;
...
a/b;

Це цілочислене ділення, бо операнди int. Спробуйте

double(a)/double(b);
Skyzerks Synx написав:
double *arr0[12]={&c};
    for(i=0; i<10; i++)
    {
        arr[i]=(int)arr0[i+2];
        cout<< arr[i]<<'\n';
    }

Спробуйте словами описати, що ви тут робите... чи хоча б що хочете зробити. Бо сенс цього тайнодійства з перетворенням вказівників в цілі і назад у вказівники від мене тікає.

31

Re: Проблема з обчисленням в С++

koala написав:
Skyzerks Synx написав:
int a, b;
...
a/b;

Це цілочислене ділення, бо операнди int. Спробуйте

double(a)/double(b);
Skyzerks Synx написав:
double *arr0[12]={&c};
    for(i=0; i<10; i++)
    {
        arr[i]=(int)arr0[i+2];
        cout<< arr[i]<<'\n';
    }

Спробуйте словами описати, що ви тут робите... чи хоча б що хочете зробити. Бо сенс цього тайнодійства з перетворенням вказівників в цілі і назад у вказівники від мене тікає.

оскільки arr0 < 1
тоді я використав

arr[i]=(int)arr0[i+2]

для присвоєння і-му елементу масива arr i+2 елемент масиву arr0
i+2, тому що я хотів пропустити "0,"- перших два символа

32

Re: Проблема з обчисленням в С++

Skyzerks Synx написав:

оскільки arr0 < 1

arr0 не може бути меншим за 1, це масив.

Skyzerks Synx написав:

тоді я використав

arr[i]=(int)arr0[i+2]

для присвоєння і-му елементу масива arr i+2 елемент масиву arr0
i+2, тому що я хотів пропустити "0,"- перших два символа

і в ньому немає символів.
А от що це за масив - я так і не можу зрозуміти.

33

Re: Проблема з обчисленням в С++

koala написав:
Skyzerks Synx написав:

оскільки arr0 < 1

arr0 не може бути меншим за 1, це масив.

Skyzerks Synx написав:

тоді я використав

arr[i]=(int)arr0[i+2]

для присвоєння і-му елементу масива arr i+2 елемент масиву arr0
i+2, тому що я хотів пропустити "0,"- перших два символа

і в ньому немає символів.
А от що це за масив - я так і не можу зрозуміти.

все що я хотів зробити це урізати число і утворити з нього масив, але не знав як це реалізувати, тому обійшовся тими операціями які більш-менш знаю.
наприклад маємо: 0,604863, і ми урізаємо "0," утворюючи 604863

34

Re: Проблема з обчисленням в С++

Числа в int/float/etc зберігаються у внутрішніх форматах, двійкових, і напряму із ними ви мало що зробите (якщо не вивчите ці формати). А вам треба або помножити на 1000000 (так, це витягає 6 знаків перед кому - ви не знали?) і перетворити на ціле, або перетворити число на рядок (atoi, stringstream::operator>>, s{n}printf) і далі працювати з рядком. double *arr[12] - це масив з 12 вказівників на double, тобто ну зовсім не те, що вам треба.

35 Востаннє редагувалося Skyzerks Synx (13.11.2014 19:53:15)

Re: Проблема з обчисленням в С++

koala написав:

Числа в int/float/etc зберігаються у внутрішніх форматах, двійкових, і напряму із ними ви мало що зробите (якщо не вивчите ці формати). А вам треба або помножити на 1000000 (так, це витягає 6 знаків перед кому - ви не знали?) і перетворити на ціле, або перетворити число на рядок (atoi, stringstream::operator>>, s{n}printf) і далі працювати з рядком. double *arr[12] - це масив з 12 вказівників на double, тобто ну зовсім не те, що вам треба.

int arr[10], a, b, c;
c = (a/b)*pow(10, 10);
arr[10]=c;
cout<<arr;

все одно не то, я просто тлумлюсь на місці не на знаю від чого, пошук в мережах інтернету не дав позитивних результатів.

36 Востаннє редагувалося koala (13.11.2014 19:55:58)

Re: Проблема з обчисленням в С++

Skyzerks Synx написав:

все одно не то, я просто тлумлюсь на місці не на знаю від чого, пошук в мережах інтернету не дав позитивних результатів.

Ось тут ще гляньте.
І припиніть мучити масиви.

37

Re: Проблема з обчисленням в С++

Звичайно не то.
По-перше, ви вилазите за межі масиву.
Але навіть якщо уявити, що там arr[9] = c, то ваш масив має такий вигляд: 0,0,0,0,0,0,0,0,0,c.
Це відбувається, тому що ви не розрізняєте цифри і числа. Ви хочете записувати цифри, але з ними мови програмування працювати не вміють.

38 Востаннє редагувалося Skyzerks Synx (13.11.2014 20:13:02)

Re: Проблема з обчисленням в С++

koala написав:
Skyzerks Synx написав:

все одно не то, я просто тлумлюсь на місці не на знаю від чого, пошук в мережах інтернету не дав позитивних результатів.

Ось тут ще гляньте.
І припиніть мучити масиви.

Ладно, таким чином я отримав дійсне число.
Але облишити масиви я не можу, тому що хочу туди вмістити дробну частину цієї цифри (наприклад з 1 по 6 знак після коми). Тому і мучу ті масиви так.

c = (double)a/(double)b;

Ну раз я збирався туди вмістити числа після коми, потрібно цілочисельний масив. Але вот тут то і починаються проблеми.

39

Re: Проблема з обчисленням в С++

double c, buff;
    int i, d=0;
    if(a<b)
    {
        c = (double)a/(double)b;
        cout<<c<<'\n';
        for(i=0;i<10;i++)
        {
            buff=c*10;
            d=buff;
            arr[i]=d;
            c=buff-d;
            cout<<arr[i]<<'\n';
        }
}

Тепер все вийшло, ще раз дякую за

koala написав:
double(a)/double(b);

  :)

40

Re: Проблема з обчисленням в С++

cout << int( double( a ) / double( b ) * pow( 10, 10 ) ) << endl;