Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 654
от 31.01.2007, 23:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 468, Экспертов: 67
В номере:Вопросов: 10, Ответов: 26


Вопрос № 72662: Уважаемые эксперты прошу мне помочь,через 3 дня экзамен,а я никак немогу понять (по причине отсутствия опыта) как решить данное задание.На заочном преподаватель полностью забил на нас как хотите так и крутитесь.Заранее благодарен за оказанную помощь....
Вопрос № 72684: можно ли в с++ вызвать один конструктор из другого?...
Вопрос № 72685: Здравствуйте! Помогите пожалуйста разобраться с бд в visual c 6. До этого работал только с mysql из php. Попробую объяснить, что я хочу сделать, как говорится под разные задачи и разные решения. Нужно сделать словарь, н...
Вопрос № 72697: Такой вот вопрос проект написанный на C++Builder 6 был перенесен на другую машину, и при попытке откомпилировать проект заново Builder "ругается" на отсутствующие файлы библиотек RXLib и т.п. хотя в данном проекте ни один из компоне...
Вопрос № 72740: Здравствуйте, уважаемые эксперты! Столкнулся с проблемой: проект Win32-Console (C++ VS2003) состоит из C и CPP-файлов, дополнительные библиотеки не используются; Release- версия собирается без вопросов, а Debug - вылезают ошибки линкера (...
Вопрос № 72769: Почему данная программа выводит на екран 4 3 2, а не 2 3 4, ведь по идее здесь используется операция инкримент, которая должна сначала увеличить n на единицу, получить 2, потом еще, получить 3, потом - 4, и вывести. ...
Вопрос № 72791: Как вычислить корень квадратный из 2 с точностью до 1000000 знака? Точнее как это число вывести (т.е. не обязательно хранить в памяти). И как вообще хранить числа с большой степенью точности и производить над ними стандартные опреации сложение, делен...
Вопрос № 72793: Уважаемые эксперты и профи дали мне задание,но я в этом совсем не разбираюсь, прошу у вас помощи,завтра все сдавать: /*-----------------------Задание 1----------------------*/ Определить по номеру месяца к какому кварталу он относится /*-...
Вопрос № 72797: Суть вопроса: почему эта программа работает. Ведь функции getch(), ungetch(c) не обьявлены в этом файле, однако компилятор gcc не выдает никаких ошибок. А если изменить имя процедур на произвольные - ишибки есть. Зарание списибо....
Вопрос № 72800: Здравствуйте, уважаемые эксперты! Проблема такая: Открываю Microsoft Visual C++, создаю Win32 Console Application, example.c, пишу что-то вроде: Всё запускается, рисуется. В функции display экспериментирую с цветами, меняю auxSolidSp...

Вопрос № 72.662
Уважаемые эксперты прошу мне помочь,через 3 дня экзамен,а я никак немогу понять (по причине отсутствия опыта) как решить данное задание.На заочном преподаватель полностью забил на нас как хотите так и крутитесь.Заранее благодарен за оказанную помощь.
Задание: 1
Дано: "А","B" вычислить функцию "z"=1/3*(корень кубические от "А")+1/4*(корень 4-й степени от В по модулю)
если Z>0,вычислить f=arctg(z)
если Z<0,вычислить и напечатать g=arcos(z) + e в степени -2
иначе вычислить p="z"(в квадрате)+"а"(в квадрате) корень (под корнем:"z" в четвертой степени+"А""В")
Задание: 2
Дано: "С","D","X" вычислить функцию z=sin("C")+"x"(квадрат)*("С" в кубе)+"e" в степени dx)
если z<0 вычислить L= корень(под корнем:a+d+x)
если z>=0 вычислить и вывести на печать положительное значение функции W= (ln |x|+tgx)/(c+d)в квадрате+3, где x изменяется в интервале от -1 до 2 с шагом 0,25
Отправлен: 25.01.2007, 23:37
Вопрос задал: Cергей Викторович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mitya86
Здравствуйте, Cергей Викторович!

см.приложение, надеюсь помог
если будут еще вопросы - пиши
удачи

Приложение:

Ответ отправил: Mitya86 (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 00:32
Оценка за ответ: 5
Комментарий оценки:
Спасибо,за молниеносную реакцию и помощь в решении проблемы.


Вопрос № 72.684
можно ли в с++ вызвать один конструктор из другого?
Отправлен: 26.01.2007, 05:00
Вопрос задал: Vladimir~ (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: ramok
Здравствуйте, Vladimir~!

конечно. а в чем проблема то?
если один класс наследуется от другого:
class A
{
public:
A(){};
}

class B: public A
{
public:
B():A() {};

}
из констуктора B() вызвается коструктор класса A()
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 26.01.2007, 05:53

Отвечает: QDSota
Здравствуйте, Vladimir~

На Си это можно записать так:
class X{
private:
int x, y;
public:
X(int x1=0,int y1=0) {
x = x1;
y = y1;
}
};

И вызвать функцию можно будет:
и так и так:
my=new(X);//с параметрами по умолчанию
my=new(X(5,6));//с двумя новыми параметрами


---------
Открыть глаза навстречу солнцу
Ответ отправил: QDSota (статус: Профессионал)
Россия, Зеленоград
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 26.01.2007, 10:18

Отвечает: Mitya86
Здравствуйте, Vladimir~!

напрямую нет, конструктор можно вызывать только создавая новый объект класса.
если не секрет, то зачем тебе вызывать еще один конструктор? если же так надо, то напиши метод, который дублировал бы действия конструктора, который ты хочешь вызвать
Ответ отправил: Mitya86 (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 12:31

Отвечает: Thread
Здравствуйте, Vladimir~!
К сожалению нет. Проблема вот в чем: если вы вызовете другой конструктор, компьютер создаст и проинициализирует временный объект, а не объект, из которого вызван конструктор. Вы можете совместить два конструктора, используя значения параметров по умолчанию, или вы можете разместить общий для двух конструкторов код в закрытой (private) функции - члене init().
Ответ отправил: Thread (статус: 3-ий класс)
Ответ отправлен: 26.01.2007, 15:21


Вопрос № 72.685
Здравствуйте!

Помогите пожалуйста разобраться с бд в visual c 6.
До этого работал только с mysql из php.

Попробую объяснить, что я хочу сделать, как говорится под разные задачи и разные решения.

Нужно сделать словарь, например для перевода или проверки орфографии. Использовать текстовые файлы или массивы не хочу, так как структура словаря сложная и объём приличный.

Устанавливать дополнительные компоненты, типа mysql или acces желания нет. Хотелось бы, чтобы использовались встроенные функции api хотябы). Синтаксис же хочется максимально близкий к mysql, потому, что с новым разбираться тоже не хочется.

Дайте пожалуйста примерчик проостенькой проги общающейся с бд, с объяснениями по русский!
Отправлен: 26.01.2007, 06:05
Вопрос задал: Талипов А Н (статус: 3-ий класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ramok
Здравствуйте, Талипов А Н!

http://www.rsdn.ru/archive/vc/issues/pvc027.htm
http://www.rsdn.ru/archive/vc/issues/pvc033.htm
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 26.01.2007, 06:17


Вопрос № 72.697
Такой вот вопрос проект написанный на C++Builder 6
был перенесен на другую машину, и при попытке
откомпилировать проект заново Builder "ругается" на отсутствующие файлы библиотек RXLib и т.п. хотя в данном проекте ни один из компонентов данных библиотек не используется. Упоминания о них в тексте программы (*.cpp; *.h -файлах) не нашел. Вопрос где можно в проекте посмотреть и удалить упоминание о данных компонентах?
P.S.: В настройках проекта на закладке "Packages" в строке "Runtime packages" вроде все упоминания удалил но безрезультатно...
Отправлен: 26.01.2007, 08:49
Вопрос задал: Смирнов Николай (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lemeshev Konstantin
Здравствуйте, Смирнов Николай!
Попробуйте снять "галочку" "Use dynamic RTL" на вкладке Linker.
Ответ отправил: Lemeshev Konstantin (статус: 3-ий класс)
Ответ отправлен: 26.01.2007, 09:12
Оценка за ответ: 4
Комментарий оценки:
Спасибо за быстрый ответ, но в своем вопросе забыл указать что данная галочка" "Use dynamic RTL" на вкладке Linker снята...


Вопрос № 72.740
Здравствуйте, уважаемые эксперты!
Столкнулся с проблемой: проект Win32-Console (C++ VS2003) состоит из C и CPP-файлов, дополнительные библиотеки не используются;
Release- версия собирается без вопросов, а Debug - вылезают ошибки
линкера (error LNK2001: unresolved external symbol _t_rc и т.д.).
Обратил внимание на Build.log для различных конфигураций: для
Release CPP-файлы компилятся отдельно от C-файлов, а для Debug - в одной куче (см. приложение). Могла здесь собака порыться? Если да, то какой ручкой крутить? Или на что-то другое смотреть?
Спасибо.

Приложение:

Отправлен: 26.01.2007, 13:59
Вопрос задал: Alex_ili_sss (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: Mihasic
Здравствуйте, Alex_ili_sss!
В общем вот ответ после обсуждений (надеюсь окончательный):

Студия по разному компилирует файлы C и CPP, что в принципе и так понятно. Проблема может появится при линковке этих файлов, так в заголовках (которые включаются в C++ файлы) нужно писать extern "C", чтобы линкер искал правильные имена.

Изменить то, как студия воспринимает файлы можно в опциях (или ключами компилятора), вот что говорит МСДН (искать по /TC):

The /Tc option specifies that filename is a C source file, even if it doesn't have a .c extension. The /Tp option specifies that filename is a C++ source file, even if it doesn't have a .cpp or .cxx extension. A space between the option and filename is optional. Each option specifies one file; to specify additional files, repeat the option.

/TC and /TP are "global" variants of /Tc and /Tp. They specify to the compiler to treat all files named on the command line as C source files (/TC) or C++ source files (/TP), without regard to location on the command line in relation to the option. These global options can be overridden on a single file via /Tc or /Tp.

By default, CL assumes that files with the .c extension are C source files and files with the .cpp or the .cxx extension are C++ source files.
В опциях проекта эти ключи находятся в разделе: C/С++->Advanced->Compile As
Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 26.01.2007, 17:20
Оценка за ответ: 5
Комментарий оценки:
Приложения изучались внимательно!

Отвечает: kool
Здравствуйте, Alex_ili_sss!
Скорее всего забыли проинклюдить файл ресурсов.
Чтобы таких проблен не было такие проекты нуно создавть "вручную",
т.е. выбрать "создать пустой проект".
Удачи!
Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 26.01.2007, 19:54


Вопрос № 72.769
Почему данная программа выводит на екран 4 3 2, а не 2 3 4, ведь по идее здесь используется операция инкримент, которая должна сначала увеличить n на единицу, получить 2, потом еще, получить 3, потом - 4, и вывести.

Приложение:

Отправлен: 26.01.2007, 17:42
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Базанов Иван Александрович
Здравствуйте, Platon!
Насколько я знаю, компилятор не гарантирует тот порядок вычисления аргументов функции, который указан в вызове. Поэтому операции инкремента могут производиться в любом порядке, в вашем случае - сначала вычисляется 4й аргумент, потом 3й, потом 2й
---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 17:51

Отвечает: ramok
Здравствуйте, Platon!

в стандарте C и C++ не определен порядок обработки аргументов фунции.
судя по всему у вас параметры обрабатываются справа на лево.
у меня вот в gcc выводит
4 4 4

я бы посоветовал избегать подобных фокусов

Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 26.01.2007, 18:01

Отвечает: Thread
Здравствуйте, Platon!
Логичнее всего предположить, что printf подставляет аргументы с конца строки форматированния.
Ответ отправил: Thread (статус: 3-ий класс)
Ответ отправлен: 26.01.2007, 18:01

Отвечает: Mihasic
Здравствуйте, Platon!
В стандарте порядок вычисления аргументов неопределен (5.2.2):

8 The order of evaluation of arguments is unspecified. All side effects
of argument expression evaluations take effect before the function is
entered. The order of evaluation of the postfix expression and the
argument expression list is unspecified.

Приложение:

Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 26.01.2007, 18:08

Отвечает: estiGi
Здравствуйте, Platon!
Насколько я помню, еще Страурступ писал, что нельзя гарантировать, в каком порядке будут вычислять аргументы, передаваемые в функцию.
В вашем случае они вычисляются справа налево.
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 26.01.2007, 18:55

Отвечает: kool
Здравствуйте, Platon!
Потому что функция считывает параметры справа налево.
Сначала увеличивается третий параметр и в третьей позиции будет выводится 2,
потом второй параметр и во второй позиции будет выводиться 3 и т.д.
Пример можно изменить так (см.приложение).
Удачи!

Приложение:

Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 27.01.2007, 10:30

Отвечает: John Paramol
Здравствуйте, Platon!

Никогда не используйте подобных выражений. ANSI C++ не дает никаких гарантий на то или иное поведение подобного кода. Используйте оператор инкремента/декремента не более одного раза в одном операторе. Сам господин Страуструп пишет о том, что таких случаев нужно избегать.
Другой пример: array[++i] = ++i;
Однако, отвечу на ваш вопрос конкретно.
Функция printf объявлена как __cdecl, что, кроме прочих нюансов, горовит компилятору, что параметры передаются в функцию через стек, причем добавляются в него справа налево. Предполагаемые действия компилятора: инкрементируем n, добавляем n в стек, инкрементируем n, добавляем n в стек, инкрементируем n, добавляем n в стек, добавляем в стек адрес строки формата. Функция printf анализирует строку формата и, при нахождении ссылки на подстановку целого числа, берет из стека ближайшие от адреса строки формата 4 байта. Т.о. там будет расположено число n, которое было добавлено в стек последним, имеющее значение 4. Дальше последуют 3 и 2.
Но возможно и другое поведение компилятора. Например, сначала n трижды инкрементируется, а потом трижды передается в функцию. Тогда результат, очевидно, будет 4 4 4. Мало ли других вариантов, поэтому на разных компиляторах результат может быть разным.
Возможно, поведение было бы другим, если бы функция была не __cdecl, а, например, __fastcall (передача параметров через регистры).

PS Ценю ваше стремление к познанию тонких мест в программировании.
---------
1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 6-ой класс)
Ответ отправлен: 27.01.2007, 15:34


Вопрос № 72.791
Как вычислить корень квадратный из 2 с точностью до 1000000 знака? Точнее как это число вывести (т.е. не обязательно хранить в памяти). И как вообще хранить числа с большой степенью точности и производить над ними стандартные опреации сложение, деление и тд. С помощью разложения ряда (1+z)^a в ряд Тейлора получаю бесконечную сумму, в которой нету бесконечно длинных членов (таких как 1/3 = 0.3333333). Однако как это использовать не знаю :) Или может есть другие способы? помогите плиз)

Приложение:

Отправлен: 26.01.2007, 20:49
Вопрос задал: Mystic (статус: 5-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Рязанов Максим Валерьевич
Здравствуйте, Mystic!
Для хранения и работы с дробными числами используются типы float и double.
В переменной типа float могут храниться положительные и отрицательные числа с плавающей точкой, абсолютные значения которых лежат в интервале от 3.14^-38 до 3.14^38, а для double интервал от от 1.7^-308 до 1.7^308. Над этими типами можно проводить стандартные арифметические операции.
Удачи.
Ответ отправил: Рязанов Максим Валерьевич (статус: 1-ый класс)
Ответ отправлен: 26.01.2007, 21:07
Оценка за ответ: 2
Комментарий оценки:
У float значащих цифр 7 (или 8, точно не помню), а y double 15. Мне же надо 1000000 значащих цифр. Так что эти типы никак нельзя использовать здесь.

Отвечает: Neil
Здравствуйте, Mystic!

Интересная задачка :) Давайте размышлять.

Очевидно, хранить число в готовых типах не получится. Скорее всего нужно хранить его по цифрам (например, массив char-ов для экономии памяти), и реализовывать "вручную" операции сложения, умножения, возведения в степень между массивами char-ов (Вы ж это знаете, сложение и умножение в столбик :) При желании в Кнуте можно найти более мощные алгоритмы). При желании можно ещё лучше экономить память по аналогии с хранением двух цифр в 1 байте (аналог ассемблеровского упакованного BCD (тут и намёк на то, что в Ассемблере есть готовые операции для работы с таким представлением чисел :) )), но это достаточно жестокое усложнение программы.

Кроме того, ряд Тейлора плохо позволяет оценить точность (хотя можно утверждать, что когда очередной член ряда становится меньше погрешности в некое число n раз, то точность достигнута).

Можно сэкономить следующим образом. Существует такой метод вычисления корней, называемый методом последовательных приближений или методом Ньютона. Согласно ему:

Если A[0] - первое приближение (взятое произвольно), N - число, из которого требуется взять корень, то каждое следующее приближение A[i+1] вычисляется как:
A[i+1] = (N/A[i] + A[i])/2
Тут получается штука следующего рода. Мы избавляемся от реализации умножения, но остаёмся при делении и сложении. Погрешность конечного приближения не превосходит разности двух последних вычисленных приближений. (т.е. в Вашем случае считаем до тех пор, пока разность больше 10^(-7)).

По всей видимости, от раздельного хранения цифр и ручного вычисления Вам никуда не уйти. Ещё есть различные библиотеки ( http://www.swox.com/gmp/ ), где это уже сделано за Вас. Однако, если это, например, задание в институте, то вряд ли покатит..
Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 26.01.2007, 23:09
Оценка за ответ: 5
Комментарий оценки:
Спасибо за метод Ньютона, приближение у него быстрее вроде, чем у Тейлора, но согласитесь, вычисление результата с точностью до 1000000 от деления будет очень медленно. Деление пополам еще как-нибудь можно сделать побыстрее, но вот 1/A[i] будет уже гораздо труднее. Но все равно спасибо.

Отвечает: Bob Johnson
Здравствуйте, Mystic!
дада, ни float, ни double, ни даже extended тебе тут не помогут :)

придется реализовывать свою арифметику (это по-любому). Я хочу предложить тебе другой вариант вычисления корня. Дело в том, что деление реализовывать весьма трудно (намного труднее умножения!) в то время как умножение при умелом подходе можно заменить сложением. Короче, двоичный алгоритм вычисления квадратного корня такой:

пусть есть число А = 2^n, удовлетворяющее следующим условиям:
1. A*A < 2 (т.е. А не превосходит корня из двух)
2. (А*2)*(А*2) > 2 (т.е. если мы возьмем А = 2^(n + 1), то это число уже будет превосходить корень из двух).
Тогда можно смело сказать, что А – это первое двоичное приближение корня из двух. Очевидно, что А = 1, т.к. 1*1 = 1, а 2*2 = 4. Т.е. первое двоичное приближение корня из двух – это единица. Теперь непосредственно алгоритм.

Пусть n – это номер шага, а s – приблизительное значение корня из 2 на этом шаге. Тогда на нулевом (начальном шаге) n = 0, s [0] = 1 = 2^0. На каждом следующем шаге алгоритма мы будем определять один следующий бит результата. Т.е. на первом шаге мы определим бит 2^(-1), на втором – 2^(-2) и т.п. Правило определения бита такое: если (s [n – 1] + 2^(-n) )^2 > 2) то s [n] = s [n – 1], иначе s [n] = s [n – 1] + 2^(-n). Т.е. мы временно присваиваем тестируемому биту единицу, возводим получившееся число в квадрат и сравниваем с двойкой. Если результат оказался больше 2, то тестируемый бит никак не может быть единицей, т.к. результат уже превосходит 2. Если же результат оказывается меньше 2, то тестируемый бит должен быть единицей, т.к. его еще не хватает до получения 2. Таким образом, нам всего лишь нужна одна операция умножения на один бит результата.

Но даже это много, когда мы говорим о числе с миллионом разрядов! Значит, от операции умножения придется уйти. В данной ситуации это достаточно просто. Пусть у нас есть s [n - 1] – это приблизительное значение корня из 2-х на (n - 1)-м шаге. Значит на n-м шаге мы определяем бит 2^(-n). Т.е. нам надо посчитать (s [n - 1] + 2^(-n))^2 и сравнить его с двумя. Разложим квадрат:
(s [n - 1] + 2^(-n))^2 = (s [n - 1])^2 + 2*(s [n - 1])*2^(-n) + 2^(-2*n) = (s [n - 1])^2 + (s [n - 1])*2^(-n + 1) + 2^(-2*n)

А теперь допустим, что значение (s [n - 1])^2 у нас тоже есть (обозначим его S [n – 1]). Тогда что остается? Взять s [n – 1], сдвинуть его на (n – 1) разрядов вправо (умножение на 2^m эквивалентно сдвигу на m разрядов вправо), добавить к нему S [n – 1] (это операция сложения) и установить бит 2^(-2*n) (этот бит будет находиться далеко «вправо» от общего результата, поэтому можно смело быть уверенным, что его значение всегда изначально равно нулю, поэтому его можно просто устанавливать). Полученное число и будет (s [n - 1] + 2^(-n))^2.

Теперь его необходимо сравнить с 2-й – ну это очень просто – проверяем бит 2^1 = 2, если его значение равно единице, значит установка бита 2^(-n) искомого корня приводит к превышению произведением двух, т.е. его значение должно быть нулем. Это означает, что s [n] = s [n – 1], а S [n] = S [n – 1] соответственно. В противном же случае, s [n] = s [n – 1] + 2^(-n + 1), а S [n] равняется только что полученному произведению. Это дает возможность без дополнительных вычислений перейти к следующему шагу.

Пример вычисления по шагам.
0. n = 0, s [0] = 1.0000, S [0] = 1.0000 – начальные значения
1. n = 1, тестируемый бит 2^(-1), тестовое произведение равно S [0] + s [0]*2^(-1+1) + 2^(-2) = 1.0000 + 1.0000*1.0000 + 0.0100 = 1.0000 + 1.0000 + 0.0100 = 10.0100. Результат больше двух, значит s [1] = 1.0000, S [1] = 1.0000
2. n = 2, тестируемый бит 2^(-2), тестовое значение S [1] + s [1]*2^(-2 + 1) + 2^(-4) = 1.0000 + 1.0000*0.1000 + 0.0001 = 1.0000 + 0.1000 + 0.0001 = 1.1001. Результат меньше двух, значит s [2] = 1.0100, S [2] = 1.1001
3. n = 3, бит 2^(-3), тестовое значение S [2] + s [2]*2^(-3 + 1) + 2^(-6) = 1.1001 + 1.0100*0.0100 + 0.000001 = 1.1001 + 0.0101 + 0.000001 = 1.111001, меньше двух, s [3] = 1.0110, S [3] = 1.111001
4. n = 4, бит 2^(-4), тестовое значение S [3] + s [3]*2^(-4 + 1) + 2^(-8) = 1.111001 + 1.0110*0.0010 + 0.00000001 = 1.111001 + 0.001011 + 0.00000001 = 10.00010001, больше двух, s [4] = 1.0110, S [4] = 1.111001
5. И так далее…

Какой результат мы получили? Значение корня больше 1.0110 = 1 + 0.25 + 0.125 = 1.375, но меньше 1.0111 (это показал 4-й шаг) = 1.4375 что верно, т.к. значение корня из двух ~ 1.41.

Таким образом, остается реализовать полученный алгоритм :)
Для реализации алгоритма прежде всего необходимо посчитать, сколько двоичных цифр необходимо для представления миллиона десятичных. Это будет 1 000 000/log (2) = 3 321 929 или 415 242 байт. А в процессе работы нам понадобится 3 таких числа – одно для хранения s [n], второе – для хранения S [n] и третье для хранения промежуточного тестового результата. Размерность всех трех чисел может быть одинаковой. Но если ты внимательно фтыкал алгоритм, то мог бы заметить, что бит 2^(-2*n) увеличивает разрядность S [n] вдвое, почему же я сказал, что S [n] может быть такой же разрядности как и s [n]? Да просто потому, что как только значение бита 2^(-2*n) перестанет укладываться в разрядность s [n], его можно не учитывать (все равно не попадает в результат), т.е. все три числа могут иметь одинаковую разрядность. Но разрядность следует взять с запасом – хотя бы сотню дополнительных разрядов, чтобы случайно не потерять из-за них точность (при сдвиге s [n - 1] на (n – 1) разрядов вправо будет теряться точность). А можно взять все числа удвоенной разрядности, тогда точность не будет теряться вообще, но упадет скорость алгоритма.
Продолжение в приложени... не влазит блин

Приложение:

Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 27.01.2007, 02:44
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое, буду пробовать)


Вопрос № 72.793
Уважаемые эксперты и профи дали мне задание,но я в этом совсем не разбираюсь, прошу у вас помощи,завтра все сдавать:
/*-----------------------Задание 1----------------------*/
Определить по номеру месяца к какому кварталу он относится
/*-----------------------Задание 2----------------------*/
Вычислить и вывести на экран таблицу значений функции:

------
| корень,под ним х в кубе +2х-1,при х<2
y=| корень 5 степени под ним х квадрат+3х-5, при х>=2
------
х принадлежит к отрезку [-1;3] шаг 0,05

Заранее благодарен.
Отправлен: 26.01.2007, 21:32
Вопрос задал: Cергей Викторович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Базанов Иван Александрович
Здравствуйте, Cергей Викторович!
1.
int nMonth; // Предположим это номер месяца и они нумеруются с 0 (0-январь и т.д.)
int nQuart=nMonth/3; // Тогда это номер квартала, нумерация с 0
2.
#include <stdio.h>
#include <math.h>
printf("x , y");
for(float x=-1; x<=3;x+=0.05)
{
float y=0;
if (x<2)
y=sqrt(x*x*x+2*x-1);
else
{
y=exp(.2*log(x*x+3*x-5));
}
printf("%12.2f, %12.2f",x,y);
}


---------
Программист ошибается дважды: первый раз при рождении, второй при выборе профессии
Ответ отправил: Базанов Иван Александрович (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 21:54
Оценка за ответ: 5

Отвечает: Mitya86
Здравствуйте, Cергей Викторович!

см. приложение, надеюсь помог
если возникнут вопросы - пишите

Приложение:

Ответ отправил: Mitya86 (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 22:25
Оценка за ответ: 5
Комментарий оценки:
Еще раз огромное спасибо!


Вопрос № 72.797
Суть вопроса: почему эта программа работает. Ведь функции getch(), ungetch(c) не обьявлены в этом файле, однако компилятор gcc не выдает никаких ошибок. А если изменить имя процедур на произвольные - ишибки есть. Зарание списибо.

Приложение:

Отправлен: 26.01.2007, 22:00
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ramok
Здравствуйте, Platon!

1. в gcc по умочанию установлен низкий уровень вывода предупреждений. добавьте флажки
-W -Wall и вы увидете много интересных варнингов Ж:-)

2. по умолчанию gcc подключает стандарные библиотеки автоматически. можете отменить это флажком -fno-nonansi-builtins и -nodefaultlibs

3. gcc может не ругатся, но линкер должен выдать что то типа
aa.c:(.text+0x50): undefined reference to `getch'
aa.c:(.text+0x121): undefined reference to `ungetch'

наверное вы с посощью gcc делаете только объектные файлы
Ответ отправил: ramok (статус: Студент)
Ответ отправлен: 26.01.2007, 22:18

Отвечает: Mitya86
Здравствуйте, Platon!

Видимо объявление этих функций содержит библиотека stdio.h
Ответ отправил: Mitya86 (статус: 2-ой класс)
Ответ отправлен: 26.01.2007, 22:27


Вопрос № 72.800
Здравствуйте, уважаемые эксперты!
Проблема такая:
Открываю Microsoft Visual C++, создаю Win32 Console Application, example.c, пишу что-то вроде:
Всё запускается, рисуется.
В функции display экспериментирую с цветами, меняю auxSolidSphere на auxWireCube, auxSolidCone и т.д. и т.п. Каждый раз после изменений смотрю, что получилось: компилирую, запускаю. Через каждые 5-15 нормальных запусков при закрытии программы или сразу после Build->Execute example.exe компьютер без каких-либо предупреждений и объяснений уходит на перезагрузку. После checking'а и загрузки окошек вылезает сообщение "Система восстановлена после серьёной ошибки".
Грешу на библиотеки OpenGL. Может, кто подскажет, откуда ноги растут и как с этим бороться?

Приложение:

Отправлен: 26.01.2007, 22:57
Вопрос задал: Igel (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 9)

Отвечает: Neil
Здравствуйте, Igel!

Попробуйте закомментировать строчку
auxMainLoop(display);
и позапускать n раз. Если получится - вероятно, глюк OpenGL, если снова перезагрузка - глюк железа или windows. Кстати, какой Windows и процессор (на тему поддержки DEP, если не знаете - просто пишите модель)?
Ответ отправил: Neil (статус: 1-ый класс)
Ответ отправлен: 26.01.2007, 23:15

Отвечает: kool
Здравствуйте, Igel!
Имхо проблемы с железом или
система ниже W2k.
Удачи!
Ответ отправил: kool (статус: 6-ой класс)
Ответ отправлен: 27.01.2007, 11:06
Оценка за ответ: 5

Отвечает: Ross
Здравствуйте, Igel!

Возможно проблема в драйвере видеокарты, либо в ней самой, т.к. даже неправильно написанное приложение не должно вызывать ошибки такого рода.

Насчет кода: добавьте в display перед вызовом glTranslated вызов glLoadIdentity() (сброс матрицы просмотра), иначе ваша сфера будет улетать вправо. В остальном - все в порядке.
Ответ отправил: Ross (статус: 4-ый класс)
Ответ отправлен: 27.01.2007, 12:43


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.43 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное