Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 26.04.2009, 19:41   #11 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Fonochka Посмотреть сообщение
Заранее очень благодарна хоть в какой-то помощи))
Ну если "хоть в какой-то"... Задайте поиск в Сети по ключевым словам "Польская запись", "Польская нотация". В принципе, как я понимаю, это оно и есть. Попадались мне и программы на СИ. Больше ничем помочь, увы, не могу.
Vladimir_S вне форума   Ответить с цитированием

Старый 26.04.2009, 19:41
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Я уверен, что решение данной темы уже встречалось

Помогите решить задачи
Помогите решить задачи
Помогите решить задачи

Старый 26.04.2009, 19:55   #12 (permalink)
SQL
Новичок
 
Аватар для SQL
 
Регистрация: 13.03.2009
Сообщений: 2,101
Записей в дневнике: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1199
По умолчанию

Си не знаю, но посм. линки,может помогут.
Интернет-Университет Информационных Технологий - дистанционное образование - INTUIT.ru
Обратная польская запись — Википедия
SQL вне форума   Ответить с цитированием
Старый 26.04.2009, 20:40   #13 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Вот, набросал стековый калькулятор
Только сам калькулятор - ввод с клавиатуры не реализовывал, сейчас подумаю...
Но считает и выводит на экран по условию задачи тут прописан пример - умножает числа 3, 5 и выводит на экран.
Код:
#include <stdio.h>

#define STACK_LENGTH 20

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void add() /* Сложение */
{
	push( pop() + pop() );
}

void sub() /* Вычетание */
{
	push( pop() - pop() );
}

void mul() /* Умножение */
{
	push( pop() * pop() );
}

void div() /* Деление */
{
	push( pop() / pop() );
}

void print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", pop() );
}

/* Главная функция */
int main()
{
	init();
	push(3);
	push(5);
	mul();
	
	print();

	return 0;
}

Последний раз редактировалось csbwalker; 26.04.2009 в 20:45
csbwalker вне форума   Ответить с цитированием
Старый 26.04.2009, 21:26   #14 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Вот окончательная версия: принимает от пользователя строки и обрабатывает их, как только вводится строка начинающаяся с символа решетки ('#') сразу прекращает работу.
Элементы должны быть разделены между собой пробелами.
Т.е. так:
Цитата:
1 23 + 4 -
5 1 - * .
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_LENGTH 80
#define BUFFER_LENGTH 81

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void stack_push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int stack_pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void stack_init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void stack_add() /* Сложение */
{
	stack_push( stack_pop() + stack_pop() );
}

void stack_sub() /* Вычетание */
{
	stack_push( stack_pop() - stack_pop() );
}

void stack_mul() /* Умножение */
{
	stack_push( stack_pop() * stack_pop() );
}

void stack_div() /* Деление */
{
	stack_push( stack_pop() / stack_pop() );
}

void stack_print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", stack_pop() );
}

/* Функции работы с пользователем */
void parse(char *str) /* Функция распознавания строки */
{
char *st;

	for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " "))
	{
		switch(*st)
		{
			case '+':
				stack_add();
				break;
			case '-':
				stack_sub();
				break;
			case '*':
				stack_mul();
				break;
			case '/':
				stack_div();
				break;
			case '.':
				stack_print();
				break;
			default:
				stack_push(atoi(st));
				break;
		}
	}
}


/* Главная функция */
int main()
{
char buf[BUFFER_LENGTH];

	stack_init(); // Инициализируем стек

	buf[0] = BUFFER_LENGTH; // Устанавливаем максимальную длину буфера ввода

	printf( "Введите строки для вычисления:\n" );
	printf( "(для выхода введите строку, начинающуюся с символа '#')\n" );

	for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их
		parse(buf);
	
	return 0;
}
Ну вот как-то так...

P.S. Немного исправил имена (pop на stack_pop и т.д.) для лучшей понятности.
csbwalker вне форума   Ответить с цитированием
Старый 27.04.2009, 18:51   #15 (permalink)
Fonochka
Новичок
 
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Очень выручили!!!! Просто ОГРОМНОЕ спасибо)))))
Fonochka вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 27.04.2009, 22:38   #16 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Упс...одна строчка лишняя затесалась!!!
На работу программы она никак не влияет, но все-таки она лишня!!!!!
Я сначала через cgets ввод делал - потом вспомнил что он не везде есть)

Вот эту строчку из main убрать надо:
Код:
buf[0] = BUFFER_LENGTH; // Устанавливаем максимальную длину буфера ввода
Вот окончательная версия:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_LENGTH 80
#define BUFFER_LENGTH 81

/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];


/* Функции самого стека */
void stack_push(int n) /* Добавить элемент в стек */
{
	if( Stack_Count < STACK_LENGTH )
		Stack_Array[Stack_Count++] = n;
}

int stack_pop() /* Извлечь элемент из стека */
{
	if(Stack_Count != 0)
		return Stack_Array[--Stack_Count];
	else
		return 0;
}

void stack_init() /* Начальная инициализация стека*/
{
	Stack_Count = 0;
}


/* Функции стекового калькулятора */
void stack_add() /* Сложение */
{
	stack_push( stack_pop() + stack_pop() );
}

void stack_sub() /* Вычетание */
{
	stack_push( stack_pop() - stack_pop() );
}

void stack_mul() /* Умножение */
{
	stack_push( stack_pop() * stack_pop() );
}

void stack_div() /* Деление */
{
	stack_push( stack_pop() / stack_pop() );
}

void stack_print() /* Печать последнего элемента */
{
	printf( "Last: %d\n", stack_pop() );
}

/* Функции работы с пользователем */
void parse(char *str) /* Функция распознавания строки */
{
char *st;

	for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " "))
	{
		switch(*st)
		{
			case '+':
				stack_add();
				break;
			case '-':
				stack_sub();
				break;
			case '*':
				stack_mul();
				break;
			case '/':
				stack_div();
				break;
			case '.':
				stack_print();
				break;
			default:
				stack_push(atoi(st));
				break;
		}
	}
}


/* Главная функция */
int main()
{
char buf[BUFFER_LENGTH];

	stack_init(); // Инициализируем стек

	printf( "Введите строки для вычисления:\n" );
	printf( "(для выхода введите строку, начинающуюся с символа '#')\n" );

	for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их
		parse(buf);
	
	return 0;
}
P.S. Сорри всем что новым постом кидаю - если старый править то не заметят боюсь))
csbwalker вне форума   Ответить с цитированием
Старый 28.04.2009, 12:25   #17 (permalink)
Fonochka
Новичок
 
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо!!!)))))))
Fonochka вне форума   Ответить с цитированием
Старый 28.04.2009, 12:43   #18 (permalink)
Student=)
Новичок
 
Регистрация: 28.04.2009
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

здравствуйте!буду очень признательна, если поможете!
нужно написать программу в си!
заключается в следующем:
"реализовать модуль для работы с очередью из целых чисел через двусвязный список.
должны быть:
struct InQueue {
...
};

int enqueue(struct IntQueue *q, int x);
int dequeue(struct IntQueue *q, int *x);
void init_queue(struct IntQueue *q);
void free_queue(struct ....);

+тестирующая программа"

очень очень буду благодарна!
Student=) вне форума   Ответить с цитированием
Старый 28.04.2009, 23:54   #19 (permalink)
бородёнок
Новичок
 
Регистрация: 28.04.2009
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

здравствуйте, у меня большая проблема((, задача на зачет никак не получается, помогите, буду превысоко благодарен...

вот текст задачи:

Сортировка строк текста считанных с stdin. Сохранить в динамической памяти, массив. метод сортировки-выборкой. Результат на stdout.

P.S. очень нужно, вопрос жизни и смерти...
бородёнок вне форума   Ответить с цитированием
Старый 29.04.2009, 14:32   #20 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от Student=) Посмотреть сообщение
здравствуйте!буду очень признательна, если поможете!
нужно написать программу в си!
заключается в следующем:
"реализовать модуль для работы с очередью из целых чисел через двусвязный список.
должны быть:
struct InQueue {
...
};

int enqueue(struct IntQueue *q, int x);
int dequeue(struct IntQueue *q, int *x);
void init_queue(struct IntQueue *q);
void free_queue(struct ....);

+тестирующая программа"

очень очень буду благодарна!
Немножко не та тема - тут по C++, а задание явно на C, лучше было бы создать новую тему.
Ну, не будем придираться к мелочам))

Вот, набросал тут, сама очередь работает - прогнал её пару раз по тестам.
Тестирующую программу посмотрю гляну когда будет больше времени, если к этому моменту тут никто не допишет)

Код:
#include <stdio.h>

#define MAXCOUNT 100

#define FAIL 0;
#define SUCCESS 1;

struct IntQueue
{
	int Array[MAXCOUNT];
	int *first;
	int count;
};

int enqueue(struct IntQueue *q, int x)
{
int *next = q->first + q->count;

	if(q->count >= MAXCOUNT)
		return FAIL;

	q->count++;
	*next = x;

	return SUCCESS;
}

int dequeue(struct IntQueue *q, int *x)
{
	if(q->count < 1)
		return FAIL;

	*x = *(q->first);

	if(q->first == q->Array + MAXCOUNT)
		q->first = q->Array;
	else
		q->first++;

	q->count--;

	return SUCCESS;
}

void init_queue(struct IntQueue *q)
{
	q->first = q->Array;
	q->count = 0;
}

void free_queue(struct IntQueue *q)
{
	q->count = 0;
}

int main()
{
struct IntQueue it;
int n;

	init_queue( &it );
	
	enqueue( &it, 5 );
	enqueue( &it, 6 );
	enqueue( &it, 7 );
	
	dequeue( &it, &n );
	printf( "Первое: %d\n", n );

	dequeue( &it, &n );
	printf( "Второе: %d\n", n );

	dequeue( &it, &n );
	printf( "Третье: %d\n", n );

}

Цитата:
Сообщение от бородёнок Посмотреть сообщение
здравствуйте, у меня большая проблема((, задача на зачет никак не получается, помогите, буду превысоко благодарен...

вот текст задачи:

Сортировка строк текста считанных с stdin. Сохранить в динамической памяти, массив. метод сортировки-выборкой. Результат на stdout.

P.S. очень нужно, вопрос жизни и смерти...
До какого времени актуально? Задача не сложная, помочь могу, но банально не хватает времени.
csbwalker вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 10:58.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.