Інтерфейс програми
read k - зчитати k
read T - зчитати T
read n - зчитати n
gen mas - згенерувати масив
lin - виконати лініарізацію
gis - вивести гістограму
out res - вивести результат
gen html - згенерувати HTML файл
open html – відкрити HTML файл
exit - завершити роботу програми
help - видати підказку допомога
На початку програми слід правильно ввести значення k, T, n, після чого ми маємо змогу виконати генерацію масиву, лініарізацію, генерування HTML файлу… У разі введення неправильної команди, програма видасть повідомлення “WRONG COMMAND”, команди слід вводити після появлення на екрані текстової підказки “C:\>” . У разі неможливості виконання певної команди програма видасть повідомлення у якому буде вказана можлива помилка.
Література
Лаптев В.В.(2004). C++ экспресс-курс. Санкт-Петербург: Видавництво БХВ-Петербург.
А.Б. Ставровський, Т.О. Карнаух «Програмування. Перші кроки», Москва, «Диалектика», 2005.
Б. Страуструп «Язык программирования C++», Київ, «Диасофт», 1993.
Дисперсія. http://uk.wikipedia.org/wiki/Дисперсія
Гістограма. http://uk.wikipedia.org/wiki/Гістограма
Метод Ньютона. http://algolist.manual.ru/maths/count_fast/sqrt.php
HTML уроки. http://ab-w.net/HTML/HTML.php
HTML. http://uk.wikipedia.org/wiki/Елементи_HTML
Додатки
Специфікація С++
<P>::={<FILE>}
<FILE>::={<VD>|<FD>|<FVD>|<FFD>}
<PP>::={<PPF>}
<PPF>::={<Text><PPD><Text>}
<PPD>::=<#>(<include>|<define>|<ifndef>)
<include>::=’include’ (<”><file_name><”>|’<’<file_name>’>’)
<define>::=(<MI><Text>|<MI>’(’<MIPL>’)’<Text>)
<ifndef>::=’ifndef’ <I><Text>[<#>’else’<Text>]<#>’endif’
<FVD>::=’extern’<IT>
<FFD>::=<FD>
<VD>::=<IT><IV>{’,’<IV>}’;’
<IV>::=<I>
<IT>::=’int’|’char’
<IF>::=<I>
<FD>::=(<IT>|’void’)<IF> ’(’{<PL>}’)’’{’<SS>’}’
<PL>::=<IT><IV>{’,’ <IT><IV>}
<SS>::=’{’{<VD>}{<S>}’}’
<S>::=<SS>|<S-return>|<S-if>|<S-while>|<S-for>|<Block>
<Block>::=’{’{<S>}’}’
<S-return>::=’return’ ’(’<E>’)’’;’
<S-if>::=’if’ ’(’<E>’)’<S>[’else’ <S>]
<S-while>::=’while’ ’(’ <E> ’)’ <S>
<S-for>::=’for’ ’(’<E1>’;’<E2>’;’<E3>’)’ <S>
<E1>::=<E>
<E2>::=<E>
<E3>::=<E>
<A>::=<IT>’(’[<E>{’,’<E>}]’)’|<Const>|<I>|’(’<E>’)’|<I>’=’<E>| <E>’?’<E>’:’<E>|<LV><=><E>|<LV><--++>|<++--><LV>
<LV>::=<IV>|’*’ ’(’<E>’)’|<IA>’[’<E>’]’
<E>::=<D>{<+ -><D>}
<D>::=<M>{<* / %><M>}
<M>::=<A>[<^><M>]
<I>::=<ch>{<Ts>|<ch>}
<Const>::=’\’’<ch>’\’’|[’-’]<Ts>{<Ts>}|’\”’ {(<ch>|<Ts>)}’\”’| <ch>{(<ch>|<Ts>)}|<D>|<C8>|<C16>
<ch>::=’A’|…|’Z’|’_’
<Ts>::=’0’|…|’9’
<D>::={<Ts>}’.’{<Ts>}[(’E’|’e’)(|’-’)<Ts>{<Ts>}]
<C8>::=’0’<Ts8>{<Ts8>}
<Ts8>::=’0’|…|’7’
<C16>::=(’0x’|’0X’)<Ts16>{<Ts16>}
<Ts16>::=’0’|…|’9’|’A’|…|’F’
Код програми
“Fibonachi.c”
unsigned int F1,F2;
void initfib(){F1=34; F2=55;};
unsigned int fib(){
return(F1=(F2+=F1)-F1);
}
unsigned int r(int k){
return (fib()%k);
}
“Html.c”
#include <stdio.h>
#define max(X,Y) qmax=(X>Y?X:Y)
void GenHTML(int k, int *A,int T){
int i,j,qmax;
int mas[1000];
qmax=0;
char s[5]="";
for(j=k*k;j--;mas[j]=0);
for(i=T;(i--)>1;mas[l(2,A+T-i-1)]++);
for(i=0;i<k*k;i++) max(qmax,mas[i]);
//for(i=0;i<k*k;i++) max(qmax,(100*mas[i])/(T-1));
FILE *fp;
fp=fopen("index.html","w");
fprintf(fp,"<HTML>\n");
fprintf(fp,"<body>\n");
fprintf(fp,"<table width=""\"100%%""\" height=""\"100%%""\" border=""\"0""\" cellspacing=""\"1""\" cellpadding=""\"4""\">\n");
for(i=0;i<k;i++){
fprintf(fp,"<tr>\n");
for(j=0;j<k;j++){
fprintf(fp," <td align=""\"middle""\" bgcolor=#00%s00> %d%</td>\n",color(mas[i*k+j],qmax,s),mas[i*k+j]);
}
fprintf(fp,"</tr>\n");
}
fprintf(fp,"</table>\n");
fprintf(fp,"</body>\n");
fprintf(fp,"</HTML>\n");
fclose(fp);
return;
}
“Func.c”
extern const int L;
extern int k;
extern int T;
char* color(int a,int imax,char *s)
{
int q;
q=(a*255)/imax;
//q=255*((100*a)/imax)/100;
s[0]=(q/16>=10)?('A'+q/16-10):('0'+q/16);
s[1]=(q%16>=10)?('A'+q%16-10):('0'+q%16);
return s;
}
int l(int n,int *x){
int *xi;
int xl;
for(xl=0,xi=x;n--;xl=xl*k+*(xi++));
return (xl);
}
int isqrt(int n){
int x;
x=n;
if (n!=0)while((x=x)-(x=((x+n/x)/2))>1);
else return (0);
return(x);
}
int ipow(int k, int n){
int z=1,i;
for(i=0;(i++)<n;z*=k);
return(z);
}
void Fillchar(int *a){
int i;
for(i=L;i--;*(a+i)=0);
return;
}
void GenMas(int *a){
initfib(34,55);
int i;
for(i=T;i--;*(a+T-i-1)=r(k));
return;
}
int liniarizatsia(int *a,int *b,int n,int T){
int i,max;
for(i=T;(i--)>(n-1);b[l(n,a+T-i-1)]++);
for(max=L;b[max]==0;--max);++max;
return (max);
}
void outGis(int *B,int k,int n){
int i,j;
for (i=0;i<ipow(k,n);i++){
printf(" | (");for(j=n;(j--)-1;printf("%2d,",(i/ipow(k,j))%k));printf("%2d",i%k); printf(") |%3d| ",*(B+i));
for(j=*(B+i);j>0;--j)printf("*");
printf("\n");
}
return;
}
void res(int *B,int k,int n, int max,int T){
int i,j,S,Mb;
S=T/ipow(k,n);
Mb=0;
for (i=0;i<ipow(k,n);i++){
if (Mb<abs(*(B+i)-S)) Mb=abs(*(B+i)-S);
}
int suma;
i=0;suma=0;
while(i<max){
suma+=(*(B+i)-S)*(*(B+i)-S);
++i;
}
printf(" Result: %d%%\n",(Mb!=0 && k!=1)?((100*Mb*k)/suma):0);
return;
}
int in()
{
int x=0;
scanf("%d",&x);
return(x!=0?x:1);
}
void pid()
{
printf("C:\\> ");
}
“Main.c”
#include <stdio.h>
#include <stdlib.h>
#define ngets(n,s) fgets(s,n,stdin)
const int L=100000;
int k,T;
int eq(char* S1, char* S2){
int i;
i=0;
while(S1[i]!='\n' || S2[i]!=' '){
if(S1[i]!=S2[i]) return 0;
i++;
}
return 1;
}
int main(){
int A[L],B[L];
Fillchar(A); Fillchar(B);
unsigned S,i,j,n,Mb,max;
int rk,rT,rn,gm,ln;
rk=0;//read k
rT=0;//read T
rn=0;//read n
gm=0;//generate array
ln=0;//liniarizatsia
char M[50]={};
while(!eq(M,"exit ")){
pid();ngets(50,M);
if (eq(M,"read k ")){
pid();printf("%s","k= ");k=in();
ngets(50,M);
if (k>50) {
k=50;
printf(" Maybe you want to have k=50.\n");
}
else printf(" Operation was done sucessfully.\n");
rk=1;
}
else
if (eq(M,"read T ")){
pid();printf("%s","T= ");T=in();
ngets(50,M);
if (T>10000) {
T=10000;
printf(" Maybe you want to have T=10000.\n");
}
else printf(" Operation was done sucessfully.\n");
rT=1;
}
else
if (eq(M,"read n ")){
pid();printf("%s","n= ");n=in();
ngets(50,M);
if (n>10) {
n=10;
printf(" Maybe you want to have n=10.\n");
}
else printf(" Operation was done sucessfully.\n");
rn=1;
}
else
if (eq(M,"gen mas ")){
if(rT==0) printf("%s\n"," You don't read T");
else
if(rk==0) printf("%s\n"," You don't read k");
else {
GenMas(A);
printf("%s\n"," Array was generated successfully");
gm=1;
}
}
else
if (eq(M,"lin ")){
if(gm==0) printf("%s\n"," You don't generate array");
else
if (rn==0) printf("%s\n"," You don't read n");
else{
max=liniarizatsia(A,B,n,T);
printf("%s\n"," Liniarizatsia was generated successfully");
ln=1;
}
}
else
if (eq(M,"gis ")){
if(ln==0) printf("%s\n"," You don't perform liniarizatsia");
else outGis(B,k,n);
}
else
if (eq(M,"out res ")){
if(ln==0) printf("%s\n"," You don't perform liniarizatsia");
else res(B,k,n,max,T);
}
else
if (eq(M,"gen html ")){
if(ln==0) printf("%s\n"," You don't perform liniarizatsia");
else {GenHTML(k,A,T); printf(" Operation was done sucessfully.\n");}
}
else
if (eq(M,"open html ")){system("index.html");}
else
if (eq(M,"help ")){
printf(" read k - vvedenia k\n");
printf(" read T - vvedenia T\n");
printf(" read n - vvedenia n\n");
printf(" gen mas - zgenetuvatu masiv\n");
printf(" lin - vukonatu liniarizatsiu\n");
printf(" gis - vuvestu gistigramu\n");
printf(" out res - vuvestu resultat\n");
printf(" gen html - zgeneruvatu HTML file\n");
printf(" open html - open html\n");
printf(" exit - zavershenia robotu\n");
printf(" all - compiller all\n");
}
else
if (eq(M,"all ")){
k=3;
T=500;
n=3;
GenMas(A);
max=liniarizatsia(A,B,n,T);
outGis(B,k,n);
res(B,k,n,max,T);
GenHTML(k,A,T);
rk=1;rT=1;rn=1;gm=1;ln=1;
}
else
if(!eq(M,"exit ")) printf(" Wrong command!!!\n");
}
system("PAUSE");
return 0;
}