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

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


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

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

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

Выпуск № 964
от 12.01.2008, 20:35

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

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 117266: Уважаемые эксперты, поясните в чем дело: мне необходимо найти сумму всех элементов 3-х мерного массива.(прога ниже). Все корректно с точки зрения логики и синтаксиса, но почему-то при количестве элементов большем некоторого значения выдае...
Вопрос № 117283: Скажите пожалуйста как сделать так что бы функция Node* descent(Node* p); была определена, т.к. выдает ошибку что он не определена. Спасибо заранее!!!...
Вопрос № 117286: Здравствуйте эксперты! Возник вопрос следующего плана. Решил попробовать распознать капчу.написал анализатора все хорошо.Решил проверить в боевых условиях.И сразу столкнулся с проблемой.на сайтах многие капчи хранятся не в виде <img s...
Вопрос № 117312: Помогите пажлуста решить задачу Текст задачи таков Дана целочисленная прямоугольная матрица надо опредилить № строки в которой находится самая длинная серия одинаковых элементов...
Вопрос № 117321: Здравствуйте, уважаемые эксперты! Помогите, пожалуйста! Необходимо отсортировать строчный массив arr по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так? Бо...
Вопрос № 117357: С рождеством вас,уважаемые эксперты. Помогите разобрать что делает эта задача(если не трудно просто подписать коментариии к каждой строчке) Заранее спаибо....
Вопрос № 117361: Уважаемые эксперты! есть задача по нахождению значения функции: ---------------------------------------------------- Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон. с шагом dX. ax2-...
Вопрос № 117383: Необходимо построить иерархию классов согласно схеме наследования, приведенной в варианте задания. Каждый класс должен содержать минимум одну переменную с доступом типа private и функции-аксессоры ( get, set и show ). Функция main должна ил...
Вопрос № 117384: Помогите написать програмку. Программа случайным образом тасует колоду из 36 карт, раздаёт карты N игрокам, определяет козырную масть и игрока с правом первого хода. Количество игроков N и их имена вводятся с клавиатуры. или привидите алгорит...
Вопрос № 117387: Создать класс с заданными полями : Транспорт (стоимость проезда, количество единиц в парке, рентабельность, название) Создать конструктор без параметров (для начальной инициализации) Создать массив из 5 объектов заданного класса Н...

Вопрос № 117.266
Уважаемые эксперты,
поясните в чем дело:
мне необходимо найти сумму всех элементов 3-х мерного массива.(прога ниже).
Все корректно с точки зрения логики и синтаксиса, но почему-то при количестве элементов большем некоторого значения выдается сообщение "Stack overflow!".Что это означает?Стэк переполнен?Какой стэк? как с этим справиться?

P.S.: компилятор Borland C++ 3.1

Приложение:

Отправлен: 06.01.2008, 21:35
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Maksim Trofimov
Здравствуйте, Warobushek!
Интересный вопрос :)
Переполнение стека происходит здесь: float A[koli][kolj][kolk];, если koli, kolj, kolk заданы большими числами.
float A[koli][kolj][kolk]; - это статический массив и это значит, что память выделяется во время компиляции. Если я задам, например A[500][500][100], то такой массивчик не поместится в стек - он переполняет его. Для этого надо использовать динамический массив: float ***A;, с последующим выделением памяти. Так как это всего лишь указатель на указатель на указатель на тип float, это занимает очень мало места в стеке :)

#include <stdio.h>
typedef unsigned uint16;
// если у Вас много памяти, то можете поставить числа здесь побольше :)
const uint16 koli = 500;
const uint16 kolj = 500;
const uint16 kolk = 100;

double sum(double ***A, uint16 ki, uint16 kj, uint16 kk)
{
uint16 i, j, k;
double res = 0;
for(i = 0; i < ki; i++)
for(j = 0; j < kj; j++)
for(k = 0; k < kk; k++)
res+= A[i][j][k];

return res;
}

int main(void)
{
uint16 i,j,k;
double ***A;

A = (double ***)malloc(koli*sizeof(double **));
for(i = 0; i < koli; i++)
{
A[i] = (double **)malloc(kolj*sizeof(double *));
for(j = 0; j < kolj; j++)
A[i][j] = (double *)malloc(kolk*sizeof(double));
}

double S;

for(i = 0; i < koli; i++)
for(j = 0; j < kolj; j++)
for(k = 0; k < kolk; k++)
A[i][j][k] = 1.0;

S = sum(A, koli, kolj, kolk);

for(j = 0; j < kolj; j++)
{
for(i = 0; i < koli; i++)
free(A[j][i]);
free(A[j]);
}
free(A);

printf("%.0lf", S);
return 0;
}

Ответ отправил: Maksim Trofimov (статус: 4-ый класс)
Ответ отправлен: 07.01.2008, 03:49
Оценка за ответ: 4

Отвечает: Solar
Здравствуйте, Warobushek!

У вас статический массив, поэтому при большом количестве элементов он не влезает в стек.

Справиться с этим можно используя динамический массив (float ***A).
Ответ отправил: Solar (статус: 2-ой класс)
Ответ отправлен: 08.01.2008, 01:16

Отвечает: Титов Михаил Анатольевич
Здравствуйте, Warobushek!

В предыдущих ответах уже разъяснялось о причине переполнения. Использование динамического выделения памяти позволяет решить проблему, но порождает сложную, избыточную структуру данных и требует сложного кодирования. Если принять во внимание механизм выделения памяти компилятором, то возможно будет приемлемым более простое решение, вместо

....
void main()
{
.....
float A[koli][kolj][kolk];
.....
}

используйте

float A[koli][kolj][kolk];
void main()
{
.....
}

или

void main()
{
.....
static float A[koli][kolj][kolk];
.....
}

Суть изменений в следующем. Все переменные объявленные внутри блока {} (в том числе внутри тела функции, а main ровно такая же функция, как и все остальные), являются автоматическими, то есть создаются при входе в блок и уничтожаются при выходе из блока. И все они создаются на СТЕКЕ! Если не вдаваться в несущественные на данный момент детали, то стек - это область памяти ограниченного размера, предназначенная для некоторых специальных целей. В частности для хранения автоматических переменных.
Кроме автоматических можно объявить статические переменные. Постарайтесь разобратся и не путать категории: автоматические - статические переменные и статическое - динамическое распределение памяти. Это разные вещи!
Главное свойство статических переменных в том, что они могут существовать в течении всего времени работы программы. Но нас сейчас интересует другая их особенность - память для них выделятся не в стеке, а в некой другой области. Её часто называют "кучей". Её объем ограничен только физически доступной памятью и операционной системой.
Создать статическую переменную можно двумя путями, как показано выше: 1) объявить переменную вне какого либо блока, 2) при объявлении добавить ключевое слово static.
Ответ отправил: Титов Михаил Анатольевич (статус: 5-ый класс)
Ответ отправлен: 10.01.2008, 06:46
Оценка за ответ: 5
Комментарий оценки:
великолепно!!!)


Вопрос № 117.283
Скажите пожалуйста как сделать так что бы функция Node* descent(Node* p); была определена, т.к. выдает ошибку что он не определена. Спасибо заранее!!!

Приложение:

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

Отвечает: heap11
Здравствуйте, Михеева Ира!
Определитесь с именем функции.

объявлена и используется функция "descept",

а определена "descent".

Скорее всего, первое - опечатка
Ответ отправил: heap11 (статус: 5-ый класс)
Ответ отправлен: 07.01.2008, 00:34
Оценка за ответ: 5


Вопрос № 117.286
Здравствуйте эксперты!
Возник вопрос следующего плана.
Решил попробовать распознать капчу.написал анализатора все хорошо.Решил проверить в боевых условиях.И сразу столкнулся с проблемой.на сайтах многие капчи хранятся не в виде
<img src="chapcha.gif"> как это было раньше, а в виде
img src="./image.php">.Запросы к старнице с капчей я делаю через винапишные функции.InternetOpen и так далее.они позволяют сохнарить в буфер страницу, но в ней нет этой картинки.Так как же получить эту самую картинку?Можно конечно же обратиться к image.php и затем переименовать ее и у меня будет картинка.но она абсолютно не будет связана со страницей.Подскаите как можно это реализовать?
Заранее благодарен.Очень надеюсь на Вашу помощь.
Отправлен: 07.01.2008, 00:43
Вопрос задал: denver (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: физик фрик
Здравствуйте, denver!
я не вполне осознаю реализацию механизма взаимодействия с сервером именно через винАпи, но но сколько я представляю в случае просмотра такой страницы через браузер все должно быть примерно так:

браузер (Б) обращается к серверу (C) : http get index.html
С в ответ ему отправляет именно этот файл (сгенерив его или как по другому)
соотвественно С создает у себя сессию для этого браузера (и убъет ее по таймауту если придется)
дальше Б анализирует html и види там chapcha.gif или image.php и говорит С: get image.php
север видит что клиент тот же и записывает что выдал тото и тото в информацию о сессии.
потом типа человек (али робот ваш) заполняет поле и Б говорит: post capcha_field=123

сервер опять таки по клиенту восстанавливает что это та самая сессия и проверяет капчу.

так что если у вас можно сделать get два раза в одной сессии и post так же то тогда должно все и так работать. (ну в смысле что надо отдельно наверное загрузить image.php сохранить его как картинку, распознать и проверить)

напишите как проблема решиться. интересно вобщемто.
надеюсь помог.
Ответ отправил: физик фрик (статус: 1-ый класс)
Ответ отправлен: 07.01.2008, 02:13


Вопрос № 117.312
Помогите пажлуста решить задачу Текст задачи таков
Дана целочисленная прямоугольная матрица надо опредилить № строки в которой находится самая длинная серия одинаковых элементов
Отправлен: 07.01.2008, 10:24
Вопрос задал: Razum89 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Maksim Trofimov
Здравствуйте, Razum89!

Как-то давно я это делал. Решил я эту задачу своеобразно - использовал сортировку.
Текст программы получился не маленький :)

#include <stdio.h>
#define compGT(a,b) (a > b)
typedef int T; // Тип элемента для сортировки
typedef int tblIndex; // тоже самое сдесь подставить...

// Сортировка включением
void insertSort(T *a, tblIndex lb, tblIndex ub) {
T t;
tblIndex i, j;

for (i = lb + 1; i <= ub; i++) {
t = a[i];

for (j = i-1; j >= lb && compGT(a[j], t); j--)
a[j+1] = a[j];

a[j+1] = t;
}
}

int main(void)
{
// исходная матрица
int arr[3][5] = { {1,1,3,1,3}, {1,0,1,2,2}, {3,3,2,3,3} };
// матрица stat для хранения числа(stat[n][1]) и его
// повторений(stat[n][0]) в соответствующей строке матрицы arr
int stat[3][2] = {0,0, 0,0, 0,0};
unsigned i, j, count = 1;

// сортируем элементы каждой строки матрицы и...
for(i = 0; i < 3; i++)
insertSort(arr[i], 0, 4);
//... выводим матрицу
for(i = 0; i < 3; i++) {
for(j = 0; j < 5; j++)
printf("%d ", arr[i][j]);
puts("");
}
puts("");

// здесь мы перебираем элементы матрицы и
// записываем число повторений какого-то числа
// в stat[n][0], а само число в stat[n][1]
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
if(arr[i][j] == arr[i][j+1])
count++;
else
{
if(stat[i][0] < count)
{
stat[i][0] = count;
count = 1;
stat[i][1] = arr[i][j];
}
}
}
if(stat[i][0] < count) {
stat[i][0] = count;
stat[i][1] = arr[i][j];
}
count = 1;
}
// в полученной матрице stat ищим максимальное
// число повторений и выводим соответствующий этому элемент
for(i = 1, j = stat[count = 0][0]; i < 3; i++)
if(j < stat[i][0]) {
j = stat[i][0];
count = i;
}
printf("Number %d, Column %d ", arr[count][1], count+1);

return 0;
}
Ответ отправил: Maksim Trofimov (статус: 4-ый класс)
Ответ отправлен: 07.01.2008, 12:25
Оценка за ответ: 5

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

Приложение:

Ответ отправил: Терсков Сергей (статус: Практикант)
Ответ отправлен: 09.01.2008, 04:44


Вопрос № 117.321
Здравствуйте, уважаемые эксперты!
Помогите, пожалуйста!
Необходимо отсортировать строчный массив arr по длине содержащихся в нем строк методом обмена ("пузырьковым")... Я вот накатал, только ни фига не работает... Что не так?
Большушее спасибо!

Приложение:

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

Отвечает: Попов А.С.
Здравствуйте, Mangoost!
в приложении исправленный листинг

Приложение:

Ответ отправил: Попов А.С. (статус: 4-ый класс)
Ответ отправлен: 07.01.2008, 13:30

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

В C сравнивать строки операцией < некорректно, вместо этого нужно использовать функцию strcmp (для лексикографического сравнения) или strlen (для сравнения длины строк).
Кроме того, очень неэффективно пользоваться функцией strcpy для обмена строк в массиве, гораздо лучше использовать массив указателей и менять их значения (подробнее в книге Б. Керниган "Язык программирования С" гл 5.6).

Вот рабочий код:

Приложение:

---------
Доступно только то, что видимо (c) Б. Керниган

Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 08.01.2008, 00:47


Вопрос № 117.357
С рождеством вас,уважаемые эксперты. Помогите разобрать что делает эта задача(если не трудно просто подписать коментариии к каждой строчке)
Заранее спаибо.

Приложение:

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

Отвечает: Попов А.С.
Здравствуйте, Pimp!
Коментарии смотрите в приложении
ps Этот код даже компиляцию не пройдет, исправленная версия также в приложении

Приложение:

Ответ отправил: Попов А.С. (статус: 4-ый класс)
Ответ отправлен: 07.01.2008, 17:13

Отвечает: X-men
Здравствуйте, Pimp!
В приложении написана дополненная программа.
Если я правильно понял, она должна в массиве искать элементы, делящиеся на 3 без остатка и выводить среднее арифметическое таких элементов.
Переменные r и b в главной функции не нужны (также, как и параметры функции arifm).

Приложение:

Ответ отправил: X-men (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 17:31


Вопрос № 117.361
Уважаемые эксперты!
есть задача по нахождению значения функции:
----------------------------------------------------
Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Хнач. до Хкон. с шагом dX.

ax2-сх+b при x+10<0 и b≠0
F= (x-a)/(x-c) при x+10>0 и b=0
-x/(a-c) в остальных случаях

где a,b,c – действительные числа.
Функция F должна принимать действительное значение, если выражение (Ац ИЛИ Вц) И НЕ (Ац ИЛИ Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц и Сц обозначены целые части значений a,b,c, операции НЕ, И, ИЛИ – поразрядные. Значения a,b,c, Хнач., Хкон., dX ввести с клавиатуры.
-------------------------------------------------------
Теперь суть проблемы моей:
Если известен диапазон в котором должно быть значение функции F,
пусть он будет |F|Может какую прогу подскажете, в которой подобные рассчеты можно сделать.

P.S. Буду реализовывать это на Си.Вопрос задан еще и в разделы "решение нетривиальных задач" и "алгоритмы".


-----
∙ Отредактировал: Климова Марина Александровна (*Мастер-Эксперт)
∙ Дата редактирования: 07.01.2008, 16:41
Отправлен: 07.01.2008, 16:26
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: X-men
Здравствуйте, Warobushek!
Советую вам поступить следующим образом: взять лист бумаги, расписать на нём все исходные данные, далее рассчитать по имеющимся формулам эту функцию (нарисовать таблицу со всеми значениями функции и с результатами расчетов этой функции), подставить эти исходные данные в вашу программу и, если программа выведет тоже самое, что и написано у вас на листике (см. пункт 1), то программа работает нормально (по крайней мере с такими исходными данными).

Было бы нелишним вычислить ОДЗ функций (особенно это актуально во 2ой и 3ей функции [там где есть деление {на случай, если будет деление на ноль}]).
Для проверки 1-ой и 3-ей формулы попробуйте взять такие исходные данные: x1=-12, х2=-8, а=1, b=2, с=3, dx=1.
Должно получиться примерно следующее:
1. f(-12) = 1*(-12)^2 - 3*(-12) + 2 = 144 + 36 + 2 = 182
2. f(-11) = 1*(-11)^2 - 3*(-11) + 2 = 121 + 33 + 2 = 156
и так далее

Для проверки 2-ой формулы: x1=5, х2=10, а=1, b=0, с=3, dx=1.
Удачи!
Ответ отправил: X-men (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 17:03


Вопрос № 117.383
Необходимо построить иерархию классов согласно схеме наследования, приведенной в варианте задания.
Каждый класс должен содержать минимум одну переменную с доступом типа private и функции-аксессоры ( get, set и show ).
Функция main должна иллюстрировать иерархию наследования.
"Бесплатный

Исправленна ссылка.
-----
∙ Отредактировал: Gh0stik (Академик)
∙ Дата редактирования: 07.01.2008, 21:05

Приложение:

Отправлен: 07.01.2008, 19:31
Вопрос задал: смирнов, александр, олегович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Maksim Trofimov
Здравствуйте, смирнов, александр, олегович!
Не пугайтесь ключевого слова virtual, что ниже в примере. virtual я здесь использовал, чтобы избежать повторений кода, при наследовании классов.

#include <iostream>
class B
{
private:
char data;
public:
char get(void) {
return data;
}
void set(char c) {
data = c;
}
};

class D1: public B
{

};

class D2: virtual private B
{
public:
char get(void) {
return B::get();
}
void set(char c) {
B::set(c);
}
};

class D3: virtual private B
{
public:
char get(void) {
return B::get();
}
};

class D4: private D1
{
public:
char get(void) {
return D1::B::get();
}
void set(char c) {
D1::set(c);
}
};

class D5: public D2, private D3
{
public:
void set(char c) {
D2::set(c);
}
char get(void) {
return D3::get();
}
};

int main(void)
{
using namespace std;

D5 d5;
d5.set('5');
cout << d5.get() << endl;

D4 d4;
d4.set('4');
cout << d4.get() << endl;

cin.get();
return 0;
}
Ответ отправил: Maksim Trofimov (статус: 4-ый класс)
Ответ отправлен: 08.01.2008, 03:19
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо!!!!


Вопрос № 117.384
Помогите написать програмку.
Программа случайным образом тасует колоду из 36 карт, раздаёт карты N игрокам, определяет козырную масть и игрока с правом первого хода. Количество игроков N и их имена вводятся с клавиатуры.
или привидите алгоритм как случайно перемешать массив чисел (int ar[5] = {1,2,3,4,5};)
Спасибо.
Отправлен: 07.01.2008, 19:32
Вопрос задал: Slade (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: X-men
Здравствуйте, Slade!
В приложении - программа, перемешивающая массив чисел.
Запускай в VC++

Приложение:

Ответ отправил: X-men (статус: 3-ий класс)
Ответ отправлен: 07.01.2008, 19:47


Вопрос № 117.387
Создать класс с заданными полями :
Транспорт (стоимость проезда, количество единиц в парке, рентабельность, название)
Создать конструктор без параметров (для начальной инициализации)
Создать массив из 5 объектов заданного класса
Написать функцию для изменения значений полей (с помощью ссылок)
Написать функцию для форматированного вывода всех классов на экран (упорядоченных по первому полю)
Отправлен: 07.01.2008, 20:03
Вопрос задал: смирнов, александр, олегович (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Maksim Trofimov
Здравствуйте, смирнов, александр, олегович!
Бог в помощь.
#include <iostream>

class t_auto
{
private:
unsigned m_cost;
unsigned m_count;
int m_rent;
char *m_name;
public:
// конструктор без параметров
t_auto(void) {
m_cost = 10;
m_count = 50;
m_rent = 79;
m_name = new char[4];
strcpy(m_name, "bus");
}
// деструктор
~t_auto(){
delete[] m_name;
}
// вернуть название
char *name(void) {
return m_name;
}
unsigned cost(void) {
return m_cost;
}
// ...
// установить название
void set_name(const char *s) {
//
}
void set_cost(unsigned cost) {
//
}
void set_rent(int rent) {
//
}
void set_count(unsigned count) {
//
}
};

int main(void)
{
using namespace std;

// массив из 5 объектов типа t_auto
t_auto A[5];

for(unsigned i = 0; i < 5; i++)
cout << "A[" << i << "]: " << A[i].name() << endl << A[i].cost() << " ";

cin.get();
return 0;
}
Ответ отправил: Maksim Trofimov (статус: 4-ый класс)
Ответ отправлен: 08.01.2008, 03:50


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

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

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

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

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

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


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


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

В избранное