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

Void main() { float X,y,z,t,s; int I,j,flag,n,k; m1: clrscr();

printf("\n Ділене : "); scanf("%f",&x);

printf("\n Дільник : "); scanf("%f",&y);

printf("\n Введіть точність 40<=n<=60 : "); scanf("%d",&n);

printf("\n Отримали число :\n"); printf("%d.",(int)((x/y)));

for(i=0;i<n;i++) { flag=0; t=fmod(x,y); if(t==0)flag=1; else flag=0;

while(!flag) { if(t<y)t*=10.0; else flag=1; } s=t/y; if(fabs(s)>=1e-5)printf("%d",(int)s); if(s==0)printf("%d",(int)s); x=t; }

printf("\n Продовжуємо-7:"); scanf("%d",&k); if(k==7){gotoxy(1,wherey()-1);delline();goto m1;} getch();

}

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

#include <stdio.h>

/*Усі записи в базі мають фіксований розмір*/

#define VLEN 20

#define KEY_FREE(-13) /*ключ вільного місця. Він довільний, але не є вхідним даним*/

struct data{

short b_key; /*ключ*/

char b_val[VLEN]; /*рядок-значення*/

};

char BASEF[]=".base"; /*ім’я файла бази*/

FILE*fbase; /*pointer на базу*/

struct data tmp; /*допоміжна змінна*/

void

InitBase (void){

/*fopen:r read (читання)

*w write (запис), файл створюється заново.

*(створюється, якщо не було, якщо був – спустошується).

*r+читання та запис (файл уже існує).

*w+читання та запис (створюється порожній файл).

*a append (запис у кінець файла), створити, якщо немає:

*тут мається на увазі, що кожна операція запису спочатку ставить покажчик запису на кінець файла*/

if((fbase=fopen(BASEF,"r+"))==NULL){

if((fbase=fopen(BASEF,"w+"))==NULL){

fprintf(stderr, "Не можу відкрити базу даних %s\n",BASEF);

exit(1);

}

fprintf(stderr, "База створена\n");

}

}

void

closeBase (void){

fclose(fbase);

}

/*Урахуйте, що якщо ви записуєте у файл структури, то у файлі не буде поділу на рядки – файл НЕТЕКСТОВИЙ! Тому

читати такий файл можна тільки структурами: read(), fread() (але не scanf і не fgets)*/

/*Пошук за ключем.

Видати (-1), якщо запису з даним ключем немає,

інакше – номер слота, де міститься запис з даним ключем*/

int

bget (int key)

{

int n;

/*послідовно передивитися весь файл*/

rewind(fbase);

/*на початок файла. Еквівалент fseek(fbase, 0L, 0);*/

n=0;

/*int скільки_елементів_масиву_дійсно_зчитано=

*fread(адреса_масиву_куди_зчитувати,

*розмір_одного_елемента_масиву,

*скільки_елементів_зчитувати_в_масив, канал);

*Зазначимо, що кількість даних задається НЕ в байтах,

*а в 'штуках'*/

while(fread(&tmp, sizeof(tmp),1,fbase)==1){

if(tmp.b_key==key)

return n;

n++;

}

return(-1); /*не знайдено*/

}

/*модифікувати запис з індексом ind*/

void

bmod (

int ind,

Int key, /*новий ключ*/

char *val /*нове значення*/

)

{

struct data new;

fseek(fbase,(long)sizeof(struct data)*ind,0);

new.b_key=key;

strncpy(new.b_val,val,VLEN);

/*int скільки_елементів_масиву_дійсно_записано=

*fwrite(адреса_масиву_який_записувати,

*розмір_одного_елемента_масиву,

*скільки_елементів_масиву_записувати, канал);

*/

if(fwrite(&new,sizeof new,1,fbase)!=1)

fprintf(stderr,"Помилка запису.\n");

}

/*видалення запису за ключем*/

int

bdel(int key){

int ind=bget(key);

if(ind==-1)

return(-1); /*запису з таким ключем немає*/

bmod(ind,KEY_FREE,""); /*записати ознаку вільного місця*/

return 0;

}

/*Службова процедура дописування до кінця файла*/

void

bappend (int key,char*val)

{

struct data new;

/*стати на кінець файла*/

fseek(fbase,0L,2);

/*і записати нову структуру в кінець*/

new.b_key=key;

strncpy(new.b_val,val,VLEN);

fwrite(&new,sizeof(struct data),1,fbase);

}

/*дописування нового запису. Якщо запис з таким ключем є - видати помилку*/

int

bput (int key,char*val)

{

int i=bget(key);

if(i!=-1)

return(-1); /*запис уже є*/

/*знайти вільне місце*/

i=bget(KEY_FREE);

if(i==-1){/*немає вільних місць*/

bappend(key,val);

return 0;

}

/*інакше вільне місце знайдене.

*Замінюємо його на корисну інформацію*/

bmod(i,key,val);

}

/*роздрукувати всю базу даних підряд*/

void

bprint (void){

int n;

int here=0;

rewind(fbase);

n=0;

printf("-номер--ключ-------значення------------\n");

while(fread(&tmp,sizeof tmp,1,fbase)==1){

if(tmp.b_key==KEY_FREE){

n++;

continue;

}

printf("#%-2d|%6d\t|%s\n",n,tmp.b_key,tmp.b_val);

here++;n++;

}

printf("-----------------------------------------\n");

printf("Довжина бази:%d Зайнято:%d\n\n",n,here);

}

/*заміна поля val у запису з ключем key*/

int

bchange (int key,char*val)

{

int ind;

ind=bget(key);

if(ind==-1){

/*запису з таким ключем не існує*/

/*Додати як новий запис*/

bput(key,val);

return 0;

}

bmod(ind,key,val);

return 1;

}

/*Аналогічна функція, яка використовує інший спосіб.

*Крім того, якщо такий ключ існує, нічого не відбувається*/

int

bchg (int key,char*val)

{

struct data d;

rewind(fbase); /*на початок файла*/

while(fread(&d,sizeof d,1,fbase)==1){

/*пошук ключа*/

if(d.b_key==key){

/*повернутися назад від поточної позиції*/

fseek(fbase,–(long)sizeof d,1);

/*не підходить (long)-sizeof d!!!*/

d.b_key=key;

strncpy(d.b_val,val,VLEN);

fwrite(&d,sizeof d,1,fbase);

/*між fread і fwrite має бути

*хоча б один fseek.*/

fseek(fbase,0L,1); /*нікуди не зсуватися*/

return 0; /*зроблено*/

}

}

return(-1); /*такого ключа не було*/

}

/*Приклад*/

void

main (void){

int i;