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


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

А если длина массива не известна на этапе компиляции, то можно ли его pass by value? Что там интернет говорит про это?
...
Рейтинг: 0 / 0
динамический #define
    #39987670
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и так понятно, что можно
ключевое слово __asm никто не отменял )))
...
Рейтинг: 0 / 0
динамический #define
    #39987674
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вообще это даром не нужно, т.к. есть
http://www.cplusplus.com/reference/cstdio/vsscanf/
...
Рейтинг: 0 / 0
динамический #define
    #39987677
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81проблем с формированием различных комбинаций шаблонов я не вижу.

Не надо ничего формировать. Четыре шаблона я назвал, они жёсткие и фиксированные. Ничего
дополнительного не нужно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987694
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81проблем с формированием различных комбинаций шаблонов я не вижу.

Не надо ничего формировать. Четыре шаблона я назвал, они жёсткие и фиксированные. Ничего
дополнительного не нужно.


Ну можно было бы наверно примерять эти шаблоны последовательно, а "удачные" последовательности запоминать, а в случае неудачи откатывать поток в начало. Потом вспоминать все верные последовптелтности доходя до точки неудачи и примерить другой шаблон и тд...
...
Рейтинг: 0 / 0
динамический #define
    #39987698
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
Вернее немного не так. Примеряем при помощи sscanf эти шаблоны последовательно. Если какой-то из шаблонов сработал, тогда заносим данные в стек, а строку режем и опять применяем алгоритм...
...
Рейтинг: 0 / 0
динамический #define
    #39987707
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если уже есть написанная программа для польского калькулятора с постфиксными выражениями,
и по заданию парсить нужно с помощью scanf, то изменений там будет по минимуму.
парсинг как был так и остается character by character
вот как это должно происходить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int main() {
	char c;
	printf("Input string:\n");
	scanf("%c", &c);
	while (c != 'X'){
		// Character processing goes here, for example
                printf("%c", c);
                scanf("%c", &c);
	}
}
...
Рейтинг: 0 / 0
динамический #define
    #39987719
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
если уже есть написанная программа для польского калькулятора с постфиксными выражениями,
и по заданию парсить нужно с помощью scanf, то изменений там будет по минимуму.
парсинг как был так и остается character by character
вот как это должно происходить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int main() {
	char c;
	printf("Input string:\n");
	scanf("%c", &c);
	while (c != 'X'){
		// Character processing goes here, for example
                printf("%c", c);
                scanf("%c", &c);
	}
}



это не круто совсем вырезать посимвольно при помощи scanf. для этого scanf и не нужен вовсе.
scanf умеет вырезать целыми словами исходя из шаблона. как минимум надо решать вырезая по одному "слову" (слово это набор символов заключенных между пробелов) как предлагалось выше. но так тоже не сильно прикольно :)
...
Рейтинг: 0 / 0
динамический #define
    #39987724
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попсовая задача этот калькулятор. Надо-бы его где-то отдельно опубликовать. Без этих scanf а в концептуальном виде.
...
Рейтинг: 0 / 0
динамический #define
    #39987726
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Но вообще это даром не нужно, т.к. есть
http://www.cplusplus.com/reference/cstdio/vsscanf/



вот это я бы назвал решением с полноценным использованием scanf с учетом подсказок Сибирякова.
Пусть у калькулятора есть 2 команды push и execute ну и pop которая используется в execute (эти функции описаны и интереса не представляют), которые выполняются исходя из "природы" поступаемых слов(слово это либо число, либо + * - /), тогда решение я считаю должно выглядеть примерно вот так :

Код: plaintext
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.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
#include <string.h>

#define N 500 //максимально возможная длина строки


const char pattern1[] = "%d %d %d";
const char pattern2[] = "%d %d %c";
const char pattern3[] = "%d %c";
const char pattern4[] = "%c";
bool allCalc = false;

void myTry(char* s) {

	int d1 = 0, d2 = 0, d3 = 0;
	int cutlengthString = 0;
	char c = '\0';
	if (strlen(s) == 0) { 
		allCalc = true; 
		return; 
	}
	if ((sscanf(s, pattern1, &d1, &d2, &d3)) == 3 && !allCalc) {
		printf("push numbers %d,%d,%d in stack \n", d1, d2, d3);
		cutlengthString = ((int)log10(d1) + 1) + ((int)log10(d2) + 1) + ((int)log10(d3) + 1)+3;//длина вырезаемой строки
		myTry(s+ cutlengthString);
	}
	if ((sscanf(s, pattern2, &d1, &d2, &c)) == 3 && !allCalc) {
		printf("push numbers %d,%d in stack and execute %c\n", d1, d2, c);
		cutlengthString = ((int)log10(d1) + 1) + ((int)log10(d2) + 1) + 1 + 3;//длина вырезаемой строки
		myTry(s + cutlengthString);
	}
	if ((sscanf(s, pattern3, &d1, &c)) == 2 && !allCalc) {
		printf("push number %d in stack and execute %c \n", d1, c);
		cutlengthString = ((int)log10(d1) + 1) +  3;//длина вырезаемой строки
		myTry(s + cutlengthString);
	}
	if ((sscanf(s, pattern4, &c)) == 1 && !allCalc) {
		printf("execute %c \n", c);
		cutlengthString = 2;//длина вырезаемой строки
		myTry(s + cutlengthString);
	}
	return;
}

int main()
{
	char String[N] = "40 123 456 890 123 - *";
	myTry(String);
}


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

Я бы назвал это фигнёй, которая упадёт на первом отрицательном операнде. Надо таки
использовать %n.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
динамический #define
    #39987750
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Успокойтесь. Вещественные числа тоже провалятся если подходить строго. Я ограничился урезвнными возможностями. В книге калькулятор тоже не рубил отрицательные(работе с отрицательными надо было научить программу в упражнении), правда с вещественными он справлялся. Так или иначе это не так уже важно
...
Рейтинг: 0 / 0
динамический #define
    #39987758
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81вот это я бы назвал решением

Я бы назвал это фигнёй, которая упадёт на первом отрицательном операнде. Надо таки
использовать %n.




Код: plaintext
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.
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <math.h>
#include <string.h>

#define N 500 //максимально возможная длина строки


const char pattern1[] = "%d %d %d";
const char pattern2[] = "%d %d %c";
const char pattern3[] = "%d %c";
const char pattern4[] = "%c";
bool allCalc = false;

int lenNumber(const int d)
{
if (d == 0) return 1;
	return log10(abs(d)) + (d < 0);
}

void myTry(char* s) {
	char copy[N] = "\0";
	int d1 = 0, d2 = 0, d3 = 0;
	int cutlengthString = 0;
	char c = '\0';
	if (strlen(s) == 0) { 
		allCalc = true; 
		return; 
	}
	if ((sscanf(s, pattern1, &d1, &d2, &d3)) == 3 && !allCalc) {
		printf("push numbers %d,%d,%d in stack \n", d1, d2, d3);
		cutlengthString = (lenNumber(d1) + 1) + (lenNumber(d2) + 1) + (lenNumber(d3) + 1)+3;//длина вырезаемой строки
		myTry(s+ cutlengthString);
	}
	if ((sscanf(s, pattern2, &d1, &d2, &c)) == 3 && !allCalc) {
		printf("push numbers %d,%d in stack and execute %c\n", d1, d2, c);
		cutlengthString = (lenNumber(d1) + 1) + (lenNumber(d2) + 1) + 1 + 3;//длина вырезаемой строки
		strncpy(copy, s, cutlengthString);
		myTry(s + cutlengthString);
	}
	if ((sscanf(s, pattern3, &d1, &c)) == 2 && !allCalc) {
		printf("push number %d in stack and execute %c \n", d1, c);
		cutlengthString = (lenNumber(d1) + 1) +  3;//длина вырезаемой строки
		myTry(s + cutlengthString);
	}
	if ((sscanf(s, pattern4, &c)) == 1 && !allCalc) {
		printf("execute %c \n", c);
		cutlengthString = 2;//длина вырезаемой строки
		myTry(s + cutlengthString);
	}
	return;
}
int main()
{

	char String[N] = "-40 -123 456 890 -123 - *";
	myTry(String);

}
...
Рейтинг: 0 / 0
динамический #define
    #39987761
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалил
...
Рейтинг: 0 / 0
динамический #define
    #39987774
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
Отрицательные числа в польской записи выглядят так:
0 10 -
2)
в польской постфикс записи используется один единственный шаблон: число число оператор
...
Рейтинг: 0 / 0
динамический #define
    #39987777
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
1)
Отрицательные числа в польской записи выглядят так:
0 10 -
2)
в польской постфикс записи используется один единственный шаблон: число число оператор




1) неважно, уже научили работать с отрицательными
2) а как же классический пример ? ? 2 6 + 3 8 - *
...
Рейтинг: 0 / 0
динамический #define
    #39987778
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

это не круто совсем вырезать посимвольно при помощи scanf. для этого scanf и не нужен вовсе.
scanf умеет вырезать целыми словами исходя из шаблона. как минимум надо решать вырезая по одному "слову" (слово это набор символов заключенных между пробелов) как предлагалось выше. но так тоже не сильно прикольно :)

я согласна, но это самое простое решение с минимальной модификацией уже написанного кода.
из предложенных вариантов, я бы рассмотрела токены и комбинацию scanf("%d"), scanf("%c").
с шаблонами можно сделать прикольное решение через рекурсию, но придется заморачиваться со строками, и, приняв во внимание весь оверхед, это уже не выглядит так уж круто.
...
Рейтинг: 0 / 0
динамический #define
    #39987779
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
я не углублялась в изучение польской записи, поэтому про классический пример ничего сказать не могу.
просто вместо того, чтобы делать костыли, лучше объявить, что наш калькулятор с отрицательными числами работает так
-10 = 0 10 -
:)
...
Рейтинг: 0 / 0
динамический #define
    #39987780
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,

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

в любом случае, в постфикс польской записи, шаблон будет один, и это (число число оператор)
(число может быть отрицательным и положительным)
...
Рейтинг: 0 / 0
динамический #define
    #39987783
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поясню:
mini.weblab

-10 = 0 10 -

имеется ввиду, что при начальном вводе данных можно записывать математическое выражение из целых неотрицательных чисел,
дальше, уже в числовом стеке, 0 10 - будет записано как -10
мотивация: если используется польский постфикс (machine oriented approach), то почему бы не записать отрицательное число в удобной нам форме?
...
Рейтинг: 0 / 0
динамический #define
    #39987786
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
andron81,

в любом случае, в постфикс польской записи, шаблон будет один, и это (число число оператор)
(число может быть отрицательным и положительным)


Я к тому, что классический пример польской записи(а надо немного углубиться :)) с вашим шаблоном не дружит. Здесь 2 раза выйдет применить ваш шаблон, а потм уткнемся в *

1 2 + 3 4 - *

С отрицательными числами вас думаю все пончли. Но не велика проблема. Решается легко. Либо дейсвительно вашим способом, либо немного усовершенствовав код.
Разве моя реализация с шаблонами уж очень сложна?и рекурсия как вы любите:)
...
Рейтинг: 0 / 0
динамический #define
    #39987789
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
а давайте я все-таки попробую:
1 2 + 3 4 - * = 3 3 4 - * = 3 -1 * = -3

вот работа постфикса ( в данном случае не обсуждаем, как это запрограммировать на С :) ):
поиск шаблона -> нашли -> посчитали -> записали результат: повторяем пока не останется одно единственное число
...
Рейтинг: 0 / 0
динамический #define
    #39987791
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
Я понял. У вас подход другой.
Но такие страсти не требуются. Калькулятор реализованный в k&r работает иначе чем вы думаете. В результате все проще.

P. S. Вы таким образом описали реализацию самого калькулятора работающего по другому алгоритму отличного от того что у k&r :))
...
Рейтинг: 0 / 0
динамический #define
    #39987873
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что в итоге получилось, правда, со стэком я немного схалтурила :-)
Код: plaintext
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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int sscanf_result;
    float num, v1 = 0, v2 = 0;
    char op;
    float stack[100] = {0};

    int stack_counter = 0;
    char expression[100] = {'\0'};

    printf("Enter an expression: ");
    fgets(expression, 100, stdin);

    char *token = strtok(expression, " ");
    while(token) {
        printf("%s\n", token);
        sscanf_result = sscanf(token, "%f", &num);
        if (sscanf_result == 1) {
        	stack[stack_counter] = num;
        	stack_counter++;
        } else {
        	sscanf_result = sscanf(token, "%c", &op);
        	v2 = stack[stack_counter-1];
        	v1 = stack[stack_counter-2];
        	stack_counter = stack_counter - 2;
        	switch(op) {
				case '+':
					stack[stack_counter] = v1 + v2;
					break;
				case '-':
					stack[stack_counter] = v1 - v2;
					break;
				case '*':
					stack[stack_counter] = v1 * v2;
					break;
				case '/':
					stack[stack_counter] = v1 / v2;
					break;
				default:
					printf("Invalid operator: %c.\n", op);
					exit(1);
        	}
        	stack_counter++;
        }
        token = strtok(NULL, " ");
    }
    if (stack_counter == 1)
        printf("\nResult: %.4f\n", stack[stack_counter - 1]);
    else {
    	printf("Expression Error: numbers and operators are not balanced.\n");
    	exit(2);
    }
    return 0;
}


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


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