Выпуск № 1322 от 04.06.2009, 00:05
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 626, экспертов - 142
В номере: вопросов - 5, ответов - 7
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 168512: Здраствуйте, Пробую использовать cin и cout в for цикле, в приложении код, компилируется нормально, но при выполннении выбрасывает ошибку на команде cin>>tmpChar; подскажите в чем проблема и как её решить? заранее спасибо. з.ы. Использ...
Вопрос № 168513: Пожалуйста,помогите с написанием кода сортировки массива простым подсчетом на С++Builder!Данные для сортировки вводятся случайным образом компьютером,но пользователь ограничивает их кол-во....
Вопрос № 168488: ПОМОГИТЕ С ДВУМЯ ПРОСТЕЙШИМИ ЗАДАЧАМИ.... *****1***** Билли Бонс положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке...
Вопрос № 168519: Здраствуйте, появился еще вопрос :( Создаю массив объектов, потом вызываю каждому объекту метод, но наверно чтото зделал нетак, т.к. все елементы массива указывают на тотже объект в приложе...
Вопрос № 168520: подскажите пожалуйста как составить строковую функцию num_to_str(n), где n-целое число(|n|<1000) возвращаемое значение должно быть строкой, в которой число n представлено словами. Я нашёл вот такой код, но похоже это не то......
Вопрос № 168512:
Здраствуйте, Пробую использовать cin и cout в for цикле, в приложении код, компилируется нормально, но при выполннении выбрасывает ошибку на команде cin>>tmpChar; подскажите в чем проблема и как её решить? заранее спасибо. з.ы. Использую Dev-C++
Отвечает AMV007, 2-й класс :
Здравствуйте, Станислав. сначала надо бы выделить память для результата, например : char* tmpChar = new char[255]; char* tmpChar2= new char[255];
----- Работать, работать и еще раз работать (да не, шутка :) )
Ответ отправил: AMV007, 2-й класс
Ответ отправлен: 29.05.2009, 20:02
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250034
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает Micren, Практикант :
Здравствуйте, Станислав. Вы объявили 2 указателя
Код:
char* tmpChar; char* tmpChar2;
В C++ автоматические переменные не инициализируются ничем. Фактически в ваших переменных-указателях содержится "мусор", который был в памяти.
Поэтому когда потоковый класс cin, которому Вы передали эти указатели как параметры, при попытке записи в память по адресу, который в этих указателях содержится, вызывает исключение. Т.к. приложение не может писать в память куда ему вздумается.
Обязательно надо выделить память для хранения этих значений. Не обязательно делать это динамически используя new или malloc(). Для вашей задачи<
br>вполне достаточно:
Код:
char tmpChar[100]; char tmpChar2[100];
Здесь тоже фактически объявляются два константных указателя. Но на область памяти размером в 100*sizeof(char) байт. Следует сказать, что это
не застрахует Вас от ошибок если пользователь, от нечего делать, введет имя длиннее этого размера. Лучше пользоваться.
Код:
cin.get(tmpChar,100);
Вторым параметром передается размер принимающего буфера
.
Учитывая, что Вы пишете на C++ лучше пользоваться вместо указателей на char строковым классом из STL string который избавит Вас от этих проблем.
Ответ отправил: Micren, Практикант
Ответ отправлен: 29.05.2009, 21:06
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250037
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 168513:
Пожалуйста,помогите с написанием кода сортировки массива простым подсчетом на С++Builder!Данные для сортировки вводятся случайным образом компьютером,но пользователь ограничивает их кол-во.
/* Функция сортировки подсчетом. * * Параметры: * a - указатель на массив * N - номер последнего элемента * Заметка: * Элементы массива должны быть уникальны (ограничение
алгоритма). */ template <class Ty> void CountingSort(Ty* a, int N) { // выделяем вспомогательный массив Ty* tmp = new Ty[N+1];
for (int i=0; i<=N; ++i) { // количество элементов меньших a[i] int k = 0;
for (int j=0; j<i; ++j) if (a[j] < a[i]) ++k; for (int j=i+1; j<=N; ++j) if (a[j] < a[i]) ++k;
// вставляем a[i] на место k+1 tmp[k] = a[i]; }
// копируем значения из вспомогательного массива в основной memcpy(a, tmp, (N+1) * sizeof(Ty)); delete [] tmp; }
----- Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross, Практикант
Ответ отправлен: 01.06.2009, 00:32
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250131
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 168488:
ПОМОГИТЕ С ДВУМЯ ПРОСТЕЙШИМИ ЗАДАЧАМИ.... *****1***** Билли Бонс положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет, сколько было в сундуке два года назад.
Требуется написать программу, которая определит, сколько монет было в сундуке в первый и во второй года, если в X-м году там оказалось ровно Y монет. Входные данные
Входной файл INPUT.TXT содержит натуральные числа X и Y (3
<= X <= 20, 1 <= Y <= 32767). Выходные данные
В выходной файл OUTPUT.TXT выведите через пробел количество монет в первый и второй года. Гарантируется, что решение задачи всегда существует. Пример № INPUT.TXT OUTPUT.TXT 1 6 25 5 2
Пояснение к примеру Если в первый год положить 5 монет, а во второй год вынуть 3 монеты, то начиная с первого года в сундуке будет 5, 2, 7, 9, 16, 25, ... монет.
*****2***** Возьмем четырехзначное число, в котором не все цифры одинаковы, например 6264. Расположим цифры сначала в порядке убывания - 6642; затем, переставив их в обратном порядке, получим 2466. Вычтем последнее число из 6642. На следующем шаге с полученной разностью проделаем тоже самое. Через несколько таких действий получится число, переходящее само в себя и называемое постоянной Капрекара.
Требуется написать программу, которая находит эту постоянную и количество шагов для ее получения из заданного четырехзначного
числа. Входные данные
Входной файл INPUT.TXT содержит одну строку, в которой записано четырехзначное число. Выходные данные
В выходной файл OUTPUT.TXT записываются: в первой строке постоянная Капрекара, во второй – количество шагов для ее получения. Пример № INPUT.TXT OUTPUT.TXT 1 1234 6174 3
Отправлен: 29.05.2009, 10:57
Вопрос задал: jahon, Посетитель
Всего ответов: 2 Страница вопроса >>
Могу помочь решить 1-ую задачу математически. Оформить программно не могу, т.к. работаю не на этой программе. Итак решение: (При решении учитывается что в Х-м году деньги Билли Бонс в сундук уже ложил) Чтобы узнать сколько денег было положено в первый год в сундук надо M1=(Y-1):X, от полученного результата извлечь целую часть, это и будет ответом сколько в 1-ый год положили денег в сундук. Сколько было в сундуке во второй год лучше узать так: M2=Y-M1*(Y-2)
#thank 250012
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает Micren, Практикант :
Здравствуйте, jahon. 1я задача
Код:
#include <fstream>
using namespace std;
int main() { ifstream in("INPUT.TXT"); ofstream out("OUTPUT.TXT"); int X,Y; in>>X>>Y; int Cx=1,Cy=1,Year=X-2; while(--Year) { int
tmp=Cx+Cy; Cx=Cy; Cy=tmp; } int x,y=0; do { int numerator=Y-y*Cy; x=numerator/Cx; if(numerator%Cx)continue; out<<x<<' '<<y<<endl; } while (y++<=x); return 0; }
class result { public: result(int kaprecar,int steps) :_kaprecar(kaprecar) ,_steps(steps) {} int kaprecar() { return _kaprecar; } int steps() { return _steps; } private: int _kaprecar; int _steps; };
result calc(int N) { typedef
vector<char> dVector; dVector digits; int iterCount=0; while(true) { int oldN=N; int count=4; while(count-->0) { digits.push_back(N%10); N/=10; } sort(digits.begin(),digits.end(),less<int>()); int N1=0,N2=0,mult=1; for(dVector::const_iterator it=digits.begin();it!=digits.end();++it) { N1=N1*10+*it; N2=*it*mult+N2; mult*=10; } digits.clear(); N=
N2-N1; ++iterCount; if(oldN==N) { return result(N,iterCount-1); } } }
int main() { int N; ifstream in("INPUT.TXT"); ofstream out("OUTPUT.TXT"); in>>N; result r=calc(N); out<<r.kaprecar()<<endl <<r.steps()<<endl; return 0; }
Ответ отправил: Micren, Практикант
Ответ отправлен: 29.05.2009, 13:02
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250013
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 168519:
Здраствуйте, появился еще вопрос :( Создаю массив объектов, потом вызываю каждому объекту метод, но наверно чтото зделал нетак, т.к. все елементы массива указывают на тотже объект в приложении файлы. Работа программы: Skolko studentov: 3 vvedite 1 imia: 1
vvedite 1 familiju: 2
vvedite 2 imia: 3
vvedite 2 familiju: 4
vvedite 3 imia: 5
vvedite 3 familiju: 6
6 6
у первого и у второго студента
показывает фамилию 6, хотя должно быть: 2 4 Подскажите как это исправить? заранее спасибо.
Отвечает Micren, Практикант :
Здравствуйте, Станислав. Надо понимать, что такое char*. Это не строка. Это указатель(адрес в памяти) где эта строка хранится. Поэтому в тех методах, где вы передаете char* и сохраняете в переменные-члены класса. Вы сохраняете адрес на строку. Фактически адрес памяти выделенный оператором new. Но этот адрес используется чисто для буфера, куда Вы вводите имена и фамилии. В итоге по этому адресу располагаются последние введенные
данные. Отсюда и такой результат. Это не правильный(ошибочный) подход.
Необходимо выделять память для строки, копировать ее и для всех классов использующих динамику обязательно определять деструктор, конструктор копирования и операцию присваивания.
class student : public person { public: student(const char* const firstName=0, const char* const lastName=0,int rate=0); int rate() const; private: int _rate; };
Ответ отправил: Micren, Практикант
Ответ отправлен: 29.05.2009, 22:23
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250041
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 168520:
подскажите пожалуйста как составить строковую функцию num_to_str(n), где n-целое число(|n|<1000) возвращаемое значение должно быть строкой, в которой число n представлено словами.
Отвечает Piter, 3-й класс :
Здравствуйте, Алексей3791.
По - моему вот так больше подходит к условию
Приложение:
Ответ отправил: Piter, 3-й класс
Ответ отправлен: 30.05.2009, 10:45
Оценка ответа: 3 Комментарий к оценке: k:\ïðîãðàììèðîâàíèå\mine\mine\kurs\kursovic\krac.cpp(27) : error C2065: 'CharToOEm' : undeclared identifier k:\ïðîãðàììèðîâàíèå\mine\mine\kurs\kursovic\krac.cpp(28) : error C2440: 'return' : cannot convert from 'char'
to 'char *' почему у меня не запускается?
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250056
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.