Я начинающий, подскажите как...(Все вопросы начинающих - постить только здесь!!!)
#include <stack>
#include <string>
#include <queue>
using namespace std;
int prior(char a) // возвращает приоритет лексемы
{
switch(a)
{
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case '.':
return 0;
case '(':
return 1;
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
}
}
int main()
{
stack<char> st;
queue<string> outString;
string inString;
string cache;
cache.clear();
cout << "Vvedite stroku: ";
cin >> inString;
int inStrLen = inString.length();
for(int i=0; i<inStrLen; i++)
{
char cur_tok = inString; // текущая лексема
if(prior(cur_tok)==0) // если число или точка
{
cache += cur_tok; //положить в кэш
continue;
}
else // если текущая лексема - знак операции
{
if(!cache.empty())
{
outString.push(cache); // добавить число из кэша в выходную строку
cache.clear();
}
if(cur_tok=='(')
{
st.push('('); // если открывающая скобка, положить в стек
continue;
}
if(cur_tok==')') // если закрывающая скобка
{
while(st.top()!='(') // пока не дойдём до открывающей скобки
{
outString.push(cache=st.top()); //выталкиваем всё из стэк в выходную строку
st.pop();
}
st.pop(); // выталкиваем саму скобку
cache.clear();
continue;
}
if(st.empty()) // если стэк пустой
{
st.push(cur_tok); // заталкиваем текущую лексему в стек
continue;
}
else
{
if(prior(cur_tok)<=prior(st.top())) // если приоритет текущей лексемы меньше или
// равен приоритету лексемы на вершине стека
while(prior(cur_tok)<=prior(st.top()))
{
outString.push(cache=st.top()); // выталкиваем из стека все лексемы с большим или равным приоритетом
cache.clear();
st.pop();
}
st.push(cur_tok); // кладём текущую лексему в стек
continue;
}
}
}
if(!cache.empty()) outString.push(cache); // очищаем кэш
while(!st.empty())
{
outString.push(cache=st.top()); // выталкиваем из стека оставшиеся лексемы в выходную строку
st.pop();
}
while(!outString.empty())
{
cout << outString.front() << " ";
outString.pop();
}
return 0;
}
компилятор утверждает что я насилую память... покажите как должно быть ибо опыт программирования отсутствует и сам найти ошибку не могу. Код должен переводить арифметическое выражение из инфиксной формы записи в обратную польскую нотацию по такому алгоритму:
- читаем символ из строки
- определяем его приоритет
- если символ число, добавляем его в выходную строку
- если символ открывающая скобка, кладём в стек
- если закрывающая скобка, выталкиваем всё из стека в выходную строку до открывающей скобки, удаляем из стека открывающую скобку
- если знак операции и стек пустой, кладём в стек
- если знак операции и стек не пустой, сравниваем приоритет взятой операции с приоритетом операции на вершине стека и:
- если приоритет операции на вершине стека меньше, кладём в стек взятый символ
- если больше или равен - выталкиваем из стека все операции с равным или большим приоритетом в выходную строку, а взятую операцию кладём в стек
- когда вся строка пройдена, выталкиваем содержимое стека в выходную строку
в качестве выходной строки решил использовать очередь, т.к. с ней в дальнейшем будет удобно работать...
Заранее спасибо!
Почему в С++ не могут быть перегружены следующие операторы: "?:" , "," , "sizeof" "::"
Буду очень благодарен если поможете!
Почему в С++ не могут быть перегружены следующие операторы: "?:" , "," , "sizeof" "::"
Буду очень благодарен если поможете!
ну к примеру перегрузишь запятую:
как потом определит компилятор строку: int a, b, c; ?
или перегрузишь "::" - что поучится при такой записи: CSomeClass::SomeMethod();
ЗЫ: синтаксис языка на них основан
Почему в С++ не могут быть перегружены следующие операторы: "?:" , "," , "sizeof" "::"
Буду очень благодарен если поможете!
А какую бы функциональность ты хотел получить от перегрузки, например, [FONT="Courier New"]sizeof[/FONT]?
У меня на эту строчку ругается, что нет такого пространства имен.
Я поставил Visual Studio, DirectX SDK, и еще какой-то Direct Redist. Чего еще не хватает? Что-то надо прописать в Visual Studio?
У меня на эту строчку ругается, что нет такого пространства имен.
Глупый вопрос от Pliteron'а: соответствующий .h-файл подключен?
Я сделал по инструкции: добавил в пути папки LIB и INCLUDE
Вы имеете ввиду ручками в в исходнике прописать include xxxxx.h? Дык там 157 штук. Какой из них прописывать???
Есть файл вида:
слово1 слово2 слово3
Нужно загрузить каждое слово в отдельный массив. Слова переменной длины, поэтому хочется грузить в char *str, *str1, *str2; И как потом обращаться к отдельным словам по индексам(т.е. в str указатели на 1 столбец, нужно обращаться по строкам) ?
Да. В скачанном мной с http://www.gamedev.ru примере фигурируют d3drmwin.h и 3dplus.h.
Нет. Только под Windows CE-base устройства.
Что-то по этой теме есть тут и тут, и тут (Rus)
А вообще, лучше посетить http://forum.nokia.com/ и http://developer.symbian.com/.Там можно поживиться свежей инфой по этому поводу
Есть массив типа char в нем хранятся данные в виде байтов считанных из файла. Подскажите пожалуйста как можно к элементам массива добавить значения полученые в результате других вычислений( напр sin() ) типа double или int.
Спасибо
Есть типа char заполненный байтами считанными из файла. Подскажите пожалуйста, как можно к элементам этого массива добавить результаты других вычислений (напр sin(x) и др).
И еще есть проблема с выводом. Для вывода массива в файл я использовал ф-цию
printf("%d ", data);
то возникают проблемы: появляются отрицательные значения, и многие значения не соответствуют исходным.
Спасибо
void __fastcall TForm1:utton1Click(TObject *Sender)
{
TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);
reg->RootKey= HKEY_LOCAL_MACHINE;
reg->OpenKey("SYSTEM\\CurrentControlSet\\Enum\\USBSTOR", 0);
Edit1->Text =reg->CurrentPath ;
reg->GetKeyNames(ListBox1->Items) ;
reg->CloseKey();
}
C другими ветками получается нормально. Нужны какие-то дополнительные права на чтение? В чем причина? (Borland Builder6)
Да вы что?Сами же читаете из ControlSet001,а ещё удивляетесь
А вообще,CurrentControlSet–это вроде как отображение одной из веток…как HKey_Classes_Root,например
Немного не то написал в вопросе - просто я пробовал разные ControlSet и вначале окрывал ключи последовательно:
reg->OpenKey("SYSTEM", 0);
reg->OpenKey("ControlSet001", 0);
...
Edit1->Text=reg->CurrentPath;
Если ключ был в Enum - то в Edit появлялось "SYSTEM\ControlSet001", если он находился в другом месте, то путь отображался полностью (до последнего открытого ключа). Я наставил галок на полный доступ через regedit и Enum теперь открывается.
Как пользоваться визуальным редактором для создания вкладок (Tab Control)?
Кидаю на форму TabControl, позиционирую, задаю свойства. А дальше? Как создать собственно вкладки и разместить на них другие элементы управления?
Вдогонку: посоветуйте, что почитать есть по WTL. Сам нашел только статьи на RSDN "Использование WTL" и "Эффективное использование WTL"
А что, в Visual Studio пишется ногами, или, как в известном бояне, программист загружает Студию, потом стучит жопой по клаве?
Я, конечно, издеваюсь. Вместо WindowsForms, MFC и прочего используйте WinAPI. В той жес студии есть такой тип проектов. Это, если я правильно понял вопрос
[FONT="Courier New"]MyButton->Enable = (true или false)[/FONT]
Кажется это нужно делать через WinAPI командой RegSetSecurityKey, но разобраться во всех этих DALC, ALCб, SID не смог (все, что нашел было на английском).
Кажется это нужно делать через WinAPI командой RegSetSecurityKey
Это похоже на вопрос для начинающих? Функция называется RegSetKeySecurity
ну а что поделаешь... Тема непростая, нужно разобраться во всех этих DACL, SACL, SID. И придется читать на английском (есть крайне маленькая вероятность найти в русской MSDN на русском). А так - раздел Security из MSDN и вперед. А за примерами в гугл. Может чем-то поможет функция SetNamedSecurityInfo() - она чуток интуитивнее.
Пользуюсь Borland Builder 6 от 2002, пробовал SetNamedSecurityInfo(), компилятор говорит undefined function (#include windows.h есть). Слишком старый заголовочный файл? При этом в справке Windows SDK, в билдере функция описана.
Хидер должен быть таким
Requirements
Minimum supported client Windows 2000 Professional
Minimum supported server Windows 2000 Server
Header Aclapi.h
Library Advapi32.lib
DLL Advapi32.dll
Unicode and ANSI names SetNamedSecurityInfoW (Unicode) and SetNamedSecurityInfoA (ANSI)
Как можно сделать, что б время выводилось в формате
лет:месяцев:дней:часов:секунд
И что б новое значение не выводилось в новой строке, а каждую секунду обновлялось в даной... (по типу как в стандартных электронных часах)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32
# include <windows.h>
# define SLEEP(x) Sleep(x)
#else /* WIN32 */
# include <unistd.h>
# define SLEEP(x) usleep(x*1000)
#endif /* WIN32 */
int main()
{
char src[10];
char dest[10];
strcpy(src,"До олимпиады осталось");
CharToOem(src,dest);
struct tm targetDate;
memset(&targetDate, 0, sizeof(targetDate));
//задаем дату Олимпиады
targetDate.tm_year = 114; //год от 1900
targetDate.tm_mon = 1; //месяц
targetDate.tm_mday = 1; //день
time_t tDate = mktime(&targetDate); //это указанная дата в секундах от 01.01.1970
do {
time_t curTime = time(NULL); //текущее время в секундах от 01.01.1970
time_t dTime = tDate - curTime; //сколько секунд осталось
printf(dest);
printf(" %lu seconds\n", (unsigned long)dTime);
SLEEP(1000); //ждем секунду
} while(1);
return 0;
}
Please, need help! I am noob)))))
вывод в формате лет:месяцев:дней:часов:секунд - dTime%60 - секунды, (dTime/60)%24 - минуты (должно быть целочисленное деление, или использоваться округление в меньшую сторону, точнее отброс дробной части). С остальным посложней, придумывать влом..
pS. а ты не замечал, что "До олимпиады осталось" занимает чуть больше 10-ти символов?..
pS. а ты не замечал, что "До олимпиады осталось" занимает чуть больше 10-ти символов?..
Да заметил)) исправил...
СПС system ("cls"); помогло...
Плз, помогите кто знает, как сделать в формате
дней-часов-минут-секунд
Очень прошу, есле можно с примером... как сделать
Я все больше пишу на PHP, а в C++ полный нуб, тут в универе задали... что мог практически "вслепую" с помощью написал... вот еслеб еще и с форматом даты решить было супер, помогите кто знает...:):rolleyes::rolleyes:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32
# include <windows.h>
# define SLEEP(x) Sleep(x)
#else /* WIN32 */
# include <unistd.h>
# define SLEEP(x) usleep(x*1000)
#endif /* WIN32 */
int main()
{
char src[21];
char dest[21];
strcpy(src,"Осталось");
CharToOem(src,dest);
struct tm targetDate;
memset(&targetDate, 0, sizeof(targetDate));
targetDate.tm_year = 114;
targetDate.tm_mon = 7;
targetDate.tm_mday = 3;
time_t tDate = mktime(&targetDate);
do{
system ("cls");
time_t curTime = time(NULL); //текущее время в секундах от 01.01.1970
time_t dtime = tDate - curTime; // сколько осталось времени (в секундах)
time_t dsec = dtime%60; //сколько секунд осталось
time_t dmin = (dtime/60)%60; //сколько минут осталось
time_t dhour = ((dtime/60)/24)%24; //сколько часов осталось
time_t ddays = ((((dtime/60)/24)/30)/12)%365; //сколько дней осталось
printf(dest);
printf (" %lu days %lu hours %lu minuts %lu seconds\n", (unsigned long) ddays, (unsigned long) dhour, (unsigned long) dmin, (unsigned long) dsec);
SLEEP(1000);
} while (1);
return 0;
}
И еще вопрос, как вывести
printf("%lu minuts\n", (unsigned long)dmin);
printf("%lu hours\n", (unsigned long)dhour);
printf("%lu days\n", (unsigned long)ddays);
в одной строке
printf("%lu minuts\n", (unsigned long)dmin);
printf("%lu hours\n", (unsigned long)dhour);
printf("%lu days\n", (unsigned long)ddays);
в одной строке
немогу понять где тут ошибка
time_t dtime = tDate - curTime; // сколько осталось времени (в секундах)
time_t dsec = dtime%60; //сколько секунд осталось
time_t dmin = (dtime/60)%60; //сколько минут осталось
time_t dhour = ((dtime/60)/24)%24; //сколько часов осталось
time_t ddays = ((((dtime/60)/24)/30)/12)%365; //сколько дней осталось
немогу понять где тут ошибка
time_t dtime = tDate - curTime; // сколько осталось времени (в секундах)
time_t dsec = dtime%60; //сколько секунд осталось
time_t dmin = (dtime/60)%60; //сколько минут осталось
time_t dhour = ((dtime/60)/24)%24; //сколько часов осталось
time_t ddays = ((((dtime/60)/24)/30)/12)%365; //сколько дней осталось
Где-то так
time_t dhour = (dtime - ddays * 24 * 3600) / 3600; //сколько часов осталось
time_t dmin = (dtime - ddays * 24 * 3600 - dhour * 3600) / 60; //сколько минут осталось
time_t dsec = dtime - ddays * 24 * 3600 - dhour * 3600 - dmin * 60; //сколько секунд осталось
time_t dtime = tDate - curTime; //сколько осталось времени (в секундах, общее)
time_t dsec = dtime%60; //сколько секунд осталось
time_t dmin = (dtime/60)%60; //сколько минут осталось
time_t dhour = ((dtime/60)/60)%24; //сколько часов осталось
time_t ddays = ((dtime/60)/60)/24; //сколько дней осталось
Получилось то же...
Еще вопрос, как увеличить размер шрифта в консоле (не через настройки, а програмно), убрать скролбары в консоле, и задать окну консоли для приложения необходимый размер...
main ()
{
Int i;
FILE *out;
out=fopen("файл.txt", "w");
scanf("%d", i);
fprintf (out, "%d", i);
fclose (out);
exit (1);
}
после ввода числовых данных, допустим если напишу просто 1, у меня в файл записывается: 4243616. Что я не так делаю? на сколько знаю из моего жалкого еще опыта, то что ввод данных %d является десятичным, да и запись в файл у меня тоже %d. Подскажите чайнику где этот подводный камень?
Попробывал бы просто пошагово отладить программу и посмотреть, что в каждой переменной.