nikedeforest
|
|
« Ответ #30 : 12-10-2005 13:45 » |
|
Калькулятор - это простейшая хрестоматийная задача, чуть сложнее "Hello, world".
Это конечно понятно, не даром с него начинают новички. Но выражения типа 2*5+3*(2+3+1-9)+cos(0.5) по науке надо разбивать на лексемы. Хотя я могу ошибаться, если так, то поправьте меня. Мои знания по этому предмету слабенькие, не любил я его и в подробности особенно не вдавался, но при желании могу поднять материал.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Alf
Гость
|
|
« Ответ #31 : 12-10-2005 13:54 » |
|
Но выражения типа 2*5+3*(2+3+1-9)+cos(0.5) по науке надо разбивать на лексемы. Конечно, надо. А почему "но", разве это неразрешимая задача? Обработка строковых выражений - обычное явление в работе пограммиста, у меня редкая программа без нее обходится.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #32 : 12-10-2005 14:01 » |
|
разве это неразрешимая задача?
Не, я про это не говорил. Обработка строковых выражений - обычное явление в работе пограммиста, у меня редкая программа без нее обходится.
Мне, например, не нравится с этим сталкиваться, при любой возможности стараюсь этого избежать и ввязываюсь, когда др. выхода нет. Не знаю, откуда то у меня не любовь к работе со строками, возможно когда-то где-то серьезно напоролся и до сих пор неприятный осадок остался.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Vadim Mc
|
|
« Ответ #33 : 12-10-2005 14:48 » |
|
Я в си новичек, попросили написать простейшую программу с использованием цикла while на нахождение количества букв в тексте проблема в том что нам дали мукулатуру, так вот в этой мукулатуре нет почти ничего из того что говорит преподаватель он дал "общие рекомендации" из которых я и написал то что выше + есть несколько вопросов на которые он и сам не смог дать нормального ответа: почему, например, тип char, а не int (short, long)? (по идее int ведь и обрабатывается быстрее и может может содержать большее по значению число) Я так понял можно даже задать вещественный тип double? Что лучше использовать вместо scanf? (он вроде не допускает пробелов?) Что за функция puts? (ни в одной книжке не нашел (имеется также borland c++ Киммел. П.) ====================================== Я тоже новичек, намедни купил Страуструпа, C++ (он автор С++) там нормально расписано - рекомендую
|
|
|
Записан
|
"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
|
|
|
LP
Помогающий
Offline
|
|
« Ответ #34 : 12-10-2005 19:46 » |
|
А я бы не рекомендовал Страуструпа Это явно не учебник для начинающих, хоть там все и написано от простого к сложному...
|
|
|
Записан
|
Если эта надпись уменьшается, значит ваш монитор уносят
|
|
|
Vadim Mc
|
|
« Ответ #35 : 12-10-2005 19:59 » |
|
И такое есть, но в качестве справочника очень неплох - даже не удивился, что отец основатель С++ - датчанин из Европы
|
|
|
Записан
|
"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
|
|
|
CENTNER
Гость
|
|
« Ответ #36 : 13-10-2005 10:43 » |
|
Да, побеседовал вчера с преподавателем, так реализовать нормальный калькулятор не получится , надо использовать другой, более сложный, алгоритм 2 NL - это книжечка этакая листов на 600 по цене рблей 300?
|
|
|
Записан
|
|
|
|
Vadim Mc
|
|
« Ответ #37 : 13-10-2005 11:16 » |
|
Да, побеседовал вчера с преподавателем, так реализовать нормальный калькулятор не получится , надо использовать другой, более сложный, алгоритм 2 NL - это книжечка этакая листов на 600 по цене рблей 300? ===================================================== Листов у книги 1100, цена в Питере -~ 350 рублей. Язык С++ 4-е издание. Там кстати рассмотрен в главе 6 пример простроения калькулятора.... Временами очень просто читается, временами и трудновато, но мне книга понравилась именно концептуальностью
|
|
|
Записан
|
"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
|
|
|
CENTNER
Гость
|
|
« Ответ #38 : 18-10-2005 09:19 » |
|
Вот доработал старый вариант: #include <stdio.h> main() { double x; char znak; double y; double d; char e; puts ("Љ «мЄг«пв®а v 0.002 by Centner"); new: scanf("%lf %c %lf",&x,&znak,&y); if (znak =='+') { d = x + y; } else if (znak =='-') { d = x - y; } else if (znak =='*') { d = x * y; } else if (znak =='*') { d = x / y; } else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); goto new; } printf ("®вўҐв %.2lf\n",d); printf ("•®вЁвҐ ҐйҐ? Ќ ¦¬ЁвҐ Є« ўЁиг y"); scanf("%s",&e); if (e == 'y') { goto new; } else { printf ("‘Ї бЁЎ® § Ї®«м§®ў ЁҐ иЁ¬ б®д⮬. ‚ᥠЇа ў § йЁйҐл."); scanf("%lf",&x); } } Проблема в седующем - прога некорректно работает Если ввести несколько символов (любых) - должен сообщать об ошибке, и возвращаться в начало (goto), но получается бесконечный цикл если ввести например 3+4y, пишет ответ и предлагает продолжить - потом снова ответ и продолжить, и так циклически если ввести например 3+4ui, тода пишет ответ и асе осчтальные сообщения и завершает программу А мнен нужно чтоб он просто по окончании предлагал начать снова, а при вводе некорректного запроса сообщал об ошибке и все
|
|
« Последнее редактирование: 19-12-2007 19:56 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 18-10-2005 10:18 » |
|
ну так правильно else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); goto new; } а вообще , надо цикл for{;;} { } использовать - удобнее. тогда: ... else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); break; }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 18-10-2005 10:28 » |
|
я бы написал так: #include <stdio.h> main() { double x; char znak; double y; double d; char e; puts ("Љ «мЄг«пв®а v 0.002 by Centner");
for(;;) {
scanf("%lf %c %lf",&x,&znak,&y);
switch(znak) { case '+':d = x + y; break; case '-':d = x - y; break; case '*':d = x * y; break; case '/':d = x / y; break; default:puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); }
printf ("®вўҐв %.2lf\n",d); printf ("•®вЁвҐ ҐйҐ? Ќ ¦¬ЁвҐ Є« ўЁиг y"); scanf("%s",&e);
if (e != 'y') { printf ("‘Ї бЁЎ® § Ї®«м§®ў ЁҐ иЁ¬ б®д⮬. ‚ᥠЇа ў § йЁйҐл."); scanf("%lf",&x); break; } }//for(;;) }
русские символы не вижу, поэтому оставил их как есть (к модерам - сделайте пожалуйста примочку - выделил текст, поменял кодировку)
|
|
« Последнее редактирование: 19-12-2007 19:58 от Алексей1153++ »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #41 : 18-10-2005 12:45 » |
|
scanf("%s",&e);
Может в это дело. попробуй так scanf("%c",&e); p.s. вообще-то крякозябли неплохо было бы заменить на нормальный текст - это внесло бы чуть больше ясности, к тому же CENTNER это в твоих интересах
|
|
« Последнее редактирование: 18-10-2005 12:47 от nikedeforest »
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #42 : 18-10-2005 13:17 » |
|
Метку называть new нельзя, это же оператор распределения динамическорй памяти. Обзови по другому. здесь вроде все работает. #include <stdio.h> #include <conio.h> main() { double x,y,d; char znak,e; clrscr(); puts (" Made in China by Centner :)"); label_new: scanf("%lf %c %lf",&x,&znak,&y); switch(znak){ case '+': d = x + y; break; case'-': d = x - y; break; case '*': d = x * y; break; case '/': d = x / y; break; default: puts ("Wrong operation"); goto label_new; }
printf ("otvet= %.2lf\n",d); printf ("for repeating input Y"); scanf("%s",&e);
if (e == 'y') { goto label_new; // printf ("repeat\n") ; } else { printf ("input X"); scanf("%lf",&x); } return 0; }
|
|
« Последнее редактирование: 19-12-2007 20:01 от Алексей1153++ »
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #43 : 19-10-2005 04:18 » |
|
насчёт глюков - может быть, я не компилировал чоб проверить а про метку вообще забудьте! Вы чего? 21 век на дворе
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #44 : 19-10-2005 09:36 » |
|
а про метку вообще забудьте! Вы чего? 21 век на дворе Я знаю, но если человеку хочется, что я могу поделать.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
CENTNER
Гость
|
|
« Ответ #45 : 19-10-2005 12:23 » |
|
за кальк спасибо а насчет goto - это святое, я его еще в basic-е использовал
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #46 : 19-10-2005 12:29 » |
|
а насчет goto - это святое, я его еще в basic-е использовал
В С/С++ goto считается дурным стилем программирования.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Vadim Mc
|
|
« Ответ #47 : 19-10-2005 12:57 » |
|
С другой стороны Страуструп в своей книге приводит примеры когда оправдано именно использование go to в целях оптимизации
|
|
|
Записан
|
"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #48 : 20-10-2005 04:22 » |
|
CENTNER , раз ты перешёл на СИ, забудь про метки - намаешься
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 20-10-2005 04:24 » |
|
NL , ну и какая тут оптимизация произошла? вообще, если никак не удаётся без гоуто, а время выполнения не критично, то данный участок процедуры заменяем на вызод подпрограммы а там всё решится. Либо переписываем алгоритм по человечески
|
|
|
Записан
|
|
|
|
CENTNER
Гость
|
|
« Ответ #50 : 23-10-2005 17:14 » |
|
Вот новая прога :vzhik: Должна находить наибольший элемент в массиве: #include <stdio.h> main() { char a[10]; //задаем массив int i; double d; gets (a); //вводим значение массива a[i]=d; //1 элем массива присваиваем знач d while (a[i]!='\0') { //"пока" остались элементы в массиве if (a[i+1] > d) { //Если элем массива больше d a[i]=d; //присваиваем новое знач i++; } else { //если равен или меньше i++; //след элемент } } printf ("Naibolshiy element\n",d); gets (a); } Компилится, но после ввода строки ХРюша выбрасывает ошибку :-(
|
|
« Последнее редактирование: 19-12-2007 20:02 от Алексей1153++ »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #51 : 23-10-2005 18:32 » |
|
Указываю на ошибки. Во первых: int i; double d; a[i]=d; //1 элем массива присваиваем знач d
А счего ты решил, что i сожержит в себе 1? Для того, чтобы в переменнной было значение, надо в переменную это значение присвоить. Во-вторых, ты отличаешь символьный тип от вещественного? Я так понимаю, ты хочешь, чтобы в массиве a сожержались вещественные числа, так почему же массив а типа char, а не double, а сдругой стороны, будь он типом double, ты бы не смог так его заполнить. Определись, что ты хочешь от этого массива. В третьих, алгоритм поиска какой-то неправильный, вот так будет верней: #include <stdio.h> #include <iostream.h> #include <conio.h>
int main() { clrscr();
double a[10], d; int i, schet=0; cout<<"Заполните пожалуйста массив числами вещественного типа\n"; for(i=0;i<10;i++) { cout<<"заполните элемент "<<i+1<<" "; cin>>a[i]; } d=a[0];
for(i=0;i<10;i++) { if(d<a[i]) {d=a[i]; schet=i;} }
cout<<"наибольший элемент находится на "<<schet+1<<"позиции и равен "<<d;
return 0; }
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
CENTNER
Гость
|
|
« Ответ #52 : 24-10-2005 17:47 » |
|
Спасибо за ошибки a[i]=d; //1 элем массива присваиваем знач d - тут 1 имеется ввиду "первому" с типами данных да, пока проблемы Хотя, не понимаю чем мой алгоритм плох, вроде должен работать, другое дело, что реализовал я его скорее всего неправильно :-( За прогу спасибо, вот только интересуют 2 строчки: cout<<"заполните элемент "<<i+1<<" "; cin>>a[i]; это наподобие ввод и вывод? и зачем эти библиотеки - #include <iostream.h> #include <conio.h>?
|
|
« Последнее редактирование: 22-04-2006 14:30 от Алексей1153 »
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #53 : 24-10-2005 18:59 » |
|
cout<<"заполните элемент "<<i+1<<" "; cin>>a; это наподобие ввод и вывод?
Это тоже самое, что printf("заполните элемент %d, i+1); scanf("%lf",&a[i]); библиотку conio.h я подключаю для того, чтобы использовать функцию clrscr(), которая производит очистку консоли, а iostream.h для того, чтобы использовать функции cout и cin. Хотя, не понимаю чем мой алгоритм плох, вроде должен работать, другое дело, что реализовал я его скорее всего неправильно
Надо полагать этим он и плох .
|
|
« Последнее редактирование: 22-04-2006 14:30 от Алексей1153 »
|
Записан
|
ещё один вопрос ...
|
|
|
CENTNER
Гость
|
|
« Ответ #54 : 25-10-2005 11:58 » |
|
Что-то при компиляции ругается на stdcomp.h, пришет надо использовать c++ для его использования У меня в библиотеках он есть, а компилятор я качал с borland.com, в чем грабли?
|
|
« Последнее редактирование: 25-10-2005 12:00 от CENTNER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #55 : 22-04-2006 14:31 » |
|
(комент)
ЧАВО
|
|
|
Записан
|
|
|
|
|