|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » нужны задания практические по С |
|
нужны задания практические по С
|
Старожил Сообщения: 229 |
Профиль | Отправить PM | Цитировать
вспоминаю и изучаю дальше - С, самостоятельно. Дайте какие нибудь задания пожалуйста, а лучше несколько по возрастающей (по сложности) . Или посоветуйте где можно эти задания найти 8) Уровень начинающего.
|
|
Отправлено: 18:05, 17-11-2006 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать bool
Цитата:
В дополнение к ответу pva - если массив состоит из данных POD-типа, имеет небольшой размер и его время жизни привязано к области видимости функции (т.к. по выходу из функции он должен быть убит), то можно воспользоваться функцией alloca. Так сказать, pure-C way. |
|
------- Отправлено: 00:23, 27-02-2007 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 229
|
Профиль | Отправить PM | Цитировать а турбо С поддерживает С99? у меня почему то ошибку в синтаксисе показывает, может удобнее учиться на чем нибудь другом? что посоветуете? борланд 6 ?
|
Отправлено: 10:48, 28-02-2007 | #12 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать если уж билдер 6, то это достаточно продвинутый компилятор, чтобы использовать шаблоны с++. Есть например такой: vector<typename T>
#include <vector> #include <fstream> using namespace std; void myFunc() { vector<double> fdoubles(100, 0.); // создан объект std::vector<double>, // представляющий собой обычный массив из 100 элементов // и инициализирован значением 0.0 // объект будет уничтожен автоматически при выходе из блока // для работы с памятью используется класс std::allocator<double>. // тот, который по умолчанию использует операторы new и delete[], // но можно их переопределить (но лучше не трогать, если нет острой необходимости) // работаем как с обычным массивом: fdoubles[0] = 3.14; fdoubles[1] = 123.23; // если нужна проверка границ: fdoubles.at(0) = 3.14; fdoubles.at(101) = 123.23; // здесь вылетит с исключением std::out_of_range // меняем размер, если надо, память перераспределяется автоматически // но так, что если просишь меньше, то не освобождается, а просто берётся меньше // из уже выделенного куска. Например: fdoubles.resize(50); // используется кусок из 100*sizeof(double) fdoubles.resize(200); // используется кусок из 200*sizeof(double) } vector<double> readData() { // работа с памятью оптимизирована для добавления небольших объектов. // то есть это идеальный класс для использования в качестве буфера чтения (небольших объектов) // и использования индексации. ifstream input("my_data.txt"); double buf; vector<double> result; while(input>>buf) result.push_back(buf); return result; } // TList в делфи - это аналог vector<void*> |
Отправлено: 22:26, 28-02-2007 | #13 |
Старожил Сообщения: 229
|
Профиль | Отправить PM | Цитировать pva
спасибо, но я попытаюсь освоить сначала всю функциональность С без С++. Пишу программку определения определителя матрицы и у меня такой вопрос возник: правильно ли будет объявлять в цикле главной функции массив? Ведь при каждой итерации цикла будет создаваться новый массив, или он будет заменяться старым? допустим вот такая ситуация: pm=--pm; /* pm изначально определена, например pm=5 */ for(бла бла бла) { бла бла бла int f[pm][pm]; /* вот здесь */ бла бла } или лучше в цикл включить функцию объявленную заранее в которой будет этот массив объявляться и по её завершению удаляться, а потом при след. итеррации создаваться вновь? |
Отправлено: 16:38, 04-03-2007 | #14 |
Старожил Сообщения: 229
|
Профиль | Отправить PM | Цитировать что то я затормозился на этом определителе. использую рекурсивную функцию для определения.
finder(int *a) { register int k; int answer; if(a[k][k]) if(k==2) answer = a[k-1][k-1]* a[k][k]-a[k-1][k] * a[k][k-1]; answer = (-1)^(k+1) * a[1][k] * finder(a[k-1][k-1]); return(answer); } все остальное: подскажите пжлст |
Последний раз редактировалось bool, 04-03-2007 в 20:44. Отправлено: 20:38, 04-03-2007 | #15 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать если действовать рекурсивно, то надо каждый раз делать копии подматриц (потому что по сути при выбрасывании столбца и строки метрица меняется). Но можно выбрасывать только индексы.
// приучайте мышление к универсальным алгоритмам - шаг к С++ typedef int value_type; typedef unsigned size_type; value_type internal_det(value_type const** rows, size_type* cols, size_type size) { value_type result; // rows - это указатели на строчки (с пропусками) // cols - индексы столбцов (тоже с пропусками) // чтобы взять элемент i, j такой матрицы, нужно: // elem = rows[i][cols[j]]; if (2<size) { size_type size_less = size-1; value_type** rows_less = new value_type*[size_less]; size_type* cols_less = new size_type[size_less]; // собираем матрицу с выброшенным первым столбцом (и строчкой): for(size_type i=1; i<size; ++i) rows_less[i-1] = rows[i]; for(size_type j=1; j<size; ++j) cols_less[j-1] = cols[j]; // собираем поочереди: for(size_type i=0; i<size_less; ++i, rows_less[i]=rows[i]) { for(size_type j=0; j<size_less; ++j, cols_less[i]=cols[i]) { // я точно не помню формулу, но суть в следующем: // получаем определитель матрицы с выброшенным элементом value_type det1 = internal_det(rows_less, cols_less, size_less); ... } } delete [] cols_less; delete [] rows_less; } else { // матрица 2x2 result = rows[0][cols[0]] + rows[1][cols[1]] - rows[0][cols[1]] - rows[1][cols[0]]; } return result; } value_type det(value_type* matrix, size_type n) { value_type** rows = new value_type*[n]; size_type* cols = new size_type[n]; for(size_type i=0; i<n; ++i) rows[i] = matrix + n*i; for(size_type i=0; i<n; ++i) cols[i] = i; return internal_det(rows, cols, n); } |
Отправлено: 21:49, 04-03-2007 | #16 |
Новый участник Сообщения: 34
|
Профиль | Отправить PM | Цитировать Нужны задания?
Напиши марио, змейку, в общем какую-нибудь простенькую игру. |
Отправлено: 10:56, 05-03-2007 | #17 |
Старожил Сообщения: 229
|
Профиль | Отправить PM | Цитировать pva
огромное thx 8) сейчас переварю это (с новыми типами) допишу с формулой и перейду к структурам ferrum2688 на С? я до такого уровня ещё не дошел, чтобы игры на нем писать, я даже не представляю как графический интерфейс на С стряпать )) |
Отправлено: 11:26, 05-03-2007 | #18 |
Новый участник Сообщения: 34
|
Профиль | Отправить PM | Цитировать Цитата:
В принципе достаточно только gotoxy(int x,int y) и cprintf("*"); , для очистки cprintf(" "), думаю этого достаточно для графики, есть конечно ещё и др. функции(clrscr();-очистка всего экрана), но написать можно и без них. Для того чтоб понять программирование можно писать с ограниченным числом функций, нужно подумать возможно ли на основании твоих знаний решить данную задачу, а большинство придуманных функций для ускорения процесса создания и можно обойтись без них. Например возведение в степень(целую), извлечение корней(целых) можно сделать из:+,-,*,for,if. |
|
Последний раз редактировалось ferrum2688, 07-03-2007 в 11:07. Отправлено: 15:32, 06-03-2007 | #19 |
Старожил Сообщения: 229
|
Профиль | Отправить PM | Цитировать Цитата:
|
|
Отправлено: 16:22, 15-03-2007 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Ошибка - Двойные задания печати. | rezzyurfak | Microsoft Windows 2000/XP | 0 | 28-09-2009 14:53 | |
Fujifilm FinePix F100fd Практические советы и рекомендации! | UADE | Цифровое изображение | 9 | 07-09-2009 10:39 | |
Новые задания | Veter23 | Лечение систем от вредоносных программ | 8 | 17-07-2009 21:30 | |
Прочее - Беспроводной интернет. Практические вопросы. | Murder7 | Сетевое оборудование | 4 | 07-11-2008 08:36 | |
Назаначенные задания - Безопасность | Chuk | Microsoft Windows 2000/XP | 3 | 19-10-2005 14:13 |
|