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

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

Я в си новичек, попросили написать простейшую программу с использованием цикла while на нахождение количества букв в тексте Жаль
Вот написал что-то, естественно не компилится:

#include <stdio.h>
int main() {
char a[256]; //задаем массив (строку символов)
int i = 0; // задаем начальное количество символов
printf ("Введите строку\n");
scanf ("%lf", &a); // вводим нашу строку
gets (a); // вызываем символ(?)
while (a[i] !=0); // тело цикла
b++;                
printf ("Результат", b);
return 0;
}

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

« Последнее редактирование: 22-04-2006 14:21 от Алексей1153 » Записан
nikedeforest
Команда клуба

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

« Ответ #1 : 05-10-2005 11:46 » 

переменная b не объявлена. Ты уверен, что вызывая gets(a) ты делаешь, то что тебе надо. К тому же у тебя вечный цикл нарисовался. Огласи что ты хочешь сделать.
Записан

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

Точно сорри

#include <stdio.h>
int main() {
char a[256]; //задаем массив (строку символов)
int i = 0; // задаем начальное количество символов
printf ("Введите строку\n");
scanf ("%lf", &a); // вводим нашу строку
gets (a); // вызываем символ(?)
while (a[i] !=0); // тело цикла
i++;                
printf ("Результат", i);
return 0;
}

Уверенности, увы, нет
Необходима программа подсчитывающая количество символов во введенной строке с использованием цикла while.
Не удевлюсь если все должно выглядеть по другому
« Последнее редактирование: 22-04-2006 14:22 от Алексей1153 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 05-10-2005 12:38 » 


while (a[i] !=0); // тело цикла
i++;
}


попробуй так
while (a[i]) i++;

или (щас блесну :))) )

while (a[i++]);

в любом случае - у тебя была точка с запятой, то есть пустой цикл while
« Последнее редактирование: 22-04-2006 14:25 от Алексей1153 » Записан

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

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

« Ответ #4 : 05-10-2005 13:06 » 

Еще один недачет я никак не пойму (я уже писал об этом). Зачем ты пишешь scanf, а затем, сразу же gets
Код:
scanf ("%lf", &a); // вводим нашу строку
gets (a); // вызываем символ(?)
эффект то получается один и тот же (gets(a) заносит строку введенную с клавиатуры в переменную а ), а пользователю прдется несколько раз вводить строку.
Записан

ещё один вопрос ...
kroum
Интересующийся

ua
Offline Offline

« Ответ #5 : 05-10-2005 15:53 » 

printf ("Введите строку\n");
scanf ("%lf", &a); // вводим нашу строку
gets (a); // вызываем символ(?)

1. Вместо
printf ("Введите строку\n");
можно использовать
puts("Введите строку");

Функция puts выводит на экран текст с переходом строки (не нужно в конце задавать '\n')

2. Так как необходимо определить количество введенных символов, предполагается ввод текстовой строки. В данном случае нужно использовать %s вместо %lf (у тебя scanf(%lf, &a))

3. Согласен с nikedeforest о ненужности gets(a);
То есть, используй что-то одно - либо gets, либо scanf

printf ("Результат", i);

4. scanf и gets считывают строку, то есть обязательно добавляют в конец признак о ее окончании ('\0'), пожтому нужно выводить i-1

5. В такой записи у тебя результатом выведется только "Результат". Необходимо указать, что нужно вывести значение (i-1):
printf ("Результат: %i", i-1);
« Последнее редактирование: 19-12-2007 21:55 от Алексей1153++ » Записан
nikedeforest
Команда клуба

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

« Ответ #6 : 05-10-2005 16:18 » 

kroum наверное полностью довершил разбор ошибок Ага, можно тему закрывать:)
p.s.
Цитата
или (щас блесну )) )
while (a[i++]);
Алексей, это ты откуда узнал? ЗдОрово, я такую запись никогда не видел.
Записан

ещё один вопрос ...
CENTNER
Гость
« Ответ #7 : 05-10-2005 20:02 » 


Всем спасибо за помощь, вот немного подправил и добавил подсчет конкретного символа в строке:
#include <stdio.h>
main() {
char a[256];
int i = 0;
int j;
int k = 0;
puts ("Vvedite stroku");
gets(a);
while (a[i]!='\0'){
i++;
}
for (j=0; j<i; j++){
if (a[j] == 'a' || a[j]=='A'){
k++;
}
}
printf ("Kol-vo simvolov = %d\n",i);
printf ("Kol-vo A = %d\n", k);
Не совсем понимаю смысл этой фразы:
"scanf и gets считывают строку, то есть обязательно добавляют в конец признак о ее окончании ('\0'), пожтому нужно выводить i-1"?


« Последнее редактирование: 19-12-2007 21:57 от Алексей1153++ » Записан
Михалыч
Команда клуба

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

« Ответ #8 : 06-10-2005 01:32 » 

kroum наверное полностью довершил разбор ошибок Ага, можно тему закрывать:)
p.s.
Цитата
или (щас блесну )) )
while (a[i++]);
Алексей, это ты откуда узнал? ЗдОрово, я такую запись никогда не видел.

Оригинально, но на мой взгляд вредно - бо не наглядно. Так гораздо понятнее, причем не только тому, кто написал, а любому.
while (a[i]!='\0'){
i++;
}

С, как и С++, позволяют сооружать море подобных "сокращенных" конструкций. Применять их, или нет - дело вкуса и принятых в конторе норм. Я бы не стал. Хотя иногда выглядит круто. Но видимо не более того.
« Последнее редактирование: 19-12-2007 21:58 от Алексей1153++ » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Hooter
Опытный

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

« Ответ #9 : 06-10-2005 04:43 » 

...
Цитата
или (щас блесну )) )
while (a[i++]);
Алексей, это ты откуда узнал? ЗдОрово, я такую запись никогда не видел.

Оригинально, но на мой взгляд вредно - бо не наглядно. Так гораздо понятнее, причем не только тому, кто написал, а любому.
while (a[i]!='\0'){
i++;
}

Если уж совсем до конца разбираться, то два этих алгоритма вообще дают разный результат:
 - в случае while (a[i ]) { i++ };  длина строки равна i.
 - в случае while (a[i++]);  длина строки равна (i - 1).
« Последнее редактирование: 19-12-2007 22:01 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #10 : 06-10-2005 05:30 » 


Михалыч , абсолютно согласен - так вредно. Это я просто повыпендриваться решил :)

сам бы я записал так

while (a[i]!=0) i++;

а вот '\0' понятности не добавляет, суть - то же самое

Hooter , наоборот

1)
- в случае while (a[i]) { i++ };
   ----- тут не учитывается ноль (== len-1)

2)
 - в случае while (a[i++]); 
   ----- тут Учитывается ноль (== len)

nikedeforest,
> Алексей, это ты откуда узнал? ЗдОрово, я такую запись никогда не видел.

то есть как откуда? это си
« Последнее редактирование: 19-12-2007 22:02 от Алексей1153++ » Записан

Hooter
Опытный

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

« Ответ #11 : 06-10-2005 06:03 » 

Hooter , наоборот

1)
- в случае while (a[i ]) { i++ };
   ----- тут не учитывается ноль (== len-1)

2)
 - в случае while (a[i++]); 
   ----- тут Учитывается ноль (== len)

1. Я говорил не о конкретном значении длины строки, а о том, что алгоритмы дают разный результат. Ты это только подтвердил.
2. В примере CENTNERа нужно как раз посчитать символы в строке, а не количество байт строки (вместе с нулем).
« Последнее редактирование: 19-12-2007 22:03 от Алексей1153++ » Записан
CENTNER
Гость
« Ответ #12 : 07-10-2005 18:00 » 

А каким образом можно написать калькулятор? Чтобы можно было, например, написать в строке 2+3 и он давал ответ?
вот что получается у меня:
#include <stdio.h>
main() {
double a,b,c;
int i;
puts ("vvedite 1 cifru i znak");
gets (a);
puts ("vvedite 2 cifru");
gets (b);
if (a(i) == '+') {
a+b=c;
}
else if (a(i) == '-') {
a-b=c;
}
else if (a(i) == '*') {
a*b=c;
}
else {
a/b=c;
}
printf ("otvet = %d\n",c);
}
но даже этот не работает:-(
как лучше сделать подскажите?
« Последнее редактирование: 19-12-2007 22:04 от Алексей1153++ » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #13 : 07-10-2005 18:55 » 

CENTNER, процедура такая: разбери введеную строку на лексические состовляющие, проверь допустимость синтаксиса, переставь операции согласно приоритетам, выполни их последовательно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
CENTNER
Гость
« Ответ #14 : 09-10-2005 20:50 » 

Вот написал кусочек:
#include <stdio.h>
main() {
char a;
char b;
char c;
char d;
int i;
puts ("vvedite 1 cifru");
scanf("%lf",&a);
puts ("vvedite znak");
scanf("%lf",&b);
puts ("vvedite 2 cifru");
scanf("%lf",&c);
if (b =='+') {
d = a + c;
}
printf ("otvet = %lf\n",d);
scanf("%lf",&a);
}
а в ответе всегда "0"  Жаль при любых числах с любым знаком)
Почему?
« Последнее редактирование: 19-12-2007 22:04 от Алексей1153++ » Записан
nikedeforest
Команда клуба

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

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

Позволь тебя просветить, потому как ты не первый раз ошибаешься в этом. Ты объявил переменные a,b,c,d типа char -это значит, что для них выделено 1 байт. Что же делаешь ты? Ты пишешь
Цитата
scanf("%lf",&b);

%lf-это спецификатор формата функции scanf. %lf-предназначен для типа long double (если я не ошибаюсь, я всегда для double использую), который в несколько раз больше типа char. Для типа char тебе нужен либо %c - если в переменную заносится один символ (так в твоем случае), или %s- если заносится строка символов.
Во-ыторых тебе необходимо объявить переменные a, c и d типом double.
Вот что должно выйти:
Код:
#include <stdio.h>
main() {
double a;
char b;
double c;
double d;
int i;
puts ("vvedite 1 cifru");
scanf("%lf",&a);
puts ("vvedite znak");
scanf("%c",&b);
puts ("vvedite 2 cifru");
scanf("%lf",&c);
if (b =='+') {
d = a + c;
}
printf ("otvet = %lf\n",d);
scanf("%lf",&a);
}


Я не компилировал, поэтому 100% не даю, что нет других ошибок, но вроде в остальном все верно. Пиши, если не получится.
« Последнее редактирование: 19-12-2007 22:05 от Алексей1153++ » Записан

ещё один вопрос ...
CENTNER
Гость
« Ответ #16 : 10-10-2005 18:43 » 

Большое спасибо!
Теперь все заработало:
#include <stdio.h>
main() {
double a;
char b;
double c;
double d;
int i;
puts ("vvedite 1 cifru");
scanf("%lf",&a);
puts ("vvedite znak");
scanf("%s",&b);
puts ("vvedite 2 cifru");
scanf("%lf",&c);
if (b =='+') {
d = a + c;
}
else if (b =='-') {
d = a - c;
}
else if (b =='*') {
d = a * c;
}
else {
d = a / c;
}
printf ("otvet = %lf\n",d);
scanf("%lf",&a);
}
А можно ли реализовать ввод сразу (как я писал выше, т.е., например,  2+3), а не путем 3 последовательных действий?
Может есть способ указать программе числа до, и после определенного знака?
« Последнее редактирование: 19-12-2007 22:05 от Алексей1153++ » Записан
nikedeforest
Команда клуба

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

« Ответ #17 : 10-10-2005 19:41 » 

Цитата
А можно ли реализовать ввод сразу (как я писал выше, т.е., например,  2+3), а не путем 3 последовательных действий?
Может есть способ указать программе числа до, и после определенного знака?
Считывай строку, пока не встретишь + или - или / или * - вот ты считал первое число, потом знак считаешь, ну и до конца последнее число считывай.
Записан

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

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

« Ответ #18 : 11-10-2005 09:00 » 

Простейший способ это вот
Код:
double x, y;
char znak;
scanf("%lf%c%lf",&x,&znak,&y);
Только между цифрами и знаками пробел вводить нельзя. Но эту неприятность можно обойти.
Записан

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

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

« Ответ #19 : 11-10-2005 09:21 » 

Код:
scanf("%lf %c %lf",&x,&znak,&y);
Теперь можешь вводить пробелы сколько захочешь. Проверено Улыбаюсь.
Записан

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

В попытках создать версию выполняющую несколько действий сразу:
#include <stdio.h>
main() {
double x;
char znak;
double y;
double d;
double a;
puts ("Љ «мЄг«пв®а v 0.002 by Centner");
scanf("%lf %c %lf",&x,&znak,&y);
while (x!='\0' && y!='\0')
{
   if (znak =='+') {
   d = x + y;
   }
   else if (znak =='-') {
   d = x - y;
   }
   else if (znak =='*') {
   d = x * y;
   }
   else {
   d = x / y;
   }
   a = a + d;
}
printf ("®вўҐв %.2lf",a);
scanf("%lf",&x);
}
Прога компилится, но не работает должным образом Жаль
« Последнее редактирование: 19-12-2007 22:06 от Алексей1153++ » Записан
Hooter
Опытный

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

« Ответ #21 : 12-10-2005 09:12 » 

Прога компилится, но не работает должным образом Жаль
"Должный образ" - это какой?
Какие данные ты вводишь? Что ожидаешь получить? Что на самом деле получаешь на выходе?
Записан
Hooter
Опытный

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

« Ответ #22 : 12-10-2005 09:18 » 

Можно попытаться навскиду, но я не уверен, что првильно тебя понимаю:
...
double a;
...
   a = a + d;
Здесь налицо попытка использовать значение неинициализированной переменной.
Попробуй хотя бы double a = 0;

Непонятен смысл этого цикла.. Что ты хочешь получить в результате?
...
while (x!='\0' && y!='\0')
{
...
« Последнее редактирование: 19-12-2007 22:06 от Алексей1153++ » Записан
CENTNER
Гость
« Ответ #23 : 12-10-2005 09:38 » 

Из предыдущей версии калькулятора выполняющей действия с 2 числами, я хочу сделать версию выполняю щую несколько действий сразу (2+3*4/5и т.д)
Мне кажется что для этоно нужно включит основной алгоритм в цикл, который будет последовательно выполнять действия и добавлять соответствующие значения переменной "a" (a=a+d), а затем выводить ее как результат.
while (x!='\0' && y!='\0') - этим я попытался дать программе понять когда закончен ввод (честно говоря, сам не знаю как это сделать правильно, просто попробовал такой вариант)
Можно попытаться навскиду, но я не уверен, что првильно тебя понимаю:
...
double a;
...
   a = a + d;
Здесь налицо попытка использовать значение неинициализированной переменной.
Попробуй хотя бы double a = 0;
конечно нужен 0, я просто полагал что программа изначально присваивает нулевое значение переменной.
« Последнее редактирование: 19-12-2007 22:08 от Алексей1153++ » Записан
Hooter
Опытный

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

« Ответ #24 : 12-10-2005 09:49 » 

Мне кажется что для этоно нужно включит основной алгоритм в цикл, который будет последовательно выполнять действия и
Одна из ошибок у тебя в том, что ты не включил scanf  в цикл.
Записан
nikedeforest
Команда клуба

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

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

Код:
puts ("Љ «мЄг«пв®а v 0.002 by Centner");
Это,я так пониаю, made in China Улыбаюсь
А если серьезно, был предмет у меня толи на втором, то ли на третьем курсе, назывался он "Лингвистика программного обеспечения САПР". Меня от этого предмета пучило по дикому (ну не нравился он мне). Так вот там мы изучали всякие синтаксические анализаторы и т.п.. Кажется сейчас становится задача сходная этому и меня начинает опять пучить Улыбаюсь.
Во-первых, как ты понимаешь, нужно что-то типа таблицы преоритетов. Как ты сейчас пишешь, так твой калькулятор наплюет на все законы математике. Стоит помнить, что умножение и деление производится раньше сложения и вычитания  и пр., у тебя этого нету.
Поэтому про должный образ ты правильно сказал. Здесь реализация чуток по сложнее будет и с наскока ты ее не возмешь.

 
Записан

ещё один вопрос ...
Alf
Гость
« Ответ #26 : 12-10-2005 11:27 » 

Калькулятор - это простейшая хрестоматийная задача, чуть сложнее "Hello, world".

Одно из возможных решений я привел здесь: https://club.shelek.ru/viewart.php?id=220

(Надеюсь, не забанят за рекламу).
Записан
CENTNER
Гость
« Ответ #27 : 12-10-2005 11:29 » 

2 Hooter включал
те-же грабли
дело еще в чем-то Жаль
« Последнее редактирование: 12-10-2005 11:45 от CENTNER » Записан
CENTNER
Гость
« Ответ #28 : 12-10-2005 11:45 » 

2 Alf - спасибо за статейку, как голова отойдет поробую вникнуть
2 nikedeforest - Про приоритеты я думал, хотел просто пока без них реализовать. в общем посижу, еще помучаюсь   :vzhik:
Записан
Hooter
Опытный

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

« Ответ #29 : 12-10-2005 11:48 » 

включал
те-же грабли
дело еще в чем-то Жаль
дык что не получается конкретно?

Например, в твоей текущей реализации нельзя реализовать такое
версию выполняю щую несколько действий сразу (2+3*4/5и т.д)
У тебя получится только так: (2+3) + (4*5) + (6/7).

Попробуй почитать статью Alf'а - думаю, поможет.
« Последнее редактирование: 19-12-2007 22:08 от Алексей1153++ » Записан
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 » 

(комент)

ЧАВО
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines