powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамический #define
25 сообщений из 88, страница 2 из 4
динамический #define
    #39987510
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
они и не предлагали . они решали задачу о разнесении введенной даты в переменные по средствам sscanf :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
while (getline(line, sizeof(line)) > 0) {
 if (sscanf(line, "%d %s %d", &day, monthname, &year) == 3)
 printf("верно: %s\n", line); /* в виде 25 дек 1988 */
 else if (sscanf(line, "%d/%d/%d", &month, &day, &year) == 3)
 printf("верно: %s\n", line); /* в виде mm/dd/yy */
 else
 printf("неверно: %s\n", line); /* неверная форма даты */
}


где функция getline чтение из потока строки (до того как встретиться \n)
поэтому в этой задаче я решил пойти подобным путем. только паттернов больше будет и sscanf.
поэтому динамически планировал их делать
...
Рейтинг: 0 / 0
динамический #define
    #39987512
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

лучше всего в качестве переменных использовать элементы двух массивов с типами int (для чисел) и char (для +, *, / , -)

IMHO
Если понять, что "элементы двух массивов с типами int (для чисел) и char" полный бред, то желание использовать scanf так же пропадет.

Должно быть не два массива, а "токен" с типом: или константа (на самом деле, __операция__ записи числа в стек) или арифметическая операция (извлечение чисел из стека, выполнения операции над числами, запись результата в стек)

Соответственно scanf ничем помочь не сможет и он не нужен. Нужна ф-ция определяющая тип токена по его содержимому, можно для начала вообще какой нибудь гуано-код на if сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if strcmp( token_str, "+" ) {
  Plus_Operator;
} else if ( strcmp( token_str, "-" )==0 )  {
  Minus_Operator;
} else if ( strcmp( token_str, "*" )==0) ) {
   Mul_Operator;
} else if ( strcmp( token_str, "/" )==0 ) {
   Div_Operator;
} else {
   Parse_Value_And_Push( token_str );
}


p.s. На C давно не писал, т.ч. могу ошибаться
p.p.s. Сам бы я на if делать не стал бы, но для первого приблежения мне кажется сойдет.
...
Рейтинг: 0 / 0
динамический #define
    #39987514
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81или я неверно тебя понимаю

Да. С какого-то перепою ты scanf прочитал как sscanf.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987520
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а разница ? одна читает из потока, вторая из строки. Ну ладно, сейчас переделаю на scanf
...
Рейтинг: 0 / 0
динамический #define
    #39987528
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
scanf передвигает указатель потока на конец прочитанных данных
sscanf ничего не передвигает, поэтому его неудобно использовать для поэлементного чтения строки (надо вручную считать смещение с которого надо продолжать)
...
Рейтинг: 0 / 0
динамический #define
    #39987530
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
надо вручную считать смещение с которого надо продолжать

см. параметр %n в sscanf
...
Рейтинг: 0 / 0
динамический #define
    #39987533
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyего неудобно использовать для поэлементного чтения строки (надо вручную считать смещение с
которого надо продолжать)

man говорит, что есть шаблон %n, который способен это сделать за тебя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987543
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
man говорит, что есть шаблон %n, который способен это сделать за тебя.

Да, я выше написал.
Но это нужна адресная арифметика, самое то для новичков ))
...
Рейтинг: 0 / 0
динамический #define
    #39987548
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а как ваще ?
у меня 2 разных шаблона это
1.%d или как вы хотите %n (мне тоже с ним не повезло)
2.%с
я читаю "пообъектно" поток (под объектом будем подрузамевать или число или символ + * / - )
когда читается объект scanf() с шаблоном %n (- тут указана интовая переменная для сохранения), а объект оказался например символьной и в результате этот объект нигде не сохранен и утерян...
следующий scanf его уже не прочитает.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main()
{
	int numb[N] = {0};
	char oper[N] = { '\0' };
//	char str[] = "10 30 + 90 70 - *";
	int indexNumb = 0;
	int indexOper = 0;

	for (int i = 0; i < N; i++)
		if ((scanf("%n ", &numb[indexNumb])) > 0) indexNumb++;  
	else 
		if ((scanf("%c ", &oper[indexOper])) > 0)   indexOper++;
}
...
Рейтинг: 0 / 0
динамический #define
    #39987555
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

%n надо использовать в том же вызове sscanf.

Код: plaintext
1.
2.
3.
4.
while (sscanf(line, " %d%n", &n, &offset) == 1) {
        line += offset;
        ...
}



Для scanf он вообще не нужен.
Код: plaintext
1.
2.
3.
while (scanf(" %d", &n) == 1) {
        ...
}
...
Рейтинг: 0 / 0
динамический #define
    #39987558
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81а как ваще ?

Моск включить, чтобы не тупо повторять всё, что тебе говорят, а ещё и понимать смысл,
скрытый за соловами.

scanf и %n две взаимозаменяемые вещи, а не совместно используемые.

выше тебе уже код привели.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main()
{
   char buf[20];
   while (scanf("%s", buf) != EOF)
   {
     if (strcmp(buf, "+") == 0)
       do_add();
     else
     {
       int i;
       if (sscanf(buf, "%d", &i) == 0) printf("хрень какая-то"); return 1;
       do_push(i);
     }
   }
   printf("результат = %d", do_pop());
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987563
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky


Для scanf он вообще не нужен.
Код: plaintext
1.
2.
3.
while (scanf(" %d", &n) == 1) {
        ...
}





ваш цикл будет выполняться пока в потоке числа идут, а если + * / - , то этот символ никуда не сохранится потому что n-интовая переменная наверно.
...
Рейтинг: 0 / 0
динамический #define
    #39987571
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main()
{
   char buf[20];
   while (scanf("%s", buf) != EOF)
   {
     if (strcmp(buf, "+") == 0)
       do_add();
     else
     {
       int i;
       if (sscanf(buf, "%d", &i) == 0) printf("хрень какая-то"); return 1;
       do_push(i);
     }
   }
   printf("результат = %d", do_pop());
}




Да но это не то, что я хотел бы увидеть. так и я умею. это тупое сливание объекта в "строку" и анализ на предмет какой это природы.
я предполагал , что использовав sscanf можно слить непосредственно в переменные исходя из шаблона: что - то вроде вот этого примера из K&R
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
while (getline(line, sizeof(line)) > 0) {
 if (sscanf(line, "%d %s %d", &day, monthname, &year) == 3)
 printf("верно: %s\n", line); /* в виде 25 дек 1988 */
 else if (sscanf(line, "%d/%d/%d", &month, &day, &year) == 3)
 printf("верно: %s\n", line); /* в виде mm/dd/yy */
 else
 printf("неверно: %s\n", line); /* неверная форма даты */
}
...
Рейтинг: 0 / 0
динамический #define
    #39987579
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

...что - то вроде вот этого примера из K&R

Примера как НЕ надо делать?

http://lib.ru/ANEKDOTY/osterwred.txt
...
Рейтинг: 0 / 0
динамический #define
    #39987590
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
andron81

...что - то вроде вот этого примера из K&R

Примера как НЕ надо делать?

http://lib.ru/ANEKDOTY/osterwred.txt


В книге и разобрана эта задача ранее токенами и читалось getchar ом. Ясен болт, что при помощи scanf и sscanf наверно не очень прикольно делать. Ну уж извините меня, что выбрал не ту книгу в которой только что пример был смотреть ввше и сделать просили именно scanами, и я буду иметь ввиду, что для вас K&R два маразматика.
...
Рейтинг: 0 / 0
динамический #define
    #39987614
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

и сделать просили именно scanами

Можно ссылку на книгу и страницу с оригинальной постановкой задачи.

В Вашем сообщении, два момента, которые "бредовые"
1. парсинг с помощью scanf
один токен преобразовать элементарно, банально заменив atoi на sscanf - зачем, не очень понятно, но можно.
парсить все выражение - какой-то безумство. Начиная с "оговариваем сколько максимально параметров может быть . Пусть это дефайн N", одно это все решение преврашает в какой-то .... (цензурных слов не находится) Сомневаюсь, что бы K&R были настолько садисты по отношению к пользователям.
2. даже если Вы отпарсите, как хотите, счастье это принести НЕ может. Т.к. ДВА разных массива с операндами и операциями это НЕ калькулятор, а какая-то помойка. Важен порядок следования операндов и операций, а он будет потерян.
к примеру:
10 30 + 90 70 - * = (10+30)*(90-70) = 800
а
10 30 90 70 + - *
при вычисление на стеке это: 10 * (30-(90+70)) = -1300
как бы две большие разницы

Т.ч. по всему топику, возникает два вопроса:

1) "Всё это безумие ? ДА"
2) "но так я вижу реализацию"
реализацию ЧЕГО Вы так видите?
Явно это НЕ "основанную на постфиксной записи программу калькулятора"
...
Рейтинг: 0 / 0
динамический #define
    #39987620
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K & R делали книжки:
a) В Америки и для Америки, сейчас глобализация и их вольный подход к интерпритации строк в качестве дат дичь полнейшая.
b) Мало того, предположу, что кроме K & R над книжкой еще "поработал" переводчик и возможно технический редактор (после переводчика).
...
Рейтинг: 0 / 0
динамический #define
    #39987627
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ваш цикл будет выполняться пока в потоке числа идут, а если + * / - , то этот символ никуда не сохранится потому что n-интовая переменная наверно.

Все правильно. Потому что я не решение вашей задачи писал, а показывал как работает scanf/sscanf на абстрактном примере.
...
Рейтинг: 0 / 0
динамический #define
    #39987637
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81я предполагал , что использовав sscanf можно слить непосредственно в переменные исходя из
шаблона

Теоретически можно. И я даже могу догадаться как, но попробуйте решить эту головоломку сами.

Подсказка: в строке может быть только повторяющая последовательность из следующих шаблонов:

%d %d %d
%d %d %c
%d %c
%c
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987643
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

Можно ссылку на книгу и страницу с оригинальной постановкой задачи.

английской версией книги я не располагаю.
я вам копипастил текст из книги. но если вы не верите, то вот:


ссылка

стр. 153
и выше пример с обработкой даты


Leonid Kudryavtsev

В Вашем сообщении, два момента, которые "бредовые"
1. парсинг с помощью scanf
один токен преобразовать элементарно, банально заменив atoi на sscanf - зачем, не очень понятно, но можно.
парсить все выражение - какой-то безумство. Начиная с "оговариваем сколько максимально параметров может быть . Пусть это дефайн N", одно это все решение преврашает в какой-то .... (цензурных слов не находится) Сомневаюсь, что бы K&R были настолько садисты по отношению к пользователям.


я не отрицаю , что бредовые. но будь у #define возможности те о которых я запрашивал в самом начале думаю этот бред был бы реализуем. ну тут все точки над уже расставлены.

Leonid Kudryavtsev

2. даже если Вы отпарсите, как хотите, счастье это принести НЕ может. Т.к. ДВА разных массива с операндами и операциями это НЕ калькулятор, а какая-то помойка. Важен порядок следования операндов и операций, а он будет потерян.
к примеру:
10 30 + 90 70 - * = (10+30)*(90-70) = 800
а
10 30 90 70 + - *
при вычисление на стеке это: 10 * (30-(90+70)) = -1300
как бы две большие разницы


это не сильно относится к теме. я вам всем до какого-то момента про то что это постфиксный калькулятор вообще умалчивал, а потом пришлось. это всё для того чтобы вы не грузились лишним и не уходили не в то русло. Кроме вас кстати это никого и не взволновало. скажу одно, что для верной последовательности служил бы разбор подобранного шаблона . но даже если бы я и зашел бы в какой - нибудь косяк это был бы мой косяк, и я откатился бы назад, ничего в этом страшного нет. но повторюсь это другая тема.
...
Рейтинг: 0 / 0
динамический #define
    #39987645
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
K & R делали книжки:
a) В Америки и для Америки, сейчас глобализация и их вольный подход к интерпритации строк в качестве дат дичь полнейшая.


это ваше мнение.
...
Рейтинг: 0 / 0
динамический #define
    #39987648
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov



%d %d %d
%d %d %c
%d %c
%c


проблем с формированием различных комбинаций шаблонов я не вижу.
я вижу только то, что статично в скане надо подставить элементы массива в качестве параметров.
а это можно сделать только или прописав их - значит их количество прописывается жестко, ну а 2 ой вариант динамический макрос который потерпел фиаско.
...
Рейтинг: 0 / 0
динамический #define
    #39987650
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Поищите в сети алгоритмы калькуляторов с поддержкой скобок и т.д. Очень простые и красивые. Они переводят выражение в естественном виде в польскую запись и там всё красиво вычисляется.
...
Рейтинг: 0 / 0
динамический #define
    #39987651
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81,

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


такая задача предо мной не стоит
...
Рейтинг: 0 / 0
динамический #define
    #39987661
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
я вижу только то, что статично в скане надо подставить элементы массива в качестве параметров.
а это можно сделать только или прописав их - значит их количество прописывается жестко, ну а 2 ой вариант динамический макрос который потерпел фиаско.


Из интернета:
Если длина массива известна на этапе компиляции, то можно упаковать его в struct и передать pass by value.

Сам так никогда не делал, ставить эксперименты и лень и не где.
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамический #define
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]