Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199

Перевод из строки в число

03.11.2009, 19:56. Показов 9512. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Снова я =) Работаю над калькулятором. С функцией ввода разобрался.
Значит есть строка ввода. рабочая. заполняет массив buf . Потом запускаеться функция scan_buf , она должна считать число ( пока делаю простой вариант, чтобы работал ^^ ) до знака действия т.е. пишешь в строке 51+9 жмякаешь ентер (в массиве buf : 51+9) запускаеться эта функция , в массив stack помещяться 51 . И теперь это 51 которое в массиве как символы нужно переделать в число i . Типа (ну напр.) double . В нете искал . Пробовал - не особо помогло :***( точней из того , что пробовал ничего не сработало. Помогите преобразовать stack в double число i . Работаю в Visual Studio 2008. *pz - указатель на знак ( мат. операцию +-\* ) описание строки ввода Строка ввода в калькуляторе (я немного усовершенствовал ).
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
 
char input_str(char (*buf), char (*opef));
void gotoxy(int xpos, int ypos);
double scan_buf(char *buf, char *oper, int p, char *stack);
 
char stack[80];
char buf[80];
char oper[]="+-*/.";
char alf[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *pz;
 
int _tmain(int argc, _TCHAR* argv[])
{
        int p;
        int z;
        double a;
        p=16;
        buf[79]='#';
        z=input_str(buf,oper,p);
        a=scan_buf(buf,oper,p,stack);
        printf("HELLO");
        printf("\n %s", buf);
        printf("\n %s", stack);
        printf("\n\n %d", a);
        getch();
        return 0;
}
 
char input_str(char (*buf), char (*oper), int p)
{
    char ch;
    int znak;
    znak=0;
    i=0;
    while(*buf!='#')
    {
    ch=getch();
    if (ch==8) 
        { 
            gotoxy(--i,0); 
            putch(NULL);
            *--buf=NULL; 
            gotoxy(i,0); 
            continue;
        }
    if (ch==13) 
        {
            break;
        }
    if (ch=='e') 
        {
            putch(ch);
            *buf++='$';
            i++;
            continue;
        }
    if(strchr(alf,ch) || (ch=='.'))
        {
            if ((strchr(alf,ch)-alf)>=p) continue;
            *buf++=ch;
            putch(ch);
            i++;
            continue;
        }
    if (strchr(oper,ch)) 
        { 
            putch(ch); 
            pz=buf;
            *buf++=ch;
            i++;
            if (ch=='+') znak=1;
            if (ch=='-') znak=2;
            if (ch=='*') znak=3;
            if (ch=='/') znak=4;
            continue;
        }
    }
    return znak;
}
 
double scan_buf(char *buf, char *oper, int p, char *stack)
{
    double i;
    i=0;
    while ((*buf!=0)&&(*buf!=*pz))
    {
        *stack++=*buf++;
    }
    //Как преобразовать ??????
    return i;
}
 
 
void gotoxy(int xpos, int ypos)
{
  COORD scrn;    
 
  HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE);
 
  scrn.X = xpos; scrn.Y = ypos;
 
  SetConsoleCursorPosition(hOuput,scrn);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2009, 19:56
Ответы с готовыми решениями:

Разбиение строки на части, перевод строки в число и перевод числа
Есть задание: 1. Необходимо реализовать консольное приложение, позволяющее манипулировать строкой, разбив ее на элементы путем...

Перевод строки в число
Нужно написать перевод записи a1^b1*a2^b2*...*ak^bk в число причём записи az^0 быть не должно, и вместо записи az^1 будет az я сделал...

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

12
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
03.11.2009, 23:27
strtol().

Добавлено через 17 секунд
Для вещественных - strtod().
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
04.11.2009, 21:40  [ТС]
попробовал следующее:
в 97 строчку писал:
C++
1
sscanf(stack,"%ld",&i);
C++
1
i=atoi(stack);
C++
1
i=strtod(buf,NULL);
strtod пробовал разные комбинации. Итог один вместо а=51 в мэине , оно при выводе всегда равно 0 .
ЗЫ проверял на выражении 51+9 .
проблема остаёться.

Можете пожалуйста написать в коде что в 97 строчку всунуть ... а то я пока что нуб в С++ =*(
0
10 / 10 / 2
Регистрация: 01.11.2009
Сообщений: 67
04.11.2009, 22:47
Как насчет того, чтобы использовать функцию atof?
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
04.11.2009, 23:44  [ТС]
C++
1
i=atof(stack);
Всё равно 0 =((((
Может где-то ошибка в других функциях?
0
10 / 10 / 2
Регистрация: 01.11.2009
Сообщений: 67
04.11.2009, 23:52
Ваш код у меня выдает дофига ошибок (куча вольностей + не виндовский компилятор), так что проверить работу не могу. Но сами смотрите. Если у вас в stack действительно записано char-овское число вида "123.2", например, то atof() с этим должен прекрасно справляться!
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main () {
    char * test = "123.2";
    cout << atof(test)+0.8 << endl;
    return 0;
}
Проверьте, то ли лежит в stack перед преобразованием.
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
04.11.2009, 23:55  [ТС]
Уряя) нашел решение проблемы) Просто после выполнения участка кода с 93й строки по 96ю указатель на stack указывает не на начало массива а на пустой его элемент .
вопщем сунул туда
C++
1
i++;
(после 95й строчки.)
В 97ю добавил цикл)
C++
1
2
3
4
5
6
    
while (i!=0)
{
       *stack--;
        i--;
}
И после использовал стандарт-ю фун-ю sscanf
C++
1
sscanf(stack,"%ld",&i);
Но она работает вроде как только с десятичными числами.
А какая функ-я работает с любой наперёд заданной системой счисленя (у меня буковка p)?

вот что получилось

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double scan_buf(char *buf, char *oper, int p, char *stack)
{
    //int *pz;
    double i;
    i=0;
    while ((*buf!=0)&&(*buf!=*pz))
    {
        *stack++=*buf++;
        i++;
    }
    while (i!=0)
    {
        *stack--;
        i--;
    }
    sscanf(stack,"%ld",&i);
    return i;
}
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
05.11.2009, 00:00
А какая функ-я работает с любой наперёд заданной системой счисленя (у меня буковка p)?
Пробовал иногда читать что пишут ?
strtol().
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
05.11.2009, 00:11  [ТС]
C++
1
i=strol(stack,NULL,16);
Идентефикатор не найден .
Из какой библиотеки она?
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
05.11.2009, 00:24
Опечатался - strtol().
1
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
05.11.2009, 00:31  [ТС]
Спс. наверное то , что нужно.
Только объясните плиз , как её использовать .
C++
1
i=strtol(stack,NULL,16);
В том же алгоритме (пост №7 ) даёт 0 вместо желаемых 51.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
05.11.2009, 14:55
Использовать как обычно:
C
1
2
i= strtol( "100", NULL, 10 );
printf( "%d\n", i );
А ты убедись что у тебя в stack находится нужная строка.
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
05.11.2009, 20:47  [ТС]
хм. в stack попадает 51 . 0 писало потому-что %d в принтф ему не нравиццо . Но теперь вобще хрень какая-то вместо 51 почему-то 81 . В stack 51 . проверял .

Добавлено через 3 минуты
Ой...какой я бред написал !! извеняюсь ... неподумал.))))
Конечно же 51 в 16 ричной это 81 в 10тичной )))))
Просто
C++
1
 printf("%d", a);
Заменить на
C++
1
 printf("%lf", a);
В строчке 32
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.11.2009, 20:47
Помогаю со студенческими работами здесь

Перевод строки в число
Помогите пожалуйста. Требуется перевести строку типа string в число типа long double. К примеру string str = &quot;1111.11&quot; ...

Перевод строки в число
В программе пользователь вводит строку(день.месяц.год) и надо из этой строки отцепить день,месяц и год и привести их к integer

Перевод из строки в число
У меня задача: Иммется файл, в котором записано 12 вещественных чисел. Переписать все числа файла в массив в том же порядке. Т.е. я...

Перевод из строки в число
Подскажите в чем ошибка. Метод должен принимать строку в виде $456 654 456.36 и выдавать число типа double. double bMoney::getmoney() ...

Перевод строки в число
мне дали задание перевести строку в число ... но с одним условием не использовать стандартные программы ну так str2num или str2double .......


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru