Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
81
Добавлен:
07.03.2016
Размер:
3 Мб
Скачать
☆

Int shift; /*відступ*/

/*Читати зі стандартного введення в rd по одному рядку,

* доки файл не закінчиться.*/

while(gets(rd) !=NULL){

if(!*rd){

/*Рядок порожній*/

putchar('\n'); continue;

}

/*пропуск пропусків на початку рядка*/

for(s=rd; *s==' '; s++);

if(! *s){

/*Рядок складається лише з пропусків*/

putchar('\n'); continue;

}

head=s;

/*стати на кінець рядка*/

while(*s) s++;

/*шукати останній непропуск*/

s--;

while(*s==' ' && s !=rd) s--;

tail=s;

/*Довжина тексту*/ len=(tail-head)+1;

/*різниця покажчиків – ціле число*/

shift=(WIDTH–len)/2;

if(shift<0){

fprintf(stderr, "Рядок довший ніж %d\n", WIDTH);

shift=0;

}

/*Друк результату*/

for(i=0; i<shift; i++) putchar(' ');

while(head<=tail) putchar(*head++);

putchar('\n');

}

}

7. Задача про розмін монети. Знайдемо всі можливі коефіцієнти a0...an розкладання числа S у вигляді S=a0*c0+a1*c1+... +an*cn, де c0...cn задані та впорядковані, ai>=0, ci>=0.

#include <stdio.h>

/*Тут задаємо вартості розмінних монет*/

int cost[]={

1, 2, 3, 5, 10, 15, 20, 50, 100, 300, 500 /*копійок*/

};

#define N (sizeof cost/sizeof(int))

Int count[n]; /*кількість монет даного типу (коефіцієнти ai)*/

long nvar; /*кількість варіантів*/

main(ac, av)

char *av[];

{

Int coin;

if(ac==1){

fprintf(stderr, "Укажіть, яку монету розмінювати: %s число\n",

av[0]);

exit(1);

}

coin=atoi(av[1]);

printf("Таблиця розмінів монети %d к.\n", coin);

printf("Кожний стовпчик містить кількість монет указаної вартості. \n");

printf("----------------------------------------------------\n");

printf("|5р.|3р.|1р.|50к.|20к.|15к.|10к.|5к.|3к.|2к.|1к.|\n");

printf("----------------------------------------------------\n");

change(N-1, coin);

printf("----------------------------------------------------\n");

printf("Усього %ld варіантів\n", nvar);

}

/*рекурсивний розмін*/

change(maxcoin, sum)

Int sum; /*монета, яку міняємо*/

Int maxcoin; /*індекс по масиву cost[] монети максимальної вартості, допустимої при даному розміні.*/

{

register i;

if(sum==0){/*уся сума розміняна*/

/*роздрукувати черговий варіант*/

putchar('|');

for(i=N-1; i>=0;i--)

If(count[I])

printf("%3d |", count[i]);

else

printf("|");

putchar('\n');

nvar++;

return;

}

if(sum>=cost [maxcoin]){

/*якщо можна видати монету вартістю cost[maxcoin], то відати її:*/

count[maxcoin]++; /*порахували видану монету*/

/*розмінюємо залишок суми:

Перший аргумент – можливо, можна дати ще одну таку монету?

Другий аргумент – загальна сума зменшилась на одну монету cost[maxcoin].*/

change(maxcoin, sum – cost[maxcoin]);

count[maxcoin] --; /*... Тепер спробуємо інший варіант...*/

}

/*спробувати розмін дрібнішими монетами*/

If(maxcoin)

change(maxcoin-1, sum);

}

8. Множення n-вимірних матриць. Розглянемо способи зображення множення багатовимірних матриць і визначення їх добутку. Відоме множення звичайних прямокутних чи квадратних матриць за правилом "рядок на стовпчик". Звернемося до тривимірних матриць А та B, елементи яких можна записати у тривимірні масиви. Розглядаючи процес множення за аналогією з двовимірними матрицями, можемо зобразити тривимірну матрицю А як вектор-стовпчик двовимірних:

A ;B .

Аналогічно матрицю B можна уявити як вектор-рядок двовимірних матриць. Тоді результатом множення є конструкція

C  , , де.

Тут є звичайним множенням квадратних матриць і, отже, двовимірною матрицею. З погляду зображення даних результат множення тривимірних матриць є чотиривимірною матрицею та зображується чотиривимірним масивом. За рекурсією можемо визначити добуток довільнихn-вимірних матриць A та B, розглядаючи їх відповідно як вектор-стовпчик і вектор-рядок n-1-вимірних матриць:

СA*B, C  , ,

(–n-1-вимірні матриці). Тоді добутком n-вимірних матриць буде n  2-вимірна матриця (n   4).

Виходячи зі способу розміщення в пам'яті n-вимірних масивів у С, дотримуватимемося такої самої домовленості, записуючи n-вимірні масиви в динамічному одновимірному. При цьому вважатимемо, що для довільної n-вимірної матриці А, яка зображується як вектор-стовпчик n-1-вимірних матриць A1, A2, … An,

A,

у пам'яті послідовно записуються матриці A1, A2, … An.

Для реалізації відповідної рекурсивної функції нам зручно було б мати матрицю B, у якої б матриці B1, B2, …, Bn були розміщені в послідовних блоках пам'яті. Цього можна досягти, послідовно записуючи в одновимірний масив елементи вихідної матриці з кроком n. Спочатку записуємо 1-й елемент, потім n-й, 2n-й, 3n-й,…, потім 2-й, 2  n-й, 2  2n-й,... Цю процедуру реалізуємо у функції:

ctranspon (int *a,int n,int m)::

long pow(long n,int m)

{int i;

for(i=0;i<m-1;i++)

n*=n;

return n;

}

/*часткове транспонування n-вимірної матриці*/

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]