Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Богатырев А. Весь текст 1009.15 Kb

Хрестоматия по программированию на Си в Unix

Предыдущая страница Следующая страница
1 ... 69 70 71 72 73 74 75  76 77 78 79 80 81 82 ... 87

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 );
}

        /*      Пример 2     */

/* Подсчет количества вхождений каждой из букв алфавита в файл.
 * Выдача таблицы.
 * Подсчет частоты использования битов в байтах файла.
 */
#include 
#include 

long bcnt[8];
char masks[8] = {       /* маски битов */
        1, 2, 4, 8, 16, 32, 64, 128 };
long cnt[256];          /* счетчики для каждой из 256 букв */

/* распечатка букв в стиле языка СИ */
char *pr( c ){
        static char buf[ 20 ];

        switch( c ){
        case '\n': return   " \\n "   ;
        case '\r': return   " \\r "   ;
        case '\t': return   " \\t "   ;
        case '\b': return   " \\b "   ;
        case '\f': return   " \\f "   ;
        case '\033': return " ESC"    ;
        case '\0': return   " \\0 "   ;
        case 0177: return   " ^? "    ;
        }
        if( c < ' ' ){
                sprintf( buf, " ^%c ", c + 'A' - 1 );
        }else if( isspace(c)){
                sprintf( buf, " '%c'", c );
        }else if( ! isprint( c ))
                sprintf( buf, "\\%3o", c );
         else   sprintf( buf, "  %c ", c );
         return buf;
}

main( argc, argv ) char **argv;  {
        FILE *fp;

        if( argc == 1 ) process( stdin );
        else{   argv++; argc--;
                while( *argv ){
                        printf( "----- FILE %s -----\n", *argv );
                        if((fp = fopen( *argv, "r" )) == NULL ){
                                printf( "Can not open\n" );
                        }else{  process( fp ); fclose( fp );   }
                        argv++; argc--;
                }
        }
        exit(0);
}

/* обработать файл с поинтером fp */
process( fp ) FILE *fp;
{       register i; int c; int n;

        /* зачистка счетчиков */
        for( i=0; i < 256; i++ ) cnt[i]  = 0L;
        for( i=0; i < 8  ; i++ ) bcnt[i] = 0;

        while( ( c=getc(fp)) != EOF ){
                 c &= 0377;
             /* подсчитать букву */
                cnt[ c ] ++;
             /* подсчет битов */
                for( i=0; i < 8; i++ )
                        if( c & masks[i] )
                                bcnt[ i ] ++;
        }
        /* выдача результатов в COL колонок */
#define COL 4
        printf( "\tASCII map\n" );
        for( n=i=0; i < 256; i++ ){
             /* if( cnt[i] == 0l ) continue; */
             printf( "%s  %5ld      |", pr(i), cnt[i] );

             if( ++n == COL ){ n = 0; putchar('\n'); }
/* или       if((i % COL) == (COL-1)) putchar('\n');       */
        }
        printf( "\n\tBITS map\n" );
        for( i=7; i >=0 ; i-- ) printf( "%6d ", i );
        putchar( '\n' );
        for( i=7; i >=0 ; i-- )
                printf( "%6ld ", bcnt[i] );
        putchar( '\n' ); putchar( '\n' );
}

        /*      Пример 3         */

/* Центрирование строк текста. Пример на работу с указателями. */
/* Входные строки не должны содержать табуляций                */
/* Вызов: a.out < входной_файл                                 */

#include 
extern char *gets();
#define WIDTH 60        /* ширина листа */
main(){
        char rd[81]; register char *s;
        char *head,        /* начало текста */
             *tail;        /* конец текста  */
        register int len, i;
        int shift;         /* отступ */

      /* Читать со стандартного ввода в rd по одной строке,
       * пока файл не кончится. При вводе с клавиатуры конец файла
       * обозначается нажатием клавиш CTRL+D
       */
        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' );
        }
}

        /*      Пример 4      */
/* Предварительная разметка текста для nroff */
#include 
#include 
#include 
#include   /* прототип strchr() */
#include 
FILE *fout = stdout; /* канал вывода      */

/* Состояния вывода */
#define SPACE   0       /* пробелы          */
#define TEXT    1       /* текст            */
#define PUNCT   2       /* знаки препинания */

#define UC(c)   ((unsigned char)(c))

/* Вывод строки текста из буфера */
void putstr (FILE *fp, unsigned char *s) {
/* Punct -  знаки препинания, требующие приклеивания к
 *          концу предыдущего слова.
 * PunctS - знаки, всегда требующие после себя пробела.
 * PunctN - знаки, которые могут следовать за знаком
 *          препинания без пробела.
 */
    static char Punct [] = ",:;!?.)"      ;
    static char PunctS[] = ",:;"          ;
    static char PunctN[] = " \t\"'"       ;
#define is(c, set) (strchr(set, UC(c)) != NULL)
    int c, state = TEXT, cprev = 'X';

    while ((c = *s) != '\0') {
    /*  Пробелы */
        if(isspace(c)) state = SPACE;

    /*  Знаки препинания. Пробелы перед ними игнорируются.
     */ else if(is(c, Punct)){
          switch(state){
          case SPACE: if(is(cprev, Punct ) && cprev==c && c != ')')
                         putc(' ', fp);
          /* а просто пробелы - игнорировать */            break;
          case PUNCT: if(is(cprev, PunctS)) putc(' ', fp); break;
          }
          putc(cprev = c, fp); /* выводим сам знак */
          state = PUNCT;
        } else {
    /*  Несколько пробелов сворачиваем в один */
          switch(state){
          case SPACE: putc(' ', fp); break;
          case PUNCT: if(!is(c, PunctN)) putc(' ', fp); break;
          }
          putc(cprev = c, fp); /* сама буква */
          state = TEXT;
          if(c == '\\') putc('e', fp);
        }
        s++;
    } /* пробелы в конце строки просто игнорируются */
    putc ('\n', fp);
}
/* Обработать файл с именем name */
void proceed (char *name) {
    FILE *fp;
    static unsigned char inp[2048];
    /* достаточно большой буфер ввода */

    if      (strcmp(name, "-") == 0 ) fp = stdin;
    else if ((fp = fopen (name, "r")) == NULL) {
        fprintf (stderr, "Cannot read %s\n", name);
        return;
    }
    while (fgets (inp, sizeof inp, fp) != NULL) {
        register unsigned char  *s, *p;
        int len = strlen (inp);
        if (len && inp[len - 1] == '\n')
                   inp[--len]   =  '\0';
        if (!*inp) {
        /* .sp N  - пропуск N пустых строк */
space:      fprintf (fout, ".sp 1\n");
            continue;
        }

    /* обрезать концевые пробелы */
        for(p = NULL, s = inp; *s; ++s){
            if (!isspace (*s)) p = s;
        }
        if(p) p[1] = '\0';
        else goto space;
    /* p указывает на последний непробел */

/* Удалить переносы слов в конце строки: перенос - это
   минус, прижатый к концу слова         */
        if (*p == '-' && p != inp /* не в начале строки */
                      && isalnum(UC(p[-1])) /* после буквы  */
        ){  int c;  *p = '\0'; /* затереть перенос */
/* Читаем продолжение слова из начала следующей строки */
            while (isspace (c = getc (fp)));
            ungetc (c, fp);
            while ((c = getc (fp)) != '\n' && !isspace (c))
                *p++ = c;
            *p = '\0';
            if (c != '\n' ){ /* прочли пробел */
            /* вычитываем ВСЕ пробелы */
               while (isspace(c = getc (fp)));
               if(c != '\n') ungetc (c, fp);
            }
        }
        /* .pp - директива начала абзаца. */
        if (isspace (*inp)) {
            fprintf (fout, ".pp\n");
            for (s = inp; isspace (*s); s++);
            putstr (fout, s);
        }
        else {
            if (*inp == '.' || *inp == '\'')
                fprintf (fout, "\\&");
            putstr (fout, inp);
        }
    }
    if( fp != stdin ) fclose (fp);
}

int main (int argc, char *argv[]) {
    int  i;
    setlocale(LC_ALL, "");
    for (i = 1; i < argc; i++)
        proceed (argv[i]);
    return 0; /* exit code */
}

        /*      Пример 5      */

/* Программа, распечатывающая слова в строках файла в обратном порядке */

#include 
#include 
#include 
#include 
#define MAXL 255        /* макс. длина строки */

/* Если бы мы не включили ctype.h, то мы должны были бы определить
 * #define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\f')
 */
main ( argc, argv )  char **argv;{
        setlocale(LC_ALL, "");
        if( argc == 1 ){
                /* программа вызвана без аргументов */
                munch( "" );
        }else{
             /* аргументы программы - имена файлов */
             while( argv[ 1 ] ){
                   munch( argv[1] );
                   argv++;
                   argc--;
Предыдущая страница Следующая страница
1 ... 69 70 71 72 73 74 75  76 77 78 79 80 81 82 ... 87
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама