Материалы по структ. и алг. комп. обр. дан.
| |
Leds | Дата: Пятница, 09.01.2009, 02:36 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 129
Статус: Offline
| Скачать
Jabber: leds.89@gmail.com
|
|
| |
ldo2 | Дата: Пятница, 09.01.2009, 02:37 | Сообщение # 2 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Вот код домашнего задания "Круговой турнир по теннису", правда он мегакорявый. Программа принимает на вход число n и выводит таблицу турнира для 2^n игроков. Quote (Code) #include <stdio.h> #include <stdlib.h> int length; int **a; void createArray(int h, int w){ int i; a = (int**) malloc(h*sizeof(int*)); if(a == NULL){ fprintf(stderr, "out of memory"); exit(1); } length = h; for(i = 0; i < h; i++){ a[i] = (int*) malloc(w*sizeof(int)); if(a[i] == NULL){ fprintf(stderr, "out of memory"); exit(1); } } } void destroyArray(){ int i; for(i = 0; i < length; i++){ free(a[i]); } free(a); } void copyAdd(int fi, int fj, int ti, int tj, int h, int w, int add){ int i; int j; for(i = 0; i < h; i++){ for(j = 0; j < w; j++){ a[ti+i][tj+j] = a[fi+i][fj+j]+add; } } } void createPermutation(int si, int sj, int len, int add, int d){ int i; int j; for(i = 0; i < len; i++){ a[si+i][sj] = add+i; } for(j = 1; j < len; j++){ for(i = 0; i < len; i++){ a[si+i][sj+j] = a[si+(i+len+d)%len][sj+j-1]; } } } int **createTable(int n){ if(n < 1){ fprintf(stderr, "call function createTable() negative argument n = %d", n); exit(1); } int m; int k; k = 1 << n; createArray(k, k-1); a[0][0] = 2; a[1][0] = 1; for(m = 1; m < n; m++){ k = 1<<m; copyAdd(0, 0, k, 0, k, k-1, k); createPermutation(0, k-1, k, k+1, 1); createPermutation(k, k-1, k, 1, -1); } return a; } void printTable(int n){ int i; int j; int k; k = 1 << n; for(i = 0; i < k; i++){ for(j = 0; j < (k-1); j++){ printf("%d ", a[i][j]); } printf("\n"); } } int main(int argc, char **argv){ int n; scanf("%d", &n); createTable(n); printTable(n); destroyArray(); return 0; }
Code #include <stdio.h> #include <stdlib.h>
int length; int **a;
void createArray(int h, int w){ int i; a = (int**) malloc(h*sizeof(int*)); if(a == NULL){ fprintf(stderr, "out of memory"); exit(1); } length = h; for(i = 0; i < h; i++){ a[i] = (int*) malloc(w*sizeof(int)); if(a[i] == NULL){ fprintf(stderr, "out of memory"); exit(1); } } }
void destroyArray(){ int i; for(i = 0; i < length; i++){ free(a[i]); } free(a); }
void copyAdd(int fi, int fj, int ti, int tj, int h, int w, int add){ int i; int j; for(i = 0; i < h; i++){ for(j = 0; j < w; j++){ a[ti+i][tj+j] = a[fi+i][fj+j]+add; } } }
void createPermutation(int si, int sj, int len, int add, int d){ int i; int j; for(i = 0; i < len; i++){ a[si+i][sj] = add+i; } for(j = 1; j < len; j++){ for(i = 0; i < len; i++){ a[si+i][sj+j] = a[si+(i+len+d)%len][sj+j-1]; } } }
int **createTable(int n){ if(n < 1){ fprintf(stderr, "call function createTable() negative argument n = %d", n); exit(1); } int m; int k; k = 1 << n; createArray(k, k-1); a[0][0] = 2; a[1][0] = 1; for(m = 1; m < n; m++){ k = 1<<m; copyAdd(0, 0, k, 0, k, k-1, k); createPermutation(0, k-1, k, k+1, 1); createPermutation(k, k-1, k, 1, -1); } return a;
}
void printTable(int n){ int i; int j; int k; k = 1 << n; for(i = 0; i < k; i++){ for(j = 0; j < (k-1); j++){ printf("%d ", a[i][j]); } printf("\n"); } }
int main(int argc, char **argv){ int n; scanf("%d", &n); createTable(n); printTable(n); destroyArray(); return 0; }
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
ldo2 | Дата: Пятница, 09.01.2009, 02:37 | Сообщение # 3 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Двойной поиск тут у меня есть какой-то бред, если он будет Вам полезен, то значит это было написано не зря Code #include <stdlib.h> #include <stdio.h> #include <string.h>
int binary_search(int x, int length, int *array){ int i, j, k;
if(length <= 0 || x < array[0]){ return -1; } if(length <= 1 || array[length-1] <= x){ return length; }
i = 0; j = length-1; while(i != (j-1)){ k = (i+j)/2; if(array[k] <= x){ i = k; }else{ j = k; } } return i; }
int *selection_sort(int length, int*array){ int i, j, pointer; int tmp; for(i = 0; i < (length-1); i++){ pointer = i; for(j = i+1; j < length; j++){ if(array[pointer] > array[j]){ pointer = j; } } tmp = array[i]; array[i] = array[pointer]; array[pointer] = tmp; }
return array; }
int *input_array(int length, int *array){ int i; int elem; int tmp; for(i = 0; i < length; i++){ tmp = scanf("%d", &elem); if(tmp <= 0 || tmp == EOF){ fprintf(stderr, "error: can't read array's elements \n"); return NULL; } array[i] = elem; } return array; }
int n; int *a; int num; int haveNumValue;
void print_help(void){ printf("Usage: PROGRAMM_NAME [-k ELEMENT] -l ARRAY_SIZE \n"); printf("Then input array's elements (integer numbers). \n"); printf("Programm find ELEMENT index in array. \n"); printf("You can also input ELEMENT after inputing the array's elements. \n"); printf("\n Attention! Programm work with sorted arrays (like [1, 2, 5, 8, 8, 34]). You can input non-sorted array and programm sort it before start element searching. \n"); printf("Specification: R = ((i = −1 ∧ x < b[0]) ∨ (0 <= i < n − 1 ∧ b[i] x < b[i + 1]) ∨ (i = n ∧ b[n − 1] x)) \n"); exit(0); }
void try_input_num(void){ int status; status = scanf("%d", &num); haveNumValue = !(status <= 0 || status == EOF); }
void process_keys(int argc, char **argv){ int i; for(i = 0; i < argc; i++){ if(strcmp(argv[i], "-k") == 0 && i < (argc-1)){ printf("-k"); num = atoi(argv[i+1]); haveNumValue = 1; } else if(strcmp(argv[i], "-l") == 0 && i < (argc-1)){ n = atoi(argv[i+1]); } else if(strcmp(argv[i], "--help") == 0){ print_help(); } } }
int main(int argc, char **argv){ n = 0; num = 0; haveNumValue = 0;
process_keys(argc, argv); a = (int*)malloc(n*sizeof(int));
a = input_array(n, a); a = selection_sort(n, a);
if(!haveNumValue){ try_input_num(); } while(haveNumValue){ printf("element %d have index %d in the array \n", num, binary_search(num, n, a)); try_input_num(); }
free(a); return 0; }
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
маргота | Дата: Пятница, 09.01.2009, 02:37 | Сообщение # 4 |
 Рядовой
Группа: 61
Сообщений: 25
Статус: Offline
| http://msiu-prog.ifolder.ru/8922947 -дала белова, там есть решения к некоторым задачам по динамическому программированию...думаю...она еще актуальна...по крайней мере нашей группе)
|
|
| |
ldo2 | Дата: Пятница, 09.01.2009, 02:37 | Сообщение # 5 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Привожу алгоритм разделения 2-3-4 B-деревьев (t = 2), правда я не уверен что он правильный, так что жду Ваших замечаний. Разделение 2-3-4 B-дерева. Функция принимает корень дерева S (x) и ключ k, а возвращает S' и S''. - Случай 1. (терминатор1 - постригатель листвы)
Если ключ k находится в узле x и x является листом. (i - индекс k) Создаем узел s2, устанавливаем его поля (leaf[s2] = TRUE, h[s2] = 1(высота поддерева), n[s2] = n[x]-i(кол-во ключей больше k)), копируем в s2 ключи больше k; затем устанавливаем поле узла x n[x] = i-1(кол-во ключей меньше k). Вернуть x как S' и s2 как S''. - Случай 2. (терминатор2 - финальное рубление)
Если ключ k находится в узле x и x является внутренним узлом. (i - индекс k) - A)Если n[x]-i(кол-во ключей больше k) равно нулю, то s2 = c_{n[x]+1}[x],
иначе создаем s2 c полями (leaf[s2] = FALSE, h[s2] = h[x], n[s2] = n[x]-i) и скопировать в s2 ключи больше k из узла x, и указатели на узлы c_{i+1}[x] .. c_{n[x]+1}[x] соответственно. - B)Если i-1(кол-во ключей меньше k) равно нулю, то x = c_{1}[x],
иначе присвоить n[x] = i-1 (кол-во ключей меньше k). - C)Вернуть x как S' и s2 как S''.
- Случай 3. (процессор - обстругивание сучков)
Если ключ k отсутствует во внутреннем узле x, находим корень c_{i}[x] поддерева, которое должно содержать k. - A)Выполнить рекурсивное разделение поддерева c_{i}[x] по ключу k,
получить деревья разделения S' и S''. - B)Если n[x]-i+1(кол-во ключей больше k) равно нулю,
то перейти к пункту (C); если n[x]-i+1(кол-во ключей больше k) равно 1, то то s2 = c_{n[x]+1}[x], а k'2 = key_{n[x]}[x]; иначе создаем s2 c полями (leaf[s2] = FALSE, h[s2] = h[x], n[s2] = n[x]-i) и скопировать в s2 ключи key_{i+1}[x] .. key_{n[x]}[x], и указатели на соответствующие узлы (c_{i+1}[x] .. c_{n[x]+1}), а k'2 = key_{i}[x]. Объединить деревья с большими ключами через k'2: S'' = (join(S'', k'2, s2)). - C)(симметричные действия для x)
Если i-1(кол-во ключей меньше k) равно нулю, то перейти к пункту (D); если i-1(кол-во ключей меньше k) равно 1, то то s2 = c_{1}[x], а k'1 = key_{1}[x]; иначе присвоить n[x] = i-2 и k'1 = key_{i-1}[x]. Объединить деревья с меньшими ключами через k'1: S' = (join(x, k'1, S')). - D)Вернуть S' и S''.
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Chuvaver | Дата: Пятница, 09.01.2009, 02:37 | Сообщение # 6 |
 Сержант
Группа: 11
Сообщений: 54
Статус: Offline
| May be, it's false... [коллоквиум]
Собираю монеты! Приму в дар, все что не жалко!!!
|
|
| |
маргота | Дата: Суббота, 10.01.2009, 15:30 | Сообщение # 7 |
 Рядовой
Группа: 61
Сообщений: 25
Статус: Offline
| http://msiu-prog.ifolder.ru/9958707 -надеюсь кому то поможет)
|
|
| |
|