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

Void main(argc,argv)

char*argv[];

{

register int nline; /*номер рядка*/

register int naster; /*кількість зірочок у рядку*/

register int i;

if(argc>1)

lines=atoi(argv[1]);

for(nline=0;nline<lines;nline++){

naster=1+2*nline;

/*лідируючі пропуски*/

printn(' ',lines-1 – nline);

/*зірочки*/

printn('*',naster);

/*переведення рядка*/

putchar('\n');

}

exit(0); /*завершення програми*/

}

6. Написати програму, що підраховує кількість слів у файлі.

Розглянемо програму, що підраховує кількість рядків, слів і символів. Вважатимемо словом будь-яку послідовність символів, що не містить пропусків чи символів табуляції.

#define yes 1

#define no 0

main()

{

int c,nl,nw,inword;

inword=no;

nl=nw=nc=0;

while((c=getchar())!=EOF) {

++nc;

if (з=='\n')

++nl;

if (c==' '||c=='\n'||c=='\t')

inword=no;

else if(inword==no) {

inword=yes;

++nw;

}

}

printf("%d%d%d\n",nl,nw,nc);

}

Щоразу, коли програма зустрічає перший символ слова, вона збільшує лічильник кількості слів на одиницю. Змінна inword стежить за тим, знаходиться програма в даний момент усередині слова чи ні. Спочатку змінній присвоюється no, що означає "не в слові". Ми нааємо перевагу символічним константам yes і no перед літерними значенням 1 і 0, тому що вони роблять програму зручнішою для читання. До того ж зміни набагато легше вносити в ті програми, де числа фігурують тільки як константи.

Рядокnl=nw=nc=0; дозволяє всім трьом змінним присвоїти нулі.

Операція || означає "або", так що рядок

if(c==' '||c=='\n'||c=='\t')

означає "якщо c – пропуск, або c – символ нового рядка, або c –табуляція...". (Умовна послідовність \t є зображенням символу табуляції.)

Оператор, що йде за else, є оператором if, який керує двома операторами у фігурних дужках.

7. Підрахувати кількість входжень кожної з літер алфавіту у файл:

#include <stdio.h>

#include <ctype.h>

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++)