|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как выяснить размер числового массива? |
|
C/C++ - Как выяснить размер числового массива?
|
Ветеран Сообщения: 1404 |
Профиль | Отправить PM | Цитировать
Тип int
Ограничения: 1. Не используя глобальных переменных. 2. Вернуть из функции размер нельзя, т.к возвращается указатель на массив Память под массив выделена динамически внутри функции. Как выяснить размер массива за пределами функции? И еще один вопрос: как грамотно добавить еще один элемент в конец массива, сохранив все предыдущие. Я копирую, возможно ли это сделать эффективнее? int* sum(int* n1,int sz1,int* n2,int sz2) { int* result; int cnt_of_result; int sz_of_result = max(sz1,sz2); int tmp,vu,i,mn,cmp; result = new int[sz_of_result]; cnt_of_result = 0; vu = 0; mn=min(sz1,sz2); cmp=compare(n1,sz1,n2,sz2); for (i=0;i < sz_of_result;i++) { if (i < mn) tmp = n1[i]+n2[i]+vu; else { if (cmp==1) tmp = n1[i]+vu; else if (cmp==2) tmp = n2[i]+vu; } if(tmp>=1000) { tmp-=1000; vu = 1; } else vu = 0; result[cnt_of_result]=tmp; cnt_of_result++; } if (vu != 0) { int* cp; cp = new int[sz_of_result+1]; for (i=0;i<sz_of_result;i++) cp[i]=result[i]; cp[cnt_of_result]=vu; print(cp,sz_of_result+1); return(cp); } print(result,sz_of_result); return (result); } |
|
Отправлено: 13:10, 14-12-2008 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать скажу честно, код не смотрел. Но подскажу идею, куда копать (С++). Используй частичную сортировку. Код приведён скорее для демонстрации различных фичей стандартной библиотеки, чем шаблона partial_sort. Рабочий, проверял.
#include <iostream> #include <vector> #include <iterator> #include <algorithm> #include <string> using namespace std; //------------------------------------ int main() { // расположив строчку и вектор здесь, мы позволяем программе реже // обращаться в менеджеру памяти, потому что эти контейнеры постепенно // захватывают память по мере надобности и держат её на всякий случай. // освободить её можно либо уничтожив контейнер, либо выполнив хитрую операцию: // word_end.swap(string()); // values.swap(vector<int>()); string word_end; unsigned sort_limit = 0; vector<int> values; for (bool working=true; working;) { cout << "\nEnter values separated with spaces and \"end\" at the end:\n"; // ввод данных copy(istream_iterator<int,char>(cin), istream_iterator<int,char>(), back_inserter(values)); // слово end - не целое число, поэтому поток будет помечен как ios::failbit if (!cin.eof() && !values.empty()) { // снимаем эту пометку, проверяем что ввели хотя бы один элемент cin.clear(ios::goodbit); // убедились что именно слово end на конце, сняли слово из потока if ((cin >> word_end) && word_end=="end") { // ввод и проверка границ для sort_limit // помним, что в си нумерация идёт с нуля, и что -1 = 0xffffffff для unsigned int while ((cout << "Enter sort limit: ") && (cin >> sort_limit) && (values.size() <= (sort_limit - 1))) { cout << "an unsigned integer value between 1 and " << values.size() << " expected\n"; } // если удалось прочитать sort_limit и пройти цикл проверки диапазона if (cin.good()) { // делаем частичную сортировку vector<int>::iterator middle(values.begin() + sort_limit); partial_sort(values.begin(), middle, values.end()); // вывод результата cout << sort_limit << "-th value is: " << *(middle - 1) << "\n"; // для отладки - можно закомментировать, // а можно и посмотреть, как работает partial_sort cout << "debug: "; copy(values.begin(), values.end(), ostream_iterator<int,char>(cout," ")); cout << "\n"; } else { // не ввели sort_limit cout << "input aborted\n"; } } else { // пустой список или слово не end (например exit) cout << "program aborted\n"; working = false; } values.clear(); } else { // нет слова end в потоке - поток кончился. cout << "unexpected end of input; program aborted\n"; working = false; } } return 0; } //------------------------------------ |
Отправлено: 23:14, 19-12-2008 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Как присвоить элементы массива в "перетасованном" виде другому массиву? | evg64 | AutoIt | 3 | 27-09-2009 14:09 | |
Как передать в javascript данные массива, полученного из кода на php | vagner_HATE | Вебмастеру | 1 | 18-06-2009 13:51 | |
Как просмотреть винт, вытащенный из Raid массива? | evash | Непонятные проблемы с Железом | 11 | 06-02-2009 09:50 | |
Мой комп шпионят (скрины, keylog). Как выяснить? | GEugene | Защита компьютерных систем | 8 | 02-12-2007 06:08 | |
Сетевые диски как часть единого массива данных | Urutseg | Сетевые технологии | 9 | 22-03-2006 17:08 |
|