C++ CSS HTML Java JavaScript MySQL Oracle PERL PHP SQL Unix VBScript XHTML XML Сети
Пример 1. Размен монет.
 

Примеры.

В данном приложении приводится несколько содержательных и достаточно больших примеров, которые иллюстрируют как сам язык Си, так и некоторые возможности системы UNIX из других книг, но дополнены и исправлены. Все примеры проверены в действии. Смысл некоторых функций в примерах может оказаться вам неизвестен; однако в силу того, что данная книга не является учебником, мы отсылаем вас за подробностями к "Оперативному руководству" (man) по операционной системе UNIX и к документации по системе.

пакеты ("Ada", "CLU"), объектно-ориентированное программирование ("Smalltalk", "CLU") требуют новых средств. Поэтому в настоящее время "C" постепенно вытесняется более мощным и интеллектуальным языком "C++", обладающим средствами для объектно-ориентированного программирования и родовых классов. Существуют также расширения стандартного "C" объектно-ориентированными возможностями ("Objective-C"). Большой простор предоставляет также сборка программ из частей, написанных на разных языках программирования (например, "C", "Pascal", "Pro- log"). Ученью не один мы посвятили год, Потом других учить пришел и нам черед. Какие ж выводы из этой всей науки? Из праха мы пришли, нас ветер унесет. Омар Хайям /* Пример 1 */ * Веса и коэффициенты неотрицательны (ai >= 0, ci >= 0). */ #include <stdio.h> /* Достоинства разменных монет (веса ci) */ 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 ); }

[Назад] [Содержание] [Вперед]

Главная