Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Открыть новую тему     Написать ответ в эту тему

KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sverhmonstr

Цитата:
Вопрос снимается, проблема была в делении на факториал нуля  

И в чём же была проблема, если факториал нуля - это 1 ?
Или же функция факториала была плохо написана?

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 17:35 01-10-2005
sverhmonstr



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
Была неправильно написана
 
Добавлено:
Ещё вопрос
Необходимо объявить массив с длиной, получаемой в результате работы функции. То есть отдельная функция задаёт целое число, полученное значения является длиной массива в main.  
int main[переменная, полученная из некоторой функции];
Насколько мне известно, в качестве длины массива допускается только константа
Как можно это обойти, без использования динамический массивов? С попощью указателей, каких-нибудь хитростей?

Всего записей: 405 | Зарегистр. 27-01-2002 | Отправлено: 17:41 01-10-2005
aleoizi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Честно говоря не знаю что такое динамический массив, но я делал это так:
 
int f(void)  
{
return 5;
}
 
 
int main()
{
int *masiv = new int [f()];
 
}
 
ну и получается массивчик int masiv[5]
 
Интересная тема кстати, может кто что нибудь поизящнее предложет?

Всего записей: 17 | Зарегистр. 13-07-2005 | Отправлено: 20:41 01-10-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aleoizi

Цитата:
int f(void)  
{
return 5;
}
 
 
int main()
{
int *masiv = new int [f()];
 
}  


а не проще:
int main()
{
    int * masiv = new int [5];
    // и получится динамический массив из 5 елементов.
    // можно и так:
    // int size = 5;
    // int * masiv = new int [size];
    // это для примера, что можно использовать переменные.
}

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 10:47 02-10-2005 | Исправлено: KADABRA, 10:56 02-10-2005
sverhmonstr



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KADABRA
aleoizi
Спасибо, поставленную задачу таким образом выполнил. Хотя не понял до конца принципа работы с динамическими массивами - если дадите ссылку на какую-нибудь статью на эту тему или на топик на форуме, буду премного благодарен :)

Всего записей: 405 | Зарегистр. 27-01-2002 | Отправлено: 12:59 02-10-2005
aleoizi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где я про это читал не помню, помню что оператор new выделяет память в куче (память, которая содержит мусор, неиспользуемые данные), а new[] - соответственно массив.
Операторы delete и delete[] - уничтожают память, выделенную операторами new и new[].
 

Цитата:
Хотя не понял до конца принципа работы с динамическими массивами

А я не понял чего ты не понял
К сожалению ссылок не знаю по теме.  
 
KADABRA
Ну конечно можно и так, просто человек просил показать:

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

 
Удачи.

Всего записей: 17 | Зарегистр. 13-07-2005 | Отправлено: 15:16 02-10-2005
sverhmonstr



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aleoizi
То есть после выделения памяти под динамический массив я должен уничтожить лишнее? Не совсем понял всё-таки :)

Всего записей: 405 | Зарегистр. 27-01-2002 | Отправлено: 21:05 02-10-2005
KADABRA



Великий покусатель
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aleoizi

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

Упс, не заметил. Ну тогда у всё было правильно. Извеняюсь, если сбил с толку.

----------
Это не подпись.

Всего записей: 1718 | Зарегистр. 14-07-2003 | Отправлено: 23:49 02-10-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sverhmonstr
Я бы рекомендовал для начала почитать начальные книги по программированию, т.к. из твоих слов видно, что ты очень плохо понимаешь, что ты хочешь сделать и как примерно это реализовать в коде.
 

Цитата:
То есть после выделения памяти под динамический массив я должен уничтожить лишнее? Не совсем понял всё-таки

Теперь о твоём вопросе. Во-первых, чтобы не было лишнего, надо знать (изначально или вычислять, как у тебя), сколько элементов должно содержаться в массиве. Во-вторых, удалять массив (или динамическую переменную) при помощи delete надо в том случае, если:
а) память под неё выделялась явно (твоими усилиями при помощи оператора new);
б) массив (переменная) больше не нужен.
В-третьих, если тебе вдруг понадобится изменить размерность массива, то потребуется удалить имеющийся и создать новый. Чтобы при этом не потерять данные (ну, вдруг там что-то важное ), надо сначала создать новый массив, затем скопировать в него элементы старого и только потом удалять старый массив.
 
P.S. Рекомендую посмотреть queue и deque из стандартной библиотеки шаблонов (STL), который реализуют динамические массивы. При использовании их тебе не потребуется менять размерность вручную - все делает код шаблона. Хотя, это может быть для тебя рановато.
P.P.S. Если что более конкретно интересует - пиши в ФП, попробую объяснить и помочь.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 07:54 03-10-2005
Jeck



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет. У меня вопрос как в Линуксе указать путь к библиотеке, при копмпиляции выскакивает сообщение что не найден путь(и просит показать где находится эта библиотека).Спасибо.

Всего записей: 402 | Зарегистр. 28-03-2002 | Отправлено: 11:10 05-10-2005
pochti



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как скопировать задачу с одного принтера на другой?
 
Используя функции VC++: AddJob(), CopyFile(), SetJob(),  
была скопирована задача с первого принтера на второй. Второй принтер - копия  
первого. Оба принтера установлены на одном компьютере и имеют одно печатающее устройство  
вывода информации. Настройки задачи (число напечатанных копий, тип документа: альбомный)    
при копировании почему-то не были сохранены. С чем это может быть связано подскажите    
пожалуйста? Либо функции пишу не верно, либо настройки вообще нельзя скопировать?

Всего записей: 232 | Зарегистр. 14-05-2003 | Отправлено: 18:59 06-10-2005
Men_In_Black



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
aleoizi

Цитата:
Интересная тема кстати, может кто что нибудь поизящнее предложет?


Код:
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
void main()
{
    vector<int> array;
 
    array.push_back(1);
    array.push_back(2);
    array.push_back(3);
    array.push_back(4);
    array.push_back(5);
 
    copy(array.begin(), array.end(), ostream_iterator<int>(cout, "\r\n"));
}

Вся прелесть в том, что можно похожим способом сделать так:

Код:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
void main()
{
    vector<string> array;
 
    array.push_back("one");
    array.push_back("two");
    array.push_back("three");
    array.push_back("for");
    array.push_back("five");
 
    copy(array.begin(), array.end(), ostream_iterator<string>(cout, "\r\n"));
}
 

Или даже так:

Код:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
class Employee
{
    string _name;
    string _address;
 
public:
    Employee(const string& name, const string& address) :
      _name(name), _address(address) {}
    operator string() const
    {
        return  "Employee name: " + _name + "\r\n" +
                   "Employee address: " + _address + "\r\n";
    }
};
 
void main()
{
    vector<Employee> array;
 
    array.push_back(Employee("John Smith", "7-th Avenue"));
    array.push_back(Employee("George Bush", "White House"));
    array.push_back(Employee("Bill Gates", "Microsoft Way"));
 
    copy(array.begin(), array.end(), ostream_iterator<string>(cout, "\r\n"));
}

Или что-то вроде...

Код:
#include <vector>
#include <algorithm>
 
using namespace std;
 
class Picture
{
...
public:
    Picture (const char *path)
    {
        ...
    }
};
 
void DrawPicture(const Picture& picture)
{
    ...
}
 
void main()
{
    vector<Picture> array;
 
    array.push_back(Picture("C:\\мышка.jpg"));
    array.push_back(Picture("C:\\слоник.jpg"));
    array.push_back(Picture("C:\\гиппопотамчик.jpg"));
 
    for_each(array.begin(), array.end(), DrawPicture);
}

 

Всего записей: 96 | Зарегистр. 27-08-2003 | Отправлено: 05:04 07-10-2005 | Исправлено: Men_In_Black, 05:57 07-10-2005
aleoizi

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Даа, чуствую что за STL надо взяться посерьезнее

Всего записей: 17 | Зарегистр. 13-07-2005 | Отправлено: 15:30 08-10-2005
sket4



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jeck
#include "/path/to/your/file.h"
либо уже в гцц указывать.

Всего записей: 712 | Зарегистр. 07-05-2004 | Отправлено: 19:23 21-10-2005
wiwiw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Код:

Код:
 
#include <vector>  
#include <algorithm>  
 
using namespace std;  
 
class Picture  
{  
...  
public:  
    Picture (const char *path)  
    {  
        ...  
    }  
};  
 
void DrawPicture(const Picture& picture)  
{  
    ...  
}  
 
void main()  
{  
    vector<Picture> array;  
 
    array.push_back(Picture("C:\\мышка.jpg"));  
    array.push_back(Picture("C:\\слоник.jpg"));  
    array.push_back(Picture("C:\\гиппопотамчик.jpg"));  
 
    for_each(array.begin(), array.end(), DrawPicture);  
}     
 

 

Men_In_Black
почему бы DrawPicture не сделать членом класса Picture?

Всего записей: 127 | Зарегистр. 20-03-2004 | Отправлено: 06:17 22-10-2005
WWWovan



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Люди, не пинайте сильно за вопрос.
Можно ли создать масив элементов класса?
Если можно то как?
Как потом к ним обращаться?
Как добавлять новый элемент в это масив?

----------
Не несу ответственность за случайно допущенные орфографические ошибки.

Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 14:18 28-10-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WWWovan

Цитата:
Можно ли создать масив элементов класса?  

 штатными средствами - нет
Если массив экземпляров класса, то:
да

Цитата:
Если можно то как?

как обычный массив

Цитата:
Как потом к ним обращаться?  

как обычно
 

Код:
 
//описываем класс
class A{
public:
.....
}
//создаем массив
A a_array[10];
//обращение
a[1].ЧленКласса;
 


Цитата:
Как добавлять новый элемент в это масив?

как обычно. для автоматического массива - никак, для динамического путем нового new и delete
для создания массива рекомендуется использовать std::vector
 
 

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 14:57 28-10-2005 | Исправлено: WiseAlex, 15:00 28-10-2005
WWWovan



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
WiseAlex
Если можно немного подробнее о динамических масивах обьектов...
Или ссылочку где можно почитать об этом...
 
Добавлено:
И еще... Вы пишете, что добавление новых элементов динамического массива осуществляеться через new.  
Он добавляеться к предиущим элементам масива?
Как определить количество элементов такого массива(команда)?

----------
Не несу ответственность за случайно допущенные орфографические ошибки.

Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 15:00 28-10-2005 | Исправлено: WWWovan, 15:04 28-10-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WWWovan

Цитата:
Если можно немного подробнее о динамических масивах обьектов...  

лучше использовать std::vector, но если хочется самому, принцип такой
храним размер массива и указатель на него. Первоначально выделяем как обычно т.е. new A[n];
добавление: new A[n+1] - затем копируем все n элементов в новый массив, и копируем новый элемент в n+1 элемент. далее удаляем предыдущий массив и присваиваем указателю на массив указатель на новый массив, изменяем текущее значение размера на size+1
все. (это без дополнительной буферизации, но суть такая в любом случае)

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 16:18 28-10-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если элементов требуется хранить ОЧЕНЬ много (общий расход памяти сравним с имеющейся в системе), то надо применять динамическую связку элементов массива, потому как может не хватить памяти при создании массива [size+1]. Скорось упадёт, зато больше влезет.
Правда, лучше, чем std:: (тот же вектор или же очередь, которую я предпочитаю вектору) написать будет непросто.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 12:40 01-11-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru