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

Int len; /*довжиною цього рядка*/

char*words[50]; /*таблиця полів рядка*/

char**s; /*службова*/

Int nwords; /*кількість слів у рядку*/

FILE *fp;

if(name==NULL||!*name)

fp=stdin; /*стандартне введення*/

else

if((fp=fopen(name,"r"))==NULL){

fprintf(stderr,"Не можу відкрити файл %s\n",

name);

return;

}

printf("----------------------------%s----\n",name);

while(fgets(l,MAXL,fp)!=NULL){

len=strlen(l);

if(len && l[len-1]=='\n')

l[--len]='\0';

if(nwords=parse(l,words)){

/*друк слів у зворотному порядку*/

for(--nwords;nwords>=0;nwords--){

printf("%s",words[nwords]);

add(words[nwords]);

}

}

putchar ('\n');

}

if(fp!=stdin) fclose(fp);

}

/*розкласти рядок на слова*/

parse(s,tabl)

register unsigned char*s;

unsigned char*tabl[];

{

char eol=0;

int nwords=0;

while(!eol){

/*пропустити пропуски та табуляції*/

while(isspace(*s))s++;

If(!*s) /*рядок закінчився*/

break;

*tabl++=s;nwords++;

/*початок чергового слова*/

/*поки не пропуск і не кінець рядка*/

while(*s && !isspace(*s))s++;

/*покажчик указує на символ, що йде за словом*/

if(!*s)eol++;

*s='\0';

/*закрили Слово, починаємо Справу*/

s++;

}

*tabl=NULL;

return nwords;

}

/*побудова таблиці слів, що зустрічаються у файлі*/

#define MAXWORDS 1024

struct W{

Int ctr; /*кількість входжень слова*/

char*wrd; /*слово*/

}w[MAXWORDS]; /*таблиця*/

int busy=0; /*зайнято в таблиці*/

extern char*malloc();

/*Добавити слово в таблицю*/

add(word)char*word;

{

register i;

static alert=1;

/*немає вже слова в таблиці?*/

/*якщо є – просто збільшити лічильник*/

for(i=0;i<busy;i++){

If(!strcmp(word,w[I].Wrd)){

w[i].ctr++;

return;

}

}

if(busy>=MAXWORDS){

If(alert){

fprintf(stderr, "Переповнення таблиці слів\7\n");

alert=0;

}

return;

}

/*ні, слова немає. Записуємо:*/

w[busy].wrd=malloc(strlen(word)+1);

/*1байт під символ\0*/

if(w[busy].wrd==NULL){

fprintf(stderr,"Мало пам’яті\n");

busy=MAXWORDS+1; /*ніби переповнення*/

return;

}

w[busy].ctr=1;

strcpy(w[busy].wrd,word);

busy++;

}

compare(a,b)struct W*a,*b;

{

return strcoll(a->wrd,b->wrd);

/*strcoll порівнює слова в алфавітному порядку*/

}

/*друк усіх слів, що зустрічаються в тексті, та кількості їхніх входжень*/

total(){

register i;

/*сортуємо слова за алфавітом*/

qsort(w,busy,sizeof(struct W),compare);

printf("-----|-----------ПІДСУМОК---------------\n");

for(i=0;i<busy;i++)

printf("%4d|%s\n",

w[i].ctr,

w[i].wrd

);

}

10. Розділити дійсне число x на дійсне число у з точністю до n цифр після коми (40<=n<=60).

При написанні програми використаємо бібліотечну функцію fmod(x,y), яка повертає залишок від ділення числа x на y для дійсних x та y. Спочатку надрукуємо цілу частину x/y. Потім fmod(x,y) домножуватимемо на 10 доти, доки не отримаємо число, більше ніж 1. Тоді надрукуємо цілу частину цього числа. Процес продовжуватимемо до заданої точності n.

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h>