Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Помогите разобраться  (Прочитано 53218 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 12-10-2005 14:01 » 

Цитата
разве это неразрешимая задача?
Не, я про это не говорил.
Цитата
Обработка строковых выражений - обычное явление в работе пограммиста, у меня редкая программа без нее обходится.
Мне, например, не нравится с этим сталкиваться, при любой возможности стараюсь этого избежать  и ввязываюсь, когда др. выхода нет. Не знаю, откуда то у меня не любовь к работе со строками, возможно когда-то где-то серьезно напоролся и до сих пор неприятный осадок  остался.

Записан

ещё один вопрос ...
Vadim Mc
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 12-10-2005 14:48 » 

Я в си новичек, попросили написать простейшую программу с использованием цикла while на нахождение количества букв в тексте
проблема в том что нам дали мукулатуру, так вот в этой мукулатуре нет почти ничего из того что говорит преподаватель
он дал "общие рекомендации" из которых я и написал то что выше  Так больше нельзя...
+ есть несколько вопросов на которые он и сам не смог дать нормального ответа:
почему, например, тип char, а не int (short, long)? (по идее int ведь и обрабатывается быстрее и может может содержать большее по значению число)
Я так понял можно даже задать вещественный тип double?
Что лучше использовать вместо scanf? (он вроде не допускает пробелов?)
Что за функция puts? (ни в одной книжке не нашел (имеется также borland c++ Киммел. П.)
======================================
Я тоже новичек, намедни купил  Страуструпа, C++  (он автор С++) там нормально расписано - рекомендую
Записан

"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
LP
Помогающий

ru
Offline Offline

« Ответ #34 : 12-10-2005 19:46 » 

А я бы не рекомендовал Страуструпа Улыбаюсь Это явно не учебник для начинающих, хоть там все и написано от простого к сложному...
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Vadim Mc
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 12-10-2005 19:59 » 

И такое есть, но в качестве справочника очень неплох - даже не удивился, что отец основатель С++ - датчанин из Европы
Записан

"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
CENTNER
Гость
« Ответ #36 : 13-10-2005 10:43 » 

Да, побеседовал вчера с преподавателем, так реализовать нормальный калькулятор не получится Жаль, надо использовать другой, более сложный, алгоритм Жаль Жаль
2 NL - это книжечка этакая листов на 600 по цене рблей 300?
Записан
Vadim Mc
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #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++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 18-10-2005 10:18 » 

ну так правильно Улыбаюсь

else {
puts ("ЌҐЇа ўҐ«м­® ўўҐ¤Ґ­­л© бЁ¬ў®«");
goto new;
}

а вообще , надо цикл
for{;;}
{
}

использовать - удобнее.

тогда:

...
else {
puts ("ЌҐЇа ўҐ«м­® ўўҐ¤Ґ­­л© бЁ¬ў®«");
break;
}
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 18-10-2005 12:45 » 

Цитата
scanf("%s",&e);
Может в это дело.
попробуй так
scanf("%c",&e);
p.s. вообще-то крякозябли неплохо было бы заменить на нормальный текст - это внесло бы чуть больше ясности, к тому же CENTNER это в твоих интересах
« Последнее редактирование: 18-10-2005 12:47 от nikedeforest » Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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++ » Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #43 : 19-10-2005 04:18 » 

насчёт глюков - может быть, я не компилировал чоб проверить Улыбаюсь

а про метку вообще забудьте! Вы чего? 21 век на дворе Улыбаюсь
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 19-10-2005 09:36 » 

Цитата
а про метку вообще забудьте! Вы чего? 21 век на дворе
Я знаю, но если человеку хочется, что я могу поделать.
Записан

ещё один вопрос ...
CENTNER
Гость
« Ответ #45 : 19-10-2005 12:23 » 

за кальк спасибо
а насчет goto - это святое, я его еще в basic-е использовал
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 19-10-2005 12:29 » 

Цитата
а насчет goto - это святое, я его еще в basic-е использовал
В С/С++ goto считается дурным стилем программирования.
Записан

ещё один вопрос ...
Vadim Mc
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #47 : 19-10-2005 12:57 » 

С другой стороны Страуструп в своей книге  приводит примеры когда оправдано именно использование go to в целях оптимизации
Записан

"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 20-10-2005 04:22 » 

CENTNER , раз ты перешёл на СИ, забудь про метки - намаешься
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #55 : 22-04-2006 14:31 » new

(комент)

ЧАВО
Записан

Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines