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

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

}

8. Написати програму, що зчитує рядки й друкує найдовший з них.

Схема програми:

while (є ще рядок)

If (цей рядок довший за найдовший з попередніх)

запам'ятати цей рядок і його довжину

надрукувати найдовший рядок

Зі схеми видно, що програма природно розкладається на кілька частин. Перша частина читає новий рядок, друга перевіряє його, третя запам'ятовує, а інші частини програми керують процесом.

#define maxline 1000 /*довжина максимального рядка*/

main()

{ int len; /*довжина поточного рядка*/

Int max; /*максимальна довжина*/

char line[maxline]; /*поточний рядок*/

char save[maxline]; /*найдовший збережений рядок*/

max=0;

while ((len=getline(line,maxline))>0)

if(len>max) {

max=len;

copy(line,save);

}

if (max>0)

printf("%s",save);

}

getline(s,lim) /*отримує рядок та записує його в

*s, повертає довжину рядка*/

char s[];

int lim;

{

int c,i;

for (i=0;

i<lim–1&&(c=getchar())!=EOF

&& c !='\n';

++i)

s[i]=c;

if (c=='\n') {

s[i]=c;

++i;

}

s[i]='\0';

return (i);

}

copy(s1,s2) /*копіює s1 у s2;*/

char s1[],s2[];

{

int i;

i=0;

while ((s2[i]=s1[i])!='\0')

++i;

}

Функції main і getline пов'язуються як через пару аргументів, так і через значення, що повертається. Аргументи getline описані в рядках

char s[];

int lim;

які вказують, що перший аргумент є масивом, а другий – цілим.

Довжина масиву s не зазначена, тому що вона визначена в main. Функція getline використовує оператор return для передавання значення назад так само, як це робила функція power. Щоб позначити кінець рядка символів, функція getline поміщає в кінець створюваного нею масиву символ '\0'.

Специфікація формату %s указує, що printf очікує рядок, який закінчується нуль-символом. Проаналізувавши функцію copy, бачимо, що і її вхідний аргумент має закінчуватися символом '\0', вона копіює цей символ у вихідний аргумент s2.

Функція getline при заповненні масиву припиняє подальше отримання символів, якщо рядок перевищив максимально допустиму довжину, навіть якщо не зустрічає символу нового рядка. Перевіривши отриману довжину й останній символ, функція main може встановити, чи не був цей рядок занадто довгим.

Користувач функції getline не може заздалегідь довідатися, на­скільки довгим виявиться рядок, що вводиться. Тому в getline включено контроль переповнення. У той самий час користувач функції copy вже знає (чи може довідатися), який розмір рядків, тому додаткового контролю не потрібно.

9. Написати програму, що друкує слова в рядках файла у зворотному порядку.

#include <stdio.h>

#include <ctype.h>

#include <string.h>

#include <locale.h>

#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--;

}

}

total();

exit(0);

}

/*обробити файл з іменем name*/

munch(name)char*name;

{

char l[MAXL]; /*буфер для чергового рядка*/