26.04.2009, 19:41 | #11 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
26.04.2009, 19:41 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Я уверен, что решение данной темы уже встречалось Помогите решить задачи Помогите решить задачи Помогите решить задачи |
26.04.2009, 19:55 | #12 (permalink) |
Новичок
Регистрация: 13.03.2009
Сообщений: 2,101
Записей в дневнике: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1199
|
Си не знаю, но посм. линки,может помогут.
Интернет-Университет Информационных Технологий - дистанционное образование - INTUIT.ru Обратная польская запись — Википедия |
26.04.2009, 20:40 | #13 (permalink) |
Member
Регистрация: 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 |
26.04.2009, 21:26 | #14 (permalink) | |
Member
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
|
Вот окончательная версия: принимает от пользователя строки и обрабатывает их, как только вводится строка начинающаяся с символа решетки ('#') сразу прекращает работу.
Элементы должны быть разделены между собой пробелами. Т.е. так: Цитата:
Код:
#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 и т.д.) для лучшей понятности. |
|
27.04.2009, 18:51 | #15 (permalink) |
Новичок
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Очень выручили!!!! Просто ОГРОМНОЕ спасибо)))))
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
27.04.2009, 22:38 | #16 (permalink) |
Member
Регистрация: 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; } |
28.04.2009, 12:43 | #18 (permalink) |
Новичок
Регистрация: 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 ....); +тестирующая программа" очень очень буду благодарна! |
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) | ||
Member
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
|
Цитата:
Ну, не будем придираться к мелочам)) Вот, набросал тут, сама очередь работает - прогнал её пару раз по тестам. Тестирующую программу посмотрю гляну когда будет больше времени, если к этому моменту тут никто не допишет) Код:
#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 ); } Цитата:
|
||
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|