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

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


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

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

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

Выпуск № 918
от 26.11.2007, 16:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 477, Экспертов: 70
В номере:Вопросов: 6, Ответов: 12


Вопрос № 110303: Здравствуйте! Совсем не могу понять, как решать задачи с помощью подпрограмм (т.е. как их объявлять и вызывать в порграмме. Помогите пожалуйста решить: 1) Задано две квадратные матрицы n-ого порядка (n<=20). Найти квадрат той из них, в которо...
Вопрос № 110339: Здравствуйте! Вопрос в следующем: не могу вернуть массив из функции. Функция в приложении. Компилятор останавливается в строке: return P; Ошибка: [C++ Error] Unit1.cpp(88): E2034 Cannot convert '_STL::vector<float,_STL::allocator<fl...
Вопрос № 110347: Доброго здравия всем желаю. Есть класс Long. Посмотрите пожалуйста в неплохом ли стиле он реализаван? Если нужно что-то улучшитьили поменять то подскажите. Чтобы можно было остановиться на нем как на базовом. ...
Вопрос № 110348: Подскажите, как число четное или не четное. Я полагала так: if ((sqrt(N)%2)==0) k=floor(sqrt(N)); else k=ceil(sqrt(N)); Но компилятор ругается на выражение sqrt(N)%2. [C++ Error] Unit1.cpp(33): E2060 Illegal use of floating point Зар...
Вопрос № 110374: Доброго дня! Вопрос следующий к уважаемым экспертам.Программирую на VC++ 6.0. обьясните пожалуйста действие строки float f = 1024 / float(++i); с остальными строками все просто и понятно.Почему во флоате можно делить на ноль и какая...
Вопрос № 110376: Привет экспертам! Только начинаю изучать С++Builder6. Основная задача сейчас у меня научиться работе с текстовыми файлами(копировать строки, извлекать подстроку, определять кол-во столбцов в файле разделенным каким-либо разделителем и т.д) Учусь по к...

Вопрос № 110.303
Здравствуйте!
Совсем не могу понять, как решать задачи с помощью подпрограмм (т.е. как их объявлять и вызывать в порграмме. Помогите пожалуйста решить:
1) Задано две квадратные матрицы n-ого порядка (n<=20). Найти квадрат той из них, в которой сумма элементов главной диагонали наименьшая.
2) Вычислить: x1*xn+x2*xn-1+...+xn*x1? где xi-наибольший элемент i-ой строки матрицы Аn*n.
Borland C++ 3.1
Буду благодарен за любую помощь!
Отправлен: 20.11.2007, 17:04
Вопрос задал: LexXx (статус: Практикант)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Терсков Сергей
Здравствуйте, LexXx!
Вот решение вашей задачи. Написано в среде MS VS 2005. Для BC 3.1 заголовочный файл ввода-вывода называется и using namespace std; использовать не нужно. И функция rand() должная быть кажется другой. Но это все мелочи, а так в целом все позиции вопроса в коде отражены, и использование подпрограмм (функций) максимальное...

Приложение:

Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 21.11.2007, 05:01
Оценка за ответ: 5
Комментарий оценки:
Супер ,спасибо огромное за ответ! Чуть не забыл оценку поставить :))


Вопрос № 110.339
Здравствуйте! Вопрос в следующем: не могу вернуть массив из функции.
Функция в приложении. Компилятор останавливается в строке:
return P;
Ошибка: [C++ Error] Unit1.cpp(88): E2034 Cannot convert '_STL::vector<float,_STL::allocator<float> >' to 'float *'
Если вместо строки:
std::vector<float> P(k);
прописать просто: float P[5]={0};
то все работает, подскажите как возвращать теперь массив P. И как измениться вызов функции? Ранее вызов был:
ver( a, b, N, k, stat)[i-1]
Заранее спасбо!

Приложение:

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

Отвечает: Терсков Сергей
Здравствуйте, Mart!

Ничего хорошего от такой замены вы не добьетесь. Массив вида

float P[5]={0};

создастся внутри функции и там же и останется. В этом случае вернется лишь мусор, а не вектор. Если вы решили использовать класс вектора, то используйте его везде. Подробнее в приложении...

Приложение:

Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 21.11.2007, 03:26
Оценка за ответ: 5


Вопрос № 110.347
Доброго здравия всем желаю.
Есть класс Long. Посмотрите пожалуйста в неплохом ли стиле он реализаван?
Если нужно что-то улучшитьили поменять то подскажите. Чтобы можно было остановиться на нем как на базовом.

Приложение:

Отправлен: 21.11.2007, 04:20
Вопрос задал: tito (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Виктор Пырлик
Здравствуйте, Tito!
Совершено не понятно что вы хотите сделать а по этому и определить «правильность» не возможно. Но даже исходя из внешнего вида, и предполагаемой логики (её отсутствия) данный класс не для чего не годится.
Файл в приложении, там есть комментарии…

Наверно, более правильным для данной постановки вопроса, было бы указать желаемую цель - функционал что требуется от этого класса.

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Специалист)
Ответ отправлен: 21.11.2007, 07:04


Вопрос № 110.348
Подскажите, как число четное или не четное. Я полагала так:
if ((sqrt(N)%2)==0) k=floor(sqrt(N)); else k=ceil(sqrt(N));
Но компилятор ругается на выражение sqrt(N)%2.
[C++ Error] Unit1.cpp(33): E2060 Illegal use of floating point
Заранее спасибо!
Отправлен: 21.11.2007, 06:21
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lemeshev Konstantin
Здравствуйте, Mart!
Правильно ругаеться, операция % (остаток от деления) определена только для целых чисел (да и в математике на сколько я помню признак четности относиться только к целым числам).
Так что если результат извлечения квадратного корня - целой число, то можно написать так

if( ((int)sqrt(N))%2 )==0)

Это же выражение будет определять четность целой части квадратного корня.
Ответ отправил: Lemeshev Konstantin (статус: 6-ой класс)
Ответ отправлен: 21.11.2007, 06:34
Оценка за ответ: 5

Отвечает: Sergijj
Здравствуйте, Mart!

А определять чётность целого числа лучше так:

#include <stdio.h>

//...
int value = 5;// Например
unsigned char parityFlag;// Флаг чётности
parityFlag = value & 0x0001;// Если младший бит равет 1 (т.е. будет остаток от деления на 2), то и parityFlag станет равным 1
if (parityFlag) printf("Число нечётное"); else printf("Число чётное");
//...
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 10-ый класс)
Ответ отправлен: 21.11.2007, 09:17

Отвечает: Терсков Сергей
Здравствуйте, Mart!
Вообще-то лучше данную операцию сделать немного по другому. Например как в приложении. Такая конструкция позволяет вычислять корень лишь один раз, да и компилятор ругаться не будет...

Приложение:

Ответ отправил: Терсков Сергей (статус: Студент)
Ответ отправлен: 21.11.2007, 10:25


Вопрос № 110.374
Доброго дня!
Вопрос следующий к уважаемым экспертам.Программирую на VC++ 6.0.

обьясните пожалуйста действие строки float f = 1024 / float(++i);
с остальными строками все просто и понятно.Почему во флоате можно делить на ноль и какая последовательность действий при этом проиходит?
если в чистом виде написать 0.00 то деления уже на этапе компиляции не будет.

#include <iostream>
using namespace std;

void main()
{
char i = char(255);
float f = 1024 / float(++i);
int j = 1024 / i--;
cout << j << endl;

return;
}
Отправлен: 21.11.2007, 11:50
Вопрос задал: denver (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Vas177
Здравствуйте, denver!

float f = 1024 / float(++i);
равносильно
i := i + 1;
float f = 1024 / float(i);
т. е. в начале происходит инкремент i, а затем его подстановка в знаменатель.

Соответственно в следующей строке (i --) - декремент происходит уже после подстановки, т. е.

int j = 1024 / i--;
равносильно
int j = 1024 / i;
i := i - 1;

Поэтому в данном примере под дробью будет число 256 в обоих строчках
Ответ отправил: Vas177 (статус: 2-ой класс)
Ответ отправлен: 21.11.2007, 11:57

Отвечает: Sergey A. Wedensky
Здравствуйте, denver!

По умолчанию исключения при работе с плавающей точкой отключены. Т.е. при выполнении недопустимой операции, переполнении и проч. результат просто становится "не числом" - INFINITY или NAN (посмотрите в отладчике значение f после присвоения, что-то вроде -1.#INF0000, правда?).

Протестировать результат можно функциями _finite(), _isnan(), _fpclass().

Для разрешения исключений сопроцессора можно использовать _controlfp(), например добавьте в начало Вашей main() следующий код:

// Получаем флаг
int cw = _controlfp( 0, 0 );
// Разрешаем исключения
cw &=~(EM_OVERFLOW|EM_UNDERFLOW|EM_INEXACT|EM_ZERODIVIDE|EM_DENORMAL|EM_INVALID);
// Устанавливаем
_controlfp(cw, MCW_EM);

и успешно вылетите на упомянутой строчке с exception'ом Invalid floating-point operation.

На этапе компиляции компилятор просто показывает, какой он умный, что видит очевидную нулевую константу в знаменателе оператора деления.

P.S. Упомянутые функции определены в хэдере .

Удачи.
Ответ отправил: Sergey A. Wedensky (статус: Студент)
Ответ отправлен: 21.11.2007, 12:39
Оценка за ответ: 5
Комментарий оценки:
Вы абсолютно правы меня и удивило с самого начала 1.#INF0000.Думал что это что то связано с комлексными числами или пределами из математики помню что только там возникают бесконечности :-).В связи с этим и возник вопрос.Так что ставлю 5 за помощь говорю Огромное спасибо и понятные и доступные разъяснения.И не прощаюсь, а говорю до новых встречь всего Вам доброго :-)


Вопрос № 110.376
Привет экспертам! Только начинаю изучать С++Builder6. Основная задача сейчас у меня научиться работе с текстовыми файлами(копировать строки, извлекать подстроку, определять кол-во столбцов в файле разделенным каким-либо разделителем и т.д) Учусь по книге С++ Руководство для начинающих. Шилд. Своял для опытов простенькую формочку с парой кнопок и начал эксперементы. Пытаюсь открыть файл и сразу натыкаюсь на ошибку.При ближайшем рассмотрении ошибки понял, что все дело в слэше. В одной строке выводится путь с обратным слэшем, а команда открытия работает с прямым слэшем. Как это можно обойти? И еще, если у кого-нить есть ссылочки на хорошие мануалы для работы с текстом в С++Builder киньте мне плиз. Очень буду благодарен!

Приложение:

Отправлен: 21.11.2007, 11:55
Вопрос задал: Endru (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лясин Александр Владимирович
Здравствуйте, Endru!
Не совсем понятно, всё - таки, на какую ошибку вы натыкаетесь? В какой входной строке путь с обратным слешем? Какая команда открытия работает с прямым слешем?
Хотелось бы более конкретных данных - как говорится - "Код в студию пожалуйста".
Приведённый вами код конечно не будет работать - вы пытаетесь открыть (в случае его существования) или создать (если такового нет) файл "Edit1->Text". Я думаю такого файла нет - так как в имени есть неразрешённый символ - '>'. Поэтому и ошибка вылетает.Чтобы открывать в вашем случае файл с названием в Edit1->Text, нужно писать примерно так(см. приложение).
Слешь здесь абсолютно не причём.
Хороший мануал есть в MSDN и в справке C++Builder.

Приложение:

Ответ отправил: Лясин Александр Владимирович (статус: 2-ой класс)
Ответ отправлен: 21.11.2007, 13:19
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Справка в C++Builder на англ. Трудновато для меня. Хотелось бы на русском что нибудь.

Отвечает: Лучников Ю.В.
Здравствуйте, Endru!

Вряд ли дело в каких то слешах. К тому же я их у вас не вижу;))
Дело в том, что вы в конструктор объекта impf передаете непонятно что;)

Смотрим прототип вышеуказанного конструктора:

ifstream ( );
explicit ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );

Первым параметром ожидается строка, в которой указан путь до открываемого файла. Вы же передаете строку дословно: "Edit1->Text" т.е. пытаетесь открыть файл с именем "Edit1->Text". Само собой такого не существует)

Скорее вы хотели взять путь файла, который был введен в Edit1 объект. Чтож, в поле Text он и находится. Но вот беда, Поле Text возвращает данные в виде AnsiString-строки. А конструктор ждет тип const char*. Ничего;) У класса AnsiString (а это класс, а не просто набор байтов) есть в свою очередь метод c_str(), который как раз возвращает содержимое себя как const char* str.
И еще, если конструктор не смог открыть файл, указанный ему как filename, в объекте устанавливается failbit в истину, который можно проверить методом fail().

С учетом всего сказанного, перепишем ваш код:

{
ifstream impf(Edit1->Text.c_str());
if(impf.fail()) {
ShowMessage ("Не удалось открыть файл!");
return;
}

}
___
Успехов!

Приложение:

Ответ отправил: Лучников Ю.В. (статус: 5-ый класс)
Ответ отправлен: 21.11.2007, 13:23
Оценка за ответ: 5
Комментарий оценки:
Вы правы!Нужно действительно было использовать метод c_str(). Плюс я еще взял в кавычки.Моя вина.Вопрос по поводу лит-ры остается открытым.

Отвечает: RussianGM
Здравствуйте, Endru!
Насколько я понял вопрос, вы не можете открыть файл.
Чтобы открыть файл
Вместо:
std::ifstream impf("Edit1->Text");
Нужно писать:
std::ifstream impf("Имя_вашего_файла.txt"); //если файл находится в той же папке что и проект, иначе полный путь до файла

Также не забудьте подключить необходимую библиотеку в Unit1.h:
#include <fstream.h>
Ответ отправил: RussianGM (статус: 1-ый класс)
Ответ отправлен: 21.11.2007, 13:49
Оценка за ответ: 4

Отвечает: Зубков Сергей Вячеславович
Здравствуйте, Endru!

Привет! Нужно сделать следующее:

Приложение:

Ответ отправил: Зубков Сергей Вячеславович (статус: 1-ый класс)
Ответ отправлен: 21.11.2007, 14:42
Оценка за ответ: 5
Комментарий оценки:
Спасибо!


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.64 от 24.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное